renovate 44.90.2 → 44.91.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/modules/manager/ansible-galaxy/collections.js +4 -6
- package/dist/modules/manager/ansible-galaxy/collections.js.map +1 -1
- package/dist/modules/manager/azure-pipelines/extract.js +1 -0
- package/dist/modules/manager/azure-pipelines/extract.js.map +1 -1
- package/dist/modules/manager/bazel/artifacts.js +5 -1
- package/dist/modules/manager/bazel/artifacts.js.map +1 -1
- package/dist/modules/manager/bazel/parser.js +15 -0
- package/dist/modules/manager/bazel/parser.js.map +1 -1
- package/dist/modules/manager/bazel/rules/http.js.map +1 -1
- package/dist/modules/manager/bundler/common.js +1 -0
- package/dist/modules/manager/bundler/common.js.map +1 -1
- package/dist/modules/manager/cargo/artifacts.js +2 -0
- package/dist/modules/manager/cargo/artifacts.js.map +1 -1
- package/dist/modules/manager/cargo/extract.js.map +1 -1
- package/dist/modules/manager/cocoapods/extract.js +3 -0
- package/dist/modules/manager/cocoapods/extract.js.map +1 -1
- package/dist/modules/manager/composer/artifacts.js +1 -0
- package/dist/modules/manager/composer/artifacts.js.map +1 -1
- package/dist/modules/manager/composer/schema.js.map +1 -1
- package/dist/modules/manager/cpanfile/parser.js +2 -0
- package/dist/modules/manager/cpanfile/parser.js.map +1 -1
- package/dist/modules/manager/deps-edn/extract.js +3 -1
- package/dist/modules/manager/deps-edn/extract.js.map +1 -1
- package/dist/modules/manager/droneci/extract.js +4 -6
- package/dist/modules/manager/droneci/extract.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +11 -11
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/flux/extract.js +1 -0
- package/dist/modules/manager/flux/extract.js.map +1 -1
- package/dist/modules/manager/github-actions/extract.js +3 -0
- package/dist/modules/manager/github-actions/extract.js.map +1 -1
- package/dist/modules/manager/github-actions/known-actions.js +38 -2
- package/dist/modules/manager/github-actions/known-actions.js.map +1 -1
- package/dist/modules/manager/gitlabci/extract.js +1 -0
- package/dist/modules/manager/gitlabci/extract.js.map +1 -1
- package/dist/modules/manager/glasskube/extract.js +2 -0
- package/dist/modules/manager/glasskube/extract.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts-extra.js +1 -0
- package/dist/modules/manager/gomod/artifacts-extra.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts.js +1 -0
- package/dist/modules/manager/gomod/artifacts.js.map +1 -1
- package/dist/modules/manager/gomod/extract.js +1 -0
- package/dist/modules/manager/gomod/extract.js.map +1 -1
- package/dist/modules/manager/gradle/artifacts.js +1 -1
- package/dist/modules/manager/gradle/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle-wrapper/utils.js +1 -0
- package/dist/modules/manager/gradle-wrapper/utils.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/dependency.js +2 -1
- package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
- package/dist/modules/manager/pep621/extract.js +1 -2
- package/dist/modules/manager/pep621/extract.js.map +1 -1
- package/dist/modules/manager/quadlet/extract.js +2 -4
- package/dist/modules/manager/quadlet/extract.js.map +1 -1
- package/dist/modules/manager/swift/artifacts.js +3 -1
- package/dist/modules/manager/swift/artifacts.js.map +1 -1
- package/dist/modules/manager/swift/extract.js +1 -0
- package/dist/modules/manager/swift/extract.js.map +1 -1
- package/dist/modules/manager/terraform/extractors/others/modules.js.map +1 -1
- package/dist/modules/manager/terraform/lockfile/index.js +1 -0
- package/dist/modules/manager/terraform/lockfile/index.js.map +1 -1
- package/dist/modules/manager/terragrunt/extract.js +1 -0
- package/dist/modules/manager/terragrunt/extract.js.map +1 -1
- package/dist/modules/manager/tflint-plugin/extract.js +1 -0
- package/dist/modules/manager/tflint-plugin/extract.js.map +1 -1
- package/dist/modules/manager/tflint-plugin/plugins.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
|
@@ -23,7 +23,7 @@ const globalConfigOptionDefaults = {
|
|
|
23
23
|
"detectHostRulesFromEnv": false,
|
|
24
24
|
"dockerChildPrefix": "renovate_",
|
|
25
25
|
"dockerMaxPages": 20,
|
|
26
|
-
"dockerSidecarImage": "ghcr.io/renovatebot/base-image:13.98.
|
|
26
|
+
"dockerSidecarImage": "ghcr.io/renovatebot/base-image:13.98.5",
|
|
27
27
|
"dockerUser": "12021",
|
|
28
28
|
"executionTimeout": 15,
|
|
29
29
|
"exitCodeForErrors": false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-config-option-defaults.generated.js","names":[],"sources":["../lib/global-config-option-defaults.generated.ts"],"sourcesContent":["\nexport const globalConfigOptionDefaults: Record<string, unknown> = {\n \"allowCustomCrateRegistries\": false,\n \"allowedCommands\": [],\n \"allowedEnv\": [],\n \"allowedHeaders\": [\n \"X-*\"\n ],\n \"allowedUnsafeExecutions\": [],\n \"allowPlugins\": false,\n \"allowScripts\": false,\n \"allowShellExecutorForPostUpgradeCommands\": false,\n \"autodiscover\": false,\n \"bbUseDevelopmentBranch\": false,\n \"binarySource\": \"install\",\n \"cacheHardTtlMinutes\": 10080,\n \"cachePrivatePackages\": false,\n \"cacheTtlOverride\": {},\n \"checkedBranches\": [],\n \"configValidationError\": false,\n \"customEnvVariables\": {},\n \"deleteAdditionalConfigFile\": false,\n \"deleteConfigFile\": false,\n \"detectGlobalManagerConfig\": false,\n \"detectHostRulesFromEnv\": false,\n \"dockerChildPrefix\": \"renovate_\",\n \"dockerMaxPages\": 20,\n \"dockerSidecarImage\": \"ghcr.io/renovatebot/base-image:13.98.
|
|
1
|
+
{"version":3,"file":"global-config-option-defaults.generated.js","names":[],"sources":["../lib/global-config-option-defaults.generated.ts"],"sourcesContent":["\nexport const globalConfigOptionDefaults: Record<string, unknown> = {\n \"allowCustomCrateRegistries\": false,\n \"allowedCommands\": [],\n \"allowedEnv\": [],\n \"allowedHeaders\": [\n \"X-*\"\n ],\n \"allowedUnsafeExecutions\": [],\n \"allowPlugins\": false,\n \"allowScripts\": false,\n \"allowShellExecutorForPostUpgradeCommands\": false,\n \"autodiscover\": false,\n \"bbUseDevelopmentBranch\": false,\n \"binarySource\": \"install\",\n \"cacheHardTtlMinutes\": 10080,\n \"cachePrivatePackages\": false,\n \"cacheTtlOverride\": {},\n \"checkedBranches\": [],\n \"configValidationError\": false,\n \"customEnvVariables\": {},\n \"deleteAdditionalConfigFile\": false,\n \"deleteConfigFile\": false,\n \"detectGlobalManagerConfig\": false,\n \"detectHostRulesFromEnv\": false,\n \"dockerChildPrefix\": \"renovate_\",\n \"dockerMaxPages\": 20,\n \"dockerSidecarImage\": \"ghcr.io/renovatebot/base-image:13.98.5\",\n \"dockerUser\": \"12021\",\n \"executionTimeout\": 15,\n \"exitCodeForErrors\": false,\n \"exposeAllEnv\": false,\n \"forceCli\": true,\n \"forkCreation\": true,\n \"githubTokenWarn\": true,\n \"gitNoVerify\": [\n \"commit\",\n \"push\"\n ],\n \"gitTimeout\": 0,\n \"gitUrl\": \"default\",\n \"httpCacheTtlDays\": 90,\n \"ignorePrAuthor\": false,\n \"includeMirrors\": false,\n \"inheritConfig\": false,\n \"inheritConfigFileName\": \"org-inherited-config.json\",\n \"inheritConfigRepoName\": \"{{parentOrg}}/renovate-config\",\n \"inheritConfigStrict\": false,\n \"inheritConfigTrusted\": false,\n \"internalHostAccess\": \"warn\",\n \"mergeConfidenceDatasources\": [\n \"go\",\n \"maven\",\n \"npm\",\n \"nuget\",\n \"packagist\",\n \"pypi\",\n \"rubygems\"\n ],\n \"mergeConfidenceEndpoint\": \"https://developer.mend.io/\",\n \"migratePresets\": {},\n \"onboardingBranch\": \"renovate/configure\",\n \"onboardingConfig\": {\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\"\n },\n \"onboardingConfigFileName\": \"renovate.json\",\n \"onboardingNoDeps\": \"auto\",\n \"onboardingPrTitle\": \"Configure Renovate\",\n \"onboardingRebaseCheckbox\": false,\n \"optimizeForDisabled\": false,\n \"persistRepoData\": false,\n \"platform\": \"github\",\n \"prCacheSyncMaxPages\": 100,\n \"prCommitsPerRunLimit\": 0,\n \"presetCachePersistence\": false,\n \"processEnv\": {},\n \"productLinks\": {\n \"documentation\": \"https://docs.renovatebot.com/\",\n \"help\": \"https://github.com/renovatebot/renovate/discussions\",\n \"homepage\": \"https://github.com/renovatebot/renovate\"\n },\n \"rebaseAllOpenBranches\": false,\n \"reportFormatting\": false,\n \"repositoryCache\": \"disabled\",\n \"repositoryCacheForceLocal\": false,\n \"repositoryCacheType\": \"local\",\n \"requireConfig\": \"required\",\n \"s3PathStyle\": false,\n \"secrets\": {},\n \"unicodeEmoji\": true,\n \"useCloudMetadataServices\": true,\n \"userAgent\": \"Renovate/{{renovateVersion}} (https://github.com/renovatebot/renovate)\",\n \"variables\": {}\n};\n"],"mappings":";AACA,MAAa,6BAAsD;CACjE,8BAA8B;CAC9B,mBAAmB,CAAC;CACpB,cAAc,CAAC;CACf,kBAAkB,CAChB,KACF;CACA,2BAA2B,CAAC;CAC5B,gBAAgB;CAChB,gBAAgB;CAChB,4CAA4C;CAC5C,gBAAgB;CAChB,0BAA0B;CAC1B,gBAAgB;CAChB,uBAAuB;CACvB,wBAAwB;CACxB,oBAAoB,CAAC;CACrB,mBAAmB,CAAC;CACpB,yBAAyB;CACzB,sBAAsB,CAAC;CACvB,8BAA8B;CAC9B,oBAAoB;CACpB,6BAA6B;CAC7B,0BAA0B;CAC1B,qBAAqB;CACrB,kBAAkB;CAClB,sBAAsB;CACtB,cAAc;CACd,oBAAoB;CACpB,qBAAqB;CACrB,gBAAgB;CAChB,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,eAAe,CACb,UACA,MACF;CACA,cAAc;CACd,UAAU;CACV,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,yBAAyB;CACzB,yBAAyB;CACzB,uBAAuB;CACvB,wBAAwB;CACxB,sBAAsB;CACtB,8BAA8B;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,2BAA2B;CAC3B,kBAAkB,CAAC;CACnB,oBAAoB;CACpB,oBAAoB,EAClB,WAAW,oDACb;CACA,4BAA4B;CAC5B,oBAAoB;CACpB,qBAAqB;CACrB,4BAA4B;CAC5B,uBAAuB;CACvB,mBAAmB;CACnB,YAAY;CACZ,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,cAAc,CAAC;CACf,gBAAgB;EACd,iBAAiB;EACjB,QAAQ;EACR,YAAY;CACd;CACA,yBAAyB;CACzB,oBAAoB;CACpB,mBAAmB;CACnB,6BAA6B;CAC7B,uBAAuB;CACvB,iBAAiB;CACjB,eAAe;CACf,WAAW,CAAC;CACZ,gBAAgB;CAChB,4BAA4B;CAC5B,aAAa;CACb,aAAa,CAAC;AAChB"}
|
|
@@ -75,10 +75,9 @@ function finalize(dependency) {
|
|
|
75
75
|
break;
|
|
76
76
|
default:
|
|
77
77
|
dep.skipReason = "unsupported";
|
|
78
|
-
return
|
|
78
|
+
return;
|
|
79
79
|
}
|
|
80
80
|
if (!dependency.currentValue && !dep.skipReason) dep.skipReason = "unspecified-version";
|
|
81
|
-
return true;
|
|
82
81
|
}
|
|
83
82
|
function extractCollections(lines) {
|
|
84
83
|
const deps = [];
|
|
@@ -101,10 +100,9 @@ function extractCollections(lines) {
|
|
|
101
100
|
lineMatch = blockLineRegEx.exec(line);
|
|
102
101
|
if (lineMatch) lineNumber += 1;
|
|
103
102
|
} while (lineMatch);
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
103
|
+
finalize(dep);
|
|
104
|
+
delete dep.managerData;
|
|
105
|
+
deps.push(dep);
|
|
108
106
|
}
|
|
109
107
|
}
|
|
110
108
|
return deps;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.js","names":[],"sources":["../../../../lib/modules/manager/ansible-galaxy/collections.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GalaxyCollectionDatasource } from '../../datasource/galaxy-collection/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type { AnsibleGalaxyPackageDependency } from './types.ts';\nimport {\n blockLineRegEx,\n galaxyDepRegex,\n nameMatchRegex,\n newBlockRegEx,\n} from './util.ts';\n\nfunction interpretLine(\n lineMatch: RegExpMatchArray,\n dependency: AnsibleGalaxyPackageDependency,\n): void {\n const localDependency = dependency;\n const key = lineMatch.groups!.key;\n const value = lineMatch.groups!.value.replace(regEx(/[\"']/g), '');\n switch (key) {\n case 'name': {\n localDependency.managerData.name = value;\n break;\n }\n case 'version': {\n localDependency.managerData.version = value;\n localDependency.currentValue = value;\n break;\n }\n case 'source': {\n localDependency.managerData.source = value;\n if (value?.startsWith('git@') || value?.endsWith('.git')) {\n localDependency.packageName = value;\n } else {\n localDependency.registryUrls = value\n ? [value]\n : /* istanbul ignore next: should have test */ [];\n }\n break;\n }\n case 'type': {\n localDependency.managerData.type = value;\n break;\n }\n default: {\n // fail if we find an unexpected key\n localDependency.skipReason = 'unsupported';\n }\n }\n}\n\nfunction handleGitDep(\n dep: AnsibleGalaxyPackageDependency,\n nameMatch: RegExpExecArray | null,\n): void {\n dep.datasource = GitTagsDatasource.id;\n\n if (nameMatch?.groups) {\n // if a github.com repository is referenced use github-tags instead of git-tags\n if (nameMatch.groups.hostname === 'github.com') {\n dep.datasource = GithubTagsDatasource.id;\n } else {\n dep.datasource = GitTagsDatasource.id;\n }\n // source definition without version appendix\n const source = nameMatch.groups.source;\n const massagedDepName = nameMatch.groups.depName.replace(\n regEx(/.git$/),\n '',\n );\n dep.depName = `${nameMatch.groups.hostname}/${massagedDepName}`;\n // remove leading `git+` from URLs like `git+https://...`\n dep.packageName = source.replace(regEx(/git\\+/), '');\n\n // if version is declared using version appendix `<source url>,v1.2.0`, use it\n if (nameMatch.groups.version) {\n dep.currentValue = nameMatch.groups.version;\n } else {\n dep.currentValue = dep.managerData.version;\n }\n }\n}\n\nfunction handleGalaxyDep(dep: AnsibleGalaxyPackageDependency): void {\n dep.datasource = GalaxyCollectionDatasource.id;\n dep.depName = dep.managerData.name;\n dep.registryUrls = dep.managerData.source\n ? /* istanbul ignore next: should have test */ [dep.managerData.source]\n : [];\n dep.currentValue = dep.managerData.version;\n}\n\nfunction finalize(dependency: AnsibleGalaxyPackageDependency):
|
|
1
|
+
{"version":3,"file":"collections.js","names":[],"sources":["../../../../lib/modules/manager/ansible-galaxy/collections.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GalaxyCollectionDatasource } from '../../datasource/galaxy-collection/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport type { AnsibleGalaxyPackageDependency } from './types.ts';\nimport {\n blockLineRegEx,\n galaxyDepRegex,\n nameMatchRegex,\n newBlockRegEx,\n} from './util.ts';\n\nfunction interpretLine(\n lineMatch: RegExpMatchArray,\n dependency: AnsibleGalaxyPackageDependency,\n): void {\n const localDependency = dependency;\n const key = lineMatch.groups!.key;\n const value = lineMatch.groups!.value.replace(regEx(/[\"']/g), '');\n switch (key) {\n case 'name': {\n localDependency.managerData.name = value;\n break;\n }\n case 'version': {\n localDependency.managerData.version = value;\n localDependency.currentValue = value;\n break;\n }\n case 'source': {\n localDependency.managerData.source = value;\n if (value?.startsWith('git@') || value?.endsWith('.git')) {\n localDependency.packageName = value;\n } else {\n localDependency.registryUrls = value\n ? [value]\n : /* istanbul ignore next: should have test */ [];\n }\n break;\n }\n case 'type': {\n localDependency.managerData.type = value;\n break;\n }\n default: {\n // fail if we find an unexpected key\n localDependency.skipReason = 'unsupported';\n }\n }\n}\n\nfunction handleGitDep(\n dep: AnsibleGalaxyPackageDependency,\n nameMatch: RegExpExecArray | null,\n): void {\n dep.datasource = GitTagsDatasource.id;\n\n if (nameMatch?.groups) {\n // if a github.com repository is referenced use github-tags instead of git-tags\n if (nameMatch.groups.hostname === 'github.com') {\n dep.datasource = GithubTagsDatasource.id;\n } else {\n dep.datasource = GitTagsDatasource.id;\n }\n // source definition without version appendix\n const source = nameMatch.groups.source;\n const massagedDepName = nameMatch.groups.depName.replace(\n regEx(/.git$/),\n '',\n );\n dep.depName = `${nameMatch.groups.hostname}/${massagedDepName}`;\n // remove leading `git+` from URLs like `git+https://...`\n dep.packageName = source.replace(regEx(/git\\+/), '');\n\n // if version is declared using version appendix `<source url>,v1.2.0`, use it\n if (nameMatch.groups.version) {\n dep.currentValue = nameMatch.groups.version;\n } else {\n dep.currentValue = dep.managerData.version;\n }\n }\n}\n\nfunction handleGalaxyDep(dep: AnsibleGalaxyPackageDependency): void {\n dep.datasource = GalaxyCollectionDatasource.id;\n dep.depName = dep.managerData.name;\n dep.registryUrls = dep.managerData.source\n ? /* istanbul ignore next: should have test */ [dep.managerData.source]\n : [];\n dep.currentValue = dep.managerData.version;\n}\n\nfunction finalize(dependency: AnsibleGalaxyPackageDependency): void {\n const dep = dependency;\n dep.depName = dep.managerData.name;\n\n const name = dep.managerData.name;\n const nameMatch = nameMatchRegex.exec(name);\n\n // use type if defined\n switch (dependency.managerData.type) {\n case 'galaxy':\n handleGalaxyDep(dep);\n break;\n case 'git':\n handleGitDep(dep, nameMatch);\n break;\n case 'file':\n dep.skipReason = 'local-dependency';\n break;\n case null:\n // try to find out type based on source\n if (nameMatch) {\n handleGitDep(dep, nameMatch);\n break;\n }\n if (galaxyDepRegex.exec(dep.managerData.name)) {\n dep.datasource = GalaxyCollectionDatasource.id;\n dep.depName = dep.managerData.name;\n break;\n }\n dep.skipReason = 'no-source-match';\n break;\n default:\n dep.skipReason = 'unsupported';\n return;\n }\n\n if (!dependency.currentValue && !dep.skipReason) {\n dep.skipReason = 'unspecified-version';\n }\n}\n\nexport function extractCollections(lines: string[]): PackageDependency[] {\n const deps: PackageDependency[] = [];\n\n for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {\n let lineMatch = newBlockRegEx.exec(lines[lineNumber]);\n if (lineMatch) {\n const dep: AnsibleGalaxyPackageDependency = {\n depType: 'galaxy-collection',\n managerData: {\n name: null,\n version: null,\n type: null,\n source: null,\n },\n };\n do {\n interpretLine(lineMatch, dep);\n const line = lines[lineNumber + 1];\n\n if (!line) {\n break;\n }\n lineMatch = blockLineRegEx.exec(line);\n if (lineMatch) {\n lineNumber += 1;\n }\n } while (lineMatch);\n finalize(dep);\n delete (dep as PackageDependency).managerData;\n deps.push(dep);\n }\n }\n return deps;\n}\n"],"mappings":";;;;;;AAaA,SAAS,cACP,WACA,YACM;CACN,MAAM,kBAAkB;CACxB,MAAM,MAAM,UAAU,OAAQ;CAC9B,MAAM,QAAQ,UAAU,OAAQ,MAAM,QAAQ,MAAM,OAAO,GAAG,EAAE;CAChE,QAAQ,KAAR;EACE,KAAK;GACH,gBAAgB,YAAY,OAAO;GACnC;EAEF,KAAK;GACH,gBAAgB,YAAY,UAAU;GACtC,gBAAgB,eAAe;GAC/B;EAEF,KAAK;GACH,gBAAgB,YAAY,SAAS;GACrC,IAAI,OAAO,WAAW,MAAM,KAAK,OAAO,SAAS,MAAM,GACrD,gBAAgB,cAAc;QAE9B,gBAAgB,eAAe,QAC3B,CAAC,KAAK,iDACuC,CAAC;GAEpD;EAEF,KAAK;GACH,gBAAgB,YAAY,OAAO;GACnC;EAEF,SAEE,gBAAgB,aAAa;CAEjC;AACF;AAEA,SAAS,aACP,KACA,WACM;CACN,IAAI,aAAa,kBAAkB;CAEnC,IAAI,WAAW,QAAQ;EAErB,IAAI,UAAU,OAAO,aAAa,cAChC,IAAI,aAAa,qBAAqB;OAEtC,IAAI,aAAa,kBAAkB;EAGrC,MAAM,SAAS,UAAU,OAAO;EAChC,MAAM,kBAAkB,UAAU,OAAO,QAAQ,QAC/C,MAAM,OAAO,GACb,EACF;EACA,IAAI,UAAU,GAAG,UAAU,OAAO,SAAS,GAAG;EAE9C,IAAI,cAAc,OAAO,QAAQ,MAAM,OAAO,GAAG,EAAE;EAGnD,IAAI,UAAU,OAAO,SACnB,IAAI,eAAe,UAAU,OAAO;OAEpC,IAAI,eAAe,IAAI,YAAY;CAEvC;AACF;AAEA,SAAS,gBAAgB,KAA2C;CAClE,IAAI,aAAa,2BAA2B;CAC5C,IAAI,UAAU,IAAI,YAAY;CAC9B,IAAI,eAAe,IAAI,YAAY,sDACc,CAAC,IAAI,YAAY,MAAM,IACpE,CAAC;CACL,IAAI,eAAe,IAAI,YAAY;AACrC;AAEA,SAAS,SAAS,YAAkD;CAClE,MAAM,MAAM;CACZ,IAAI,UAAU,IAAI,YAAY;CAE9B,MAAM,OAAO,IAAI,YAAY;CAC7B,MAAM,YAAY,eAAe,KAAK,IAAI;CAG1C,QAAQ,WAAW,YAAY,MAA/B;EACE,KAAK;GACH,gBAAgB,GAAG;GACnB;EACF,KAAK;GACH,aAAa,KAAK,SAAS;GAC3B;EACF,KAAK;GACH,IAAI,aAAa;GACjB;EACF,KAAK;GAEH,IAAI,WAAW;IACb,aAAa,KAAK,SAAS;IAC3B;GACF;GACA,IAAI,eAAe,KAAK,IAAI,YAAY,IAAI,GAAG;IAC7C,IAAI,aAAa,2BAA2B;IAC5C,IAAI,UAAU,IAAI,YAAY;IAC9B;GACF;GACA,IAAI,aAAa;GACjB;EACF;GACE,IAAI,aAAa;GACjB;CACJ;CAEA,IAAI,CAAC,WAAW,gBAAgB,CAAC,IAAI,YACnC,IAAI,aAAa;AAErB;AAEA,SAAgB,mBAAmB,OAAsC;CACvE,MAAM,OAA4B,CAAC;CAEnC,KAAK,IAAI,aAAa,GAAG,aAAa,MAAM,QAAQ,cAAc,GAAG;EACnE,IAAI,YAAY,cAAc,KAAK,MAAM,WAAW;EACpD,IAAI,WAAW;GACb,MAAM,MAAsC;IAC1C,SAAS;IACT,aAAa;KACX,MAAM;KACN,SAAS;KACT,MAAM;KACN,QAAQ;IACV;GACF;GACA,GAAG;IACD,cAAc,WAAW,GAAG;IAC5B,MAAM,OAAO,MAAM,aAAa;IAEhC,IAAI,CAAC,MACH;IAEF,YAAY,eAAe,KAAK,IAAI;IACpC,IAAI,WACF,cAAc;GAElB,SAAS;GACT,SAAS,GAAG;GACZ,OAAQ,IAA0B;GAClC,KAAK,KAAK,GAAG;EACf;CACF;CACA,OAAO;AACT"}
|
|
@@ -113,6 +113,7 @@ function extractPackageFile(content, packageFile, config) {
|
|
|
113
113
|
}
|
|
114
114
|
for (const container of coerceArray(pkg.resources?.containers)) {
|
|
115
115
|
const dep = extractContainer(container);
|
|
116
|
+
// v8 ignore else -- `extractContainer()` always returns a dep
|
|
116
117
|
if (dep) deps.push(dep);
|
|
117
118
|
}
|
|
118
119
|
for (const { jobs } of coerceArray(pkg.stages)) deps.push(...extractJobs(jobs));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/azure-pipelines/extract.ts"],"sourcesContent":["import { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { AzurePipelinesTasksDatasource } from '../../datasource/azure-pipelines-tasks/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport type {\n AzurePipelines,\n Container,\n Deploy,\n Deployment,\n Job,\n Jobs,\n Repository,\n Step,\n} from './schema.ts';\nimport { AzurePipelinesYaml } from './schema.ts';\n\nconst AzurePipelinesTaskRegex = regEx(/^(?<name>[^@]+)@(?<version>.*)$/);\n\nexport function extractRepository(\n repository: Repository,\n currentRepository?: string,\n): PackageDependency | null {\n let repositoryUrl = null;\n\n let depName = repository.name;\n\n if (repository.type === 'github') {\n repositoryUrl = `https://github.com/${repository.name}.git`;\n } else if (repository.type === 'git') {\n const platform = GlobalConfig.get('platform');\n const endpoint = GlobalConfig.get('endpoint');\n\n if (platform === 'azure' && endpoint) {\n // extract the project name if the repository from which the pipline is referencing templates contains the Azure DevOps project name\n if (repository.name.includes('/')) {\n const [projectName, repoName] = repository.name.split('/');\n repositoryUrl = joinUrlParts(\n endpoint,\n encodeURIComponent(projectName),\n '_git',\n encodeURIComponent(repoName),\n );\n\n // if the repository from which the pipline is referencing templates does not contain the Azure DevOps project name, get the project name from the repository containing the pipeline file being process\n } else if (currentRepository?.includes('/')) {\n const projectName = currentRepository.split('/')[0];\n depName = `${projectName}/${repository.name}`;\n repositoryUrl = joinUrlParts(\n endpoint,\n encodeURIComponent(projectName),\n '_git',\n encodeURIComponent(repository.name),\n );\n } else {\n logger.debug(\n 'Renovate cannot update Azure pipelines in git repositories when neither the current repository nor the target repository contains the Azure DevOps project name.',\n );\n }\n }\n }\n\n if (repositoryUrl === null) {\n return null;\n }\n\n if (!repository.ref?.startsWith('refs/tags/')) {\n return null;\n }\n\n return {\n autoReplaceStringTemplate: 'refs/tags/{{newValue}}',\n currentValue: repository.ref.replace('refs/tags/', ''),\n datasource: GitTagsDatasource.id,\n depName,\n depType: 'gitTags',\n packageName: repositoryUrl,\n replaceString: repository.ref,\n };\n}\n\nexport function extractContainer(\n container: Container,\n): PackageDependency | null {\n const dep = getDep(container.image);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Azure pipelines docker image',\n );\n dep.depType = 'docker';\n\n return dep;\n}\n\nexport function extractAzurePipelinesTasks(\n task: string,\n): PackageDependency | null {\n const match = AzurePipelinesTaskRegex.exec(task);\n if (match?.groups) {\n return {\n depName: match.groups.name,\n currentValue: match.groups.version,\n datasource: AzurePipelinesTasksDatasource.id,\n };\n }\n return null;\n}\n\nexport function parseAzurePipelines(\n content: string,\n packageFile: string,\n): AzurePipelines | null {\n const res = AzurePipelinesYaml.safeParse(content);\n if (res.success) {\n return res.data;\n }\n logger.debug(\n { err: res.error, packageFile },\n 'Error parsing pubspec lockfile.',\n );\n\n return null;\n}\n\nfunction extractSteps(steps: Step[] | undefined): PackageDependency[] {\n const deps = [];\n for (const step of coerceArray(steps)) {\n const task = extractAzurePipelinesTasks(step.task);\n if (task) {\n deps.push(task);\n }\n }\n return deps;\n}\n\nfunction extractJob(job: Job | undefined): PackageDependency[] {\n return extractSteps(job?.steps);\n}\n\nfunction extractDeploy(deploy: Deploy | undefined): PackageDependency[] {\n const deps = extractJob(deploy?.deploy);\n deps.push(...extractJob(deploy?.postRouteTraffic));\n deps.push(...extractJob(deploy?.preDeploy));\n deps.push(...extractJob(deploy?.routeTraffic));\n deps.push(...extractJob(deploy?.on?.failure));\n deps.push(...extractJob(deploy?.on?.success));\n return deps;\n}\n\nfunction extractJobs(jobs: Jobs | undefined): PackageDependency[] {\n const deps: PackageDependency[] = [];\n for (const jobOrDeployment of coerceArray(jobs)) {\n const deployment = jobOrDeployment as Deployment;\n if (deployment.strategy) {\n deps.push(...extractDeploy(deployment.strategy.canary));\n deps.push(...extractDeploy(deployment.strategy.rolling));\n deps.push(...extractDeploy(deployment.strategy.runOnce));\n continue;\n }\n\n const job = jobOrDeployment as Job;\n deps.push(...extractJob(job));\n }\n return deps;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n logger.trace(`azurePipelines.extractPackageFile(${packageFile})`);\n const deps: PackageDependency[] = [];\n\n const pkg = parseAzurePipelines(content, packageFile);\n if (!pkg) {\n return null;\n }\n\n for (const repository of coerceArray(pkg.resources?.repositories)) {\n const dep = extractRepository(repository, config.repository);\n if (dep) {\n deps.push(dep);\n }\n }\n\n for (const container of coerceArray(pkg.resources?.containers)) {\n const dep = extractContainer(container);\n if (dep) {\n deps.push(dep);\n }\n }\n\n for (const { jobs } of coerceArray(pkg.stages)) {\n deps.push(...extractJobs(jobs));\n }\n\n deps.push(...extractJobs(pkg.jobs));\n deps.push(...extractSteps(pkg.steps));\n\n if (!deps.length) {\n return null;\n }\n return { deps };\n}\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/azure-pipelines/extract.ts"],"sourcesContent":["import { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { AzurePipelinesTasksDatasource } from '../../datasource/azure-pipelines-tasks/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport type {\n AzurePipelines,\n Container,\n Deploy,\n Deployment,\n Job,\n Jobs,\n Repository,\n Step,\n} from './schema.ts';\nimport { AzurePipelinesYaml } from './schema.ts';\n\nconst AzurePipelinesTaskRegex = regEx(/^(?<name>[^@]+)@(?<version>.*)$/);\n\nexport function extractRepository(\n repository: Repository,\n currentRepository?: string,\n): PackageDependency | null {\n let repositoryUrl = null;\n\n let depName = repository.name;\n\n if (repository.type === 'github') {\n repositoryUrl = `https://github.com/${repository.name}.git`;\n } else if (repository.type === 'git') {\n const platform = GlobalConfig.get('platform');\n const endpoint = GlobalConfig.get('endpoint');\n\n if (platform === 'azure' && endpoint) {\n // extract the project name if the repository from which the pipline is referencing templates contains the Azure DevOps project name\n if (repository.name.includes('/')) {\n const [projectName, repoName] = repository.name.split('/');\n repositoryUrl = joinUrlParts(\n endpoint,\n encodeURIComponent(projectName),\n '_git',\n encodeURIComponent(repoName),\n );\n\n // if the repository from which the pipline is referencing templates does not contain the Azure DevOps project name, get the project name from the repository containing the pipeline file being process\n } else if (currentRepository?.includes('/')) {\n const projectName = currentRepository.split('/')[0];\n depName = `${projectName}/${repository.name}`;\n repositoryUrl = joinUrlParts(\n endpoint,\n encodeURIComponent(projectName),\n '_git',\n encodeURIComponent(repository.name),\n );\n } else {\n logger.debug(\n 'Renovate cannot update Azure pipelines in git repositories when neither the current repository nor the target repository contains the Azure DevOps project name.',\n );\n }\n }\n }\n\n if (repositoryUrl === null) {\n return null;\n }\n\n if (!repository.ref?.startsWith('refs/tags/')) {\n return null;\n }\n\n return {\n autoReplaceStringTemplate: 'refs/tags/{{newValue}}',\n currentValue: repository.ref.replace('refs/tags/', ''),\n datasource: GitTagsDatasource.id,\n depName,\n depType: 'gitTags',\n packageName: repositoryUrl,\n replaceString: repository.ref,\n };\n}\n\nexport function extractContainer(\n container: Container,\n): PackageDependency | null {\n const dep = getDep(container.image);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Azure pipelines docker image',\n );\n dep.depType = 'docker';\n\n return dep;\n}\n\nexport function extractAzurePipelinesTasks(\n task: string,\n): PackageDependency | null {\n const match = AzurePipelinesTaskRegex.exec(task);\n if (match?.groups) {\n return {\n depName: match.groups.name,\n currentValue: match.groups.version,\n datasource: AzurePipelinesTasksDatasource.id,\n };\n }\n return null;\n}\n\nexport function parseAzurePipelines(\n content: string,\n packageFile: string,\n): AzurePipelines | null {\n const res = AzurePipelinesYaml.safeParse(content);\n if (res.success) {\n return res.data;\n }\n logger.debug(\n { err: res.error, packageFile },\n 'Error parsing pubspec lockfile.',\n );\n\n return null;\n}\n\nfunction extractSteps(steps: Step[] | undefined): PackageDependency[] {\n const deps = [];\n for (const step of coerceArray(steps)) {\n const task = extractAzurePipelinesTasks(step.task);\n if (task) {\n deps.push(task);\n }\n }\n return deps;\n}\n\nfunction extractJob(job: Job | undefined): PackageDependency[] {\n return extractSteps(job?.steps);\n}\n\nfunction extractDeploy(deploy: Deploy | undefined): PackageDependency[] {\n const deps = extractJob(deploy?.deploy);\n deps.push(...extractJob(deploy?.postRouteTraffic));\n deps.push(...extractJob(deploy?.preDeploy));\n deps.push(...extractJob(deploy?.routeTraffic));\n deps.push(...extractJob(deploy?.on?.failure));\n deps.push(...extractJob(deploy?.on?.success));\n return deps;\n}\n\nfunction extractJobs(jobs: Jobs | undefined): PackageDependency[] {\n const deps: PackageDependency[] = [];\n for (const jobOrDeployment of coerceArray(jobs)) {\n const deployment = jobOrDeployment as Deployment;\n if (deployment.strategy) {\n deps.push(...extractDeploy(deployment.strategy.canary));\n deps.push(...extractDeploy(deployment.strategy.rolling));\n deps.push(...extractDeploy(deployment.strategy.runOnce));\n continue;\n }\n\n const job = jobOrDeployment as Job;\n deps.push(...extractJob(job));\n }\n return deps;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n logger.trace(`azurePipelines.extractPackageFile(${packageFile})`);\n const deps: PackageDependency[] = [];\n\n const pkg = parseAzurePipelines(content, packageFile);\n if (!pkg) {\n return null;\n }\n\n for (const repository of coerceArray(pkg.resources?.repositories)) {\n const dep = extractRepository(repository, config.repository);\n if (dep) {\n deps.push(dep);\n }\n }\n\n for (const container of coerceArray(pkg.resources?.containers)) {\n const dep = extractContainer(container);\n // v8 ignore else -- `extractContainer()` always returns a dep\n if (dep) {\n deps.push(dep);\n }\n }\n\n for (const { jobs } of coerceArray(pkg.stages)) {\n deps.push(...extractJobs(jobs));\n }\n\n deps.push(...extractJobs(pkg.jobs));\n deps.push(...extractSteps(pkg.steps));\n\n if (!deps.length) {\n return null;\n }\n return { deps };\n}\n"],"mappings":"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"}
|
|
@@ -14,7 +14,9 @@ function getUrlFragments(rule) {
|
|
|
14
14
|
if (urlRecord?.type === "string") urls.push(urlRecord);
|
|
15
15
|
const urlsRecord = rule.children.urls;
|
|
16
16
|
if (urlsRecord?.type === "array") {
|
|
17
|
-
for (const urlRecord of urlsRecord.children)
|
|
17
|
+
for (const urlRecord of urlsRecord.children)
|
|
18
|
+
// v8 ignore else -- type narrowing only
|
|
19
|
+
if (urlRecord.type === "string") urls.push(urlRecord);
|
|
18
20
|
}
|
|
19
21
|
return urls;
|
|
20
22
|
}
|
|
@@ -74,6 +76,7 @@ async function updateArtifacts(updateArtifact) {
|
|
|
74
76
|
for (const upgrade of upgrades) {
|
|
75
77
|
const { managerData } = upgrade;
|
|
76
78
|
const idx = managerData?.idx;
|
|
79
|
+
// v8 ignore else -- only http rules reach updateArtifacts
|
|
77
80
|
if (upgrade.depType === "http_file" || upgrade.depType === "http_archive") {
|
|
78
81
|
const rule = findCodeFragment(newContents, [idx]);
|
|
79
82
|
/* v8 ignore next -- used only for type narrowing */
|
|
@@ -93,6 +96,7 @@ async function updateArtifacts(updateArtifact) {
|
|
|
93
96
|
const urls = urlFragments.map(({ value }) => updateValues(value));
|
|
94
97
|
const hash = await getHashFromUrls(urls);
|
|
95
98
|
if (!hash) {
|
|
99
|
+
// v8 ignore else -- the empty case already continued above
|
|
96
100
|
if (urlFragments.length >= 1) artifactErrors.push({
|
|
97
101
|
fileName: path,
|
|
98
102
|
stderr: `Could not calculate sha256 for ${upgrade.depName} at ${upgrade.newValue}. Checked URLs: ${urls.join(", ")}`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","names":["packageCache.get","packageCache.set","pMap"],"sources":["../../../../lib/modules/manager/bazel/artifacts.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { map as pMap } from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type {\n ArtifactError,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport {\n findCodeFragment,\n patchCodeAtFragments,\n updateCode,\n} from './common.ts';\nimport type { RecordFragment, StringFragment } from './types.ts';\n\nconst http = new Http('bazel');\n\nfunction getUrlFragments(rule: RecordFragment): StringFragment[] {\n const urls: StringFragment[] = [];\n\n const urlRecord = rule.children.url;\n if (urlRecord?.type === 'string') {\n urls.push(urlRecord);\n }\n\n const urlsRecord = rule.children.urls;\n if (urlsRecord?.type === 'array') {\n for (const urlRecord of urlsRecord.children) {\n if (urlRecord.type === 'string') {\n urls.push(urlRecord);\n }\n }\n }\n\n return urls;\n}\n\nconst urlMassages = {\n 'bazel-skylib.': 'bazel_skylib-',\n '/bazel-gazelle/releases/download/0': '/bazel-gazelle/releases/download/v0',\n '/bazel-gazelle-0': '/bazel-gazelle-v0',\n '/rules_go/releases/download/0': '/rules_go/releases/download/v0',\n '/rules_go-0': '/rules_go-v0',\n};\n\nfunction massageUrl(url: string): string {\n let result = url;\n for (const [from, to] of Object.entries(urlMassages)) {\n result = result.replace(from, to);\n }\n return result;\n}\n\nfunction migrateUrl(url: string, upgrade: Upgrade): string {\n const newValue = upgrade.newValue?.replace(regEx(/^v/), '');\n\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.3.5\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.4.0\n if (\n url.endsWith('/rules_webtesting.tar.gz') &&\n !newValue?.match(regEx(/^0\\.[0123]\\./))\n ) {\n return url.replace(regEx(/\\.tar\\.gz$/), `-${newValue}.tar.gz`);\n }\n\n return url;\n}\n\nfunction replaceAll(input: string, from: string, to: string): string {\n return input.split(from).join(to);\n}\n\nfunction replaceValues(\n content: string,\n from: string | null | undefined,\n to: string | null | undefined,\n): string {\n // istanbul ignore if\n if (!from || !to || from === to) {\n return content;\n }\n const massagedFrom = from.replace(regEx(/^v/), '');\n const massagedTo = to.replace(regEx(/^v/), '');\n return replaceAll(content, massagedFrom, massagedTo);\n}\n\nasync function getHashFromUrl(url: string): Promise<string | null> {\n const cacheNamespace = 'url-sha256';\n const cachedResult = await packageCache.get<string | null>(\n cacheNamespace,\n url,\n );\n /* istanbul ignore next line */\n if (cachedResult) {\n return cachedResult;\n }\n try {\n const hash = await hashStream(http.stream(url), 'sha256');\n const cacheMinutes = 3 * 24 * 60; // 3 days\n await packageCache.set(cacheNamespace, url, hash, cacheMinutes);\n return hash;\n } catch /* istanbul ignore next */ {\n return null;\n }\n}\n\nasync function getHashFromUrls(urls: string[]): Promise<string | null> {\n const hashes = (\n await pMap(urls, (url) => getHashFromUrl(massageUrl(url)))\n ).filter(isTruthy);\n if (!hashes.length) {\n logger.debug({ urls }, 'Could not calculate hash for URLs');\n return null;\n }\n\n const distinctHashes = new Set(hashes);\n // istanbul ignore if\n if (distinctHashes.size > 1) {\n logger.warn({ urls }, 'Found multiple hashes for single def');\n }\n\n return hashes[0];\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n const { packageFileName: path, updatedDeps: upgrades } = updateArtifact;\n const oldContents = updateArtifact.newPackageFileContent;\n let newContents = oldContents;\n const artifactErrors: ArtifactError[] = [];\n for (const upgrade of upgrades) {\n const { managerData } = upgrade;\n const idx = managerData?.idx as number;\n\n if (upgrade.depType === 'http_file' || upgrade.depType === 'http_archive') {\n const rule = findCodeFragment(newContents, [idx]);\n /* v8 ignore next -- used only for type narrowing */\n if (rule?.type !== 'record') {\n continue;\n }\n\n const urlFragments = getUrlFragments(rule);\n if (!urlFragments?.length) {\n logger.debug(`def: ${rule.value}, urls is empty`);\n continue;\n }\n\n function updateValues(oldUrl: string): string {\n let url = oldUrl;\n url = replaceValues(url, upgrade.currentValue, upgrade.newValue);\n url = replaceValues(url, upgrade.currentDigest, upgrade.newDigest);\n url = migrateUrl(url, upgrade);\n return url;\n }\n\n const urls = urlFragments.map(({ value }) => updateValues(value));\n const hash = await getHashFromUrls(urls);\n if (!hash) {\n if (urlFragments.length >= 1) {\n artifactErrors.push({\n fileName: path,\n stderr: `Could not calculate sha256 for ${upgrade.depName} at ${upgrade.newValue}. Checked URLs: ${urls.join(', ')}`,\n });\n }\n continue;\n }\n\n newContents = patchCodeAtFragments(\n newContents,\n urlFragments,\n updateValues,\n );\n newContents = updateCode(\n newContents,\n [idx, 'strip_prefix'],\n updateValues,\n );\n newContents = updateCode(newContents, [idx, 'sha256'], hash);\n }\n }\n\n if (oldContents === newContents) {\n if (artifactErrors.length) {\n // If we have artifact errors, return them even if we have file changes\n return artifactErrors.map((error) => ({\n artifactError: error,\n }));\n }\n return null;\n }\n\n return [\n {\n file: {\n type: 'addition',\n path,\n contents: newContents,\n },\n },\n ];\n}\n"],"mappings":";;;;;;;;;AAoBA,MAAM,OAAO,IAAI,KAAK,OAAO;AAE7B,SAAS,gBAAgB,MAAwC;CAC/D,MAAM,OAAyB,CAAC;CAEhC,MAAM,YAAY,KAAK,SAAS;CAChC,IAAI,WAAW,SAAS,UACtB,KAAK,KAAK,SAAS;CAGrB,MAAM,aAAa,KAAK,SAAS;CACjC,IAAI,YAAY,SAAS,SAClB;OAAA,MAAM,aAAa,WAAW,
|
|
1
|
+
{"version":3,"file":"artifacts.js","names":["packageCache.get","packageCache.set","pMap"],"sources":["../../../../lib/modules/manager/bazel/artifacts.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport * as packageCache from '../../../util/cache/package/index.ts';\nimport { hashStream } from '../../../util/hash.ts';\nimport { Http } from '../../../util/http/index.ts';\nimport { map as pMap } from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type {\n ArtifactError,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport {\n findCodeFragment,\n patchCodeAtFragments,\n updateCode,\n} from './common.ts';\nimport type { RecordFragment, StringFragment } from './types.ts';\n\nconst http = new Http('bazel');\n\nfunction getUrlFragments(rule: RecordFragment): StringFragment[] {\n const urls: StringFragment[] = [];\n\n const urlRecord = rule.children.url;\n if (urlRecord?.type === 'string') {\n urls.push(urlRecord);\n }\n\n const urlsRecord = rule.children.urls;\n if (urlsRecord?.type === 'array') {\n for (const urlRecord of urlsRecord.children) {\n // v8 ignore else -- type narrowing only\n if (urlRecord.type === 'string') {\n urls.push(urlRecord);\n }\n }\n }\n\n return urls;\n}\n\nconst urlMassages = {\n 'bazel-skylib.': 'bazel_skylib-',\n '/bazel-gazelle/releases/download/0': '/bazel-gazelle/releases/download/v0',\n '/bazel-gazelle-0': '/bazel-gazelle-v0',\n '/rules_go/releases/download/0': '/rules_go/releases/download/v0',\n '/rules_go-0': '/rules_go-v0',\n};\n\nfunction massageUrl(url: string): string {\n let result = url;\n for (const [from, to] of Object.entries(urlMassages)) {\n result = result.replace(from, to);\n }\n return result;\n}\n\nfunction migrateUrl(url: string, upgrade: Upgrade): string {\n const newValue = upgrade.newValue?.replace(regEx(/^v/), '');\n\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.3.5\n // @see https://github.com/bazelbuild/rules_webtesting/releases/tag/0.4.0\n if (\n url.endsWith('/rules_webtesting.tar.gz') &&\n !newValue?.match(regEx(/^0\\.[0123]\\./))\n ) {\n return url.replace(regEx(/\\.tar\\.gz$/), `-${newValue}.tar.gz`);\n }\n\n return url;\n}\n\nfunction replaceAll(input: string, from: string, to: string): string {\n return input.split(from).join(to);\n}\n\nfunction replaceValues(\n content: string,\n from: string | null | undefined,\n to: string | null | undefined,\n): string {\n // istanbul ignore if\n if (!from || !to || from === to) {\n return content;\n }\n const massagedFrom = from.replace(regEx(/^v/), '');\n const massagedTo = to.replace(regEx(/^v/), '');\n return replaceAll(content, massagedFrom, massagedTo);\n}\n\nasync function getHashFromUrl(url: string): Promise<string | null> {\n const cacheNamespace = 'url-sha256';\n const cachedResult = await packageCache.get<string | null>(\n cacheNamespace,\n url,\n );\n /* istanbul ignore next line */\n if (cachedResult) {\n return cachedResult;\n }\n try {\n const hash = await hashStream(http.stream(url), 'sha256');\n const cacheMinutes = 3 * 24 * 60; // 3 days\n await packageCache.set(cacheNamespace, url, hash, cacheMinutes);\n return hash;\n } catch /* istanbul ignore next */ {\n return null;\n }\n}\n\nasync function getHashFromUrls(urls: string[]): Promise<string | null> {\n const hashes = (\n await pMap(urls, (url) => getHashFromUrl(massageUrl(url)))\n ).filter(isTruthy);\n if (!hashes.length) {\n logger.debug({ urls }, 'Could not calculate hash for URLs');\n return null;\n }\n\n const distinctHashes = new Set(hashes);\n // istanbul ignore if\n if (distinctHashes.size > 1) {\n logger.warn({ urls }, 'Found multiple hashes for single def');\n }\n\n return hashes[0];\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n const { packageFileName: path, updatedDeps: upgrades } = updateArtifact;\n const oldContents = updateArtifact.newPackageFileContent;\n let newContents = oldContents;\n const artifactErrors: ArtifactError[] = [];\n for (const upgrade of upgrades) {\n const { managerData } = upgrade;\n const idx = managerData?.idx as number;\n\n // v8 ignore else -- only http rules reach updateArtifacts\n if (upgrade.depType === 'http_file' || upgrade.depType === 'http_archive') {\n const rule = findCodeFragment(newContents, [idx]);\n /* v8 ignore next -- used only for type narrowing */\n if (rule?.type !== 'record') {\n continue;\n }\n\n const urlFragments = getUrlFragments(rule);\n if (!urlFragments?.length) {\n logger.debug(`def: ${rule.value}, urls is empty`);\n continue;\n }\n\n function updateValues(oldUrl: string): string {\n let url = oldUrl;\n url = replaceValues(url, upgrade.currentValue, upgrade.newValue);\n url = replaceValues(url, upgrade.currentDigest, upgrade.newDigest);\n url = migrateUrl(url, upgrade);\n return url;\n }\n\n const urls = urlFragments.map(({ value }) => updateValues(value));\n const hash = await getHashFromUrls(urls);\n if (!hash) {\n // v8 ignore else -- the empty case already continued above\n if (urlFragments.length >= 1) {\n artifactErrors.push({\n fileName: path,\n stderr: `Could not calculate sha256 for ${upgrade.depName} at ${upgrade.newValue}. Checked URLs: ${urls.join(', ')}`,\n });\n }\n continue;\n }\n\n newContents = patchCodeAtFragments(\n newContents,\n urlFragments,\n updateValues,\n );\n newContents = updateCode(\n newContents,\n [idx, 'strip_prefix'],\n updateValues,\n );\n newContents = updateCode(newContents, [idx, 'sha256'], hash);\n }\n }\n\n if (oldContents === newContents) {\n if (artifactErrors.length) {\n // If we have artifact errors, return them even if we have file changes\n return artifactErrors.map((error) => ({\n artifactError: error,\n }));\n }\n return null;\n }\n\n return [\n {\n file: {\n type: 'addition',\n path,\n contents: newContents,\n },\n },\n ];\n}\n"],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ function currentFragment(ctx) {
|
|
|
15
15
|
return ctx.stack.at(-1);
|
|
16
16
|
}
|
|
17
17
|
function extractTreeValue(source, tree, offset) {
|
|
18
|
+
// v8 ignore else -- type narrowing only
|
|
18
19
|
if (tree.type === "wrapped-tree") {
|
|
19
20
|
const { endsWith } = tree;
|
|
20
21
|
const to = endsWith.offset + endsWith.value.length;
|
|
@@ -45,6 +46,7 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
|
|
|
45
46
|
};
|
|
46
47
|
}).op("=").alt(query.str((ctx, { offset, value }) => {
|
|
47
48
|
const frag = currentFragment(ctx);
|
|
49
|
+
// v8 ignore else -- type narrowing only
|
|
48
50
|
if (frag.type === "record" && ctx.recordKey) {
|
|
49
51
|
const key = ctx.recordKey;
|
|
50
52
|
frag.children[key] = {
|
|
@@ -61,6 +63,7 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
|
|
|
61
63
|
endsWith: "]",
|
|
62
64
|
preHandler: (ctx, tree) => {
|
|
63
65
|
const parentRecord = currentFragment(ctx);
|
|
66
|
+
// v8 ignore else -- type narrowing only
|
|
64
67
|
if (parentRecord.type === "record" && ctx.recordKey && tree.type === "wrapped-tree") {
|
|
65
68
|
const key = ctx.recordKey;
|
|
66
69
|
parentRecord.children[key] = {
|
|
@@ -74,9 +77,11 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
|
|
|
74
77
|
},
|
|
75
78
|
search: query.alt(query.str((ctx, { value, offset }) => {
|
|
76
79
|
const parentRecord = currentFragment(ctx);
|
|
80
|
+
// v8 ignore else -- type narrowing only
|
|
77
81
|
if (parentRecord.type === "record" && ctx.recordKey) {
|
|
78
82
|
const key = ctx.recordKey;
|
|
79
83
|
const array = parentRecord.children[key];
|
|
84
|
+
// v8 ignore else -- type narrowing only
|
|
80
85
|
if (array.type === "array") array.children.push({
|
|
81
86
|
type: "string",
|
|
82
87
|
value,
|
|
@@ -86,6 +91,7 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
|
|
|
86
91
|
return ctx;
|
|
87
92
|
}), query.sym().handler(recordStartHandler).handler((ctx, { value, offset }) => {
|
|
88
93
|
const ruleFragment = currentFragment(ctx);
|
|
94
|
+
// v8 ignore else -- type narrowing only
|
|
89
95
|
if (ruleFragment.type === "record") ruleFragment.children._function = {
|
|
90
96
|
type: "string",
|
|
91
97
|
value,
|
|
@@ -94,6 +100,7 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
|
|
|
94
100
|
return ctx;
|
|
95
101
|
}).many(query.op(".").sym((ctx, { value }) => {
|
|
96
102
|
const ruleFragment = currentFragment(ctx);
|
|
103
|
+
// v8 ignore else -- type narrowing only
|
|
97
104
|
if (ruleFragment.type === "record" && ruleFragment.children._function) ruleFragment.children._function.value += `.${value}`;
|
|
98
105
|
return ctx;
|
|
99
106
|
}), 0, 3).tree({
|
|
@@ -108,6 +115,7 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
|
|
|
108
115
|
const argIndex = ctx.argIndex ?? 0;
|
|
109
116
|
const subRecordKey = ctx.subRecordKey ?? argIndex.toString();
|
|
110
117
|
const ruleFragment = currentFragment(ctx);
|
|
118
|
+
// v8 ignore else -- type narrowing only
|
|
111
119
|
if (ruleFragment.type === "record") ruleFragment.children[subRecordKey] = {
|
|
112
120
|
type: "string",
|
|
113
121
|
value: subRecordValue,
|
|
@@ -121,12 +129,15 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
|
|
|
121
129
|
delete ctx.argIndex;
|
|
122
130
|
const callFrag = currentFragment(ctx);
|
|
123
131
|
ctx.stack.pop();
|
|
132
|
+
// v8 ignore else -- type narrowing only
|
|
124
133
|
if (callFrag.type === "record" && tree.type === "wrapped-tree") {
|
|
125
134
|
callFrag.value = extractTreeValue(ctx.source, tree, callFrag.offset);
|
|
126
135
|
const parentRecord = currentFragment(ctx);
|
|
136
|
+
// v8 ignore else -- type narrowing only
|
|
127
137
|
if (parentRecord.type === "record" && ctx.recordKey) {
|
|
128
138
|
const key = ctx.recordKey;
|
|
129
139
|
const array = parentRecord.children[key];
|
|
140
|
+
// v8 ignore else -- type narrowing only
|
|
130
141
|
if (array.type === "array") array.children.push(callFrag);
|
|
131
142
|
}
|
|
132
143
|
}
|
|
@@ -135,9 +146,11 @@ const kwParams = query.sym((ctx, { value: recordKey }) => {
|
|
|
135
146
|
})),
|
|
136
147
|
postHandler: (ctx, tree) => {
|
|
137
148
|
const parentRecord = currentFragment(ctx);
|
|
149
|
+
// v8 ignore else -- type narrowing only
|
|
138
150
|
if (parentRecord.type === "record" && ctx.recordKey && tree.type === "wrapped-tree") {
|
|
139
151
|
const key = ctx.recordKey;
|
|
140
152
|
const array = parentRecord.children[key];
|
|
153
|
+
// v8 ignore else -- type narrowing only
|
|
141
154
|
if (array.type === "array") array.value = extractTreeValue(ctx.source, tree, array.offset);
|
|
142
155
|
}
|
|
143
156
|
return ctx;
|
|
@@ -160,6 +173,7 @@ function ruleCall(search) {
|
|
|
160
173
|
search,
|
|
161
174
|
postHandler: (ctx, tree) => {
|
|
162
175
|
const frag = currentFragment(ctx);
|
|
176
|
+
// v8 ignore else -- type narrowing only
|
|
163
177
|
if (frag.type === "record" && tree.type === "wrapped-tree") {
|
|
164
178
|
frag.value = extractTreeValue(ctx.source, tree, frag.offset);
|
|
165
179
|
ctx.stack.pop();
|
|
@@ -180,6 +194,7 @@ function recordStartHandler(ctx, { offset }) {
|
|
|
180
194
|
}
|
|
181
195
|
function ruleNameHandler(ctx, { value, offset }) {
|
|
182
196
|
const ruleFragment = currentFragment(ctx);
|
|
197
|
+
// v8 ignore else -- type narrowing only
|
|
183
198
|
if (ruleFragment.type === "record") ruleFragment.children.rule = {
|
|
184
199
|
type: "string",
|
|
185
200
|
value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","names":["q","query","memCache.get"],"sources":["../../../../lib/modules/manager/bazel/parser.ts"],"sourcesContent":["import type { lexer, parser } from '@renovatebot/good-enough-parser';\nimport { lang, query as q } from '@renovatebot/good-enough-parser';\nimport { logger } from '../../../logger/index.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { hash } from '../../../util/hash.ts';\nimport { supportedRulesRegex } from './rules/index.ts';\nimport type { NestedFragment, RecordFragment } from './types.ts';\n\ninterface Ctx {\n readonly source: string;\n results: RecordFragment[];\n stack: NestedFragment[];\n recordKey?: string;\n subRecordKey?: string;\n argIndex?: number;\n}\n\nfunction emptyCtx(source: string): Ctx {\n return {\n source,\n results: [],\n stack: [],\n };\n}\n\nfunction currentFragment(ctx: Ctx): NestedFragment {\n const deepestFragment = ctx.stack.at(-1)!;\n return deepestFragment;\n}\n\nfunction extractTreeValue(\n source: string,\n tree: parser.Tree,\n offset: number,\n): string {\n if (tree.type === 'wrapped-tree') {\n const { endsWith } = tree;\n const to = endsWith.offset + endsWith.value.length;\n return source.slice(offset, to);\n }\n\n // istanbul ignore next\n return '';\n}\n\n/**\n * Matches key-value pairs:\n * - `tag = \"1.2.3\"`\n * - `name = \"foobar\"`\n * - `deps = [\"foo\", \"bar\"]`\n * - `\n * artifacts = [\n maven.artifact(\n group = \"com.example1\",\n artifact = \"foobar\",\n version = \"1.2.3\",\n )\n ]\n `\n **/\nconst kwParams = q\n .sym<Ctx>((ctx, { value: recordKey }) => {\n return { ...ctx, recordKey };\n })\n .op('=')\n .alt(\n // string\n q.str((ctx, { offset, value }) => {\n const frag = currentFragment(ctx);\n if (frag.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n frag.children[key] = { type: 'string', value, offset };\n }\n return ctx;\n }),\n // array of strings or calls\n q.tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n startsWith: '[',\n endsWith: ']',\n preHandler: (ctx, tree) => {\n const parentRecord = currentFragment(ctx) as RecordFragment;\n if (\n parentRecord.type === 'record' &&\n ctx.recordKey &&\n tree.type === 'wrapped-tree'\n ) {\n const key = ctx.recordKey;\n parentRecord.children[key] = {\n type: 'array',\n value: '',\n offset: tree.startsWith.offset,\n children: [],\n };\n }\n return ctx;\n },\n search: q.alt(\n q.str<Ctx>((ctx, { value, offset }) => {\n const parentRecord = currentFragment(ctx);\n if (parentRecord.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n if (array.type === 'array') {\n array.children.push({ type: 'string', value, offset });\n }\n }\n return ctx;\n }),\n q\n .sym<Ctx>()\n .handler(recordStartHandler)\n .handler((ctx, { value, offset }) => {\n const ruleFragment = currentFragment(ctx);\n if (ruleFragment.type === 'record') {\n ruleFragment.children._function = {\n type: 'string',\n value,\n offset,\n };\n }\n return ctx;\n })\n .many(\n q.op<Ctx>('.').sym((ctx, { value }) => {\n const ruleFragment = currentFragment(ctx);\n if (\n ruleFragment.type === 'record' &&\n ruleFragment.children._function\n ) {\n ruleFragment.children._function.value += `.${value}`;\n }\n return ctx;\n }),\n 0,\n 3,\n )\n .tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n startsWith: '(',\n endsWith: ')',\n search: q\n .opt(\n q\n .sym<Ctx>((ctx, { value: subRecordKey }) => ({\n ...ctx,\n subRecordKey,\n }))\n .op('='),\n )\n .str((ctx, { value: subRecordValue, offset }) => {\n const argIndex = ctx.argIndex ?? 0;\n\n const subRecordKey = ctx.subRecordKey! ?? argIndex.toString();\n const ruleFragment = currentFragment(ctx);\n if (ruleFragment.type === 'record') {\n ruleFragment.children[subRecordKey] = {\n type: 'string',\n value: subRecordValue,\n offset,\n };\n }\n delete ctx.subRecordKey;\n ctx.argIndex = argIndex + 1;\n return ctx;\n }),\n postHandler: (ctx, tree) => {\n delete ctx.argIndex;\n\n const callFrag = currentFragment(ctx);\n ctx.stack.pop();\n if (callFrag.type === 'record' && tree.type === 'wrapped-tree') {\n callFrag.value = extractTreeValue(\n ctx.source,\n tree,\n callFrag.offset,\n );\n\n const parentRecord = currentFragment(ctx);\n if (parentRecord.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n if (array.type === 'array') {\n array.children.push(callFrag);\n }\n }\n }\n return ctx;\n },\n }),\n ),\n postHandler: (ctx, tree) => {\n const parentRecord = currentFragment(ctx);\n if (\n parentRecord.type === 'record' &&\n ctx.recordKey &&\n tree.type === 'wrapped-tree'\n ) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n if (array.type === 'array') {\n array.value = extractTreeValue(ctx.source, tree, array.offset);\n }\n }\n return ctx;\n },\n }),\n )\n .handler((ctx) => {\n delete ctx.recordKey;\n return ctx;\n });\n\n/**\n * Matches rule signature:\n * `git_repository(......)`\n * ^^^^^^^^\n *\n * @param search something to match inside parens\n */\nfunction ruleCall(\n search: q.QueryBuilder<Ctx, parser.Node>,\n): q.QueryBuilder<Ctx, parser.Node> {\n return q.tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n search,\n postHandler: (ctx, tree) => {\n const frag = currentFragment(ctx);\n if (frag.type === 'record' && tree.type === 'wrapped-tree') {\n frag.value = extractTreeValue(ctx.source, tree, frag.offset);\n ctx.stack.pop();\n ctx.results.push(frag);\n }\n\n return ctx;\n },\n });\n}\n\nfunction recordStartHandler(ctx: Ctx, { offset }: lexer.Token): Ctx {\n ctx.stack.push({\n type: 'record',\n value: '',\n offset,\n children: {},\n });\n return ctx;\n}\n\nfunction ruleNameHandler(ctx: Ctx, { value, offset }: lexer.Token): Ctx {\n const ruleFragment = currentFragment(ctx);\n if (ruleFragment.type === 'record') {\n ruleFragment.children.rule = { type: 'string', value, offset };\n }\n\n return ctx;\n}\n\n/**\n * Matches regular rules:\n * - `git_repository(...)`\n * - `_go_repository(...)`\n */\nconst regularRule = q\n .sym<Ctx>(supportedRulesRegex, (ctx, token) =>\n ruleNameHandler(recordStartHandler(ctx, token), token),\n )\n .join(ruleCall(kwParams));\n\n/**\n * Matches \"maybe\"-form rules:\n * - `maybe(git_repository, ...)`\n * - `maybe(_go_repository, ...)`\n */\nconst maybeRule = q\n .sym<Ctx>('maybe', recordStartHandler)\n .join(\n ruleCall(\n q.alt(\n q.begin<Ctx>().sym(supportedRulesRegex, ruleNameHandler).op(','),\n kwParams,\n ),\n ),\n );\n\nconst rule = q.alt<Ctx>(maybeRule, regularRule);\n\nconst query = q.tree<Ctx>({\n type: 'root-tree',\n maxDepth: 16,\n search: rule,\n});\n\nfunction getCacheKey(input: string): string {\n const hashedInput = hash(input);\n return `bazel-parser-${hashedInput}`;\n}\n\nconst starlark = lang.createLang('starlark');\n\nexport function parse(\n input: string,\n packageFile?: string,\n): RecordFragment[] | null {\n const cacheKey = getCacheKey(input);\n\n const cachedResult = memCache.get<RecordFragment[] | null>(cacheKey);\n // istanbul ignore if\n if (cachedResult === null || cachedResult) {\n return cachedResult;\n }\n\n let result: RecordFragment[] | null = null;\n try {\n const parsedResult = starlark.query(input, query, emptyCtx(input));\n if (parsedResult) {\n result = parsedResult.results;\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err, packageFile }, 'Bazel parsing error');\n }\n\n memCache.set(cacheKey, result);\n return result;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parser.js","names":["q","query","memCache.get"],"sources":["../../../../lib/modules/manager/bazel/parser.ts"],"sourcesContent":["import type { lexer, parser } from '@renovatebot/good-enough-parser';\nimport { lang, query as q } from '@renovatebot/good-enough-parser';\nimport { logger } from '../../../logger/index.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { hash } from '../../../util/hash.ts';\nimport { supportedRulesRegex } from './rules/index.ts';\nimport type { NestedFragment, RecordFragment } from './types.ts';\n\ninterface Ctx {\n readonly source: string;\n results: RecordFragment[];\n stack: NestedFragment[];\n recordKey?: string;\n subRecordKey?: string;\n argIndex?: number;\n}\n\nfunction emptyCtx(source: string): Ctx {\n return {\n source,\n results: [],\n stack: [],\n };\n}\n\nfunction currentFragment(ctx: Ctx): NestedFragment {\n const deepestFragment = ctx.stack.at(-1)!;\n return deepestFragment;\n}\n\nfunction extractTreeValue(\n source: string,\n tree: parser.Tree,\n offset: number,\n): string {\n // v8 ignore else -- type narrowing only\n if (tree.type === 'wrapped-tree') {\n const { endsWith } = tree;\n const to = endsWith.offset + endsWith.value.length;\n return source.slice(offset, to);\n }\n\n // istanbul ignore next\n return '';\n}\n\n/**\n * Matches key-value pairs:\n * - `tag = \"1.2.3\"`\n * - `name = \"foobar\"`\n * - `deps = [\"foo\", \"bar\"]`\n * - `\n * artifacts = [\n maven.artifact(\n group = \"com.example1\",\n artifact = \"foobar\",\n version = \"1.2.3\",\n )\n ]\n `\n **/\nconst kwParams = q\n .sym<Ctx>((ctx, { value: recordKey }) => {\n return { ...ctx, recordKey };\n })\n .op('=')\n .alt(\n // string\n q.str((ctx, { offset, value }) => {\n const frag = currentFragment(ctx);\n // v8 ignore else -- type narrowing only\n if (frag.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n frag.children[key] = { type: 'string', value, offset };\n }\n return ctx;\n }),\n // array of strings or calls\n q.tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n startsWith: '[',\n endsWith: ']',\n preHandler: (ctx, tree) => {\n const parentRecord = currentFragment(ctx) as RecordFragment;\n // v8 ignore else -- type narrowing only\n if (\n parentRecord.type === 'record' &&\n ctx.recordKey &&\n tree.type === 'wrapped-tree'\n ) {\n const key = ctx.recordKey;\n parentRecord.children[key] = {\n type: 'array',\n value: '',\n offset: tree.startsWith.offset,\n children: [],\n };\n }\n return ctx;\n },\n search: q.alt(\n q.str<Ctx>((ctx, { value, offset }) => {\n const parentRecord = currentFragment(ctx);\n // v8 ignore else -- type narrowing only\n if (parentRecord.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n // v8 ignore else -- type narrowing only\n if (array.type === 'array') {\n array.children.push({ type: 'string', value, offset });\n }\n }\n return ctx;\n }),\n q\n .sym<Ctx>()\n .handler(recordStartHandler)\n .handler((ctx, { value, offset }) => {\n const ruleFragment = currentFragment(ctx);\n // v8 ignore else -- type narrowing only\n if (ruleFragment.type === 'record') {\n ruleFragment.children._function = {\n type: 'string',\n value,\n offset,\n };\n }\n return ctx;\n })\n .many(\n q.op<Ctx>('.').sym((ctx, { value }) => {\n const ruleFragment = currentFragment(ctx);\n // v8 ignore else -- type narrowing only\n if (\n ruleFragment.type === 'record' &&\n ruleFragment.children._function\n ) {\n ruleFragment.children._function.value += `.${value}`;\n }\n return ctx;\n }),\n 0,\n 3,\n )\n .tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n startsWith: '(',\n endsWith: ')',\n search: q\n .opt(\n q\n .sym<Ctx>((ctx, { value: subRecordKey }) => ({\n ...ctx,\n subRecordKey,\n }))\n .op('='),\n )\n .str((ctx, { value: subRecordValue, offset }) => {\n const argIndex = ctx.argIndex ?? 0;\n\n const subRecordKey = ctx.subRecordKey! ?? argIndex.toString();\n const ruleFragment = currentFragment(ctx);\n // v8 ignore else -- type narrowing only\n if (ruleFragment.type === 'record') {\n ruleFragment.children[subRecordKey] = {\n type: 'string',\n value: subRecordValue,\n offset,\n };\n }\n delete ctx.subRecordKey;\n ctx.argIndex = argIndex + 1;\n return ctx;\n }),\n postHandler: (ctx, tree) => {\n delete ctx.argIndex;\n\n const callFrag = currentFragment(ctx);\n ctx.stack.pop();\n // v8 ignore else -- type narrowing only\n if (callFrag.type === 'record' && tree.type === 'wrapped-tree') {\n callFrag.value = extractTreeValue(\n ctx.source,\n tree,\n callFrag.offset,\n );\n\n const parentRecord = currentFragment(ctx);\n // v8 ignore else -- type narrowing only\n if (parentRecord.type === 'record' && ctx.recordKey) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n // v8 ignore else -- type narrowing only\n if (array.type === 'array') {\n array.children.push(callFrag);\n }\n }\n }\n return ctx;\n },\n }),\n ),\n postHandler: (ctx, tree) => {\n const parentRecord = currentFragment(ctx);\n // v8 ignore else -- type narrowing only\n if (\n parentRecord.type === 'record' &&\n ctx.recordKey &&\n tree.type === 'wrapped-tree'\n ) {\n const key = ctx.recordKey;\n const array = parentRecord.children[key];\n // v8 ignore else -- type narrowing only\n if (array.type === 'array') {\n array.value = extractTreeValue(ctx.source, tree, array.offset);\n }\n }\n return ctx;\n },\n }),\n )\n .handler((ctx) => {\n delete ctx.recordKey;\n return ctx;\n });\n\n/**\n * Matches rule signature:\n * `git_repository(......)`\n * ^^^^^^^^\n *\n * @param search something to match inside parens\n */\nfunction ruleCall(\n search: q.QueryBuilder<Ctx, parser.Node>,\n): q.QueryBuilder<Ctx, parser.Node> {\n return q.tree({\n type: 'wrapped-tree',\n maxDepth: 1,\n search,\n postHandler: (ctx, tree) => {\n const frag = currentFragment(ctx);\n // v8 ignore else -- type narrowing only\n if (frag.type === 'record' && tree.type === 'wrapped-tree') {\n frag.value = extractTreeValue(ctx.source, tree, frag.offset);\n ctx.stack.pop();\n ctx.results.push(frag);\n }\n\n return ctx;\n },\n });\n}\n\nfunction recordStartHandler(ctx: Ctx, { offset }: lexer.Token): Ctx {\n ctx.stack.push({\n type: 'record',\n value: '',\n offset,\n children: {},\n });\n return ctx;\n}\n\nfunction ruleNameHandler(ctx: Ctx, { value, offset }: lexer.Token): Ctx {\n const ruleFragment = currentFragment(ctx);\n // v8 ignore else -- type narrowing only\n if (ruleFragment.type === 'record') {\n ruleFragment.children.rule = { type: 'string', value, offset };\n }\n\n return ctx;\n}\n\n/**\n * Matches regular rules:\n * - `git_repository(...)`\n * - `_go_repository(...)`\n */\nconst regularRule = q\n .sym<Ctx>(supportedRulesRegex, (ctx, token) =>\n ruleNameHandler(recordStartHandler(ctx, token), token),\n )\n .join(ruleCall(kwParams));\n\n/**\n * Matches \"maybe\"-form rules:\n * - `maybe(git_repository, ...)`\n * - `maybe(_go_repository, ...)`\n */\nconst maybeRule = q\n .sym<Ctx>('maybe', recordStartHandler)\n .join(\n ruleCall(\n q.alt(\n q.begin<Ctx>().sym(supportedRulesRegex, ruleNameHandler).op(','),\n kwParams,\n ),\n ),\n );\n\nconst rule = q.alt<Ctx>(maybeRule, regularRule);\n\nconst query = q.tree<Ctx>({\n type: 'root-tree',\n maxDepth: 16,\n search: rule,\n});\n\nfunction getCacheKey(input: string): string {\n const hashedInput = hash(input);\n return `bazel-parser-${hashedInput}`;\n}\n\nconst starlark = lang.createLang('starlark');\n\nexport function parse(\n input: string,\n packageFile?: string,\n): RecordFragment[] | null {\n const cacheKey = getCacheKey(input);\n\n const cachedResult = memCache.get<RecordFragment[] | null>(cacheKey);\n // istanbul ignore if\n if (cachedResult === null || cachedResult) {\n return cachedResult;\n }\n\n let result: RecordFragment[] | null = null;\n try {\n const parsedResult = starlark.query(input, query, emptyCtx(input));\n if (parsedResult) {\n result = parsedResult.results;\n }\n } catch (err) /* istanbul ignore next */ {\n logger.debug({ err, packageFile }, 'Bazel parsing error');\n }\n\n memCache.set(cacheKey, result);\n return result;\n}\n"],"mappings":";;;;;;AAiBA,SAAS,SAAS,QAAqB;CACrC,OAAO;EACL;EACA,SAAS,CAAC;EACV,OAAO,CAAC;CACV;AACF;AAEA,SAAS,gBAAgB,KAA0B;CAEjD,OADwB,IAAI,MAAM,GAAG,EAChB;AACvB;AAEA,SAAS,iBACP,QACA,MACA,QACQ;;CAER,IAAI,KAAK,SAAS,gBAAgB;EAChC,MAAM,EAAE,aAAa;EACrB,MAAM,KAAK,SAAS,SAAS,SAAS,MAAM;EAC5C,OAAO,OAAO,MAAM,QAAQ,EAAE;CAChC;;CAGA,OAAO;AACT;;;;;;;;;;;;;;;;AAiBA,MAAM,WAAWA,MACd,KAAU,KAAK,EAAE,OAAO,gBAAgB;CACvC,OAAO;EAAE,GAAG;EAAK;CAAU;AAC7B,CAAC,CAAC,CACD,GAAG,GAAG,CAAC,CACP,IAECA,MAAE,KAAK,KAAK,EAAE,QAAQ,YAAY;CAChC,MAAM,OAAO,gBAAgB,GAAG;;CAEhC,IAAI,KAAK,SAAS,YAAY,IAAI,WAAW;EAC3C,MAAM,MAAM,IAAI;EAChB,KAAK,SAAS,OAAO;GAAE,MAAM;GAAU;GAAO;EAAO;CACvD;CACA,OAAO;AACT,CAAC,GAEDA,MAAE,KAAK;CACL,MAAM;CACN,UAAU;CACV,YAAY;CACZ,UAAU;CACV,aAAa,KAAK,SAAS;EACzB,MAAM,eAAe,gBAAgB,GAAG;;EAExC,IACE,aAAa,SAAS,YACtB,IAAI,aACJ,KAAK,SAAS,gBACd;GACA,MAAM,MAAM,IAAI;GAChB,aAAa,SAAS,OAAO;IAC3B,MAAM;IACN,OAAO;IACP,QAAQ,KAAK,WAAW;IACxB,UAAU,CAAC;GACb;EACF;EACA,OAAO;CACT;CACA,QAAQA,MAAE,IACRA,MAAE,KAAU,KAAK,EAAE,OAAO,aAAa;EACrC,MAAM,eAAe,gBAAgB,GAAG;;EAExC,IAAI,aAAa,SAAS,YAAY,IAAI,WAAW;GACnD,MAAM,MAAM,IAAI;GAChB,MAAM,QAAQ,aAAa,SAAS;;GAEpC,IAAI,MAAM,SAAS,SACjB,MAAM,SAAS,KAAK;IAAE,MAAM;IAAU;IAAO;GAAO,CAAC;EAEzD;EACA,OAAO;CACT,CAAC,GACDA,MACG,IAAS,CAAC,CACV,QAAQ,kBAAkB,CAAC,CAC3B,SAAS,KAAK,EAAE,OAAO,aAAa;EACnC,MAAM,eAAe,gBAAgB,GAAG;;EAExC,IAAI,aAAa,SAAS,UACxB,aAAa,SAAS,YAAY;GAChC,MAAM;GACN;GACA;EACF;EAEF,OAAO;CACT,CAAC,CAAC,CACD,KACCA,MAAE,GAAQ,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,YAAY;EACrC,MAAM,eAAe,gBAAgB,GAAG;;EAExC,IACE,aAAa,SAAS,YACtB,aAAa,SAAS,WAEtB,aAAa,SAAS,UAAU,SAAS,IAAI;EAE/C,OAAO;CACT,CAAC,GACD,GACA,CACF,CAAC,CACA,KAAK;EACJ,MAAM;EACN,UAAU;EACV,YAAY;EACZ,UAAU;EACV,QAAQA,MACL,IACCA,MACG,KAAU,KAAK,EAAE,OAAO,oBAAoB;GAC3C,GAAG;GACH;EACF,EAAE,CAAC,CACF,GAAG,GAAG,CACX,CAAC,CACA,KAAK,KAAK,EAAE,OAAO,gBAAgB,aAAa;GAC/C,MAAM,WAAW,IAAI,YAAY;GAEjC,MAAM,eAAe,IAAI,gBAAiB,SAAS,SAAS;GAC5D,MAAM,eAAe,gBAAgB,GAAG;;GAExC,IAAI,aAAa,SAAS,UACxB,aAAa,SAAS,gBAAgB;IACpC,MAAM;IACN,OAAO;IACP;GACF;GAEF,OAAO,IAAI;GACX,IAAI,WAAW,WAAW;GAC1B,OAAO;EACT,CAAC;EACH,cAAc,KAAK,SAAS;GAC1B,OAAO,IAAI;GAEX,MAAM,WAAW,gBAAgB,GAAG;GACpC,IAAI,MAAM,IAAI;;GAEd,IAAI,SAAS,SAAS,YAAY,KAAK,SAAS,gBAAgB;IAC9D,SAAS,QAAQ,iBACf,IAAI,QACJ,MACA,SAAS,MACX;IAEA,MAAM,eAAe,gBAAgB,GAAG;;IAExC,IAAI,aAAa,SAAS,YAAY,IAAI,WAAW;KACnD,MAAM,MAAM,IAAI;KAChB,MAAM,QAAQ,aAAa,SAAS;;KAEpC,IAAI,MAAM,SAAS,SACjB,MAAM,SAAS,KAAK,QAAQ;IAEhC;GACF;GACA,OAAO;EACT;CACF,CAAC,CACL;CACA,cAAc,KAAK,SAAS;EAC1B,MAAM,eAAe,gBAAgB,GAAG;;EAExC,IACE,aAAa,SAAS,YACtB,IAAI,aACJ,KAAK,SAAS,gBACd;GACA,MAAM,MAAM,IAAI;GAChB,MAAM,QAAQ,aAAa,SAAS;;GAEpC,IAAI,MAAM,SAAS,SACjB,MAAM,QAAQ,iBAAiB,IAAI,QAAQ,MAAM,MAAM,MAAM;EAEjE;EACA,OAAO;CACT;AACF,CAAC,CACH,CAAC,CACA,SAAS,QAAQ;CAChB,OAAO,IAAI;CACX,OAAO;AACT,CAAC;;;;;;;;AASH,SAAS,SACP,QACkC;CAClC,OAAOA,MAAE,KAAK;EACZ,MAAM;EACN,UAAU;EACV;EACA,cAAc,KAAK,SAAS;GAC1B,MAAM,OAAO,gBAAgB,GAAG;;GAEhC,IAAI,KAAK,SAAS,YAAY,KAAK,SAAS,gBAAgB;IAC1D,KAAK,QAAQ,iBAAiB,IAAI,QAAQ,MAAM,KAAK,MAAM;IAC3D,IAAI,MAAM,IAAI;IACd,IAAI,QAAQ,KAAK,IAAI;GACvB;GAEA,OAAO;EACT;CACF,CAAC;AACH;AAEA,SAAS,mBAAmB,KAAU,EAAE,UAA4B;CAClE,IAAI,MAAM,KAAK;EACb,MAAM;EACN,OAAO;EACP;EACA,UAAU,CAAC;CACb,CAAC;CACD,OAAO;AACT;AAEA,SAAS,gBAAgB,KAAU,EAAE,OAAO,UAA4B;CACtE,MAAM,eAAe,gBAAgB,GAAG;;CAExC,IAAI,aAAa,SAAS,UACxB,aAAa,SAAS,OAAO;EAAE,MAAM;EAAU;EAAO;CAAO;CAG/D,OAAO;AACT;;;;;;AAOA,MAAM,cAAcA,MACjB,IAAS,sBAAsB,KAAK,UACnC,gBAAgB,mBAAmB,KAAK,KAAK,GAAG,KAAK,CACvD,CAAC,CACA,KAAK,SAAS,QAAQ,CAAC;;;;;;AAO1B,MAAM,YAAYA,MACf,IAAS,SAAS,kBAAkB,CAAC,CACrC,KACC,SACEA,MAAE,IACAA,MAAE,MAAW,CAAC,CAAC,IAAI,qBAAqB,eAAe,CAAC,CAAC,GAAG,GAAG,GAC/D,QACF,CACF,CACF;AAEF,MAAM,OAAOA,MAAE,IAAS,WAAW,WAAW;AAE9C,MAAMC,UAAQD,MAAE,KAAU;CACxB,MAAM;CACN,UAAU;CACV,QAAQ;AACV,CAAC;AAED,SAAS,YAAY,OAAuB;CAE1C,OAAO,gBADa,KAAK,KACQ;AACnC;AAEA,MAAM,WAAW,KAAK,WAAW,UAAU;AAE3C,SAAgB,MACd,OACA,aACyB;CACzB,MAAM,WAAW,YAAY,KAAK;CAElC,MAAM,eAAeE,IAAsC,QAAQ;;CAEnE,IAAI,iBAAiB,QAAQ,cAC3B,OAAO;CAGT,IAAI,SAAkC;CACtC,IAAI;EACF,MAAM,eAAe,SAAS,MAAM,OAAOD,SAAO,SAAS,KAAK,CAAC;EACjE,IAAI,cACF,SAAS,aAAa;CAE1B,SAAS,gCAAgC;EACvC,OAAO,MAAM;GAAE;GAAK;EAAY,GAAG,qBAAqB;CAC1D;CAEA,IAAa,UAAU,MAAM;CAC7B,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","names":[],"sources":["../../../../../lib/modules/manager/bazel/rules/http.ts"],"sourcesContent":["import { isString, isTruthy } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { regEx } from '../../../../util/regex.ts';\nimport { parseUrl } from '../../../../util/url.ts';\nimport { GithubReleasesDatasource } from '../../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../../datasource/github-tags/index.ts';\nimport { GitlabReleasesDatasource } from '../../../datasource/gitlab-releases/index.ts';\nimport { GitlabTagsDatasource } from '../../../datasource/gitlab-tags/index.ts';\nimport type { PackageDependency } from '../../types.ts';\n\n// Source: https://bazel.build/rules/lib/repo/http\nconst archives = [\n '.zip',\n '.tar',\n '.jar',\n '.war',\n '.aar',\n '.ar',\n '.deb',\n\n '.gz',\n '.tar.gz',\n '.tgz',\n\n '.bz2',\n '.tar.bz2',\n '.tbz2',\n\n '.xz',\n '.tar.xz',\n '.txz',\n\n '.zst',\n '.tar.zst',\n '.tzst',\n];\n\nconst archiveSuffixRegex = regEx(\n `(?:${archives.map((archive) => RegExp.escape(archive)).join('|')})$`,\n);\n\nfunction stripArchiveSuffix(value: string): string {\n return value.replace(archiveSuffixRegex, '');\n}\n\nfunction isHash(value: unknown): value is string {\n return isString(value) && regEx(/[0-9a-z]{40}/i).test(value);\n}\n\nexport function parseGithubPath(\n pathname: string,\n): Partial<PackageDependency> | null {\n const [p0, p1, p2, p3, p4, p5] = pathname.split('/').slice(1);\n const packageName = `${p0}/${p1}`;\n let datasource = '';\n let value: string | null = null;\n if (p2 === 'releases' && p3 === 'download') {\n datasource = GithubReleasesDatasource.id;\n value = p4;\n } else if (p2 === 'archive' && p3 === 'refs' && p4 === 'tags') {\n // https://github.com/foo/bar/archive/refs/tags/v1.2.3.tar.gz\n datasource = GithubTagsDatasource.id;\n value = p5;\n } else if (p2 === 'archive') {\n // https://github.com/foo/bar/archive/1.2.3.tar.gz\n datasource = GithubTagsDatasource.id;\n value = p3;\n }\n\n if (!value) {\n return null;\n }\n\n value = stripArchiveSuffix(value);\n return isHash(value)\n ? { datasource, packageName, currentDigest: value }\n : { datasource, packageName, currentValue: value };\n}\n\nfunction parseGitlabPath(pathname: string): Partial<PackageDependency> | null {\n // https://gitlab.com/libeigen/eigen/-/archive/3.3.5/eigen-3.3.5.zip\n // https://gitlab.com/libeigen/eigen/-/archive/90ee821c563fa20db4d64d6991ddca256d5c52f2/eigen-90ee821c563fa20db4d64d6991ddca256d5c52f2.tar.gz\n const [p0, p1, p2, p3, p4] = pathname.split('/').slice(1);\n const packageName = `${p0}/${p1}`;\n if (p2 === '-' && p3 === 'archive' && p4) {\n return isHash(p4)\n ? {\n datasource: GitlabTagsDatasource.id,\n packageName,\n currentDigest: p4,\n }\n : {\n datasource: GitlabReleasesDatasource.id,\n packageName,\n currentValue: p4,\n };\n }\n return null;\n}\n\nexport function parseArchiveUrl(\n urlString: string | undefined | null,\n): Partial<PackageDependency> | null {\n if (!urlString) {\n return null;\n }\n\n const url = parseUrl(urlString);\n\n if (url?.host === 'github.com') {\n return parseGithubPath(url.pathname);\n }\n\n if (url?.host === 'gitlab.com') {\n return parseGitlabPath(url.pathname);\n }\n\n return null;\n}\n\nexport const httpRules = [\n 'http_archive',\n '_http_archive',\n 'http_file',\n '_http_file',\n] as const;\n\nexport const HttpTarget = z\n .object({\n rule: z.enum(httpRules),\n name: z.string(),\n url: z.string().optional(),\n urls: z.array(z.string()).optional(),\n sha256: z.string(),\n })\n .refine(({ url, urls }) => !!url || !!urls)\n .transform(({ rule, name, url, urls = [] }): PackageDependency[] => {\n const parsedUrl = [url, ...urls].map(parseArchiveUrl).find(isTruthy);\n if (!parsedUrl) {\n return [];\n }\n\n const dep: PackageDependency = {\n datasource: parsedUrl.datasource,\n depType: rule,\n depName: name,\n packageName: parsedUrl.packageName,\n };\n\n // We don't want to set both `currentValue` and `currentDigest`.\n //\n // What we want is to provide the first occurrence of `currentValue`,\n // or, if it's not available, `currentDigest`.\n //\n // Auto-replace mechanism will replace this first occurrence,\n // and artifact update function will do the rest.\n //\n // Hence, `if-else-if` is being used here.\n if (parsedUrl.currentValue) {\n dep.currentValue = parsedUrl.currentValue;\n } else if (parsedUrl.currentDigest) {\n dep.currentDigest = parsedUrl.currentDigest;\n }\n\n return [dep];\n });\n"],"mappings":";;;;;;;;;AAqCA,MAAM,qBAAqB,MACzB,MAAM;CA1BN;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;AAIa,CAAC,CAAC,KAAK,YAAY,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,GACpE;AAEA,SAAS,mBAAmB,OAAuB;CACjD,OAAO,MAAM,QAAQ,oBAAoB,EAAE;AAC7C;AAEA,SAAS,OAAO,OAAiC;CAC/C,OAAO,SAAS,KAAK,KAAK,MAAM,eAAe,CAAC,CAAC,KAAK,KAAK;AAC7D;AAEA,SAAgB,gBACd,UACmC;CACnC,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;CAC5D,MAAM,cAAc,GAAG,GAAG,GAAG;CAC7B,IAAI,aAAa;CACjB,IAAI,QAAuB;CAC3B,IAAI,OAAO,cAAc,OAAO,YAAY;EAC1C,aAAa,yBAAyB;EACtC,QAAQ;CACV,OAAO,IAAI,OAAO,aAAa,OAAO,UAAU,OAAO,QAAQ;EAE7D,aAAa,qBAAqB;EAClC,QAAQ;CACV,OAAO,IAAI,OAAO,WAAW;EAE3B,aAAa,qBAAqB;EAClC,QAAQ;CACV;CAEA,IAAI,CAAC,OACH,OAAO;CAGT,QAAQ,mBAAmB,KAAK;CAChC,OAAO,OAAO,KAAK,IACf;EAAE;EAAY;EAAa,eAAe;CAAM,IAChD;EAAE;EAAY;EAAa,cAAc;CAAM;AACrD;AAEA,SAAS,gBAAgB,UAAqD;CAG5E,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;CACxD,MAAM,cAAc,GAAG,GAAG,GAAG;CAC7B,IAAI,OAAO,OAAO,OAAO,aAAa,IACpC,OAAO,OAAO,EAAE,IACZ;EACE,YAAY,qBAAqB;EACjC;EACA,eAAe;CACjB,IACA;EACE,YAAY,yBAAyB;EACrC;EACA,cAAc;CAChB;CAEN,OAAO;AACT;AAEA,SAAgB,gBACd,WACmC;CACnC,IAAI,CAAC,WACH,OAAO;CAGT,MAAM,MAAM,SAAS,SAAS;CAE9B,IAAI,KAAK,SAAS,cAChB,OAAO,gBAAgB,IAAI,QAAQ;CAGrC,IAAI,KAAK,SAAS,cAChB,OAAO,gBAAgB,IAAI,QAAQ;CAGrC,OAAO;AACT;AAEA,MAAa,YAAY;CACvB;CACA;CACA;CACA;AACF;AAEA,MAAa,aAAa,EACvB,OAAO;CACN,MAAM,EAAE,KAAK,SAAS;CACtB,MAAM,EAAE,OAAO;CACf,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;CACzB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CACnC,QAAQ,EAAE,OAAO;AACnB,CAAC,CAAC,CACD,QAAQ,EAAE,KAAK,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAC1C,WAAW,EAAE,MAAM,MAAM,KAAK,OAAO,CAAC,QAA6B;CAClE,MAAM,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,KAAK,QAAQ;CACnE,IAAI,CAAC,WACH,OAAO,CAAC;CAGV,MAAM,MAAyB;EAC7B,YAAY,UAAU;EACtB,SAAS;EACT,SAAS;EACT,aAAa,UAAU;CACzB;CAWA,IAAI,UAAU,cACZ,IAAI,eAAe,UAAU;
|
|
1
|
+
{"version":3,"file":"http.js","names":[],"sources":["../../../../../lib/modules/manager/bazel/rules/http.ts"],"sourcesContent":["import { isString, isTruthy } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { regEx } from '../../../../util/regex.ts';\nimport { parseUrl } from '../../../../util/url.ts';\nimport { GithubReleasesDatasource } from '../../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../../datasource/github-tags/index.ts';\nimport { GitlabReleasesDatasource } from '../../../datasource/gitlab-releases/index.ts';\nimport { GitlabTagsDatasource } from '../../../datasource/gitlab-tags/index.ts';\nimport type { PackageDependency } from '../../types.ts';\n\n// Source: https://bazel.build/rules/lib/repo/http\nconst archives = [\n '.zip',\n '.tar',\n '.jar',\n '.war',\n '.aar',\n '.ar',\n '.deb',\n\n '.gz',\n '.tar.gz',\n '.tgz',\n\n '.bz2',\n '.tar.bz2',\n '.tbz2',\n\n '.xz',\n '.tar.xz',\n '.txz',\n\n '.zst',\n '.tar.zst',\n '.tzst',\n];\n\nconst archiveSuffixRegex = regEx(\n `(?:${archives.map((archive) => RegExp.escape(archive)).join('|')})$`,\n);\n\nfunction stripArchiveSuffix(value: string): string {\n return value.replace(archiveSuffixRegex, '');\n}\n\nfunction isHash(value: unknown): value is string {\n return isString(value) && regEx(/[0-9a-z]{40}/i).test(value);\n}\n\nexport function parseGithubPath(\n pathname: string,\n): Partial<PackageDependency> | null {\n const [p0, p1, p2, p3, p4, p5] = pathname.split('/').slice(1);\n const packageName = `${p0}/${p1}`;\n let datasource = '';\n let value: string | null = null;\n if (p2 === 'releases' && p3 === 'download') {\n datasource = GithubReleasesDatasource.id;\n value = p4;\n } else if (p2 === 'archive' && p3 === 'refs' && p4 === 'tags') {\n // https://github.com/foo/bar/archive/refs/tags/v1.2.3.tar.gz\n datasource = GithubTagsDatasource.id;\n value = p5;\n } else if (p2 === 'archive') {\n // https://github.com/foo/bar/archive/1.2.3.tar.gz\n datasource = GithubTagsDatasource.id;\n value = p3;\n }\n\n if (!value) {\n return null;\n }\n\n value = stripArchiveSuffix(value);\n return isHash(value)\n ? { datasource, packageName, currentDigest: value }\n : { datasource, packageName, currentValue: value };\n}\n\nfunction parseGitlabPath(pathname: string): Partial<PackageDependency> | null {\n // https://gitlab.com/libeigen/eigen/-/archive/3.3.5/eigen-3.3.5.zip\n // https://gitlab.com/libeigen/eigen/-/archive/90ee821c563fa20db4d64d6991ddca256d5c52f2/eigen-90ee821c563fa20db4d64d6991ddca256d5c52f2.tar.gz\n const [p0, p1, p2, p3, p4] = pathname.split('/').slice(1);\n const packageName = `${p0}/${p1}`;\n if (p2 === '-' && p3 === 'archive' && p4) {\n return isHash(p4)\n ? {\n datasource: GitlabTagsDatasource.id,\n packageName,\n currentDigest: p4,\n }\n : {\n datasource: GitlabReleasesDatasource.id,\n packageName,\n currentValue: p4,\n };\n }\n return null;\n}\n\nexport function parseArchiveUrl(\n urlString: string | undefined | null,\n): Partial<PackageDependency> | null {\n if (!urlString) {\n return null;\n }\n\n const url = parseUrl(urlString);\n\n if (url?.host === 'github.com') {\n return parseGithubPath(url.pathname);\n }\n\n if (url?.host === 'gitlab.com') {\n return parseGitlabPath(url.pathname);\n }\n\n return null;\n}\n\nexport const httpRules = [\n 'http_archive',\n '_http_archive',\n 'http_file',\n '_http_file',\n] as const;\n\nexport const HttpTarget = z\n .object({\n rule: z.enum(httpRules),\n name: z.string(),\n url: z.string().optional(),\n urls: z.array(z.string()).optional(),\n sha256: z.string(),\n })\n .refine(({ url, urls }) => !!url || !!urls)\n .transform(({ rule, name, url, urls = [] }): PackageDependency[] => {\n const parsedUrl = [url, ...urls].map(parseArchiveUrl).find(isTruthy);\n if (!parsedUrl) {\n return [];\n }\n\n const dep: PackageDependency = {\n datasource: parsedUrl.datasource,\n depType: rule,\n depName: name,\n packageName: parsedUrl.packageName,\n };\n\n // We don't want to set both `currentValue` and `currentDigest`.\n //\n // What we want is to provide the first occurrence of `currentValue`,\n // or, if it's not available, `currentDigest`.\n //\n // Auto-replace mechanism will replace this first occurrence,\n // and artifact update function will do the rest.\n //\n // Hence, `if-else-if` is being used here.\n if (parsedUrl.currentValue) {\n dep.currentValue = parsedUrl.currentValue;\n // NOTE: a url with neither a value nor a digest never gets this far. A\n // coverage-ignore hint cannot suppress the implicit else on an `else if`.\n } else if (parsedUrl.currentDigest) {\n dep.currentDigest = parsedUrl.currentDigest;\n }\n\n return [dep];\n });\n"],"mappings":";;;;;;;;;AAqCA,MAAM,qBAAqB,MACzB,MAAM;CA1BN;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;AAIa,CAAC,CAAC,KAAK,YAAY,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,GACpE;AAEA,SAAS,mBAAmB,OAAuB;CACjD,OAAO,MAAM,QAAQ,oBAAoB,EAAE;AAC7C;AAEA,SAAS,OAAO,OAAiC;CAC/C,OAAO,SAAS,KAAK,KAAK,MAAM,eAAe,CAAC,CAAC,KAAK,KAAK;AAC7D;AAEA,SAAgB,gBACd,UACmC;CACnC,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;CAC5D,MAAM,cAAc,GAAG,GAAG,GAAG;CAC7B,IAAI,aAAa;CACjB,IAAI,QAAuB;CAC3B,IAAI,OAAO,cAAc,OAAO,YAAY;EAC1C,aAAa,yBAAyB;EACtC,QAAQ;CACV,OAAO,IAAI,OAAO,aAAa,OAAO,UAAU,OAAO,QAAQ;EAE7D,aAAa,qBAAqB;EAClC,QAAQ;CACV,OAAO,IAAI,OAAO,WAAW;EAE3B,aAAa,qBAAqB;EAClC,QAAQ;CACV;CAEA,IAAI,CAAC,OACH,OAAO;CAGT,QAAQ,mBAAmB,KAAK;CAChC,OAAO,OAAO,KAAK,IACf;EAAE;EAAY;EAAa,eAAe;CAAM,IAChD;EAAE;EAAY;EAAa,cAAc;CAAM;AACrD;AAEA,SAAS,gBAAgB,UAAqD;CAG5E,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;CACxD,MAAM,cAAc,GAAG,GAAG,GAAG;CAC7B,IAAI,OAAO,OAAO,OAAO,aAAa,IACpC,OAAO,OAAO,EAAE,IACZ;EACE,YAAY,qBAAqB;EACjC;EACA,eAAe;CACjB,IACA;EACE,YAAY,yBAAyB;EACrC;EACA,cAAc;CAChB;CAEN,OAAO;AACT;AAEA,SAAgB,gBACd,WACmC;CACnC,IAAI,CAAC,WACH,OAAO;CAGT,MAAM,MAAM,SAAS,SAAS;CAE9B,IAAI,KAAK,SAAS,cAChB,OAAO,gBAAgB,IAAI,QAAQ;CAGrC,IAAI,KAAK,SAAS,cAChB,OAAO,gBAAgB,IAAI,QAAQ;CAGrC,OAAO;AACT;AAEA,MAAa,YAAY;CACvB;CACA;CACA;CACA;AACF;AAEA,MAAa,aAAa,EACvB,OAAO;CACN,MAAM,EAAE,KAAK,SAAS;CACtB,MAAM,EAAE,OAAO;CACf,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;CACzB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CACnC,QAAQ,EAAE,OAAO;AACnB,CAAC,CAAC,CACD,QAAQ,EAAE,KAAK,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAC1C,WAAW,EAAE,MAAM,MAAM,KAAK,OAAO,CAAC,QAA6B;CAClE,MAAM,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,KAAK,QAAQ;CACnE,IAAI,CAAC,WACH,OAAO,CAAC;CAGV,MAAM,MAAyB;EAC7B,YAAY,UAAU;EACtB,SAAS;EACT,SAAS;EACT,aAAa,UAAU;CACzB;CAWA,IAAI,UAAU,cACZ,IAAI,eAAe,UAAU;MAGxB,IAAI,UAAU,eACnB,IAAI,gBAAgB,UAAU;CAGhC,OAAO,CAAC,GAAG;AACb,CAAC"}
|
|
@@ -24,6 +24,7 @@ async function getRubyConstraintFromFiles(packageFileName, newPackageFileContent
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
const lockFile = await getLockFilePath(packageFileName);
|
|
27
|
+
// v8 ignore else -- `getLockFilePath()` always returns a path
|
|
27
28
|
if (lockFile) {
|
|
28
29
|
const rubyVersion = (await readLocalFile(lockFile, "utf8"))?.match(regEx(/^ {3}ruby (?<version>\d[\d.]*)(?:[a-z]|\s|$)/m))?.groups?.version;
|
|
29
30
|
if (rubyVersion) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":[],"sources":["../../../../lib/modules/manager/bundler/common.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport {\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { UpdateArtifact } from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\n\nexport const delimiters = ['\"', \"'\"];\n\nexport function extractRubyVersion(txt: string): string | null {\n const rubyMatch = regEx(/^ruby\\s+(?<version>\"[^\"]+\"|'[^']+')\\s*$/gm).exec(\n txt,\n );\n if (!rubyMatch?.groups) {\n return null;\n }\n const quotedVersion = rubyMatch.groups.version;\n return quotedVersion.substring(1, quotedVersion.length - 1);\n}\n\nasync function getRubyConstraintFromFiles(\n packageFileName: string,\n newPackageFileContent: string,\n): Promise<string | null> {\n const rubyMatch = extractRubyVersion(newPackageFileContent);\n if (rubyMatch) {\n logger.debug('Using ruby version from gemfile');\n return rubyMatch;\n }\n for (const file of ['.ruby-version', '.tool-versions']) {\n const rubyVersion = (\n await readLocalFile(getSiblingFileName(packageFileName, file), 'utf8')\n )?.match(regEx(/^(?:ruby(?:-|\\s+))?(?<version>\\d[\\d.]*)/m))?.groups\n ?.version;\n if (rubyVersion) {\n logger.debug(`Using ruby version specified in ${file}`);\n return rubyVersion;\n }\n }\n const lockFile = await getLockFilePath(packageFileName);\n if (lockFile) {\n const rubyVersion = (await readLocalFile(lockFile, 'utf8'))?.match(\n regEx(/^ {3}ruby (?<version>\\d[\\d.]*)(?:[a-z]|\\s|$)/m),\n )?.groups?.version;\n if (rubyVersion) {\n logger.debug(`Using ruby version specified in lock file`);\n return rubyVersion;\n }\n }\n\n return null;\n}\n\nexport async function getRubyConstraint(\n updateArtifact: UpdateArtifact,\n): Promise<string | undefined> {\n const { packageFileName, config, newPackageFileContent } = updateArtifact;\n return await resolveToolConstraint(config, 'ruby', () =>\n getRubyConstraintFromFiles(packageFileName, newPackageFileContent),\n );\n}\n\nfunction getBundlerConstraintFromLockFile(\n existingLockFileContent: string,\n): string | null {\n const bundledWith = regEx(/\\nBUNDLED WITH\\n\\s+(?<version>.*?)(?:\\n|$)/).exec(\n existingLockFileContent,\n );\n if (bundledWith) {\n logger.debug('Using bundler version specified in lockfile');\n return bundledWith.groups!.version;\n }\n\n return null;\n}\n\nexport async function getBundlerConstraint(\n updateArtifact: Pick<UpdateArtifact, 'config'>,\n existingLockFileContent: string,\n): Promise<string | undefined> {\n const { config } = updateArtifact;\n return await resolveToolConstraint(config, 'bundler', () =>\n getBundlerConstraintFromLockFile(existingLockFileContent),\n );\n}\n\nexport async function getLockFilePath(\n packageFilePath: string,\n): Promise<string> {\n const lockFilePath = (await localPathExists(`${packageFilePath}.lock`))\n ? `${packageFilePath}.lock`\n : `Gemfile.lock`;\n logger.debug(`Lockfile for ${packageFilePath} found in ${lockFilePath}`);\n return lockFilePath;\n}\n"],"mappings":";;;;;AAUA,MAAa,aAAa,CAAC,MAAK,GAAG;AAEnC,SAAgB,mBAAmB,KAA4B;CAC7D,MAAM,YAAY,MAAM,2CAA2C,CAAC,CAAC,KACnE,GACF;CACA,IAAI,CAAC,WAAW,QACd,OAAO;CAET,MAAM,gBAAgB,UAAU,OAAO;CACvC,OAAO,cAAc,UAAU,GAAG,cAAc,SAAS,CAAC;AAC5D;AAEA,eAAe,2BACb,iBACA,uBACwB;CACxB,MAAM,YAAY,mBAAmB,qBAAqB;CAC1D,IAAI,WAAW;EACb,OAAO,MAAM,iCAAiC;EAC9C,OAAO;CACT;CACA,KAAK,MAAM,QAAQ,CAAC,iBAAiB,gBAAgB,GAAG;EACtD,MAAM,eACJ,MAAM,cAAc,mBAAmB,iBAAiB,IAAI,GAAG,MAAM,EAAA,EACpE,MAAM,MAAM,0CAA0C,CAAC,CAAC,EAAE,QACzD;EACJ,IAAI,aAAa;GACf,OAAO,MAAM,mCAAmC,MAAM;GACtD,OAAO;EACT;CACF;CACA,MAAM,WAAW,MAAM,gBAAgB,eAAe
|
|
1
|
+
{"version":3,"file":"common.js","names":[],"sources":["../../../../lib/modules/manager/bundler/common.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport {\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type { UpdateArtifact } from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\n\nexport const delimiters = ['\"', \"'\"];\n\nexport function extractRubyVersion(txt: string): string | null {\n const rubyMatch = regEx(/^ruby\\s+(?<version>\"[^\"]+\"|'[^']+')\\s*$/gm).exec(\n txt,\n );\n if (!rubyMatch?.groups) {\n return null;\n }\n const quotedVersion = rubyMatch.groups.version;\n return quotedVersion.substring(1, quotedVersion.length - 1);\n}\n\nasync function getRubyConstraintFromFiles(\n packageFileName: string,\n newPackageFileContent: string,\n): Promise<string | null> {\n const rubyMatch = extractRubyVersion(newPackageFileContent);\n if (rubyMatch) {\n logger.debug('Using ruby version from gemfile');\n return rubyMatch;\n }\n for (const file of ['.ruby-version', '.tool-versions']) {\n const rubyVersion = (\n await readLocalFile(getSiblingFileName(packageFileName, file), 'utf8')\n )?.match(regEx(/^(?:ruby(?:-|\\s+))?(?<version>\\d[\\d.]*)/m))?.groups\n ?.version;\n if (rubyVersion) {\n logger.debug(`Using ruby version specified in ${file}`);\n return rubyVersion;\n }\n }\n const lockFile = await getLockFilePath(packageFileName);\n // v8 ignore else -- `getLockFilePath()` always returns a path\n if (lockFile) {\n const rubyVersion = (await readLocalFile(lockFile, 'utf8'))?.match(\n regEx(/^ {3}ruby (?<version>\\d[\\d.]*)(?:[a-z]|\\s|$)/m),\n )?.groups?.version;\n if (rubyVersion) {\n logger.debug(`Using ruby version specified in lock file`);\n return rubyVersion;\n }\n }\n\n return null;\n}\n\nexport async function getRubyConstraint(\n updateArtifact: UpdateArtifact,\n): Promise<string | undefined> {\n const { packageFileName, config, newPackageFileContent } = updateArtifact;\n return await resolveToolConstraint(config, 'ruby', () =>\n getRubyConstraintFromFiles(packageFileName, newPackageFileContent),\n );\n}\n\nfunction getBundlerConstraintFromLockFile(\n existingLockFileContent: string,\n): string | null {\n const bundledWith = regEx(/\\nBUNDLED WITH\\n\\s+(?<version>.*?)(?:\\n|$)/).exec(\n existingLockFileContent,\n );\n if (bundledWith) {\n logger.debug('Using bundler version specified in lockfile');\n return bundledWith.groups!.version;\n }\n\n return null;\n}\n\nexport async function getBundlerConstraint(\n updateArtifact: Pick<UpdateArtifact, 'config'>,\n existingLockFileContent: string,\n): Promise<string | undefined> {\n const { config } = updateArtifact;\n return await resolveToolConstraint(config, 'bundler', () =>\n getBundlerConstraintFromLockFile(existingLockFileContent),\n );\n}\n\nexport async function getLockFilePath(\n packageFilePath: string,\n): Promise<string> {\n const lockFilePath = (await localPathExists(`${packageFilePath}.lock`))\n ? `${packageFilePath}.lock`\n : `Gemfile.lock`;\n logger.debug(`Lockfile for ${packageFilePath} found in ${lockFilePath}`);\n return lockFilePath;\n}\n"],"mappings":";;;;;AAUA,MAAa,aAAa,CAAC,MAAK,GAAG;AAEnC,SAAgB,mBAAmB,KAA4B;CAC7D,MAAM,YAAY,MAAM,2CAA2C,CAAC,CAAC,KACnE,GACF;CACA,IAAI,CAAC,WAAW,QACd,OAAO;CAET,MAAM,gBAAgB,UAAU,OAAO;CACvC,OAAO,cAAc,UAAU,GAAG,cAAc,SAAS,CAAC;AAC5D;AAEA,eAAe,2BACb,iBACA,uBACwB;CACxB,MAAM,YAAY,mBAAmB,qBAAqB;CAC1D,IAAI,WAAW;EACb,OAAO,MAAM,iCAAiC;EAC9C,OAAO;CACT;CACA,KAAK,MAAM,QAAQ,CAAC,iBAAiB,gBAAgB,GAAG;EACtD,MAAM,eACJ,MAAM,cAAc,mBAAmB,iBAAiB,IAAI,GAAG,MAAM,EAAA,EACpE,MAAM,MAAM,0CAA0C,CAAC,CAAC,EAAE,QACzD;EACJ,IAAI,aAAa;GACf,OAAO,MAAM,mCAAmC,MAAM;GACtD,OAAO;EACT;CACF;CACA,MAAM,WAAW,MAAM,gBAAgB,eAAe;;CAEtD,IAAI,UAAU;EACZ,MAAM,eAAe,MAAM,cAAc,UAAU,MAAM,EAAA,EAAI,MAC3D,MAAM,+CAA+C,CACvD,CAAC,EAAE,QAAQ;EACX,IAAI,aAAa;GACf,OAAO,MAAM,2CAA2C;GACxD,OAAO;EACT;CACF;CAEA,OAAO;AACT;AAEA,eAAsB,kBACpB,gBAC6B;CAC7B,MAAM,EAAE,iBAAiB,QAAQ,0BAA0B;CAC3D,OAAO,MAAM,sBAAsB,QAAQ,cACzC,2BAA2B,iBAAiB,qBAAqB,CACnE;AACF;AAEA,SAAS,iCACP,yBACe;CACf,MAAM,cAAc,MAAM,4CAA4C,CAAC,CAAC,KACtE,uBACF;CACA,IAAI,aAAa;EACf,OAAO,MAAM,6CAA6C;EAC1D,OAAO,YAAY,OAAQ;CAC7B;CAEA,OAAO;AACT;AAEA,eAAsB,qBACpB,gBACA,yBAC6B;CAC7B,MAAM,EAAE,WAAW;CACnB,OAAO,MAAM,sBAAsB,QAAQ,iBACzC,iCAAiC,uBAAuB,CAC1D;AACF;AAEA,eAAsB,gBACpB,iBACiB;CACjB,MAAM,eAAgB,MAAM,gBAAgB,GAAG,gBAAgB,MAAM,IACjE,GAAG,gBAAgB,SACnB;CACJ,OAAO,MAAM,gBAAgB,gBAAgB,YAAY,cAAc;CACvE,OAAO;AACT"}
|
|
@@ -65,6 +65,7 @@ async function updateArtifactsImpl({ packageFileName, updatedDeps, newPackageFil
|
|
|
65
65
|
const hasNonCrateDep = updatedDeps.some((dep) => dep.datasource !== CrateDatasource.id);
|
|
66
66
|
const crateDepWithoutLockedVersion = updatedDeps.find((dep) => !dep.lockedVersion && dep.datasource === CrateDatasource.id);
|
|
67
67
|
if (hasNonCrateDep || crateDepWithoutLockedVersion) {
|
|
68
|
+
// v8 ignore else -- needs a workspace update driven only by a non-crate dep
|
|
68
69
|
if (crateDepWithoutLockedVersion) logger.warn({ dependency: crateDepWithoutLockedVersion.depName }, "Missing locked version for dependency");
|
|
69
70
|
await cargoUpdate(packageFileName, false, rustConstraint);
|
|
70
71
|
} else await cargoUpdatePrecise(packageFileName, updatedDeps, rustConstraint);
|
|
@@ -87,6 +88,7 @@ async function updateArtifactsImpl({ packageFileName, updatedDeps, newPackageFil
|
|
|
87
88
|
if (recursionLimit > 0 && newCargoLockContent && regEx(/error: package ID specification/).test(err.stderr)) {
|
|
88
89
|
const versions = extractLockFileContentVersions(newCargoLockContent);
|
|
89
90
|
const newUpdatedDeps = updatedDeps.filter((dep) => !coerceArray(versions?.get(dep.packageName)).includes(dep.newVersion));
|
|
91
|
+
// v8 ignore else -- this retry only runs when a dep was already current
|
|
90
92
|
if (newUpdatedDeps.length < updatedDeps.length) {
|
|
91
93
|
logger.debug("Dependency already up to date - reattempting recursively");
|
|
92
94
|
return updateArtifactsImpl({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/cargo/artifacts.ts"],"sourcesContent":["import { quote } from 'shlex';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n findLocalSiblingOrParent,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { withGitEnvironment } from '../../../util/git/exec.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport type {\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\nimport { extractLockFileContentVersions } from './locked-version.ts';\n\nconst gitExec = withGitEnvironment(['cargo']);\n\nasync function cargoUpdate(\n manifestPath: string,\n isLockFileMaintenance: boolean,\n constraint: string | undefined,\n): Promise<void> {\n let cmd = `cargo update --config net.git-fetch-with-cli=true --manifest-path ${quote(\n manifestPath,\n )}`;\n // If we're updating a specific crate, `cargo-update` requires `--workspace`\n // for more information, see: https://github.com/renovatebot/renovate/issues/12332\n if (!isLockFileMaintenance) {\n cmd += ` --workspace`;\n }\n\n const execOptions: ExecOptions = {\n docker: {},\n toolConstraints: [{ toolName: 'rust', constraint }],\n };\n await gitExec(cmd, execOptions);\n}\n\nasync function cargoUpdatePrecise(\n manifestPath: string,\n updatedDeps: Upgrade[],\n constraint: string | undefined,\n): Promise<void> {\n const cmds = [];\n\n // First update individual dependencies to their `newVersion`. Necessary when\n // using the `update-lockfile` rangeStrategy which doesn't touch Cargo.toml.\n for (const dep of updatedDeps) {\n // If the range is bumped in Cargo.toml, the old lockedVersion may no longer\n // exist in Cargo's dependency graph, so let the --workspace update at the\n // end re-resolve it instead.\n if (dep.currentValue && dep.newValue && dep.currentValue !== dep.newValue) {\n continue;\n }\n\n cmds.push(\n `cargo update --config net.git-fetch-with-cli=true` +\n ` --manifest-path ${quote(manifestPath)}` +\n ` --package ${quote(`${dep.packageName}@${dep.lockedVersion}`)}` +\n ` --precise ${quote(dep.newVersion!)}`,\n );\n }\n\n // Then update all dependencies that have been bumped in `Cargo.toml`.\n cmds.push(\n `cargo update --config net.git-fetch-with-cli=true --manifest-path ${quote(manifestPath)} --workspace`,\n );\n\n const execOptions: ExecOptions = {\n docker: {},\n toolConstraints: [{ toolName: 'rust', constraint }],\n };\n\n await gitExec(cmds, execOptions);\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n return await updateArtifactsImpl(updateArtifact);\n}\n\nasync function updateArtifactsImpl(\n {\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n }: UpdateArtifact,\n recursionLimit = 10,\n): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`cargo.updateArtifacts(${packageFileName})`);\n\n // For standalone package crates, the `Cargo.lock` will be in the same\n // directory as `Cargo.toml` (ie. a sibling). For cargo workspaces, it\n // will be further up.\n const lockFileName = await findLocalSiblingOrParent(\n packageFileName,\n 'Cargo.lock',\n );\n const existingLockFileContent = lockFileName\n ? await readLocalFile(lockFileName)\n : null;\n if (!existingLockFileContent || !lockFileName) {\n logger.debug('No Cargo.lock found');\n return null;\n }\n\n const { isLockFileMaintenance } = config;\n if (!isLockFileMaintenance && !updatedDeps?.length) {\n logger.debug('No more dependencies to update');\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: existingLockFileContent,\n },\n },\n ];\n }\n\n const rustConstraint = await resolveToolConstraint(config, 'rust');\n\n try {\n await writeLocalFile(packageFileName, newPackageFileContent);\n logger.debug(`Updating ${lockFileName}`);\n\n if (isLockFileMaintenance) {\n await cargoUpdate(packageFileName, true, rustConstraint);\n } else {\n const hasNonCrateDep = updatedDeps.some(\n (dep) => dep.datasource !== CrateDatasource.id,\n );\n const crateDepWithoutLockedVersion = updatedDeps.find(\n (dep) => !dep.lockedVersion && dep.datasource === CrateDatasource.id,\n );\n // Non-crate dependencies (like git ones) do not have locked versions.\n // For crate dependencies, a locked version is expected.\n // In both situations, perform a regular workspace lockfile update.\n if (hasNonCrateDep || crateDepWithoutLockedVersion) {\n if (crateDepWithoutLockedVersion) {\n // Only warn when a crate dependency has no locked version\n logger.warn(\n { dependency: crateDepWithoutLockedVersion.depName },\n 'Missing locked version for dependency',\n );\n }\n await cargoUpdate(packageFileName, false, rustConstraint);\n } else {\n // If all dependencies have locked versions then update them precisely.\n await cargoUpdatePrecise(packageFileName, updatedDeps, rustConstraint);\n }\n }\n\n logger.debug('Returning updated Cargo.lock');\n const newCargoLockContent = await readLocalFile(lockFileName);\n if (existingLockFileContent === newCargoLockContent) {\n logger.debug('Cargo.lock is unchanged');\n return null;\n }\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: newCargoLockContent,\n },\n },\n ];\n } catch (err) {\n // istanbul ignore if\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n\n // Sometimes `cargo update` will fail when a preceding dependency update\n // causes another dependency to update. In this case we can no longer\n // reference the dependency by its old version, so we filter it out\n // and retry recursively.\n const newCargoLockContent = await readLocalFile(lockFileName, 'utf8');\n if (\n recursionLimit > 0 &&\n newCargoLockContent &&\n regEx(/error: package ID specification/).test(err.stderr)\n ) {\n const versions = extractLockFileContentVersions(newCargoLockContent);\n const newUpdatedDeps = updatedDeps.filter(\n (dep) =>\n !coerceArray(versions?.get(dep.packageName!)).includes(\n dep.newVersion!,\n ),\n );\n\n if (newUpdatedDeps.length < updatedDeps.length) {\n logger.debug(\n 'Dependency already up to date - reattempting recursively',\n );\n return updateArtifactsImpl(\n {\n packageFileName,\n updatedDeps: newUpdatedDeps,\n newPackageFileContent,\n config,\n },\n recursionLimit - 1,\n );\n }\n }\n\n logger.debug({ err }, 'Failed to update Cargo lock file');\n\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":";;;;;;;;;;;AAqBA,MAAM,UAAU,mBAAmB,CAAC,OAAO,CAAC;AAE5C,eAAe,YACb,cACA,uBACA,YACe;CACf,IAAI,MAAM,qEAAqE,MAC7E,YACF;CAGA,IAAI,CAAC,uBACH,OAAO;CAOT,MAAM,QAAQ,KAAK;EAHjB,QAAQ,CAAC;EACT,iBAAiB,CAAC;GAAE,UAAU;GAAQ;EAAW,CAAC;CAEvB,CAAC;AAChC;AAEA,eAAe,mBACb,cACA,aACA,YACe;CACf,MAAM,OAAO,CAAC;CAId,KAAK,MAAM,OAAO,aAAa;EAI7B,IAAI,IAAI,gBAAgB,IAAI,YAAY,IAAI,iBAAiB,IAAI,UAC/D;EAGF,KAAK,KACH,qEACsB,MAAM,YAAY,EAAA,aACxB,MAAM,GAAG,IAAI,YAAY,GAAG,IAAI,eAAe,EAAA,aAC/C,MAAM,IAAI,UAAW,GACvC;CACF;CAGA,KAAK,KACH,qEAAqE,MAAM,YAAY,EAAE,aAC3F;CAOA,MAAM,QAAQ,MAAM;EAJlB,QAAQ,CAAC;EACT,iBAAiB,CAAC;GAAE,UAAU;GAAQ;EAAW,CAAC;CAGtB,CAAC;AACjC;AAEA,eAAsB,gBACpB,gBACyC;CACzC,OAAO,MAAM,oBAAoB,cAAc;AACjD;AAEA,eAAe,oBACb,EACE,iBACA,aACA,uBACA,UAEF,iBAAiB,IACwB;CACzC,OAAO,MAAM,yBAAyB,gBAAgB,EAAE;CAKxD,MAAM,eAAe,MAAM,yBACzB,iBACA,YACF;CACA,MAAM,0BAA0B,eAC5B,MAAM,cAAc,YAAY,IAChC;CACJ,IAAI,CAAC,2BAA2B,CAAC,cAAc;EAC7C,OAAO,MAAM,qBAAqB;EAClC,OAAO;CACT;CAEA,MAAM,EAAE,0BAA0B;CAClC,IAAI,CAAC,yBAAyB,CAAC,aAAa,QAAQ;EAClD,OAAO,MAAM,gCAAgC;EAC7C,OAAO,CACL,EACE,MAAM;GACJ,MAAM;GACN,MAAM;GACN,UAAU;EACZ,EACF,CACF;CACF;CAEA,MAAM,iBAAiB,MAAM,sBAAsB,QAAQ,MAAM;CAEjE,IAAI;EACF,MAAM,eAAe,iBAAiB,qBAAqB;EAC3D,OAAO,MAAM,YAAY,cAAc;EAEvC,IAAI,uBACF,MAAM,YAAY,iBAAiB,MAAM,cAAc;OAClD;GACL,MAAM,iBAAiB,YAAY,MAChC,QAAQ,IAAI,eAAe,gBAAgB,EAC9C;GACA,MAAM,+BAA+B,YAAY,MAC9C,QAAQ,CAAC,IAAI,iBAAiB,IAAI,eAAe,gBAAgB,EACpE;GAIA,IAAI,kBAAkB,8BAA8B
|
|
1
|
+
{"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/cargo/artifacts.ts"],"sourcesContent":["import { quote } from 'shlex';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n findLocalSiblingOrParent,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { withGitEnvironment } from '../../../util/git/exec.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport type {\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\nimport { extractLockFileContentVersions } from './locked-version.ts';\n\nconst gitExec = withGitEnvironment(['cargo']);\n\nasync function cargoUpdate(\n manifestPath: string,\n isLockFileMaintenance: boolean,\n constraint: string | undefined,\n): Promise<void> {\n let cmd = `cargo update --config net.git-fetch-with-cli=true --manifest-path ${quote(\n manifestPath,\n )}`;\n // If we're updating a specific crate, `cargo-update` requires `--workspace`\n // for more information, see: https://github.com/renovatebot/renovate/issues/12332\n if (!isLockFileMaintenance) {\n cmd += ` --workspace`;\n }\n\n const execOptions: ExecOptions = {\n docker: {},\n toolConstraints: [{ toolName: 'rust', constraint }],\n };\n await gitExec(cmd, execOptions);\n}\n\nasync function cargoUpdatePrecise(\n manifestPath: string,\n updatedDeps: Upgrade[],\n constraint: string | undefined,\n): Promise<void> {\n const cmds = [];\n\n // First update individual dependencies to their `newVersion`. Necessary when\n // using the `update-lockfile` rangeStrategy which doesn't touch Cargo.toml.\n for (const dep of updatedDeps) {\n // If the range is bumped in Cargo.toml, the old lockedVersion may no longer\n // exist in Cargo's dependency graph, so let the --workspace update at the\n // end re-resolve it instead.\n if (dep.currentValue && dep.newValue && dep.currentValue !== dep.newValue) {\n continue;\n }\n\n cmds.push(\n `cargo update --config net.git-fetch-with-cli=true` +\n ` --manifest-path ${quote(manifestPath)}` +\n ` --package ${quote(`${dep.packageName}@${dep.lockedVersion}`)}` +\n ` --precise ${quote(dep.newVersion!)}`,\n );\n }\n\n // Then update all dependencies that have been bumped in `Cargo.toml`.\n cmds.push(\n `cargo update --config net.git-fetch-with-cli=true --manifest-path ${quote(manifestPath)} --workspace`,\n );\n\n const execOptions: ExecOptions = {\n docker: {},\n toolConstraints: [{ toolName: 'rust', constraint }],\n };\n\n await gitExec(cmds, execOptions);\n}\n\nexport async function updateArtifacts(\n updateArtifact: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n return await updateArtifactsImpl(updateArtifact);\n}\n\nasync function updateArtifactsImpl(\n {\n packageFileName,\n updatedDeps,\n newPackageFileContent,\n config,\n }: UpdateArtifact,\n recursionLimit = 10,\n): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`cargo.updateArtifacts(${packageFileName})`);\n\n // For standalone package crates, the `Cargo.lock` will be in the same\n // directory as `Cargo.toml` (ie. a sibling). For cargo workspaces, it\n // will be further up.\n const lockFileName = await findLocalSiblingOrParent(\n packageFileName,\n 'Cargo.lock',\n );\n const existingLockFileContent = lockFileName\n ? await readLocalFile(lockFileName)\n : null;\n if (!existingLockFileContent || !lockFileName) {\n logger.debug('No Cargo.lock found');\n return null;\n }\n\n const { isLockFileMaintenance } = config;\n if (!isLockFileMaintenance && !updatedDeps?.length) {\n logger.debug('No more dependencies to update');\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: existingLockFileContent,\n },\n },\n ];\n }\n\n const rustConstraint = await resolveToolConstraint(config, 'rust');\n\n try {\n await writeLocalFile(packageFileName, newPackageFileContent);\n logger.debug(`Updating ${lockFileName}`);\n\n if (isLockFileMaintenance) {\n await cargoUpdate(packageFileName, true, rustConstraint);\n } else {\n const hasNonCrateDep = updatedDeps.some(\n (dep) => dep.datasource !== CrateDatasource.id,\n );\n const crateDepWithoutLockedVersion = updatedDeps.find(\n (dep) => !dep.lockedVersion && dep.datasource === CrateDatasource.id,\n );\n // Non-crate dependencies (like git ones) do not have locked versions.\n // For crate dependencies, a locked version is expected.\n // In both situations, perform a regular workspace lockfile update.\n if (hasNonCrateDep || crateDepWithoutLockedVersion) {\n // v8 ignore else -- needs a workspace update driven only by a non-crate dep\n if (crateDepWithoutLockedVersion) {\n // Only warn when a crate dependency has no locked version\n logger.warn(\n { dependency: crateDepWithoutLockedVersion.depName },\n 'Missing locked version for dependency',\n );\n }\n await cargoUpdate(packageFileName, false, rustConstraint);\n } else {\n // If all dependencies have locked versions then update them precisely.\n await cargoUpdatePrecise(packageFileName, updatedDeps, rustConstraint);\n }\n }\n\n logger.debug('Returning updated Cargo.lock');\n const newCargoLockContent = await readLocalFile(lockFileName);\n if (existingLockFileContent === newCargoLockContent) {\n logger.debug('Cargo.lock is unchanged');\n return null;\n }\n return [\n {\n file: {\n type: 'addition',\n path: lockFileName,\n contents: newCargoLockContent,\n },\n },\n ];\n } catch (err) {\n // istanbul ignore if\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n\n // Sometimes `cargo update` will fail when a preceding dependency update\n // causes another dependency to update. In this case we can no longer\n // reference the dependency by its old version, so we filter it out\n // and retry recursively.\n const newCargoLockContent = await readLocalFile(lockFileName, 'utf8');\n if (\n recursionLimit > 0 &&\n newCargoLockContent &&\n regEx(/error: package ID specification/).test(err.stderr)\n ) {\n const versions = extractLockFileContentVersions(newCargoLockContent);\n const newUpdatedDeps = updatedDeps.filter(\n (dep) =>\n !coerceArray(versions?.get(dep.packageName!)).includes(\n dep.newVersion!,\n ),\n );\n\n // v8 ignore else -- this retry only runs when a dep was already current\n if (newUpdatedDeps.length < updatedDeps.length) {\n logger.debug(\n 'Dependency already up to date - reattempting recursively',\n );\n return updateArtifactsImpl(\n {\n packageFileName,\n updatedDeps: newUpdatedDeps,\n newPackageFileContent,\n config,\n },\n recursionLimit - 1,\n );\n }\n }\n\n logger.debug({ err }, 'Failed to update Cargo lock file');\n\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n"],"mappings":"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"}
|