renovate 43.204.0 → 43.205.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/data/mise-registry.js +4 -3
- package/dist/workers/repository/update/branch/auto-replace.js +9 -23
- package/dist/workers/repository/update/branch/auto-replace.js.map +1 -1
- package/dist/workers/repository/update/branch/get-updated.js +4 -5
- package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region lib/data/mise-registry.json
|
|
2
2
|
var mise_registry_default = {
|
|
3
|
-
meta: { "version": "2026.5.
|
|
3
|
+
meta: { "version": "2026.5.15 linux-x64 (2026-05-23)" },
|
|
4
4
|
tools: {
|
|
5
5
|
"1password": {
|
|
6
6
|
"aqua": "1password/cli",
|
|
@@ -2259,6 +2259,7 @@ var mise_registry_default = {
|
|
|
2259
2259
|
"github": "natesales/q"
|
|
2260
2260
|
},
|
|
2261
2261
|
"qsv": {
|
|
2262
|
+
"aqua": "dathere/qsv",
|
|
2262
2263
|
"asdf": "vjda/asdf-qsv",
|
|
2263
2264
|
"github": "dathere/qsv"
|
|
2264
2265
|
},
|
|
@@ -2960,7 +2961,7 @@ var mise_registry_default = {
|
|
|
2960
2961
|
"v": { "asdf": "mise-plugins/mise-v" },
|
|
2961
2962
|
"vacuum": { "aqua": "daveshanley/vacuum" },
|
|
2962
2963
|
"vale": {
|
|
2963
|
-
"aqua": "
|
|
2964
|
+
"aqua": "vale-cli/vale",
|
|
2964
2965
|
"asdf": "pdemagny/asdf-vale"
|
|
2965
2966
|
},
|
|
2966
2967
|
"vals": {
|
|
@@ -2975,7 +2976,7 @@ var mise_registry_default = {
|
|
|
2975
2976
|
"aqua": "loft-sh/vcluster",
|
|
2976
2977
|
"asdf": "https"
|
|
2977
2978
|
},
|
|
2978
|
-
"vector": { "
|
|
2979
|
+
"vector": { "aqua": "vectordotdev/vector" },
|
|
2979
2980
|
"velad": {
|
|
2980
2981
|
"asdf": "mise-plugins/mise-velad",
|
|
2981
2982
|
"github": "kubevela/velad"
|
|
@@ -126,32 +126,18 @@ async function checkExistingBranch(upgrade, existingContent) {
|
|
|
126
126
|
logger.debug(`Branch dep ${depName} in ${packageFile} is already updated`);
|
|
127
127
|
return existingContent;
|
|
128
128
|
}
|
|
129
|
-
/**
|
|
130
|
-
* Check if an update from `current` to `newString` should be performed and return 1 if so.
|
|
131
|
-
*
|
|
132
|
-
* @remarks
|
|
133
|
-
* Useful for counting the number of updates to do.
|
|
134
|
-
*
|
|
135
|
-
* @param current The current value (if undefined then no update is required)
|
|
136
|
-
* @param newString The new value (if undefined then no update is required)
|
|
137
|
-
*
|
|
138
|
-
* @returns 1 if `current !== newString` and 0 if they are equal or at least one is undefined.
|
|
139
|
-
*/
|
|
140
|
-
function updatedToInt(current, newString) {
|
|
141
|
-
if (current && newString && newString !== current) return 1;
|
|
142
|
-
else return 0;
|
|
143
|
-
}
|
|
144
129
|
async function doAutoReplace(upgrade, existingContent, reuseExistingBranch, firstUpdate = true) {
|
|
145
130
|
const { packageFile, depName, depNameTemplate, newName, currentValue, currentValueTemplate, newValue, currentDigest, currentDigestShort, newDigest, autoReplaceGlobalMatch, autoReplaceStringTemplate } = upgrade;
|
|
146
131
|
if (reuseExistingBranch) return await checkExistingBranch(upgrade, existingContent);
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
132
|
+
const valueChanging = isString(currentValue) && isString(newValue) && currentValue !== newValue;
|
|
133
|
+
const digestChanging = isString(currentDigest) && isString(newDigest) && currentDigest !== newDigest;
|
|
134
|
+
let replaceWithoutReplaceString = isString(newName) && newName !== depName && (isUndefined(upgrade.replaceString) || !upgrade.replaceString?.includes(depName));
|
|
135
|
+
let replaceString = upgrade.replaceString;
|
|
136
|
+
if (isUndefined(replaceString)) if (valueChanging && digestChanging) {
|
|
137
|
+
replaceWithoutReplaceString = true;
|
|
138
|
+
replaceString = currentValue;
|
|
139
|
+
} else if (digestChanging) replaceString = currentDigest;
|
|
140
|
+
else replaceString = currentValue ?? currentDigest;
|
|
155
141
|
logger.trace({
|
|
156
142
|
depName,
|
|
157
143
|
replaceString
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-replace.js","names":[],"sources":["../../../../../lib/workers/repository/update/branch/auto-replace.ts"],"sourcesContent":["// TODO #22198\nimport { isNumber, isString, isUndefined } from '@sindresorhus/is';\nimport { WORKER_FILE_UPDATE_FAILED } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { extractPackageFile } from '../../../../modules/manager/index.ts';\nimport type { PackageDependency } from '../../../../modules/manager/types.ts';\nimport { writeLocalFile } from '../../../../util/fs/index.ts';\nimport { escapeRegExp, regEx } from '../../../../util/regex.ts';\nimport { matchAt, replaceAt } from '../../../../util/string.ts';\nimport { compile } from '../../../../util/template/index.ts';\nimport type { BranchUpgradeConfig } from '../../../types.ts';\n\nexport async function confirmIfDepUpdated(\n upgrade: BranchUpgradeConfig,\n newContent: string,\n): Promise<boolean> {\n const { manager, packageFile, depIndex } = upgrade;\n let newUpgrade: PackageDependency;\n try {\n const newExtract = await extractPackageFile(\n manager,\n newContent,\n packageFile!,\n upgrade,\n );\n // istanbul ignore if\n if (!newExtract) {\n // TODO: fix types (#22198)\n logger.debug(\n `Could not extract ${packageFile!} (manager=${manager}) after autoreplace. Did the autoreplace make the file unparseable?`,\n );\n logger.trace(\n { packageFile, content: newContent },\n 'packageFile content after autoreplace',\n );\n return false;\n }\n // istanbul ignore if\n if (!newExtract.deps?.length) {\n logger.debug(\n `Extracted ${packageFile!} after autoreplace has no deps array. Did the autoreplace make the file unparseable?`,\n );\n return false;\n }\n // istanbul ignore if\n if (isNumber(depIndex) && depIndex >= newExtract.deps.length) {\n logger.debug(\n `Extracted ${packageFile!} after autoreplace has fewer deps than expected.`,\n );\n return false;\n }\n newUpgrade = newExtract.deps[depIndex!];\n } catch (err) {\n /* istanbul ignore next */\n logger.debug({ manager, packageFile, err }, 'Failed to parse newContent');\n }\n\n if (!newUpgrade!) {\n logger.debug(`No newUpgrade in ${packageFile!}`);\n return false;\n }\n\n if (\n upgrade.depName !== newUpgrade.depName &&\n upgrade.newName !== newUpgrade.depName\n ) {\n logger.debug(\n {\n manager,\n packageFile,\n currentDepName: upgrade.depName,\n newDepName: newUpgrade.depName,\n },\n 'depName mismatch',\n );\n return false;\n }\n\n if (upgrade.newName && upgrade.newName !== newUpgrade.depName) {\n logger.debug(\n {\n manager,\n packageFile,\n currentDepName: upgrade.depName,\n newDepName: newUpgrade.depName,\n },\n 'depName is not updated',\n );\n return false;\n }\n\n if (upgrade.newValue && upgrade.newValue !== newUpgrade.currentValue) {\n logger.debug(\n {\n depName: upgrade.depName,\n manager,\n packageFile,\n expectedValue: upgrade.newValue,\n foundValue: newUpgrade.currentValue,\n },\n 'Value is not updated',\n );\n return false;\n }\n\n if (\n upgrade.newDigest &&\n (upgrade.isPinDigest === true || upgrade.currentDigest) &&\n upgrade.newDigest !== newUpgrade.currentDigest\n ) {\n logger.debug(\n {\n depName: upgrade.depName,\n manager,\n packageFile,\n expectedValue: upgrade.newDigest,\n foundValue: newUpgrade.currentDigest,\n },\n 'Digest is not updated',\n );\n return false;\n }\n\n return true;\n}\n\nfunction getDepsSignature(deps: PackageDependency[]): string {\n // TODO: types (#22198)\n return deps\n .map(\n (dep) =>\n `${(dep.depName ?? dep.packageName)!}${(dep.packageName ??\n dep.depName)!}`,\n )\n .join(',');\n}\n\nfunction firstIndexOf(\n existingContent: string,\n depName: string,\n currentValue: string,\n position = 0,\n): number {\n const depIndex = existingContent.indexOf(depName, position);\n const valIndex = existingContent.indexOf(currentValue, position);\n const index = depIndex < valIndex ? depIndex : valIndex;\n if (index < 0) {\n return position === 0 ? -1 : existingContent.length;\n }\n return index;\n}\n\nexport async function checkBranchDepsMatchBaseDeps(\n upgrade: BranchUpgradeConfig,\n branchContent: string,\n): Promise<boolean> {\n const { baseDeps, manager, packageFile } = upgrade;\n try {\n const res = await extractPackageFile(\n manager,\n branchContent,\n packageFile!,\n upgrade,\n )!;\n const branchDeps = res!.deps;\n return getDepsSignature(baseDeps!) === getDepsSignature(branchDeps);\n } catch /* istanbul ignore next */ {\n logger.info(\n { manager, packageFile },\n 'Failed to parse branchContent - rebasing',\n );\n return false;\n }\n}\n\nasync function checkExistingBranch(\n upgrade: BranchUpgradeConfig,\n existingContent: string,\n): Promise<string | null> {\n const { packageFile, depName } = upgrade;\n if (!(await checkBranchDepsMatchBaseDeps(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing branch after deps list has changed',\n );\n return null;\n }\n if (!(await confirmIfDepUpdated(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing after outdated branch dep found',\n );\n return null;\n }\n // TODO: fix types (#22198)\n logger.debug(`Branch dep ${depName!} in ${packageFile!} is already updated`);\n return existingContent;\n}\n\n/**\n * Check if an update from `current` to `newString` should be performed and return 1 if so.\n *\n * @remarks\n * Useful for counting the number of updates to do.\n *\n * @param current The current value (if undefined then no update is required)\n * @param newString The new value (if undefined then no update is required)\n *\n * @returns 1 if `current !== newString` and 0 if they are equal or at least one is undefined.\n */\nfunction updatedToInt(\n current: string | undefined | null,\n newString: string | undefined | null,\n): number {\n if (current && newString && newString !== current) {\n return 1;\n } else {\n return 0;\n }\n}\n\nexport async function doAutoReplace(\n upgrade: BranchUpgradeConfig,\n existingContent: string,\n reuseExistingBranch: boolean,\n firstUpdate = true,\n): Promise<string | null> {\n const {\n packageFile,\n depName,\n depNameTemplate,\n newName,\n currentValue,\n currentValueTemplate,\n newValue,\n currentDigest,\n currentDigestShort,\n newDigest,\n autoReplaceGlobalMatch,\n autoReplaceStringTemplate,\n } = upgrade;\n /*\n If replacement support for more managers is added,\n please also update the list in docs/usage/configuration-options.md\n at replacementName and replacementVersion\n */\n if (reuseExistingBranch) {\n return await checkExistingBranch(upgrade, existingContent);\n }\n\n // count how many strings need to be updated\n const changedCount =\n updatedToInt(depName, newName) +\n updatedToInt(currentValue, newValue) +\n updatedToInt(currentDigest, newDigest);\n if (changedCount > 1) {\n logger.debug(\n { packageFile, depName, changedCount },\n 'Multiple changed values, might need special handling (#36461)',\n );\n }\n\n const replaceWithoutReplaceString =\n (isString(newName) &&\n newName !== depName &&\n (isUndefined(upgrade.replaceString) ||\n !upgrade.replaceString?.includes(depName!))) ||\n // for jsonata manager, fixes #36461\n (isUndefined(upgrade.replaceString) && changedCount > 1);\n const replaceString = upgrade.replaceString ?? currentValue ?? currentDigest;\n logger.trace({ depName, replaceString }, 'autoReplace replaceString');\n let searchIndex: number;\n if (replaceWithoutReplaceString) {\n searchIndex = firstIndexOf(existingContent, depName!, currentValue!);\n } else {\n searchIndex = existingContent.indexOf(replaceString!);\n }\n if (searchIndex === -1) {\n logger.info(\n { packageFile, depName, existingContent, replaceString },\n 'Cannot find replaceString in current file content. Was it already updated?',\n );\n return existingContent;\n }\n try {\n let newString: string;\n if (autoReplaceStringTemplate && !newName) {\n newString = compile(autoReplaceStringTemplate, upgrade, false);\n } else {\n newString = replaceString!;\n\n const autoReplaceRegExpFlag = autoReplaceGlobalMatch ? 'g' : '';\n if (currentValue && newValue && currentValue !== newValue) {\n if (!newString.includes(currentValue)) {\n logger.debug(\n { stringToReplace: newString, currentValue, currentValueTemplate },\n 'currentValue not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentValue), autoReplaceRegExpFlag),\n newValue,\n );\n }\n if (depName && newName && depName !== newName) {\n if (!newString.includes(depName)) {\n logger.debug(\n { stringToReplace: newString, depName, depNameTemplate },\n 'depName not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(depName), autoReplaceRegExpFlag),\n newName,\n );\n }\n if (currentDigest && newDigest && currentDigest !== newDigest) {\n if (!newString.includes(currentDigest)) {\n logger.debug(\n { stringToReplace: newString, currentDigest },\n 'currentDigest not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentDigest), autoReplaceRegExpFlag),\n newDigest,\n );\n } else if (\n currentDigestShort &&\n newDigest &&\n currentDigestShort !== newDigest &&\n // Only use short digest replacement when there's no full currentDigest\n // that already matches newDigest (otherwise we'd incorrectly replace\n // part of an already-correct digest)\n !(currentDigest && currentDigest === newDigest)\n ) {\n if (!newString.includes(currentDigestShort)) {\n logger.debug(\n { stringToReplace: newString, currentDigestShort },\n 'currentDigestShort not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentDigestShort), autoReplaceRegExpFlag),\n newDigest,\n );\n }\n }\n if (!firstUpdate && (await confirmIfDepUpdated(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Package file is already updated - no work to do',\n );\n return existingContent;\n }\n logger.debug(\n { packageFile, depName },\n `Starting search at index ${searchIndex}`,\n );\n let newContent = existingContent;\n let nameReplaced = !newName;\n let valueReplaced = !newValue;\n let digestReplaced = !newDigest;\n let startIndex = searchIndex;\n // Iterate through the rest of the file\n for (; searchIndex < newContent.length; searchIndex += 1) {\n // First check if we have a hit for the old version\n if (replaceWithoutReplaceString) {\n // look for depName and currentValue\n if (newName && matchAt(newContent, searchIndex, depName!)) {\n logger.debug(\n { packageFile, depName },\n `Found depName at index ${searchIndex}`,\n );\n if (nameReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // replace with newName\n newContent = replaceAt(newContent, searchIndex, depName!, newName);\n await writeLocalFile(upgrade.packageFile!, newContent);\n nameReplaced = true;\n searchIndex += newName.length - 1;\n } else if (\n newValue &&\n matchAt(newContent, searchIndex, currentValue!)\n ) {\n logger.debug(\n { packageFile, currentValue },\n `Found currentValue at index ${searchIndex}`,\n );\n if (valueReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n currentValue!,\n newValue,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n valueReplaced = true;\n searchIndex += newValue.length - 1;\n } else if (\n newDigest &&\n matchAt(newContent, searchIndex, currentDigest!)\n ) {\n logger.debug(\n { packageFile, currentDigest },\n `Found currentDigest at index ${searchIndex}`,\n );\n if (digestReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n currentDigest!,\n newDigest,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n digestReplaced = true;\n searchIndex += newDigest.length - 1;\n }\n if (nameReplaced && valueReplaced && digestReplaced) {\n if (await confirmIfDepUpdated(upgrade, newContent)) {\n return newContent;\n }\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n }\n } else if (matchAt(newContent, searchIndex, replaceString!)) {\n logger.debug(\n { packageFile, depName },\n `Found match at index ${searchIndex}`,\n );\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n replaceString!,\n newString,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n if (await confirmIfDepUpdated(upgrade, newContent)) {\n return newContent;\n }\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n }\n }\n } catch (err) {\n /* istanbul ignore next */\n logger.debug({ packageFile, depName, err }, 'doAutoReplace error');\n }\n // istanbul ignore next\n throw new Error(WORKER_FILE_UPDATE_FAILED);\n}\n"],"mappings":";;;;;;;;;AAYA,eAAsB,oBACpB,SACA,YACkB;CAClB,MAAM,EAAE,SAAS,aAAa,aAAa;CAC3C,IAAI;CACJ,IAAI;EACF,MAAM,aAAa,MAAM,mBACvB,SACA,YACA,aACA,OACF;;EAEA,IAAI,CAAC,YAAY;GAEf,OAAO,MACL,qBAAqB,YAAa,YAAY,QAAQ,oEACxD;GACA,OAAO,MACL;IAAE;IAAa,SAAS;GAAW,GACnC,uCACF;GACA,OAAO;EACT;;EAEA,IAAI,CAAC,WAAW,MAAM,QAAQ;GAC5B,OAAO,MACL,aAAa,YAAa,qFAC5B;GACA,OAAO;EACT;;EAEA,IAAI,SAAS,QAAQ,KAAK,YAAY,WAAW,KAAK,QAAQ;GAC5D,OAAO,MACL,aAAa,YAAa,iDAC5B;GACA,OAAO;EACT;EACA,aAAa,WAAW,KAAK;CAC/B,SAAS,KAAK;;EAEZ,OAAO,MAAM;GAAE;GAAS;GAAa;EAAI,GAAG,4BAA4B;CAC1E;CAEA,IAAI,CAAC,YAAa;EAChB,OAAO,MAAM,oBAAoB,aAAc;EAC/C,OAAO;CACT;CAEA,IACE,QAAQ,YAAY,WAAW,WAC/B,QAAQ,YAAY,WAAW,SAC/B;EACA,OAAO,MACL;GACE;GACA;GACA,gBAAgB,QAAQ;GACxB,YAAY,WAAW;EACzB,GACA,kBACF;EACA,OAAO;CACT;CAEA,IAAI,QAAQ,WAAW,QAAQ,YAAY,WAAW,SAAS;EAC7D,OAAO,MACL;GACE;GACA;GACA,gBAAgB,QAAQ;GACxB,YAAY,WAAW;EACzB,GACA,wBACF;EACA,OAAO;CACT;CAEA,IAAI,QAAQ,YAAY,QAAQ,aAAa,WAAW,cAAc;EACpE,OAAO,MACL;GACE,SAAS,QAAQ;GACjB;GACA;GACA,eAAe,QAAQ;GACvB,YAAY,WAAW;EACzB,GACA,sBACF;EACA,OAAO;CACT;CAEA,IACE,QAAQ,cACP,QAAQ,gBAAgB,QAAQ,QAAQ,kBACzC,QAAQ,cAAc,WAAW,eACjC;EACA,OAAO,MACL;GACE,SAAS,QAAQ;GACjB;GACA;GACA,eAAe,QAAQ;GACvB,YAAY,WAAW;EACzB,GACA,uBACF;EACA,OAAO;CACT;CAEA,OAAO;AACT;AAEA,SAAS,iBAAiB,MAAmC;CAE3D,OAAO,KACJ,KACE,QACC,GAAI,IAAI,WAAW,IAAI,cAAiB,IAAI,eAC1C,IAAI,SACV,EACC,KAAK,GAAG;AACb;AAEA,SAAS,aACP,iBACA,SACA,cACA,WAAW,GACH;CACR,MAAM,WAAW,gBAAgB,QAAQ,SAAS,QAAQ;CAC1D,MAAM,WAAW,gBAAgB,QAAQ,cAAc,QAAQ;CAC/D,MAAM,QAAQ,WAAW,WAAW,WAAW;CAC/C,IAAI,QAAQ,GACV,OAAO,aAAa,IAAI,KAAK,gBAAgB;CAE/C,OAAO;AACT;AAEA,eAAsB,6BACpB,SACA,eACkB;CAClB,MAAM,EAAE,UAAU,SAAS,gBAAgB;CAC3C,IAAI;EAOF,MAAM,cAAa,MAND,mBAChB,SACA,eACA,aACA,OACF,GACwB;EACxB,OAAO,iBAAiB,QAAS,MAAM,iBAAiB,UAAU;CACpE,oCAAmC;EACjC,OAAO,KACL;GAAE;GAAS;EAAY,GACvB,0CACF;EACA,OAAO;CACT;AACF;AAEA,eAAe,oBACb,SACA,iBACwB;CACxB,MAAM,EAAE,aAAa,YAAY;CACjC,IAAI,CAAE,MAAM,6BAA6B,SAAS,eAAe,GAAI;EACnE,OAAO,MACL;GAAE;GAAa;EAAQ,GACvB,6CACF;EACA,OAAO;CACT;CACA,IAAI,CAAE,MAAM,oBAAoB,SAAS,eAAe,GAAI;EAC1D,OAAO,MACL;GAAE;GAAa;EAAQ,GACvB,0CACF;EACA,OAAO;CACT;CAEA,OAAO,MAAM,cAAc,QAAS,MAAM,YAAa,oBAAoB;CAC3E,OAAO;AACT;;;;;;;;;;;;AAaA,SAAS,aACP,SACA,WACQ;CACR,IAAI,WAAW,aAAa,cAAc,SACxC,OAAO;MAEP,OAAO;AAEX;AAEA,eAAsB,cACpB,SACA,iBACA,qBACA,cAAc,MACU;CACxB,MAAM,EACJ,aACA,SACA,iBACA,SACA,cACA,sBACA,UACA,eACA,oBACA,WACA,wBACA,8BACE;CAMJ,IAAI,qBACF,OAAO,MAAM,oBAAoB,SAAS,eAAe;CAI3D,MAAM,eACJ,aAAa,SAAS,OAAO,IAC7B,aAAa,cAAc,QAAQ,IACnC,aAAa,eAAe,SAAS;CACvC,IAAI,eAAe,GACjB,OAAO,MACL;EAAE;EAAa;EAAS;CAAa,GACrC,+DACF;CAGF,MAAM,8BACH,SAAS,OAAO,KACf,YAAY,YACX,YAAY,QAAQ,aAAa,KAChC,CAAC,QAAQ,eAAe,SAAS,OAAQ,MAE5C,YAAY,QAAQ,aAAa,KAAK,eAAe;CACxD,MAAM,gBAAgB,QAAQ,iBAAiB,gBAAgB;CAC/D,OAAO,MAAM;EAAE;EAAS;CAAc,GAAG,2BAA2B;CACpE,IAAI;CACJ,IAAI,6BACF,cAAc,aAAa,iBAAiB,SAAU,YAAa;MAEnE,cAAc,gBAAgB,QAAQ,aAAc;CAEtD,IAAI,gBAAgB,IAAI;EACtB,OAAO,KACL;GAAE;GAAa;GAAS;GAAiB;EAAc,GACvD,4EACF;EACA,OAAO;CACT;CACA,IAAI;EACF,IAAI;EACJ,IAAI,6BAA6B,CAAC,SAChC,YAAY,QAAQ,2BAA2B,SAAS,KAAK;OACxD;GACL,YAAY;GAEZ,MAAM,wBAAwB,yBAAyB,MAAM;GAC7D,IAAI,gBAAgB,YAAY,iBAAiB,UAAU;IACzD,IAAI,CAAC,UAAU,SAAS,YAAY,GAClC,OAAO,MACL;KAAE,iBAAiB;KAAW;KAAc;IAAqB,GACjE,6CACF;IAEF,YAAY,UAAU,QACpB,MAAM,aAAa,YAAY,GAAG,qBAAqB,GACvD,QACF;GACF;GACA,IAAI,WAAW,WAAW,YAAY,SAAS;IAC7C,IAAI,CAAC,UAAU,SAAS,OAAO,GAC7B,OAAO,MACL;KAAE,iBAAiB;KAAW;KAAS;IAAgB,GACvD,wCACF;IAEF,YAAY,UAAU,QACpB,MAAM,aAAa,OAAO,GAAG,qBAAqB,GAClD,OACF;GACF;GACA,IAAI,iBAAiB,aAAa,kBAAkB,WAAW;IAC7D,IAAI,CAAC,UAAU,SAAS,aAAa,GACnC,OAAO,MACL;KAAE,iBAAiB;KAAW;IAAc,GAC5C,8CACF;IAEF,YAAY,UAAU,QACpB,MAAM,aAAa,aAAa,GAAG,qBAAqB,GACxD,SACF;GACF,OAAO,IACL,sBACA,aACA,uBAAuB,aAIvB,EAAE,iBAAiB,kBAAkB,YACrC;IACA,IAAI,CAAC,UAAU,SAAS,kBAAkB,GACxC,OAAO,MACL;KAAE,iBAAiB;KAAW;IAAmB,GACjD,mDACF;IAEF,YAAY,UAAU,QACpB,MAAM,aAAa,kBAAkB,GAAG,qBAAqB,GAC7D,SACF;GACF;EACF;EACA,IAAI,CAAC,eAAgB,MAAM,oBAAoB,SAAS,eAAe,GAAI;GACzE,OAAO,MACL;IAAE;IAAa;GAAQ,GACvB,iDACF;GACA,OAAO;EACT;EACA,OAAO,MACL;GAAE;GAAa;EAAQ,GACvB,4BAA4B,aAC9B;EACA,IAAI,aAAa;EACjB,IAAI,eAAe,CAAC;EACpB,IAAI,gBAAgB,CAAC;EACrB,IAAI,iBAAiB,CAAC;EACtB,IAAI,aAAa;EAEjB,OAAO,cAAc,WAAW,QAAQ,eAAe,GAErD,IAAI,6BAA6B;GAE/B,IAAI,WAAW,QAAQ,YAAY,aAAa,OAAQ,GAAG;IACzD,OAAO,MACL;KAAE;KAAa;IAAQ,GACvB,0BAA0B,aAC5B;IACA,IAAI,cAAc;KAChB,aAAa,aACX,iBACA,SACA,cACA,aAAa,CACf;KACA,cAAc,aAAa;KAC3B,MAAM,eAAe,QAAQ,aAAc,eAAe;KAC1D,aAAa;KACb,eAAe,CAAC;KAChB,gBAAgB,CAAC;KACjB,iBAAiB,CAAC;KAClB;IACF;IAEA,aAAa,UAAU,YAAY,aAAa,SAAU,OAAO;IACjE,MAAM,eAAe,QAAQ,aAAc,UAAU;IACrD,eAAe;IACf,eAAe,QAAQ,SAAS;GAClC,OAAO,IACL,YACA,QAAQ,YAAY,aAAa,YAAa,GAC9C;IACA,OAAO,MACL;KAAE;KAAa;IAAa,GAC5B,+BAA+B,aACjC;IACA,IAAI,eAAe;KACjB,aAAa,aACX,iBACA,SACA,cACA,aAAa,CACf;KACA,cAAc,aAAa;KAC3B,MAAM,eAAe,QAAQ,aAAc,eAAe;KAC1D,aAAa;KACb,eAAe,CAAC;KAChB,gBAAgB,CAAC;KACjB,iBAAiB,CAAC;KAClB;IACF;IAEA,aAAa,UACX,YACA,aACA,cACA,QACF;IACA,MAAM,eAAe,QAAQ,aAAc,UAAU;IACrD,gBAAgB;IAChB,eAAe,SAAS,SAAS;GACnC,OAAO,IACL,aACA,QAAQ,YAAY,aAAa,aAAc,GAC/C;IACA,OAAO,MACL;KAAE;KAAa;IAAc,GAC7B,gCAAgC,aAClC;IACA,IAAI,gBAAgB;KAClB,aAAa,aACX,iBACA,SACA,cACA,aAAa,CACf;KACA,cAAc,aAAa;KAC3B,MAAM,eAAe,QAAQ,aAAc,eAAe;KAC1D,aAAa;KACb,eAAe,CAAC;KAChB,gBAAgB,CAAC;KACjB,iBAAiB,CAAC;KAClB;IACF;IAEA,aAAa,UACX,YACA,aACA,eACA,SACF;IACA,MAAM,eAAe,QAAQ,aAAc,UAAU;IACrD,iBAAiB;IACjB,eAAe,UAAU,SAAS;GACpC;GACA,IAAI,gBAAgB,iBAAiB,gBAAgB;IACnD,IAAI,MAAM,oBAAoB,SAAS,UAAU,GAC/C,OAAO;IAET,aAAa,aACX,iBACA,SACA,cACA,aAAa,CACf;IACA,cAAc,aAAa;IAC3B,MAAM,eAAe,QAAQ,aAAc,eAAe;IAC1D,aAAa;IACb,eAAe,CAAC;IAChB,gBAAgB,CAAC;IACjB,iBAAiB,CAAC;GACpB;EACF,OAAO,IAAI,QAAQ,YAAY,aAAa,aAAc,GAAG;GAC3D,OAAO,MACL;IAAE;IAAa;GAAQ,GACvB,wBAAwB,aAC1B;GAEA,aAAa,UACX,YACA,aACA,eACA,SACF;GACA,MAAM,eAAe,QAAQ,aAAc,UAAU;GACrD,IAAI,MAAM,oBAAoB,SAAS,UAAU,GAC/C,OAAO;GAET,MAAM,eAAe,QAAQ,aAAc,eAAe;GAC1D,aAAa;EACf;CAEJ,SAAS,KAAK;;EAEZ,OAAO,MAAM;GAAE;GAAa;GAAS;EAAI,GAAG,qBAAqB;CACnE;;CAEA,MAAM,IAAI,MAAM,yBAAyB;AAC3C"}
|
|
1
|
+
{"version":3,"file":"auto-replace.js","names":[],"sources":["../../../../../lib/workers/repository/update/branch/auto-replace.ts"],"sourcesContent":["// TODO #22198\nimport { isNumber, isString, isUndefined } from '@sindresorhus/is';\nimport { WORKER_FILE_UPDATE_FAILED } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { extractPackageFile } from '../../../../modules/manager/index.ts';\nimport type { PackageDependency } from '../../../../modules/manager/types.ts';\nimport { writeLocalFile } from '../../../../util/fs/index.ts';\nimport { escapeRegExp, regEx } from '../../../../util/regex.ts';\nimport { matchAt, replaceAt } from '../../../../util/string.ts';\nimport { compile } from '../../../../util/template/index.ts';\nimport type { BranchUpgradeConfig } from '../../../types.ts';\n\nexport async function confirmIfDepUpdated(\n upgrade: BranchUpgradeConfig,\n newContent: string,\n): Promise<boolean> {\n const { manager, packageFile, depIndex } = upgrade;\n let newUpgrade: PackageDependency;\n try {\n const newExtract = await extractPackageFile(\n manager,\n newContent,\n packageFile!,\n upgrade,\n );\n // istanbul ignore if\n if (!newExtract) {\n // TODO: fix types (#22198)\n logger.debug(\n `Could not extract ${packageFile!} (manager=${manager}) after autoreplace. Did the autoreplace make the file unparseable?`,\n );\n logger.trace(\n { packageFile, content: newContent },\n 'packageFile content after autoreplace',\n );\n return false;\n }\n // istanbul ignore if\n if (!newExtract.deps?.length) {\n logger.debug(\n `Extracted ${packageFile!} after autoreplace has no deps array. Did the autoreplace make the file unparseable?`,\n );\n return false;\n }\n // istanbul ignore if\n if (isNumber(depIndex) && depIndex >= newExtract.deps.length) {\n logger.debug(\n `Extracted ${packageFile!} after autoreplace has fewer deps than expected.`,\n );\n return false;\n }\n newUpgrade = newExtract.deps[depIndex!];\n } catch (err) {\n /* istanbul ignore next */\n logger.debug({ manager, packageFile, err }, 'Failed to parse newContent');\n }\n\n if (!newUpgrade!) {\n logger.debug(`No newUpgrade in ${packageFile!}`);\n return false;\n }\n\n if (\n upgrade.depName !== newUpgrade.depName &&\n upgrade.newName !== newUpgrade.depName\n ) {\n logger.debug(\n {\n manager,\n packageFile,\n currentDepName: upgrade.depName,\n newDepName: newUpgrade.depName,\n },\n 'depName mismatch',\n );\n return false;\n }\n\n if (upgrade.newName && upgrade.newName !== newUpgrade.depName) {\n logger.debug(\n {\n manager,\n packageFile,\n currentDepName: upgrade.depName,\n newDepName: newUpgrade.depName,\n },\n 'depName is not updated',\n );\n return false;\n }\n\n if (upgrade.newValue && upgrade.newValue !== newUpgrade.currentValue) {\n logger.debug(\n {\n depName: upgrade.depName,\n manager,\n packageFile,\n expectedValue: upgrade.newValue,\n foundValue: newUpgrade.currentValue,\n },\n 'Value is not updated',\n );\n return false;\n }\n\n if (\n upgrade.newDigest &&\n (upgrade.isPinDigest === true || upgrade.currentDigest) &&\n upgrade.newDigest !== newUpgrade.currentDigest\n ) {\n logger.debug(\n {\n depName: upgrade.depName,\n manager,\n packageFile,\n expectedValue: upgrade.newDigest,\n foundValue: newUpgrade.currentDigest,\n },\n 'Digest is not updated',\n );\n return false;\n }\n\n return true;\n}\n\nfunction getDepsSignature(deps: PackageDependency[]): string {\n // TODO: types (#22198)\n return deps\n .map(\n (dep) =>\n `${(dep.depName ?? dep.packageName)!}${(dep.packageName ??\n dep.depName)!}`,\n )\n .join(',');\n}\n\nfunction firstIndexOf(\n existingContent: string,\n depName: string,\n currentValue: string,\n position = 0,\n): number {\n const depIndex = existingContent.indexOf(depName, position);\n const valIndex = existingContent.indexOf(currentValue, position);\n const index = depIndex < valIndex ? depIndex : valIndex;\n if (index < 0) {\n return position === 0 ? -1 : existingContent.length;\n }\n return index;\n}\n\nexport async function checkBranchDepsMatchBaseDeps(\n upgrade: BranchUpgradeConfig,\n branchContent: string,\n): Promise<boolean> {\n const { baseDeps, manager, packageFile } = upgrade;\n try {\n const res = await extractPackageFile(\n manager,\n branchContent,\n packageFile!,\n upgrade,\n )!;\n const branchDeps = res!.deps;\n return getDepsSignature(baseDeps!) === getDepsSignature(branchDeps);\n } catch /* istanbul ignore next */ {\n logger.info(\n { manager, packageFile },\n 'Failed to parse branchContent - rebasing',\n );\n return false;\n }\n}\n\nasync function checkExistingBranch(\n upgrade: BranchUpgradeConfig,\n existingContent: string,\n): Promise<string | null> {\n const { packageFile, depName } = upgrade;\n if (!(await checkBranchDepsMatchBaseDeps(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing branch after deps list has changed',\n );\n return null;\n }\n if (!(await confirmIfDepUpdated(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing after outdated branch dep found',\n );\n return null;\n }\n // TODO: fix types (#22198)\n logger.debug(`Branch dep ${depName!} in ${packageFile!} is already updated`);\n return existingContent;\n}\n\nexport async function doAutoReplace(\n upgrade: BranchUpgradeConfig,\n existingContent: string,\n reuseExistingBranch: boolean,\n firstUpdate = true,\n): Promise<string | null> {\n const {\n packageFile,\n depName,\n depNameTemplate,\n newName,\n currentValue,\n currentValueTemplate,\n newValue,\n currentDigest,\n currentDigestShort,\n newDigest,\n autoReplaceGlobalMatch,\n autoReplaceStringTemplate,\n } = upgrade;\n /*\n If replacement support for more managers is added,\n please also update the list in docs/usage/configuration-options.md\n at replacementName and replacementVersion\n */\n if (reuseExistingBranch) {\n return await checkExistingBranch(upgrade, existingContent);\n }\n const valueChanging =\n isString(currentValue) && isString(newValue) && currentValue !== newValue;\n const digestChanging =\n isString(currentDigest) &&\n isString(newDigest) &&\n currentDigest !== newDigest;\n let replaceWithoutReplaceString =\n isString(newName) &&\n newName !== depName &&\n (isUndefined(upgrade.replaceString) ||\n !upgrade.replaceString?.includes(depName!));\n // fallback must contain the field being updated, else the replacement is\n // a no-op for managers where value and digest live in separate tokens\n let replaceString = upgrade.replaceString;\n if (isUndefined(replaceString)) {\n if (valueChanging && digestChanging) {\n // no single fallback covers both — use the per-field path\n replaceWithoutReplaceString = true;\n replaceString = currentValue;\n } else if (digestChanging) {\n replaceString = currentDigest;\n } else {\n replaceString = currentValue ?? currentDigest;\n }\n }\n logger.trace({ depName, replaceString }, 'autoReplace replaceString');\n let searchIndex: number;\n if (replaceWithoutReplaceString) {\n searchIndex = firstIndexOf(existingContent, depName!, currentValue!);\n } else {\n searchIndex = existingContent.indexOf(replaceString!);\n }\n if (searchIndex === -1) {\n logger.info(\n { packageFile, depName, existingContent, replaceString },\n 'Cannot find replaceString in current file content. Was it already updated?',\n );\n return existingContent;\n }\n try {\n let newString: string;\n if (autoReplaceStringTemplate && !newName) {\n newString = compile(autoReplaceStringTemplate, upgrade, false);\n } else {\n newString = replaceString!;\n\n const autoReplaceRegExpFlag = autoReplaceGlobalMatch ? 'g' : '';\n if (currentValue && newValue && currentValue !== newValue) {\n if (!newString.includes(currentValue)) {\n logger.debug(\n { stringToReplace: newString, currentValue, currentValueTemplate },\n 'currentValue not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentValue), autoReplaceRegExpFlag),\n newValue,\n );\n }\n if (depName && newName && depName !== newName) {\n if (!newString.includes(depName)) {\n logger.debug(\n { stringToReplace: newString, depName, depNameTemplate },\n 'depName not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(depName), autoReplaceRegExpFlag),\n newName,\n );\n }\n if (currentDigest && newDigest && currentDigest !== newDigest) {\n if (!newString.includes(currentDigest)) {\n logger.debug(\n { stringToReplace: newString, currentDigest },\n 'currentDigest not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentDigest), autoReplaceRegExpFlag),\n newDigest,\n );\n } else if (\n currentDigestShort &&\n newDigest &&\n currentDigestShort !== newDigest &&\n // Only use short digest replacement when there's no full currentDigest\n // that already matches newDigest (otherwise we'd incorrectly replace\n // part of an already-correct digest)\n !(currentDigest && currentDigest === newDigest)\n ) {\n if (!newString.includes(currentDigestShort)) {\n logger.debug(\n { stringToReplace: newString, currentDigestShort },\n 'currentDigestShort not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentDigestShort), autoReplaceRegExpFlag),\n newDigest,\n );\n }\n }\n if (!firstUpdate && (await confirmIfDepUpdated(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Package file is already updated - no work to do',\n );\n return existingContent;\n }\n logger.debug(\n { packageFile, depName },\n `Starting search at index ${searchIndex}`,\n );\n let newContent = existingContent;\n let nameReplaced = !newName;\n let valueReplaced = !newValue;\n let digestReplaced = !newDigest;\n let startIndex = searchIndex;\n // Iterate through the rest of the file\n for (; searchIndex < newContent.length; searchIndex += 1) {\n // First check if we have a hit for the old version\n if (replaceWithoutReplaceString) {\n // look for depName and currentValue\n if (newName && matchAt(newContent, searchIndex, depName!)) {\n logger.debug(\n { packageFile, depName },\n `Found depName at index ${searchIndex}`,\n );\n if (nameReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // replace with newName\n newContent = replaceAt(newContent, searchIndex, depName!, newName);\n await writeLocalFile(upgrade.packageFile!, newContent);\n nameReplaced = true;\n searchIndex += newName.length - 1;\n } else if (\n newValue &&\n matchAt(newContent, searchIndex, currentValue!)\n ) {\n logger.debug(\n { packageFile, currentValue },\n `Found currentValue at index ${searchIndex}`,\n );\n if (valueReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n currentValue!,\n newValue,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n valueReplaced = true;\n searchIndex += newValue.length - 1;\n } else if (\n newDigest &&\n matchAt(newContent, searchIndex, currentDigest!)\n ) {\n logger.debug(\n { packageFile, currentDigest },\n `Found currentDigest at index ${searchIndex}`,\n );\n if (digestReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n currentDigest!,\n newDigest,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n digestReplaced = true;\n searchIndex += newDigest.length - 1;\n }\n if (nameReplaced && valueReplaced && digestReplaced) {\n if (await confirmIfDepUpdated(upgrade, newContent)) {\n return newContent;\n }\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n }\n } else if (matchAt(newContent, searchIndex, replaceString!)) {\n logger.debug(\n { packageFile, depName },\n `Found match at index ${searchIndex}`,\n );\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n replaceString!,\n newString,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n if (await confirmIfDepUpdated(upgrade, newContent)) {\n return newContent;\n }\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n }\n }\n } catch (err) {\n /* istanbul ignore next */\n logger.debug({ packageFile, depName, err }, 'doAutoReplace error');\n }\n // istanbul ignore next\n throw new Error(WORKER_FILE_UPDATE_FAILED);\n}\n"],"mappings":"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"}
|
|
@@ -359,14 +359,13 @@ async function checkForPendingVersions(manager, packageFileName, packageFileCont
|
|
|
359
359
|
if (!upgradeInfo) continue;
|
|
360
360
|
const resolvedVersion = dep.lockedVersion ?? dep.newVersion ?? dep.currentVersion ?? dep.currentValue;
|
|
361
361
|
if (!resolvedVersion) {
|
|
362
|
-
logger.
|
|
362
|
+
logger.warn({
|
|
363
363
|
packageFile: packageFileName,
|
|
364
364
|
manager,
|
|
365
365
|
branchName: config.branchName,
|
|
366
|
-
depName
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
throw new Error(WORKER_FILE_UPDATE_FAILED);
|
|
366
|
+
depName
|
|
367
|
+
}, `Could not determine resolved version for '${depName}' after updating '${packageFileName}'; skipping pending-version check`);
|
|
368
|
+
continue;
|
|
370
369
|
}
|
|
371
370
|
if (resolvedVersion && upgradeInfo.pendingVersions.has(resolvedVersion)) {
|
|
372
371
|
const expectedVersion = upgradeInfo.newVersion;
|
|
@@ -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 { 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 (newContent === packageFileContent) {\n if (upgrade.manager === 'git-submodules') {\n updatedFileContents[packageFile] = newContent;\n delete nonUpdatedFileContents[packageFile];\n }\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.error(\n {\n packageFile: packageFileName,\n manager,\n branchName: config.branchName,\n depName,\n newVersion: resolvedVersion,\n },\n `No new version found for '${depName}' after updating '${packageFileName}'`,\n );\n throw new Error(WORKER_FILE_UPDATE_FAILED);\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: https://docs.renovatebot.com/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 { 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 (newContent === packageFileContent) {\n if (upgrade.manager === 'git-submodules') {\n updatedFileContents[packageFile] = newContent;\n delete nonUpdatedFileContents[packageFile];\n }\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: https://docs.renovatebot.com/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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"}
|