From b5851b4c384712b055ef0f5690add7399eb74cbb Mon Sep 17 00:00:00 2001
From: "Jocelyn Badgley (Twipped)" <joc@twipped.com>
Date: Wed, 25 Aug 2021 11:23:31 -0700
Subject: [PATCH] Fallback to local duplicate when a fetch fails, if available

---
 build/evaluate.js | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/build/evaluate.js b/build/evaluate.js
index 92f7e6d..b4f606f 100644
--- a/build/evaluate.js
+++ b/build/evaluate.js
@@ -4,6 +4,7 @@ const log = require('fancy-log');
 const Promise = require('bluebird');
 const fs = require('fs-extra');
 const path = require('path');
+const actions = require('./actions');
 
 const LOG = {
   new:     true,
@@ -45,8 +46,21 @@ module.exports = exports = async function process (tasks, cache) {
           output: 'dist/' + output,
         });
       } catch (err) {
-        log.error(`Task (${task.action.name}) failed for file ${output}.\n`, err);
-        return false;
+        if (status.duplicate && await fs.pathExists(status.duplicate)) {
+          try {
+            result = await actions.copy({
+              input: status.duplicate,
+              output: 'dist/' + output,
+            });
+            log.info(`Task (${task.action.name}) failed for file ${output}, fell back to saved duplicate ${status.duplicate}`);
+          } catch (err2) {
+            log.error(`Task (${task.action.name}) failed for file ${output}.\n`, err);
+            return false;
+          }
+        } else {
+          log.error(`Task (${task.action.name}) failed for file ${output}.\n`, err);
+          return false;
+        }
       }
 
       status = await cache.set(task, result, lastSeen);