diff --git a/lib/datasource/go.js b/lib/datasource/go.js index 54123d4a239054cf8f27f9429f6fea7592c0bc74..9782da6db83093034d168e338bc08515cad9ae24 100644 --- a/lib/datasource/go.js +++ b/lib/datasource/go.js @@ -6,8 +6,25 @@ module.exports = { getDigest, }; +function getGithubPurl(repo) { + return { + fullname: repo.replace(/\/$/, ''), + qualifiers: {}, + }; +} + async function getSourcePurl(name) { - const pkgUrl = 'https://' + name + '?go-get=1'; + if (name.startsWith('gopkg.in/')) { + const [pkg] = name.replace('gopkg.in/', '').split('.'); + if (pkg.includes('/')) { + return getGithubPurl(pkg); + } + return getGithubPurl(`go-${pkg}/${pkg}`); + } + if (name.startsWith('github.com/')) { + return getGithubPurl(name.replace('github.com/', '')); + } + const pkgUrl = `https://${name}?go-get=1`; try { const res = (await got(pkgUrl, { retries: 5, @@ -19,13 +36,7 @@ async function getSourcePurl(name) { const [, sourceUrl] = sourceMatch; logger.debug({ depName: name, sourceUrl }, 'Go lookup sourceUrl'); if (sourceUrl && sourceUrl.startsWith('https://github.com/')) { - const githubPurl = { - fullname: sourceUrl - .replace('https://github.com/', '') - .replace(/\/$/, ''), - qualifiers: {}, - }; - return githubPurl; + return getGithubPurl(sourceUrl.replace('https://github.com/', '')); } } else { logger.trace({ depName: name }, 'No go-source header found'); diff --git a/lib/manager/gomod/extract.js b/lib/manager/gomod/extract.js index 549b1cd180d9ec23960c342ca3ead04c740e65a5..2d9b66adc2f09a9deb7b89281ebdb4a664acdedc 100644 --- a/lib/manager/gomod/extract.js +++ b/lib/manager/gomod/extract.js @@ -19,20 +19,16 @@ function getDep(lineNumber, match) { }; if (!isVersion(currentValue)) { dep.skipReason = 'unsupported-version'; - } else if (depName.startsWith('gopkg.in/')) { - const [pkg] = depName.replace('gopkg.in/', '').split('.'); - dep.depNameShort = pkg; - if (pkg.includes('/')) { - dep.purl = `pkg:github/${pkg}`; + } else { + if (depName.startsWith('gopkg.in/')) { + const [pkg] = depName.replace('gopkg.in/', '').split('.'); + dep.depNameShort = pkg; + } else if (depName.startsWith('github.com/')) { + dep.depNameShort = depName.replace('github.com/', ''); } else { - dep.purl = `pkg:github/go-${pkg}/${pkg}`; + dep.depNameShort = depName; } - } else if (depName.startsWith('github.com/')) { - dep.depNameShort = depName.replace('github.com/', ''); - dep.purl = 'pkg:' + depName.replace('github.com', 'github'); - } else { dep.purl = `pkg:go/${depName}`; - dep.depNameShort = depName; } const digestMatch = currentValue.match(/v0\.0.0-\d{14}-([a-f0-9]{12})/); if (digestMatch) { diff --git a/test/datasource/__snapshots__/go.spec.js.snap b/test/datasource/__snapshots__/go.spec.js.snap index cc080147296a796471aa230e3a956f777ef943d4..603e65b9d7888711bbb303250af9f15a4d10dc20 100644 --- a/test/datasource/__snapshots__/go.spec.js.snap +++ b/test/datasource/__snapshots__/go.spec.js.snap @@ -8,3 +8,29 @@ Object { ], } `; + +exports[`datasource/go getPkgReleases works for known servers 1`] = ` +Array [ + Array [ + Object { + "fullname": "x/text", + "qualifiers": Object {}, + }, + undefined, + ], + Array [ + Object { + "fullname": "x/text", + "qualifiers": Object {}, + }, + undefined, + ], + Array [ + Object { + "fullname": "go-x/x", + "qualifiers": Object {}, + }, + undefined, + ], +] +`; diff --git a/test/datasource/go.spec.js b/test/datasource/go.spec.js index bd2723e4ce5efc666a71761fb6694c5df325ac3d..17137d9b26cea1bd4ab561657352f77f929c4b99 100644 --- a/test/datasource/go.spec.js +++ b/test/datasource/go.spec.js @@ -90,5 +90,21 @@ describe('datasource/go', () => { const res = await datasource.getPkgReleases('pkg:go/golang.org/x/text'); expect(res).toBeNull(); }); + it('works for known servers', async () => { + got.mockClear(); + github.getPkgReleases.mockClear(); + const packages = [ + 'pkg:go/github.com/x/text', + 'pkg:go/gopkg.in/x/text', + 'pkg:go/gopkg.in/x', + ]; + const githubRes = { releases: [1, 2] }; + for (const pkg of packages) { + github.getPkgReleases.mockReturnValueOnce(githubRes); + expect(await datasource.getPkgReleases(pkg)).toEqual(githubRes); + } + expect(got.mock.calls).toHaveLength(0); + expect(github.getPkgReleases.mock.calls).toMatchSnapshot(); + }); }); }); diff --git a/test/manager/gomod/__snapshots__/extract.spec.js.snap b/test/manager/gomod/__snapshots__/extract.spec.js.snap index c5e108aeff9b9b8e06810cd2ff7d37b775a7ca30..67ee028b6199eb166148a99bf8c85a2acf498020 100644 --- a/test/manager/gomod/__snapshots__/extract.spec.js.snap +++ b/test/manager/gomod/__snapshots__/extract.spec.js.snap @@ -9,7 +9,7 @@ Array [ "depType": "require", "lineNumber": 3, "multiLine": true, - "purl": "pkg:github/aws/aws-sdk-go", + "purl": "pkg:go/github.com/aws/aws-sdk-go", "versionScheme": "semver", }, Object { @@ -21,7 +21,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 4, "multiLine": true, - "purl": "pkg:github/bgentry/go-netrc", + "purl": "pkg:go/github.com/bgentry/go-netrc", "versionScheme": "semver", }, Object { @@ -33,7 +33,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 5, "multiLine": true, - "purl": "pkg:github/cloudfoundry/jibber_jabber", + "purl": "pkg:go/github.com/cloudfoundry/jibber_jabber", "versionScheme": "semver", }, Object { @@ -43,7 +43,7 @@ Array [ "depType": "require", "lineNumber": 6, "multiLine": true, - "purl": "pkg:github/davecgh/go-spew", + "purl": "pkg:go/github.com/davecgh/go-spew", "versionScheme": "semver", }, Object { @@ -53,7 +53,7 @@ Array [ "depType": "require", "lineNumber": 7, "multiLine": true, - "purl": "pkg:github/emirpasic/gods", + "purl": "pkg:go/github.com/emirpasic/gods", "versionScheme": "semver", }, Object { @@ -63,7 +63,7 @@ Array [ "depType": "require", "lineNumber": 8, "multiLine": true, - "purl": "pkg:github/fatih/color", + "purl": "pkg:go/github.com/fatih/color", "versionScheme": "semver", }, Object { @@ -73,7 +73,7 @@ Array [ "depType": "require", "lineNumber": 9, "multiLine": true, - "purl": "pkg:github/fsnotify/fsnotify", + "purl": "pkg:go/github.com/fsnotify/fsnotify", "versionScheme": "semver", }, Object { @@ -83,7 +83,7 @@ Array [ "depType": "require", "lineNumber": 10, "multiLine": true, - "purl": "pkg:github/go-ini/ini", + "purl": "pkg:go/github.com/go-ini/ini", "versionScheme": "semver", }, Object { @@ -95,7 +95,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 11, "multiLine": true, - "purl": "pkg:github/golang-collections/collections", + "purl": "pkg:go/github.com/golang-collections/collections", "versionScheme": "semver", }, Object { @@ -107,7 +107,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 12, "multiLine": true, - "purl": "pkg:github/hashicorp/go-cleanhttp", + "purl": "pkg:go/github.com/hashicorp/go-cleanhttp", "versionScheme": "semver", }, Object { @@ -119,7 +119,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 13, "multiLine": true, - "purl": "pkg:github/hashicorp/go-getter", + "purl": "pkg:go/github.com/hashicorp/go-getter", "versionScheme": "semver", }, Object { @@ -131,7 +131,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 14, "multiLine": true, - "purl": "pkg:github/hashicorp/go-safetemp", + "purl": "pkg:go/github.com/hashicorp/go-safetemp", "versionScheme": "semver", }, Object { @@ -141,7 +141,7 @@ Array [ "depType": "require", "lineNumber": 15, "multiLine": true, - "purl": "pkg:github/hashicorp/go-version", + "purl": "pkg:go/github.com/hashicorp/go-version", "versionScheme": "semver", }, Object { @@ -153,7 +153,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 16, "multiLine": true, - "purl": "pkg:github/hashicorp/hcl", + "purl": "pkg:go/github.com/hashicorp/hcl", "versionScheme": "semver", }, Object { @@ -165,7 +165,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 17, "multiLine": true, - "purl": "pkg:github/heroku/rollrus", + "purl": "pkg:go/github.com/heroku/rollrus", "versionScheme": "semver", }, Object { @@ -177,7 +177,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 18, "multiLine": true, - "purl": "pkg:github/jbenet/go-context", + "purl": "pkg:go/github.com/jbenet/go-context", "versionScheme": "semver", }, Object { @@ -189,7 +189,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 19, "multiLine": true, - "purl": "pkg:github/jesseduffield/go-getter", + "purl": "pkg:go/github.com/jesseduffield/go-getter", "versionScheme": "semver", }, Object { @@ -201,7 +201,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 20, "multiLine": true, - "purl": "pkg:github/jesseduffield/gocui", + "purl": "pkg:go/github.com/jesseduffield/gocui", "versionScheme": "semver", }, Object { @@ -213,7 +213,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 21, "multiLine": true, - "purl": "pkg:github/jesseduffield/termbox-go", + "purl": "pkg:go/github.com/jesseduffield/termbox-go", "versionScheme": "semver", }, Object { @@ -225,7 +225,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 22, "multiLine": true, - "purl": "pkg:github/jmespath/go-jmespath", + "purl": "pkg:go/github.com/jmespath/go-jmespath", "versionScheme": "semver", }, Object { @@ -237,7 +237,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 23, "multiLine": true, - "purl": "pkg:github/kardianos/osext", + "purl": "pkg:go/github.com/kardianos/osext", "versionScheme": "semver", }, Object { @@ -249,7 +249,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 24, "multiLine": true, - "purl": "pkg:github/kevinburke/ssh_config", + "purl": "pkg:go/github.com/kevinburke/ssh_config", "versionScheme": "semver", }, Object { @@ -259,7 +259,7 @@ Array [ "depType": "require", "lineNumber": 25, "multiLine": true, - "purl": "pkg:github/magiconair/properties", + "purl": "pkg:go/github.com/magiconair/properties", "versionScheme": "semver", }, Object { @@ -269,7 +269,7 @@ Array [ "depType": "require", "lineNumber": 26, "multiLine": true, - "purl": "pkg:github/mattn/go-colorable", + "purl": "pkg:go/github.com/mattn/go-colorable", "versionScheme": "semver", }, Object { @@ -279,7 +279,7 @@ Array [ "depType": "require", "lineNumber": 27, "multiLine": true, - "purl": "pkg:github/mattn/go-isatty", + "purl": "pkg:go/github.com/mattn/go-isatty", "versionScheme": "semver", }, Object { @@ -289,7 +289,7 @@ Array [ "depType": "require", "lineNumber": 28, "multiLine": true, - "purl": "pkg:github/mattn/go-runewidth", + "purl": "pkg:go/github.com/mattn/go-runewidth", "versionScheme": "semver", }, Object { @@ -299,7 +299,7 @@ Array [ "depType": "require", "lineNumber": 29, "multiLine": true, - "purl": "pkg:github/mgutz/str", + "purl": "pkg:go/github.com/mgutz/str", "versionScheme": "semver", }, Object { @@ -311,7 +311,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 30, "multiLine": true, - "purl": "pkg:github/mitchellh/go-homedir", + "purl": "pkg:go/github.com/mitchellh/go-homedir", "versionScheme": "semver", }, Object { @@ -323,7 +323,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 31, "multiLine": true, - "purl": "pkg:github/mitchellh/go-testing-interface", + "purl": "pkg:go/github.com/mitchellh/go-testing-interface", "versionScheme": "semver", }, Object { @@ -335,7 +335,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 32, "multiLine": true, - "purl": "pkg:github/mitchellh/mapstructure", + "purl": "pkg:go/github.com/mitchellh/mapstructure", "versionScheme": "semver", }, Object { @@ -347,7 +347,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 33, "multiLine": true, - "purl": "pkg:github/nicksnyder/go-i18n", + "purl": "pkg:go/github.com/nicksnyder/go-i18n", "versionScheme": "semver", }, Object { @@ -357,7 +357,7 @@ Array [ "depType": "require", "lineNumber": 34, "multiLine": true, - "purl": "pkg:github/pelletier/go-buffruneio", + "purl": "pkg:go/github.com/pelletier/go-buffruneio", "versionScheme": "semver", }, Object { @@ -367,7 +367,7 @@ Array [ "depType": "require", "lineNumber": 35, "multiLine": true, - "purl": "pkg:github/pelletier/go-toml", + "purl": "pkg:go/github.com/pelletier/go-toml", "versionScheme": "semver", }, Object { @@ -377,7 +377,7 @@ Array [ "depType": "require", "lineNumber": 36, "multiLine": true, - "purl": "pkg:github/pkg/errors", + "purl": "pkg:go/github.com/pkg/errors", "versionScheme": "semver", }, Object { @@ -387,7 +387,7 @@ Array [ "depType": "require", "lineNumber": 37, "multiLine": true, - "purl": "pkg:github/pmezard/go-difflib", + "purl": "pkg:go/github.com/pmezard/go-difflib", "versionScheme": "semver", }, Object { @@ -397,7 +397,7 @@ Array [ "depType": "require", "lineNumber": 38, "multiLine": true, - "purl": "pkg:github/sergi/go-diff", + "purl": "pkg:go/github.com/sergi/go-diff", "versionScheme": "semver", }, Object { @@ -409,7 +409,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 39, "multiLine": true, - "purl": "pkg:github/shibukawa/configdir", + "purl": "pkg:go/github.com/shibukawa/configdir", "versionScheme": "semver", }, Object { @@ -419,7 +419,7 @@ Array [ "depType": "require", "lineNumber": 40, "multiLine": true, - "purl": "pkg:github/sirupsen/logrus", + "purl": "pkg:go/github.com/sirupsen/logrus", "versionScheme": "semver", }, Object { @@ -429,7 +429,7 @@ Array [ "depType": "require", "lineNumber": 41, "multiLine": true, - "purl": "pkg:github/spf13/afero", + "purl": "pkg:go/github.com/spf13/afero", "versionScheme": "semver", }, Object { @@ -439,7 +439,7 @@ Array [ "depType": "require", "lineNumber": 42, "multiLine": true, - "purl": "pkg:github/spf13/cast", + "purl": "pkg:go/github.com/spf13/cast", "versionScheme": "semver", }, Object { @@ -451,7 +451,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 43, "multiLine": true, - "purl": "pkg:github/spf13/jwalterweatherman", + "purl": "pkg:go/github.com/spf13/jwalterweatherman", "versionScheme": "semver", }, Object { @@ -461,7 +461,7 @@ Array [ "depType": "require", "lineNumber": 44, "multiLine": true, - "purl": "pkg:github/spf13/pflag", + "purl": "pkg:go/github.com/spf13/pflag", "versionScheme": "semver", }, Object { @@ -471,7 +471,7 @@ Array [ "depType": "require", "lineNumber": 45, "multiLine": true, - "purl": "pkg:github/spf13/viper", + "purl": "pkg:go/github.com/spf13/viper", "versionScheme": "semver", }, Object { @@ -483,7 +483,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 46, "multiLine": true, - "purl": "pkg:github/spkg/bom", + "purl": "pkg:go/github.com/spkg/bom", "versionScheme": "semver", }, Object { @@ -493,7 +493,7 @@ Array [ "depType": "require", "lineNumber": 47, "multiLine": true, - "purl": "pkg:github/src-d/gcfg/v2", + "purl": "pkg:go/github.com/src-d/gcfg/v2", "versionScheme": "semver", }, Object { @@ -503,7 +503,7 @@ Array [ "depType": "require", "lineNumber": 48, "multiLine": true, - "purl": "pkg:github/stretchr/testify", + "purl": "pkg:go/github.com/stretchr/testify", "versionScheme": "semver", }, Object { @@ -515,7 +515,7 @@ Array [ "digestOneAndOnly": true, "lineNumber": 49, "multiLine": true, - "purl": "pkg:github/stvp/roll", + "purl": "pkg:go/github.com/stvp/roll", "versionScheme": "semver", }, Object { @@ -525,7 +525,7 @@ Array [ "depType": "require", "lineNumber": 50, "multiLine": true, - "purl": "pkg:github/tcnksm/go-gitconfig", + "purl": "pkg:go/github.com/tcnksm/go-gitconfig", "versionScheme": "semver", }, Object { @@ -535,7 +535,7 @@ Array [ "depType": "require", "lineNumber": 51, "multiLine": true, - "purl": "pkg:github/ulikunitz/xz", + "purl": "pkg:go/github.com/ulikunitz/xz", "versionScheme": "semver", }, Object { @@ -545,7 +545,7 @@ Array [ "depType": "require", "lineNumber": 52, "multiLine": true, - "purl": "pkg:github/xanzy/ssh-agent", + "purl": "pkg:go/github.com/xanzy/ssh-agent", "versionScheme": "semver", }, Object { @@ -601,7 +601,7 @@ Array [ "depType": "require", "lineNumber": 57, "multiLine": true, - "purl": "pkg:github/src-d/go-billy", + "purl": "pkg:go/gopkg.in/src-d/go-billy.v4", "versionScheme": "semver", }, Object { @@ -611,7 +611,7 @@ Array [ "depType": "require", "lineNumber": 58, "multiLine": true, - "purl": "pkg:github/src-d/go-git", + "purl": "pkg:go/gopkg.in/src-d/go-git.v4", "versionScheme": "semver", }, Object { @@ -621,7 +621,7 @@ Array [ "depType": "require", "lineNumber": 59, "multiLine": true, - "purl": "pkg:github/go-warnings/warnings", + "purl": "pkg:go/gopkg.in/warnings.v0", "versionScheme": "semver", }, Object { @@ -631,7 +631,7 @@ Array [ "depType": "require", "lineNumber": 60, "multiLine": true, - "purl": "pkg:github/go-yaml/yaml", + "purl": "pkg:go/gopkg.in/yaml.v2", "versionScheme": "semver", }, ] @@ -645,7 +645,7 @@ Array [ "depNameShort": "pkg/errors", "depType": "require", "lineNumber": 2, - "purl": "pkg:github/pkg/errors", + "purl": "pkg:go/github.com/pkg/errors", "versionScheme": "semver", }, Object { @@ -654,7 +654,7 @@ Array [ "depNameShort": "aws/aws-sdk-go", "depType": "require", "lineNumber": 3, - "purl": "pkg:github/aws/aws-sdk-go", + "purl": "pkg:go/github.com/aws/aws-sdk-go", "versionScheme": "semver", }, Object { @@ -663,7 +663,7 @@ Array [ "depNameShort": "davecgh/go-spew", "depType": "require", "lineNumber": 4, - "purl": "pkg:github/davecgh/go-spew", + "purl": "pkg:go/github.com/davecgh/go-spew", "versionScheme": "semver", }, Object { @@ -689,7 +689,7 @@ Array [ "depNameShort": "russross/blackfriday", "depType": "require", "lineNumber": 7, - "purl": "pkg:github/russross/blackfriday", + "purl": "pkg:go/gopkg.in/russross/blackfriday.v1", "versionScheme": "semver", }, ]