diff --git a/lib/manager/bazel/extract.js b/lib/manager/bazel/extract.js index ef2bed64168956a6ee7d01573128b34c62e28a61..a8a513505b92cc91e1bc9b0f4371aa378a87b774 100644 --- a/lib/manager/bazel/extract.js +++ b/lib/manager/bazel/extract.js @@ -139,7 +139,11 @@ function extractPackageFile(content) { const parsedUrl = parseUrl(url); dep.depName = depName; dep.repo = parsedUrl.repo; - dep.currentValue = parsedUrl.currentValue; + if (parsedUrl.currentValue.match(/^[a-f0-9]{40}$/i)) { + dep.currentDigest = parsedUrl.currentValue; + } else { + dep.currentValue = parsedUrl.currentValue; + } dep.datasource = 'github'; dep.lookupName = dep.repo; dep.lookupType = 'releases'; diff --git a/lib/manager/bazel/update.js b/lib/manager/bazel/update.js index 325012deb6df8c24a725a1d69208f78575b60d16..866b5031b71f991ee7cb01ece883e7afb242460e 100644 --- a/lib/manager/bazel/update.js +++ b/lib/manager/bazel/update.js @@ -22,7 +22,7 @@ async function updateDependency(fileContent, upgrade) { `$1"${upgrade.newDigest}", # ${upgrade.newValue}\n` ); } - } else if (upgrade.depType === 'http_archive') { + } else if (upgrade.depType === 'http_archive' && upgrade.newValue) { const [, shortRepo] = upgrade.repo.split('/'); let newUrl; let file; @@ -50,6 +50,23 @@ async function updateDependency(fileContent, upgrade) { ); newDef = upgrade.def.replace(valuePattern, upgrade.newValue); newDef = newDef.replace(/(sha256\s*=\s*)"[^"]+"/, `$1"${hash}"`); + } else if (upgrade.depType === 'http_archive' && upgrade.newDigest) { + const [, shortRepo] = upgrade.repo.split('/'); + const newUrl = `https://github.com/${upgrade.repo}/archive/${ + upgrade.newDigest + }.tar.gz`; + const file = (await got(newUrl, { encoding: null })).body; + const hash = crypto + .createHash('sha256') + .update(file) + .digest('hex'); + const currentPattern = /(urls\s*=\s*\[")[^"]+("])/; + newDef = upgrade.def.replace(currentPattern, `$1${newUrl}$2`); + newDef = newDef.replace(/(sha256\s*=\s*)"[^"]+"/, `$1"${hash}"`); + newDef = newDef.replace( + new RegExp(`(strip_prefix\\s*=\\s*)"[^"]*"`), + `$1"${shortRepo}-${upgrade.newDigest}"` + ); } logger.debug({ oldDef: upgrade.def, newDef }); const existingDef = new RegExp( diff --git a/test/manager/bazel/__snapshots__/extract.spec.js.snap b/test/manager/bazel/__snapshots__/extract.spec.js.snap index da5992e2612b5948f4257583b7c03ce2ca420311..7435d3144d4eb972205dd312e3b95ec206ab4025 100644 --- a/test/manager/bazel/__snapshots__/extract.spec.js.snap +++ b/test/manager/bazel/__snapshots__/extract.spec.js.snap @@ -73,7 +73,7 @@ Array [ "remote": "https://github.com/bazelbuild/rules_typescript.git", }, Object { - "currentValue": "446923c3756ceeaa75888f52fcbdd48bb314fbf8", + "currentDigest": "446923c3756ceeaa75888f52fcbdd48bb314fbf8", "datasource": "github", "def": "http_archive( name=\\"distroless\\", @@ -152,7 +152,7 @@ Array [ "repo": "bazelbuild/bazel-skylib", }, Object { - "currentValue": "446923c3756ceeaa75888f52fcbdd48bb314fbf8", + "currentDigest": "446923c3756ceeaa75888f52fcbdd48bb314fbf8", "datasource": "github", "def": "http_archive( name=\\"distroless\\", diff --git a/test/manager/bazel/update.spec.js b/test/manager/bazel/update.spec.js index 708b99e936a87f4c3b6bc2f036f3b0031170fd15..90a7a7e66064524139643b14e51c4ec653a5d016 100644 --- a/test/manager/bazel/update.spec.js +++ b/test/manager/bazel/update.spec.js @@ -68,6 +68,18 @@ describe('manager/bazel/update', () => { expect(res).not.toEqual(content); expect(res.indexOf('0.8.1')).not.toBe(-1); }); + it('updates commit-based http archive', async () => { + const upgrade = { + depName: 'distroless', + depType: 'http_archive', + repo: 'GoogleContainerTools/distroless', + def: `http_archive(\n name="distroless",\n sha256="f7a6ecfb8174a1dd4713ea3b21621072996ada7e8f1a69e6ae7581be137c6dd6",\n strip_prefix="distroless-446923c3756ceeaa75888f52fcbdd48bb314fbf8",\n urls=["https://github.com/GoogleContainerTools/distroless/archive/446923c3756ceeaa75888f52fcbdd48bb314fbf8.tar.gz"]\n)`, + newDigest: '033387ac8853e6cc1cd47df6c346bc53cbc490d8', + }; + got.mockReturnValueOnce({ body: '' }); + const res = await bazelfile.updateDependency(content, upgrade); + expect(res).not.toEqual(content); + }); it('updates second time http archive', async () => { const upgrade = { depName: 'io_bazel_rules_go',