diff --git a/lib/manager/gomod/update.js b/lib/manager/gomod/update.js index 8a50e041c6c172a20651c484d68de5e05f3e681c..d3a9bc9e26483ffc43ce7cd9d7c06e5b8a522b0f 100644 --- a/lib/manager/gomod/update.js +++ b/lib/manager/gomod/update.js @@ -7,10 +7,6 @@ module.exports = { function updateDependency(currentFileContent, upgrade) { try { logger.debug(`gomod.updateDependency: ${upgrade.newValue}`); - if (upgrade.updateType === 'major' && upgrade.newMajor > 1) { - logger.warn('Skipping major gomod upgrade'); - return currentFileContent; - } const lines = currentFileContent.split('\n'); const lineToChange = lines[upgrade.lineNumber]; if (!lineToChange.includes(upgrade.depName)) { @@ -18,9 +14,9 @@ function updateDependency(currentFileContent, upgrade) { } let requireLine; if (upgrade.multiLine) { - requireLine = new RegExp(/^(\s+[^\s]+\s+)[^\s]+/); + requireLine = new RegExp(/^(\s+[^\s]+)(\s+)([^\s]+)/); } else { - requireLine = new RegExp(/^(require\s+[^\s]+\s+)[^\s]+/); + requireLine = new RegExp(/^(require\s+[^\s]+)(\s+)([^\s]+)/); } if (!lineToChange.match(requireLine)) { logger.debug('No image line found'); @@ -37,9 +33,27 @@ function updateDependency(currentFileContent, upgrade) { } const currentDateTime = DateTime.local().toFormat('yyyyMMddHHmmss'); const newValue = `v0.0.0-${currentDateTime}-${newDigestRightSized}`; - newLine = lineToChange.replace(requireLine, `$1${newValue}`); + newLine = lineToChange.replace(requireLine, `$1$2${newValue}`); } else { - newLine = lineToChange.replace(requireLine, `$1${upgrade.newValue}`); + newLine = lineToChange.replace(requireLine, `$1$2${upgrade.newValue}`); + } + if (upgrade.updateType === 'major') { + if (upgrade.depName.startsWith('gopkg.in/')) { + const oldV = upgrade.depName.split('.').pop(); + newLine = newLine.replace(`.${oldV}`, `.v${upgrade.newMajor}`); + } else if (upgrade.newMajor > 1) { + if (upgrade.currentValue.match(/^v(0|1)\./)) { + // Add version + newLine = newLine.replace(requireLine, `$1/v${upgrade.newMajor}$2$3`); + } else { + // Replace version + const [oldV] = upgrade.currentValue.split('.'); + newLine = newLine.replace( + new RegExp(`/${oldV}(\\s+)`), + `/v${upgrade.newMajor}$1` + ); + } + } } if (newLine === lineToChange) { logger.debug('No changes necessary'); diff --git a/test/_fixtures/go/1/go.mod b/test/_fixtures/go/1/go.mod index f3315c2f157dfa31832f6419accf871b32341ae4..3b1e1abf53e4df8e9e12bcddaa5f31e876f39b34 100644 --- a/test/_fixtures/go/1/go.mod +++ b/test/_fixtures/go/1/go.mod @@ -5,3 +5,4 @@ require github.com/aws/aws-sdk-go v1.15.21 require github.com/davecgh/go-spew v1.0.0 require golang.org/x/foo v1.0.0 require github.com/rarkins/foo abcdef1 +require gopkg.in/russross/blackfriday.v1 v1.0.0 diff --git a/test/_fixtures/go/2/go.mod b/test/_fixtures/go/2/go.mod index fff366badb3d016c546c7dff5f8a8c6f30cbbcf7..75e6957d4be36807d3f0edf1d591115acffb2a13 100644 --- a/test/_fixtures/go/2/go.mod +++ b/test/_fixtures/go/2/go.mod @@ -45,7 +45,7 @@ require ( github.com/spf13/pflag v1.0.2 github.com/spf13/viper v1.1.0 github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad - github.com/src-d/gcfg v1.3.0 + github.com/src-d/gcfg/v2 v2.3.0 github.com/stretchr/testify v1.2.2 github.com/stvp/roll v0.0.0-20170522205222-3627a5cbeaea github.com/tcnksm/go-gitconfig v0.1.2 diff --git a/test/manager/gomod/__snapshots__/extract.spec.js.snap b/test/manager/gomod/__snapshots__/extract.spec.js.snap index b6fb91784344e47bf8cd87a63866d6d862bd6186..4fe3de5d4b1cbe5564323313f51c5a289f6e893e 100644 --- a/test/manager/gomod/__snapshots__/extract.spec.js.snap +++ b/test/manager/gomod/__snapshots__/extract.spec.js.snap @@ -465,13 +465,13 @@ Array [ "versionScheme": "semver", }, Object { - "currentValue": "v1.3.0", - "depName": "github.com/src-d/gcfg", - "depNameShort": "src-d/gcfg", + "currentValue": "v2.3.0", + "depName": "github.com/src-d/gcfg/v2", + "depNameShort": "src-d/gcfg/v2", "depType": "require", "lineNumber": 47, "multiLine": true, - "purl": "pkg:github/src-d/gcfg", + "purl": "pkg:github/src-d/gcfg/v2", "versionScheme": "semver", }, Object { @@ -657,5 +657,14 @@ Array [ "skipReason": "unsupported-version", "versionScheme": "semver", }, + Object { + "currentValue": "v1.0.0", + "depName": "gopkg.in/russross/blackfriday.v1", + "depNameShort": "russross/blackfriday", + "depType": "require", + "lineNumber": 7, + "purl": "pkg:github/russross/blackfriday", + "versionScheme": "semver", + }, ] `; diff --git a/test/manager/gomod/__snapshots__/update.spec.js.snap b/test/manager/gomod/__snapshots__/update.spec.js.snap index 6c94f43d179e95e78b9dcf29c4b263480bde8624..2ca9d426b2ff49f4b19a1c83e69e98925b8e68a3 100644 --- a/test/manager/gomod/__snapshots__/update.spec.js.snap +++ b/test/manager/gomod/__snapshots__/update.spec.js.snap @@ -1,5 +1,17 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`manager/gomod/update updateDependency replaces major gopkg.in updates 1`] = ` +"module github.com/renovate-tests/gomod1 + +require github.com/pkg/errors v0.7.0 +require github.com/aws/aws-sdk-go v1.15.21 +require github.com/davecgh/go-spew v1.0.0 +require golang.org/x/foo v1.0.0 +require github.com/rarkins/foo abcdef1 +require gopkg.in/russross/blackfriday.v2 v2.0.0 +" +`; + exports[`manager/gomod/update updateDependency replaces two values in one file 1`] = ` "module github.com/renovate-tests/gomod1 @@ -8,5 +20,6 @@ require github.com/aws/aws-sdk-go v1.15.36 require github.com/davecgh/go-spew v1.0.0 require golang.org/x/foo v1.0.0 require github.com/rarkins/foo abcdef1 +require gopkg.in/russross/blackfriday.v1 v1.0.0 " `; diff --git a/test/manager/gomod/extract.spec.js b/test/manager/gomod/extract.spec.js index afeb2b69b07db3280afd94d831b3002e4ac60e09..bc19b323847fe4c1c6e6175795b10fe2752f3783 100644 --- a/test/manager/gomod/extract.spec.js +++ b/test/manager/gomod/extract.spec.js @@ -16,7 +16,7 @@ describe('lib/manager/gomod/extract', () => { it('extracts single-line requires', () => { const res = extractDependencies(gomod1, config).deps; expect(res).toMatchSnapshot(); - expect(res).toHaveLength(5); + expect(res).toHaveLength(6); expect(res.filter(e => e.skipReason).length).toBe(1); }); it('extracts multi-line requires', () => { diff --git a/test/manager/gomod/update.spec.js b/test/manager/gomod/update.spec.js index f8ef42cb11aa870223cf2887e71b28570b56e050..ff76a56a978487667757f6f166e615086e840899 100644 --- a/test/manager/gomod/update.spec.js +++ b/test/manager/gomod/update.spec.js @@ -43,16 +43,35 @@ describe('manager/gomod/update', () => { const res = goUpdate.updateDependency(gomod1, upgrade); expect(res).toEqual(gomod1); }); - it('skips major updates > 1', () => { + it('replaces major updates > 1', () => { const upgrade = { depName: 'github.com/pkg/errors', lineNumber: 2, newMajor: 2, updateType: 'major', + currentValue: 'v0.7.0', newValue: 'v2.0.0', }; const res = goUpdate.updateDependency(gomod1, upgrade); - expect(res).toEqual(gomod1); + expect(res).not.toEqual(gomod2); + expect(res.includes(upgrade.newValue)).toBe(true); + expect(res.includes('github.com/pkg/errors/v2')).toBe(true); + }); + it('replaces major gopkg.in updates', () => { + const upgrade = { + depName: 'gopkg.in/russross/blackfriday.v1', + lineNumber: 7, + newMajor: 2, + updateType: 'major', + currentValue: 'v1.0.0', + newValue: 'v2.0.0', + }; + const res = goUpdate.updateDependency(gomod1, upgrade); + expect(res).toMatchSnapshot(); + expect(res).not.toEqual(gomod2); + expect(res.includes('gopkg.in/russross/blackfriday.v2 v2.0.0')).toBe( + true + ); }); it('returns null if mismatch', () => { const upgrade = { @@ -78,6 +97,36 @@ describe('manager/gomod/update', () => { expect(res).not.toEqual(gomod2); expect(res.includes(upgrade.newValue)).toBe(true); }); + it('replaces major multiline', () => { + const upgrade = { + depName: 'github.com/emirpasic/gods', + lineNumber: 7, + multiLine: true, + currentValue: 'v1.9.0', + newValue: 'v2.0.0', + newMajor: 2, + updateType: 'major', + }; + const res = goUpdate.updateDependency(gomod2, upgrade); + expect(res).not.toEqual(gomod2); + expect(res.includes(upgrade.newValue)).toBe(true); + expect(res.includes('github.com/emirpasic/gods/v2')).toBe(true); + }); + it('bumps major multiline', () => { + const upgrade = { + depName: 'github.com/src-d/gcfg', + lineNumber: 47, + multiLine: true, + currentValue: 'v2.3.0', + newValue: 'v3.0.0', + newMajor: 3, + updateType: 'major', + }; + const res = goUpdate.updateDependency(gomod2, upgrade); + expect(res).not.toEqual(gomod2); + expect(res.includes(upgrade.newValue)).toBe(true); + expect(res.includes('github.com/src-d/gcfg/v3')).toBe(true); + }); it('update multiline digest', () => { const upgrade = { depName: 'github.com/spf13/jwalterweatherman',