From 807b354ea3092d4e52f07ff167a3b8561cf42212 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Sun, 26 Apr 2020 07:50:01 +0200
Subject: [PATCH] fix: autoReplace handle non-pinning of digests

---
 lib/config/__snapshots__/index.spec.ts.snap   |  1 +
 lib/config/definitions.ts                     |  1 -
 .../__snapshots__/auto-replace.spec.ts.snap   |  2 ++
 lib/workers/branch/auto-replace.spec.ts       | 14 +++++++++
 lib/workers/branch/auto-replace.ts            | 29 +++++++++++++++----
 5 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/lib/config/__snapshots__/index.spec.ts.snap b/lib/config/__snapshots__/index.spec.ts.snap
index 14a9feb09b..06759fa5c0 100644
--- a/lib/config/__snapshots__/index.spec.ts.snap
+++ b/lib/config/__snapshots__/index.spec.ts.snap
@@ -56,6 +56,7 @@ Object {
   "onboardingBranch": "renovate/configure",
   "onboardingPrTitle": "Configure Renovate",
   "persistRepoData": false,
+  "pinDigests": false,
   "platform": "github",
   "postUpdateOptions": Array [],
   "postUpgradeTasks": Object {
diff --git a/lib/config/definitions.ts b/lib/config/definitions.ts
index 6aa2dd7bfc..cd0eacac98 100644
--- a/lib/config/definitions.ts
+++ b/lib/config/definitions.ts
@@ -870,7 +870,6 @@ const options: RenovateOptions[] = [
   {
     name: 'pinDigests',
     description: 'Whether to add digests to Dockerfile source images',
-    stage: 'package',
     type: 'boolean',
     default: false,
   },
diff --git a/lib/workers/branch/__snapshots__/auto-replace.spec.ts.snap b/lib/workers/branch/__snapshots__/auto-replace.spec.ts.snap
index aba6ee470e..ee040deb45 100644
--- a/lib/workers/branch/__snapshots__/auto-replace.spec.ts.snap
+++ b/lib/workers/branch/__snapshots__/auto-replace.spec.ts.snap
@@ -1,5 +1,7 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
+exports[`workers/branch/auto-replace doAutoReplace handles a double attempt 1`] = `"     <script src=\\"https://cdnjs.cloudflare.com/ajax/libs/reactstrap/7.1.0/reactstrap.min.js\\">  <script src=\\"https://cdnjs.cloudflare.com/ajax/libs/reactstrap/7.1.1/reactstrap.min.js\\"> "`;
+
 exports[`workers/branch/auto-replace doAutoReplace handles already updated 1`] = `"     <script src=\\"https://cdnjs.cloudflare.com/ajax/libs/reactstrap/7.1.1/reactstrap.min.js\\">   "`;
 
 exports[`workers/branch/auto-replace doAutoReplace updates version and integrity 1`] = `"     <script src=\\"https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.js\\" integrity=\\"sha256-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\" crossorigin=\\"anonymous\\">   "`;
diff --git a/lib/workers/branch/auto-replace.spec.ts b/lib/workers/branch/auto-replace.spec.ts
index 09623bfa58..94743e9e58 100644
--- a/lib/workers/branch/auto-replace.spec.ts
+++ b/lib/workers/branch/auto-replace.spec.ts
@@ -49,10 +49,24 @@ describe('workers/branch/auto-replace', () => {
       upgrade.lookupName = 'reactstrap/7.1.0/reactstrap.min.js';
       upgrade.currentValue = '7.1.0';
       upgrade.newValue = '7.1.1';
+      upgrade.newDigest = 'some-digest';
       upgrade.depIndex = 0;
       const res = await doAutoReplace(upgrade, src, parentBranch);
       expect(res).toMatchSnapshot();
     });
+    it('handles a double attempt', async () => {
+      const script =
+        '<script src="https://cdnjs.cloudflare.com/ajax/libs/reactstrap/7.1.0/reactstrap.min.js">';
+      const src = `     ${script}  ${script} `;
+      upgrade.baseDeps = extractPackageFile(src).deps;
+      upgrade.depName = 'reactstrap';
+      upgrade.lookupName = 'reactstrap/7.1.0/reactstrap.min.js';
+      upgrade.currentValue = '7.1.0';
+      upgrade.newValue = '7.1.1';
+      upgrade.depIndex = 1;
+      const res = await doAutoReplace(upgrade, src, parentBranch);
+      expect(res).toMatchSnapshot();
+    });
     it('handles already updated', async () => {
       const script =
         '<script src="https://cdnjs.cloudflare.com/ajax/libs/reactstrap/7.1.0/reactstrap.min.js">';
diff --git a/lib/workers/branch/auto-replace.ts b/lib/workers/branch/auto-replace.ts
index d31c854149..11a7cb4597 100644
--- a/lib/workers/branch/auto-replace.ts
+++ b/lib/workers/branch/auto-replace.ts
@@ -10,7 +10,15 @@ export async function confirmIfDepUpdated(
   upgrade,
   newContent: string
 ): Promise<boolean> {
-  const { manager, packageFile, newValue, newDigest, depIndex } = upgrade;
+  const {
+    manager,
+    packageFile,
+    newValue,
+    newDigest,
+    depIndex,
+    currentDigest,
+    pinDigests,
+  } = upgrade;
   const extractPackageFile = get(manager, 'extractPackageFile');
   let newUpgrade;
   try {
@@ -23,13 +31,22 @@ export async function confirmIfDepUpdated(
   } catch (err) /* istanbul ignore next */ {
     logger.debug('Failed to parse newContent');
   }
-  if (
-    newUpgrade &&
-    newUpgrade.currentValue === newValue &&
-    (!newDigest || newUpgrade.currentDigest === newDigest)
-  ) {
+  if (!newUpgrade) {
+    return false;
+  }
+  if (newUpgrade.currentValue !== newValue) {
+    return false;
+  }
+  if (!newDigest) {
+    return true;
+  }
+  if (newUpgrade.currentDigest === newDigest) {
     return true;
   }
+  if (!currentDigest && !pinDigests) {
+    return true;
+  }
+  // istanbul ignore next
   return false;
 }
 
-- 
GitLab