renovate 43.265.5 → 43.267.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.
@@ -3,7 +3,7 @@ import { addSecretForSanitizing } from "../../../util/sanitize.js";
3
3
  import { logger } from "../../../logger/index.js";
4
4
  import { ECR } from "@aws-sdk/client-ecr";
5
5
  //#region lib/modules/datasource/docker/ecr.ts
6
- const ecrRegex = regEx(/\d+\.(?:dkr\.ecr|dkr-ecr)(?:-fips)?\.([-a-z0-9]+)\.(?:amazonaws\.com|on\.aws)/);
6
+ const ecrRegex = regEx(/\d+\.(?:dkr\.ecr|dkr-ecr)(?:-fips)?\.([-a-z0-9]+)\.(?:amazonaws\.com|on\.aws|amazonaws\.com\.cn|on\.amazonwebservices\.com\.cn|amazonaws\.eu|on\.amazonwebservices\.eu|c2s\.ic\.gov|on\.aws\.ic\.gov|sc2s\.sgov\.gov|on\.aws\.scloud|scloud\.adc-e\.uk|on\.cloud-aws\.adc-e\.uk|csp\.hci\.ic\.gov|on\.aws\.hci\.ic\.gov|)/);
7
7
  const ecrPublicRegex = regEx(/public\.ecr\.aws|ecr-public\.aws\.com/);
8
8
  async function getECRAuthToken(region, opts) {
9
9
  const config = { region };
@@ -1 +1 @@
1
- {"version":3,"file":"ecr.js","names":[],"sources":["../../../../lib/modules/datasource/docker/ecr.ts"],"sourcesContent":["import type { ECRClientConfig } from '@aws-sdk/client-ecr';\nimport { ECR } from '@aws-sdk/client-ecr';\nimport { logger } from '../../../logger/index.ts';\nimport type { HostRule } from '../../../types/index.ts';\nimport type { HttpError } from '../../../util/http/index.ts';\nimport type { HttpResponse } from '../../../util/http/types.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { addSecretForSanitizing } from '../../../util/sanitize.ts';\n\nexport const ecrRegex = regEx(\n /\\d+\\.(?:dkr\\.ecr|dkr-ecr)(?:-fips)?\\.([-a-z0-9]+)\\.(?:amazonaws\\.com|on\\.aws)/,\n);\nexport const ecrPublicRegex = regEx(/public\\.ecr\\.aws|ecr-public\\.aws\\.com/);\n\nexport async function getECRAuthToken(\n region: string,\n opts: HostRule,\n): Promise<string | null> {\n const config: ECRClientConfig = { region };\n if (opts.username === `AWS` && opts.password) {\n logger.trace(\n `AWS user specified, encoding basic auth credentials for ECR registry`,\n );\n return Buffer.from(`AWS:${opts.password}`).toString('base64');\n }\n if (opts.username && opts.password) {\n logger.trace(\n `Using AWS accessKey to get Authorization token for ECR registry`,\n );\n config.credentials = {\n accessKeyId: opts.username,\n secretAccessKey: opts.password,\n ...(opts.token && { sessionToken: opts.token }),\n };\n }\n\n const ecr = new ECR(config);\n try {\n const data = await ecr.getAuthorizationToken({});\n const authorizationToken = data?.authorizationData?.[0]?.authorizationToken;\n if (authorizationToken) {\n // sanitize token\n addSecretForSanitizing(authorizationToken);\n return authorizationToken;\n }\n logger.warn(\n 'Could not extract authorizationToken from ECR getAuthorizationToken response',\n );\n } catch (err) {\n logger.trace({ err }, 'err');\n logger.warn('ECR getAuthorizationToken error');\n }\n return null;\n}\n\n// https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_DescribeRepositories.html#ECR-DescribeRepositories-request-maxResults\nexport function isECRMaxResultsResponse(resp: HttpResponse<unknown>): boolean {\n const body = resp.body as { errors?: { message?: string }[] } | undefined;\n return !!(\n resp.statusCode === 405 &&\n resp.headers?.['docker-distribution-api-version'] &&\n body?.errors?.[0]?.message?.includes(\n 'Member must have value less than or equal to 1000',\n )\n );\n}\n\nexport function isECRMaxResultsError(err: HttpError): boolean {\n const resp = err.response as HttpResponse<unknown> | undefined;\n return !!resp && isECRMaxResultsResponse(resp);\n}\n"],"mappings":";;;;;AASA,MAAa,WAAW,MACtB,+EACF;AACA,MAAa,iBAAiB,MAAM,uCAAuC;AAE3E,eAAsB,gBACpB,QACA,MACwB;CACxB,MAAM,SAA0B,EAAE,OAAO;CACzC,IAAI,KAAK,aAAa,SAAS,KAAK,UAAU;EAC5C,OAAO,MACL,sEACF;EACA,OAAO,OAAO,KAAK,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,QAAQ;CAC9D;CACA,IAAI,KAAK,YAAY,KAAK,UAAU;EAClC,OAAO,MACL,iEACF;EACA,OAAO,cAAc;GACnB,aAAa,KAAK;GAClB,iBAAiB,KAAK;GACtB,GAAI,KAAK,SAAS,EAAE,cAAc,KAAK,MAAM;EAC/C;CACF;CAEA,MAAM,MAAM,IAAI,IAAI,MAAM;CAC1B,IAAI;EAEF,MAAM,sBAAqB,MADR,IAAI,sBAAsB,CAAC,CAAC,EAAA,EACd,oBAAoB,EAAE,EAAE;EACzD,IAAI,oBAAoB;GAEtB,uBAAuB,kBAAkB;GACzC,OAAO;EACT;EACA,OAAO,KACL,8EACF;CACF,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,KAAK;EAC3B,OAAO,KAAK,iCAAiC;CAC/C;CACA,OAAO;AACT;AAGA,SAAgB,wBAAwB,MAAsC;CAC5E,MAAM,OAAO,KAAK;CAClB,OAAO,CAAC,EACN,KAAK,eAAe,OACpB,KAAK,UAAU,sCACf,MAAM,SAAS,EAAE,EAAE,SAAS,SAC1B,mDACF;AAEJ;AAEA,SAAgB,qBAAqB,KAAyB;CAC5D,MAAM,OAAO,IAAI;CACjB,OAAO,CAAC,CAAC,QAAQ,wBAAwB,IAAI;AAC/C"}
1
+ {"version":3,"file":"ecr.js","names":[],"sources":["../../../../lib/modules/datasource/docker/ecr.ts"],"sourcesContent":["import type { ECRClientConfig } from '@aws-sdk/client-ecr';\nimport { ECR } from '@aws-sdk/client-ecr';\nimport { logger } from '../../../logger/index.ts';\nimport type { HostRule } from '../../../types/index.ts';\nimport type { HttpError } from '../../../util/http/index.ts';\nimport type { HttpResponse } from '../../../util/http/types.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { addSecretForSanitizing } from '../../../util/sanitize.ts';\n\nexport const ecrRegex = regEx(\n /\\d+\\.(?:dkr\\.ecr|dkr-ecr)(?:-fips)?\\.([-a-z0-9]+)\\.(?:amazonaws\\.com|on\\.aws|amazonaws\\.com\\.cn|on\\.amazonwebservices\\.com\\.cn|amazonaws\\.eu|on\\.amazonwebservices\\.eu|c2s\\.ic\\.gov|on\\.aws\\.ic\\.gov|sc2s\\.sgov\\.gov|on\\.aws\\.scloud|scloud\\.adc-e\\.uk|on\\.cloud-aws\\.adc-e\\.uk|csp\\.hci\\.ic\\.gov|on\\.aws\\.hci\\.ic\\.gov|)/,\n);\nexport const ecrPublicRegex = regEx(/public\\.ecr\\.aws|ecr-public\\.aws\\.com/);\n\nexport async function getECRAuthToken(\n region: string,\n opts: HostRule,\n): Promise<string | null> {\n const config: ECRClientConfig = { region };\n if (opts.username === `AWS` && opts.password) {\n logger.trace(\n `AWS user specified, encoding basic auth credentials for ECR registry`,\n );\n return Buffer.from(`AWS:${opts.password}`).toString('base64');\n }\n if (opts.username && opts.password) {\n logger.trace(\n `Using AWS accessKey to get Authorization token for ECR registry`,\n );\n config.credentials = {\n accessKeyId: opts.username,\n secretAccessKey: opts.password,\n ...(opts.token && { sessionToken: opts.token }),\n };\n }\n\n const ecr = new ECR(config);\n try {\n const data = await ecr.getAuthorizationToken({});\n const authorizationToken = data?.authorizationData?.[0]?.authorizationToken;\n if (authorizationToken) {\n // sanitize token\n addSecretForSanitizing(authorizationToken);\n return authorizationToken;\n }\n logger.warn(\n 'Could not extract authorizationToken from ECR getAuthorizationToken response',\n );\n } catch (err) {\n logger.trace({ err }, 'err');\n logger.warn('ECR getAuthorizationToken error');\n }\n return null;\n}\n\n// https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_DescribeRepositories.html#ECR-DescribeRepositories-request-maxResults\nexport function isECRMaxResultsResponse(resp: HttpResponse<unknown>): boolean {\n const body = resp.body as { errors?: { message?: string }[] } | undefined;\n return !!(\n resp.statusCode === 405 &&\n resp.headers?.['docker-distribution-api-version'] &&\n body?.errors?.[0]?.message?.includes(\n 'Member must have value less than or equal to 1000',\n )\n );\n}\n\nexport function isECRMaxResultsError(err: HttpError): boolean {\n const resp = err.response as HttpResponse<unknown> | undefined;\n return !!resp && isECRMaxResultsResponse(resp);\n}\n"],"mappings":";;;;;AASA,MAAa,WAAW,MACtB,2TACF;AACA,MAAa,iBAAiB,MAAM,uCAAuC;AAE3E,eAAsB,gBACpB,QACA,MACwB;CACxB,MAAM,SAA0B,EAAE,OAAO;CACzC,IAAI,KAAK,aAAa,SAAS,KAAK,UAAU;EAC5C,OAAO,MACL,sEACF;EACA,OAAO,OAAO,KAAK,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,QAAQ;CAC9D;CACA,IAAI,KAAK,YAAY,KAAK,UAAU;EAClC,OAAO,MACL,iEACF;EACA,OAAO,cAAc;GACnB,aAAa,KAAK;GAClB,iBAAiB,KAAK;GACtB,GAAI,KAAK,SAAS,EAAE,cAAc,KAAK,MAAM;EAC/C;CACF;CAEA,MAAM,MAAM,IAAI,IAAI,MAAM;CAC1B,IAAI;EAEF,MAAM,sBAAqB,MADR,IAAI,sBAAsB,CAAC,CAAC,EAAA,EACd,oBAAoB,EAAE,EAAE;EACzD,IAAI,oBAAoB;GAEtB,uBAAuB,kBAAkB;GACzC,OAAO;EACT;EACA,OAAO,KACL,8EACF;CACF,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,KAAK;EAC3B,OAAO,KAAK,iCAAiC;CAC/C;CACA,OAAO;AACT;AAGA,SAAgB,wBAAwB,MAAsC;CAC5E,MAAM,OAAO,KAAK;CAClB,OAAO,CAAC,EACN,KAAK,eAAe,OACpB,KAAK,UAAU,sCACf,MAAM,SAAS,EAAE,EAAE,SAAS,SAC1B,mDACF;AAEJ;AAEA,SAAgB,qBAAqB,KAAyB;CAC5D,MAAM,OAAO,IAAI;CACjB,OAAO,CAAC,CAAC,QAAQ,wBAAwB,IAAI;AAC/C"}
@@ -18,9 +18,9 @@ hashMap.set("buildkite", "a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1
18
18
  hashMap.set("buildpacks", "6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f");
19
19
  hashMap.set("bun", "2df1756b14b3d690e5ad1295bc1e78d8a8d7b967a552fd7b8e3274866a5acf3e");
20
20
  hashMap.set("bun-version", "df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4");
21
- hashMap.set("bundler", "a2fbfa9f12971e70e740b362d0cd488f6489e7c65bc9617b52b2ac67e6040551");
21
+ hashMap.set("bundler", "6731d919540235a39154d189d4c917fc4aee6b3b99194c4baf1aa9c7cc5c4f8b");
22
22
  hashMap.set("cake", "65ad4f28c318675b9edb49dbd11d677f42c762b01b3f5a25dd3b2f345ecd387e");
23
- hashMap.set("cargo", "23fcc425ccd3a50559210e0ab8c84c1d47cf5c617cd5d58afdcf258ab862bafa");
23
+ hashMap.set("cargo", "65b1485dc3e69910bf196910acbe3c54111d8dbf9ee431bc813b9ebcef3b0f62");
24
24
  hashMap.set("cdnurl", "d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177");
25
25
  hashMap.set("circleci", "91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85");
26
26
  hashMap.set("cloudbuild", "8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886");
@@ -42,7 +42,7 @@ hashMap.set("fleet", "d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f2
42
42
  hashMap.set("flux", "22de4afb277e579dcbc7ec765eca2ddc5e4b1bb39d49e762e8af026fa062c53f");
43
43
  hashMap.set("fvm", "9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90");
44
44
  hashMap.set("git-submodules", "4b633aedb8a792727f5e5d0b123a6b5a1b01429ea3153c567e2258523816205c");
45
- hashMap.set("github-actions", "100d3ecacf720978aef32ec929d879b6392485ecaab0cb395d497f24a0ab3850");
45
+ hashMap.set("github-actions", "a85781cdcfe5557acfb087bafbc78cc0d61a3f0d0d011d5e1cb6a5ba0fb8760b");
46
46
  hashMap.set("gitlabci", "0dec44dd398bfc5b3c19d0929bea2fef7f386c94acfd1b1d7bc2a31d81d96fd6");
47
47
  hashMap.set("gitlabci-include", "ef696c478c2ac1723b3aca070ba9779be0e702fff0844054251ba0029523d0eb");
48
48
  hashMap.set("glasskube", "253d6db30bdec75ed5ab5d26f31d69bc07813ba10089a28da12c6a29eff4ec70");
@@ -70,11 +70,11 @@ hashMap.set("maven", "2bf7b65d51718daf3eec4f30c0fc7f2f045f4f8f24862bebe17c2174ab
70
70
  hashMap.set("maven-wrapper", "976ed8a59cf43b0c765b1a49ebc5669478e78278cf48f4ce3d0deb49647d10e3");
71
71
  hashMap.set("meteor", "4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4");
72
72
  hashMap.set("mint", "248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e");
73
- hashMap.set("mise", "633e7e325055c9a39413dbce346c32cda6dec83ed9f20d6cdfc7d1255b94bafb");
73
+ hashMap.set("mise", "a5a62a5b5ae6d7429c6e4b8a15a6bf8937126605d9e5f2c15751e66a4f5b3418");
74
74
  hashMap.set("mix", "ead2078c33550ec8695298c053f549866e1701fa096440d4228e3e51f8f1e49c");
75
75
  hashMap.set("nix", "95f0827f7ec9a3bfd5119534f129aad6cf26b28e99d55aec0945f08bbfff9fb1");
76
76
  hashMap.set("nodenv", "ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8");
77
- hashMap.set("npm", "8c173b17fcce19d1be44d0d548809de5fb3d7e45adf3ce5fd6d7ebe699e94d6c");
77
+ hashMap.set("npm", "9f4e4a953c941fb64bb4dc86bf83ecc2c91cf937c034edd65d355f9ccdf73d45");
78
78
  hashMap.set("nuget", "54c1e149b47e4f588e99857e3e62b420f50649a868a28944a0c82a7b7fb530e7");
79
79
  hashMap.set("nvm", "3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322");
80
80
  hashMap.set("ocb", "032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca");
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','1d3568f42393d697f8f96d461b72077ee7a1044b654e87667a12f861b3083111');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','0407066010ebb3d7ad4c1afe6b9a3615a3c11d64dc3cf0674cb9dfc3ea272273');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','fad98996bea8626525ab925f83a6ae0ce9262c53770e7aa7cb448a1e0f1ddf21');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','c6e0ad88ea468664c3a33263baf7452d83d2d37ff09ba920e18f64ee81fd0acb');\nhashMap.set('bazel-module','b1324dc15e77012a667d33c48c14dec90aa25832593c6c47c219d57931bd1def');\nhashMap.set('bazelisk','49e6bd1fc8f03facd06e517dc64596833b90ee0a079a45cff78f0eeb3c3566f8');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','2df1756b14b3d690e5ad1295bc1e78d8a8d7b967a552fd7b8e3274866a5acf3e');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','a2fbfa9f12971e70e740b362d0cd488f6489e7c65bc9617b52b2ac67e6040551');\nhashMap.set('cake','65ad4f28c318675b9edb49dbd11d677f42c762b01b3f5a25dd3b2f345ecd387e');\nhashMap.set('cargo','23fcc425ccd3a50559210e0ab8c84c1d47cf5c617cd5d58afdcf258ab862bafa');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','08310c39254947632d42058f74f755e9d3f3019c2edeeaf52b5142917085e2df');\nhashMap.set('composer','991a845be7ede562df4abfb005caf5e22cded077cec46711f8c008e468fbd633');\nhashMap.set('conan','b846e8812d65d4201dc0bf7c1d5c344e3a1edaaff6441010875171028be2f0fb');\nhashMap.set('copier','3ff250122cf49d52f23fcd3686274b0e86a99d0cb8bfa7e3e2ee3dd3b3babd56');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','9fbc30b9ee7b8eb6ccbc1ef459b3c983bdb1dff38f43b51013056ce7b94ceced');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','ac472ae4897dc1df85326dbd89a8c3488579ae2b180014ffcf085ce422e19dbd');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','322b95f7e55dd78d7fe71306a6f649479eca61c60d75bb10b23604a230dbdd08');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','22de4afb277e579dcbc7ec765eca2ddc5e4b1bb39d49e762e8af026fa062c53f');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','4b633aedb8a792727f5e5d0b123a6b5a1b01429ea3153c567e2258523816205c');\nhashMap.set('github-actions','100d3ecacf720978aef32ec929d879b6392485ecaab0cb395d497f24a0ab3850');\nhashMap.set('gitlabci','0dec44dd398bfc5b3c19d0929bea2fef7f386c94acfd1b1d7bc2a31d81d96fd6');\nhashMap.set('gitlabci-include','ef696c478c2ac1723b3aca070ba9779be0e702fff0844054251ba0029523d0eb');\nhashMap.set('glasskube','253d6db30bdec75ed5ab5d26f31d69bc07813ba10089a28da12c6a29eff4ec70');\nhashMap.set('gleam','e7ee3392d1f900fc1299308c8e930db9288790c6d0b6c35f1a62e55683090d34');\nhashMap.set('gomod','9ab033fb37fbf3b212232019ba2d36e247acc9831f7c17818a40cb155606abfe');\nhashMap.set('gradle','65487851c4592d9f6b7889137576c4e2dd6a98b8bee6db9c999d67bfc13d5247');\nhashMap.set('gradle-wrapper','f85031e7feb4e811aa5f29c589a30f8076a078e5bbf366fb65fb28b5a47d2c44');\nhashMap.set('haskell-cabal','f232d0e883235f74ed71fd9de4a7468e5fcbda9a1af5beb56c24657f7bf2e891');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','5bbc18bf059640191e2237408ca3b442556834e5c1c05d3317e82e7e097ae1f2');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','86799a6d3fba17b1f4c8017d308cba44a1efcf6d6290371263b8cf14be9e16ae');\nhashMap.set('hermit','f30ba5fe8ee46997c1f3d15235e6ff64c96d7ce5e439ee99f8008580348fe0da');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','56ef90301143874355fd2ed25dff7c646875f701f97422d02e01d45608a88f31');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','f918a7f378dc207cadf291e7481006008c69623f690902ed921e1e33db270b78');\nhashMap.set('kotlin-script','99ef296792a0ca575ed31d3defb514b05a58083dc01c52ea0890c69d867ba1dd');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','c6ee547378d5c5619a0fe94be35f9838e0f006b4807a896e9caefefa20efacf7');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','2bf7b65d51718daf3eec4f30c0fc7f2f045f4f8f24862bebe17c2174abb606b9');\nhashMap.set('maven-wrapper','976ed8a59cf43b0c765b1a49ebc5669478e78278cf48f4ce3d0deb49647d10e3');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','633e7e325055c9a39413dbce346c32cda6dec83ed9f20d6cdfc7d1255b94bafb');\nhashMap.set('mix','ead2078c33550ec8695298c053f549866e1701fa096440d4228e3e51f8f1e49c');\nhashMap.set('nix','95f0827f7ec9a3bfd5119534f129aad6cf26b28e99d55aec0945f08bbfff9fb1');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','8c173b17fcce19d1be44d0d548809de5fb3d7e45adf3ce5fd6d7ebe699e94d6c');\nhashMap.set('nuget','54c1e149b47e4f588e99857e3e62b420f50649a868a28944a0c82a7b7fb530e7');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','fffd093eaf6de3cab7b2f6b57e57715aa240fcd958954f31fbc47f18e1730a4d');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','fd26981e4e865b8fece492ff78faf34701af62bb8f39397445780eb81b66b7db');\nhashMap.set('pip_requirements','edaf5ec21e63fd252e6737b294f215d59068b0bba1dea92b9d4510dbb872c837');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','1d0af710667f6dce377feae9aa238b21fe5e0e75e75758a70f5e9758c6cb6678');\nhashMap.set('pixi','7d183aaae4370a0c62496bbff60ad12fd4dd46822630541f712f437dcea021e1');\nhashMap.set('poetry','0211739556f8193c70fa69cbf66c60e688042fd7dc7a2fe08f9f328b35ad1f82');\nhashMap.set('pre-commit','a6a6e847fdb0f56650e66ef7d69e68de752b390913f79ac31d1a7ec5955d03da');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','aad0dd6524158fda5345d75662f337b275c6c46b29f051ba94201d42c22b0da8');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e355e13e104351a8b3516a8e272fc5f7e625c9f39b0c492ba27283a36227c2d4');\nhashMap.set('renovate-config','2a4e4fb671aed5d0c900b8d54c31bfef46ca36d0f4e16b00ff73377b9c09fb69');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','e957f1f1563af4e5fbd1c552ca15632b7808d9d2e51ec0da6022a1f84372caec');\nhashMap.set('sbt','74125bd9c76a5724092258cd1dee1ea99fc0d735b463a2b64fedc5d950efde2a');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('sveltos','05b3158e88771ed4629e171592cf4f1bf0ff342f8aeae89be0b340c630cc6d8e');\nhashMap.set('swift','56cdc6fe4cd00519f953459f94323c71677f6bde007537eef891154fb8696db1');\nhashMap.set('tekton','fdc5b9b5edec2a90cda2f858f3ebc532aa8efb1187d1e0b7c89b07796e9cb6cd');\nhashMap.set('terraform','374c6e681a1b2a40c6d914a94485f15e68051f651972cd2dd3415ed4725eb74c');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','142c3f0549c4152297615b5bbf3a78ba8f7ce6a0cebcea63b81e9815dca40494');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','4a975f0cc1aa22cd258aa835de3dc98d7a5c0d1cee0a1092324338968e08a827');\nhashMap.set('travis','bb482a0195cd009ec3896a6227bb95617f5c84bedb518c7d971e50c62235d9ca');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','dfd7b905577b362093ce72e6ee597308f97c83678ddb15d6455a1627969b8b7d');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','46efac5bda6737cccacf2d89ce1d384ee410876c5557b4c02be2275b7c1d862d');\nhashMap.set('regex','dbe6889ea021a05127fed06226d73366fdada2ae577147a5c027996fd325416e');"],"mappings":"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"}
1
+ {"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','1d3568f42393d697f8f96d461b72077ee7a1044b654e87667a12f861b3083111');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','0407066010ebb3d7ad4c1afe6b9a3615a3c11d64dc3cf0674cb9dfc3ea272273');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','fad98996bea8626525ab925f83a6ae0ce9262c53770e7aa7cb448a1e0f1ddf21');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','c6e0ad88ea468664c3a33263baf7452d83d2d37ff09ba920e18f64ee81fd0acb');\nhashMap.set('bazel-module','b1324dc15e77012a667d33c48c14dec90aa25832593c6c47c219d57931bd1def');\nhashMap.set('bazelisk','49e6bd1fc8f03facd06e517dc64596833b90ee0a079a45cff78f0eeb3c3566f8');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','2df1756b14b3d690e5ad1295bc1e78d8a8d7b967a552fd7b8e3274866a5acf3e');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6731d919540235a39154d189d4c917fc4aee6b3b99194c4baf1aa9c7cc5c4f8b');\nhashMap.set('cake','65ad4f28c318675b9edb49dbd11d677f42c762b01b3f5a25dd3b2f345ecd387e');\nhashMap.set('cargo','65b1485dc3e69910bf196910acbe3c54111d8dbf9ee431bc813b9ebcef3b0f62');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','08310c39254947632d42058f74f755e9d3f3019c2edeeaf52b5142917085e2df');\nhashMap.set('composer','991a845be7ede562df4abfb005caf5e22cded077cec46711f8c008e468fbd633');\nhashMap.set('conan','b846e8812d65d4201dc0bf7c1d5c344e3a1edaaff6441010875171028be2f0fb');\nhashMap.set('copier','3ff250122cf49d52f23fcd3686274b0e86a99d0cb8bfa7e3e2ee3dd3b3babd56');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','9fbc30b9ee7b8eb6ccbc1ef459b3c983bdb1dff38f43b51013056ce7b94ceced');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','ac472ae4897dc1df85326dbd89a8c3488579ae2b180014ffcf085ce422e19dbd');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','322b95f7e55dd78d7fe71306a6f649479eca61c60d75bb10b23604a230dbdd08');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','22de4afb277e579dcbc7ec765eca2ddc5e4b1bb39d49e762e8af026fa062c53f');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','4b633aedb8a792727f5e5d0b123a6b5a1b01429ea3153c567e2258523816205c');\nhashMap.set('github-actions','a85781cdcfe5557acfb087bafbc78cc0d61a3f0d0d011d5e1cb6a5ba0fb8760b');\nhashMap.set('gitlabci','0dec44dd398bfc5b3c19d0929bea2fef7f386c94acfd1b1d7bc2a31d81d96fd6');\nhashMap.set('gitlabci-include','ef696c478c2ac1723b3aca070ba9779be0e702fff0844054251ba0029523d0eb');\nhashMap.set('glasskube','253d6db30bdec75ed5ab5d26f31d69bc07813ba10089a28da12c6a29eff4ec70');\nhashMap.set('gleam','e7ee3392d1f900fc1299308c8e930db9288790c6d0b6c35f1a62e55683090d34');\nhashMap.set('gomod','9ab033fb37fbf3b212232019ba2d36e247acc9831f7c17818a40cb155606abfe');\nhashMap.set('gradle','65487851c4592d9f6b7889137576c4e2dd6a98b8bee6db9c999d67bfc13d5247');\nhashMap.set('gradle-wrapper','f85031e7feb4e811aa5f29c589a30f8076a078e5bbf366fb65fb28b5a47d2c44');\nhashMap.set('haskell-cabal','f232d0e883235f74ed71fd9de4a7468e5fcbda9a1af5beb56c24657f7bf2e891');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','5bbc18bf059640191e2237408ca3b442556834e5c1c05d3317e82e7e097ae1f2');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','86799a6d3fba17b1f4c8017d308cba44a1efcf6d6290371263b8cf14be9e16ae');\nhashMap.set('hermit','f30ba5fe8ee46997c1f3d15235e6ff64c96d7ce5e439ee99f8008580348fe0da');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','56ef90301143874355fd2ed25dff7c646875f701f97422d02e01d45608a88f31');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','f918a7f378dc207cadf291e7481006008c69623f690902ed921e1e33db270b78');\nhashMap.set('kotlin-script','99ef296792a0ca575ed31d3defb514b05a58083dc01c52ea0890c69d867ba1dd');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','c6ee547378d5c5619a0fe94be35f9838e0f006b4807a896e9caefefa20efacf7');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','2bf7b65d51718daf3eec4f30c0fc7f2f045f4f8f24862bebe17c2174abb606b9');\nhashMap.set('maven-wrapper','976ed8a59cf43b0c765b1a49ebc5669478e78278cf48f4ce3d0deb49647d10e3');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','a5a62a5b5ae6d7429c6e4b8a15a6bf8937126605d9e5f2c15751e66a4f5b3418');\nhashMap.set('mix','ead2078c33550ec8695298c053f549866e1701fa096440d4228e3e51f8f1e49c');\nhashMap.set('nix','95f0827f7ec9a3bfd5119534f129aad6cf26b28e99d55aec0945f08bbfff9fb1');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','9f4e4a953c941fb64bb4dc86bf83ecc2c91cf937c034edd65d355f9ccdf73d45');\nhashMap.set('nuget','54c1e149b47e4f588e99857e3e62b420f50649a868a28944a0c82a7b7fb530e7');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','fffd093eaf6de3cab7b2f6b57e57715aa240fcd958954f31fbc47f18e1730a4d');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','fd26981e4e865b8fece492ff78faf34701af62bb8f39397445780eb81b66b7db');\nhashMap.set('pip_requirements','edaf5ec21e63fd252e6737b294f215d59068b0bba1dea92b9d4510dbb872c837');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','1d0af710667f6dce377feae9aa238b21fe5e0e75e75758a70f5e9758c6cb6678');\nhashMap.set('pixi','7d183aaae4370a0c62496bbff60ad12fd4dd46822630541f712f437dcea021e1');\nhashMap.set('poetry','0211739556f8193c70fa69cbf66c60e688042fd7dc7a2fe08f9f328b35ad1f82');\nhashMap.set('pre-commit','a6a6e847fdb0f56650e66ef7d69e68de752b390913f79ac31d1a7ec5955d03da');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','aad0dd6524158fda5345d75662f337b275c6c46b29f051ba94201d42c22b0da8');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e355e13e104351a8b3516a8e272fc5f7e625c9f39b0c492ba27283a36227c2d4');\nhashMap.set('renovate-config','2a4e4fb671aed5d0c900b8d54c31bfef46ca36d0f4e16b00ff73377b9c09fb69');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','e957f1f1563af4e5fbd1c552ca15632b7808d9d2e51ec0da6022a1f84372caec');\nhashMap.set('sbt','74125bd9c76a5724092258cd1dee1ea99fc0d735b463a2b64fedc5d950efde2a');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('sveltos','05b3158e88771ed4629e171592cf4f1bf0ff342f8aeae89be0b340c630cc6d8e');\nhashMap.set('swift','56cdc6fe4cd00519f953459f94323c71677f6bde007537eef891154fb8696db1');\nhashMap.set('tekton','fdc5b9b5edec2a90cda2f858f3ebc532aa8efb1187d1e0b7c89b07796e9cb6cd');\nhashMap.set('terraform','374c6e681a1b2a40c6d914a94485f15e68051f651972cd2dd3415ed4725eb74c');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','142c3f0549c4152297615b5bbf3a78ba8f7ce6a0cebcea63b81e9815dca40494');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','4a975f0cc1aa22cd258aa835de3dc98d7a5c0d1cee0a1092324338968e08a827');\nhashMap.set('travis','bb482a0195cd009ec3896a6227bb95617f5c84bedb518c7d971e50c62235d9ca');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','dfd7b905577b362093ce72e6ee597308f97c83678ddb15d6455a1627969b8b7d');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','46efac5bda6737cccacf2d89ce1d384ee410876c5557b4c02be2275b7c1d862d');\nhashMap.set('regex','dbe6889ea021a05127fed06226d73366fdada2ae577147a5c027996fd325416e');"],"mappings":"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"}
@@ -119,6 +119,10 @@ const communityActions = {
119
119
  packageName: "",
120
120
  withSchema: InstallBinaryWith
121
121
  },
