renovate 43.264.2 → 43.265.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-validator.js.map +1 -1
- package/dist/modules/datasource/bitrise/index.js +1 -1
- package/dist/modules/datasource/bitrise/index.js.map +1 -1
- package/dist/modules/datasource/custom/index.js +8 -2
- package/dist/modules/datasource/custom/index.js.map +1 -1
- package/dist/modules/datasource/postprocess-release.js +4 -1
- package/dist/modules/datasource/postprocess-release.js.map +1 -1
- package/dist/modules/manager/bazel-module/lockfile.js +1 -1
- package/dist/modules/manager/bazel-module/lockfile.js.map +1 -1
- package/dist/modules/manager/deno/artifacts.js +5 -1
- package/dist/modules/manager/deno/artifacts.js.map +1 -1
- package/dist/modules/manager/deno/post.js +1 -1
- package/dist/modules/manager/deno/post.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +2 -2
- package/dist/modules/manager/fingerprint.generated.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/mise/artifacts.js +4 -1
- package/dist/modules/manager/mise/artifacts.js.map +1 -1
- package/dist/modules/platform/azure/issue.js +4 -1
- package/dist/modules/platform/azure/issue.js.map +1 -1
- package/dist/modules/platform/bitbucket/index.js +4 -1
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/codecommit/index.js +2 -2
- package/dist/modules/platform/codecommit/index.js.map +1 -1
- package/dist/modules/platform/gitlab/http.js +1 -1
- package/dist/modules/platform/gitlab/http.js.map +1 -1
- package/dist/modules/platform/scm-manager/index.js +5 -2
- package/dist/modules/platform/scm-manager/index.js.map +1 -1
- package/dist/util/emoji.js +2 -2
- package/dist/util/emoji.js.map +1 -1
- package/dist/util/http/github.js +2 -2
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/interpolator.js +4 -1
- package/dist/util/interpolator.js.map +1 -1
- package/dist/workers/global/config/parse/additional-config-file.js +1 -1
- package/dist/workers/global/config/parse/additional-config-file.js.map +1 -1
- package/dist/workers/global/config/parse/env.js +4 -1
- package/dist/workers/global/config/parse/env.js.map +1 -1
- package/dist/workers/global/config/parse/file.js +1 -1
- package/dist/workers/global/config/parse/file.js.map +1 -1
- package/dist/workers/repository/error.js +3 -3
- package/dist/workers/repository/error.js.map +1 -1
- package/dist/workers/repository/process/extract-update.js +2 -2
- package/dist/workers/repository/process/extract-update.js.map +1 -1
- package/dist/workers/repository/update/branch/bump-versions.js +5 -1
- package/dist/workers/repository/update/branch/bump-versions.js.map +1 -1
- package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js +1 -1
- package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js.map +1 -1
- package/dist/workers/repository/update/branch/get-updated.js +3 -3
- package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
- package/dist/workers/repository/updates/branch-name.js +1 -1
- package/dist/workers/repository/updates/branch-name.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-update.js","names":[],"sources":["../../../../lib/workers/repository/process/extract-update.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { hashMap } from '../../../modules/manager/index.ts';\nimport type { PackageFile } from '../../../modules/manager/types.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { isNotNullOrUndefined } from '../../../util/array.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport type { BaseBranchCache } from '../../../util/cache/repository/types.ts';\nimport { checkGithubToken as ensureGithubToken } from '../../../util/check-token.ts';\nimport { fingerprint } from '../../../util/fingerprint.ts';\nimport type { BranchConfig } from '../../types.ts';\nimport { generateFingerprintConfig } from '../extract/extract-fingerprint-config.ts';\nimport { extractAllDependencies } from '../extract/index.ts';\nimport { branchifyUpgrades } from '../updates/branchify.ts';\nimport { fetchUpdates } from './fetch.ts';\nimport { calculateLibYears } from './libyear.ts';\nimport { sortBranches } from './sort.ts';\nimport { Vulnerabilities } from './vulnerabilities.ts';\nimport type { WriteUpdateResult } from './write.ts';\nimport { writeUpdates } from './write.ts';\n\n// Increment this if needing to cache bust ALL extract caches\nexport const EXTRACT_CACHE_REVISION = 1;\n\nexport interface ExtractResult {\n branches: BranchConfig[];\n branchList: string[];\n packageFiles: Record<string, PackageFile[]>;\n}\n\nexport interface StatsResult {\n fileCount: number;\n depCount: number;\n}\n\nexport interface Stats {\n managers: Record<string, StatsResult>;\n total: StatsResult;\n}\n\n// istanbul ignore next\nfunction extractStats(\n packageFiles: Record<string, PackageFile[]>,\n): Stats | null {\n if (!packageFiles) {\n return null;\n }\n const stats: Stats = {\n managers: {},\n total: {\n fileCount: 0,\n depCount: 0,\n },\n };\n for (const [manager, managerPackageFiles] of Object.entries(packageFiles)) {\n const fileCount = managerPackageFiles.length;\n let depCount = 0;\n for (const file of managerPackageFiles) {\n depCount += file.deps.length;\n }\n stats.managers[manager] = {\n fileCount,\n depCount,\n };\n stats.total.fileCount += fileCount;\n stats.total.depCount += depCount;\n }\n return stats;\n}\n\nexport function isCacheExtractValid(\n baseBranchSha: string,\n configHash: string,\n cachedExtract?: BaseBranchCache,\n): boolean {\n if (!cachedExtract) {\n return false;\n }\n\n if (!cachedExtract.revision) {\n logger.debug('Cached extract is missing revision, so cannot be used');\n return false;\n }\n\n if (cachedExtract.revision !== EXTRACT_CACHE_REVISION) {\n logger.debug(\n `Extract cache revision has changed (old=${cachedExtract.revision}, new=${EXTRACT_CACHE_REVISION})`,\n );\n return false;\n }\n\n if (!(cachedExtract.sha && cachedExtract.configHash)) {\n return false;\n }\n if (cachedExtract.sha !== baseBranchSha) {\n logger.debug(\n `Cached extract result cannot be used due to base branch SHA change (old=${cachedExtract.sha}, new=${baseBranchSha})`,\n );\n return false;\n }\n if (cachedExtract.configHash !== configHash) {\n logger.debug('Cached extract result cannot be used due to config change');\n return false;\n }\n if (!cachedExtract.extractionFingerprints) {\n logger.debug(\n 'Cached extract is missing extractionFingerprints, so cannot be used',\n );\n return false;\n }\n const changedManagers = new Set();\n for (const [manager, fingerprint] of Object.entries(\n cachedExtract.extractionFingerprints,\n )) {\n if (fingerprint !== hashMap.get(manager)) {\n changedManagers.add(manager);\n }\n }\n if (changedManagers.size > 0) {\n logger.debug(\n { changedManagers: [...changedManagers] },\n 'Manager fingerprint(s) have changed, extract cache cannot be reused',\n );\n return false;\n }\n logger.debug(\n `Cached extract for sha=${baseBranchSha} is valid and can be used`,\n );\n return true;\n}\n\nexport async function extract(\n config: RenovateConfig,\n overwriteCache = true,\n): Promise<Record<string, PackageFile[]>> {\n logger.debug('extract()');\n const { baseBranch } = config;\n const baseBranchSha = await scm.getBranchCommit(baseBranch!);\n let packageFiles: Record<string, PackageFile[]>;\n const cache = getCache();\n cache.scan ??= {};\n const cachedExtract = cache.scan[baseBranch!];\n const configHash = instrument('fingerprint', () =>\n fingerprint(generateFingerprintConfig(config)),\n );\n // istanbul ignore if\n if (\n overwriteCache &&\n isCacheExtractValid(baseBranchSha!, configHash, cachedExtract)\n ) {\n packageFiles = cachedExtract.packageFiles;\n try {\n for (const files of Object.values(packageFiles)) {\n for (const file of files) {\n for (const dep of file.deps) {\n delete dep.updates;\n }\n }\n }\n logger.debug('Deleted cached dep updates');\n } catch (err) {\n logger.info({ err }, 'Error deleting cached dep updates');\n }\n } else {\n await instrument(\n 'checkoutBranch',\n async () => await scm.checkoutBranch(baseBranch!),\n );\n const extractResult = await instrument(\n 'extractAllDependencies',\n async () => (await extractAllDependencies(config)) || {},\n );\n packageFiles = extractResult.packageFiles;\n const { extractionFingerprints } = extractResult;\n\n if (overwriteCache) {\n // TODO: fix types (#22198)\n cache.scan[baseBranch!] = {\n revision: EXTRACT_CACHE_REVISION,\n sha: baseBranchSha!,\n configHash,\n extractionFingerprints,\n packageFiles,\n };\n }\n\n // Clean up cached branch extracts\n const baseBranches = isNonEmptyArray(config.baseBranches)\n ? config.baseBranches\n : [baseBranch];\n Object.keys(cache.scan).forEach((branchName) => {\n if (!baseBranches.includes(branchName)) {\n delete cache.scan![branchName];\n }\n });\n }\n const stats = extractStats(packageFiles);\n logger.info(\n { baseBranch: config.baseBranch, stats },\n `Dependency extraction complete`,\n );\n logger.trace({ config: packageFiles }, 'packageFiles');\n ensureGithubToken(packageFiles);\n return packageFiles;\n}\n\nasync function fetchVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<void> {\n if (config.osvVulnerabilityAlerts) {\n logger.debug('fetchVulnerabilities() - osvVulnerabilityAlerts=true');\n try {\n const vulnerabilities = await Vulnerabilities.create();\n await vulnerabilities.appendVulnerabilityPackageRules(\n config,\n packageFiles,\n );\n } catch (err) {\n logger.warn({ err }, 'Unable to read vulnerability information');\n }\n }\n}\n\nexport async function lookup(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<ExtractResult> {\n await fetchVulnerabilities(config, packageFiles);\n await fetchUpdates(config, packageFiles);\n // call this twice, as the second time, the updates will be availalbe for malicious package checks\n // TODO: this will be refactored as part of #42423\n await fetchVulnerabilities(config, packageFiles);\n memCache.cleanDatasourceKeys();\n calculateLibYears(config, packageFiles);\n const { branches, branchList } = await branchifyUpgrades(\n config,\n packageFiles,\n );\n reportMaliciousSkippedDependencies(packageFiles);\n logger.debug(\n { baseBranch: config.baseBranch, config: packageFiles },\n 'packageFiles with updates',\n );\n sortBranches(branches);\n return { branches, branchList, packageFiles };\n}\n\nexport function reportMaliciousSkippedDependencies(\n allPackageFiles: Record<string, PackageFile[]>,\n): void {\n if (allPackageFiles === undefined) {\n return;\n }\n\n for (const [manager, packageFiles] of Object.entries(allPackageFiles)) {\n for (const packageFile of packageFiles) {\n for (const dep of packageFile.deps) {\n if (dep.skipReason === 'malicious-version-in-use') {\n logger.warn(\n {\n packageFile: packageFile.packageFile,\n depName: dep.depName,\n packageName: dep.packageName,\n manager: manager,\n datasource: dep.datasource,\n },\n `Dependency ${dep.depName} is currently using a malicious version`,\n );\n\n // and make sure that it then gets updates proposed in the update phase\n delete dep.skipReason;\n delete dep.skipStage;\n } else if (dep.skipReason === 'malicious-update-proposed') {\n const newVersions = dep.updates\n ?.map((u) => u.newVersion ?? u.newValue)\n .filter(isNotNullOrUndefined);\n logger.warn(\n {\n packageFile: packageFile.packageFile,\n depName: dep.depName,\n packageName: dep.packageName,\n manager: manager,\n datasource: dep.datasource,\n newVersions,\n },\n `Dependency ${dep.depName} has update(s) proposed which would update you to a malicious version - skipping`,\n );\n }\n }\n }\n }\n}\n\nexport async function update(\n config: RenovateConfig,\n branches: BranchConfig[],\n): Promise<WriteUpdateResult | undefined> {\n let res: WriteUpdateResult | undefined;\n if (config.repoIsOnboarded) {\n res = await writeUpdates(config, branches);\n }\n\n return res;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extract-update.js","names":[],"sources":["../../../../lib/workers/repository/process/extract-update.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { hashMap } from '../../../modules/manager/index.ts';\nimport type { PackageFile } from '../../../modules/manager/types.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { isNotNullOrUndefined } from '../../../util/array.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport type { BaseBranchCache } from '../../../util/cache/repository/types.ts';\nimport { checkGithubToken as ensureGithubToken } from '../../../util/check-token.ts';\nimport { fingerprint } from '../../../util/fingerprint.ts';\nimport type { BranchConfig } from '../../types.ts';\nimport { generateFingerprintConfig } from '../extract/extract-fingerprint-config.ts';\nimport { extractAllDependencies } from '../extract/index.ts';\nimport { branchifyUpgrades } from '../updates/branchify.ts';\nimport { fetchUpdates } from './fetch.ts';\nimport { calculateLibYears } from './libyear.ts';\nimport { sortBranches } from './sort.ts';\nimport { Vulnerabilities } from './vulnerabilities.ts';\nimport type { WriteUpdateResult } from './write.ts';\nimport { writeUpdates } from './write.ts';\n\n// Increment this if needing to cache bust ALL extract caches\nexport const EXTRACT_CACHE_REVISION = 1;\n\nexport interface ExtractResult {\n branches: BranchConfig[];\n branchList: string[];\n packageFiles: Record<string, PackageFile[]>;\n}\n\nexport interface StatsResult {\n fileCount: number;\n depCount: number;\n}\n\nexport interface Stats {\n managers: Record<string, StatsResult>;\n total: StatsResult;\n}\n\n// istanbul ignore next\nfunction extractStats(\n packageFiles: Record<string, PackageFile[]>,\n): Stats | null {\n if (!packageFiles) {\n return null;\n }\n const stats: Stats = {\n managers: {},\n total: {\n fileCount: 0,\n depCount: 0,\n },\n };\n for (const [manager, managerPackageFiles] of Object.entries(packageFiles)) {\n const fileCount = managerPackageFiles.length;\n let depCount = 0;\n for (const file of managerPackageFiles) {\n depCount += file.deps.length;\n }\n stats.managers[manager] = {\n fileCount,\n depCount,\n };\n stats.total.fileCount += fileCount;\n stats.total.depCount += depCount;\n }\n return stats;\n}\n\nexport function isCacheExtractValid(\n baseBranchSha: string,\n configHash: string,\n cachedExtract?: BaseBranchCache,\n): boolean {\n if (!cachedExtract) {\n return false;\n }\n\n if (!cachedExtract.revision) {\n logger.debug('Cached extract is missing revision, so cannot be used');\n return false;\n }\n\n if (cachedExtract.revision !== EXTRACT_CACHE_REVISION) {\n logger.debug(\n `Extract cache revision has changed (old=${cachedExtract.revision}, new=${EXTRACT_CACHE_REVISION})`,\n );\n return false;\n }\n\n if (!(cachedExtract.sha && cachedExtract.configHash)) {\n return false;\n }\n if (cachedExtract.sha !== baseBranchSha) {\n logger.debug(\n `Cached extract result cannot be used due to base branch SHA change (old=${cachedExtract.sha}, new=${baseBranchSha})`,\n );\n return false;\n }\n if (cachedExtract.configHash !== configHash) {\n logger.debug('Cached extract result cannot be used due to config change');\n return false;\n }\n if (!cachedExtract.extractionFingerprints) {\n logger.debug(\n 'Cached extract is missing extractionFingerprints, so cannot be used',\n );\n return false;\n }\n const changedManagers = new Set();\n for (const [manager, fingerprint] of Object.entries(\n cachedExtract.extractionFingerprints,\n )) {\n if (fingerprint !== hashMap.get(manager)) {\n changedManagers.add(manager);\n }\n }\n if (changedManagers.size > 0) {\n logger.debug(\n { changedManagers: [...changedManagers] },\n 'Manager fingerprint(s) have changed, extract cache cannot be reused',\n );\n return false;\n }\n logger.debug(\n `Cached extract for sha=${baseBranchSha} is valid and can be used`,\n );\n return true;\n}\n\nexport async function extract(\n config: RenovateConfig,\n overwriteCache = true,\n): Promise<Record<string, PackageFile[]>> {\n logger.debug('extract()');\n const { baseBranch } = config;\n const baseBranchSha = await scm.getBranchCommit(baseBranch!);\n let packageFiles: Record<string, PackageFile[]>;\n const cache = getCache();\n cache.scan ??= {};\n const cachedExtract = cache.scan[baseBranch!];\n const configHash = instrument('fingerprint', () =>\n fingerprint(generateFingerprintConfig(config)),\n );\n // istanbul ignore if\n if (\n overwriteCache &&\n isCacheExtractValid(baseBranchSha!, configHash, cachedExtract)\n ) {\n packageFiles = cachedExtract.packageFiles;\n try {\n for (const files of Object.values(packageFiles)) {\n for (const file of files) {\n for (const dep of file.deps) {\n delete dep.updates;\n }\n }\n }\n logger.debug('Deleted cached dep updates');\n } catch (err) {\n logger.info({ err }, 'Error deleting cached dep updates');\n }\n } else {\n await instrument(\n 'checkoutBranch',\n async () => await scm.checkoutBranch(baseBranch!),\n );\n const extractResult = await instrument(\n 'extractAllDependencies',\n async () => (await extractAllDependencies(config)) || {},\n );\n packageFiles = extractResult.packageFiles;\n const { extractionFingerprints } = extractResult;\n\n if (overwriteCache) {\n // TODO: fix types (#22198)\n cache.scan[baseBranch!] = {\n revision: EXTRACT_CACHE_REVISION,\n sha: baseBranchSha!,\n configHash,\n extractionFingerprints,\n packageFiles,\n };\n }\n\n // Clean up cached branch extracts\n const baseBranches = isNonEmptyArray(config.baseBranches)\n ? config.baseBranches\n : [baseBranch];\n Object.keys(cache.scan).forEach((branchName) => {\n if (!baseBranches.includes(branchName)) {\n delete cache.scan![branchName];\n }\n });\n }\n const stats = extractStats(packageFiles);\n logger.info(\n { baseBranch: config.baseBranch, stats },\n `Dependency extraction complete`,\n );\n logger.trace({ config: packageFiles }, 'packageFiles');\n ensureGithubToken(packageFiles);\n return packageFiles;\n}\n\nasync function fetchVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<void> {\n if (config.osvVulnerabilityAlerts) {\n logger.debug('fetchVulnerabilities() - osvVulnerabilityAlerts=true');\n try {\n const vulnerabilities = await Vulnerabilities.create();\n await vulnerabilities.appendVulnerabilityPackageRules(\n config,\n packageFiles,\n );\n } catch (err) {\n logger.warn({ err }, 'Unable to read vulnerability information');\n }\n }\n}\n\nexport async function lookup(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<ExtractResult> {\n await fetchVulnerabilities(config, packageFiles);\n await fetchUpdates(config, packageFiles);\n // call this twice, as the second time, the updates will be availalbe for malicious package checks\n // TODO: this will be refactored as part of #42423\n await fetchVulnerabilities(config, packageFiles);\n memCache.cleanDatasourceKeys();\n calculateLibYears(config, packageFiles);\n const { branches, branchList } = await branchifyUpgrades(\n config,\n packageFiles,\n );\n reportMaliciousSkippedDependencies(packageFiles);\n logger.debug(\n { baseBranch: config.baseBranch, config: packageFiles },\n 'packageFiles with updates',\n );\n sortBranches(branches);\n return { branches, branchList, packageFiles };\n}\n\nexport function reportMaliciousSkippedDependencies(\n allPackageFiles: Record<string, PackageFile[]>,\n): void {\n if (allPackageFiles === undefined) {\n return;\n }\n\n for (const [manager, packageFiles] of Object.entries(allPackageFiles)) {\n for (const packageFile of packageFiles) {\n for (const dep of packageFile.deps) {\n if (dep.skipReason === 'malicious-version-in-use') {\n logger.warn(\n {\n packageFile: packageFile.packageFile,\n depName: dep.depName,\n packageName: dep.packageName,\n manager: manager,\n datasource: dep.datasource,\n },\n 'Dependency is currently using a malicious version',\n );\n\n // and make sure that it then gets updates proposed in the update phase\n delete dep.skipReason;\n delete dep.skipStage;\n } else if (dep.skipReason === 'malicious-update-proposed') {\n const newVersions = dep.updates\n ?.map((u) => u.newVersion ?? u.newValue)\n .filter(isNotNullOrUndefined);\n logger.warn(\n {\n packageFile: packageFile.packageFile,\n depName: dep.depName,\n packageName: dep.packageName,\n manager: manager,\n datasource: dep.datasource,\n newVersions,\n },\n 'Dependency has update(s) proposed which would update you to a malicious version - skipping',\n );\n }\n }\n }\n }\n}\n\nexport async function update(\n config: RenovateConfig,\n branches: BranchConfig[],\n): Promise<WriteUpdateResult | undefined> {\n let res: WriteUpdateResult | undefined;\n if (config.repoIsOnboarded) {\n res = await writeUpdates(config, branches);\n }\n\n return res;\n}\n"],"mappings":"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"}
|
|
@@ -155,7 +155,11 @@ async function getFileContent(bumpVersionsDescr, filePath, packageFiles, artifac
|
|
|
155
155
|
try {
|
|
156
156
|
return await readLocalFile(filePath, "utf8");
|
|
157
157
|
} catch (e) {
|
|
158
|
-
logger.warn({
|
|
158
|
+
logger.warn({
|
|
159
|
+
file: filePath,
|
|
160
|
+
bumpVersionsDescr,
|
|
161
|
+
err: e
|
|
162
|
+
}, "bumpVersions: Could not read file");
|
|
159
163
|
return null;
|
|
160
164
|
}
|
|
161
165
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bump-versions.js","names":[],"sources":["../../../../../lib/workers/repository/update/branch/bump-versions.ts"],"sourcesContent":["import { type ReleaseType, inc } from 'semver';\nimport type { BumpVersionConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport { readLocalFile } from '../../../../util/fs/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { matchRegexOrGlobList } from '../../../../util/string-match.ts';\nimport { compile } from '../../../../util/template/index.ts';\nimport type { BranchConfig } from '../../../types.ts';\nimport { getFilteredFileList } from '../../extract/file-match.ts';\n\ntype ParseFileChangesResult =\n | { state: 'modified'; content: string | null }\n | { state: 'deleted' }\n | { state: 'unmodified' };\n\nexport async function bumpVersions(config: BranchConfig): Promise<void> {\n const bumpVersions = config.bumpVersions;\n if (!bumpVersions?.length) {\n return;\n }\n\n // skip if no packageFiles or artifacts have been updated\n if (!config.updatedPackageFiles?.length && !config.updatedArtifacts?.length) {\n return;\n }\n\n const allFiles = await scm.getFileList();\n const fileList = getFilteredFileList(config, allFiles);\n\n const packageFileChanges = fileChangeListToMap(config.updatedPackageFiles);\n const artifactFileChanges = fileChangeListToMap(config.updatedArtifacts);\n\n for (const bumpVersionConfig of bumpVersions) {\n await bumpVersion(\n bumpVersionConfig,\n config,\n fileList,\n packageFileChanges,\n artifactFileChanges,\n );\n }\n\n // update the config with the new files\n config.updatedPackageFiles = Object.values(packageFileChanges).flat();\n config.updatedArtifacts = Object.values(artifactFileChanges).flat();\n}\n\nasync function bumpVersion(\n config: BumpVersionConfig,\n branchConfig: BranchConfig,\n fileList: string[],\n packageFiles: Record<string, FileChange[]>,\n artifactFiles: Record<string, FileChange[]>,\n): Promise<void> {\n const rawBumpType = config.bumpType ?? 'patch';\n\n // all log messages should be prefixed with this string to facilitate easier logLevelRemapping\n const bumpVersionsDescr = config.name\n ? `bumpVersions(${config.name})`\n : 'bumpVersions';\n\n const files: string[] = [];\n try {\n files.push(\n ...getMatchedFiles(\n bumpVersionsDescr,\n config.filePatterns,\n branchConfig,\n fileList,\n ),\n );\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to calculate matched files for bumpVersions: ${e.message}`,\n );\n return;\n }\n\n if (!files.length) {\n logger.debug(`${bumpVersionsDescr}: filePatterns did not match any files`);\n return;\n }\n\n logger.trace(\n { files },\n `${bumpVersionsDescr}: Found ${files.length} files to bump versions`,\n );\n\n // keeping this only for logging purposes\n const matchStrings: string[] = [];\n\n // prepare the matchStrings\n const matchStringsRegexes: RegExp[] = [];\n for (const matchString of config.matchStrings) {\n try {\n const templated = compile(matchString, branchConfig);\n matchStrings.push(templated);\n matchStringsRegexes.push(regEx(templated));\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to compile matchString for ${bumpVersionsDescr}: ${e.message}`,\n matchString,\n );\n }\n }\n\n logger.trace({ matchStrings }, `${bumpVersionsDescr}: Compiled matchStrings`);\n\n for (const filePath of files) {\n let fileBumped = false;\n\n const fileContents = await getFileContent(\n bumpVersionsDescr,\n filePath,\n packageFiles,\n artifactFiles,\n );\n if (!fileContents) {\n continue;\n }\n\n for (const matchStringRegex of matchStringsRegexes) {\n // extracting the version from the file\n const regexResult = matchStringRegex.exec(fileContents);\n if (!regexResult) {\n continue;\n }\n const version = regexResult.groups?.version;\n if (!version) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No version found`,\n );\n continue;\n }\n\n // getting new version\n let newVersion: string | null = null;\n try {\n const bumpType = compile(rawBumpType, branchConfig);\n\n // Handle 'sync' type - use version from branch upgrades\n if (bumpType === 'sync') {\n if (branchConfig.upgrades?.length) {\n // Use the newVersion from the first upgrade\n newVersion = branchConfig.upgrades[0].newVersion ?? null;\n if (!newVersion) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No newVersion found in branch upgrades for sync type`,\n );\n continue;\n }\n } else {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No upgrades found in branch config for sync type`,\n );\n continue;\n }\n } else {\n // Existing logic for major/minor/patch\n const parts = regEx('^(?<major>\\\\d+)(?:\\\\.(?<minor>\\\\d+))?$').exec(\n version,\n );\n if (parts?.groups) {\n const { major, minor } = parts.groups;\n if (bumpType === 'major') {\n newVersion = `${parseInt(major, 10) + 1}${minor ? `.0` : ''}`;\n } else if (bumpType === 'minor') {\n newVersion = `${major}.${parseInt(minor, 10) + 1}`;\n } else {\n throw new Error(\n `Unsupported bump type for {major}.{minor} version: ${bumpType}`,\n );\n }\n } else {\n newVersion = inc(version, bumpType as ReleaseType);\n }\n }\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to calculate new version for ${bumpVersionsDescr}: ${e.message}`,\n filePath,\n );\n }\n if (!newVersion) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: Could not bump version`,\n );\n continue;\n }\n\n // replace the content of the `version` group with newVersion\n const newFileContents: string = fileContents\n .toString()\n .replace(matchStringRegex, (match, ...groups) => {\n const { version } = groups.pop();\n return match.replace(version, newVersion);\n });\n\n // update the file. Add it to the buckets if exists or create a new artifact update\n if (packageFiles[filePath]) {\n packageFiles[filePath].push({\n type: 'addition',\n path: filePath,\n contents: newFileContents,\n });\n } else {\n artifactFiles[filePath] ??= [];\n artifactFiles[filePath].push({\n type: 'addition',\n path: filePath,\n contents: newFileContents,\n });\n }\n\n fileBumped = true;\n }\n\n if (!fileBumped) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No match found for bumping version`,\n );\n }\n }\n}\n\n/**\n * Get files that match ANY of the fileMatches pattern. fileMatches are compiled with the branchConfig.\n * @param bumpVersionsDescr log description for the bump version config\n * @param filePatternTemplates list of regex patterns\n * @param branchConfig compile metadata\n * @param fileList list of files to match against\n */\nfunction getMatchedFiles(\n bumpVersionsDescr: string,\n filePatternTemplates: string[],\n branchConfig: BranchConfig,\n fileList: string[],\n): string[] {\n // prepare file regex\n const filePatterns: string[] = [];\n for (const filePatternTemplateElement of filePatternTemplates) {\n const filePattern = compile(filePatternTemplateElement, branchConfig);\n filePatterns.push(filePattern);\n }\n\n logger.trace({ filePatterns }, `${bumpVersionsDescr}: Compiled filePatterns`);\n\n // get files that match the fileMatch\n const files: string[] = [];\n for (const file of fileList) {\n if (matchRegexOrGlobList(file, filePatterns)) {\n files.push(file);\n }\n }\n return files;\n}\n\nfunction fileChangeListToMap(\n list: FileChange[] | undefined,\n): Record<string, FileChange[]> {\n const record: Record<string, FileChange[]> = {};\n for (const fileChange of coerceArray(list)) {\n record[fileChange.path] ??= [];\n record[fileChange.path].push(fileChange);\n }\n return record;\n}\n\nfunction addArtifactError(\n branchConfig: BranchConfig,\n message: string,\n fileName?: string,\n): void {\n branchConfig.artifactErrors ??= [];\n branchConfig.artifactErrors.push({\n stderr: message,\n fileName,\n });\n}\n\nasync function getFileContent(\n bumpVersionsDescr: string,\n filePath: string,\n packageFiles: Record<string, FileChange[]>,\n artifactFiles: Record<string, FileChange[]>,\n): Promise<string | null> {\n const packageFileChanges = parseFileChanges(filePath, packageFiles);\n const artifactFileChanges = parseFileChanges(filePath, artifactFiles);\n\n // skip if the file is deleted as it virtually doesn't exist\n if (\n packageFileChanges.state === 'deleted' ||\n artifactFileChanges.state === 'deleted'\n ) {\n return null;\n }\n\n if (packageFileChanges.state === 'modified') {\n const lastChange = packageFileChanges.content;\n if (lastChange) {\n return lastChange;\n }\n }\n if (artifactFileChanges.state === 'modified') {\n const lastChange = artifactFileChanges.content;\n if (lastChange) {\n return lastChange;\n }\n }\n\n try {\n return await readLocalFile(filePath, 'utf8');\n } catch (e) {\n logger.warn(\n { file: filePath },\n `${bumpVersionsDescr}: Could not read file: ${e.message}`,\n );\n return null;\n }\n}\n\nfunction parseFileChanges(\n filePath: string,\n changeRecord: Record<string, FileChange[]>,\n): ParseFileChangesResult {\n const changes = coerceArray(changeRecord[filePath]);\n\n // skip if we can fetch from record\n if (!changes.length) {\n return { state: 'unmodified' };\n }\n\n const lastChange = changes.at(-1)!;\n if (lastChange.type === 'deletion') {\n return { state: 'deleted' };\n }\n return {\n state: 'modified',\n content: lastChange.contents?.toString() ?? null,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bump-versions.js","names":[],"sources":["../../../../../lib/workers/repository/update/branch/bump-versions.ts"],"sourcesContent":["import { type ReleaseType, inc } from 'semver';\nimport type { BumpVersionConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport { readLocalFile } from '../../../../util/fs/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { matchRegexOrGlobList } from '../../../../util/string-match.ts';\nimport { compile } from '../../../../util/template/index.ts';\nimport type { BranchConfig } from '../../../types.ts';\nimport { getFilteredFileList } from '../../extract/file-match.ts';\n\ntype ParseFileChangesResult =\n | { state: 'modified'; content: string | null }\n | { state: 'deleted' }\n | { state: 'unmodified' };\n\nexport async function bumpVersions(config: BranchConfig): Promise<void> {\n const bumpVersions = config.bumpVersions;\n if (!bumpVersions?.length) {\n return;\n }\n\n // skip if no packageFiles or artifacts have been updated\n if (!config.updatedPackageFiles?.length && !config.updatedArtifacts?.length) {\n return;\n }\n\n const allFiles = await scm.getFileList();\n const fileList = getFilteredFileList(config, allFiles);\n\n const packageFileChanges = fileChangeListToMap(config.updatedPackageFiles);\n const artifactFileChanges = fileChangeListToMap(config.updatedArtifacts);\n\n for (const bumpVersionConfig of bumpVersions) {\n await bumpVersion(\n bumpVersionConfig,\n config,\n fileList,\n packageFileChanges,\n artifactFileChanges,\n );\n }\n\n // update the config with the new files\n config.updatedPackageFiles = Object.values(packageFileChanges).flat();\n config.updatedArtifacts = Object.values(artifactFileChanges).flat();\n}\n\nasync function bumpVersion(\n config: BumpVersionConfig,\n branchConfig: BranchConfig,\n fileList: string[],\n packageFiles: Record<string, FileChange[]>,\n artifactFiles: Record<string, FileChange[]>,\n): Promise<void> {\n const rawBumpType = config.bumpType ?? 'patch';\n\n // all log messages should be prefixed with this string to facilitate easier logLevelRemapping\n const bumpVersionsDescr = config.name\n ? `bumpVersions(${config.name})`\n : 'bumpVersions';\n\n const files: string[] = [];\n try {\n files.push(\n ...getMatchedFiles(\n bumpVersionsDescr,\n config.filePatterns,\n branchConfig,\n fileList,\n ),\n );\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to calculate matched files for bumpVersions: ${e.message}`,\n );\n return;\n }\n\n if (!files.length) {\n logger.debug(`${bumpVersionsDescr}: filePatterns did not match any files`);\n return;\n }\n\n logger.trace(\n { files },\n `${bumpVersionsDescr}: Found ${files.length} files to bump versions`,\n );\n\n // keeping this only for logging purposes\n const matchStrings: string[] = [];\n\n // prepare the matchStrings\n const matchStringsRegexes: RegExp[] = [];\n for (const matchString of config.matchStrings) {\n try {\n const templated = compile(matchString, branchConfig);\n matchStrings.push(templated);\n matchStringsRegexes.push(regEx(templated));\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to compile matchString for ${bumpVersionsDescr}: ${e.message}`,\n matchString,\n );\n }\n }\n\n logger.trace({ matchStrings }, `${bumpVersionsDescr}: Compiled matchStrings`);\n\n for (const filePath of files) {\n let fileBumped = false;\n\n const fileContents = await getFileContent(\n bumpVersionsDescr,\n filePath,\n packageFiles,\n artifactFiles,\n );\n if (!fileContents) {\n continue;\n }\n\n for (const matchStringRegex of matchStringsRegexes) {\n // extracting the version from the file\n const regexResult = matchStringRegex.exec(fileContents);\n if (!regexResult) {\n continue;\n }\n const version = regexResult.groups?.version;\n if (!version) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No version found`,\n );\n continue;\n }\n\n // getting new version\n let newVersion: string | null = null;\n try {\n const bumpType = compile(rawBumpType, branchConfig);\n\n // Handle 'sync' type - use version from branch upgrades\n if (bumpType === 'sync') {\n if (branchConfig.upgrades?.length) {\n // Use the newVersion from the first upgrade\n newVersion = branchConfig.upgrades[0].newVersion ?? null;\n if (!newVersion) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No newVersion found in branch upgrades for sync type`,\n );\n continue;\n }\n } else {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No upgrades found in branch config for sync type`,\n );\n continue;\n }\n } else {\n // Existing logic for major/minor/patch\n const parts = regEx('^(?<major>\\\\d+)(?:\\\\.(?<minor>\\\\d+))?$').exec(\n version,\n );\n if (parts?.groups) {\n const { major, minor } = parts.groups;\n if (bumpType === 'major') {\n newVersion = `${parseInt(major, 10) + 1}${minor ? `.0` : ''}`;\n } else if (bumpType === 'minor') {\n newVersion = `${major}.${parseInt(minor, 10) + 1}`;\n } else {\n throw new Error(\n `Unsupported bump type for {major}.{minor} version: ${bumpType}`,\n );\n }\n } else {\n newVersion = inc(version, bumpType as ReleaseType);\n }\n }\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to calculate new version for ${bumpVersionsDescr}: ${e.message}`,\n filePath,\n );\n }\n if (!newVersion) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: Could not bump version`,\n );\n continue;\n }\n\n // replace the content of the `version` group with newVersion\n const newFileContents: string = fileContents\n .toString()\n .replace(matchStringRegex, (match, ...groups) => {\n const { version } = groups.pop();\n return match.replace(version, newVersion);\n });\n\n // update the file. Add it to the buckets if exists or create a new artifact update\n if (packageFiles[filePath]) {\n packageFiles[filePath].push({\n type: 'addition',\n path: filePath,\n contents: newFileContents,\n });\n } else {\n artifactFiles[filePath] ??= [];\n artifactFiles[filePath].push({\n type: 'addition',\n path: filePath,\n contents: newFileContents,\n });\n }\n\n fileBumped = true;\n }\n\n if (!fileBumped) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No match found for bumping version`,\n );\n }\n }\n}\n\n/**\n * Get files that match ANY of the fileMatches pattern. fileMatches are compiled with the branchConfig.\n * @param bumpVersionsDescr log description for the bump version config\n * @param filePatternTemplates list of regex patterns\n * @param branchConfig compile metadata\n * @param fileList list of files to match against\n */\nfunction getMatchedFiles(\n bumpVersionsDescr: string,\n filePatternTemplates: string[],\n branchConfig: BranchConfig,\n fileList: string[],\n): string[] {\n // prepare file regex\n const filePatterns: string[] = [];\n for (const filePatternTemplateElement of filePatternTemplates) {\n const filePattern = compile(filePatternTemplateElement, branchConfig);\n filePatterns.push(filePattern);\n }\n\n logger.trace({ filePatterns }, `${bumpVersionsDescr}: Compiled filePatterns`);\n\n // get files that match the fileMatch\n const files: string[] = [];\n for (const file of fileList) {\n if (matchRegexOrGlobList(file, filePatterns)) {\n files.push(file);\n }\n }\n return files;\n}\n\nfunction fileChangeListToMap(\n list: FileChange[] | undefined,\n): Record<string, FileChange[]> {\n const record: Record<string, FileChange[]> = {};\n for (const fileChange of coerceArray(list)) {\n record[fileChange.path] ??= [];\n record[fileChange.path].push(fileChange);\n }\n return record;\n}\n\nfunction addArtifactError(\n branchConfig: BranchConfig,\n message: string,\n fileName?: string,\n): void {\n branchConfig.artifactErrors ??= [];\n branchConfig.artifactErrors.push({\n stderr: message,\n fileName,\n });\n}\n\nasync function getFileContent(\n bumpVersionsDescr: string,\n filePath: string,\n packageFiles: Record<string, FileChange[]>,\n artifactFiles: Record<string, FileChange[]>,\n): Promise<string | null> {\n const packageFileChanges = parseFileChanges(filePath, packageFiles);\n const artifactFileChanges = parseFileChanges(filePath, artifactFiles);\n\n // skip if the file is deleted as it virtually doesn't exist\n if (\n packageFileChanges.state === 'deleted' ||\n artifactFileChanges.state === 'deleted'\n ) {\n return null;\n }\n\n if (packageFileChanges.state === 'modified') {\n const lastChange = packageFileChanges.content;\n if (lastChange) {\n return lastChange;\n }\n }\n if (artifactFileChanges.state === 'modified') {\n const lastChange = artifactFileChanges.content;\n if (lastChange) {\n return lastChange;\n }\n }\n\n try {\n return await readLocalFile(filePath, 'utf8');\n } catch (e) {\n logger.warn(\n { file: filePath, bumpVersionsDescr, err: e },\n 'bumpVersions: Could not read file',\n );\n return null;\n }\n}\n\nfunction parseFileChanges(\n filePath: string,\n changeRecord: Record<string, FileChange[]>,\n): ParseFileChangesResult {\n const changes = coerceArray(changeRecord[filePath]);\n\n // skip if we can fetch from record\n if (!changes.length) {\n return { state: 'unmodified' };\n }\n\n const lastChange = changes.at(-1)!;\n if (lastChange.type === 'deletion') {\n return { state: 'deleted' };\n }\n return {\n state: 'modified',\n content: lastChange.contents?.toString() ?? null,\n };\n}\n"],"mappings":"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"}
|
|
@@ -88,7 +88,7 @@ async function postUpgradeCommandsExecutor(filteredUpgradeCommands, config) {
|
|
|
88
88
|
tool,
|
|
89
89
|
validTool,
|
|
90
90
|
validConstraint
|
|
91
|
-
},
|
|
91
|
+
}, "Skipping constraint that is not a tool that Containerbase knows");
|
|
92
92
|
continue;
|
|
93
93
|
}
|
|
94
94
|
execOpts.toolConstraints.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-post-upgrade-commands.js","names":[],"sources":["../../../../../lib/workers/repository/update/branch/execute-post-upgrade-commands.ts"],"sourcesContent":["// TODO #22198\n\nimport crypto from 'node:crypto';\nimport { isArray, isNonEmptyArray } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { mergeChildConfig } from '../../../../config/index.ts';\nimport { addMeta, logger } from '../../../../logger/index.ts';\nimport type { ArtifactError } from '../../../../modules/manager/types.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport { exec } from '../../../../util/exec/index.ts';\nimport {\n type ExecOptions,\n isConstraintName,\n isToolName,\n} from '../../../../util/exec/types.ts';\nimport {\n ensureLocalDir,\n localPathIsFile,\n outputCacheFile,\n privateCacheDir,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { getGitEnvironmentVariables } from '../../../../util/git/auth.ts';\nimport { getRepoStatus } from '../../../../util/git/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport { minimatch } from '../../../../util/minimatch.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { sanitize } from '../../../../util/sanitize.ts';\nimport { compile } from '../../../../util/template/index.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../types.ts';\n\nexport interface PostUpgradeCommandsExecutionResult {\n updatedArtifacts: FileChange[];\n artifactErrors: ArtifactError[];\n}\n\nexport async function postUpgradeCommandsExecutor(\n filteredUpgradeCommands: BranchUpgradeConfig[],\n config: BranchConfig,\n): Promise<PostUpgradeCommandsExecutionResult> {\n let updatedArtifacts = [...(config.updatedArtifacts ?? [])];\n const artifactErrors = [...(config.artifactErrors ?? [])];\n const allowedCommands = GlobalConfig.get('allowedCommands');\n\n for (const upgrade of filteredUpgradeCommands) {\n addMeta({ dep: upgrade.depName });\n logger.trace(\n {\n tasks: upgrade.postUpgradeTasks,\n allowedCommands,\n },\n `Checking for post-upgrade tasks`,\n );\n const commands = upgrade.postUpgradeTasks?.commands;\n const dataFileTemplate = upgrade.postUpgradeTasks?.dataFileTemplate;\n const fileFilters = upgrade.postUpgradeTasks?.fileFilters ?? ['**/*'];\n if (isNonEmptyArray(commands)) {\n // Persist updated files in file system so any executed commands can see them\n const previouslyModifiedFiles =\n config.updatedPackageFiles!.concat(updatedArtifacts);\n for (const file of previouslyModifiedFiles) {\n const canWriteFile = await localPathIsFile(file.path);\n if (file.type === 'addition' && !file.isSymlink && canWriteFile) {\n let contents: Buffer | null;\n if (typeof file.contents === 'string') {\n contents = Buffer.from(file.contents);\n } else {\n contents = file.contents;\n }\n // TODO #22198\n await writeLocalFile(file.path, contents!);\n }\n }\n\n let dataFilePath: string | null = null;\n if (dataFileTemplate) {\n const dataFileContent = sanitize(\n compile(dataFileTemplate, mergeChildConfig(config, upgrade)),\n );\n logger.debug(\n { dataFileTemplate },\n 'Processed post-upgrade commands data file template.',\n );\n\n const dataFileName = `post-upgrade-data-file-${crypto.randomBytes(8).toString('hex')}.tmp`;\n dataFilePath = upath.join(privateCacheDir(), dataFileName);\n\n try {\n await outputCacheFile(dataFilePath, dataFileContent);\n\n logger.debug(\n { dataFilePath, dataFileContent },\n 'Created post-upgrade commands data file.',\n );\n } catch (error) {\n artifactErrors.push({\n stderr: sanitize(\n `Failed to create post-upgrade commands data file at ${dataFilePath}, reason: ${error.message}`,\n ),\n });\n\n dataFilePath = null;\n }\n }\n\n const workingDirTemplate = upgrade.postUpgradeTasks?.workingDirTemplate;\n let workingDir = GlobalConfig.get('localDir');\n\n if (workingDirTemplate) {\n workingDir = sanitize(\n compile(workingDirTemplate, mergeChildConfig(config, upgrade)),\n );\n workingDir = await ensureLocalDir(workingDir);\n logger.trace(\n { workingDirTemplate },\n 'Processed post-upgrade commands working directory template.',\n );\n }\n\n for (const cmd of commands) {\n const compiledCmd = compile(cmd, mergeChildConfig(config, upgrade));\n if (compiledCmd !== cmd) {\n logger.debug(\n { rawCmd: cmd, compiledCmd },\n 'Post-upgrade command has been compiled',\n );\n }\n if (\n allowedCommands.some((pattern) => regEx(pattern).test(compiledCmd))\n ) {\n try {\n logger.trace({ cmd: compiledCmd }, 'Executing post-upgrade task');\n\n const execOpts: ExecOptions = {\n shell: GlobalConfig.get(\n 'allowShellExecutorForPostUpgradeCommands',\n ),\n\n cwd: workingDir,\n extraEnv: getGitEnvironmentVariables(),\n };\n if (dataFilePath) {\n execOpts.env = {\n RENOVATE_POST_UPGRADE_COMMAND_DATA_FILE: dataFilePath,\n };\n }\n if (upgrade.postUpgradeTasks?.installTools) {\n execOpts.toolConstraints ??= [];\n\n for (const [tool] of Object.entries(\n upgrade.postUpgradeTasks?.installTools,\n )) {\n const validTool = isToolName(tool);\n const validConstraint = isConstraintName(tool);\n if (!validTool) {\n logger.warn(\n {\n tool,\n validTool,\n validConstraint,\n },\n `Skipping ${validConstraint ? 'valid' : 'invalid'} constraint that is not a tool that Containerbase knows`,\n );\n continue;\n }\n\n execOpts.toolConstraints.push({\n toolName: tool,\n constraint: upgrade.constraints?.[tool],\n });\n }\n }\n const execResult = await exec(compiledCmd, execOpts);\n\n logger.debug(\n { cmd: compiledCmd, ...execResult },\n 'Executed post-upgrade task',\n );\n } catch (error) {\n artifactErrors.push({\n fileName: upgrade.packageFile,\n stderr: sanitize(error.message),\n });\n }\n } else {\n logger.warn(\n {\n cmd: compiledCmd,\n allowedCommands,\n },\n 'Post-upgrade task did not match any on allowedCommands list',\n );\n artifactErrors.push({\n fileName: upgrade.packageFile,\n stderr: sanitize(\n `Post-upgrade command '${compiledCmd}' has not been added to the allowed list in allowedCommands`,\n ),\n });\n }\n }\n\n const status = await getRepoStatus();\n\n logger.trace({ status }, 'git status after post-upgrade tasks');\n\n logger.debug(\n {\n addedCount: status.not_added?.length,\n modifiedCount: status.modified?.length,\n deletedCount: status.deleted?.length,\n renamedCount: status.renamed?.length,\n },\n 'git status counts after post-upgrade tasks',\n );\n\n const addedOrModifiedFiles = [\n ...coerceArray(status.not_added),\n ...coerceArray(status.modified),\n ...coerceArray(status.renamed?.map((x) => x.to)),\n ];\n const changedFiles = [\n ...addedOrModifiedFiles,\n ...coerceArray(status.deleted),\n ...coerceArray(status.renamed?.map((x) => x.from)),\n ];\n\n // Check for files which were previously deleted but have been re-added without modification\n const previouslyDeletedFiles = updatedArtifacts.filter(\n (ua) => ua.type === 'deletion',\n );\n for (const previouslyDeletedFile of previouslyDeletedFiles) {\n /* v8 ignore if -- TODO: needs test */\n if (!changedFiles.includes(previouslyDeletedFile.path)) {\n logger.debug(\n { file: previouslyDeletedFile.path },\n 'Previously deleted file has been restored without modification',\n );\n updatedArtifacts = updatedArtifacts.filter(\n (ua) =>\n !(\n ua.type === 'deletion' && ua.path === previouslyDeletedFile.path\n ),\n );\n }\n }\n\n logger.trace({ addedOrModifiedFiles }, 'Added or modified files');\n logger.debug(\n `Checking ${addedOrModifiedFiles.length} added or modified files for post-upgrade changes`,\n );\n\n const fileExcludes: string[] = [];\n if (config.npmrc) {\n fileExcludes.push('.npmrc');\n }\n\n for (const relativePath of addedOrModifiedFiles) {\n if (\n fileExcludes.some((pattern) =>\n minimatch(pattern, { dot: true }).match(relativePath),\n )\n ) {\n continue;\n }\n\n let fileMatched = false;\n for (const pattern of fileFilters) {\n if (minimatch(pattern, { dot: true }).match(relativePath)) {\n fileMatched = true;\n logger.debug(\n { file: relativePath, pattern },\n 'Post-upgrade file saved',\n );\n const existingContent = await readLocalFile(relativePath);\n const existingUpdatedArtifacts = updatedArtifacts.find(\n (ua) => ua.path === relativePath,\n );\n if (existingUpdatedArtifacts?.type === 'addition') {\n existingUpdatedArtifacts.contents = existingContent;\n } else {\n updatedArtifacts.push({\n type: 'addition',\n path: relativePath,\n contents: existingContent,\n });\n }\n // If the file is deleted by a previous post-update command, remove the deletion from updatedArtifacts\n updatedArtifacts = updatedArtifacts.filter(\n (ua) => !(ua.type === 'deletion' && ua.path === relativePath),\n );\n }\n }\n if (!fileMatched) {\n logger.debug(\n { file: relativePath },\n 'Post-upgrade file did not match any file filters',\n );\n }\n }\n\n for (const relativePath of coerceArray(status.deleted)) {\n for (const pattern of fileFilters) {\n if (minimatch(pattern, { dot: true }).match(relativePath)) {\n if (\n !updatedArtifacts.some(\n (ua) => ua.path === relativePath && ua.type === 'deletion',\n )\n ) {\n logger.debug(\n { file: relativePath, pattern },\n 'Post-upgrade file removed',\n );\n updatedArtifacts.push({\n type: 'deletion',\n path: relativePath,\n });\n }\n // If the file is created or modified by a previous post-update command, remove the modification from updatedArtifacts\n updatedArtifacts = updatedArtifacts.filter(\n (ua) => !(ua.type === 'addition' && ua.path === relativePath),\n );\n }\n }\n }\n }\n }\n return { updatedArtifacts, artifactErrors };\n}\n\nexport default async function executePostUpgradeCommands(\n config: BranchConfig,\n): Promise<PostUpgradeCommandsExecutionResult | null> {\n const hasChangedFiles =\n (isArray(config.updatedPackageFiles) &&\n config.updatedPackageFiles.length > 0) ||\n (isArray(config.updatedArtifacts) && config.updatedArtifacts.length > 0);\n\n if (!hasChangedFiles) {\n /* Only run post-upgrade tasks if there are changes to package files... */\n logger.debug('No changes to package files, skipping post-upgrade tasks');\n return null;\n }\n\n const branchUpgradeCommands: BranchUpgradeConfig[] = [\n {\n manager: config.manager,\n depName: config.upgrades.map(({ depName }) => depName).join(' '),\n branchName: config.branchName,\n postUpgradeTasks:\n config.postUpgradeTasks!.executionMode === 'branch'\n ? config.postUpgradeTasks\n : undefined,\n },\n ];\n\n const updateUpgradeCommands: BranchUpgradeConfig[] = config.upgrades.filter(\n ({ postUpgradeTasks }) =>\n !postUpgradeTasks?.executionMode ||\n postUpgradeTasks.executionMode === 'update',\n );\n\n const { updatedArtifacts, artifactErrors } =\n await postUpgradeCommandsExecutor(updateUpgradeCommands, config);\n return postUpgradeCommandsExecutor(branchUpgradeCommands, {\n ...config,\n updatedArtifacts,\n artifactErrors,\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"execute-post-upgrade-commands.js","names":[],"sources":["../../../../../lib/workers/repository/update/branch/execute-post-upgrade-commands.ts"],"sourcesContent":["// TODO #22198\n\nimport crypto from 'node:crypto';\nimport { isArray, isNonEmptyArray } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { mergeChildConfig } from '../../../../config/index.ts';\nimport { addMeta, logger } from '../../../../logger/index.ts';\nimport type { ArtifactError } from '../../../../modules/manager/types.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport { exec } from '../../../../util/exec/index.ts';\nimport {\n type ExecOptions,\n isConstraintName,\n isToolName,\n} from '../../../../util/exec/types.ts';\nimport {\n ensureLocalDir,\n localPathIsFile,\n outputCacheFile,\n privateCacheDir,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { getGitEnvironmentVariables } from '../../../../util/git/auth.ts';\nimport { getRepoStatus } from '../../../../util/git/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport { minimatch } from '../../../../util/minimatch.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { sanitize } from '../../../../util/sanitize.ts';\nimport { compile } from '../../../../util/template/index.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../types.ts';\n\nexport interface PostUpgradeCommandsExecutionResult {\n updatedArtifacts: FileChange[];\n artifactErrors: ArtifactError[];\n}\n\nexport async function postUpgradeCommandsExecutor(\n filteredUpgradeCommands: BranchUpgradeConfig[],\n config: BranchConfig,\n): Promise<PostUpgradeCommandsExecutionResult> {\n let updatedArtifacts = [...(config.updatedArtifacts ?? [])];\n const artifactErrors = [...(config.artifactErrors ?? [])];\n const allowedCommands = GlobalConfig.get('allowedCommands');\n\n for (const upgrade of filteredUpgradeCommands) {\n addMeta({ dep: upgrade.depName });\n logger.trace(\n {\n tasks: upgrade.postUpgradeTasks,\n allowedCommands,\n },\n `Checking for post-upgrade tasks`,\n );\n const commands = upgrade.postUpgradeTasks?.commands;\n const dataFileTemplate = upgrade.postUpgradeTasks?.dataFileTemplate;\n const fileFilters = upgrade.postUpgradeTasks?.fileFilters ?? ['**/*'];\n if (isNonEmptyArray(commands)) {\n // Persist updated files in file system so any executed commands can see them\n const previouslyModifiedFiles =\n config.updatedPackageFiles!.concat(updatedArtifacts);\n for (const file of previouslyModifiedFiles) {\n const canWriteFile = await localPathIsFile(file.path);\n if (file.type === 'addition' && !file.isSymlink && canWriteFile) {\n let contents: Buffer | null;\n if (typeof file.contents === 'string') {\n contents = Buffer.from(file.contents);\n } else {\n contents = file.contents;\n }\n // TODO #22198\n await writeLocalFile(file.path, contents!);\n }\n }\n\n let dataFilePath: string | null = null;\n if (dataFileTemplate) {\n const dataFileContent = sanitize(\n compile(dataFileTemplate, mergeChildConfig(config, upgrade)),\n );\n logger.debug(\n { dataFileTemplate },\n 'Processed post-upgrade commands data file template.',\n );\n\n const dataFileName = `post-upgrade-data-file-${crypto.randomBytes(8).toString('hex')}.tmp`;\n dataFilePath = upath.join(privateCacheDir(), dataFileName);\n\n try {\n await outputCacheFile(dataFilePath, dataFileContent);\n\n logger.debug(\n { dataFilePath, dataFileContent },\n 'Created post-upgrade commands data file.',\n );\n } catch (error) {\n artifactErrors.push({\n stderr: sanitize(\n `Failed to create post-upgrade commands data file at ${dataFilePath}, reason: ${error.message}`,\n ),\n });\n\n dataFilePath = null;\n }\n }\n\n const workingDirTemplate = upgrade.postUpgradeTasks?.workingDirTemplate;\n let workingDir = GlobalConfig.get('localDir');\n\n if (workingDirTemplate) {\n workingDir = sanitize(\n compile(workingDirTemplate, mergeChildConfig(config, upgrade)),\n );\n workingDir = await ensureLocalDir(workingDir);\n logger.trace(\n { workingDirTemplate },\n 'Processed post-upgrade commands working directory template.',\n );\n }\n\n for (const cmd of commands) {\n const compiledCmd = compile(cmd, mergeChildConfig(config, upgrade));\n if (compiledCmd !== cmd) {\n logger.debug(\n { rawCmd: cmd, compiledCmd },\n 'Post-upgrade command has been compiled',\n );\n }\n if (\n allowedCommands.some((pattern) => regEx(pattern).test(compiledCmd))\n ) {\n try {\n logger.trace({ cmd: compiledCmd }, 'Executing post-upgrade task');\n\n const execOpts: ExecOptions = {\n shell: GlobalConfig.get(\n 'allowShellExecutorForPostUpgradeCommands',\n ),\n\n cwd: workingDir,\n extraEnv: getGitEnvironmentVariables(),\n };\n if (dataFilePath) {\n execOpts.env = {\n RENOVATE_POST_UPGRADE_COMMAND_DATA_FILE: dataFilePath,\n };\n }\n if (upgrade.postUpgradeTasks?.installTools) {\n execOpts.toolConstraints ??= [];\n\n for (const [tool] of Object.entries(\n upgrade.postUpgradeTasks?.installTools,\n )) {\n const validTool = isToolName(tool);\n const validConstraint = isConstraintName(tool);\n if (!validTool) {\n logger.warn(\n {\n tool,\n validTool,\n validConstraint,\n },\n 'Skipping constraint that is not a tool that Containerbase knows',\n );\n continue;\n }\n\n execOpts.toolConstraints.push({\n toolName: tool,\n constraint: upgrade.constraints?.[tool],\n });\n }\n }\n const execResult = await exec(compiledCmd, execOpts);\n\n logger.debug(\n { cmd: compiledCmd, ...execResult },\n 'Executed post-upgrade task',\n );\n } catch (error) {\n artifactErrors.push({\n fileName: upgrade.packageFile,\n stderr: sanitize(error.message),\n });\n }\n } else {\n logger.warn(\n {\n cmd: compiledCmd,\n allowedCommands,\n },\n 'Post-upgrade task did not match any on allowedCommands list',\n );\n artifactErrors.push({\n fileName: upgrade.packageFile,\n stderr: sanitize(\n `Post-upgrade command '${compiledCmd}' has not been added to the allowed list in allowedCommands`,\n ),\n });\n }\n }\n\n const status = await getRepoStatus();\n\n logger.trace({ status }, 'git status after post-upgrade tasks');\n\n logger.debug(\n {\n addedCount: status.not_added?.length,\n modifiedCount: status.modified?.length,\n deletedCount: status.deleted?.length,\n renamedCount: status.renamed?.length,\n },\n 'git status counts after post-upgrade tasks',\n );\n\n const addedOrModifiedFiles = [\n ...coerceArray(status.not_added),\n ...coerceArray(status.modified),\n ...coerceArray(status.renamed?.map((x) => x.to)),\n ];\n const changedFiles = [\n ...addedOrModifiedFiles,\n ...coerceArray(status.deleted),\n ...coerceArray(status.renamed?.map((x) => x.from)),\n ];\n\n // Check for files which were previously deleted but have been re-added without modification\n const previouslyDeletedFiles = updatedArtifacts.filter(\n (ua) => ua.type === 'deletion',\n );\n for (const previouslyDeletedFile of previouslyDeletedFiles) {\n /* v8 ignore if -- TODO: needs test */\n if (!changedFiles.includes(previouslyDeletedFile.path)) {\n logger.debug(\n { file: previouslyDeletedFile.path },\n 'Previously deleted file has been restored without modification',\n );\n updatedArtifacts = updatedArtifacts.filter(\n (ua) =>\n !(\n ua.type === 'deletion' && ua.path === previouslyDeletedFile.path\n ),\n );\n }\n }\n\n logger.trace({ addedOrModifiedFiles }, 'Added or modified files');\n logger.debug(\n `Checking ${addedOrModifiedFiles.length} added or modified files for post-upgrade changes`,\n );\n\n const fileExcludes: string[] = [];\n if (config.npmrc) {\n fileExcludes.push('.npmrc');\n }\n\n for (const relativePath of addedOrModifiedFiles) {\n if (\n fileExcludes.some((pattern) =>\n minimatch(pattern, { dot: true }).match(relativePath),\n )\n ) {\n continue;\n }\n\n let fileMatched = false;\n for (const pattern of fileFilters) {\n if (minimatch(pattern, { dot: true }).match(relativePath)) {\n fileMatched = true;\n logger.debug(\n { file: relativePath, pattern },\n 'Post-upgrade file saved',\n );\n const existingContent = await readLocalFile(relativePath);\n const existingUpdatedArtifacts = updatedArtifacts.find(\n (ua) => ua.path === relativePath,\n );\n if (existingUpdatedArtifacts?.type === 'addition') {\n existingUpdatedArtifacts.contents = existingContent;\n } else {\n updatedArtifacts.push({\n type: 'addition',\n path: relativePath,\n contents: existingContent,\n });\n }\n // If the file is deleted by a previous post-update command, remove the deletion from updatedArtifacts\n updatedArtifacts = updatedArtifacts.filter(\n (ua) => !(ua.type === 'deletion' && ua.path === relativePath),\n );\n }\n }\n if (!fileMatched) {\n logger.debug(\n { file: relativePath },\n 'Post-upgrade file did not match any file filters',\n );\n }\n }\n\n for (const relativePath of coerceArray(status.deleted)) {\n for (const pattern of fileFilters) {\n if (minimatch(pattern, { dot: true }).match(relativePath)) {\n if (\n !updatedArtifacts.some(\n (ua) => ua.path === relativePath && ua.type === 'deletion',\n )\n ) {\n logger.debug(\n { file: relativePath, pattern },\n 'Post-upgrade file removed',\n );\n updatedArtifacts.push({\n type: 'deletion',\n path: relativePath,\n });\n }\n // If the file is created or modified by a previous post-update command, remove the modification from updatedArtifacts\n updatedArtifacts = updatedArtifacts.filter(\n (ua) => !(ua.type === 'addition' && ua.path === relativePath),\n );\n }\n }\n }\n }\n }\n return { updatedArtifacts, artifactErrors };\n}\n\nexport default async function executePostUpgradeCommands(\n config: BranchConfig,\n): Promise<PostUpgradeCommandsExecutionResult | null> {\n const hasChangedFiles =\n (isArray(config.updatedPackageFiles) &&\n config.updatedPackageFiles.length > 0) ||\n (isArray(config.updatedArtifacts) && config.updatedArtifacts.length > 0);\n\n if (!hasChangedFiles) {\n /* Only run post-upgrade tasks if there are changes to package files... */\n logger.debug('No changes to package files, skipping post-upgrade tasks');\n return null;\n }\n\n const branchUpgradeCommands: BranchUpgradeConfig[] = [\n {\n manager: config.manager,\n depName: config.upgrades.map(({ depName }) => depName).join(' '),\n branchName: config.branchName,\n postUpgradeTasks:\n config.postUpgradeTasks!.executionMode === 'branch'\n ? config.postUpgradeTasks\n : undefined,\n },\n ];\n\n const updateUpgradeCommands: BranchUpgradeConfig[] = config.upgrades.filter(\n ({ postUpgradeTasks }) =>\n !postUpgradeTasks?.executionMode ||\n postUpgradeTasks.executionMode === 'update',\n );\n\n const { updatedArtifacts, artifactErrors } =\n await postUpgradeCommandsExecutor(updateUpgradeCommands, config);\n return postUpgradeCommandsExecutor(branchUpgradeCommands, {\n ...config,\n updatedArtifacts,\n artifactErrors,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAsCA,eAAsB,4BACpB,yBACA,QAC6C;CAC7C,IAAI,mBAAmB,CAAC,GAAI,OAAO,oBAAoB,CAAC,CAAE;CAC1D,MAAM,iBAAiB,CAAC,GAAI,OAAO,kBAAkB,CAAC,CAAE;CACxD,MAAM,kBAAkB,aAAa,IAAI,iBAAiB;CAE1D,KAAK,MAAM,WAAW,yBAAyB;EAC7C,QAAQ,EAAE,KAAK,QAAQ,QAAQ,CAAC;EAChC,OAAO,MACL;GACE,OAAO,QAAQ;GACf;EACF,GACA,iCACF;EACA,MAAM,WAAW,QAAQ,kBAAkB;EAC3C,MAAM,mBAAmB,QAAQ,kBAAkB;EACnD,MAAM,cAAc,QAAQ,kBAAkB,eAAe,CAAC,MAAM;EACpE,IAAI,gBAAgB,QAAQ,GAAG;GAE7B,MAAM,0BACJ,OAAO,oBAAqB,OAAO,gBAAgB;GACrD,KAAK,MAAM,QAAQ,yBAAyB;IAC1C,MAAM,eAAe,MAAM,gBAAgB,KAAK,IAAI;IACpD,IAAI,KAAK,SAAS,cAAc,CAAC,KAAK,aAAa,cAAc;KAC/D,IAAI;KACJ,IAAI,OAAO,KAAK,aAAa,UAC3B,WAAW,OAAO,KAAK,KAAK,QAAQ;UAEpC,WAAW,KAAK;KAGlB,MAAM,eAAe,KAAK,MAAM,QAAS;IAC3C;GACF;GAEA,IAAI,eAA8B;GAClC,IAAI,kBAAkB;IACpB,MAAM,kBAAkB,SACtB,QAAQ,kBAAkB,iBAAiB,QAAQ,OAAO,CAAC,CAC7D;IACA,OAAO,MACL,EAAE,iBAAiB,GACnB,qDACF;IAEA,MAAM,eAAe,0BAA0B,OAAO,YAAY,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE;IACrF,eAAe,MAAM,KAAK,gBAAgB,GAAG,YAAY;IAEzD,IAAI;KACF,MAAM,gBAAgB,cAAc,eAAe;KAEnD,OAAO,MACL;MAAE;MAAc;KAAgB,GAChC,0CACF;IACF,SAAS,OAAO;KACd,eAAe,KAAK,EAClB,QAAQ,SACN,uDAAuD,aAAa,YAAY,MAAM,SACxF,EACF,CAAC;KAED,eAAe;IACjB;GACF;GAEA,MAAM,qBAAqB,QAAQ,kBAAkB;GACrD,IAAI,aAAa,aAAa,IAAI,UAAU;GAE5C,IAAI,oBAAoB;IACtB,aAAa,SACX,QAAQ,oBAAoB,iBAAiB,QAAQ,OAAO,CAAC,CAC/D;IACA,aAAa,MAAM,eAAe,UAAU;IAC5C,OAAO,MACL,EAAE,mBAAmB,GACrB,6DACF;GACF;GAEA,KAAK,MAAM,OAAO,UAAU;IAC1B,MAAM,cAAc,QAAQ,KAAK,iBAAiB,QAAQ,OAAO,CAAC;IAClE,IAAI,gBAAgB,KAClB,OAAO,MACL;KAAE,QAAQ;KAAK;IAAY,GAC3B,wCACF;IAEF,IACE,gBAAgB,MAAM,YAAY,MAAM,OAAO,CAAC,CAAC,KAAK,WAAW,CAAC,GAElE,IAAI;KACF,OAAO,MAAM,EAAE,KAAK,YAAY,GAAG,6BAA6B;KAEhE,MAAM,WAAwB;MAC5B,OAAO,aAAa,IAClB,0CACF;MAEA,KAAK;MACL,UAAU,2BAA2B;KACvC;KACA,IAAI,cACF,SAAS,MAAM,EACb,yCAAyC,aAC3C;KAEF,IAAI,QAAQ,kBAAkB,cAAc;MAC1C,SAAS,oBAAoB,CAAC;MAE9B,KAAK,MAAM,CAAC,SAAS,OAAO,QAC1B,QAAQ,kBAAkB,YAC5B,GAAG;OACD,MAAM,YAAY,WAAW,IAAI;OACjC,MAAM,kBAAkB,iBAAiB,IAAI;OAC7C,IAAI,CAAC,WAAW;QACd,OAAO,KACL;SACE;SACA;SACA;QACF,GACA,iEACF;QACA;OACF;OAEA,SAAS,gBAAgB,KAAK;QAC5B,UAAU;QACV,YAAY,QAAQ,cAAc;OACpC,CAAC;MACH;KACF;KACA,MAAM,aAAa,MAAM,KAAK,aAAa,QAAQ;KAEnD,OAAO,MACL;MAAE,KAAK;MAAa,GAAG;KAAW,GAClC,4BACF;IACF,SAAS,OAAO;KACd,eAAe,KAAK;MAClB,UAAU,QAAQ;MAClB,QAAQ,SAAS,MAAM,OAAO;KAChC,CAAC;IACH;SACK;KACL,OAAO,KACL;MACE,KAAK;MACL;KACF,GACA,6DACF;KACA,eAAe,KAAK;MAClB,UAAU,QAAQ;MAClB,QAAQ,SACN,yBAAyB,YAAY,4DACvC;KACF,CAAC;IACH;GACF;GAEA,MAAM,SAAS,MAAM,cAAc;GAEnC,OAAO,MAAM,EAAE,OAAO,GAAG,qCAAqC;GAE9D,OAAO,MACL;IACE,YAAY,OAAO,WAAW;IAC9B,eAAe,OAAO,UAAU;IAChC,cAAc,OAAO,SAAS;IAC9B,cAAc,OAAO,SAAS;GAChC,GACA,4CACF;GAEA,MAAM,uBAAuB;IAC3B,GAAG,YAAY,OAAO,SAAS;IAC/B,GAAG,YAAY,OAAO,QAAQ;IAC9B,GAAG,YAAY,OAAO,SAAS,KAAK,MAAM,EAAE,EAAE,CAAC;GACjD;GACA,MAAM,eAAe;IACnB,GAAG;IACH,GAAG,YAAY,OAAO,OAAO;IAC7B,GAAG,YAAY,OAAO,SAAS,KAAK,MAAM,EAAE,IAAI,CAAC;GACnD;GAGA,MAAM,yBAAyB,iBAAiB,QAC7C,OAAO,GAAG,SAAS,UACtB;GACA,KAAK,MAAM,yBAAyB;;GAElC,IAAI,CAAC,aAAa,SAAS,sBAAsB,IAAI,GAAG;IACtD,OAAO,MACL,EAAE,MAAM,sBAAsB,KAAK,GACnC,gEACF;IACA,mBAAmB,iBAAiB,QACjC,OACC,EACE,GAAG,SAAS,cAAc,GAAG,SAAS,sBAAsB,KAElE;GACF;GAGF,OAAO,MAAM,EAAE,qBAAqB,GAAG,yBAAyB;GAChE,OAAO,MACL,YAAY,qBAAqB,OAAO,kDAC1C;GAEA,MAAM,eAAyB,CAAC;GAChC,IAAI,OAAO,OACT,aAAa,KAAK,QAAQ;GAG5B,KAAK,MAAM,gBAAgB,sBAAsB;IAC/C,IACE,aAAa,MAAM,YACjB,UAAU,SAAS,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,YAAY,CACtD,GAEA;IAGF,IAAI,cAAc;IAClB,KAAK,MAAM,WAAW,aACpB,IAAI,UAAU,SAAS,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,YAAY,GAAG;KACzD,cAAc;KACd,OAAO,MACL;MAAE,MAAM;MAAc;KAAQ,GAC9B,yBACF;KACA,MAAM,kBAAkB,MAAM,cAAc,YAAY;KACxD,MAAM,2BAA2B,iBAAiB,MAC/C,OAAO,GAAG,SAAS,YACtB;KACA,IAAI,0BAA0B,SAAS,YACrC,yBAAyB,WAAW;UAEpC,iBAAiB,KAAK;MACpB,MAAM;MACN,MAAM;MACN,UAAU;KACZ,CAAC;KAGH,mBAAmB,iBAAiB,QACjC,OAAO,EAAE,GAAG,SAAS,cAAc,GAAG,SAAS,aAClD;IACF;IAEF,IAAI,CAAC,aACH,OAAO,MACL,EAAE,MAAM,aAAa,GACrB,kDACF;GAEJ;GAEA,KAAK,MAAM,gBAAgB,YAAY,OAAO,OAAO,GACnD,KAAK,MAAM,WAAW,aACpB,IAAI,UAAU,SAAS,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,YAAY,GAAG;IACzD,IACE,CAAC,iBAAiB,MACf,OAAO,GAAG,SAAS,gBAAgB,GAAG,SAAS,UAClD,GACA;KACA,OAAO,MACL;MAAE,MAAM;MAAc;KAAQ,GAC9B,2BACF;KACA,iBAAiB,KAAK;MACpB,MAAM;MACN,MAAM;KACR,CAAC;IACH;IAEA,mBAAmB,iBAAiB,QACjC,OAAO,EAAE,GAAG,SAAS,cAAc,GAAG,SAAS,aAClD;GACF;EAGN;CACF;CACA,OAAO;EAAE;EAAkB;CAAe;AAC5C;AAEA,eAA8B,2BAC5B,QACoD;CAMpD,IAAI,EAJD,QAAQ,OAAO,mBAAmB,KACjC,OAAO,oBAAoB,SAAS,KACrC,QAAQ,OAAO,gBAAgB,KAAK,OAAO,iBAAiB,SAAS,IAElD;EAEpB,OAAO,MAAM,0DAA0D;EACvE,OAAO;CACT;CAEA,MAAM,wBAA+C,CACnD;EACE,SAAS,OAAO;EAChB,SAAS,OAAO,SAAS,KAAK,EAAE,cAAc,OAAO,CAAC,CAAC,KAAK,GAAG;EAC/D,YAAY,OAAO;EACnB,kBACE,OAAO,iBAAkB,kBAAkB,WACvC,OAAO,mBACP,KAAA;CACR,CACF;CAQA,MAAM,EAAE,kBAAkB,mBACxB,MAAM,4BAP6C,OAAO,SAAS,QAClE,EAAE,uBACD,CAAC,kBAAkB,iBACnB,iBAAiB,kBAAkB,QAIiB,GAAG,MAAM;CACjE,OAAO,4BAA4B,uBAAuB;EACxD,GAAG;EACH;EACA;CACF,CAAC;AACH"}
|
|
@@ -351,7 +351,7 @@ async function checkForPendingVersions(manager, packageFileName, packageFileCont
|
|
|
351
351
|
manager,
|
|
352
352
|
branchName: config.branchName,
|
|
353
353
|
depName: dep.depName
|
|
354
|
-
},
|
|
354
|
+
}, "No depName found after updating package file");
|
|
355
355
|
throw new Error(WORKER_FILE_UPDATE_FAILED);
|
|
356
356
|
}
|
|
357
357
|
const upgradeInfo = depNameToUpgradeInfo.get(depName);
|
|
@@ -363,7 +363,7 @@ async function checkForPendingVersions(manager, packageFileName, packageFileCont
|
|
|
363
363
|
manager,
|
|
364
364
|
branchName: config.branchName,
|
|
365
365
|
depName
|
|
366
|
-
},
|
|
366
|
+
}, "Could not determine resolved version after updating package file; skipping pending-version check");
|
|
367
367
|
continue;
|
|
368
368
|
}
|
|
369
369
|
if (resolvedVersion && upgradeInfo.pendingVersions.has(resolvedVersion)) {
|
|
@@ -377,7 +377,7 @@ async function checkForPendingVersions(manager, packageFileName, packageFileCont
|
|
|
377
377
|
depName,
|
|
378
378
|
newVersion: resolvedVersion,
|
|
379
379
|
expectedVersion
|
|
380
|
-
},
|
|
380
|
+
}, "No expectedVersion found after updating package file");
|
|
381
381
|
continue;
|
|
382
382
|
}
|
|
383
383
|
if (config.minimumReleaseAgeBehaviour === "timestamp-optional") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-updated.js","names":[],"sources":["../../../../../lib/workers/repository/update/branch/get-updated.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { WORKER_FILE_UPDATE_FAILED } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { extractPackageFile, get } from '../../../../modules/manager/index.ts';\nimport type {\n ArtifactError,\n ArtifactNotice,\n PackageFile,\n UpdateArtifact,\n UpdateArtifactsConfig,\n UpdateArtifactsResult,\n} from '../../../../modules/manager/types.ts';\nimport { getFile } from '../../../../util/git/index.ts';\nimport type { FileAddition, FileChange } from '../../../../util/git/types.ts';\nimport { coerceString } from '../../../../util/string.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../types.ts';\nimport { doAutoReplace } from './auto-replace.ts';\n\nexport interface PackageFilesResult {\n artifactErrors: ArtifactError[];\n reuseExistingBranch?: boolean;\n updatedPackageFiles: FileChange[];\n updatedArtifacts: FileChange[];\n artifactNotices: ArtifactNotice[];\n}\n\nasync function getFileContent(\n updatedFileContents: Record<string, string>,\n filePath: string,\n config: BranchConfig,\n): Promise<string | null> {\n let fileContent: string | null = updatedFileContents[filePath];\n if (!fileContent) {\n fileContent = await getFile(\n filePath,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n }\n return fileContent;\n}\n\nfunction sortPackageFiles(\n config: BranchConfig,\n manager: string,\n packageFiles: FilePath[],\n): void {\n const managerPackageFiles = config.packageFiles?.[manager];\n if (!managerPackageFiles) {\n return;\n }\n packageFiles.sort((lhs, rhs) => {\n const lhsIndex = managerPackageFiles.findIndex(\n (entry) => entry.packageFile === lhs.path,\n );\n const rhsIndex = managerPackageFiles.findIndex(\n (entry) => entry.packageFile === rhs.path,\n );\n return lhsIndex - rhsIndex;\n });\n}\n\nfunction hasAny(set: Set<string>, targets: Iterable<string>): boolean {\n for (const target of targets) {\n if (set.has(target)) {\n return true;\n }\n }\n return false;\n}\n\ntype FilePath = Pick<FileChange, 'path'>;\n\nfunction getManagersForPackageFiles<T extends FilePath>(\n packageFiles: T[],\n managerPackageFiles: Record<string, Set<string>>,\n): Set<string> {\n const packageFileNames = packageFiles.map((packageFile) => packageFile.path);\n return new Set(\n Object.keys(managerPackageFiles).filter((manager) =>\n hasAny(managerPackageFiles[manager], packageFileNames),\n ),\n );\n}\n\nfunction getPackageFilesForManager<T extends FilePath>(\n packageFiles: T[],\n managerPackageFiles: Set<string>,\n): T[] {\n return packageFiles.filter((packageFile) =>\n managerPackageFiles.has(packageFile.path),\n );\n}\n\nexport async function getUpdatedPackageFiles(\n config: BranchConfig,\n): Promise<PackageFilesResult> {\n logger.trace({ config });\n const reuseExistingBranch = config.reuseExistingBranch!;\n logger.debug(\n `manager.getUpdatedPackageFiles() reuseExistingBranch=${reuseExistingBranch}`,\n );\n let updatedFileContents: Record<string, string> = {};\n const nonUpdatedFileContents: Record<string, string> = {};\n const managerPackageFiles: Record<string, Set<string>> = {};\n const packageFileUpdatedDeps: Record<string, BranchUpgradeConfig[]> = {};\n const lockFileMaintenanceFiles: string[] = [];\n let firstUpdate = true;\n for (const upgrade of config.upgrades) {\n const manager = upgrade.manager;\n const packageFile = upgrade.packageFile!;\n const depName = upgrade.depName!;\n // TODO: fix types, can be undefined (#22198)\n const newVersion = upgrade.newVersion!;\n const currentVersion = upgrade.currentVersion!;\n const updateLockedDependency = get(manager, 'updateLockedDependency')!;\n managerPackageFiles[manager] ??= new Set<string>();\n managerPackageFiles[manager].add(packageFile);\n packageFileUpdatedDeps[packageFile] ??= [];\n packageFileUpdatedDeps[packageFile].push({ ...upgrade });\n const packageFileContent = await getFileContent(\n updatedFileContents,\n packageFile,\n config,\n );\n let lockFileContent: string | null = null;\n const lockFile = upgrade.lockFile ?? upgrade.lockFiles?.[0] ?? '';\n if (lockFile) {\n lockFileContent = await getFileContent(\n updatedFileContents,\n lockFile,\n config,\n );\n }\n // istanbul ignore if\n if (\n reuseExistingBranch &&\n (!packageFileContent || (lockFile && !lockFileContent))\n ) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing branch after file not found',\n );\n return getUpdatedPackageFiles({\n ...config,\n reuseExistingBranch: false,\n });\n }\n if (upgrade.updateType === 'lockFileMaintenance') {\n lockFileMaintenanceFiles.push(packageFile);\n } else if (upgrade.isRemediation) {\n const { status, files } = await updateLockedDependency({\n ...upgrade,\n depName,\n newVersion,\n currentVersion,\n packageFile,\n packageFileContent: packageFileContent!,\n lockFile,\n lockFileContent: lockFileContent!,\n allowParentUpdates: true,\n allowHigherOrRemoved: true,\n });\n if (reuseExistingBranch && status !== 'already-updated') {\n logger.debug(\n { lockFile, depName, status },\n 'Need to retry branch as it is not already up-to-date',\n );\n return getUpdatedPackageFiles({\n ...config,\n reuseExistingBranch: false,\n });\n }\n if (files) {\n updatedFileContents = { ...updatedFileContents, ...files };\n Object.keys(files).forEach(\n (file) => delete nonUpdatedFileContents[file],\n );\n }\n if (status === 'update-failed' || status === 'unsupported') {\n upgrade.remediationNotPossible = true;\n }\n } else if (upgrade.isLockfileUpdate) {\n if (updateLockedDependency) {\n const { status, files } = await updateLockedDependency({\n ...upgrade,\n depName,\n newVersion,\n currentVersion,\n packageFile,\n packageFileContent: packageFileContent!,\n lockFile,\n lockFileContent: lockFileContent!,\n allowParentUpdates: false,\n });\n if (status === 'unsupported') {\n // incompatible lock file\n if (!updatedFileContents[packageFile]) {\n nonUpdatedFileContents[packageFile] = packageFileContent!;\n }\n } else if (status === 'already-updated') {\n logger.debug(\n `Upgrade of ${depName} to ${newVersion} is already done in existing branch`,\n );\n } else {\n // something changed\n if (reuseExistingBranch) {\n logger.debug(\n { lockFile, depName, status },\n 'Need to retry branch as upgrade requirements are not mets',\n );\n return getUpdatedPackageFiles({\n ...config,\n reuseExistingBranch: false,\n });\n }\n if (files) {\n updatedFileContents = { ...updatedFileContents, ...files };\n Object.keys(files).forEach(\n (file) => delete nonUpdatedFileContents[file],\n );\n }\n }\n } else {\n logger.debug(\n { manager },\n 'isLockFileUpdate without updateLockedDependency',\n );\n if (!updatedFileContents[packageFile]) {\n nonUpdatedFileContents[packageFile] = packageFileContent!;\n }\n }\n } else {\n const updateDependency = get(manager, 'updateDependency');\n if (!updateDependency) {\n let res = await doAutoReplace(\n upgrade,\n packageFileContent!,\n reuseExistingBranch,\n firstUpdate,\n );\n firstUpdate = false;\n if (res) {\n res = await applyManagerBumpPackageVersion(res, upgrade);\n if (res === packageFileContent) {\n logger.debug({ packageFile, depName }, 'No content changed');\n } else {\n logger.debug({ packageFile, depName }, 'Contents updated');\n updatedFileContents[packageFile] = res!;\n delete nonUpdatedFileContents[packageFile];\n }\n continue;\n } else if (reuseExistingBranch) {\n return getUpdatedPackageFiles({\n ...config,\n reuseExistingBranch: false,\n });\n }\n logger.error({ packageFile, depName }, 'Could not autoReplace');\n throw new Error(WORKER_FILE_UPDATE_FAILED);\n }\n let newContent = await updateDependency({\n packageFile,\n fileContent: packageFileContent!,\n upgrade,\n });\n newContent = await applyManagerBumpPackageVersion(newContent, upgrade);\n if (!newContent) {\n if (reuseExistingBranch) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing branch after error updating content',\n );\n return getUpdatedPackageFiles({\n ...config,\n reuseExistingBranch: false,\n });\n }\n logger.debug(\n { existingContent: packageFileContent, config: upgrade },\n 'Error updating file',\n );\n throw new Error(WORKER_FILE_UPDATE_FAILED);\n }\n if (newContent !== packageFileContent) {\n if (reuseExistingBranch) {\n // This ensure it's always 1 commit from the bot\n logger.debug(\n { packageFile, depName },\n 'Need to update package file so will rebase first',\n );\n return getUpdatedPackageFiles({\n ...config,\n reuseExistingBranch: false,\n });\n }\n logger.debug(\n `Updating ${depName} in ${coerceString(packageFile, lockFile)}`,\n );\n updatedFileContents[packageFile] = newContent;\n delete nonUpdatedFileContents[packageFile];\n }\n if (\n newContent === packageFileContent &&\n upgrade.manager === 'git-submodules'\n ) {\n updatedFileContents[packageFile] = newContent;\n delete nonUpdatedFileContents[packageFile];\n }\n }\n }\n const updatedPackageFiles: FileAddition[] = Object.keys(\n updatedFileContents,\n ).map((name) => ({\n type: 'addition',\n path: name,\n contents: updatedFileContents[name],\n }));\n const updatedArtifacts: FileChange[] = [];\n const artifactErrors: ArtifactError[] = [];\n const artifactNotices: ArtifactNotice[] = [];\n if (isNonEmptyArray(updatedPackageFiles)) {\n logger.debug('updateArtifacts for updatedPackageFiles');\n const updatedPackageFileManagers = getManagersForPackageFiles(\n updatedPackageFiles,\n managerPackageFiles,\n );\n for (const manager of updatedPackageFileManagers) {\n const packageFilesForManager = getPackageFilesForManager(\n updatedPackageFiles,\n managerPackageFiles[manager],\n );\n sortPackageFiles(config, manager, packageFilesForManager);\n for (const packageFile of packageFilesForManager) {\n const updatedDeps = packageFileUpdatedDeps[packageFile.path];\n const results = await managerUpdateArtifacts(manager, {\n packageFileName: packageFile.path,\n updatedDeps,\n // TODO #22198\n newPackageFileContent: packageFile.contents!.toString(),\n config: patchConfigForArtifactsUpdate(\n config,\n manager,\n packageFile.path,\n ),\n });\n processUpdateArtifactResults(\n results,\n updatedArtifacts,\n artifactErrors,\n artifactNotices,\n );\n if (isNonEmptyArray(results)) {\n await checkForPendingVersions(\n manager,\n packageFile.path,\n packageFile.contents!.toString(),\n updatedDeps,\n artifactErrors,\n config,\n );\n }\n }\n }\n }\n const nonUpdatedPackageFiles: FileAddition[] = Object.keys(\n nonUpdatedFileContents,\n ).map((name) => ({\n type: 'addition',\n path: name,\n contents: nonUpdatedFileContents[name],\n }));\n if (isNonEmptyArray(nonUpdatedPackageFiles)) {\n logger.debug('updateArtifacts for nonUpdatedPackageFiles');\n const nonUpdatedPackageFileManagers = getManagersForPackageFiles(\n nonUpdatedPackageFiles,\n managerPackageFiles,\n );\n for (const manager of nonUpdatedPackageFileManagers) {\n const packageFilesForManager = getPackageFilesForManager(\n nonUpdatedPackageFiles,\n managerPackageFiles[manager],\n );\n sortPackageFiles(config, manager, packageFilesForManager);\n for (const packageFile of packageFilesForManager) {\n const updatedDeps = packageFileUpdatedDeps[packageFile.path];\n const results = await managerUpdateArtifacts(manager, {\n packageFileName: packageFile.path,\n updatedDeps,\n // TODO #22198\n newPackageFileContent: packageFile.contents!.toString(),\n config: patchConfigForArtifactsUpdate(\n config,\n manager,\n packageFile.path,\n ),\n });\n processUpdateArtifactResults(\n results,\n updatedArtifacts,\n artifactErrors,\n artifactNotices,\n );\n if (isNonEmptyArray(results)) {\n updatedPackageFiles.push(packageFile);\n await checkForPendingVersions(\n manager,\n packageFile.path,\n packageFile.contents!.toString(),\n updatedDeps,\n artifactErrors,\n config,\n );\n }\n }\n }\n }\n if (!reuseExistingBranch) {\n const lockFileMaintenancePackageFiles: FilePath[] =\n lockFileMaintenanceFiles.map((name) => ({\n path: name,\n }));\n // Only perform lock file maintenance if it's a fresh commit\n if (isNonEmptyArray(lockFileMaintenanceFiles)) {\n logger.debug('updateArtifacts for lockFileMaintenanceFiles');\n const lockFileMaintenanceManagers = getManagersForPackageFiles(\n lockFileMaintenancePackageFiles,\n managerPackageFiles,\n );\n for (const manager of lockFileMaintenanceManagers) {\n const packageFilesForManager = getPackageFilesForManager(\n lockFileMaintenancePackageFiles,\n managerPackageFiles[manager],\n );\n sortPackageFiles(config, manager, packageFilesForManager);\n for (const packageFile of packageFilesForManager) {\n const contents =\n updatedFileContents[packageFile.path] ||\n (await getFile(packageFile.path, config.baseBranch));\n const results = await managerUpdateArtifacts(manager, {\n packageFileName: packageFile.path,\n updatedDeps: [],\n newPackageFileContent: contents!,\n config: patchConfigForArtifactsUpdate(\n config,\n manager,\n packageFile.path,\n ),\n });\n processUpdateArtifactResults(\n results,\n updatedArtifacts,\n artifactErrors,\n artifactNotices,\n );\n }\n }\n }\n }\n return {\n reuseExistingBranch, // Need to overwrite original config\n updatedPackageFiles,\n updatedArtifacts,\n artifactErrors,\n artifactNotices,\n };\n}\n\n// workaround, see #27319\nfunction patchConfigForArtifactsUpdate(\n config: BranchConfig,\n manager: string,\n packageFileName: string,\n): UpdateArtifactsConfig {\n // drop any lockFiles that happen to be defined on the branch config\n const updatedConfig = { ...config };\n delete updatedConfig.lockFiles;\n if (isNonEmptyArray(updatedConfig.packageFiles?.[manager])) {\n const managerPackageFiles: PackageFile[] =\n updatedConfig.packageFiles?.[manager];\n const packageFile = managerPackageFiles.find(\n (p) => p.packageFile === packageFileName,\n );\n if (packageFile && isNonEmptyArray(packageFile.lockFiles)) {\n updatedConfig.lockFiles = packageFile.lockFiles;\n }\n }\n return updatedConfig;\n}\n\nasync function managerUpdateArtifacts(\n manager: string,\n updateArtifact: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n const updateArtifacts = get(manager, 'updateArtifacts');\n if (!updateArtifacts) {\n return null;\n }\n\n if (updateArtifact.config.skipArtifactsUpdate) {\n logger.debug(\n { manager, packageFileName: updateArtifact.packageFileName },\n 'Skipping artifact update',\n );\n return null;\n }\n\n return await updateArtifacts(updateArtifact);\n}\n\nfunction processUpdateArtifactResults(\n results: UpdateArtifactsResult[] | null,\n updatedArtifacts: FileChange[],\n artifactErrors: ArtifactError[],\n artifactNotices: ArtifactNotice[],\n): void {\n if (isNonEmptyArray(results)) {\n for (const res of results) {\n const { file, notice, artifactError } = res;\n if (file) {\n updatedArtifacts.push(file);\n }\n\n if (artifactError) {\n artifactErrors.push(artifactError);\n }\n\n if (notice) {\n artifactNotices.push(notice);\n }\n }\n }\n}\n\n/**\n * When using Minimum Release Age, and a package manager that doesn't support being told an explicit version to update to (#41624) it is possible that an artifact update leads to a different version of a dependency being used compared to what Renovate is expecting.\n *\n * We should report these cases more explicitly with an Artifact Error, to allow the reviewers to decide what to do with the changes.\n */\nasync function checkForPendingVersions(\n manager: string,\n packageFileName: string,\n packageFileContent: string,\n updatedDeps: BranchUpgradeConfig[],\n artifactErrors: ArtifactError[],\n config: BranchConfig,\n): Promise<void> {\n const depNameToUpgradeInfo = new Map<\n string,\n {\n pendingVersions: Set<string>;\n newVersion: string | undefined;\n }\n >();\n for (const dep of updatedDeps) {\n if (dep.depName && isNonEmptyArray(dep.pendingVersions)) {\n depNameToUpgradeInfo.set(dep.depName, {\n pendingVersions: new Set(dep.pendingVersions),\n newVersion: dep.newVersion,\n });\n }\n }\n if (!depNameToUpgradeInfo.size) {\n return;\n }\n\n const extracted = await extractPackageFile(\n manager,\n packageFileContent,\n packageFileName,\n config,\n );\n if (!extracted) {\n logger.warn(\n { packageFile: packageFileName, manager },\n 'Could not re-extract the packageFile after updating it',\n );\n return;\n }\n\n for (const dep of extracted.deps) {\n const depName = dep.depName ?? dep.packageName;\n // shouldn't ever happen\n if (!depName) {\n logger.error(\n {\n packageFile: packageFileName,\n manager,\n branchName: config.branchName,\n depName: dep.depName,\n },\n `No depName found after updating '${packageFileName}'`,\n );\n throw new Error(WORKER_FILE_UPDATE_FAILED);\n }\n\n const upgradeInfo = depNameToUpgradeInfo.get(depName);\n if (!upgradeInfo) {\n continue;\n }\n const resolvedVersion =\n dep.lockedVersion ??\n dep.newVersion ??\n dep.currentVersion ??\n dep.currentValue;\n if (!resolvedVersion) {\n logger.warn(\n {\n packageFile: packageFileName,\n manager,\n branchName: config.branchName,\n depName,\n },\n `Could not determine resolved version for '${depName}' after updating '${packageFileName}'; skipping pending-version check`,\n );\n continue;\n }\n\n if (resolvedVersion && upgradeInfo.pendingVersions.has(resolvedVersion)) {\n const expectedVersion = upgradeInfo.newVersion;\n /* v8 ignore next if -- should not happen */\n if (!expectedVersion) {\n logger.error(\n {\n packageFile: packageFileName,\n manager,\n branchName: config.branchName,\n depName,\n newVersion: resolvedVersion,\n expectedVersion,\n },\n `No expectedVersion found for '${depName}' after updating '${packageFileName}'`,\n );\n continue;\n }\n\n if (config.minimumReleaseAgeBehaviour === 'timestamp-optional') {\n logger.once.warn(\n {\n packageFileName,\n depName,\n expectedVersion,\n resolvedVersion,\n },\n \"Artifact error would be reported due to a pending version in use which hasn't passed Minimum Release Age, but as we're running with minimumReleaseAgeBehaviour=timestamp-optional, proceeding. See debug logs for more information\",\n );\n continue;\n }\n\n logger.debug(\n {\n packageFileName,\n depName,\n expectedVersion,\n resolvedVersion,\n },\n 'Artifact update introduced a pending version',\n );\n let stderr = `Artifact update for ${depName} resolved to version ${resolvedVersion}, which is a pending version that has not yet passed the Minimum Release Age threshold.`;\n stderr += `\\nRenovate was attempting to update to ${expectedVersion}`;\n stderr += `\\nThis is (likely) not a bug in Renovate, but due to the way your project pins dependencies, _and_ how Renovate calls your package manager to update them.\\nUntil Renovate supports specifying an exact update to your package manager (https://github.com/renovatebot/renovate/issues/41624), it is recommended to directly pin your dependencies (with \\`rangeStrategy=pin\\` for apps, or \\`rangeStrategy=widen\\` for libraries)\\nSee also: ${GlobalConfig.get('productLinks').documentation}dependency-pinning/`;\n\n artifactErrors.push({\n fileName: packageFileName,\n stderr,\n });\n }\n }\n}\n\nasync function applyManagerBumpPackageVersion(\n packageFileContent: string | null,\n upgrade: BranchUpgradeConfig,\n): Promise<string | null> {\n const bumpPackageVersion = get(upgrade.manager, 'bumpPackageVersion');\n if (\n !bumpPackageVersion ||\n !packageFileContent ||\n !upgrade.bumpVersion ||\n !upgrade.packageFileVersion\n ) {\n return packageFileContent;\n }\n\n const result = await bumpPackageVersion(\n packageFileContent,\n upgrade.packageFileVersion,\n upgrade.bumpVersion,\n upgrade.packageFile!,\n );\n\n return result.bumpedContent;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"get-updated.js","names":[],"sources":["../../../../../lib/workers/repository/update/branch/get-updated.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { WORKER_FILE_UPDATE_FAILED } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { extractPackageFile, get } from '../../../../modules/manager/index.ts';\nimport type {\n ArtifactError,\n ArtifactNotice,\n PackageFile,\n UpdateArtifact,\n UpdateArtifactsConfig,\n UpdateArtifactsResult,\n} from '../../../../modules/manager/types.ts';\nimport { getFile } from '../../../../util/git/index.ts';\nimport type { FileAddition, FileChange } from '../../../../util/git/types.ts';\nimport { coerceString } from '../../../../util/string.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../types.ts';\nimport { doAutoReplace } from './auto-replace.ts';\n\nexport interface PackageFilesResult {\n artifactErrors: ArtifactError[];\n reuseExistingBranch?: boolean;\n updatedPackageFiles: FileChange[];\n updatedArtifacts: FileChange[];\n artifactNotices: ArtifactNotice[];\n}\n\nasync function getFileContent(\n updatedFileContents: Record<string, string>,\n filePath: string,\n config: BranchConfig,\n): Promise<string | null> {\n let fileContent: string | null = updatedFileContents[filePath];\n if (!fileContent) {\n fileContent = await getFile(\n filePath,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n }\n return fileContent;\n}\n\nfunction sortPackageFiles(\n config: BranchConfig,\n manager: string,\n packageFiles: FilePath[],\n): void {\n const managerPackageFiles = config.packageFiles?.[manager];\n if (!managerPackageFiles) {\n return;\n }\n packageFiles.sort((lhs, rhs) => {\n const lhsIndex = managerPackageFiles.findIndex(\n (entry) => entry.packageFile === lhs.path,\n );\n const rhsIndex = managerPackageFiles.findIndex(\n (entry) => entry.packageFile === rhs.path,\n );\n return lhsIndex - rhsIndex;\n });\n}\n\nfunction hasAny(set: Set<string>, targets: Iterable<string>): boolean {\n for (const target of targets) {\n if (set.has(target)) {\n return true;\n }\n }\n return false;\n}\n\ntype FilePath = Pick<FileChange, 'path'>;\n\nfunction getManagersForPackageFiles<T extends FilePath>(\n packageFiles: T[],\n managerPackageFiles: Record<string, Set<string>>,\n): Set<string> {\n const packageFileNames = packageFiles.map((packageFile) => packageFile.path);\n return new Set(\n Object.keys(managerPackageFiles).filter((manager) =>\n hasAny(managerPackageFiles[manager], packageFileNames),\n ),\n );\n}\n\nfunction getPackageFilesForManager<T extends FilePath>(\n packageFiles: T[],\n managerPackageFiles: Set<string>,\n): T[] {\n return packageFiles.filter((packageFile) =>\n managerPackageFiles.has(packageFile.path),\n );\n}\n\nexport async function getUpdatedPackageFiles(\n config: BranchConfig,\n): Promise<PackageFilesResult> {\n logger.trace({ config });\n const reuseExistingBranch = config.reuseExistingBranch!;\n logger.debug(\n `manager.getUpdatedPackageFiles() reuseExistingBranch=${reuseExistingBranch}`,\n );\n let updatedFileContents: Record<string, string> = {};\n const nonUpdatedFileContents: Record<string, string> = {};\n const managerPackageFiles: Record<string, Set<string>> = {};\n const packageFileUpdatedDeps: Record<string, BranchUpgradeConfig[]> = {};\n const lockFileMaintenanceFiles: string[] = [];\n let firstUpdate = true;\n for (const upgrade of config.upgrades) {\n const manager = upgrade.manager;\n const packageFile = upgrade.packageFile!;\n const depName = upgrade.depName!;\n // TODO: fix types, can be undefined (#22198)\n const newVersion = upgrade.newVersion!;\n const currentVersion = upgrade.currentVersion!;\n const updateLockedDependency = get(manager, 'updateLockedDependency')!;\n managerPackageFiles[manager] ??= new Set<string>();\n managerPackageFiles[manager].add(packageFile);\n packageFileUpdatedDeps[packageFile] ??= [];\n packageFileUpdatedDeps[packageFile].push({ ...upgrade });\n const packageFileContent = await getFileContent(\n updatedFileContents,\n packageFile,\n config,\n );\n let lockFileContent: string | null = null;\n const lockFile = upgrade.lockFile ?? upgrade.lockFiles?.[0] ?? '';\n if (lockFile) {\n lockFileContent = await getFileContent(\n updatedFileContents,\n lockFile,\n config,\n );\n }\n // istanbul ignore if\n if (\n reuseExistingBranch &&\n (!packageFileContent || (lockFile && !lockFileContent))\n ) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing branch after file not found',\n );\n return getUpdatedPackageFiles({\n ...config,\n reuseExistingBranch: false,\n });\n }\n if (upgrade.updateType === 'lockFileMaintenance') {\n lockFileMaintenanceFiles.push(packageFile);\n } else if (upgrade.isRemediation) {\n const { status, files } = await updateLockedDependency({\n ...upgrade,\n depName,\n newVersion,\n currentVersion,\n packageFile,\n packageFileContent: packageFileContent!,\n lockFile,\n lockFileContent: lockFileContent!,\n allowParentUpdates: true,\n allowHigherOrRemoved: true,\n });\n if (reuseExistingBranch && status !== 'already-updated') {\n logger.debug(\n { lockFile, depName, status },\n 'Need to retry branch as it is not already up-to-date',\n );\n return getUpdatedPackageFiles({\n ...config,\n reuseExistingBranch: false,\n });\n }\n if (files) {\n updatedFileContents = { ...updatedFileContents, ...files };\n Object.keys(files).forEach(\n (file) => delete nonUpdatedFileContents[file],\n );\n }\n if (status === 'update-failed' || status === 'unsupported') {\n upgrade.remediationNotPossible = true;\n }\n } else if (upgrade.isLockfileUpdate) {\n if (updateLockedDependency) {\n const { status, files } = await updateLockedDependency({\n ...upgrade,\n depName,\n newVersion,\n currentVersion,\n packageFile,\n packageFileContent: packageFileContent!,\n lockFile,\n lockFileContent: lockFileContent!,\n allowParentUpdates: false,\n });\n if (status === 'unsupported') {\n // incompatible lock file\n if (!updatedFileContents[packageFile]) {\n nonUpdatedFileContents[packageFile] = packageFileContent!;\n }\n } else if (status === 'already-updated') {\n logger.debug(\n `Upgrade of ${depName} to ${newVersion} is already done in existing branch`,\n );\n } else {\n // something changed\n if (reuseExistingBranch) {\n logger.debug(\n { lockFile, depName, status },\n 'Need to retry branch as upgrade requirements are not mets',\n );\n return getUpdatedPackageFiles({\n ...config,\n reuseExistingBranch: false,\n });\n }\n if (files) {\n updatedFileContents = { ...updatedFileContents, ...files };\n Object.keys(files).forEach(\n (file) => delete nonUpdatedFileContents[file],\n );\n }\n }\n } else {\n logger.debug(\n { manager },\n 'isLockFileUpdate without updateLockedDependency',\n );\n if (!updatedFileContents[packageFile]) {\n nonUpdatedFileContents[packageFile] = packageFileContent!;\n }\n }\n } else {\n const updateDependency = get(manager, 'updateDependency');\n if (!updateDependency) {\n let res = await doAutoReplace(\n upgrade,\n packageFileContent!,\n reuseExistingBranch,\n firstUpdate,\n );\n firstUpdate = false;\n if (res) {\n res = await applyManagerBumpPackageVersion(res, upgrade);\n if (res === packageFileContent) {\n logger.debug({ packageFile, depName }, 'No content changed');\n } else {\n logger.debug({ packageFile, depName }, 'Contents updated');\n updatedFileContents[packageFile] = res!;\n delete nonUpdatedFileContents[packageFile];\n }\n continue;\n } else if (reuseExistingBranch) {\n return getUpdatedPackageFiles({\n ...config,\n reuseExistingBranch: false,\n });\n }\n logger.error({ packageFile, depName }, 'Could not autoReplace');\n throw new Error(WORKER_FILE_UPDATE_FAILED);\n }\n let newContent = await updateDependency({\n packageFile,\n fileContent: packageFileContent!,\n upgrade,\n });\n newContent = await applyManagerBumpPackageVersion(newContent, upgrade);\n if (!newContent) {\n if (reuseExistingBranch) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing branch after error updating content',\n );\n return getUpdatedPackageFiles({\n ...config,\n reuseExistingBranch: false,\n });\n }\n logger.debug(\n { existingContent: packageFileContent, config: upgrade },\n 'Error updating file',\n );\n throw new Error(WORKER_FILE_UPDATE_FAILED);\n }\n if (newContent !== packageFileContent) {\n if (reuseExistingBranch) {\n // This ensure it's always 1 commit from the bot\n logger.debug(\n { packageFile, depName },\n 'Need to update package file so will rebase first',\n );\n return getUpdatedPackageFiles({\n ...config,\n reuseExistingBranch: false,\n });\n }\n logger.debug(\n `Updating ${depName} in ${coerceString(packageFile, lockFile)}`,\n );\n updatedFileContents[packageFile] = newContent;\n delete nonUpdatedFileContents[packageFile];\n }\n if (\n newContent === packageFileContent &&\n upgrade.manager === 'git-submodules'\n ) {\n updatedFileContents[packageFile] = newContent;\n delete nonUpdatedFileContents[packageFile];\n }\n }\n }\n const updatedPackageFiles: FileAddition[] = Object.keys(\n updatedFileContents,\n ).map((name) => ({\n type: 'addition',\n path: name,\n contents: updatedFileContents[name],\n }));\n const updatedArtifacts: FileChange[] = [];\n const artifactErrors: ArtifactError[] = [];\n const artifactNotices: ArtifactNotice[] = [];\n if (isNonEmptyArray(updatedPackageFiles)) {\n logger.debug('updateArtifacts for updatedPackageFiles');\n const updatedPackageFileManagers = getManagersForPackageFiles(\n updatedPackageFiles,\n managerPackageFiles,\n );\n for (const manager of updatedPackageFileManagers) {\n const packageFilesForManager = getPackageFilesForManager(\n updatedPackageFiles,\n managerPackageFiles[manager],\n );\n sortPackageFiles(config, manager, packageFilesForManager);\n for (const packageFile of packageFilesForManager) {\n const updatedDeps = packageFileUpdatedDeps[packageFile.path];\n const results = await managerUpdateArtifacts(manager, {\n packageFileName: packageFile.path,\n updatedDeps,\n // TODO #22198\n newPackageFileContent: packageFile.contents!.toString(),\n config: patchConfigForArtifactsUpdate(\n config,\n manager,\n packageFile.path,\n ),\n });\n processUpdateArtifactResults(\n results,\n updatedArtifacts,\n artifactErrors,\n artifactNotices,\n );\n if (isNonEmptyArray(results)) {\n await checkForPendingVersions(\n manager,\n packageFile.path,\n packageFile.contents!.toString(),\n updatedDeps,\n artifactErrors,\n config,\n );\n }\n }\n }\n }\n const nonUpdatedPackageFiles: FileAddition[] = Object.keys(\n nonUpdatedFileContents,\n ).map((name) => ({\n type: 'addition',\n path: name,\n contents: nonUpdatedFileContents[name],\n }));\n if (isNonEmptyArray(nonUpdatedPackageFiles)) {\n logger.debug('updateArtifacts for nonUpdatedPackageFiles');\n const nonUpdatedPackageFileManagers = getManagersForPackageFiles(\n nonUpdatedPackageFiles,\n managerPackageFiles,\n );\n for (const manager of nonUpdatedPackageFileManagers) {\n const packageFilesForManager = getPackageFilesForManager(\n nonUpdatedPackageFiles,\n managerPackageFiles[manager],\n );\n sortPackageFiles(config, manager, packageFilesForManager);\n for (const packageFile of packageFilesForManager) {\n const updatedDeps = packageFileUpdatedDeps[packageFile.path];\n const results = await managerUpdateArtifacts(manager, {\n packageFileName: packageFile.path,\n updatedDeps,\n // TODO #22198\n newPackageFileContent: packageFile.contents!.toString(),\n config: patchConfigForArtifactsUpdate(\n config,\n manager,\n packageFile.path,\n ),\n });\n processUpdateArtifactResults(\n results,\n updatedArtifacts,\n artifactErrors,\n artifactNotices,\n );\n if (isNonEmptyArray(results)) {\n updatedPackageFiles.push(packageFile);\n await checkForPendingVersions(\n manager,\n packageFile.path,\n packageFile.contents!.toString(),\n updatedDeps,\n artifactErrors,\n config,\n );\n }\n }\n }\n }\n if (!reuseExistingBranch) {\n const lockFileMaintenancePackageFiles: FilePath[] =\n lockFileMaintenanceFiles.map((name) => ({\n path: name,\n }));\n // Only perform lock file maintenance if it's a fresh commit\n if (isNonEmptyArray(lockFileMaintenanceFiles)) {\n logger.debug('updateArtifacts for lockFileMaintenanceFiles');\n const lockFileMaintenanceManagers = getManagersForPackageFiles(\n lockFileMaintenancePackageFiles,\n managerPackageFiles,\n );\n for (const manager of lockFileMaintenanceManagers) {\n const packageFilesForManager = getPackageFilesForManager(\n lockFileMaintenancePackageFiles,\n managerPackageFiles[manager],\n );\n sortPackageFiles(config, manager, packageFilesForManager);\n for (const packageFile of packageFilesForManager) {\n const contents =\n updatedFileContents[packageFile.path] ||\n (await getFile(packageFile.path, config.baseBranch));\n const results = await managerUpdateArtifacts(manager, {\n packageFileName: packageFile.path,\n updatedDeps: [],\n newPackageFileContent: contents!,\n config: patchConfigForArtifactsUpdate(\n config,\n manager,\n packageFile.path,\n ),\n });\n processUpdateArtifactResults(\n results,\n updatedArtifacts,\n artifactErrors,\n artifactNotices,\n );\n }\n }\n }\n }\n return {\n reuseExistingBranch, // Need to overwrite original config\n updatedPackageFiles,\n updatedArtifacts,\n artifactErrors,\n artifactNotices,\n };\n}\n\n// workaround, see #27319\nfunction patchConfigForArtifactsUpdate(\n config: BranchConfig,\n manager: string,\n packageFileName: string,\n): UpdateArtifactsConfig {\n // drop any lockFiles that happen to be defined on the branch config\n const updatedConfig = { ...config };\n delete updatedConfig.lockFiles;\n if (isNonEmptyArray(updatedConfig.packageFiles?.[manager])) {\n const managerPackageFiles: PackageFile[] =\n updatedConfig.packageFiles?.[manager];\n const packageFile = managerPackageFiles.find(\n (p) => p.packageFile === packageFileName,\n );\n if (packageFile && isNonEmptyArray(packageFile.lockFiles)) {\n updatedConfig.lockFiles = packageFile.lockFiles;\n }\n }\n return updatedConfig;\n}\n\nasync function managerUpdateArtifacts(\n manager: string,\n updateArtifact: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n const updateArtifacts = get(manager, 'updateArtifacts');\n if (!updateArtifacts) {\n return null;\n }\n\n if (updateArtifact.config.skipArtifactsUpdate) {\n logger.debug(\n { manager, packageFileName: updateArtifact.packageFileName },\n 'Skipping artifact update',\n );\n return null;\n }\n\n return await updateArtifacts(updateArtifact);\n}\n\nfunction processUpdateArtifactResults(\n results: UpdateArtifactsResult[] | null,\n updatedArtifacts: FileChange[],\n artifactErrors: ArtifactError[],\n artifactNotices: ArtifactNotice[],\n): void {\n if (isNonEmptyArray(results)) {\n for (const res of results) {\n const { file, notice, artifactError } = res;\n if (file) {\n updatedArtifacts.push(file);\n }\n\n if (artifactError) {\n artifactErrors.push(artifactError);\n }\n\n if (notice) {\n artifactNotices.push(notice);\n }\n }\n }\n}\n\n/**\n * When using Minimum Release Age, and a package manager that doesn't support being told an explicit version to update to (#41624) it is possible that an artifact update leads to a different version of a dependency being used compared to what Renovate is expecting.\n *\n * We should report these cases more explicitly with an Artifact Error, to allow the reviewers to decide what to do with the changes.\n */\nasync function checkForPendingVersions(\n manager: string,\n packageFileName: string,\n packageFileContent: string,\n updatedDeps: BranchUpgradeConfig[],\n artifactErrors: ArtifactError[],\n config: BranchConfig,\n): Promise<void> {\n const depNameToUpgradeInfo = new Map<\n string,\n {\n pendingVersions: Set<string>;\n newVersion: string | undefined;\n }\n >();\n for (const dep of updatedDeps) {\n if (dep.depName && isNonEmptyArray(dep.pendingVersions)) {\n depNameToUpgradeInfo.set(dep.depName, {\n pendingVersions: new Set(dep.pendingVersions),\n newVersion: dep.newVersion,\n });\n }\n }\n if (!depNameToUpgradeInfo.size) {\n return;\n }\n\n const extracted = await extractPackageFile(\n manager,\n packageFileContent,\n packageFileName,\n config,\n );\n if (!extracted) {\n logger.warn(\n { packageFile: packageFileName, manager },\n 'Could not re-extract the packageFile after updating it',\n );\n return;\n }\n\n for (const dep of extracted.deps) {\n const depName = dep.depName ?? dep.packageName;\n // shouldn't ever happen\n if (!depName) {\n logger.error(\n {\n packageFile: packageFileName,\n manager,\n branchName: config.branchName,\n depName: dep.depName,\n },\n 'No depName found after updating package file',\n );\n throw new Error(WORKER_FILE_UPDATE_FAILED);\n }\n\n const upgradeInfo = depNameToUpgradeInfo.get(depName);\n if (!upgradeInfo) {\n continue;\n }\n const resolvedVersion =\n dep.lockedVersion ??\n dep.newVersion ??\n dep.currentVersion ??\n dep.currentValue;\n if (!resolvedVersion) {\n logger.warn(\n {\n packageFile: packageFileName,\n manager,\n branchName: config.branchName,\n depName,\n },\n 'Could not determine resolved version after updating package file; skipping pending-version check',\n );\n continue;\n }\n\n if (resolvedVersion && upgradeInfo.pendingVersions.has(resolvedVersion)) {\n const expectedVersion = upgradeInfo.newVersion;\n /* v8 ignore next if -- should not happen */\n if (!expectedVersion) {\n logger.error(\n {\n packageFile: packageFileName,\n manager,\n branchName: config.branchName,\n depName,\n newVersion: resolvedVersion,\n expectedVersion,\n },\n 'No expectedVersion found after updating package file',\n );\n continue;\n }\n\n if (config.minimumReleaseAgeBehaviour === 'timestamp-optional') {\n logger.once.warn(\n {\n packageFileName,\n depName,\n expectedVersion,\n resolvedVersion,\n },\n \"Artifact error would be reported due to a pending version in use which hasn't passed Minimum Release Age, but as we're running with minimumReleaseAgeBehaviour=timestamp-optional, proceeding. See debug logs for more information\",\n );\n continue;\n }\n\n logger.debug(\n {\n packageFileName,\n depName,\n expectedVersion,\n resolvedVersion,\n },\n 'Artifact update introduced a pending version',\n );\n let stderr = `Artifact update for ${depName} resolved to version ${resolvedVersion}, which is a pending version that has not yet passed the Minimum Release Age threshold.`;\n stderr += `\\nRenovate was attempting to update to ${expectedVersion}`;\n stderr += `\\nThis is (likely) not a bug in Renovate, but due to the way your project pins dependencies, _and_ how Renovate calls your package manager to update them.\\nUntil Renovate supports specifying an exact update to your package manager (https://github.com/renovatebot/renovate/issues/41624), it is recommended to directly pin your dependencies (with \\`rangeStrategy=pin\\` for apps, or \\`rangeStrategy=widen\\` for libraries)\\nSee also: ${GlobalConfig.get('productLinks').documentation}dependency-pinning/`;\n\n artifactErrors.push({\n fileName: packageFileName,\n stderr,\n });\n }\n }\n}\n\nasync function applyManagerBumpPackageVersion(\n packageFileContent: string | null,\n upgrade: BranchUpgradeConfig,\n): Promise<string | null> {\n const bumpPackageVersion = get(upgrade.manager, 'bumpPackageVersion');\n if (\n !bumpPackageVersion ||\n !packageFileContent ||\n !upgrade.bumpVersion ||\n !upgrade.packageFileVersion\n ) {\n return packageFileContent;\n }\n\n const result = await bumpPackageVersion(\n packageFileContent,\n upgrade.packageFileVersion,\n upgrade.bumpVersion,\n upgrade.packageFile!,\n );\n\n return result.bumpedContent;\n}\n"],"mappings":"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"}
|
|
@@ -58,7 +58,7 @@ function generateBranchName(update) {
|
|
|
58
58
|
if (update.hashedBranchLength) {
|
|
59
59
|
let hashLength = update.hashedBranchLength - update.branchPrefix.length;
|
|
60
60
|
if (hashLength < MIN_HASH_LENGTH) {
|
|
61
|
-
logger.warn(
|
|
61
|
+
logger.warn({ minHashLength: MIN_HASH_LENGTH }, "`hashedBranchLength` must allow for at least the minimum hash length in addition to `branchPrefix`. Using the minimum hash length instead.");
|
|
62
62
|
hashLength = MIN_HASH_LENGTH;
|
|
63
63
|
}
|
|
64
64
|
let hashInput = compile(String(update.additionalBranchPrefix ?? ""), update) + compile(String(update.branchTopic ?? ""), update);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branch-name.js","names":["template.compile"],"sources":["../../../../lib/workers/repository/updates/branch-name.ts"],"sourcesContent":["// TODO #22198\nimport cleanGitRef from 'clean-git-ref';\nimport _slugify from 'slugify';\nimport { logger } from '../../../logger/index.ts';\nimport { hash } from '../../../util/hash.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport * as template from '../../../util/template/index.ts';\nimport type { BranchUpgradeConfig } from '../../types.ts';\n\nconst slugify = _slugify as unknown as typeof _slugify.default;\n\nconst MIN_HASH_LENGTH = 6;\n\nconst RE_MULTIPLE_DASH = regEx(/--+/g);\n\nconst RE_SPECIAL_CHARS_STRICT = regEx(/[`~!@#$%^&*()_=+[\\]\\\\|{};':\",.<>?/]/g);\n\n/**\n * Clean git branch name\n *\n * Remove what clean-git-ref fails to:\n * - leading dot/leading dot after slash\n * - trailing dot\n * - whitespace\n * - special characters\n * - leading or trailing dashes\n * - chained dashes(breaks markdown comments) are replaced by single dash\n */\nfunction cleanBranchName(\n branchName: string,\n branchPrefix: string,\n branchNameStrict?: boolean,\n): string {\n let cleanedBranchName = branchName;\n\n let existingBranchPrefix = '';\n if (branchNameStrict) {\n if (cleanedBranchName.startsWith(branchPrefix)) {\n existingBranchPrefix = branchPrefix;\n cleanedBranchName = cleanedBranchName.slice(branchPrefix.length);\n }\n cleanedBranchName =\n existingBranchPrefix +\n cleanedBranchName.replace(RE_SPECIAL_CHARS_STRICT, '-'); // massage out all special characters that slip through slugify\n }\n\n return cleanGitRef\n .clean(cleanedBranchName)\n .replace(regEx(/^\\.|\\.$/), '') // leading or trailing dot\n .replace(regEx(/\\/\\./g), '/') // leading dot after slash\n .replace(regEx(/\\s/g), '') // whitespace\n .replace(regEx(/[[\\]?:\\\\^~<>]/g), '-') // massage out all these characters: [ ] ? : \\ ^ ~ < >\n .replace(regEx(/(^|\\/)-+/g), '$1') // leading dashes\n .replace(regEx(/-+(\\/|$)/g), '$1') // trailing dashes\n .replace(RE_MULTIPLE_DASH, '-'); // chained dashes\n}\n\nexport function generateBranchName(update: BranchUpgradeConfig): void {\n // Check whether to use a group name\n const newMajor = String(update.newMajor);\n const newMinor = String(update.newMinor);\n if (!update.groupName && update.sharedVariableName) {\n logger.debug(\n `Using sharedVariableName=${update.sharedVariableName} as groupName for depName=${update.depName}`,\n );\n update.groupName = update.sharedVariableName;\n }\n\n if (update.groupName) {\n if (update.updateType === 'replacement') {\n logger.debug(\n { depName: update.depName },\n `Ignoring grouped branch name for ${update.updateType} update`,\n );\n } else {\n update.groupName = template.compile(update.groupName, update);\n logger.trace('Using group branchName template');\n // TODO: types (#22198)\n logger.trace(\n `Dependency ${update.depName!} is part of group ${update.groupName}`,\n );\n if (update.groupSlug) {\n update.groupSlug = template.compile(update.groupSlug, update);\n } else {\n update.groupSlug = update.groupName;\n }\n update.groupSlug = slugify(update.groupSlug, {\n lower: true,\n });\n if (update.updateType === 'major' && update.separateMajorMinor) {\n if (update.separateMultipleMajor) {\n update.groupSlug = `major-${newMajor}-${update.groupSlug}`;\n } else {\n update.groupSlug = `major-${update.groupSlug}`;\n }\n }\n if (update.updateType === 'minor' && update.separateMultipleMinor) {\n update.groupSlug = `minor-${newMajor}.${newMinor}-${update.groupSlug}`;\n }\n if (update.updateType === 'patch' && update.separateMinorPatch) {\n update.groupSlug = `patch-${update.groupSlug}`;\n }\n if (update.updateType === 'lockFileMaintenance') {\n update.groupSlug = `lock-file-maintenance-${update.groupSlug}`;\n }\n update.branchTopic = update.group!.branchTopic ?? update.branchTopic;\n update.branchName = update.group!.branchName ?? update.branchName;\n }\n }\n\n if (update.hashedBranchLength) {\n let hashLength = update.hashedBranchLength - update.branchPrefix!.length;\n if (hashLength < MIN_HASH_LENGTH) {\n logger.warn(\n
|
|
1
|
+
{"version":3,"file":"branch-name.js","names":["template.compile"],"sources":["../../../../lib/workers/repository/updates/branch-name.ts"],"sourcesContent":["// TODO #22198\nimport cleanGitRef from 'clean-git-ref';\nimport _slugify from 'slugify';\nimport { logger } from '../../../logger/index.ts';\nimport { hash } from '../../../util/hash.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport * as template from '../../../util/template/index.ts';\nimport type { BranchUpgradeConfig } from '../../types.ts';\n\nconst slugify = _slugify as unknown as typeof _slugify.default;\n\nconst MIN_HASH_LENGTH = 6;\n\nconst RE_MULTIPLE_DASH = regEx(/--+/g);\n\nconst RE_SPECIAL_CHARS_STRICT = regEx(/[`~!@#$%^&*()_=+[\\]\\\\|{};':\",.<>?/]/g);\n\n/**\n * Clean git branch name\n *\n * Remove what clean-git-ref fails to:\n * - leading dot/leading dot after slash\n * - trailing dot\n * - whitespace\n * - special characters\n * - leading or trailing dashes\n * - chained dashes(breaks markdown comments) are replaced by single dash\n */\nfunction cleanBranchName(\n branchName: string,\n branchPrefix: string,\n branchNameStrict?: boolean,\n): string {\n let cleanedBranchName = branchName;\n\n let existingBranchPrefix = '';\n if (branchNameStrict) {\n if (cleanedBranchName.startsWith(branchPrefix)) {\n existingBranchPrefix = branchPrefix;\n cleanedBranchName = cleanedBranchName.slice(branchPrefix.length);\n }\n cleanedBranchName =\n existingBranchPrefix +\n cleanedBranchName.replace(RE_SPECIAL_CHARS_STRICT, '-'); // massage out all special characters that slip through slugify\n }\n\n return cleanGitRef\n .clean(cleanedBranchName)\n .replace(regEx(/^\\.|\\.$/), '') // leading or trailing dot\n .replace(regEx(/\\/\\./g), '/') // leading dot after slash\n .replace(regEx(/\\s/g), '') // whitespace\n .replace(regEx(/[[\\]?:\\\\^~<>]/g), '-') // massage out all these characters: [ ] ? : \\ ^ ~ < >\n .replace(regEx(/(^|\\/)-+/g), '$1') // leading dashes\n .replace(regEx(/-+(\\/|$)/g), '$1') // trailing dashes\n .replace(RE_MULTIPLE_DASH, '-'); // chained dashes\n}\n\nexport function generateBranchName(update: BranchUpgradeConfig): void {\n // Check whether to use a group name\n const newMajor = String(update.newMajor);\n const newMinor = String(update.newMinor);\n if (!update.groupName && update.sharedVariableName) {\n logger.debug(\n `Using sharedVariableName=${update.sharedVariableName} as groupName for depName=${update.depName}`,\n );\n update.groupName = update.sharedVariableName;\n }\n\n if (update.groupName) {\n if (update.updateType === 'replacement') {\n logger.debug(\n { depName: update.depName },\n `Ignoring grouped branch name for ${update.updateType} update`,\n );\n } else {\n update.groupName = template.compile(update.groupName, update);\n logger.trace('Using group branchName template');\n // TODO: types (#22198)\n logger.trace(\n `Dependency ${update.depName!} is part of group ${update.groupName}`,\n );\n if (update.groupSlug) {\n update.groupSlug = template.compile(update.groupSlug, update);\n } else {\n update.groupSlug = update.groupName;\n }\n update.groupSlug = slugify(update.groupSlug, {\n lower: true,\n });\n if (update.updateType === 'major' && update.separateMajorMinor) {\n if (update.separateMultipleMajor) {\n update.groupSlug = `major-${newMajor}-${update.groupSlug}`;\n } else {\n update.groupSlug = `major-${update.groupSlug}`;\n }\n }\n if (update.updateType === 'minor' && update.separateMultipleMinor) {\n update.groupSlug = `minor-${newMajor}.${newMinor}-${update.groupSlug}`;\n }\n if (update.updateType === 'patch' && update.separateMinorPatch) {\n update.groupSlug = `patch-${update.groupSlug}`;\n }\n if (update.updateType === 'lockFileMaintenance') {\n update.groupSlug = `lock-file-maintenance-${update.groupSlug}`;\n }\n update.branchTopic = update.group!.branchTopic ?? update.branchTopic;\n update.branchName = update.group!.branchName ?? update.branchName;\n }\n }\n\n if (update.hashedBranchLength) {\n let hashLength = update.hashedBranchLength - update.branchPrefix!.length;\n if (hashLength < MIN_HASH_LENGTH) {\n logger.warn(\n { minHashLength: MIN_HASH_LENGTH },\n '`hashedBranchLength` must allow for at least the minimum hash length in addition to `branchPrefix`. Using the minimum hash length instead.',\n );\n hashLength = MIN_HASH_LENGTH;\n }\n\n const additionalBranchPrefix = template.compile(\n String(update.additionalBranchPrefix ?? ''),\n update,\n );\n\n const branchTopic = template.compile(\n String(update.branchTopic ?? ''),\n update,\n );\n\n let hashInput = additionalBranchPrefix + branchTopic;\n\n // Compile extra times in case of nested templates\n hashInput = template.compile(hashInput, update);\n hashInput = template.compile(hashInput, update);\n\n const hashedInput = hash(hashInput);\n\n // TODO: types (#22198)\n update.branchName = `${update.branchPrefix!}${hashedInput.slice(\n 0,\n hashLength,\n )}`;\n } else {\n update.branchName = template.compile(update.branchName, update);\n\n // Compile extra times in case of nested templates\n update.branchName = template.compile(update.branchName, update);\n update.branchName = template.compile(update.branchName, update);\n }\n update.branchName = cleanBranchName(\n update.branchName,\n update.branchPrefix!,\n update.branchNameStrict,\n );\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 43.
|
|
3
|
+
"title": "JSON schema for Renovate 43.265.0 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "43.
|
|
5
|
+
"x-renovate-version": "43.265.0",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|