From 9b16e1c7578f8e1453dbe4e48e5443bd72c91b4f Mon Sep 17 00:00:00 2001
From: Filipe Azevedo <filipe@azevedo.io>
Date: Fri, 29 Nov 2019 13:00:56 +0000
Subject: [PATCH] fix(gomod): update package version (#4900)

---
 lib/manager/gomod/artifacts.ts                    |  2 +-
 lib/manager/gomod/update.ts                       |  9 ++++++++-
 .../gomod/__snapshots__/extract.spec.ts.snap      | 10 ++++++++++
 .../gomod/__snapshots__/update.spec.ts.snap       |  2 ++
 test/manager/gomod/_fixtures/1/go.mod             |  1 +
 test/manager/gomod/extract.spec.ts                |  2 +-
 test/manager/gomod/update.spec.ts                 | 15 +++++++++++++++
 7 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/lib/manager/gomod/artifacts.ts b/lib/manager/gomod/artifacts.ts
index 9d49dad9c6..f142d18202 100644
--- a/lib/manager/gomod/artifacts.ts
+++ b/lib/manager/gomod/artifacts.ts
@@ -38,7 +38,7 @@ export async function updateArtifacts(
     }
     await outputFile(localGoModFileName, massagedGoMod);
     const localGoSumFileName = join(config.localDir, sumFileName);
-    const customEnv = ['GOPATH', 'GOPROXY'];
+    const customEnv = ['GOPATH', 'GOPROXY', 'GONOSUMDB'];
     const env = getChildProcessEnv(customEnv);
     const startTime = process.hrtime();
     let cmd: string;
diff --git a/lib/manager/gomod/update.ts b/lib/manager/gomod/update.ts
index b08055df40..14825d83e3 100644
--- a/lib/manager/gomod/update.ts
+++ b/lib/manager/gomod/update.ts
@@ -77,6 +77,8 @@ export function updateDependency(
         upgrade.newMajor > 1 &&
         !newLine.includes(`/v${upgrade.newMajor}`)
       ) {
+        // If package has no version, pin to latest one.
+        newLine = newLine.replace(depName, depName + '/v' + upgrade.newMajor);
         if (upgrade.currentValue.match(/^v(0|1)\./)) {
           // Add version
           newLine = newLine.replace(
@@ -94,7 +96,12 @@ export function updateDependency(
       }
     }
     if (lineToChange.endsWith('+incompatible')) {
-      newLine += '+incompatible';
+      let toAdd = '+incompatible';
+
+      if (upgrade.updateType === 'major' && upgrade.newMajor >= 2) {
+        toAdd = '';
+      }
+      newLine += toAdd;
     }
     if (newLine === lineToChange) {
       logger.debug('No changes necessary');
diff --git a/test/manager/gomod/__snapshots__/extract.spec.ts.snap b/test/manager/gomod/__snapshots__/extract.spec.ts.snap
index 7ba5ee243c..182598d01d 100644
--- a/test/manager/gomod/__snapshots__/extract.spec.ts.snap
+++ b/test/manager/gomod/__snapshots__/extract.spec.ts.snap
@@ -766,5 +766,15 @@ Array [
       "lineNumber": 11,
     },
   },
+  Object {
+    "currentValue": "v3.5.0+incompatible",
+    "datasource": "go",
+    "depName": "github.com/caarlos0/env",
+    "depNameShort": "caarlos0/env",
+    "depType": "require",
+    "managerData": Object {
+      "lineNumber": 13,
+    },
+  },
 ]
 `;
diff --git a/test/manager/gomod/__snapshots__/update.spec.ts.snap b/test/manager/gomod/__snapshots__/update.spec.ts.snap
index d4b790db6c..7b3e74c206 100644
--- a/test/manager/gomod/__snapshots__/update.spec.ts.snap
+++ b/test/manager/gomod/__snapshots__/update.spec.ts.snap
@@ -14,6 +14,7 @@ require github.com/Azure/azure-sdk-for-go v25.1.0+incompatible
 replace github.com/pkg/errors => ../errors
 replace golang.org/x/foo => github.com/pravesht/gocql v0.0.0
 
+require github.com/caarlos0/env v3.5.0+incompatible
 "
 `;
 
@@ -98,5 +99,6 @@ require github.com/Azure/azure-sdk-for-go v25.1.0+incompatible
 replace github.com/pkg/errors => ../errors
 replace golang.org/x/foo => github.com/pravesht/gocql v0.0.0
 
+require github.com/caarlos0/env v3.5.0+incompatible
 "
 `;
diff --git a/test/manager/gomod/_fixtures/1/go.mod b/test/manager/gomod/_fixtures/1/go.mod
index 914afa7d5f..e0f36e378d 100644
--- a/test/manager/gomod/_fixtures/1/go.mod
+++ b/test/manager/gomod/_fixtures/1/go.mod
@@ -11,3 +11,4 @@ require github.com/Azure/azure-sdk-for-go v25.1.0+incompatible
 replace github.com/pkg/errors => ../errors
 replace golang.org/x/foo => github.com/pravesht/gocql v0.0.0
 
+require github.com/caarlos0/env v3.5.0+incompatible
diff --git a/test/manager/gomod/extract.spec.ts b/test/manager/gomod/extract.spec.ts
index 99a8e0081e..405070a926 100644
--- a/test/manager/gomod/extract.spec.ts
+++ b/test/manager/gomod/extract.spec.ts
@@ -12,7 +12,7 @@ describe('lib/manager/gomod/extract', () => {
     it('extracts single-line requires', () => {
       const res = extractPackageFile(gomod1).deps;
       expect(res).toMatchSnapshot();
-      expect(res).toHaveLength(7);
+      expect(res).toHaveLength(8);
       expect(res.filter(e => e.skipReason)).toHaveLength(1);
       expect(res.filter(e => e.depType === 'replace')).toHaveLength(1);
     });
diff --git a/test/manager/gomod/update.spec.ts b/test/manager/gomod/update.spec.ts
index 261c0d585e..4b3de3ee3b 100644
--- a/test/manager/gomod/update.spec.ts
+++ b/test/manager/gomod/update.spec.ts
@@ -235,5 +235,20 @@ describe('manager/gomod/update', () => {
       expect(res).not.toEqual(gomod1);
       expect(res.includes(upgrade.newDigest.substring(0, 12))).toBe(true);
     });
+    it('handles no pinned version to latest available version', () => {
+      const upgrade = {
+        depName: 'github.com/caarlos0/env',
+        managerData: { lineNumber: 13 },
+        newValue: 'v6.1.0',
+        depType: 'require',
+        currentValue: 'v3.5.0+incompatible',
+        newMajor: 6,
+        updateType: 'major',
+      };
+      const res = updateDependency(gomod1, upgrade);
+      expect(res).not.toEqual(gomod1);
+      expect(res.includes(upgrade.newValue)).toBe(true);
+      expect(res).toContain(upgrade.depName + '/v6');
+    });
   });
 });
-- 
GitLab