122
+ "jdx/mise-action": {
123
+ datasource: GithubReleasesDatasource.id,
124
+ packageName: "jdx/mise"
125
+ },
122
126
  "oven-sh/setup-bun": {
123
127
  datasource: NpmDatasource.id,
124
128
  packageName: "bun",
@@ -1 +1 @@
1
- {"version":3,"file":"community.js","names":["condaVersioning.id"],"sources":["../../../../lib/modules/manager/github-actions/community.ts"],"sourcesContent":["import { z } from 'zod/v4';\n\nimport { escapeRegExp, regEx } from '../../../util/regex.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { NpmDatasource } from '../../datasource/npm/index.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';\nimport { RustVersionDatasource } from '../../datasource/rust-version/index.ts';\nimport * as condaVersioning from '../../versioning/conda/index.ts';\nimport * as npmVersioning from '../../versioning/npm/index.ts';\nimport type { PackageDependency } from '../types.ts';\n\nexport interface CommunityActionConfig {\n datasource: string;\n depName?: string;\n packageName: string;\n versioning?: string;\n extractVersion?: string;\n\n /**\n * should return `true` if the version is invalid and should be skipped\n */\n isInvalid?: (value: string) => boolean;\n\n withSchema?: z.ZodType<{ val: string | undefined } & Record<string, unknown>>;\n}\n\ntype ActionSchema = z.ZodType<PackageDependency>;\n\nfunction actionSchema(\n name: string,\n { isInvalid, withSchema, ...cfg }: CommunityActionConfig,\n): ActionSchema {\n return z\n .object({\n uses: matchAction(name),\n with: withSchema ?? VersionVal,\n })\n .transform(\n ({ with: { val, ...meta } }): PackageDependency => ({\n ...cfg,\n ...meta,\n ...parseValue(val, isInvalid),\n }),\n )\n .transform((dep) => {\n dep.depName ??= dep.packageName;\n return dep;\n });\n}\n\nfunction matchAction(action: string): z.ZodString {\n return z\n .string()\n .regex(regEx(`(?:https?://[^/]+/)?${escapeRegExp(action)}(?:@.+)?$`));\n}\n\nfunction parseValue(\n currentValue: string | undefined,\n isInvalid?: (val: string) => boolean,\n): PackageDependency {\n if (!currentValue) {\n return {\n skipStage: 'extract',\n skipReason: 'unspecified-version',\n depType: 'uses-with',\n };\n }\n if (isInvalid?.(currentValue) === true) {\n return {\n skipStage: 'extract',\n skipReason: 'invalid-version',\n depType: 'uses-with',\n currentValue,\n };\n }\n return { currentValue, depType: 'uses-with' };\n}\n\nfunction valSchema(key: string): z.ZodType<{ val: string | undefined }> {\n return z\n .object({ [key]: z.string().optional() })\n .transform((val) => ({ val: val[key] }));\n}\n\nconst VersionVal = z\n .object({ version: z.string().optional() })\n .transform((val) => ({ val: val.version }));\n\nconst InstallBinaryWith = z\n .object({ repo: z.string(), tag: z.string() })\n .transform(({ repo, tag }) => ({ packageName: repo, val: tag }));\n\n/**\n * Community contributed actions with known version input schemas.\n */\nexport const communityActions: Record<string, CommunityActionConfig> = {\n // https://github.com/aquasecurity/setup-trivy\n 'aquasecurity/setup-trivy': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'aquasecurity/trivy',\n },\n // https://github.com/aquasecurity/trivy-action\n 'aquasecurity/trivy-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'aquasecurity/trivy',\n },\n // https://github.com/astral-sh/setup-uv\n 'astral-sh/setup-uv': {\n datasource: GithubReleasesDatasource.id,\n versioning: npmVersioning.id,\n packageName: 'astral-sh/uv',\n },\n 'azure/setup-helm': {\n datasource: GithubReleasesDatasource.id,\n depName: 'helm',\n packageName: 'helm/helm',\n },\n // https://github.com/azure/setup-helm\n 'denoland/setup-deno': {\n datasource: NpmDatasource.id,\n packageName: 'deno',\n withSchema: valSchema('deno-version'),\n },\n // https://github.com/docker/setup-buildx-action\n 'docker/setup-buildx-action': {\n datasource: GithubReleasesDatasource.id,\n depName: 'buildx',\n packageName: 'docker/buildx',\n },\n // https://github.com/docker/setup-compose-action\n 'docker/setup-compose-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'docker/compose',\n },\n // https://github.com/docker/setup-docker-action\n 'docker/setup-docker-action': {\n datasource: GithubReleasesDatasource.id,\n depName: 'docker',\n packageName: 'moby/moby',\n extractVersion: '^docker-(?<version>.+)$',\n },\n // https://github.com/dtolnay/rust-toolchain\n 'dtolnay/rust-toolchain': {\n datasource: RustVersionDatasource.id,\n packageName: 'rust',\n withSchema: valSchema('toolchain'),\n },\n 'golangci/golangci-lint-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'golangci/golangci-lint',\n },\n // https://github.com/helm/chart-testing-action\n 'helm/chart-testing-action': {\n datasource: GithubReleasesDatasource.id,\n depName: 'chart-testing',\n packageName: 'helm/chart-testing',\n },\n 'jakebailey/pyright-action': {\n datasource: NpmDatasource.id,\n packageName: 'pyright',\n isInvalid: (val) => val === 'PATH',\n },\n 'jaxxstorm/action-install-gh-release': {\n datasource: GithubReleasesDatasource.id,\n packageName: '', // determined from `repo` input\n withSchema: InstallBinaryWith,\n },\n 'oven-sh/setup-bun': {\n datasource: NpmDatasource.id,\n packageName: 'bun',\n withSchema: valSchema('bun-version'),\n },\n 'pdm-project/setup-pdm': {\n datasource: PypiDatasource.id,\n packageName: 'pdm',\n },\n 'pnpm/action-setup': {\n datasource: NpmDatasource.id,\n packageName: 'pnpm',\n },\n 'prefix-dev/setup-pixi': {\n datasource: GithubReleasesDatasource.id,\n versioning: condaVersioning.id,\n packageName: 'prefix-dev/pixi',\n withSchema: valSchema('pixi-version'),\n },\n // https://github.com/pypa/hatch/tree/install\n 'pypa/hatch': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'pypa/hatch',\n // Strip hatch- prefix from release tags\n extractVersion: '^hatch-(?<version>.+)$',\n },\n 'ruby/setup-ruby': {\n datasource: RubyVersionDatasource.id,\n packageName: 'ruby',\n withSchema: valSchema('ruby-version'),\n },\n 'sigoden/install-binary': {\n datasource: GithubReleasesDatasource.id,\n packageName: '', // determined from `repo` input\n withSchema: InstallBinaryWith,\n },\n 'zizmorcore/zizmor-action': {\n datasource: DockerDatasource.id,\n packageName: 'ghcr.io/zizmorcore/zizmor',\n },\n};\n\nexport const CommunityActions = z.union(\n Object.entries(communityActions).map(([name, cfg]) =>\n actionSchema(name, cfg),\n ) as [ActionSchema, ActionSchema, ...ActionSchema[]],\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"community.js","names":["condaVersioning.id"],"sources":["../../../../lib/modules/manager/github-actions/community.ts"],"sourcesContent":["import { z } from 'zod/v4';\n\nimport { escapeRegExp, regEx } from '../../../util/regex.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { NpmDatasource } from '../../datasource/npm/index.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';\nimport { RustVersionDatasource } from '../../datasource/rust-version/index.ts';\nimport * as condaVersioning from '../../versioning/conda/index.ts';\nimport * as npmVersioning from '../../versioning/npm/index.ts';\nimport type { PackageDependency } from '../types.ts';\n\nexport interface CommunityActionConfig {\n datasource: string;\n depName?: string;\n packageName: string;\n versioning?: string;\n extractVersion?: string;\n\n /**\n * should return `true` if the version is invalid and should be skipped\n */\n isInvalid?: (value: string) => boolean;\n\n withSchema?: z.ZodType<{ val: string | undefined } & Record<string, unknown>>;\n}\n\ntype ActionSchema = z.ZodType<PackageDependency>;\n\nfunction actionSchema(\n name: string,\n { isInvalid, withSchema, ...cfg }: CommunityActionConfig,\n): ActionSchema {\n return z\n .object({\n uses: matchAction(name),\n with: withSchema ?? VersionVal,\n })\n .transform(\n ({ with: { val, ...meta } }): PackageDependency => ({\n ...cfg,\n ...meta,\n ...parseValue(val, isInvalid),\n }),\n )\n .transform((dep) => {\n dep.depName ??= dep.packageName;\n return dep;\n });\n}\n\nfunction matchAction(action: string): z.ZodString {\n return z\n .string()\n .regex(regEx(`(?:https?://[^/]+/)?${escapeRegExp(action)}(?:@.+)?$`));\n}\n\nfunction parseValue(\n currentValue: string | undefined,\n isInvalid?: (val: string) => boolean,\n): PackageDependency {\n if (!currentValue) {\n return {\n skipStage: 'extract',\n skipReason: 'unspecified-version',\n depType: 'uses-with',\n };\n }\n if (isInvalid?.(currentValue) === true) {\n return {\n skipStage: 'extract',\n skipReason: 'invalid-version',\n depType: 'uses-with',\n currentValue,\n };\n }\n return { currentValue, depType: 'uses-with' };\n}\n\nfunction valSchema(key: string): z.ZodType<{ val: string | undefined }> {\n return z\n .object({ [key]: z.string().optional() })\n .transform((val) => ({ val: val[key] }));\n}\n\nconst VersionVal = z\n .object({ version: z.string().optional() })\n .transform((val) => ({ val: val.version }));\n\nconst InstallBinaryWith = z\n .object({ repo: z.string(), tag: z.string() })\n .transform(({ repo, tag }) => ({ packageName: repo, val: tag }));\n\n/**\n * Community contributed actions with known version input schemas.\n */\nexport const communityActions: Record<string, CommunityActionConfig> = {\n // https://github.com/aquasecurity/setup-trivy\n 'aquasecurity/setup-trivy': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'aquasecurity/trivy',\n },\n // https://github.com/aquasecurity/trivy-action\n 'aquasecurity/trivy-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'aquasecurity/trivy',\n },\n // https://github.com/astral-sh/setup-uv\n 'astral-sh/setup-uv': {\n datasource: GithubReleasesDatasource.id,\n versioning: npmVersioning.id,\n packageName: 'astral-sh/uv',\n },\n 'azure/setup-helm': {\n datasource: GithubReleasesDatasource.id,\n depName: 'helm',\n packageName: 'helm/helm',\n },\n // https://github.com/azure/setup-helm\n 'denoland/setup-deno': {\n datasource: NpmDatasource.id,\n packageName: 'deno',\n withSchema: valSchema('deno-version'),\n },\n // https://github.com/docker/setup-buildx-action\n 'docker/setup-buildx-action': {\n datasource: GithubReleasesDatasource.id,\n depName: 'buildx',\n packageName: 'docker/buildx',\n },\n // https://github.com/docker/setup-compose-action\n 'docker/setup-compose-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'docker/compose',\n },\n // https://github.com/docker/setup-docker-action\n 'docker/setup-docker-action': {\n datasource: GithubReleasesDatasource.id,\n depName: 'docker',\n packageName: 'moby/moby',\n extractVersion: '^docker-(?<version>.+)$',\n },\n // https://github.com/dtolnay/rust-toolchain\n 'dtolnay/rust-toolchain': {\n datasource: RustVersionDatasource.id,\n packageName: 'rust',\n withSchema: valSchema('toolchain'),\n },\n 'golangci/golangci-lint-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'golangci/golangci-lint',\n },\n // https://github.com/helm/chart-testing-action\n 'helm/chart-testing-action': {\n datasource: GithubReleasesDatasource.id,\n depName: 'chart-testing',\n packageName: 'helm/chart-testing',\n },\n 'jakebailey/pyright-action': {\n datasource: NpmDatasource.id,\n packageName: 'pyright',\n isInvalid: (val) => val === 'PATH',\n },\n 'jaxxstorm/action-install-gh-release': {\n datasource: GithubReleasesDatasource.id,\n packageName: '', // determined from `repo` input\n withSchema: InstallBinaryWith,\n },\n 'jdx/mise-action': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'jdx/mise',\n },\n 'oven-sh/setup-bun': {\n datasource: NpmDatasource.id,\n packageName: 'bun',\n withSchema: valSchema('bun-version'),\n },\n 'pdm-project/setup-pdm': {\n datasource: PypiDatasource.id,\n packageName: 'pdm',\n },\n 'pnpm/action-setup': {\n datasource: NpmDatasource.id,\n packageName: 'pnpm',\n },\n 'prefix-dev/setup-pixi': {\n datasource: GithubReleasesDatasource.id,\n versioning: condaVersioning.id,\n packageName: 'prefix-dev/pixi',\n withSchema: valSchema('pixi-version'),\n },\n // https://github.com/pypa/hatch/tree/install\n 'pypa/hatch': {\n datasource: GithubReleasesDatasource.id,\n packageName: 'pypa/hatch',\n // Strip hatch- prefix from release tags\n extractVersion: '^hatch-(?<version>.+)$',\n },\n 'ruby/setup-ruby': {\n datasource: RubyVersionDatasource.id,\n packageName: 'ruby',\n withSchema: valSchema('ruby-version'),\n },\n 'sigoden/install-binary': {\n datasource: GithubReleasesDatasource.id,\n packageName: '', // determined from `repo` input\n withSchema: InstallBinaryWith,\n },\n 'zizmorcore/zizmor-action': {\n datasource: DockerDatasource.id,\n packageName: 'ghcr.io/zizmorcore/zizmor',\n },\n};\n\nexport const CommunityActions = z.union(\n Object.entries(communityActions).map(([name, cfg]) =>\n actionSchema(name, cfg),\n ) as [ActionSchema, ActionSchema, ...ActionSchema[]],\n);\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { PnpmWorkspaceFile } from "../schema.js";
5
5
  import { resolveNpmrc } from "../npmrc.js";
6
6
  import { getExtractedConstraints } from "./common/dependency.js";
7
7
  import { extractPackageJson, hasPackageManager } from "./common/package-file.js";
8
- import { extractPnpmWorkspaceFile } from "./pnpm.js";
8
+ import { applyPnpmWorkspaceRegistries, extractPnpmWorkspaceFile } from "./pnpm.js";
9
9
  import { extractYarnCatalogs, isZeroInstall } from "./yarn.js";
10
10
  import { postExtract } from "./post/index.js";
11
11
  import { loadConfigFromLegacyYarnrc, loadConfigFromYarnrcYml, resolveRegistryUrl } from "./yarnrc.js";
@@ -54,6 +54,20 @@ async function extractPackageFile(content, packageFile, config) {
54
54
  const legacyYarnrcFileName = await findLocalSiblingOrParent(packageFile, ".yarnrc");
55
55
  const repoLegacyYarnrc = legacyYarnrcFileName ? await readLocalFile(legacyYarnrcFileName, "utf8") : null;
56
56
  if (isString(repoLegacyYarnrc) && repoLegacyYarnrc.trim().length > 0) yarnrcConfig = loadConfigFromLegacyYarnrc(repoLegacyYarnrc);
57
+ let pnpmWorkspaceRegistry;
58
+ let pnpmWorkspaceRegistries;
59
+ const pnpmWorkspaceYamlFileName = await findLocalSiblingOrParent(packageFile, "pnpm-workspace.yaml");
60
+ const repoPnpmWorkspaceYaml = pnpmWorkspaceYamlFileName ? await readLocalFile(pnpmWorkspaceYamlFileName, "utf8") : null;
61
+ if (isNonEmptyStringAndNotWhitespace(repoPnpmWorkspaceYaml)) {
62
+ const parsed = await PnpmWorkspaceFile.safeParseAsync(repoPnpmWorkspaceYaml);
63
+ if (parsed.success) {
64
+ pnpmWorkspaceRegistry = parsed.data.registry;
65
+ pnpmWorkspaceRegistries = parsed.data.registries;
66
+ } else logger.debug({
67
+ packageFile: pnpmWorkspaceYamlFileName,
68
+ err: parsed.error
69
+ }, "Failed to parse pnpm-workspace.yaml");
70
+ }
57
71
  if (res.deps.length === 0) {
58
72
  logger.debug("Package file has no deps");
59
73
  if (!(!!res.managerData?.packageJsonName || !!res.packageFileVersion || !!npmrc || workspacesPackages)) {
@@ -75,6 +89,7 @@ async function extractPackageFile(content, packageFile, config) {
75
89
  if (registryUrlFromYarnrcConfig && dep.datasource === NpmDatasource.id) dep.registryUrls = [registryUrlFromYarnrcConfig];
76
90
  }
77
91
  }
92
+ applyPnpmWorkspaceRegistries(res.deps, pnpmWorkspaceRegistries, pnpmWorkspaceRegistry);
78
93
  return {
79
94
  ...res,
80
95
  npmrc,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/modules/manager/npm/extract/index.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyObject,\n isNonEmptyStringAndNotWhitespace,\n isString,\n} from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n findLocalSiblingOrParent,\n getSiblingFileName,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\n\nimport type {\n ExtractConfig,\n PackageFile,\n PackageFileContent,\n} from '../../types.ts';\nimport { resolveNpmrc } from '../npmrc.ts';\nimport { PnpmWorkspaceFile, type YarnConfig } from '../schema.ts';\nimport type { NpmLockFiles, NpmManagerData } from '../types.ts';\nimport { getExtractedConstraints } from './common/dependency.ts';\nimport {\n extractPackageJson,\n hasPackageManager,\n} from './common/package-file.ts';\nimport { extractPnpmWorkspaceFile } from './pnpm.ts';\nimport { postExtract } from './post/index.ts';\nimport type { NpmPackage } from './types.ts';\nimport { extractYarnCatalogs, isZeroInstall } from './yarn.ts';\nimport {\n loadConfigFromLegacyYarnrc,\n loadConfigFromYarnrcYml,\n resolveRegistryUrl,\n} from './yarnrc.ts';\n\nfunction hasMultipleLockFiles(lockFiles: NpmLockFiles): boolean {\n return Object.values(lockFiles).filter(isString).length > 1;\n}\n\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): Promise<PackageFileContent<NpmManagerData> | null> {\n logger.trace(`npm.extractPackageFile(${packageFile})`);\n logger.trace({ content });\n let packageJson: NpmPackage;\n try {\n packageJson = JSON.parse(content);\n } catch {\n logger.debug({ packageFile }, `Invalid JSON`);\n return null;\n }\n\n const res = extractPackageJson(packageJson, packageFile);\n if (!res) {\n return null;\n }\n\n let workspacesPackages: string[] | undefined;\n if (isArray(packageJson.workspaces)) {\n workspacesPackages = packageJson.workspaces;\n } else {\n workspacesPackages = packageJson.workspaces?.packages;\n }\n\n const lockFiles: NpmLockFiles = {\n yarnLock: 'yarn.lock',\n packageLock: 'package-lock.json',\n shrinkwrapJson: 'npm-shrinkwrap.json',\n pnpmShrinkwrap: 'pnpm-lock.yaml',\n };\n\n for (const [key, val] of Object.entries(lockFiles) as [\n 'yarnLock' | 'packageLock' | 'shrinkwrapJson' | 'pnpmShrinkwrap',\n string,\n ][]) {\n const filePath = getSiblingFileName(packageFile, val);\n if (await readLocalFile(filePath, 'utf8')) {\n lockFiles[key] = filePath;\n } else {\n lockFiles[key] = undefined;\n }\n }\n lockFiles.npmLock = lockFiles.packageLock ?? lockFiles.shrinkwrapJson;\n delete lockFiles.packageLock;\n delete lockFiles.shrinkwrapJson;\n\n if (hasMultipleLockFiles(lockFiles)) {\n logger.warn(\n 'Updating multiple npm lock files is deprecated and support will be removed in future versions.',\n );\n }\n\n const { npmrc, npmrcFileName } = await resolveNpmrc(packageFile, config);\n\n const yarnrcYmlFileName = await findLocalSiblingOrParent(\n packageFile,\n '.yarnrc.yml',\n );\n const yarnZeroInstall = yarnrcYmlFileName\n ? await isZeroInstall(yarnrcYmlFileName)\n : false;\n\n let yarnrcConfig: YarnConfig | null = null;\n const repoYarnrcYml = yarnrcYmlFileName\n ? await readLocalFile(yarnrcYmlFileName, 'utf8')\n : null;\n if (isString(repoYarnrcYml) && repoYarnrcYml.trim().length > 0) {\n yarnrcConfig = loadConfigFromYarnrcYml(repoYarnrcYml);\n }\n\n const legacyYarnrcFileName = await findLocalSiblingOrParent(\n packageFile,\n '.yarnrc',\n );\n const repoLegacyYarnrc = legacyYarnrcFileName\n ? await readLocalFile(legacyYarnrcFileName, 'utf8')\n : null;\n if (isString(repoLegacyYarnrc) && repoLegacyYarnrc.trim().length > 0) {\n yarnrcConfig = loadConfigFromLegacyYarnrc(repoLegacyYarnrc);\n }\n\n if (res.deps.length === 0) {\n logger.debug('Package file has no deps');\n if (\n !(\n !!res.managerData?.packageJsonName ||\n !!res.packageFileVersion ||\n !!npmrc ||\n workspacesPackages\n )\n ) {\n logger.debug('Skipping file');\n return null;\n }\n }\n let skipInstalls = config.skipInstalls;\n if (skipInstalls === null) {\n const hasFancyRefs = !!res.deps.some(\n (dep) =>\n !!dep.currentValue?.startsWith('file:') ||\n !!dep.currentValue?.startsWith('npm:'),\n );\n if ((hasFancyRefs && !!lockFiles.npmLock) || yarnZeroInstall) {\n // https://github.com/npm/cli/issues/1432\n // Explanation:\n // - npm install --package-lock-only is buggy for transitive deps in file: and npm: references\n // - So we set skipInstalls to false if file: or npm: refs are found *and* the user hasn't explicitly set the value already\n // - Also, do not skip install if Yarn zero-install is used\n logger.debug('Automatically setting skipInstalls to false');\n skipInstalls = false;\n } else {\n skipInstalls = true;\n }\n }\n\n const extractedConstraints = getExtractedConstraints(res.deps);\n\n if (yarnrcConfig) {\n for (const dep of res.deps) {\n // v8 ignore else -- TODO: add tests #40625\n if (dep.depName) {\n const registryUrlFromYarnrcConfig = resolveRegistryUrl(\n dep.packageName ?? dep.depName,\n yarnrcConfig,\n );\n if (\n registryUrlFromYarnrcConfig &&\n dep.datasource === NpmDatasource.id\n ) {\n dep.registryUrls = [registryUrlFromYarnrcConfig];\n }\n }\n }\n }\n\n return {\n ...res,\n npmrc,\n managerData: {\n ...res.managerData,\n ...lockFiles,\n yarnZeroInstall,\n hasPackageManager:\n isNonEmptyStringAndNotWhitespace(packageJson.packageManager) ||\n isNonEmptyObject(packageJson.devEngines?.packageManager),\n workspacesPackages,\n npmrcFileName, // store npmrc file name so we can later tell if it came from the workspace or not\n },\n skipInstalls,\n extractedConstraints,\n };\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile<NpmManagerData>[]> {\n const npmFiles: PackageFile<NpmManagerData>[] = [];\n for (const packageFile of packageFiles) {\n const content = await readLocalFile(packageFile, 'utf8');\n if (content) {\n // pnpm workspace files are their own package file, defined via managerFilePatterns.\n if (packageFile.endsWith('pnpm-workspace.yaml')) {\n logger.trace(\n { packageFile },\n `Extracting as a pnpm-workspace.yaml file`,\n );\n const parsedPnpmWorkspaceYaml =\n await PnpmWorkspaceFile.safeParseAsync(content);\n if (parsedPnpmWorkspaceYaml.success) {\n logger.trace(\n { packageFile },\n `Extracting file as a pnpm workspace YAML file`,\n );\n const deps = await extractPnpmWorkspaceFile(\n parsedPnpmWorkspaceYaml.data,\n packageFile,\n );\n // v8 ignore else -- TODO: add test #40625\n if (deps) {\n npmFiles.push({\n ...deps,\n packageFile,\n });\n }\n } else {\n logger.warn(\n { packageFile, err: parsedPnpmWorkspaceYaml.error },\n `Failed to parse pnpm-workspace.yaml file`,\n );\n }\n } else {\n if (packageFile.endsWith('json')) {\n logger.trace({ packageFile }, `Extracting as a package.json file`);\n\n const deps = await extractPackageFile(content, packageFile, config);\n // v8 ignore else -- TODO: add tests #40625\n if (deps) {\n npmFiles.push({\n ...deps,\n packageFile,\n });\n }\n } else {\n logger.trace({ packageFile }, `Extracting as a .yarnrc.yml file`);\n\n const yarnConfig = loadConfigFromYarnrcYml(content);\n\n // v8 ignore else -- TODO: add tests #40625\n if (yarnConfig?.catalogs || yarnConfig?.catalog) {\n const hasPackageManagerResult = await hasPackageManager(\n upath.dirname(packageFile),\n );\n const catalogsDeps = await extractYarnCatalogs(\n { catalog: yarnConfig.catalog, catalogs: yarnConfig.catalogs },\n packageFile,\n hasPackageManagerResult,\n );\n // v8 ignore else -- TODO: add tests #40625\n if (catalogsDeps) {\n npmFiles.push({\n ...catalogsDeps,\n packageFile,\n });\n }\n }\n }\n }\n } else {\n logger.debug({ packageFile }, `No content found`);\n }\n }\n\n await postExtract(npmFiles);\n return npmFiles;\n}\n"],"mappings":";;;;;;;;;;;;;;AAsCA,SAAS,qBAAqB,WAAkC;CAC9D,OAAO,OAAO,OAAO,SAAS,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,SAAS;AAC5D;AAEA,eAAsB,mBACpB,SACA,aACA,QACoD;CACpD,OAAO,MAAM,0BAA0B,YAAY,EAAE;CACrD,OAAO,MAAM,EAAE,QAAQ,CAAC;CACxB,IAAI;CACJ,IAAI;EACF,cAAc,KAAK,MAAM,OAAO;CAClC,QAAQ;EACN,OAAO,MAAM,EAAE,YAAY,GAAG,cAAc;EAC5C,OAAO;CACT;CAEA,MAAM,MAAM,mBAAmB,aAAa,WAAW;CACvD,IAAI,CAAC,KACH,OAAO;CAGT,IAAI;CACJ,IAAI,QAAQ,YAAY,UAAU,GAChC,qBAAqB,YAAY;MAEjC,qBAAqB,YAAY,YAAY;CAG/C,MAAM,YAA0B;EAC9B,UAAU;EACV,aAAa;EACb,gBAAgB;EAChB,gBAAgB;CAClB;CAEA,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,SAAS,GAG5C;EACH,MAAM,WAAW,mBAAmB,aAAa,GAAG;EACpD,IAAI,MAAM,cAAc,UAAU,MAAM,GACtC,UAAU,OAAO;OAEjB,UAAU,OAAO,KAAA;CAErB;CACA,UAAU,UAAU,UAAU,eAAe,UAAU;CACvD,OAAO,UAAU;CACjB,OAAO,UAAU;CAEjB,IAAI,qBAAqB,SAAS,GAChC,OAAO,KACL,gGACF;CAGF,MAAM,EAAE,OAAO,kBAAkB,MAAM,aAAa,aAAa,MAAM;CAEvE,MAAM,oBAAoB,MAAM,yBAC9B,aACA,aACF;CACA,MAAM,kBAAkB,oBACpB,MAAM,cAAc,iBAAiB,IACrC;CAEJ,IAAI,eAAkC;CACtC,MAAM,gBAAgB,oBAClB,MAAM,cAAc,mBAAmB,MAAM,IAC7C;CACJ,IAAI,SAAS,aAAa,KAAK,cAAc,KAAK,CAAC,CAAC,SAAS,GAC3D,eAAe,wBAAwB,aAAa;CAGtD,MAAM,uBAAuB,MAAM,yBACjC,aACA,SACF;CACA,MAAM,mBAAmB,uBACrB,MAAM,cAAc,sBAAsB,MAAM,IAChD;CACJ,IAAI,SAAS,gBAAgB,KAAK,iBAAiB,KAAK,CAAC,CAAC,SAAS,GACjE,eAAe,2BAA2B,gBAAgB;CAG5D,IAAI,IAAI,KAAK,WAAW,GAAG;EACzB,OAAO,MAAM,0BAA0B;EACvC,IACE,EACE,CAAC,CAAC,IAAI,aAAa,mBACnB,CAAC,CAAC,IAAI,sBACN,CAAC,CAAC,SACF,qBAEF;GACA,OAAO,MAAM,eAAe;GAC5B,OAAO;EACT;CACF;CACA,IAAI,eAAe,OAAO;CAC1B,IAAI,iBAAiB,MAMnB,IAAK,CALiB,CAAC,IAAI,KAAK,MAC7B,QACC,CAAC,CAAC,IAAI,cAAc,WAAW,OAAO,KACtC,CAAC,CAAC,IAAI,cAAc,WAAW,MAAM,CACzC,KACqB,CAAC,CAAC,UAAU,WAAY,iBAAiB;EAM5D,OAAO,MAAM,6CAA6C;EAC1D,eAAe;CACjB,OACE,eAAe;CAInB,MAAM,uBAAuB,wBAAwB,IAAI,IAAI;CAE7D,IAAI;OACG,MAAM,OAAO,IAAI;;EAEpB,IAAI,IAAI,SAAS;GACf,MAAM,8BAA8B,mBAClC,IAAI,eAAe,IAAI,SACvB,YACF;GACA,IACE,+BACA,IAAI,eAAe,cAAc,IAEjC,IAAI,eAAe,CAAC,2BAA2B;EAEnD;;CAIJ,OAAO;EACL,GAAG;EACH;EACA,aAAa;GACX,GAAG,IAAI;GACP,GAAG;GACH;GACA,mBACE,iCAAiC,YAAY,cAAc,KAC3D,iBAAiB,YAAY,YAAY,cAAc;GACzD;GACA;EACF;EACA;EACA;CACF;AACF;AAEA,eAAsB,uBACpB,QACA,cACwC;CACxC,MAAM,WAA0C,CAAC;CACjD,KAAK,MAAM,eAAe,cAAc;EACtC,MAAM,UAAU,MAAM,cAAc,aAAa,MAAM;EACvD,IAAI,SAEF,IAAI,YAAY,SAAS,qBAAqB,GAAG;GAC/C,OAAO,MACL,EAAE,YAAY,GACd,0CACF;GACA,MAAM,0BACJ,MAAM,kBAAkB,eAAe,OAAO;GAChD,IAAI,wBAAwB,SAAS;IACnC,OAAO,MACL,EAAE,YAAY,GACd,+CACF;IACA,MAAM,OAAO,MAAM,yBACjB,wBAAwB,MACxB,WACF;;IAEA,IAAI,MACF,SAAS,KAAK;KACZ,GAAG;KACH;IACF,CAAC;GAEL,OACE,OAAO,KACL;IAAE;IAAa,KAAK,wBAAwB;GAAM,GAClD,0CACF;EAEJ,OACE,IAAI,YAAY,SAAS,MAAM,GAAG;GAChC,OAAO,MAAM,EAAE,YAAY,GAAG,mCAAmC;GAEjE,MAAM,OAAO,MAAM,mBAAmB,SAAS,aAAa,MAAM;;GAElE,IAAI,MACF,SAAS,KAAK;IACZ,GAAG;IACH;GACF,CAAC;EAEL,OAAO;GACL,OAAO,MAAM,EAAE,YAAY,GAAG,kCAAkC;GAEhE,MAAM,aAAa,wBAAwB,OAAO;;GAGlD,IAAI,YAAY,YAAY,YAAY,SAAS;IAC/C,MAAM,0BAA0B,MAAM,kBACpC,MAAM,QAAQ,WAAW,CAC3B;IACA,MAAM,eAAe,MAAM,oBACzB;KAAE,SAAS,WAAW;KAAS,UAAU,WAAW;IAAS,GAC7D,aACA,uBACF;;IAEA,IAAI,cACF,SAAS,KAAK;KACZ,GAAG;KACH;IACF,CAAC;GAEL;EACF;OAGF,OAAO,MAAM,EAAE,YAAY,GAAG,kBAAkB;CAEpD;CAEA,MAAM,YAAY,QAAQ;CAC1B,OAAO;AACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/modules/manager/npm/extract/index.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyObject,\n isNonEmptyStringAndNotWhitespace,\n isString,\n} from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n findLocalSiblingOrParent,\n getSiblingFileName,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\n\nimport type {\n ExtractConfig,\n PackageFile,\n PackageFileContent,\n} from '../../types.ts';\nimport { resolveNpmrc } from '../npmrc.ts';\nimport { PnpmWorkspaceFile, type YarnConfig } from '../schema.ts';\nimport type { NpmLockFiles, NpmManagerData } from '../types.ts';\nimport { getExtractedConstraints } from './common/dependency.ts';\nimport {\n extractPackageJson,\n hasPackageManager,\n} from './common/package-file.ts';\nimport {\n applyPnpmWorkspaceRegistries,\n extractPnpmWorkspaceFile,\n} from './pnpm.ts';\nimport { postExtract } from './post/index.ts';\nimport type { NpmPackage } from './types.ts';\nimport { extractYarnCatalogs, isZeroInstall } from './yarn.ts';\nimport {\n loadConfigFromLegacyYarnrc,\n loadConfigFromYarnrcYml,\n resolveRegistryUrl,\n} from './yarnrc.ts';\n\nfunction hasMultipleLockFiles(lockFiles: NpmLockFiles): boolean {\n return Object.values(lockFiles).filter(isString).length > 1;\n}\n\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): Promise<PackageFileContent<NpmManagerData> | null> {\n logger.trace(`npm.extractPackageFile(${packageFile})`);\n logger.trace({ content });\n let packageJson: NpmPackage;\n try {\n packageJson = JSON.parse(content);\n } catch {\n logger.debug({ packageFile }, `Invalid JSON`);\n return null;\n }\n\n const res = extractPackageJson(packageJson, packageFile);\n if (!res) {\n return null;\n }\n\n let workspacesPackages: string[] | undefined;\n if (isArray(packageJson.workspaces)) {\n workspacesPackages = packageJson.workspaces;\n } else {\n workspacesPackages = packageJson.workspaces?.packages;\n }\n\n const lockFiles: NpmLockFiles = {\n yarnLock: 'yarn.lock',\n packageLock: 'package-lock.json',\n shrinkwrapJson: 'npm-shrinkwrap.json',\n pnpmShrinkwrap: 'pnpm-lock.yaml',\n };\n\n for (const [key, val] of Object.entries(lockFiles) as [\n 'yarnLock' | 'packageLock' | 'shrinkwrapJson' | 'pnpmShrinkwrap',\n string,\n ][]) {\n const filePath = getSiblingFileName(packageFile, val);\n if (await readLocalFile(filePath, 'utf8')) {\n lockFiles[key] = filePath;\n } else {\n lockFiles[key] = undefined;\n }\n }\n lockFiles.npmLock = lockFiles.packageLock ?? lockFiles.shrinkwrapJson;\n delete lockFiles.packageLock;\n delete lockFiles.shrinkwrapJson;\n\n if (hasMultipleLockFiles(lockFiles)) {\n logger.warn(\n 'Updating multiple npm lock files is deprecated and support will be removed in future versions.',\n );\n }\n\n const { npmrc, npmrcFileName } = await resolveNpmrc(packageFile, config);\n\n const yarnrcYmlFileName = await findLocalSiblingOrParent(\n packageFile,\n '.yarnrc.yml',\n );\n const yarnZeroInstall = yarnrcYmlFileName\n ? await isZeroInstall(yarnrcYmlFileName)\n : false;\n\n let yarnrcConfig: YarnConfig | null = null;\n const repoYarnrcYml = yarnrcYmlFileName\n ? await readLocalFile(yarnrcYmlFileName, 'utf8')\n : null;\n if (isString(repoYarnrcYml) && repoYarnrcYml.trim().length > 0) {\n yarnrcConfig = loadConfigFromYarnrcYml(repoYarnrcYml);\n }\n\n const legacyYarnrcFileName = await findLocalSiblingOrParent(\n packageFile,\n '.yarnrc',\n );\n const repoLegacyYarnrc = legacyYarnrcFileName\n ? await readLocalFile(legacyYarnrcFileName, 'utf8')\n : null;\n if (isString(repoLegacyYarnrc) && repoLegacyYarnrc.trim().length > 0) {\n yarnrcConfig = loadConfigFromLegacyYarnrc(repoLegacyYarnrc);\n }\n\n let pnpmWorkspaceRegistry: string | undefined;\n let pnpmWorkspaceRegistries: Record<string, string> | undefined;\n const pnpmWorkspaceYamlFileName = await findLocalSiblingOrParent(\n packageFile,\n 'pnpm-workspace.yaml',\n );\n const repoPnpmWorkspaceYaml = pnpmWorkspaceYamlFileName\n ? await readLocalFile(pnpmWorkspaceYamlFileName, 'utf8')\n : null;\n if (isNonEmptyStringAndNotWhitespace(repoPnpmWorkspaceYaml)) {\n const parsed = await PnpmWorkspaceFile.safeParseAsync(\n repoPnpmWorkspaceYaml,\n );\n if (parsed.success) {\n pnpmWorkspaceRegistry = parsed.data.registry;\n pnpmWorkspaceRegistries = parsed.data.registries;\n } else {\n logger.debug(\n { packageFile: pnpmWorkspaceYamlFileName, err: parsed.error },\n 'Failed to parse pnpm-workspace.yaml',\n );\n }\n }\n\n if (res.deps.length === 0) {\n logger.debug('Package file has no deps');\n if (\n !(\n !!res.managerData?.packageJsonName ||\n !!res.packageFileVersion ||\n !!npmrc ||\n workspacesPackages\n )\n ) {\n logger.debug('Skipping file');\n return null;\n }\n }\n let skipInstalls = config.skipInstalls;\n if (skipInstalls === null) {\n const hasFancyRefs = !!res.deps.some(\n (dep) =>\n !!dep.currentValue?.startsWith('file:') ||\n !!dep.currentValue?.startsWith('npm:'),\n );\n if ((hasFancyRefs && !!lockFiles.npmLock) || yarnZeroInstall) {\n // https://github.com/npm/cli/issues/1432\n // Explanation:\n // - npm install --package-lock-only is buggy for transitive deps in file: and npm: references\n // - So we set skipInstalls to false if file: or npm: refs are found *and* the user hasn't explicitly set the value already\n // - Also, do not skip install if Yarn zero-install is used\n logger.debug('Automatically setting skipInstalls to false');\n skipInstalls = false;\n } else {\n skipInstalls = true;\n }\n }\n\n const extractedConstraints = getExtractedConstraints(res.deps);\n\n if (yarnrcConfig) {\n for (const dep of res.deps) {\n // v8 ignore else -- TODO: add tests #40625\n if (dep.depName) {\n const registryUrlFromYarnrcConfig = resolveRegistryUrl(\n dep.packageName ?? dep.depName,\n yarnrcConfig,\n );\n if (\n registryUrlFromYarnrcConfig &&\n dep.datasource === NpmDatasource.id\n ) {\n dep.registryUrls = [registryUrlFromYarnrcConfig];\n }\n }\n }\n }\n\n // Applied after the yarnrc resolution so pnpm-workspace.yaml wins in pnpm repos\n applyPnpmWorkspaceRegistries(\n res.deps,\n pnpmWorkspaceRegistries,\n pnpmWorkspaceRegistry,\n );\n\n return {\n ...res,\n npmrc,\n managerData: {\n ...res.managerData,\n ...lockFiles,\n yarnZeroInstall,\n hasPackageManager:\n isNonEmptyStringAndNotWhitespace(packageJson.packageManager) ||\n isNonEmptyObject(packageJson.devEngines?.packageManager),\n workspacesPackages,\n npmrcFileName, // store npmrc file name so we can later tell if it came from the workspace or not\n },\n skipInstalls,\n extractedConstraints,\n };\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile<NpmManagerData>[]> {\n const npmFiles: PackageFile<NpmManagerData>[] = [];\n for (const packageFile of packageFiles) {\n const content = await readLocalFile(packageFile, 'utf8');\n if (content) {\n // pnpm workspace files are their own package file, defined via managerFilePatterns.\n if (packageFile.endsWith('pnpm-workspace.yaml')) {\n logger.trace(\n { packageFile },\n `Extracting as a pnpm-workspace.yaml file`,\n );\n const parsedPnpmWorkspaceYaml =\n await PnpmWorkspaceFile.safeParseAsync(content);\n if (parsedPnpmWorkspaceYaml.success) {\n logger.trace(\n { packageFile },\n `Extracting file as a pnpm workspace YAML file`,\n );\n const deps = await extractPnpmWorkspaceFile(\n parsedPnpmWorkspaceYaml.data,\n packageFile,\n );\n // v8 ignore else -- TODO: add test #40625\n if (deps) {\n npmFiles.push({\n ...deps,\n packageFile,\n });\n }\n } else {\n logger.warn(\n { packageFile, err: parsedPnpmWorkspaceYaml.error },\n `Failed to parse pnpm-workspace.yaml file`,\n );\n }\n } else {\n if (packageFile.endsWith('json')) {\n logger.trace({ packageFile }, `Extracting as a package.json file`);\n\n const deps = await extractPackageFile(content, packageFile, config);\n // v8 ignore else -- TODO: add tests #40625\n if (deps) {\n npmFiles.push({\n ...deps,\n packageFile,\n });\n }\n } else {\n logger.trace({ packageFile }, `Extracting as a .yarnrc.yml file`);\n\n const yarnConfig = loadConfigFromYarnrcYml(content);\n\n // v8 ignore else -- TODO: add tests #40625\n if (yarnConfig?.catalogs || yarnConfig?.catalog) {\n const hasPackageManagerResult = await hasPackageManager(\n upath.dirname(packageFile),\n );\n const catalogsDeps = await extractYarnCatalogs(\n { catalog: yarnConfig.catalog, catalogs: yarnConfig.catalogs },\n packageFile,\n hasPackageManagerResult,\n );\n // v8 ignore else -- TODO: add tests #40625\n if (catalogsDeps) {\n npmFiles.push({\n ...catalogsDeps,\n packageFile,\n });\n }\n }\n }\n }\n } else {\n logger.debug({ packageFile }, `No content found`);\n }\n }\n\n await postExtract(npmFiles);\n return npmFiles;\n}\n"],"mappings":"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"}
@@ -2,6 +2,7 @@ import { GlobalConfig } from "../../../../config/global.js";
2
2
  import { logger } from "../../../../logger/index.js";
3
3
  import { parseSingleYaml, parseYaml } from "../../../../util/yaml.js";
4
4
  import { findLocalSiblingOrParent, getSiblingFileName, localPathExists, readLocalFile } from "../../../../util/fs/index.js";
5
+ import { NpmDatasource } from "../../../datasource/npm/index.js";
5
6
  import { extractDependency } from "./common/dependency.js";
6
7
  import { pnpmWorkspaceOverrides } from "../dep-types.js";
7
8
  import { extractCatalogDeps } from "./common/catalogs.js";
@@ -150,6 +151,8 @@ async function extractPnpmWorkspaceFile(workspaceFile, packageFile) {
150
151
  ...extractDependency(depType, packageName, overridesVal)
151
152
  });
152
153
  }
154
+ const { registry, registries } = workspaceFile;
155
+ applyPnpmWorkspaceRegistries(deps, registries, registry);
153
156
  let pnpmShrinkwrap;
154
157
  const filePath = getSiblingFileName(packageFile, "pnpm-lock.yaml");
155
158
  if (await readLocalFile(filePath, "utf8")) pnpmShrinkwrap = filePath;
@@ -171,7 +174,27 @@ function pnpmCatalogsToArray({ catalog: defaultCatalogDeps, catalogs: namedCatal
171
174
  });
172
175
  return result;
173
176
  }
177
+ function applyPnpmWorkspaceRegistries(deps, registries, registry) {
178
+ if (!(registry ?? registries)) return;
179
+ for (const dep of deps) {
180
+ const lookupName = dep.packageName ?? dep.depName;
181
+ if (lookupName && dep.datasource === NpmDatasource.id) {
182
+ const registryUrl = resolveRegistryUrl(lookupName, registries, registry);
183
+ if (registryUrl) dep.registryUrls = [registryUrl];
184
+ }
185
+ }
186
+ }
187
+ function resolveRegistryUrl(packageName, registries, defaultRegistry) {
188
+ if (registries) {
189
+ for (const scope in registries) {
190
+ if (scope === "default") continue;
191
+ if (packageName.startsWith(`${scope}/`)) return registries[scope];
192
+ }
193
+ if (registries.default) return registries.default;
194
+ }
195
+ return defaultRegistry ?? null;
196
+ }
174
197
  //#endregion
175
- export { detectPnpmWorkspaces, extractPnpmFilters, extractPnpmWorkspaceFile, findPnpmWorkspace, getPnpmLock };
198
+ export { applyPnpmWorkspaceRegistries, detectPnpmWorkspaces, extractPnpmFilters, extractPnpmWorkspaceFile, findPnpmWorkspace, getPnpmLock, resolveRegistryUrl };
176
199
 
177
200
  //# sourceMappingURL=pnpm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pnpm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/extract/pnpm.ts"],"sourcesContent":["import { parsePkgAndParentSelector } from '@pnpm/parse-overrides';\nimport {\n isNonEmptyObject,\n isNumber,\n isObject,\n isPlainObject,\n isString,\n} from '@sindresorhus/is';\nimport { findPackages } from 'find-packages';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n findLocalSiblingOrParent,\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { parseSingleYaml, parseYaml } from '../../../../util/yaml.ts';\nimport type { PackageFile, PackageFileContent } from '../../types.ts';\nimport { pnpmWorkspaceOverrides } from '../dep-types.ts';\nimport type { PnpmDependency, PnpmLockFile } from '../post-update/types.ts';\nimport type { PnpmCatalogs, PnpmWorkspaceFile } from '../schema.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport { extractCatalogDeps } from './common/catalogs.ts';\nimport { extractDependency } from './common/dependency.ts';\nimport type { Catalog, LockFile } from './types.ts';\n\nfunction isPnpmLockfile(obj: any): obj is PnpmLockFile {\n return isPlainObject(obj) && 'lockfileVersion' in obj;\n}\n\nexport async function extractPnpmFilters(\n fileName: string,\n): Promise<string[] | undefined> {\n try {\n // TODO: use schema (#9610,#22198)\n const contents = parseSingleYaml<PnpmWorkspaceFile>(\n (await readLocalFile(fileName, 'utf8'))!,\n );\n if (\n !Array.isArray(contents.packages) ||\n !contents.packages.every((item) => isString(item))\n ) {\n logger.trace(\n { fileName },\n 'Failed to find required \"packages\" array in pnpm-workspace.yaml',\n );\n return undefined;\n }\n return contents.packages;\n } catch (err) {\n logger.trace({ fileName, err }, 'Failed to parse pnpm-workspace.yaml');\n return undefined;\n }\n}\n\nexport async function findPnpmWorkspace(\n packageFile: string,\n): Promise<{ lockFilePath: string; workspaceYamlPath: string } | null> {\n // search for pnpm-workspace.yaml\n const workspaceYamlPath = await findLocalSiblingOrParent(\n packageFile,\n 'pnpm-workspace.yaml',\n );\n if (!workspaceYamlPath) {\n logger.trace(\n { packageFile },\n 'Failed to locate pnpm-workspace.yaml in a parent directory.',\n );\n return null;\n }\n\n // search for pnpm-lock.yaml next to pnpm-workspace.yaml\n const pnpmLockfilePath = getSiblingFileName(\n workspaceYamlPath,\n 'pnpm-lock.yaml',\n );\n if (!(await localPathExists(pnpmLockfilePath))) {\n logger.trace(\n { workspaceYamlPath, packageFile },\n 'Failed to find a pnpm-lock.yaml sibling for the workspace.',\n );\n return null;\n }\n\n return {\n lockFilePath: pnpmLockfilePath,\n workspaceYamlPath,\n };\n}\n\nexport async function detectPnpmWorkspaces(\n packageFiles: Partial<PackageFile<NpmManagerData>>[],\n): Promise<void> {\n logger.debug(`Detecting pnpm Workspaces`);\n const packagePathCache = new Map<string, string[] | null>();\n\n for (const p of packageFiles) {\n const { packageFile, managerData } = p;\n const pnpmShrinkwrap = managerData?.pnpmShrinkwrap;\n\n // check if pnpmShrinkwrap-file has already been provided\n if (pnpmShrinkwrap) {\n logger.trace(\n { packageFile, pnpmShrinkwrap },\n 'Found an existing pnpm shrinkwrap file; skipping pnpm monorepo check.',\n );\n continue;\n }\n\n // search for corresponding pnpm workspace\n // TODO #22198\n const pnpmWorkspace = await findPnpmWorkspace(packageFile!);\n if (pnpmWorkspace === null) {\n continue;\n }\n const { workspaceYamlPath, lockFilePath } = pnpmWorkspace;\n\n // check if package matches workspace filter\n if (!packagePathCache.has(workspaceYamlPath)) {\n const filters = await extractPnpmFilters(workspaceYamlPath);\n // TODO: types (#22198)\n const localDir = GlobalConfig.get('localDir');\n const packages = await findPackages(\n upath.dirname(upath.join(localDir, workspaceYamlPath)),\n {\n patterns: filters,\n // Match the ignores used in @pnpm/find-workspace-packages\n ignore: ['**/node_modules/**', '**/bower_components/**'],\n },\n );\n const packagePaths = packages.map((pkg) =>\n upath.join(pkg.dir, 'package.json'),\n );\n packagePathCache.set(workspaceYamlPath, packagePaths);\n }\n const packagePaths = packagePathCache.get(workspaceYamlPath);\n\n const isPackageInWorkspace = packagePaths?.some((p) =>\n p.endsWith(packageFile!),\n );\n\n if (isPackageInWorkspace) {\n p.managerData ??= {};\n p.managerData.pnpmShrinkwrap = lockFilePath;\n } else {\n logger.trace(\n { packageFile, workspaceYamlPath },\n `Didn't find the package in the pnpm workspace`,\n );\n }\n }\n}\n\nexport async function getPnpmLock(filePath: string): Promise<LockFile> {\n try {\n const pnpmLockRaw = await readLocalFile(filePath, 'utf8');\n if (!pnpmLockRaw) {\n throw new Error('Unable to read pnpm-lock.yaml');\n }\n\n // pnpm writes a multi-document YAML lockfile when `pnpm-workspace.yaml`\n // declares `configDependencies`; the env document (config-deps + integrity\n // metadata) is unconditionally prepended before the main lockfile, so the\n // main lockfile is always the last document.\n // https://pnpm.io/config-dependencies.\n const parsedDocs = parseYaml(pnpmLockRaw);\n const lockParsed = parsedDocs.at(-1);\n if (!isPnpmLockfile(lockParsed)) {\n throw new Error('Invalid or empty lockfile');\n }\n logger.trace({ lockParsed }, 'pnpm lockfile parsed');\n\n // field lockfileVersion is type string in lockfileVersion = 6 and type number in < 6\n const lockfileVersion: number = isNumber(lockParsed.lockfileVersion)\n ? lockParsed.lockfileVersion\n : parseFloat(lockParsed.lockfileVersion);\n\n const lockedVersions = getLockedVersions(lockParsed);\n const lockedCatalogVersions = getLockedCatalogVersions(lockParsed);\n\n return {\n lockedVersionsWithPath: lockedVersions,\n lockedVersionsWithCatalog: lockedCatalogVersions,\n lockfileVersion,\n };\n } catch (err) {\n logger.debug({ filePath, err }, 'Warning: Exception parsing pnpm lockfile');\n return { lockedVersions: {} };\n }\n}\n\nfunction getLockedCatalogVersions(\n lockParsed: PnpmLockFile,\n): Record<string, Record<string, string>> {\n const lockedVersions: Record<string, Record<string, string>> = {};\n\n if (isNonEmptyObject(lockParsed.catalogs)) {\n for (const [catalog, dependencies] of Object.entries(lockParsed.catalogs)) {\n const versions: Record<string, string> = {};\n\n for (const [dep, versionCarrier] of Object.entries(dependencies)) {\n versions[dep] = versionCarrier.version;\n }\n\n lockedVersions[catalog] = versions;\n }\n }\n\n return lockedVersions;\n}\n\nfunction getLockedVersions(\n lockParsed: PnpmLockFile,\n): Record<string, Record<string, Record<string, string>>> {\n const lockedVersions: Record<\n string,\n Record<string, Record<string, string>>\n > = {};\n\n // monorepo\n if (isNonEmptyObject(lockParsed.importers)) {\n for (const [importer, imports] of Object.entries(lockParsed.importers)) {\n lockedVersions[importer] = getLockedDependencyVersions(imports);\n }\n }\n // normal repo\n else {\n lockedVersions['.'] = getLockedDependencyVersions(lockParsed);\n }\n\n return lockedVersions;\n}\n\nfunction getLockedDependencyVersions(\n obj: PnpmLockFile | Record<string, PnpmDependency>,\n): Record<string, Record<string, string>> {\n const dependencyTypes = [\n 'dependencies',\n 'devDependencies',\n 'optionalDependencies',\n ] as const;\n\n const res: Record<string, Record<string, string>> = {};\n for (const depType of dependencyTypes) {\n res[depType] = {};\n for (const [pkgName, versionCarrier] of Object.entries(\n obj[depType] ?? {},\n )) {\n let version: string;\n if (isObject(versionCarrier)) {\n version = versionCarrier.version;\n } else {\n version = versionCarrier;\n }\n\n const pkgVersion = version.split('(')[0].trim();\n res[depType][pkgName] = pkgVersion;\n }\n }\n\n return res;\n}\n\nexport async function extractPnpmWorkspaceFile(\n workspaceFile: PnpmWorkspaceFile,\n packageFile: string,\n): Promise<PackageFileContent<NpmManagerData> | null> {\n logger.trace(`pnpm.extractPnpmWorkspaceFile(${packageFile})`);\n\n const pnpmCatalogs = pnpmCatalogsToArray(workspaceFile);\n\n const deps = extractCatalogDeps(pnpmCatalogs);\n\n if (workspaceFile.overrides) {\n for (const [overridesKey, overridesVal] of Object.entries(\n workspaceFile.overrides,\n )) {\n // flat syntax: `parent>parent>child`\n const packageName =\n parsePkgAndParentSelector(overridesKey).targetPkg.name;\n const depType = pnpmWorkspaceOverrides;\n deps.push({\n depName: overridesKey,\n packageName,\n depType,\n ...extractDependency(depType, packageName, overridesVal),\n });\n }\n }\n\n let pnpmShrinkwrap;\n const filePath = getSiblingFileName(packageFile, 'pnpm-lock.yaml');\n\n if (await readLocalFile(filePath, 'utf8')) {\n pnpmShrinkwrap = filePath;\n }\n\n return {\n deps,\n managerData: {\n pnpmShrinkwrap,\n },\n };\n}\n\nfunction pnpmCatalogsToArray({\n catalog: defaultCatalogDeps,\n catalogs: namedCatalogs,\n}: PnpmCatalogs): Catalog[] {\n const result: Catalog[] = [];\n\n if (defaultCatalogDeps !== undefined) {\n result.push({ name: 'default', dependencies: defaultCatalogDeps });\n }\n\n if (!namedCatalogs) {\n return result;\n }\n\n for (const [name, dependencies] of Object.entries(namedCatalogs)) {\n result.push({\n name,\n dependencies,\n });\n }\n\n return result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pnpm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/extract/pnpm.ts"],"sourcesContent":["import { parsePkgAndParentSelector } from '@pnpm/parse-overrides';\nimport {\n isNonEmptyObject,\n isNumber,\n isObject,\n isPlainObject,\n isString,\n} from '@sindresorhus/is';\nimport { findPackages } from 'find-packages';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n findLocalSiblingOrParent,\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { parseSingleYaml, parseYaml } from '../../../../util/yaml.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport type {\n PackageDependency,\n PackageFile,\n PackageFileContent,\n} from '../../types.ts';\nimport { pnpmWorkspaceOverrides } from '../dep-types.ts';\nimport type { PnpmDependency, PnpmLockFile } from '../post-update/types.ts';\nimport type { PnpmCatalogs, PnpmWorkspaceFile } from '../schema.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport { extractCatalogDeps } from './common/catalogs.ts';\nimport { extractDependency } from './common/dependency.ts';\nimport type { Catalog, LockFile } from './types.ts';\n\nfunction isPnpmLockfile(obj: any): obj is PnpmLockFile {\n return isPlainObject(obj) && 'lockfileVersion' in obj;\n}\n\nexport async function extractPnpmFilters(\n fileName: string,\n): Promise<string[] | undefined> {\n try {\n // TODO: use schema (#9610,#22198)\n const contents = parseSingleYaml<PnpmWorkspaceFile>(\n (await readLocalFile(fileName, 'utf8'))!,\n );\n if (\n !Array.isArray(contents.packages) ||\n !contents.packages.every((item) => isString(item))\n ) {\n logger.trace(\n { fileName },\n 'Failed to find required \"packages\" array in pnpm-workspace.yaml',\n );\n return undefined;\n }\n return contents.packages;\n } catch (err) {\n logger.trace({ fileName, err }, 'Failed to parse pnpm-workspace.yaml');\n return undefined;\n }\n}\n\nexport async function findPnpmWorkspace(\n packageFile: string,\n): Promise<{ lockFilePath: string; workspaceYamlPath: string } | null> {\n // search for pnpm-workspace.yaml\n const workspaceYamlPath = await findLocalSiblingOrParent(\n packageFile,\n 'pnpm-workspace.yaml',\n );\n if (!workspaceYamlPath) {\n logger.trace(\n { packageFile },\n 'Failed to locate pnpm-workspace.yaml in a parent directory.',\n );\n return null;\n }\n\n // search for pnpm-lock.yaml next to pnpm-workspace.yaml\n const pnpmLockfilePath = getSiblingFileName(\n workspaceYamlPath,\n 'pnpm-lock.yaml',\n );\n if (!(await localPathExists(pnpmLockfilePath))) {\n logger.trace(\n { workspaceYamlPath, packageFile },\n 'Failed to find a pnpm-lock.yaml sibling for the workspace.',\n );\n return null;\n }\n\n return {\n lockFilePath: pnpmLockfilePath,\n workspaceYamlPath,\n };\n}\n\nexport async function detectPnpmWorkspaces(\n packageFiles: Partial<PackageFile<NpmManagerData>>[],\n): Promise<void> {\n logger.debug(`Detecting pnpm Workspaces`);\n const packagePathCache = new Map<string, string[] | null>();\n\n for (const p of packageFiles) {\n const { packageFile, managerData } = p;\n const pnpmShrinkwrap = managerData?.pnpmShrinkwrap;\n\n // check if pnpmShrinkwrap-file has already been provided\n if (pnpmShrinkwrap) {\n logger.trace(\n { packageFile, pnpmShrinkwrap },\n 'Found an existing pnpm shrinkwrap file; skipping pnpm monorepo check.',\n );\n continue;\n }\n\n // search for corresponding pnpm workspace\n // TODO #22198\n const pnpmWorkspace = await findPnpmWorkspace(packageFile!);\n if (pnpmWorkspace === null) {\n continue;\n }\n const { workspaceYamlPath, lockFilePath } = pnpmWorkspace;\n\n // check if package matches workspace filter\n if (!packagePathCache.has(workspaceYamlPath)) {\n const filters = await extractPnpmFilters(workspaceYamlPath);\n // TODO: types (#22198)\n const localDir = GlobalConfig.get('localDir');\n const packages = await findPackages(\n upath.dirname(upath.join(localDir, workspaceYamlPath)),\n {\n patterns: filters,\n // Match the ignores used in @pnpm/find-workspace-packages\n ignore: ['**/node_modules/**', '**/bower_components/**'],\n },\n );\n const packagePaths = packages.map((pkg) =>\n upath.join(pkg.dir, 'package.json'),\n );\n packagePathCache.set(workspaceYamlPath, packagePaths);\n }\n const packagePaths = packagePathCache.get(workspaceYamlPath);\n\n const isPackageInWorkspace = packagePaths?.some((p) =>\n p.endsWith(packageFile!),\n );\n\n if (isPackageInWorkspace) {\n p.managerData ??= {};\n p.managerData.pnpmShrinkwrap = lockFilePath;\n } else {\n logger.trace(\n { packageFile, workspaceYamlPath },\n `Didn't find the package in the pnpm workspace`,\n );\n }\n }\n}\n\nexport async function getPnpmLock(filePath: string): Promise<LockFile> {\n try {\n const pnpmLockRaw = await readLocalFile(filePath, 'utf8');\n if (!pnpmLockRaw) {\n throw new Error('Unable to read pnpm-lock.yaml');\n }\n\n // pnpm writes a multi-document YAML lockfile when `pnpm-workspace.yaml`\n // declares `configDependencies`; the env document (config-deps + integrity\n // metadata) is unconditionally prepended before the main lockfile, so the\n // main lockfile is always the last document.\n // https://pnpm.io/config-dependencies.\n const parsedDocs = parseYaml(pnpmLockRaw);\n const lockParsed = parsedDocs.at(-1);\n if (!isPnpmLockfile(lockParsed)) {\n throw new Error('Invalid or empty lockfile');\n }\n logger.trace({ lockParsed }, 'pnpm lockfile parsed');\n\n // field lockfileVersion is type string in lockfileVersion = 6 and type number in < 6\n const lockfileVersion: number = isNumber(lockParsed.lockfileVersion)\n ? lockParsed.lockfileVersion\n : parseFloat(lockParsed.lockfileVersion);\n\n const lockedVersions = getLockedVersions(lockParsed);\n const lockedCatalogVersions = getLockedCatalogVersions(lockParsed);\n\n return {\n lockedVersionsWithPath: lockedVersions,\n lockedVersionsWithCatalog: lockedCatalogVersions,\n lockfileVersion,\n };\n } catch (err) {\n logger.debug({ filePath, err }, 'Warning: Exception parsing pnpm lockfile');\n return { lockedVersions: {} };\n }\n}\n\nfunction getLockedCatalogVersions(\n lockParsed: PnpmLockFile,\n): Record<string, Record<string, string>> {\n const lockedVersions: Record<string, Record<string, string>> = {};\n\n if (isNonEmptyObject(lockParsed.catalogs)) {\n for (const [catalog, dependencies] of Object.entries(lockParsed.catalogs)) {\n const versions: Record<string, string> = {};\n\n for (const [dep, versionCarrier] of Object.entries(dependencies)) {\n versions[dep] = versionCarrier.version;\n }\n\n lockedVersions[catalog] = versions;\n }\n }\n\n return lockedVersions;\n}\n\nfunction getLockedVersions(\n lockParsed: PnpmLockFile,\n): Record<string, Record<string, Record<string, string>>> {\n const lockedVersions: Record<\n string,\n Record<string, Record<string, string>>\n > = {};\n\n // monorepo\n if (isNonEmptyObject(lockParsed.importers)) {\n for (const [importer, imports] of Object.entries(lockParsed.importers)) {\n lockedVersions[importer] = getLockedDependencyVersions(imports);\n }\n }\n // normal repo\n else {\n lockedVersions['.'] = getLockedDependencyVersions(lockParsed);\n }\n\n return lockedVersions;\n}\n\nfunction getLockedDependencyVersions(\n obj: PnpmLockFile | Record<string, PnpmDependency>,\n): Record<string, Record<string, string>> {\n const dependencyTypes = [\n 'dependencies',\n 'devDependencies',\n 'optionalDependencies',\n ] as const;\n\n const res: Record<string, Record<string, string>> = {};\n for (const depType of dependencyTypes) {\n res[depType] = {};\n for (const [pkgName, versionCarrier] of Object.entries(\n obj[depType] ?? {},\n )) {\n let version: string;\n if (isObject(versionCarrier)) {\n version = versionCarrier.version;\n } else {\n version = versionCarrier;\n }\n\n const pkgVersion = version.split('(')[0].trim();\n res[depType][pkgName] = pkgVersion;\n }\n }\n\n return res;\n}\n\nexport async function extractPnpmWorkspaceFile(\n workspaceFile: PnpmWorkspaceFile,\n packageFile: string,\n): Promise<PackageFileContent<NpmManagerData> | null> {\n logger.trace(`pnpm.extractPnpmWorkspaceFile(${packageFile})`);\n\n const pnpmCatalogs = pnpmCatalogsToArray(workspaceFile);\n\n const deps = extractCatalogDeps(pnpmCatalogs);\n\n if (workspaceFile.overrides) {\n for (const [overridesKey, overridesVal] of Object.entries(\n workspaceFile.overrides,\n )) {\n // flat syntax: `parent>parent>child`\n const packageName =\n parsePkgAndParentSelector(overridesKey).targetPkg.name;\n const depType = pnpmWorkspaceOverrides;\n deps.push({\n depName: overridesKey,\n packageName,\n depType,\n ...extractDependency(depType, packageName, overridesVal),\n });\n }\n }\n\n const { registry, registries } = workspaceFile;\n applyPnpmWorkspaceRegistries(deps, registries, registry);\n\n let pnpmShrinkwrap;\n const filePath = getSiblingFileName(packageFile, 'pnpm-lock.yaml');\n\n if (await readLocalFile(filePath, 'utf8')) {\n pnpmShrinkwrap = filePath;\n }\n\n return {\n deps,\n managerData: {\n pnpmShrinkwrap,\n },\n };\n}\n\nfunction pnpmCatalogsToArray({\n catalog: defaultCatalogDeps,\n catalogs: namedCatalogs,\n}: PnpmCatalogs): Catalog[] {\n const result: Catalog[] = [];\n\n if (defaultCatalogDeps !== undefined) {\n result.push({ name: 'default', dependencies: defaultCatalogDeps });\n }\n\n if (!namedCatalogs) {\n return result;\n }\n\n for (const [name, dependencies] of Object.entries(namedCatalogs)) {\n result.push({\n name,\n dependencies,\n });\n }\n\n return result;\n}\n\nexport function applyPnpmWorkspaceRegistries(\n deps: PackageDependency[],\n registries: Record<string, string> | undefined,\n registry: string | undefined,\n): void {\n if (!(registry ?? registries)) {\n return;\n }\n for (const dep of deps) {\n const lookupName = dep.packageName ?? dep.depName;\n if (lookupName && dep.datasource === NpmDatasource.id) {\n const registryUrl = resolveRegistryUrl(lookupName, registries, registry);\n if (registryUrl) {\n dep.registryUrls = [registryUrl];\n }\n }\n }\n}\n\nexport function resolveRegistryUrl(\n packageName: string,\n registries: Record<string, string> | undefined,\n defaultRegistry: string | undefined,\n): string | null {\n if (registries) {\n for (const scope in registries) {\n // `default` is the fallback registry, not a scope\n if (scope === 'default') {\n continue;\n }\n // pnpm scope keys keep the leading `@`, e.g. `@my-org`\n if (packageName.startsWith(`${scope}/`)) {\n return registries[scope];\n }\n }\n if (registries.default) {\n return registries.default;\n }\n }\n return defaultRegistry ?? null;\n}\n"],"mappings":"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"}
@@ -1,6 +1,12 @@
1
1
  import { Json, LooseRecord, Nullish, Yaml } from "../../../util/schema-utils/index.js";
2
2
  import { z } from "zod/v4";
3
3
  //#region lib/modules/manager/npm/schema.ts
4
+ function hasEnvVar(value) {
5
+ return value.includes("${");
6
+ }
7
+ function withoutEnvVarRegistries(registries) {
8
+ return Object.fromEntries(Object.entries(registries).filter(([, url]) => !hasEnvVar(url)));
9
+ }
4
10
  const PnpmCatalogs = z.object({
5
11
  catalog: z.optional(z.record(z.string(), z.string())),
6
12
  catalogs: z.optional(z.record(z.string(), z.record(z.string(), z.string())))
@@ -17,7 +23,9 @@ const PnpmWorkspaceFile = Yaml.pipe(z.object({
17
23
  packages: z.array(z.string()).optional(),
18
24
  minimumReleaseAge: Nullish(z.number()),
19
25
  minimumReleaseAgeExclude: z.array(z.string()).optional(),
20
- overrides: z.record(z.string(), z.string()).optional()
26
+ overrides: z.record(z.string(), z.string()).optional(),
27
+ registry: Nullish(z.string()),
28
+ registries: Nullish(z.record(z.string(), z.string()).transform(withoutEnvVarRegistries))
21
29
  }).and(PnpmCatalogs));
22
30
  const PackageManager = z.string().transform((val) => val.split("@")).transform(([name, ...version]) => ({
23
31
  name,
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/manager/npm/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport {\n Json,\n LooseRecord,\n Nullish,\n Yaml,\n} from '../../../util/schema-utils/index.ts';\n\nexport const PnpmCatalogs = z.object({\n catalog: z.optional(z.record(z.string(), z.string())),\n catalogs: z.optional(z.record(z.string(), z.record(z.string(), z.string()))),\n});\nexport type PnpmCatalogs = z.infer<typeof PnpmCatalogs>;\n\nexport const YarnCatalogs = z.object({\n catalog: z.optional(z.record(z.string(), z.string())),\n catalogs: z\n .optional(z.record(z.string(), z.record(z.string(), z.string())))\n .catch(undefined),\n});\nexport type YarnCatalogs = z.infer<typeof YarnCatalogs>;\n\nexport const YarnConfig = Yaml.pipe(\n z\n .object({\n npmRegistryServer: z.string().optional(),\n npmScopes: z\n .record(\n z.string(),\n z.object({\n npmRegistryServer: z.string().optional(),\n }),\n )\n .optional(),\n })\n .and(YarnCatalogs),\n);\nexport type YarnConfig = z.infer<typeof YarnConfig>;\n\nexport const PnpmWorkspaceFile = Yaml.pipe(\n z\n .object({\n packages: z.array(z.string()).optional(),\n minimumReleaseAge: Nullish(z.number()),\n minimumReleaseAgeExclude: z.array(z.string()).optional(),\n overrides: z.record(z.string(), z.string()).optional(),\n })\n .and(PnpmCatalogs),\n);\nexport type PnpmWorkspaceFile = z.infer<typeof PnpmWorkspaceFile>;\n\nexport const PackageManager = z\n .string()\n .transform((val) => val.split('@'))\n .transform(([name, ...version]) => ({ name, version: version.join('@') }));\n\nconst DevEngineDependency = z.object({\n name: z.string(),\n version: z.string().optional(),\n});\n\nconst DevEngine = z.object({\n packageManager: DevEngineDependency.or(\n z.array(DevEngineDependency),\n ).optional(),\n});\n\nexport const PackageJson = Json.pipe(\n z.object({\n devEngines: DevEngine.optional(),\n engines: LooseRecord(z.string()).optional(),\n dependencies: LooseRecord(z.string()).optional(),\n devDependencies: LooseRecord(z.string()).optional(),\n peerDependencies: LooseRecord(z.string()).optional(),\n packageManager: PackageManager.optional(),\n volta: LooseRecord(z.string()).optional(),\n }),\n);\n\nexport type PackageJson = z.infer<typeof PackageJson>;\n\nexport const PackageLockV3 = z.object({\n lockfileVersion: z.literal(3),\n packages: LooseRecord(\n z\n .string()\n .transform((x) => x.replace(/^node_modules\\//, ''))\n .refine((x) => x.trim() !== ''),\n z.object({ version: z.string() }),\n ),\n});\n\nexport const PackageLockPreV3 = z\n .object({\n lockfileVersion: z.union([z.literal(2), z.literal(1)]),\n dependencies: LooseRecord(z.object({ version: z.string() })),\n })\n .transform(({ lockfileVersion, dependencies: packages }) => ({\n lockfileVersion,\n packages,\n }));\n\nexport const PackageLock = Json.pipe(\n z.union([PackageLockV3, PackageLockPreV3]),\n).transform(({ packages, lockfileVersion }) => {\n const lockedVersions: Record<string, string> = {};\n for (const [entry, val] of Object.entries(packages)) {\n lockedVersions[entry] = val.version;\n }\n return { lockedVersions, lockfileVersion };\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/manager/npm/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport {\n Json,\n LooseRecord,\n Nullish,\n Yaml,\n} from '../../../util/schema-utils/index.ts';\n\n// pnpm ignores registry URLs containing `${...}` env-var interpolation since v11.5.3\nfunction hasEnvVar(value: string): boolean {\n return value.includes('${');\n}\n\nfunction withoutEnvVarRegistries(\n registries: Record<string, string>,\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(registries).filter(([, url]) => !hasEnvVar(url)),\n );\n}\n\nexport const PnpmCatalogs = z.object({\n catalog: z.optional(z.record(z.string(), z.string())),\n catalogs: z.optional(z.record(z.string(), z.record(z.string(), z.string()))),\n});\nexport type PnpmCatalogs = z.infer<typeof PnpmCatalogs>;\n\nexport const YarnCatalogs = z.object({\n catalog: z.optional(z.record(z.string(), z.string())),\n catalogs: z\n .optional(z.record(z.string(), z.record(z.string(), z.string())))\n .catch(undefined),\n});\nexport type YarnCatalogs = z.infer<typeof YarnCatalogs>;\n\nexport const YarnConfig = Yaml.pipe(\n z\n .object({\n npmRegistryServer: z.string().optional(),\n npmScopes: z\n .record(\n z.string(),\n z.object({\n npmRegistryServer: z.string().optional(),\n }),\n )\n .optional(),\n })\n .and(YarnCatalogs),\n);\nexport type YarnConfig = z.infer<typeof YarnConfig>;\n\nexport const PnpmWorkspaceFile = Yaml.pipe(\n z\n .object({\n packages: z.array(z.string()).optional(),\n minimumReleaseAge: Nullish(z.number()),\n minimumReleaseAgeExclude: z.array(z.string()).optional(),\n overrides: z.record(z.string(), z.string()).optional(),\n registry: Nullish(z.string()),\n registries: Nullish(\n z.record(z.string(), z.string()).transform(withoutEnvVarRegistries),\n ),\n })\n .and(PnpmCatalogs),\n);\nexport type PnpmWorkspaceFile = z.infer<typeof PnpmWorkspaceFile>;\n\nexport const PackageManager = z\n .string()\n .transform((val) => val.split('@'))\n .transform(([name, ...version]) => ({ name, version: version.join('@') }));\n\nconst DevEngineDependency = z.object({\n name: z.string(),\n version: z.string().optional(),\n});\n\nconst DevEngine = z.object({\n packageManager: DevEngineDependency.or(\n z.array(DevEngineDependency),\n ).optional(),\n});\n\nexport const PackageJson = Json.pipe(\n z.object({\n devEngines: DevEngine.optional(),\n engines: LooseRecord(z.string()).optional(),\n dependencies: LooseRecord(z.string()).optional(),\n devDependencies: LooseRecord(z.string()).optional(),\n peerDependencies: LooseRecord(z.string()).optional(),\n packageManager: PackageManager.optional(),\n volta: LooseRecord(z.string()).optional(),\n }),\n);\n\nexport type PackageJson = z.infer<typeof PackageJson>;\n\nexport const PackageLockV3 = z.object({\n lockfileVersion: z.literal(3),\n packages: LooseRecord(\n z\n .string()\n .transform((x) => x.replace(/^node_modules\\//, ''))\n .refine((x) => x.trim() !== ''),\n z.object({ version: z.string() }),\n ),\n});\n\nexport const PackageLockPreV3 = z\n .object({\n lockfileVersion: z.union([z.literal(2), z.literal(1)]),\n dependencies: LooseRecord(z.object({ version: z.string() })),\n })\n .transform(({ lockfileVersion, dependencies: packages }) => ({\n lockfileVersion,\n packages,\n }));\n\nexport const PackageLock = Json.pipe(\n z.union([PackageLockV3, PackageLockPreV3]),\n).transform(({ packages, lockfileVersion }) => {\n const lockedVersions: Record<string, string> = {};\n for (const [entry, val] of Object.entries(packages)) {\n lockedVersions[entry] = val.version;\n }\n return { lockedVersions, lockfileVersion };\n});\n"],"mappings":"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"}
@@ -25,6 +25,7 @@ declare function setUserRepoConfig({ gitIgnoredAuthors, gitAuthor }: RenovateCon
25
25
  declare function getSubmodules(): Promise<string[]>;
26
26
  declare function cloneSubmodules(shouldClone: boolean, cloneSubmodulesFilter: string[] | undefined): Promise<void>;
27
27
  declare function isCloned(): boolean;
28
+ declare function isFileModeEnabled(): Promise<boolean>;
28
29
  declare const syncGit: () => Promise<void>;
29
30
  declare function getRepoStatus(path?: string): Promise<StatusResult>;
30
31
  declare function branchExists(branchName: string): boolean;
@@ -135,5 +136,5 @@ declare function diffCommitTree(parentCommitSha: LongCommitSha, commitSha: LongC
135
136
  declare function syncForkWithUpstream(branchName: string): Promise<void>;
136
137
  declare function getRemotes(): Promise<string[]>;
137
138
  //#endregion
138
- export { GIT_MINIMUM_VERSION, RENOVATE_FORK_UPSTREAM, branchExists, checkoutBranch, checkoutBranchFromRemote, clearRenovateRefs, cloneSubmodules, commitFiles, createSimpleGit, deleteBranch, diffCommitTree, fetchBranch, fetchRevSpec, forcePushToRemote, getBranchCommit, getBranchFiles, getBranchFilesFromCommit, getBranchLastCommitTime, getBranchList, getBranchUpdateDate, getCommitMessages, getCommitTreeSha, getFile, getFileList, getFiles, getRemotes, getRepoStatus, getSubmodules, getUrl, gitRetry, hasDiff, initRepo, isBranchBehindBase, isBranchConflicted, isBranchModified, isCloned, mergeBranch, mergeToLocal, prepareCommit, pushCommit, pushCommitToRenovateRef, resetHardFromRemote, resetToCommit, setGitAuthor, setNoVerify, setPrivateKey, setUserRepoConfig, syncForkWithUpstream, syncGit, validateGitVersion, writeGitAuthor };
139
+ export { GIT_MINIMUM_VERSION, RENOVATE_FORK_UPSTREAM, branchExists, checkoutBranch, checkoutBranchFromRemote, clearRenovateRefs, cloneSubmodules, commitFiles, createSimpleGit, deleteBranch, diffCommitTree, fetchBranch, fetchRevSpec, forcePushToRemote, getBranchCommit, getBranchFiles, getBranchFilesFromCommit, getBranchLastCommitTime, getBranchList, getBranchUpdateDate, getCommitMessages, getCommitTreeSha, getFile, getFileList, getFiles, getRemotes, getRepoStatus, getSubmodules, getUrl, gitRetry, hasDiff, initRepo, isBranchBehindBase, isBranchConflicted, isBranchModified, isCloned, isFileModeEnabled, mergeBranch, mergeToLocal, prepareCommit, pushCommit, pushCommitToRenovateRef, resetHardFromRemote, resetToCommit, setGitAuthor, setNoVerify, setPrivateKey, setUserRepoConfig, syncForkWithUpstream, syncGit, validateGitVersion, writeGitAuthor };
139
140
  //# sourceMappingURL=index.d.ts.map
@@ -297,6 +297,19 @@ async function cloneSubmodules(shouldClone, cloneSubmodulesFilter) {
297
297
  function isCloned() {
298
298
  return gitInitialized;
299
299
  }
300
+ async function isFileModeEnabled() {
301
+ if (config.fileModeEnabled === void 0) {
302
+ const value = await git.raw([
303
+ "config",
304
+ "--type=bool",
305
+ "--default=true",
306
+ "--get",
307
+ "core.fileMode"
308
+ ]);
309
+ config.fileModeEnabled = value.trim() === "true";
310
+ }
311
+ return config.fileModeEnabled;
312
+ }
300
313
  const syncGit = withInstrumenting({ name: "syncGit" }, async () => {
301
314
  if (gitInitialized) {
302
315
  if (getEnv().RENOVATE_X_CLEAR_HOOKS) await git.raw([
@@ -1241,6 +1254,6 @@ async function getRemotes() {
1241
1254
  }
1242
1255
  }
1243
1256
  //#endregion
1244
- export { GIT_MINIMUM_VERSION, RENOVATE_FORK_UPSTREAM, branchExists, checkoutBranch, checkoutBranchFromRemote, clearRenovateRefs, cloneSubmodules, commitFiles, createSimpleGit, deleteBranch, diffCommitTree, fetchBranch, fetchRevSpec, forcePushToRemote, getBranchCommit, getBranchFiles, getBranchFilesFromCommit, getBranchLastCommitTime, getBranchList, getBranchUpdateDate, getCommitMessages, getCommitTreeSha, getFile, getFileList, getFiles, getRemotes, getRepoStatus, getSubmodules, getUrl, gitRetry, hasDiff, initRepo, isBranchBehindBase, isBranchConflicted, isBranchModified, isCloned, mergeBranch, mergeToLocal, prepareCommit, pushCommit, pushCommitToRenovateRef, resetHardFromRemote, resetToCommit, setGitAuthor, setNoVerify, setPrivateKey, setUserRepoConfig, syncForkWithUpstream, syncGit, validateGitVersion, writeGitAuthor };
1257
+ export { GIT_MINIMUM_VERSION, RENOVATE_FORK_UPSTREAM, branchExists, checkoutBranch, checkoutBranchFromRemote, clearRenovateRefs, cloneSubmodules, commitFiles, createSimpleGit, deleteBranch, diffCommitTree, fetchBranch, fetchRevSpec, forcePushToRemote, getBranchCommit, getBranchFiles, getBranchFilesFromCommit, getBranchLastCommitTime, getBranchList, getBranchUpdateDate, getCommitMessages, getCommitTreeSha, getFile, getFileList, getFiles, getRemotes, getRepoStatus, getSubmodules, getUrl, gitRetry, hasDiff, initRepo, isBranchBehindBase, isBranchConflicted, isBranchModified, isCloned, isFileModeEnabled, mergeBranch, mergeToLocal, prepareCommit, pushCommit, pushCommitToRenovateRef, resetHardFromRemote, resetToCommit, setGitAuthor, setNoVerify, setPrivateKey, setUserRepoConfig, syncForkWithUpstream, syncGit, validateGitVersion, writeGitAuthor };
1245
1258
 
1246
1259
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../lib/util/git/index.ts"],"sourcesContent":["import { setTimeout } from 'node:timers/promises';\nimport URL from 'node:url';\nimport { isBoolean, isNonEmptyObject, isString } from '@sindresorhus/is';\nimport fs from 'fs-extra';\nimport { DateTime } from 'luxon';\nimport semver from 'semver';\nimport type {\n Options,\n SimpleGit,\n SimpleGitOptions,\n TaskOptions,\n} from 'simple-git';\nimport { ResetMode, simpleGit } from 'simple-git';\nimport upath from 'upath';\nimport { getConfigFileNames } from '../../config/app-strings.ts';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type { RenovateConfig } from '../../config/types.ts';\nimport {\n CONFIG_VALIDATION,\n INVALID_PATH,\n REPOSITORY_CHANGED,\n REPOSITORY_DISABLED,\n REPOSITORY_EMPTY,\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n UNKNOWN_ERROR,\n} from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport { withInstrumenting } from '../../instrumentation/with-instrumenting.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport type { GitProtocol } from '../../types/git.ts';\nimport { incCountValue, incLimitedValue } from '../../workers/global/limits.ts';\nimport { getCache } from '../cache/repository/index.ts';\nimport { getEnv } from '../env.ts';\nimport type { ExtraEnv } from '../exec/types.ts';\nimport { getChildEnv } from '../exec/utils.ts';\nimport { newlineRegex, regEx } from '../regex.ts';\nimport type { LongCommitSha } from '../schema-utils/git.ts';\nimport { toLongCommitSha } from '../schema-utils/git.ts';\nimport { matchRegexOrGlobList } from '../string-match.ts';\nimport { logWarningIfUnicodeHiddenCharactersInPackageFile } from '../unicode.ts';\nimport { getGitEnvironmentVariables } from './auth.ts';\nimport { parseGitAuthor } from './author.ts';\nimport {\n getCachedBehindBaseResult,\n setCachedBehindBaseResult,\n} from './behind-base-branch-cache.ts';\nimport { getNoVerify, simpleGitConfig } from './config.ts';\nimport {\n getCachedConflictResult,\n setCachedConflictResult,\n} from './conflicts-cache.ts';\nimport {\n bulkChangesDisallowed,\n checkForPlatformFailure,\n handleCommitError,\n} from './error.ts';\nimport type { InstrumentedSimpleGit } from './instrument.ts';\nimport { instrumentGit } from './instrument.ts';\nimport {\n getCachedModifiedResult,\n setCachedModifiedResult,\n} from './modified-cache.ts';\nimport { configSigningKey, writePrivateKey } from './private-key.ts';\nimport type {\n CommitFilesConfig,\n CommitResult,\n DiffTreeItem,\n GitObjectType,\n LocalConfig,\n PushFilesConfig,\n StatusResult,\n StorageConfig,\n} from './types.ts';\nimport { GitTreeMode } from './types.ts';\nimport {\n getCachedUpdateDateResult,\n setCachedUpdateDateResult,\n} from './update-date-cache.ts';\n\nexport { setNoVerify } from './config.ts';\nexport { setPrivateKey } from './private-key.ts';\n\n// Retry parameters\nconst retryCount = 5;\nconst delaySeconds = 3;\nconst delayFactor = 2;\n\nexport const RENOVATE_FORK_UPSTREAM = 'renovate-fork-upstream';\n\nexport function createSimpleGit({\n config,\n env,\n}: {\n config?: Partial<SimpleGitOptions>;\n env?: ExtraEnv;\n} = {}): SimpleGit {\n return simpleGit({ ...simpleGitConfig(), ...config }).env(\n getChildEnv({\n extraEnv: {\n // Git will prompt for known hosts or passwords, unless we activate BatchMode.\n // Set as extraEnv (lowest priority) so that process.env and\n // customEnvVariables can override it.\n GIT_SSH_COMMAND: 'ssh -o BatchMode=yes',\n },\n env: {\n ...env,\n // To ensure the simple-git parsers match correctly, we need\n // to set the `LANG` and `LC_ALL` environment variables to\n // the `C.UTF-8` locale. See the docs for more details:\n // https://github.com/steveukx/git-js/blob/1bb14df0595794a9353d28ccdaeeb06c0b9bf2a5/docs/NON_ENGLISH_LOCALE.md\n //\n // Use \"C.UTF-8\" instead of just \"C\" (as specified in docs) to handle special characters:\n // https://github.com/renovatebot/renovate/pull/18963\n LANG: 'C.UTF-8',\n LC_ALL: 'C.UTF-8',\n },\n }),\n );\n}\n\n// A generic wrapper for simpleGit.* calls to make them more fault-tolerant\nexport async function gitRetry<T>(gitFunc: () => Promise<T>): Promise<T> {\n let round = 0;\n let lastError: Error | undefined;\n\n while (round <= retryCount) {\n if (round > 0) {\n logger.debug(`gitRetry round ${round}`);\n }\n try {\n const res = await gitFunc();\n if (round > 1) {\n logger.debug('Successful retry of git function');\n }\n return res;\n } catch (err) {\n lastError = err;\n logger.debug({ err }, `Git function thrown`);\n // Try to transform the Error to ExternalHostError\n const errChecked = checkForPlatformFailure(err);\n if (errChecked instanceof ExternalHostError) {\n logger.debug(\n { err: errChecked },\n `ExternalHostError thrown in round ${\n round + 1\n } of ${retryCount} - retrying in the next round`,\n );\n } else {\n throw err;\n }\n }\n\n const nextDelay = delayFactor ^ ((round - 1) * delaySeconds);\n logger.trace({ nextDelay }, `Delay next round`);\n await setTimeout(1000 * nextDelay);\n\n round++;\n }\n\n throw lastError!;\n}\n\nasync function isDirectory(dir: string): Promise<boolean> {\n try {\n return (await fs.stat(dir)).isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function getDefaultBranch(git: InstrumentedSimpleGit): Promise<string> {\n logger.debug('getDefaultBranch()');\n // see https://stackoverflow.com/a/62352647/3005034\n try {\n let res = await git.raw(['rev-parse', '--abbrev-ref', 'origin/HEAD']);\n /* v8 ignore next -- TODO: add test #40625 */\n if (!res) {\n logger.debug('Could not determine default branch using git rev-parse');\n const headPrefix = 'HEAD branch: ';\n res = (await git.raw(['remote', 'show', 'origin']))\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith(headPrefix))!\n .replace(headPrefix, '');\n }\n\n return res.replace('origin/', '').trim();\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug({ err }, 'Error getting default branch');\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n if (\n err.message.startsWith(\n 'fatal: ref refs/remotes/origin/HEAD is not a symbolic ref',\n )\n ) {\n throw new Error(REPOSITORY_EMPTY);\n }\n if (err.message.includes(\"fatal: ambiguous argument 'origin/HEAD'\")) {\n logger.warn('Error getting default branch');\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n}\n\nlet config: LocalConfig = {} as any;\n\n// TODO: can be undefined\nlet git: InstrumentedSimpleGit;\nlet gitInitialized: boolean;\nlet submodulesInitizialized: boolean;\n\nlet privateKeySet = false;\n\nexport const GIT_MINIMUM_VERSION = '2.33.0'; // git show-current\n\nexport async function validateGitVersion(): Promise<boolean> {\n let version: string | undefined;\n const globalGit = instrumentGit(createSimpleGit());\n try {\n const { major, minor, patch, installed } = await globalGit.version();\n /* v8 ignore if -- TODO: add test #40625 */\n if (!installed) {\n logger.error('Git not installed');\n return false;\n }\n version = `${major}.${minor}.${patch}`;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.error({ err }, 'Error fetching git version');\n return false;\n }\n /* v8 ignore if -- TODO: add test #40625 */\n if (!(version && semver.gte(version, GIT_MINIMUM_VERSION))) {\n logger.error(\n { detectedVersion: version, minimumVersion: GIT_MINIMUM_VERSION },\n 'Git version needs upgrading',\n );\n return false;\n }\n logger.debug(`Found valid git version: ${version}`);\n return true;\n}\n\nasync function fetchBranchCommits(preferUpstream = true): Promise<void> {\n config.branchCommits = {};\n const url =\n preferUpstream && config.upstreamUrl ? config.upstreamUrl : config.url;\n logger.debug(`fetchBranchCommits(): url=${url}`);\n const opts = ['ls-remote', '--heads', url];\n const localDir = GlobalConfig.get('localDir');\n const repoExists = await fs.pathExists(upath.join(localDir, '.git/HEAD'));\n if (config.extraCloneOpts && !repoExists) {\n Object.entries(config.extraCloneOpts).forEach((e) =>\n // TODO: types (#22198)\n opts.unshift(e[0], `${e[1]!}`),\n );\n }\n try {\n const lsRemoteRes = await gitRetry(() => git.raw(opts));\n logger.trace({ lsRemoteRes }, 'git ls-remote result');\n lsRemoteRes\n .split(newlineRegex)\n .filter(Boolean)\n .map((line) => line.trim().split(regEx(/\\s+/)))\n .forEach(([sha, ref]) => {\n config.branchCommits[ref.replace('refs/heads/', '')] =\n toLongCommitSha(sha);\n });\n logger.trace({ branchCommits: config.branchCommits }, 'branch commits');\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n logger.debug({ err }, 'git error');\n if (err.message?.includes('Please ask the owner to check their account')) {\n throw new Error(REPOSITORY_DISABLED);\n }\n throw err;\n }\n}\n\nexport async function fetchRevSpec(revSpec: string): Promise<void> {\n await gitRetry(() => git.fetch(['origin', revSpec]));\n}\n\nexport async function initRepo(args: StorageConfig): Promise<void> {\n config = { ...args } as any;\n config.ignoredAuthors = [];\n config.additionalBranches = [];\n config.branchIsModified = {};\n git = instrumentGit(\n createSimpleGit({ config: { baseDir: GlobalConfig.get('localDir') } }),\n );\n gitInitialized = false;\n submodulesInitizialized = false;\n await fetchBranchCommits();\n}\n\nasync function resetToBranch(branchName: string): Promise<void> {\n logger.debug(`resetToBranch(${branchName})`);\n await git.raw(['reset', '--hard']);\n await gitRetry(() => git.checkout(branchName));\n await git.raw(['reset', '--hard', `origin/${branchName}`]);\n await git.raw(['clean', '-fd']);\n}\n\n/* v8 ignore next -- TODO: add test #40625 */\nexport async function resetToCommit(commit: LongCommitSha): Promise<void> {\n logger.debug(`resetToCommit(${commit})`);\n await git.raw(['reset', '--hard', commit]);\n}\n\nasync function deleteLocalBranch(branchName: string): Promise<void> {\n await git.branch(['-D', branchName]);\n}\n\nasync function cleanLocalBranches(): Promise<void> {\n const existingBranches = (await git.raw(['branch']))\n .split(newlineRegex)\n .map((branch) => branch.trim())\n .filter((branch) => branch.length > 0 && !branch.startsWith('* '));\n logger.debug({ existingBranches });\n for (const branchName of existingBranches) {\n await deleteLocalBranch(branchName);\n }\n}\n\nexport function setGitAuthor(gitAuthor: string | undefined): void {\n const gitAuthorParsed = parseGitAuthor(\n gitAuthor ?? 'Renovate Bot <renovate@whitesourcesoftware.com>',\n );\n if (!gitAuthorParsed) {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = 'None';\n error.validationError = 'Invalid gitAuthor';\n error.validationMessage = `\\`gitAuthor\\` is not parsed as valid RFC5322 format: \\`${gitAuthor!}\\``;\n throw error;\n }\n config.gitAuthorName = gitAuthorParsed.name;\n config.gitAuthorEmail = gitAuthorParsed.address;\n}\n\nexport async function writeGitAuthor(): Promise<void> {\n const { gitAuthorName, gitAuthorEmail, writeGitDone } = config;\n /* v8 ignore if -- TODO: add test #40625 */\n if (writeGitDone) {\n return;\n }\n config.writeGitDone = true;\n try {\n // v8 ignore else -- TODO: add test #40625\n if (gitAuthorName) {\n logger.debug(`Setting git author name: ${gitAuthorName}`);\n await git.addConfig('user.name', gitAuthorName);\n }\n // v8 ignore else -- TODO: add test #40625\n if (gitAuthorEmail) {\n logger.debug(`Setting git author email: ${gitAuthorEmail}`);\n await git.addConfig('user.email', gitAuthorEmail);\n }\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n logger.debug(\n { err, gitAuthorName, gitAuthorEmail },\n 'Error setting git author config',\n );\n throw new Error(TEMPORARY_ERROR);\n }\n}\n\nexport function setUserRepoConfig({\n gitIgnoredAuthors,\n gitAuthor,\n}: RenovateConfig): void {\n config.ignoredAuthors = gitIgnoredAuthors ?? [];\n setGitAuthor(gitAuthor);\n}\n\nexport async function getSubmodules(): Promise<string[]> {\n try {\n return (\n (await git.raw([\n 'config',\n '--file',\n '.gitmodules',\n '--get-regexp',\n '\\\\.path',\n ])) || ''\n )\n .trim()\n .split(regEx(/[\\n\\s]/))\n .filter((_e: string, i: number) => i % 2);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error getting submodules');\n return [];\n }\n}\n\nexport async function cloneSubmodules(\n shouldClone: boolean,\n cloneSubmodulesFilter: string[] | undefined,\n): Promise<void> {\n if (!shouldClone || submodulesInitizialized) {\n return;\n }\n submodulesInitizialized = true;\n const gitEnv = getChildEnv({ env: getGitEnvironmentVariables() });\n await syncGit();\n const submodules = await getSubmodules();\n for (const submodule of submodules) {\n if (!matchRegexOrGlobList(submodule, cloneSubmodulesFilter ?? ['*'])) {\n logger.debug(\n { cloneSubmodulesFilter },\n `Skipping submodule ${submodule}`,\n );\n continue;\n }\n try {\n logger.debug(`Cloning git submodule at ${submodule}`);\n await gitRetry(() =>\n git.env(gitEnv).submoduleUpdate(['--init', '--recursive', submodule]),\n );\n } catch (err) {\n logger.warn({ err, submodule }, `Unable to initialise git submodule`);\n }\n }\n}\n\nexport function isCloned(): boolean {\n return gitInitialized;\n}\n\nexport const syncGit = withInstrumenting(\n { name: 'syncGit' },\n async (): Promise<void> => {\n if (gitInitialized) {\n if (getEnv().RENOVATE_X_CLEAR_HOOKS) {\n await git.raw(['config', 'core.hooksPath', '/dev/null']);\n }\n return;\n }\n /* v8 ignore if -- TODO: add test #40625 */\n if (GlobalConfig.get('platform') === 'local') {\n throw new Error('Cannot sync git when platform=local');\n }\n gitInitialized = true;\n const localDir = GlobalConfig.get('localDir');\n logger.debug(`syncGit(): Initializing git repository into ${localDir}`);\n const gitHead = upath.join(localDir, '.git/HEAD');\n let clone = true;\n\n if (await fs.pathExists(gitHead)) {\n await instrument('fetch', async () => {\n logger.debug(\n `syncGit(): Found existing git repository, attempting git fetch`,\n );\n try {\n await git.raw(['remote', 'set-url', 'origin', config.url]);\n const fetchStart = Date.now();\n await gitRetry(() => git.fetch(['--prune', 'origin']));\n config.currentBranch =\n config.currentBranch || (await getDefaultBranch(git));\n await resetToBranch(config.currentBranch);\n await cleanLocalBranches();\n const durationMs = Math.round(Date.now() - fetchStart);\n logger.info({ durationMs }, 'git fetch completed');\n clone = false;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message === REPOSITORY_EMPTY) {\n throw err;\n }\n logger.info({ err }, 'git fetch error, falling back to git clone');\n }\n });\n }\n if (clone) {\n await instrument('clone', async () => {\n const cloneStart = Date.now();\n try {\n const opts: string[] = [];\n if (config.defaultBranch) {\n opts.push('-b', config.defaultBranch);\n }\n if (config.fullClone) {\n logger.debug('Performing full clone');\n } else {\n logger.debug('Performing blobless clone');\n opts.push('--filter=blob:none');\n }\n if (config.extraCloneOpts) {\n Object.entries(config.extraCloneOpts).forEach((e) =>\n // TODO: types (#22198)\n opts.push(e[0], `${e[1]!}`),\n );\n }\n const emptyDirAndClone = async (): Promise<void> => {\n await instrument(`fs.emptyDir(${localDir})`, () =>\n fs.emptyDir(localDir),\n );\n await git.clone(config.url, '.', opts);\n };\n await gitRetry(() =>\n instrument('emptyDirAndClone', emptyDirAndClone),\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug({ err }, 'git clone error');\n if (err.message?.includes('No space left on device')) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n if (err.message === REPOSITORY_EMPTY) {\n throw err;\n }\n throw new ExternalHostError(err, 'git');\n }\n const durationMs = Math.round(Date.now() - cloneStart);\n logger.debug({ durationMs }, 'git clone completed');\n });\n }\n try {\n config.currentBranchSha = toLongCommitSha(\n (await git.raw(['rev-parse', 'HEAD'])).trim(),\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message?.includes('fatal: not a git repository')) {\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n }\n // This will only happen now if set in global config\n await instrument('cloneSubmodules', () =>\n cloneSubmodules(!!config.cloneSubmodules, config.cloneSubmodulesFilter),\n );\n try {\n const latestCommit = (await git.log({ n: 1 })).latest;\n logger.debug({ latestCommit }, 'latest repository commit');\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n if (err.message.includes('does not have any commits yet')) {\n throw new Error(REPOSITORY_EMPTY);\n }\n logger.warn({ err }, 'Cannot retrieve latest commit');\n }\n config.currentBranch =\n config.currentBranch ??\n config.defaultBranch ??\n (await getDefaultBranch(git));\n /* v8 ignore next -- TODO: add test #40625 */\n delete getCache()?.semanticCommits;\n\n // If upstreamUrl is set then the bot is running in fork mode\n // The \"upstream\" remote is the original repository which was forked from\n if (config.upstreamUrl) {\n const { upstreamUrl } = config;\n await instrument('sync with upstreamUrl', async () => {\n logger.debug(\n `Bringing default branch up-to-date with ${RENOVATE_FORK_UPSTREAM}, to get latest config`,\n );\n // Add remote if it does not exist\n const remotes = await git.getRemotes(true);\n // v8 ignore else -- TODO: add test #40625\n if (!remotes.some((remote) => remote.name === RENOVATE_FORK_UPSTREAM)) {\n logger.debug(`Adding remote ${RENOVATE_FORK_UPSTREAM}`);\n await git.addRemote(RENOVATE_FORK_UPSTREAM, upstreamUrl);\n }\n await syncForkWithUpstream(config.currentBranch);\n await fetchBranchCommits(false);\n });\n }\n\n config.currentBranchSha = toLongCommitSha(\n (await git.revparse('HEAD')).trim(),\n );\n logger.debug(`Current branch SHA: ${config.currentBranchSha}`);\n },\n);\n\nexport async function getRepoStatus(path?: string): Promise<StatusResult> {\n if (isString(path)) {\n const localDir = GlobalConfig.get('localDir');\n const localPath = upath.resolve(localDir, path);\n if (!localPath.startsWith(upath.resolve(localDir))) {\n logger.warn(\n { localPath, localDir },\n 'Preventing access to file outside the local directory',\n );\n throw new Error(INVALID_PATH);\n }\n }\n\n await syncGit();\n return git.status(path ? [path] : []);\n}\n\nexport function branchExists(branchName: string): boolean {\n return !!config.branchCommits[branchName];\n}\n\n// Return the commit SHA for a branch\nexport function getBranchCommit(branchName: string): LongCommitSha | null {\n return config.branchCommits?.[branchName] || null;\n}\n\n// Return the date of the latest commit for a branch\nexport async function getBranchUpdateDate(\n branchName: string,\n): Promise<DateTime | null> {\n const branchSha = config.branchCommits[branchName];\n if (!branchSha) {\n return null;\n }\n const updateDate = getCachedUpdateDateResult(branchName, branchSha);\n if (updateDate !== null) {\n logger.debug(\n `getBranchUpdateDate(): using cached result \"${updateDate.toISO()}\"`,\n );\n return updateDate;\n }\n await syncGit();\n try {\n const result = await getCommitDate(branchSha);\n setCachedUpdateDateResult(branchName, result);\n return result;\n } catch (err) {\n logger.debug({ err, branchName }, 'Error getting branch update date');\n return null;\n }\n}\n\nexport async function getCommitMessages(): Promise<string[]> {\n logger.debug('getCommitMessages');\n // v8 ignore else -- TODO: add test #40625\n if (GlobalConfig.get('platform') !== 'local') {\n await syncGit();\n }\n try {\n const res = await git.log({\n n: 20,\n format: { message: '%s' },\n '--no-merges': null,\n });\n return res.all.map((commit) => commit.message);\n } catch /* v8 ignore next -- TODO: add test #40625 */ {\n return [];\n }\n}\n\nexport async function checkoutBranch(\n branchName: string,\n): Promise<LongCommitSha> {\n logger.debug(`Setting current branch to ${branchName}`);\n await syncGit();\n try {\n await gitRetry(() =>\n git.checkout(\n submodulesInitizialized\n ? ['-f', '--recurse-submodules', branchName, '--']\n : ['-f', branchName, '--'],\n ),\n );\n config.currentBranch = branchName;\n config.currentBranchSha = toLongCommitSha(\n (await git.raw(['rev-parse', 'HEAD'])).trim(),\n );\n const latestCommitDate = await getCommitDate(config.currentBranchSha);\n // v8 ignore else -- TODO: add test #40625\n if (latestCommitDate) {\n logger.debug(\n { branchName, latestCommitDate, sha: config.currentBranchSha },\n 'latest commit',\n );\n }\n await git.reset(ResetMode.HARD);\n return config.currentBranchSha;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n if (err.message?.includes('fatal: ambiguous argument')) {\n logger.warn({ err }, 'Failed to checkout branch');\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n}\n\nexport async function checkoutBranchFromRemote(\n branchName: string,\n remoteName: string,\n): Promise<LongCommitSha> {\n logger.debug(`Checking out branch ${branchName} from remote ${remoteName}`);\n await syncGit();\n try {\n await gitRetry(() =>\n git.checkoutBranch(branchName, `${remoteName}/${branchName}`),\n );\n config.currentBranch = branchName;\n config.currentBranchSha = toLongCommitSha(\n (await git.revparse('HEAD')).trim(),\n );\n logger.debug(`Checked out branch ${branchName} from remote ${remoteName}`);\n config.branchCommits[branchName] = config.currentBranchSha;\n return config.currentBranchSha;\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n if (err.message?.includes('fatal: ambiguous argument')) {\n logger.warn({ err }, 'Failed to checkout branch');\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n}\n\nexport async function resetHardFromRemote(\n remoteAndBranch: string,\n): Promise<void> {\n try {\n const resetLog = await git.reset(['--hard', remoteAndBranch]);\n logger.debug({ resetLog }, 'git reset log');\n } catch (err) {\n logger.error({ err }, 'Error during git reset --hard');\n throw err;\n }\n}\n\nexport async function forcePushToRemote(\n branchName: string,\n remote: string,\n): Promise<void> {\n try {\n const pushLog = await git.push([remote, branchName, '--force']);\n logger.debug({ pushLog }, 'git push log');\n } catch (err) {\n logger.error({ err }, 'Error during git push --force');\n throw err;\n }\n}\n\nexport async function getFileList(): Promise<string[]> {\n await syncGit();\n const branch = config.currentBranch;\n let files: string;\n try {\n files = await git.raw(['ls-tree', '-r', `refs/heads/${branch}`]);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message?.includes('fatal: Not a valid object name')) {\n logger.debug(\n { err },\n 'Branch not found when checking branch list - aborting',\n );\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n }\n /* v8 ignore if -- TODO: add test #40625 */\n if (!files) {\n return [];\n }\n // submodules are starting with `160000 commit`\n return files\n .split(newlineRegex)\n .filter(isString)\n .filter((line) => line.startsWith('100'))\n .map((line) => line.split(regEx(/\\t/)).pop()!);\n}\n\nexport function getBranchList(): string[] {\n return Object.keys(config.branchCommits ?? {});\n}\n\nexport async function isBranchBehindBase(\n branchName: string,\n baseBranch: string,\n): Promise<boolean> {\n const baseBranchSha = getBranchCommit(baseBranch);\n const branchSha = getBranchCommit(branchName);\n let isBehind = getCachedBehindBaseResult(\n branchName,\n branchSha,\n baseBranch,\n baseBranchSha,\n );\n if (isBehind !== null) {\n logger.debug(`branch.isBehindBase(): using cached result \"${isBehind}\"`);\n return isBehind;\n }\n\n logger.debug(\n `branch.isBehindBase(): using git to calculate against baseBranch \"${baseBranch}\"`,\n );\n\n await syncGit();\n try {\n const behindCount = (\n await git.raw(['rev-list', '--count', `${branchSha!}..${baseBranchSha!}`])\n ).trim();\n isBehind = behindCount !== '0';\n logger.debug(\n { baseBranch, branchName },\n `branch.isBehindBase(): ${isBehind}`,\n );\n setCachedBehindBaseResult(branchName, isBehind);\n return isBehind;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n throw err;\n }\n}\n\nexport async function isBranchModified(\n branchName: string,\n baseBranch: string,\n): Promise<boolean> {\n if (!branchExists(branchName)) {\n logger.debug('branch.isModified(): no cache');\n return false;\n }\n // First check local config\n if (config.branchIsModified[branchName] !== undefined) {\n return config.branchIsModified[branchName];\n }\n // Second check repository cache\n const isModified = getCachedModifiedResult(\n branchName,\n getBranchCommit(branchName), // branch sha\n );\n if (isModified !== null) {\n logger.debug(`branch.isModified(): using cached result \"${isModified}\"`);\n config.branchIsModified[branchName] = isModified;\n return isModified;\n }\n\n logger.debug(\n `branch.isModified(): using git to calculate against baseBranch \"${baseBranch}\"`,\n );\n\n await syncGit();\n const committedAuthors = new Set<string>();\n try {\n const commits = await git.log([\n `origin/${baseBranch}..origin/${branchName}`,\n ]);\n\n for (const commit of commits.all) {\n committedAuthors.add(commit.author_email);\n }\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message?.includes('fatal: bad revision')) {\n logger.debug(\n { err },\n 'Remote branch not found when checking last commit author - aborting run',\n );\n throw new Error(REPOSITORY_CHANGED);\n }\n logger.warn({ err }, 'Error checking last author for isBranchModified');\n }\n const { gitAuthorEmail, ignoredAuthors } = config;\n\n const includedAuthors = new Set(committedAuthors);\n\n // v8 ignore else -- TODO: add test #40625\n if (gitAuthorEmail) {\n includedAuthors.delete(gitAuthorEmail);\n }\n\n for (const ignoredAuthor of ignoredAuthors) {\n includedAuthors.delete(ignoredAuthor);\n }\n\n if (includedAuthors.size === 0) {\n // authors all match - branch has not been modified\n logger.trace(\n {\n branchName,\n baseBranch,\n committedAuthors: [...committedAuthors],\n includedAuthors: [...includedAuthors],\n gitAuthorEmail,\n ignoredAuthors,\n },\n 'branch.isModified() = false',\n );\n logger.debug('branch.isModified() = false');\n config.branchIsModified[branchName] = false;\n setCachedModifiedResult(branchName, false);\n return false;\n }\n logger.trace(\n {\n branchName,\n baseBranch,\n committedAuthors: [...committedAuthors],\n includedAuthors: [...includedAuthors],\n gitAuthorEmail,\n ignoredAuthors,\n },\n 'branch.isModified() = true',\n );\n logger.debug(\n { baseBranch, branchName, unrecognizedAuthors: [...includedAuthors] },\n 'branch.isModified() = true',\n );\n config.branchIsModified[branchName] = true;\n setCachedModifiedResult(branchName, true);\n return true;\n}\n\nexport async function isBranchConflicted(\n baseBranch: string,\n branch: string,\n): Promise<boolean> {\n logger.debug(`isBranchConflicted(${baseBranch}, ${branch})`);\n\n const baseBranchSha = getBranchCommit(baseBranch);\n const branchSha = getBranchCommit(branch);\n if (!baseBranchSha || !branchSha) {\n logger.warn(\n { baseBranch, branch },\n 'isBranchConflicted: branch does not exist',\n );\n return true;\n }\n\n const isConflicted = getCachedConflictResult(\n branch,\n branchSha,\n baseBranch,\n baseBranchSha,\n );\n if (isBoolean(isConflicted)) {\n logger.debug(\n `branch.isConflicted(): using cached result \"${isConflicted}\"`,\n );\n return isConflicted;\n }\n\n logger.debug(\n `branch.isConflicted(): using git to calculate against baseBranch ${baseBranch}`,\n );\n\n let result = false;\n await syncGit();\n await writeGitAuthor();\n\n const origBranch = config.currentBranch;\n try {\n await git.reset(ResetMode.HARD);\n //TODO: see #18600\n if (origBranch !== baseBranch) {\n await git.checkout(baseBranch);\n }\n await git.merge(['--no-commit', '--no-ff', `origin/${branch}`]);\n } catch (err) {\n result = true;\n /* v8 ignore if -- TODO: add test #40625 */\n if (!err?.git?.conflicts?.length) {\n logger.debug(\n { baseBranch, branch, err },\n 'isBranchConflicted: unknown error',\n );\n }\n } finally {\n try {\n await git.merge(['--abort']);\n if (origBranch !== baseBranch) {\n await git.checkout(origBranch);\n }\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug(\n { baseBranch, branch, err },\n 'isBranchConflicted: cleanup error',\n );\n }\n }\n\n setCachedConflictResult(branch, result);\n logger.debug(`branch.isConflicted(): ${result}`);\n return result;\n}\n\nexport async function deleteBranch(\n branchName: string,\n options?: { localBranch?: boolean },\n): Promise<void> {\n await syncGit();\n if (!options?.localBranch) {\n try {\n const deleteCommand = ['push', '--delete', 'origin', branchName];\n\n if (getNoVerify().includes('push')) {\n deleteCommand.push('--no-verify');\n }\n\n await gitRetry(() => git.raw(deleteCommand));\n logger.debug(`Deleted remote branch: ${branchName}`);\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n logger.debug(`No remote branch to delete with name: ${branchName}`);\n }\n }\n try {\n await deleteLocalBranch(branchName);\n /* v8 ignore next -- TODO: add test #40625 (always throws) */\n logger.debug(`Deleted local branch: ${branchName}`);\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n logger.debug(`No local branch to delete with name: ${branchName}`);\n }\n delete config.branchCommits[branchName];\n}\n\nexport async function mergeToLocal(\n refSpecToMerge: string,\n options?: { localBranch?: boolean },\n): Promise<void> {\n let status: StatusResult | undefined;\n try {\n await syncGit();\n await writeGitAuthor();\n await git.reset(ResetMode.HARD);\n await gitRetry(() =>\n git.checkout([\n '-B',\n config.currentBranch,\n `origin/${config.currentBranch}`,\n ]),\n );\n status = await git.status();\n if (options?.localBranch) {\n await git.merge([refSpecToMerge]);\n } else {\n await fetchRevSpec(refSpecToMerge);\n await gitRetry(() => git.merge(['FETCH_HEAD']));\n }\n } catch (err) {\n logger.debug(\n {\n baseBranch: config.currentBranch,\n baseSha: config.currentBranchSha,\n refSpecToMerge,\n status,\n err,\n },\n 'mergeLocally error',\n );\n throw err;\n }\n}\n\nexport async function mergeBranch(branchName: string): Promise<void> {\n let status: StatusResult | undefined;\n try {\n await syncGit();\n await writeGitAuthor();\n await git.reset(ResetMode.HARD);\n await gitRetry(() =>\n git.checkout(['-B', branchName, `origin/${branchName}`]),\n );\n await gitRetry(() =>\n git.checkout([\n '-B',\n config.currentBranch,\n `origin/${config.currentBranch}`,\n ]),\n );\n status = await git.status();\n await gitRetry(() => git.merge(['--ff-only', branchName]));\n await gitRetry(() => git.push('origin', config.currentBranch));\n incLimitedValue('Commits');\n } catch (err) {\n logger.debug(\n {\n baseBranch: config.currentBranch,\n baseSha: config.currentBranchSha,\n branchName,\n branchSha: getBranchCommit(branchName),\n status,\n err,\n },\n 'mergeBranch error',\n );\n throw err;\n }\n}\n\nasync function getCommitDate(ref: LongCommitSha | string): Promise<DateTime> {\n const output = await git.show(['-s', '--format=%cI', ref]);\n return DateTime.fromISO(output.trim()).toUTC();\n}\n\nexport async function getBranchLastCommitTime(\n branchName: string,\n): Promise<Date> {\n await syncGit();\n try {\n const time = await getCommitDate(`origin/${branchName}`);\n return time.toJSDate();\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore next 3 -- TODO: add test */\n if (errChecked) {\n throw errChecked;\n }\n return new Date();\n }\n}\n\nexport function getBranchFiles(branchName: string): Promise<string[] | null> {\n return getBranchFilesFromRef(`origin/${branchName}`);\n}\n\nexport function getBranchFilesFromCommit(\n referenceCommit: LongCommitSha,\n): Promise<string[] | null> {\n return getBranchFilesFromRef(referenceCommit);\n}\n\nasync function getBranchFilesFromRef(\n refName: string,\n): Promise<string[] | null> {\n await syncGit();\n try {\n const diff = await gitRetry(() =>\n git.diffSummary([refName, `${refName}^`]),\n );\n return diff.files.map((file) => file.file);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'getBranchFilesFromRef error');\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n return null;\n }\n}\n\nexport async function getFile(\n filePath: string,\n branchName?: string,\n): Promise<string | null> {\n await syncGit();\n try {\n const content = await git.show([\n `origin/${branchName ?? config.currentBranch}:${filePath}`,\n ]);\n\n logWarningIfUnicodeHiddenCharactersInPackageFile(filePath, content);\n\n return content;\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n return null;\n }\n}\n\nexport async function getFiles(\n fileNames: string[],\n): Promise<Record<string, string | null>> {\n const fileContentMap: Record<string, string | null> = {};\n\n for (const fileName of fileNames) {\n fileContentMap[fileName] = await getFile(fileName);\n }\n\n return fileContentMap;\n}\n\nexport async function hasDiff(\n sourceRef: string,\n targetRef: string,\n): Promise<boolean> {\n await syncGit();\n try {\n return (\n (await gitRetry(() => git.diff([sourceRef, targetRef, '--']))) !== ''\n );\n } catch {\n return true;\n }\n}\n\nasync function handleCommitAuth(localDir: string): Promise<void> {\n if (!privateKeySet) {\n await writePrivateKey();\n privateKeySet = true;\n }\n await configSigningKey(localDir);\n await writeGitAuthor();\n}\n\n/**\n *\n * Prepare local branch with commit\n *\n * 0. Hard reset\n * 1. Creates local branch with `origin/` prefix\n * 2. Perform `git add` (respecting mode) and `git remove` for each file\n * 3. Perform commit\n * 4. Check whether resulting commit is empty or not (due to .gitignore)\n * 5. If not empty, return commit info for further processing\n *\n */\nexport async function prepareCommit({\n branchName,\n files,\n message,\n force = false,\n}: CommitFilesConfig): Promise<CommitResult | null> {\n const localDir = GlobalConfig.get('localDir');\n await syncGit();\n logger.debug(`Preparing files for committing to branch ${branchName}`);\n await handleCommitAuth(localDir);\n try {\n await git.reset(ResetMode.HARD);\n await git.raw(['clean', '-fd']);\n const parentCommitSha = config.currentBranchSha;\n await gitRetry(() =>\n git.checkout(['-B', branchName, `origin/${config.currentBranch}`]),\n );\n const deletedFiles: string[] = [];\n const addedModifiedFiles: string[] = [];\n const ignoredFiles: string[] = [];\n for (const file of files) {\n const fileName = file.path;\n if (file.type === 'deletion') {\n try {\n await git.rm([fileName]);\n deletedFiles.push(fileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n logger.trace({ err, fileName }, 'Cannot delete file');\n ignoredFiles.push(fileName);\n }\n } else {\n if (await isDirectory(upath.join(localDir, fileName))) {\n // This is usually a git submodule update\n logger.trace({ fileName }, 'Adding directory commit');\n } else if (file.contents === null) {\n continue;\n } else {\n let contents: Buffer;\n /* v8 ignore else -- TODO: add test #40625 */\n if (typeof file.contents === 'string') {\n contents = Buffer.from(file.contents);\n } else {\n contents = file.contents;\n }\n // some file systems including Windows don't support the mode\n // so the index should be manually updated after adding the file\n if (file.isSymlink) {\n await fs.symlink(file.contents, upath.join(localDir, fileName));\n } else {\n await fs.outputFile(upath.join(localDir, fileName), contents, {\n mode: file.isExecutable ? 0o777 : 0o666,\n });\n }\n }\n try {\n /* v8 ignore next -- TODO: add test #40625 */\n const addParams =\n fileName === getConfigFileNames()[0] ? ['-f', fileName] : fileName;\n await git.add(addParams);\n if (file.isExecutable) {\n await git.raw(['update-index', '--chmod=+x', fileName]);\n }\n addedModifiedFiles.push(fileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (\n !err.message.includes(\n 'The following paths are ignored by one of your .gitignore files',\n )\n ) {\n throw err;\n }\n logger.debug(`Cannot commit ignored file: ${fileName}`);\n ignoredFiles.push(file.path);\n }\n }\n }\n\n const commitOptions: Options = {};\n if (getNoVerify().includes('commit')) {\n commitOptions['--no-verify'] = null;\n }\n\n const commitRes = await git.commit(message, [], commitOptions);\n if (\n isNonEmptyObject(commitRes.summary) &&\n commitRes.summary.changes === 0 &&\n commitRes.summary.insertions === 0 &&\n commitRes.summary.deletions === 0\n ) {\n logger.warn({ commitRes }, 'Detected empty commit - aborting git push');\n return null;\n }\n logger.debug(\n { deletedFiles, ignoredFiles, result: commitRes },\n `git commit`,\n );\n if (!force && !(await hasDiff('HEAD', `origin/${branchName}`))) {\n logger.debug(\n { branchName, deletedFiles, addedModifiedFiles, ignoredFiles },\n 'No file changes detected. Skipping commit',\n );\n return null;\n }\n\n const commitSha = toLongCommitSha(\n (await git.revparse([branchName])).trim(),\n );\n const result: CommitResult = {\n parentCommitSha,\n commitSha,\n files: files.filter((fileChange) => {\n if (fileChange.type === 'deletion') {\n return deletedFiles.includes(fileChange.path);\n }\n return addedModifiedFiles.includes(fileChange.path);\n }),\n };\n\n return result;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n return handleCommitError(err, branchName, files);\n }\n}\n\nexport async function pushCommit({\n sourceRef,\n targetRef,\n files,\n pushOptions,\n}: PushFilesConfig): Promise<boolean> {\n await syncGit();\n logger.debug(`Pushing refSpec ${sourceRef}:${targetRef ?? sourceRef}`);\n let result = false;\n try {\n const gitOptions: TaskOptions = {\n '--force-with-lease': null,\n '-u': null,\n };\n if (getNoVerify().includes('push')) {\n gitOptions['--no-verify'] = null;\n }\n if (pushOptions) {\n gitOptions['--push-option'] = pushOptions;\n }\n\n const pushRes = await gitRetry(() =>\n git.push('origin', `${sourceRef}:${targetRef ?? sourceRef}`, gitOptions),\n );\n delete pushRes.repo;\n logger.debug({ result: pushRes }, 'git push');\n incLimitedValue('Commits');\n incCountValue('HourlyCommits');\n result = true;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n handleCommitError(err, sourceRef, files);\n }\n return result;\n}\n\nexport async function fetchBranch(\n branchName: string,\n): Promise<LongCommitSha | null> {\n await syncGit();\n logger.debug(`Fetching branch ${branchName}`);\n try {\n const ref = `refs/heads/${branchName}:refs/remotes/origin/${branchName}`;\n await gitRetry(() => git.pull(['origin', ref, '--force']));\n const commit = toLongCommitSha((await git.revparse([branchName])).trim());\n config.branchCommits[branchName] = commit;\n config.branchIsModified[branchName] = false;\n return commit;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n return handleCommitError(err, branchName);\n }\n}\n\nexport async function commitFiles(\n commitConfig: CommitFilesConfig,\n): Promise<LongCommitSha | null> {\n try {\n const commitResult = await prepareCommit(commitConfig);\n if (commitResult) {\n const pushResult = await pushCommit({\n sourceRef: commitConfig.branchName,\n files: commitConfig.files,\n });\n // v8 ignore else -- TODO: add test #40625\n if (pushResult) {\n const { branchName } = commitConfig;\n const { commitSha } = commitResult;\n config.branchCommits[branchName] = commitSha;\n config.branchIsModified[branchName] = false;\n return commitSha;\n }\n }\n return null;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message.includes('[rejected] (stale info)')) {\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n }\n}\n\nexport function getUrl({\n protocol,\n auth,\n hostname,\n host,\n repository,\n}: {\n protocol?: GitProtocol;\n auth?: string;\n hostname?: string;\n host?: string;\n repository: string;\n}): string {\n if (protocol === 'ssh') {\n // TODO: types (#22198)\n return `git@${hostname!}:${repository}.git`;\n }\n return URL.format({\n protocol: protocol ?? 'https',\n auth,\n hostname,\n host,\n pathname: `${repository}.git`,\n });\n}\n\nlet remoteRefsExist = false;\n\n/**\n *\n * Non-branch refs allow us to store git objects without triggering CI pipelines.\n * It's useful for API-based branch rebasing.\n *\n * @see https://stackoverflow.com/questions/63866947/pushing-git-non-branch-references-to-a-remote/63868286\n *\n */\nexport async function pushCommitToRenovateRef(\n commitSha: string,\n refName: string,\n): Promise<void> {\n const fullRefName = `refs/renovate/branches/${refName}`;\n await git.raw(['update-ref', fullRefName, commitSha]);\n await git.push(['--force', 'origin', fullRefName]);\n remoteRefsExist = true;\n}\n\n/**\n *\n * Removes all remote \"refs/renovate/branches/*\" refs in two steps:\n *\n * Step 1: list refs\n *\n * $ git ls-remote origin \"refs/renovate/branches/*\"\n *\n * > cca38e9ea6d10946bdb2d0ca5a52c205783897aa refs/renovate/branches/foo\n * > 29ac154936c880068994e17eb7f12da7fdca70e5 refs/renovate/branches/bar\n * > 3fafaddc339894b6d4f97595940fd91af71d0355 refs/renovate/branches/baz\n * > ...\n *\n * Step 2:\n *\n * $ git push --delete origin refs/renovate/branches/foo refs/renovate/branches/bar refs/renovate/branches/baz\n *\n * If Step 2 fails because the repo doesn't allow bulk changes, we'll remove them one by one instead:\n *\n * $ git push --delete origin refs/renovate/branches/foo\n * $ git push --delete origin refs/renovate/branches/bar\n * $ git push --delete origin refs/renovate/branches/baz\n */\nexport async function clearRenovateRefs(): Promise<void> {\n if (!gitInitialized || !remoteRefsExist) {\n return;\n }\n\n logger.debug(`Cleaning up Renovate refs: refs/renovate/branches/*`);\n const renovateRefs: string[] = [];\n\n try {\n const rawOutput = await git.listRemote([\n config.url,\n 'refs/renovate/branches/*',\n ]);\n const refs = rawOutput\n .split(newlineRegex)\n .map((line) => line.replace(regEx(/[0-9a-f]+\\s+/i), '').trim())\n .filter((line) => line.startsWith('refs/renovate/branches/'));\n renovateRefs.push(...refs);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, `Renovate refs cleanup error`);\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (renovateRefs.length) {\n try {\n const pushOpts = ['--delete', 'origin', ...renovateRefs];\n await git.push(pushOpts);\n } catch (err) {\n /* v8 ignore else -- TODO: add test #40625 */\n if (bulkChangesDisallowed(err)) {\n for (const ref of renovateRefs) {\n try {\n const pushOpts = ['--delete', 'origin', ref];\n await git.push(pushOpts);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug({ err }, 'Error deleting \"refs/renovate/branches/*\"');\n break;\n }\n }\n } else {\n logger.warn({ err }, 'Error deleting \"refs/renovate/branches/*\"');\n }\n }\n }\n\n remoteRefsExist = false;\n}\n\nconst diffTreeLineRegex = regEx(\n /^:(?<oldMode>\\d{6})\\s+(?<newMode>\\d{6})\\s+(?<oldSha>[0-9a-f]{40})\\s+(?<newSha>[0-9a-f]{40})\\s+(?<status>[A-Z]\\d*)\\t(?<paths>.+)$/,\n);\n\nconst treeShaRegex = regEx(/tree\\s+(?<treeSha>[0-9a-f]{40})\\s*/);\n\n/**\n * Get the tree SHA for a commit.\n */\nexport async function getCommitTreeSha(\n commitSha: LongCommitSha,\n): Promise<LongCommitSha> {\n const commitOutput = await git.catFile(['-p', commitSha]);\n const { treeSha } = treeShaRegex.exec(commitOutput)?.groups ?? {};\n if (!treeSha) {\n const snippet = commitOutput.split(newlineRegex)[0];\n /* v8 ignore next -- tested, but v8 reports template literal as partial */\n throw new Error(\n `Could not extract tree SHA from commit ${commitSha}: ${snippet}`,\n );\n }\n return toLongCommitSha(treeSha);\n}\n\nfunction treeTypeFromMode(mode: string): GitObjectType {\n switch (mode) {\n case GitTreeMode.Gitlink:\n return 'commit';\n case GitTreeMode.Directory:\n return 'tree';\n default:\n return 'blob';\n }\n}\n\n/**\n * Return only the files that changed between two commits.\n * Deletions have `sha: null` (for use with GitHub's `base_tree` API).\n */\nexport async function diffCommitTree(\n parentCommitSha: LongCommitSha,\n commitSha: LongCommitSha,\n): Promise<DiffTreeItem[]> {\n const output = await git.raw([\n 'diff-tree',\n '-M',\n '-r',\n '--no-commit-id',\n parentCommitSha,\n commitSha,\n ]);\n const result: DiffTreeItem[] = [];\n for (const line of output.split(newlineRegex)) {\n const matchGroups = diffTreeLineRegex.exec(line)?.groups;\n if (matchGroups) {\n const { oldMode, newMode, newSha, status, paths } = matchGroups;\n const statusCode = status[0];\n // R has two tab-separated paths (old\\tnew); A/M/D/T have one.\n // C also has two paths but falls through to default (only the target matters).\n const [sourcePath, targetPath] = paths.split('\\t');\n switch (statusCode) {\n case 'D':\n result.push({\n path: sourcePath,\n mode: oldMode,\n type: treeTypeFromMode(oldMode),\n sha: null,\n });\n break;\n case 'R':\n // Rename: delete source, add target\n result.push({\n path: sourcePath,\n mode: oldMode,\n type: treeTypeFromMode(oldMode),\n sha: null,\n });\n result.push({\n path: targetPath,\n mode: newMode,\n type: treeTypeFromMode(newMode),\n sha: toLongCommitSha(newSha),\n });\n break;\n default:\n // A (add), M (modify), T (type change), C (copy)\n result.push({\n path: targetPath ?? sourcePath,\n mode: newMode,\n type: treeTypeFromMode(newMode),\n sha: toLongCommitSha(newSha),\n });\n break;\n }\n }\n }\n return result;\n}\n\nasync function localBranchExists(branchName: string): Promise<boolean> {\n await syncGit();\n const localBranches = await git.branchLocal();\n return localBranches.all.includes(branchName);\n}\n\n/**\n * Synchronize a forked branch with its upstream counterpart.\n *\n * syncForkWithUpstream updates the fork's branch, to match the corresponding branch in the upstream repository.\n * The steps are:\n * 1. Check if the branch exists locally.\n * 2. If the branch exists locally: checkout the local branch.\n * 3. If the branch does _not_ exist locally: checkout the upstream branch.\n * 4. Reset the local branch to match the upstream branch.\n * 5. Force push the (updated) local branch to the origin repository.\n *\n * @param {string} branchName - The name of the branch to synchronize.\n * @returns A promise that resolves to True if the synchronization is successful, or `false` if an error occurs.\n */\nexport async function syncForkWithUpstream(branchName: string): Promise<void> {\n if (!config.upstreamUrl) {\n return;\n }\n logger.debug(\n `Synchronizing fork with \"${RENOVATE_FORK_UPSTREAM}\" remote for branch ${branchName}`,\n );\n const remotes = await getRemotes();\n /* v8 ignore if -- this should not be possible if upstreamUrl exists */\n if (!remotes.some((r) => r === RENOVATE_FORK_UPSTREAM)) {\n throw new Error('No upstream remote exists, cannot sync fork');\n }\n try {\n await git.fetch([RENOVATE_FORK_UPSTREAM]);\n if (await localBranchExists(branchName)) {\n await checkoutBranch(branchName);\n } else {\n await checkoutBranchFromRemote(branchName, RENOVATE_FORK_UPSTREAM);\n }\n await resetHardFromRemote(`${RENOVATE_FORK_UPSTREAM}/${branchName}`);\n await forcePushToRemote(branchName, 'origin');\n } catch (err) /* v8 ignore next -- shouldn't happen */ {\n logger.error({ err }, 'Error synchronizing fork');\n throw new Error(UNKNOWN_ERROR);\n }\n}\n\nexport async function getRemotes(): Promise<string[]> {\n logger.debug('git.getRemotes()');\n try {\n await syncGit();\n const remotes = await git.getRemotes();\n logger.debug(`Found remotes: ${remotes.map((r) => r.name).join(', ')}`);\n return remotes.map((remote) => remote.name);\n } catch (err) /* v8 ignore next */ {\n logger.error({ err }, 'Error getting remotes');\n throw err;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../lib/util/git/index.ts"],"sourcesContent":["import { setTimeout } from 'node:timers/promises';\nimport URL from 'node:url';\nimport { isBoolean, isNonEmptyObject, isString } from '@sindresorhus/is';\nimport fs from 'fs-extra';\nimport { DateTime } from 'luxon';\nimport semver from 'semver';\nimport type {\n Options,\n SimpleGit,\n SimpleGitOptions,\n TaskOptions,\n} from 'simple-git';\nimport { ResetMode, simpleGit } from 'simple-git';\nimport upath from 'upath';\nimport { getConfigFileNames } from '../../config/app-strings.ts';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type { RenovateConfig } from '../../config/types.ts';\nimport {\n CONFIG_VALIDATION,\n INVALID_PATH,\n REPOSITORY_CHANGED,\n REPOSITORY_DISABLED,\n REPOSITORY_EMPTY,\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n UNKNOWN_ERROR,\n} from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport { withInstrumenting } from '../../instrumentation/with-instrumenting.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport type { GitProtocol } from '../../types/git.ts';\nimport { incCountValue, incLimitedValue } from '../../workers/global/limits.ts';\nimport { getCache } from '../cache/repository/index.ts';\nimport { getEnv } from '../env.ts';\nimport type { ExtraEnv } from '../exec/types.ts';\nimport { getChildEnv } from '../exec/utils.ts';\nimport { newlineRegex, regEx } from '../regex.ts';\nimport type { LongCommitSha } from '../schema-utils/git.ts';\nimport { toLongCommitSha } from '../schema-utils/git.ts';\nimport { matchRegexOrGlobList } from '../string-match.ts';\nimport { logWarningIfUnicodeHiddenCharactersInPackageFile } from '../unicode.ts';\nimport { getGitEnvironmentVariables } from './auth.ts';\nimport { parseGitAuthor } from './author.ts';\nimport {\n getCachedBehindBaseResult,\n setCachedBehindBaseResult,\n} from './behind-base-branch-cache.ts';\nimport { getNoVerify, simpleGitConfig } from './config.ts';\nimport {\n getCachedConflictResult,\n setCachedConflictResult,\n} from './conflicts-cache.ts';\nimport {\n bulkChangesDisallowed,\n checkForPlatformFailure,\n handleCommitError,\n} from './error.ts';\nimport type { InstrumentedSimpleGit } from './instrument.ts';\nimport { instrumentGit } from './instrument.ts';\nimport {\n getCachedModifiedResult,\n setCachedModifiedResult,\n} from './modified-cache.ts';\nimport { configSigningKey, writePrivateKey } from './private-key.ts';\nimport type {\n CommitFilesConfig,\n CommitResult,\n DiffTreeItem,\n GitObjectType,\n LocalConfig,\n PushFilesConfig,\n StatusResult,\n StorageConfig,\n} from './types.ts';\nimport { GitTreeMode } from './types.ts';\nimport {\n getCachedUpdateDateResult,\n setCachedUpdateDateResult,\n} from './update-date-cache.ts';\n\nexport { setNoVerify } from './config.ts';\nexport { setPrivateKey } from './private-key.ts';\n\n// Retry parameters\nconst retryCount = 5;\nconst delaySeconds = 3;\nconst delayFactor = 2;\n\nexport const RENOVATE_FORK_UPSTREAM = 'renovate-fork-upstream';\n\nexport function createSimpleGit({\n config,\n env,\n}: {\n config?: Partial<SimpleGitOptions>;\n env?: ExtraEnv;\n} = {}): SimpleGit {\n return simpleGit({ ...simpleGitConfig(), ...config }).env(\n getChildEnv({\n extraEnv: {\n // Git will prompt for known hosts or passwords, unless we activate BatchMode.\n // Set as extraEnv (lowest priority) so that process.env and\n // customEnvVariables can override it.\n GIT_SSH_COMMAND: 'ssh -o BatchMode=yes',\n },\n env: {\n ...env,\n // To ensure the simple-git parsers match correctly, we need\n // to set the `LANG` and `LC_ALL` environment variables to\n // the `C.UTF-8` locale. See the docs for more details:\n // https://github.com/steveukx/git-js/blob/1bb14df0595794a9353d28ccdaeeb06c0b9bf2a5/docs/NON_ENGLISH_LOCALE.md\n //\n // Use \"C.UTF-8\" instead of just \"C\" (as specified in docs) to handle special characters:\n // https://github.com/renovatebot/renovate/pull/18963\n LANG: 'C.UTF-8',\n LC_ALL: 'C.UTF-8',\n },\n }),\n );\n}\n\n// A generic wrapper for simpleGit.* calls to make them more fault-tolerant\nexport async function gitRetry<T>(gitFunc: () => Promise<T>): Promise<T> {\n let round = 0;\n let lastError: Error | undefined;\n\n while (round <= retryCount) {\n if (round > 0) {\n logger.debug(`gitRetry round ${round}`);\n }\n try {\n const res = await gitFunc();\n if (round > 1) {\n logger.debug('Successful retry of git function');\n }\n return res;\n } catch (err) {\n lastError = err;\n logger.debug({ err }, `Git function thrown`);\n // Try to transform the Error to ExternalHostError\n const errChecked = checkForPlatformFailure(err);\n if (errChecked instanceof ExternalHostError) {\n logger.debug(\n { err: errChecked },\n `ExternalHostError thrown in round ${\n round + 1\n } of ${retryCount} - retrying in the next round`,\n );\n } else {\n throw err;\n }\n }\n\n const nextDelay = delayFactor ^ ((round - 1) * delaySeconds);\n logger.trace({ nextDelay }, `Delay next round`);\n await setTimeout(1000 * nextDelay);\n\n round++;\n }\n\n throw lastError!;\n}\n\nasync function isDirectory(dir: string): Promise<boolean> {\n try {\n return (await fs.stat(dir)).isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function getDefaultBranch(git: InstrumentedSimpleGit): Promise<string> {\n logger.debug('getDefaultBranch()');\n // see https://stackoverflow.com/a/62352647/3005034\n try {\n let res = await git.raw(['rev-parse', '--abbrev-ref', 'origin/HEAD']);\n /* v8 ignore next -- TODO: add test #40625 */\n if (!res) {\n logger.debug('Could not determine default branch using git rev-parse');\n const headPrefix = 'HEAD branch: ';\n res = (await git.raw(['remote', 'show', 'origin']))\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith(headPrefix))!\n .replace(headPrefix, '');\n }\n\n return res.replace('origin/', '').trim();\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug({ err }, 'Error getting default branch');\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n if (\n err.message.startsWith(\n 'fatal: ref refs/remotes/origin/HEAD is not a symbolic ref',\n )\n ) {\n throw new Error(REPOSITORY_EMPTY);\n }\n if (err.message.includes(\"fatal: ambiguous argument 'origin/HEAD'\")) {\n logger.warn('Error getting default branch');\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n}\n\nlet config: LocalConfig = {} as any;\n\n// TODO: can be undefined\nlet git: InstrumentedSimpleGit;\nlet gitInitialized: boolean;\nlet submodulesInitizialized: boolean;\n\nlet privateKeySet = false;\n\nexport const GIT_MINIMUM_VERSION = '2.33.0'; // git show-current\n\nexport async function validateGitVersion(): Promise<boolean> {\n let version: string | undefined;\n const globalGit = instrumentGit(createSimpleGit());\n try {\n const { major, minor, patch, installed } = await globalGit.version();\n /* v8 ignore if -- TODO: add test #40625 */\n if (!installed) {\n logger.error('Git not installed');\n return false;\n }\n version = `${major}.${minor}.${patch}`;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.error({ err }, 'Error fetching git version');\n return false;\n }\n /* v8 ignore if -- TODO: add test #40625 */\n if (!(version && semver.gte(version, GIT_MINIMUM_VERSION))) {\n logger.error(\n { detectedVersion: version, minimumVersion: GIT_MINIMUM_VERSION },\n 'Git version needs upgrading',\n );\n return false;\n }\n logger.debug(`Found valid git version: ${version}`);\n return true;\n}\n\nasync function fetchBranchCommits(preferUpstream = true): Promise<void> {\n config.branchCommits = {};\n const url =\n preferUpstream && config.upstreamUrl ? config.upstreamUrl : config.url;\n logger.debug(`fetchBranchCommits(): url=${url}`);\n const opts = ['ls-remote', '--heads', url];\n const localDir = GlobalConfig.get('localDir');\n const repoExists = await fs.pathExists(upath.join(localDir, '.git/HEAD'));\n if (config.extraCloneOpts && !repoExists) {\n Object.entries(config.extraCloneOpts).forEach((e) =>\n // TODO: types (#22198)\n opts.unshift(e[0], `${e[1]!}`),\n );\n }\n try {\n const lsRemoteRes = await gitRetry(() => git.raw(opts));\n logger.trace({ lsRemoteRes }, 'git ls-remote result');\n lsRemoteRes\n .split(newlineRegex)\n .filter(Boolean)\n .map((line) => line.trim().split(regEx(/\\s+/)))\n .forEach(([sha, ref]) => {\n config.branchCommits[ref.replace('refs/heads/', '')] =\n toLongCommitSha(sha);\n });\n logger.trace({ branchCommits: config.branchCommits }, 'branch commits');\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n logger.debug({ err }, 'git error');\n if (err.message?.includes('Please ask the owner to check their account')) {\n throw new Error(REPOSITORY_DISABLED);\n }\n throw err;\n }\n}\n\nexport async function fetchRevSpec(revSpec: string): Promise<void> {\n await gitRetry(() => git.fetch(['origin', revSpec]));\n}\n\nexport async function initRepo(args: StorageConfig): Promise<void> {\n config = { ...args } as any;\n config.ignoredAuthors = [];\n config.additionalBranches = [];\n config.branchIsModified = {};\n git = instrumentGit(\n createSimpleGit({ config: { baseDir: GlobalConfig.get('localDir') } }),\n );\n gitInitialized = false;\n submodulesInitizialized = false;\n await fetchBranchCommits();\n}\n\nasync function resetToBranch(branchName: string): Promise<void> {\n logger.debug(`resetToBranch(${branchName})`);\n await git.raw(['reset', '--hard']);\n await gitRetry(() => git.checkout(branchName));\n await git.raw(['reset', '--hard', `origin/${branchName}`]);\n await git.raw(['clean', '-fd']);\n}\n\n/* v8 ignore next -- TODO: add test #40625 */\nexport async function resetToCommit(commit: LongCommitSha): Promise<void> {\n logger.debug(`resetToCommit(${commit})`);\n await git.raw(['reset', '--hard', commit]);\n}\n\nasync function deleteLocalBranch(branchName: string): Promise<void> {\n await git.branch(['-D', branchName]);\n}\n\nasync function cleanLocalBranches(): Promise<void> {\n const existingBranches = (await git.raw(['branch']))\n .split(newlineRegex)\n .map((branch) => branch.trim())\n .filter((branch) => branch.length > 0 && !branch.startsWith('* '));\n logger.debug({ existingBranches });\n for (const branchName of existingBranches) {\n await deleteLocalBranch(branchName);\n }\n}\n\nexport function setGitAuthor(gitAuthor: string | undefined): void {\n const gitAuthorParsed = parseGitAuthor(\n gitAuthor ?? 'Renovate Bot <renovate@whitesourcesoftware.com>',\n );\n if (!gitAuthorParsed) {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = 'None';\n error.validationError = 'Invalid gitAuthor';\n error.validationMessage = `\\`gitAuthor\\` is not parsed as valid RFC5322 format: \\`${gitAuthor!}\\``;\n throw error;\n }\n config.gitAuthorName = gitAuthorParsed.name;\n config.gitAuthorEmail = gitAuthorParsed.address;\n}\n\nexport async function writeGitAuthor(): Promise<void> {\n const { gitAuthorName, gitAuthorEmail, writeGitDone } = config;\n /* v8 ignore if -- TODO: add test #40625 */\n if (writeGitDone) {\n return;\n }\n config.writeGitDone = true;\n try {\n // v8 ignore else -- TODO: add test #40625\n if (gitAuthorName) {\n logger.debug(`Setting git author name: ${gitAuthorName}`);\n await git.addConfig('user.name', gitAuthorName);\n }\n // v8 ignore else -- TODO: add test #40625\n if (gitAuthorEmail) {\n logger.debug(`Setting git author email: ${gitAuthorEmail}`);\n await git.addConfig('user.email', gitAuthorEmail);\n }\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n logger.debug(\n { err, gitAuthorName, gitAuthorEmail },\n 'Error setting git author config',\n );\n throw new Error(TEMPORARY_ERROR);\n }\n}\n\nexport function setUserRepoConfig({\n gitIgnoredAuthors,\n gitAuthor,\n}: RenovateConfig): void {\n config.ignoredAuthors = gitIgnoredAuthors ?? [];\n setGitAuthor(gitAuthor);\n}\n\nexport async function getSubmodules(): Promise<string[]> {\n try {\n return (\n (await git.raw([\n 'config',\n '--file',\n '.gitmodules',\n '--get-regexp',\n '\\\\.path',\n ])) || ''\n )\n .trim()\n .split(regEx(/[\\n\\s]/))\n .filter((_e: string, i: number) => i % 2);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error getting submodules');\n return [];\n }\n}\n\nexport async function cloneSubmodules(\n shouldClone: boolean,\n cloneSubmodulesFilter: string[] | undefined,\n): Promise<void> {\n if (!shouldClone || submodulesInitizialized) {\n return;\n }\n submodulesInitizialized = true;\n const gitEnv = getChildEnv({ env: getGitEnvironmentVariables() });\n await syncGit();\n const submodules = await getSubmodules();\n for (const submodule of submodules) {\n if (!matchRegexOrGlobList(submodule, cloneSubmodulesFilter ?? ['*'])) {\n logger.debug(\n { cloneSubmodulesFilter },\n `Skipping submodule ${submodule}`,\n );\n continue;\n }\n try {\n logger.debug(`Cloning git submodule at ${submodule}`);\n await gitRetry(() =>\n git.env(gitEnv).submoduleUpdate(['--init', '--recursive', submodule]),\n );\n } catch (err) {\n logger.warn({ err, submodule }, `Unable to initialise git submodule`);\n }\n }\n}\n\nexport function isCloned(): boolean {\n return gitInitialized;\n}\n\nexport async function isFileModeEnabled(): Promise<boolean> {\n if (config.fileModeEnabled === undefined) {\n const value = await git.raw([\n 'config',\n '--type=bool',\n '--default=true',\n '--get',\n 'core.fileMode',\n ]);\n config.fileModeEnabled = value.trim() === 'true';\n }\n\n return config.fileModeEnabled;\n}\n\nexport const syncGit = withInstrumenting(\n { name: 'syncGit' },\n async (): Promise<void> => {\n if (gitInitialized) {\n if (getEnv().RENOVATE_X_CLEAR_HOOKS) {\n await git.raw(['config', 'core.hooksPath', '/dev/null']);\n }\n return;\n }\n /* v8 ignore if -- TODO: add test #40625 */\n if (GlobalConfig.get('platform') === 'local') {\n throw new Error('Cannot sync git when platform=local');\n }\n gitInitialized = true;\n const localDir = GlobalConfig.get('localDir');\n logger.debug(`syncGit(): Initializing git repository into ${localDir}`);\n const gitHead = upath.join(localDir, '.git/HEAD');\n let clone = true;\n\n if (await fs.pathExists(gitHead)) {\n await instrument('fetch', async () => {\n logger.debug(\n `syncGit(): Found existing git repository, attempting git fetch`,\n );\n try {\n await git.raw(['remote', 'set-url', 'origin', config.url]);\n const fetchStart = Date.now();\n await gitRetry(() => git.fetch(['--prune', 'origin']));\n config.currentBranch =\n config.currentBranch || (await getDefaultBranch(git));\n await resetToBranch(config.currentBranch);\n await cleanLocalBranches();\n const durationMs = Math.round(Date.now() - fetchStart);\n logger.info({ durationMs }, 'git fetch completed');\n clone = false;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message === REPOSITORY_EMPTY) {\n throw err;\n }\n logger.info({ err }, 'git fetch error, falling back to git clone');\n }\n });\n }\n if (clone) {\n await instrument('clone', async () => {\n const cloneStart = Date.now();\n try {\n const opts: string[] = [];\n if (config.defaultBranch) {\n opts.push('-b', config.defaultBranch);\n }\n if (config.fullClone) {\n logger.debug('Performing full clone');\n } else {\n logger.debug('Performing blobless clone');\n opts.push('--filter=blob:none');\n }\n if (config.extraCloneOpts) {\n Object.entries(config.extraCloneOpts).forEach((e) =>\n // TODO: types (#22198)\n opts.push(e[0], `${e[1]!}`),\n );\n }\n const emptyDirAndClone = async (): Promise<void> => {\n await instrument(`fs.emptyDir(${localDir})`, () =>\n fs.emptyDir(localDir),\n );\n await git.clone(config.url, '.', opts);\n };\n await gitRetry(() =>\n instrument('emptyDirAndClone', emptyDirAndClone),\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug({ err }, 'git clone error');\n if (err.message?.includes('No space left on device')) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n if (err.message === REPOSITORY_EMPTY) {\n throw err;\n }\n throw new ExternalHostError(err, 'git');\n }\n const durationMs = Math.round(Date.now() - cloneStart);\n logger.debug({ durationMs }, 'git clone completed');\n });\n }\n try {\n config.currentBranchSha = toLongCommitSha(\n (await git.raw(['rev-parse', 'HEAD'])).trim(),\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message?.includes('fatal: not a git repository')) {\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n }\n // This will only happen now if set in global config\n await instrument('cloneSubmodules', () =>\n cloneSubmodules(!!config.cloneSubmodules, config.cloneSubmodulesFilter),\n );\n try {\n const latestCommit = (await git.log({ n: 1 })).latest;\n logger.debug({ latestCommit }, 'latest repository commit');\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n if (err.message.includes('does not have any commits yet')) {\n throw new Error(REPOSITORY_EMPTY);\n }\n logger.warn({ err }, 'Cannot retrieve latest commit');\n }\n config.currentBranch =\n config.currentBranch ??\n config.defaultBranch ??\n (await getDefaultBranch(git));\n /* v8 ignore next -- TODO: add test #40625 */\n delete getCache()?.semanticCommits;\n\n // If upstreamUrl is set then the bot is running in fork mode\n // The \"upstream\" remote is the original repository which was forked from\n if (config.upstreamUrl) {\n const { upstreamUrl } = config;\n await instrument('sync with upstreamUrl', async () => {\n logger.debug(\n `Bringing default branch up-to-date with ${RENOVATE_FORK_UPSTREAM}, to get latest config`,\n );\n // Add remote if it does not exist\n const remotes = await git.getRemotes(true);\n // v8 ignore else -- TODO: add test #40625\n if (!remotes.some((remote) => remote.name === RENOVATE_FORK_UPSTREAM)) {\n logger.debug(`Adding remote ${RENOVATE_FORK_UPSTREAM}`);\n await git.addRemote(RENOVATE_FORK_UPSTREAM, upstreamUrl);\n }\n await syncForkWithUpstream(config.currentBranch);\n await fetchBranchCommits(false);\n });\n }\n\n config.currentBranchSha = toLongCommitSha(\n (await git.revparse('HEAD')).trim(),\n );\n logger.debug(`Current branch SHA: ${config.currentBranchSha}`);\n },\n);\n\nexport async function getRepoStatus(path?: string): Promise<StatusResult> {\n if (isString(path)) {\n const localDir = GlobalConfig.get('localDir');\n const localPath = upath.resolve(localDir, path);\n if (!localPath.startsWith(upath.resolve(localDir))) {\n logger.warn(\n { localPath, localDir },\n 'Preventing access to file outside the local directory',\n );\n throw new Error(INVALID_PATH);\n }\n }\n\n await syncGit();\n return git.status(path ? [path] : []);\n}\n\nexport function branchExists(branchName: string): boolean {\n return !!config.branchCommits[branchName];\n}\n\n// Return the commit SHA for a branch\nexport function getBranchCommit(branchName: string): LongCommitSha | null {\n return config.branchCommits?.[branchName] || null;\n}\n\n// Return the date of the latest commit for a branch\nexport async function getBranchUpdateDate(\n branchName: string,\n): Promise<DateTime | null> {\n const branchSha = config.branchCommits[branchName];\n if (!branchSha) {\n return null;\n }\n const updateDate = getCachedUpdateDateResult(branchName, branchSha);\n if (updateDate !== null) {\n logger.debug(\n `getBranchUpdateDate(): using cached result \"${updateDate.toISO()}\"`,\n );\n return updateDate;\n }\n await syncGit();\n try {\n const result = await getCommitDate(branchSha);\n setCachedUpdateDateResult(branchName, result);\n return result;\n } catch (err) {\n logger.debug({ err, branchName }, 'Error getting branch update date');\n return null;\n }\n}\n\nexport async function getCommitMessages(): Promise<string[]> {\n logger.debug('getCommitMessages');\n // v8 ignore else -- TODO: add test #40625\n if (GlobalConfig.get('platform') !== 'local') {\n await syncGit();\n }\n try {\n const res = await git.log({\n n: 20,\n format: { message: '%s' },\n '--no-merges': null,\n });\n return res.all.map((commit) => commit.message);\n } catch /* v8 ignore next -- TODO: add test #40625 */ {\n return [];\n }\n}\n\nexport async function checkoutBranch(\n branchName: string,\n): Promise<LongCommitSha> {\n logger.debug(`Setting current branch to ${branchName}`);\n await syncGit();\n try {\n await gitRetry(() =>\n git.checkout(\n submodulesInitizialized\n ? ['-f', '--recurse-submodules', branchName, '--']\n : ['-f', branchName, '--'],\n ),\n );\n config.currentBranch = branchName;\n config.currentBranchSha = toLongCommitSha(\n (await git.raw(['rev-parse', 'HEAD'])).trim(),\n );\n const latestCommitDate = await getCommitDate(config.currentBranchSha);\n // v8 ignore else -- TODO: add test #40625\n if (latestCommitDate) {\n logger.debug(\n { branchName, latestCommitDate, sha: config.currentBranchSha },\n 'latest commit',\n );\n }\n await git.reset(ResetMode.HARD);\n return config.currentBranchSha;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n if (err.message?.includes('fatal: ambiguous argument')) {\n logger.warn({ err }, 'Failed to checkout branch');\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n}\n\nexport async function checkoutBranchFromRemote(\n branchName: string,\n remoteName: string,\n): Promise<LongCommitSha> {\n logger.debug(`Checking out branch ${branchName} from remote ${remoteName}`);\n await syncGit();\n try {\n await gitRetry(() =>\n git.checkoutBranch(branchName, `${remoteName}/${branchName}`),\n );\n config.currentBranch = branchName;\n config.currentBranchSha = toLongCommitSha(\n (await git.revparse('HEAD')).trim(),\n );\n logger.debug(`Checked out branch ${branchName} from remote ${remoteName}`);\n config.branchCommits[branchName] = config.currentBranchSha;\n return config.currentBranchSha;\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n if (err.message?.includes('fatal: ambiguous argument')) {\n logger.warn({ err }, 'Failed to checkout branch');\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n}\n\nexport async function resetHardFromRemote(\n remoteAndBranch: string,\n): Promise<void> {\n try {\n const resetLog = await git.reset(['--hard', remoteAndBranch]);\n logger.debug({ resetLog }, 'git reset log');\n } catch (err) {\n logger.error({ err }, 'Error during git reset --hard');\n throw err;\n }\n}\n\nexport async function forcePushToRemote(\n branchName: string,\n remote: string,\n): Promise<void> {\n try {\n const pushLog = await git.push([remote, branchName, '--force']);\n logger.debug({ pushLog }, 'git push log');\n } catch (err) {\n logger.error({ err }, 'Error during git push --force');\n throw err;\n }\n}\n\nexport async function getFileList(): Promise<string[]> {\n await syncGit();\n const branch = config.currentBranch;\n let files: string;\n try {\n files = await git.raw(['ls-tree', '-r', `refs/heads/${branch}`]);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message?.includes('fatal: Not a valid object name')) {\n logger.debug(\n { err },\n 'Branch not found when checking branch list - aborting',\n );\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n }\n /* v8 ignore if -- TODO: add test #40625 */\n if (!files) {\n return [];\n }\n // submodules are starting with `160000 commit`\n return files\n .split(newlineRegex)\n .filter(isString)\n .filter((line) => line.startsWith('100'))\n .map((line) => line.split(regEx(/\\t/)).pop()!);\n}\n\nexport function getBranchList(): string[] {\n return Object.keys(config.branchCommits ?? {});\n}\n\nexport async function isBranchBehindBase(\n branchName: string,\n baseBranch: string,\n): Promise<boolean> {\n const baseBranchSha = getBranchCommit(baseBranch);\n const branchSha = getBranchCommit(branchName);\n let isBehind = getCachedBehindBaseResult(\n branchName,\n branchSha,\n baseBranch,\n baseBranchSha,\n );\n if (isBehind !== null) {\n logger.debug(`branch.isBehindBase(): using cached result \"${isBehind}\"`);\n return isBehind;\n }\n\n logger.debug(\n `branch.isBehindBase(): using git to calculate against baseBranch \"${baseBranch}\"`,\n );\n\n await syncGit();\n try {\n const behindCount = (\n await git.raw(['rev-list', '--count', `${branchSha!}..${baseBranchSha!}`])\n ).trim();\n isBehind = behindCount !== '0';\n logger.debug(\n { baseBranch, branchName },\n `branch.isBehindBase(): ${isBehind}`,\n );\n setCachedBehindBaseResult(branchName, isBehind);\n return isBehind;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n throw err;\n }\n}\n\nexport async function isBranchModified(\n branchName: string,\n baseBranch: string,\n): Promise<boolean> {\n if (!branchExists(branchName)) {\n logger.debug('branch.isModified(): no cache');\n return false;\n }\n // First check local config\n if (config.branchIsModified[branchName] !== undefined) {\n return config.branchIsModified[branchName];\n }\n // Second check repository cache\n const isModified = getCachedModifiedResult(\n branchName,\n getBranchCommit(branchName), // branch sha\n );\n if (isModified !== null) {\n logger.debug(`branch.isModified(): using cached result \"${isModified}\"`);\n config.branchIsModified[branchName] = isModified;\n return isModified;\n }\n\n logger.debug(\n `branch.isModified(): using git to calculate against baseBranch \"${baseBranch}\"`,\n );\n\n await syncGit();\n const committedAuthors = new Set<string>();\n try {\n const commits = await git.log([\n `origin/${baseBranch}..origin/${branchName}`,\n ]);\n\n for (const commit of commits.all) {\n committedAuthors.add(commit.author_email);\n }\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message?.includes('fatal: bad revision')) {\n logger.debug(\n { err },\n 'Remote branch not found when checking last commit author - aborting run',\n );\n throw new Error(REPOSITORY_CHANGED);\n }\n logger.warn({ err }, 'Error checking last author for isBranchModified');\n }\n const { gitAuthorEmail, ignoredAuthors } = config;\n\n const includedAuthors = new Set(committedAuthors);\n\n // v8 ignore else -- TODO: add test #40625\n if (gitAuthorEmail) {\n includedAuthors.delete(gitAuthorEmail);\n }\n\n for (const ignoredAuthor of ignoredAuthors) {\n includedAuthors.delete(ignoredAuthor);\n }\n\n if (includedAuthors.size === 0) {\n // authors all match - branch has not been modified\n logger.trace(\n {\n branchName,\n baseBranch,\n committedAuthors: [...committedAuthors],\n includedAuthors: [...includedAuthors],\n gitAuthorEmail,\n ignoredAuthors,\n },\n 'branch.isModified() = false',\n );\n logger.debug('branch.isModified() = false');\n config.branchIsModified[branchName] = false;\n setCachedModifiedResult(branchName, false);\n return false;\n }\n logger.trace(\n {\n branchName,\n baseBranch,\n committedAuthors: [...committedAuthors],\n includedAuthors: [...includedAuthors],\n gitAuthorEmail,\n ignoredAuthors,\n },\n 'branch.isModified() = true',\n );\n logger.debug(\n { baseBranch, branchName, unrecognizedAuthors: [...includedAuthors] },\n 'branch.isModified() = true',\n );\n config.branchIsModified[branchName] = true;\n setCachedModifiedResult(branchName, true);\n return true;\n}\n\nexport async function isBranchConflicted(\n baseBranch: string,\n branch: string,\n): Promise<boolean> {\n logger.debug(`isBranchConflicted(${baseBranch}, ${branch})`);\n\n const baseBranchSha = getBranchCommit(baseBranch);\n const branchSha = getBranchCommit(branch);\n if (!baseBranchSha || !branchSha) {\n logger.warn(\n { baseBranch, branch },\n 'isBranchConflicted: branch does not exist',\n );\n return true;\n }\n\n const isConflicted = getCachedConflictResult(\n branch,\n branchSha,\n baseBranch,\n baseBranchSha,\n );\n if (isBoolean(isConflicted)) {\n logger.debug(\n `branch.isConflicted(): using cached result \"${isConflicted}\"`,\n );\n return isConflicted;\n }\n\n logger.debug(\n `branch.isConflicted(): using git to calculate against baseBranch ${baseBranch}`,\n );\n\n let result = false;\n await syncGit();\n await writeGitAuthor();\n\n const origBranch = config.currentBranch;\n try {\n await git.reset(ResetMode.HARD);\n //TODO: see #18600\n if (origBranch !== baseBranch) {\n await git.checkout(baseBranch);\n }\n await git.merge(['--no-commit', '--no-ff', `origin/${branch}`]);\n } catch (err) {\n result = true;\n /* v8 ignore if -- TODO: add test #40625 */\n if (!err?.git?.conflicts?.length) {\n logger.debug(\n { baseBranch, branch, err },\n 'isBranchConflicted: unknown error',\n );\n }\n } finally {\n try {\n await git.merge(['--abort']);\n if (origBranch !== baseBranch) {\n await git.checkout(origBranch);\n }\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug(\n { baseBranch, branch, err },\n 'isBranchConflicted: cleanup error',\n );\n }\n }\n\n setCachedConflictResult(branch, result);\n logger.debug(`branch.isConflicted(): ${result}`);\n return result;\n}\n\nexport async function deleteBranch(\n branchName: string,\n options?: { localBranch?: boolean },\n): Promise<void> {\n await syncGit();\n if (!options?.localBranch) {\n try {\n const deleteCommand = ['push', '--delete', 'origin', branchName];\n\n if (getNoVerify().includes('push')) {\n deleteCommand.push('--no-verify');\n }\n\n await gitRetry(() => git.raw(deleteCommand));\n logger.debug(`Deleted remote branch: ${branchName}`);\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n logger.debug(`No remote branch to delete with name: ${branchName}`);\n }\n }\n try {\n await deleteLocalBranch(branchName);\n /* v8 ignore next -- TODO: add test #40625 (always throws) */\n logger.debug(`Deleted local branch: ${branchName}`);\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n logger.debug(`No local branch to delete with name: ${branchName}`);\n }\n delete config.branchCommits[branchName];\n}\n\nexport async function mergeToLocal(\n refSpecToMerge: string,\n options?: { localBranch?: boolean },\n): Promise<void> {\n let status: StatusResult | undefined;\n try {\n await syncGit();\n await writeGitAuthor();\n await git.reset(ResetMode.HARD);\n await gitRetry(() =>\n git.checkout([\n '-B',\n config.currentBranch,\n `origin/${config.currentBranch}`,\n ]),\n );\n status = await git.status();\n if (options?.localBranch) {\n await git.merge([refSpecToMerge]);\n } else {\n await fetchRevSpec(refSpecToMerge);\n await gitRetry(() => git.merge(['FETCH_HEAD']));\n }\n } catch (err) {\n logger.debug(\n {\n baseBranch: config.currentBranch,\n baseSha: config.currentBranchSha,\n refSpecToMerge,\n status,\n err,\n },\n 'mergeLocally error',\n );\n throw err;\n }\n}\n\nexport async function mergeBranch(branchName: string): Promise<void> {\n let status: StatusResult | undefined;\n try {\n await syncGit();\n await writeGitAuthor();\n await git.reset(ResetMode.HARD);\n await gitRetry(() =>\n git.checkout(['-B', branchName, `origin/${branchName}`]),\n );\n await gitRetry(() =>\n git.checkout([\n '-B',\n config.currentBranch,\n `origin/${config.currentBranch}`,\n ]),\n );\n status = await git.status();\n await gitRetry(() => git.merge(['--ff-only', branchName]));\n await gitRetry(() => git.push('origin', config.currentBranch));\n incLimitedValue('Commits');\n } catch (err) {\n logger.debug(\n {\n baseBranch: config.currentBranch,\n baseSha: config.currentBranchSha,\n branchName,\n branchSha: getBranchCommit(branchName),\n status,\n err,\n },\n 'mergeBranch error',\n );\n throw err;\n }\n}\n\nasync function getCommitDate(ref: LongCommitSha | string): Promise<DateTime> {\n const output = await git.show(['-s', '--format=%cI', ref]);\n return DateTime.fromISO(output.trim()).toUTC();\n}\n\nexport async function getBranchLastCommitTime(\n branchName: string,\n): Promise<Date> {\n await syncGit();\n try {\n const time = await getCommitDate(`origin/${branchName}`);\n return time.toJSDate();\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore next 3 -- TODO: add test */\n if (errChecked) {\n throw errChecked;\n }\n return new Date();\n }\n}\n\nexport function getBranchFiles(branchName: string): Promise<string[] | null> {\n return getBranchFilesFromRef(`origin/${branchName}`);\n}\n\nexport function getBranchFilesFromCommit(\n referenceCommit: LongCommitSha,\n): Promise<string[] | null> {\n return getBranchFilesFromRef(referenceCommit);\n}\n\nasync function getBranchFilesFromRef(\n refName: string,\n): Promise<string[] | null> {\n await syncGit();\n try {\n const diff = await gitRetry(() =>\n git.diffSummary([refName, `${refName}^`]),\n );\n return diff.files.map((file) => file.file);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'getBranchFilesFromRef error');\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n return null;\n }\n}\n\nexport async function getFile(\n filePath: string,\n branchName?: string,\n): Promise<string | null> {\n await syncGit();\n try {\n const content = await git.show([\n `origin/${branchName ?? config.currentBranch}:${filePath}`,\n ]);\n\n logWarningIfUnicodeHiddenCharactersInPackageFile(filePath, content);\n\n return content;\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n return null;\n }\n}\n\nexport async function getFiles(\n fileNames: string[],\n): Promise<Record<string, string | null>> {\n const fileContentMap: Record<string, string | null> = {};\n\n for (const fileName of fileNames) {\n fileContentMap[fileName] = await getFile(fileName);\n }\n\n return fileContentMap;\n}\n\nexport async function hasDiff(\n sourceRef: string,\n targetRef: string,\n): Promise<boolean> {\n await syncGit();\n try {\n return (\n (await gitRetry(() => git.diff([sourceRef, targetRef, '--']))) !== ''\n );\n } catch {\n return true;\n }\n}\n\nasync function handleCommitAuth(localDir: string): Promise<void> {\n if (!privateKeySet) {\n await writePrivateKey();\n privateKeySet = true;\n }\n await configSigningKey(localDir);\n await writeGitAuthor();\n}\n\n/**\n *\n * Prepare local branch with commit\n *\n * 0. Hard reset\n * 1. Creates local branch with `origin/` prefix\n * 2. Perform `git add` (respecting mode) and `git remove` for each file\n * 3. Perform commit\n * 4. Check whether resulting commit is empty or not (due to .gitignore)\n * 5. If not empty, return commit info for further processing\n *\n */\nexport async function prepareCommit({\n branchName,\n files,\n message,\n force = false,\n}: CommitFilesConfig): Promise<CommitResult | null> {\n const localDir = GlobalConfig.get('localDir');\n await syncGit();\n logger.debug(`Preparing files for committing to branch ${branchName}`);\n await handleCommitAuth(localDir);\n try {\n await git.reset(ResetMode.HARD);\n await git.raw(['clean', '-fd']);\n const parentCommitSha = config.currentBranchSha;\n await gitRetry(() =>\n git.checkout(['-B', branchName, `origin/${config.currentBranch}`]),\n );\n const deletedFiles: string[] = [];\n const addedModifiedFiles: string[] = [];\n const ignoredFiles: string[] = [];\n for (const file of files) {\n const fileName = file.path;\n if (file.type === 'deletion') {\n try {\n await git.rm([fileName]);\n deletedFiles.push(fileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n logger.trace({ err, fileName }, 'Cannot delete file');\n ignoredFiles.push(fileName);\n }\n } else {\n if (await isDirectory(upath.join(localDir, fileName))) {\n // This is usually a git submodule update\n logger.trace({ fileName }, 'Adding directory commit');\n } else if (file.contents === null) {\n continue;\n } else {\n let contents: Buffer;\n /* v8 ignore else -- TODO: add test #40625 */\n if (typeof file.contents === 'string') {\n contents = Buffer.from(file.contents);\n } else {\n contents = file.contents;\n }\n // some file systems including Windows don't support the mode\n // so the index should be manually updated after adding the file\n if (file.isSymlink) {\n await fs.symlink(file.contents, upath.join(localDir, fileName));\n } else {\n await fs.outputFile(upath.join(localDir, fileName), contents, {\n mode: file.isExecutable ? 0o777 : 0o666,\n });\n }\n }\n try {\n /* v8 ignore next -- TODO: add test #40625 */\n const addParams =\n fileName === getConfigFileNames()[0] ? ['-f', fileName] : fileName;\n await git.add(addParams);\n if (file.isExecutable) {\n await git.raw(['update-index', '--chmod=+x', fileName]);\n }\n addedModifiedFiles.push(fileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (\n !err.message.includes(\n 'The following paths are ignored by one of your .gitignore files',\n )\n ) {\n throw err;\n }\n logger.debug(`Cannot commit ignored file: ${fileName}`);\n ignoredFiles.push(file.path);\n }\n }\n }\n\n const commitOptions: Options = {};\n if (getNoVerify().includes('commit')) {\n commitOptions['--no-verify'] = null;\n }\n\n const commitRes = await git.commit(message, [], commitOptions);\n if (\n isNonEmptyObject(commitRes.summary) &&\n commitRes.summary.changes === 0 &&\n commitRes.summary.insertions === 0 &&\n commitRes.summary.deletions === 0\n ) {\n logger.warn({ commitRes }, 'Detected empty commit - aborting git push');\n return null;\n }\n logger.debug(\n { deletedFiles, ignoredFiles, result: commitRes },\n `git commit`,\n );\n if (!force && !(await hasDiff('HEAD', `origin/${branchName}`))) {\n logger.debug(\n { branchName, deletedFiles, addedModifiedFiles, ignoredFiles },\n 'No file changes detected. Skipping commit',\n );\n return null;\n }\n\n const commitSha = toLongCommitSha(\n (await git.revparse([branchName])).trim(),\n );\n const result: CommitResult = {\n parentCommitSha,\n commitSha,\n files: files.filter((fileChange) => {\n if (fileChange.type === 'deletion') {\n return deletedFiles.includes(fileChange.path);\n }\n return addedModifiedFiles.includes(fileChange.path);\n }),\n };\n\n return result;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n return handleCommitError(err, branchName, files);\n }\n}\n\nexport async function pushCommit({\n sourceRef,\n targetRef,\n files,\n pushOptions,\n}: PushFilesConfig): Promise<boolean> {\n await syncGit();\n logger.debug(`Pushing refSpec ${sourceRef}:${targetRef ?? sourceRef}`);\n let result = false;\n try {\n const gitOptions: TaskOptions = {\n '--force-with-lease': null,\n '-u': null,\n };\n if (getNoVerify().includes('push')) {\n gitOptions['--no-verify'] = null;\n }\n if (pushOptions) {\n gitOptions['--push-option'] = pushOptions;\n }\n\n const pushRes = await gitRetry(() =>\n git.push('origin', `${sourceRef}:${targetRef ?? sourceRef}`, gitOptions),\n );\n delete pushRes.repo;\n logger.debug({ result: pushRes }, 'git push');\n incLimitedValue('Commits');\n incCountValue('HourlyCommits');\n result = true;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n handleCommitError(err, sourceRef, files);\n }\n return result;\n}\n\nexport async function fetchBranch(\n branchName: string,\n): Promise<LongCommitSha | null> {\n await syncGit();\n logger.debug(`Fetching branch ${branchName}`);\n try {\n const ref = `refs/heads/${branchName}:refs/remotes/origin/${branchName}`;\n await gitRetry(() => git.pull(['origin', ref, '--force']));\n const commit = toLongCommitSha((await git.revparse([branchName])).trim());\n config.branchCommits[branchName] = commit;\n config.branchIsModified[branchName] = false;\n return commit;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n return handleCommitError(err, branchName);\n }\n}\n\nexport async function commitFiles(\n commitConfig: CommitFilesConfig,\n): Promise<LongCommitSha | null> {\n try {\n const commitResult = await prepareCommit(commitConfig);\n if (commitResult) {\n const pushResult = await pushCommit({\n sourceRef: commitConfig.branchName,\n files: commitConfig.files,\n });\n // v8 ignore else -- TODO: add test #40625\n if (pushResult) {\n const { branchName } = commitConfig;\n const { commitSha } = commitResult;\n config.branchCommits[branchName] = commitSha;\n config.branchIsModified[branchName] = false;\n return commitSha;\n }\n }\n return null;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message.includes('[rejected] (stale info)')) {\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n }\n}\n\nexport function getUrl({\n protocol,\n auth,\n hostname,\n host,\n repository,\n}: {\n protocol?: GitProtocol;\n auth?: string;\n hostname?: string;\n host?: string;\n repository: string;\n}): string {\n if (protocol === 'ssh') {\n // TODO: types (#22198)\n return `git@${hostname!}:${repository}.git`;\n }\n return URL.format({\n protocol: protocol ?? 'https',\n auth,\n hostname,\n host,\n pathname: `${repository}.git`,\n });\n}\n\nlet remoteRefsExist = false;\n\n/**\n *\n * Non-branch refs allow us to store git objects without triggering CI pipelines.\n * It's useful for API-based branch rebasing.\n *\n * @see https://stackoverflow.com/questions/63866947/pushing-git-non-branch-references-to-a-remote/63868286\n *\n */\nexport async function pushCommitToRenovateRef(\n commitSha: string,\n refName: string,\n): Promise<void> {\n const fullRefName = `refs/renovate/branches/${refName}`;\n await git.raw(['update-ref', fullRefName, commitSha]);\n await git.push(['--force', 'origin', fullRefName]);\n remoteRefsExist = true;\n}\n\n/**\n *\n * Removes all remote \"refs/renovate/branches/*\" refs in two steps:\n *\n * Step 1: list refs\n *\n * $ git ls-remote origin \"refs/renovate/branches/*\"\n *\n * > cca38e9ea6d10946bdb2d0ca5a52c205783897aa refs/renovate/branches/foo\n * > 29ac154936c880068994e17eb7f12da7fdca70e5 refs/renovate/branches/bar\n * > 3fafaddc339894b6d4f97595940fd91af71d0355 refs/renovate/branches/baz\n * > ...\n *\n * Step 2:\n *\n * $ git push --delete origin refs/renovate/branches/foo refs/renovate/branches/bar refs/renovate/branches/baz\n *\n * If Step 2 fails because the repo doesn't allow bulk changes, we'll remove them one by one instead:\n *\n * $ git push --delete origin refs/renovate/branches/foo\n * $ git push --delete origin refs/renovate/branches/bar\n * $ git push --delete origin refs/renovate/branches/baz\n */\nexport async function clearRenovateRefs(): Promise<void> {\n if (!gitInitialized || !remoteRefsExist) {\n return;\n }\n\n logger.debug(`Cleaning up Renovate refs: refs/renovate/branches/*`);\n const renovateRefs: string[] = [];\n\n try {\n const rawOutput = await git.listRemote([\n config.url,\n 'refs/renovate/branches/*',\n ]);\n const refs = rawOutput\n .split(newlineRegex)\n .map((line) => line.replace(regEx(/[0-9a-f]+\\s+/i), '').trim())\n .filter((line) => line.startsWith('refs/renovate/branches/'));\n renovateRefs.push(...refs);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, `Renovate refs cleanup error`);\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (renovateRefs.length) {\n try {\n const pushOpts = ['--delete', 'origin', ...renovateRefs];\n await git.push(pushOpts);\n } catch (err) {\n /* v8 ignore else -- TODO: add test #40625 */\n if (bulkChangesDisallowed(err)) {\n for (const ref of renovateRefs) {\n try {\n const pushOpts = ['--delete', 'origin', ref];\n await git.push(pushOpts);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug({ err }, 'Error deleting \"refs/renovate/branches/*\"');\n break;\n }\n }\n } else {\n logger.warn({ err }, 'Error deleting \"refs/renovate/branches/*\"');\n }\n }\n }\n\n remoteRefsExist = false;\n}\n\nconst diffTreeLineRegex = regEx(\n /^:(?<oldMode>\\d{6})\\s+(?<newMode>\\d{6})\\s+(?<oldSha>[0-9a-f]{40})\\s+(?<newSha>[0-9a-f]{40})\\s+(?<status>[A-Z]\\d*)\\t(?<paths>.+)$/,\n);\n\nconst treeShaRegex = regEx(/tree\\s+(?<treeSha>[0-9a-f]{40})\\s*/);\n\n/**\n * Get the tree SHA for a commit.\n */\nexport async function getCommitTreeSha(\n commitSha: LongCommitSha,\n): Promise<LongCommitSha> {\n const commitOutput = await git.catFile(['-p', commitSha]);\n const { treeSha } = treeShaRegex.exec(commitOutput)?.groups ?? {};\n if (!treeSha) {\n const snippet = commitOutput.split(newlineRegex)[0];\n /* v8 ignore next -- tested, but v8 reports template literal as partial */\n throw new Error(\n `Could not extract tree SHA from commit ${commitSha}: ${snippet}`,\n );\n }\n return toLongCommitSha(treeSha);\n}\n\nfunction treeTypeFromMode(mode: string): GitObjectType {\n switch (mode) {\n case GitTreeMode.Gitlink:\n return 'commit';\n case GitTreeMode.Directory:\n return 'tree';\n default:\n return 'blob';\n }\n}\n\n/**\n * Return only the files that changed between two commits.\n * Deletions have `sha: null` (for use with GitHub's `base_tree` API).\n */\nexport async function diffCommitTree(\n parentCommitSha: LongCommitSha,\n commitSha: LongCommitSha,\n): Promise<DiffTreeItem[]> {\n const output = await git.raw([\n 'diff-tree',\n '-M',\n '-r',\n '--no-commit-id',\n parentCommitSha,\n commitSha,\n ]);\n const result: DiffTreeItem[] = [];\n for (const line of output.split(newlineRegex)) {\n const matchGroups = diffTreeLineRegex.exec(line)?.groups;\n if (matchGroups) {\n const { oldMode, newMode, newSha, status, paths } = matchGroups;\n const statusCode = status[0];\n // R has two tab-separated paths (old\\tnew); A/M/D/T have one.\n // C also has two paths but falls through to default (only the target matters).\n const [sourcePath, targetPath] = paths.split('\\t');\n switch (statusCode) {\n case 'D':\n result.push({\n path: sourcePath,\n mode: oldMode,\n type: treeTypeFromMode(oldMode),\n sha: null,\n });\n break;\n case 'R':\n // Rename: delete source, add target\n result.push({\n path: sourcePath,\n mode: oldMode,\n type: treeTypeFromMode(oldMode),\n sha: null,\n });\n result.push({\n path: targetPath,\n mode: newMode,\n type: treeTypeFromMode(newMode),\n sha: toLongCommitSha(newSha),\n });\n break;\n default:\n // A (add), M (modify), T (type change), C (copy)\n result.push({\n path: targetPath ?? sourcePath,\n mode: newMode,\n type: treeTypeFromMode(newMode),\n sha: toLongCommitSha(newSha),\n });\n break;\n }\n }\n }\n return result;\n}\n\nasync function localBranchExists(branchName: string): Promise<boolean> {\n await syncGit();\n const localBranches = await git.branchLocal();\n return localBranches.all.includes(branchName);\n}\n\n/**\n * Synchronize a forked branch with its upstream counterpart.\n *\n * syncForkWithUpstream updates the fork's branch, to match the corresponding branch in the upstream repository.\n * The steps are:\n * 1. Check if the branch exists locally.\n * 2. If the branch exists locally: checkout the local branch.\n * 3. If the branch does _not_ exist locally: checkout the upstream branch.\n * 4. Reset the local branch to match the upstream branch.\n * 5. Force push the (updated) local branch to the origin repository.\n *\n * @param {string} branchName - The name of the branch to synchronize.\n * @returns A promise that resolves to True if the synchronization is successful, or `false` if an error occurs.\n */\nexport async function syncForkWithUpstream(branchName: string): Promise<void> {\n if (!config.upstreamUrl) {\n return;\n }\n logger.debug(\n `Synchronizing fork with \"${RENOVATE_FORK_UPSTREAM}\" remote for branch ${branchName}`,\n );\n const remotes = await getRemotes();\n /* v8 ignore if -- this should not be possible if upstreamUrl exists */\n if (!remotes.some((r) => r === RENOVATE_FORK_UPSTREAM)) {\n throw new Error('No upstream remote exists, cannot sync fork');\n }\n try {\n await git.fetch([RENOVATE_FORK_UPSTREAM]);\n if (await localBranchExists(branchName)) {\n await checkoutBranch(branchName);\n } else {\n await checkoutBranchFromRemote(branchName, RENOVATE_FORK_UPSTREAM);\n }\n await resetHardFromRemote(`${RENOVATE_FORK_UPSTREAM}/${branchName}`);\n await forcePushToRemote(branchName, 'origin');\n } catch (err) /* v8 ignore next -- shouldn't happen */ {\n logger.error({ err }, 'Error synchronizing fork');\n throw new Error(UNKNOWN_ERROR);\n }\n}\n\nexport async function getRemotes(): Promise<string[]> {\n logger.debug('git.getRemotes()');\n try {\n await syncGit();\n const remotes = await git.getRemotes();\n logger.debug(`Found remotes: ${remotes.map((r) => r.name).join(', ')}`);\n return remotes.map((remote) => remote.name);\n } catch (err) /* v8 ignore next */ {\n logger.error({ err }, 'Error getting remotes');\n throw err;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../lib/util/git/types.ts"],"sourcesContent":["import type { PlatformCommitOptions } from '../../config/types.ts';\nimport type { GitOptions } from '../../types/git.ts';\nimport type { LongCommitSha } from '../schema-utils/git.ts';\nimport type { EmailAddress } from '../schema-utils/index.ts';\n\nexport type { DiffResult, StatusResult } from 'simple-git';\n\nexport interface GitAuthor {\n name?: string | null;\n address?: string;\n}\n\nexport type GitNoVerifyOption = 'commit' | 'push';\n\nexport interface StorageConfig {\n currentBranch?: string;\n defaultBranch?: string;\n url: string;\n upstreamUrl?: string | undefined;\n extraCloneOpts?: GitOptions;\n cloneSubmodules?: boolean;\n cloneSubmodulesFilter?: string[];\n fullClone?: boolean;\n}\n\nexport interface LocalConfig extends StorageConfig {\n additionalBranches: string[];\n currentBranch: string;\n currentBranchSha: LongCommitSha;\n branchCommits: Record<string, LongCommitSha>;\n branchIsModified: Record<string, boolean>;\n commitBranches: Record<string, string[]>;\n ignoredAuthors: string[];\n gitAuthorName?: string | null;\n gitAuthorEmail?: EmailAddress;\n\n writeGitDone?: boolean;\n}\n\nexport interface FileAddition {\n /**\n * Addition creates new file or modifies existing one\n */\n type: 'addition';\n\n /**\n * Relative file path\n */\n path: string;\n\n /**\n * File contents\n */\n contents: string | Buffer | null;\n\n /**\n * The executable bit\n */\n isExecutable?: boolean;\n\n isSymlink?: boolean;\n}\n\nexport interface FileDeletion {\n /**\n * Deletion removes the file\n */\n type: 'deletion';\n\n /**\n * Relative file path\n */\n path: string;\n}\n\nexport type FileChange = FileAddition | FileDeletion;\n\nexport interface CommitFilesConfig {\n baseBranch?: string;\n branchName: string;\n files: FileChange[];\n message: string | string[];\n force?: boolean;\n platformCommit?: PlatformCommitOptions;\n /** Only needed by Gerrit platform */\n prTitle?: string;\n /** Only needed by Gerrit platform */\n autoApprove?: boolean;\n}\n\nexport interface PushFilesConfig {\n sourceRef: string;\n targetRef?: string;\n files: FileChange[];\n pushOptions?: string[];\n}\n\nexport type BranchName = string;\n\nexport interface CommitResult {\n parentCommitSha: LongCommitSha;\n commitSha: LongCommitSha;\n files: FileChange[];\n}\n\nexport type GitObjectType = 'blob' | 'tree' | 'commit';\n\n/**\n * Git tree entry modes (octal file-type representations).\n * @see https://git-scm.com/docs/gitdatamodel\n */\nexport const GitTreeMode = {\n /** Regular non-executable file */\n RegularFile: '100644',\n /** Regular executable file */\n ExecutableFile: '100755',\n /** Symbolic link */\n SymbolicLink: '120000',\n /** Directory / subtree */\n Directory: '040000',\n /** Gitlink (submodule) */\n Gitlink: '160000',\n} as const;\n\nexport interface DiffTreeItem {\n path: string;\n mode: string;\n type: GitObjectType;\n sha: LongCommitSha | null;\n}\n\n/**\n * Represents a git authentication rule in the form of e.g.:\n * git config --global url.\"https://api@github.com/\".insteadOf \"https://github.com/\"\n */\nexport interface AuthenticationRule {\n url: string;\n insteadOf: string;\n}\n\nexport type GitOperationType =\n /**\n * The `git clone` sub-command.\n */\n | 'clone'\n /**\n * The `git reset` sub-command.\n */\n | 'reset'\n /**\n * The `git checkout` sub-command.\n */\n | 'checkout'\n /**\n * The `git fetch` sub-command.\n */\n | 'fetch'\n /**\n * The `git pull` sub-command.\n */\n | 'pull'\n /**\n * The `git push` sub-command.\n */\n | 'push'\n /**\n * The `git clean` sub-command.\n */\n | 'clean'\n /**\n * The `git merge` sub-command.\n */\n | 'merge'\n /**\n * The `git submodule` sub-command.\n */\n | 'submodule'\n /**\n * The `git commit` sub-command.\n */\n | 'commit'\n /**\n * The `git branch` sub-command.\n */\n | 'branch'\n /**\n * Any internal \"plumbing\" commands\n *\n * - `git update-index`\n *\n * See also: https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain\n */\n | 'plumbing'\n /**\n * Any other operations i.e.\n *\n * - `git add`\n * - `git branch`\n * - `git config`\n * - `git diff`\n * - `git log`\n * - `git ls-remote`\n * - `git remote`\n * - `git rev-parse`\n * - `git status`\n *\n * See also: https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain\n */\n | 'other';\n"],"mappings":";;;;;AA+GA,MAAa,cAAc;;CAEzB,aAAa;;CAEb,gBAAgB;;CAEhB,cAAc;;CAEd,WAAW;;CAEX,SAAS;AACX"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../lib/util/git/types.ts"],"sourcesContent":["import type { PlatformCommitOptions } from '../../config/types.ts';\nimport type { GitOptions } from '../../types/git.ts';\nimport type { LongCommitSha } from '../schema-utils/git.ts';\nimport type { EmailAddress } from '../schema-utils/index.ts';\n\nexport type { DiffResult, StatusResult } from 'simple-git';\n\nexport interface GitAuthor {\n name?: string | null;\n address?: string;\n}\n\nexport type GitNoVerifyOption = 'commit' | 'push';\n\nexport interface StorageConfig {\n currentBranch?: string;\n defaultBranch?: string;\n url: string;\n upstreamUrl?: string | undefined;\n extraCloneOpts?: GitOptions;\n cloneSubmodules?: boolean;\n cloneSubmodulesFilter?: string[];\n fullClone?: boolean;\n}\n\nexport interface LocalConfig extends StorageConfig {\n additionalBranches: string[];\n currentBranch: string;\n currentBranchSha: LongCommitSha;\n branchCommits: Record<string, LongCommitSha>;\n branchIsModified: Record<string, boolean>;\n commitBranches: Record<string, string[]>;\n ignoredAuthors: string[];\n gitAuthorName?: string | null;\n gitAuthorEmail?: EmailAddress;\n fileModeEnabled?: boolean;\n\n writeGitDone?: boolean;\n}\n\nexport interface FileAddition {\n /**\n * Addition creates new file or modifies existing one\n */\n type: 'addition';\n\n /**\n * Relative file path\n */\n path: string;\n\n /**\n * File contents\n */\n contents: string | Buffer | null;\n\n /**\n * The executable bit\n */\n isExecutable?: boolean;\n\n isSymlink?: boolean;\n}\n\nexport interface FileDeletion {\n /**\n * Deletion removes the file\n */\n type: 'deletion';\n\n /**\n * Relative file path\n */\n path: string;\n}\n\nexport type FileChange = FileAddition | FileDeletion;\n\nexport interface CommitFilesConfig {\n baseBranch?: string;\n branchName: string;\n files: FileChange[];\n message: string | string[];\n force?: boolean;\n platformCommit?: PlatformCommitOptions;\n /** Only needed by Gerrit platform */\n prTitle?: string;\n /** Only needed by Gerrit platform */\n autoApprove?: boolean;\n}\n\nexport interface PushFilesConfig {\n sourceRef: string;\n targetRef?: string;\n files: FileChange[];\n pushOptions?: string[];\n}\n\nexport type BranchName = string;\n\nexport interface CommitResult {\n parentCommitSha: LongCommitSha;\n commitSha: LongCommitSha;\n files: FileChange[];\n}\n\nexport type GitObjectType = 'blob' | 'tree' | 'commit';\n\n/**\n * Git tree entry modes (octal file-type representations).\n * @see https://git-scm.com/docs/gitdatamodel\n */\nexport const GitTreeMode = {\n /** Regular non-executable file */\n RegularFile: '100644',\n /** Regular executable file */\n ExecutableFile: '100755',\n /** Symbolic link */\n SymbolicLink: '120000',\n /** Directory / subtree */\n Directory: '040000',\n /** Gitlink (submodule) */\n Gitlink: '160000',\n} as const;\n\nexport interface DiffTreeItem {\n path: string;\n mode: string;\n type: GitObjectType;\n sha: LongCommitSha | null;\n}\n\n/**\n * Represents a git authentication rule in the form of e.g.:\n * git config --global url.\"https://api@github.com/\".insteadOf \"https://github.com/\"\n */\nexport interface AuthenticationRule {\n url: string;\n insteadOf: string;\n}\n\nexport type GitOperationType =\n /**\n * The `git clone` sub-command.\n */\n | 'clone'\n /**\n * The `git reset` sub-command.\n */\n | 'reset'\n /**\n * The `git checkout` sub-command.\n */\n | 'checkout'\n /**\n * The `git fetch` sub-command.\n */\n | 'fetch'\n /**\n * The `git pull` sub-command.\n */\n | 'pull'\n /**\n * The `git push` sub-command.\n */\n | 'push'\n /**\n * The `git clean` sub-command.\n */\n | 'clean'\n /**\n * The `git merge` sub-command.\n */\n | 'merge'\n /**\n * The `git submodule` sub-command.\n */\n | 'submodule'\n /**\n * The `git commit` sub-command.\n */\n | 'commit'\n /**\n * The `git branch` sub-command.\n */\n | 'branch'\n /**\n * Any internal \"plumbing\" commands\n *\n * - `git update-index`\n *\n * See also: https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain\n */\n | 'plumbing'\n /**\n * Any other operations i.e.\n *\n * - `git add`\n * - `git branch`\n * - `git config`\n * - `git diff`\n * - `git log`\n * - `git ls-remote`\n * - `git remote`\n * - `git rev-parse`\n * - `git status`\n *\n * See also: https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain\n */\n | 'other';\n"],"mappings":";;;;;AAgHA,MAAa,cAAc;;CAEzB,aAAa;;CAEb,gBAAgB;;CAEhB,cAAc;;CAEd,WAAW;;CAEX,SAAS;AACX"}
@@ -7,15 +7,22 @@ import { mergeChildConfig } from "../../../../config/utils.js";
7
7
  import { coerceArray } from "../../../../util/array.js";
8
8
  import { compile } from "../../../../util/template/index.js";
9
9
  import { isConstraintName, isToolName } from "../../../../util/exec/types.js";
10
- import { ensureLocalDir, localPathIsFile, outputCacheFile, privateCacheDir, readLocalFile, writeLocalFile } from "../../../../util/fs/index.js";
10
+ import { ensureLocalDir, localPathIsFile, outputCacheFile, privateCacheDir, readLocalFile, statLocalFile, writeLocalFile } from "../../../../util/fs/index.js";
11
11
  import { getGitEnvironmentVariables } from "../../../../util/git/auth.js";
12
12
  import { exec } from "../../../../util/exec/index.js";
13
- import { getRepoStatus } from "../../../../util/git/index.js";
13
+ import { getRepoStatus, isFileModeEnabled } from "../../../../util/git/index.js";
14
14
  import "../../../../config/index.js";
15
15
  import { isArray, isNonEmptyArray } from "@sindresorhus/is";
16
16
  import crypto from "node:crypto";
17
17
  import upath from "upath";
18
18
  //#region lib/workers/repository/update/branch/execute-post-upgrade-commands.ts
19
+ const ownerExecutePermission = 64;
20
+ async function detectExecutable(relativePath, canReadFileMode) {
21
+ if (!canReadFileMode) return;
22
+ const fileStats = await statLocalFile(relativePath);
23
+ if (!fileStats || (fileStats.mode & ownerExecutePermission) === 0) return;
24
+ return true;
25
+ }
19
26
  async function postUpgradeCommandsExecutor(filteredUpgradeCommands, config) {
20
27
  let updatedArtifacts = [...config.updatedArtifacts ?? []];
21
28
  const artifactErrors = [...config.artifactErrors ?? []];
@@ -148,6 +155,7 @@ async function postUpgradeCommandsExecutor(filteredUpgradeCommands, config) {
148
155
  logger.debug(`Checking ${addedOrModifiedFiles.length} added or modified files for post-upgrade changes`);
149
156
  const fileExcludes = [];
150
157
  if (config.npmrc) fileExcludes.push(".npmrc");
158
+ const canReadFileMode = await isFileModeEnabled();
151
159
  for (const relativePath of addedOrModifiedFiles) {
152
160
  if (fileExcludes.some((pattern) => minimatch(pattern, { dot: true }).match(relativePath))) continue;
153
161
  let fileMatched = false;
@@ -158,13 +166,20 @@ async function postUpgradeCommandsExecutor(filteredUpgradeCommands, config) {
158
166
  pattern
159
167
  }, "Post-upgrade file saved");
160
168
  const existingContent = await readLocalFile(relativePath);
169
+ const isExecutable = await detectExecutable(relativePath, canReadFileMode);
161
170
  const existingUpdatedArtifacts = updatedArtifacts.find((ua) => ua.path === relativePath);
162
- if (existingUpdatedArtifacts?.type === "addition") existingUpdatedArtifacts.contents = existingContent;
163
- else updatedArtifacts.push({
164
- type: "addition",
165
- path: relativePath,
166
- contents: existingContent
167
- });
171
+ if (existingUpdatedArtifacts?.type === "addition") {
172
+ existingUpdatedArtifacts.contents = existingContent;
173
+ if (isExecutable !== void 0) existingUpdatedArtifacts.isExecutable = isExecutable;
174
+ } else {
175
+ const updatedArtifact = {
176
+ type: "addition",
177
+ path: relativePath,
178
+ contents: existingContent
179
+ };
180
+ if (isExecutable !== void 0) updatedArtifact.isExecutable = isExecutable;
181
+ updatedArtifacts.push(updatedArtifact);
182
+ }
168
183
  updatedArtifacts = updatedArtifacts.filter((ua) => !(ua.type === "deletion" && ua.path === relativePath));
169
184
  }
170
185
  if (!fileMatched) logger.debug({ file: relativePath }, "Post-upgrade file did not match any file filters");
@@ -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 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"}
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 statLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { getGitEnvironmentVariables } from '../../../../util/git/auth.ts';\nimport {\n getRepoStatus,\n isFileModeEnabled,\n} 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\nconst ownerExecutePermission = 0o100;\n\nasync function detectExecutable(\n relativePath: string,\n canReadFileMode: boolean,\n): Promise<true | undefined> {\n if (!canReadFileMode) {\n return undefined;\n }\n\n const fileStats = await statLocalFile(relativePath);\n if (!fileStats || (fileStats.mode & ownerExecutePermission) === 0) {\n return undefined;\n }\n\n // Git derives its executable flag from the owner's execute permission.\n return true;\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 const canReadFileMode = await isFileModeEnabled();\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 isExecutable = await detectExecutable(\n relativePath,\n canReadFileMode,\n );\n const existingUpdatedArtifacts = updatedArtifacts.find(\n (ua) => ua.path === relativePath,\n );\n if (existingUpdatedArtifacts?.type === 'addition') {\n existingUpdatedArtifacts.contents = existingContent;\n if (isExecutable !== undefined) {\n existingUpdatedArtifacts.isExecutable = isExecutable;\n }\n } else {\n const updatedArtifact: FileChange = {\n type: 'addition',\n path: relativePath,\n contents: existingContent,\n };\n if (isExecutable !== undefined) {\n updatedArtifact.isExecutable = isExecutable;\n }\n updatedArtifacts.push(updatedArtifact);\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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "43.265.5",
4
+ "version": "43.267.0",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 43.265.5 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 43.267.0 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "43.265.5",
5
+ "x-renovate-version": "43.267.0",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {