renovate 43.120.2 → 43.121.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/modules/datasource/terraform-provider/index.js +14 -20
- package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
- package/dist/modules/datasource/terraform-provider/schema.js +26 -0
- package/dist/modules/datasource/terraform-provider/schema.js.map +1 -0
- package/dist/modules/manager/ant/extract.js +42 -0
- package/dist/modules/manager/ant/extract.js.map +1 -1
- package/dist/modules/manager/ant/update.js +7 -1
- package/dist/modules/manager/ant/update.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +1 -1
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/platform/github/schema.d.ts +2 -2
- package/dist/util/cache/package/impl/file.js +0 -2
- package/dist/util/cache/package/impl/file.js.map +1 -1
- package/dist/util/cache/package/impl/redis.js +0 -2
- package/dist/util/cache/package/impl/redis.js.map +1 -1
- package/dist/util/git/index.js +3 -1
- package/dist/util/git/index.js.map +1 -1
- package/dist/workers/repository/update/pr/index.js +2 -2
- package/dist/workers/repository/update/pr/index.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { regEx } from "../../../util/regex.js";
|
|
2
2
|
import { logger } from "../../../logger/index.js";
|
|
3
|
-
import { joinUrlParts } from "../../../util/url.js";
|
|
3
|
+
import { getQueryString, joinUrlParts } from "../../../util/url.js";
|
|
4
4
|
import { ExternalHostError } from "../../../types/errors/external-host-error.js";
|
|
5
5
|
import { withCache } from "../../../util/cache/package/with-cache.js";
|
|
6
|
-
import { asTimestamp } from "../../../util/timestamp.js";
|
|
7
6
|
import { map } from "../../../util/promises.js";
|
|
8
7
|
import { id } from "../../versioning/hashicorp/index.js";
|
|
9
8
|
import { TerraformDatasource } from "../terraform-module/base.js";
|
|
10
9
|
import { createSDBackendURL } from "../terraform-module/utils.js";
|
|
10
|
+
import { TerraformProviderV2Response } from "./schema.js";
|
|
11
11
|
//#region lib/modules/datasource/terraform-provider/index.ts
|
|
12
12
|
var TerraformProviderDatasource = class TerraformProviderDatasource extends TerraformDatasource {
|
|
13
13
|
static id = "terraform-provider";
|
|
@@ -22,18 +22,14 @@ var TerraformProviderDatasource = class TerraformProviderDatasource extends Terr
|
|
|
22
22
|
defaultVersioning = id;
|
|
23
23
|
registryStrategy = "hunt";
|
|
24
24
|
releaseTimestampSupport = true;
|
|
25
|
-
releaseTimestampNote = "The release timestamp is
|
|
25
|
+
releaseTimestampNote = "The release timestamp is determined from the `published-at` field in the Terraform Registry v2 API response and is only available for `https://registry.terraform.io`.";
|
|
26
26
|
sourceUrlSupport = "package";
|
|
27
27
|
sourceUrlNote = "The source URL is determined from the the `source` field in the results.";
|
|
28
28
|
async _getReleases({ packageName, registryUrl }) {
|
|
29
29
|
/* v8 ignore next 3 -- should never happen */
|
|
30
30
|
if (!registryUrl) return null;
|
|
31
31
|
logger.trace(`terraform-provider.getDependencies() packageName: ${packageName}`);
|
|
32
|
-
if (registryUrl === TerraformProviderDatasource.terraformRegistryUrl)
|
|
33
|
-
const repository = TerraformProviderDatasource.getRepository({ packageName });
|
|
34
|
-
const serviceDiscovery = await this.getTerraformServiceDiscoveryResult(registryUrl);
|
|
35
|
-
return await this.queryTerraformRegistry(serviceDiscovery, registryUrl, repository);
|
|
36
|
-
}
|
|
32
|
+
if (registryUrl === TerraformProviderDatasource.terraformRegistryUrl) return await this.queryTerraformRegistryV2(registryUrl, packageName);
|
|
37
33
|
if (registryUrl === TerraformProviderDatasource.hashicorpReleaseUrl) return await this.queryReleaseBackend(packageName, registryUrl);
|
|
38
34
|
return await this.queryProviderRegistry(registryUrl, packageName);
|
|
39
35
|
}
|
|
@@ -50,19 +46,17 @@ var TerraformProviderDatasource = class TerraformProviderDatasource extends Terr
|
|
|
50
46
|
return packageName.includes("/") ? packageName : `hashicorp/${packageName}`;
|
|
51
47
|
}
|
|
52
48
|
/**
|
|
53
|
-
* Query the Terraform Registry using the undocumented
|
|
54
|
-
*
|
|
55
|
-
*
|
|
49
|
+
* Query the Terraform Registry using the undocumented v2 JSON:API.
|
|
50
|
+
*
|
|
51
|
+
* Returns release timestamps for all versions, unlike the v1 API
|
|
52
|
+
* which only exposed the timestamp for the latest version.
|
|
56
53
|
*/
|
|
57
|
-
async
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (latestVersion) latestVersion.releaseTimestamp = asTimestamp(res.published_at);
|
|
64
|
-
dep.homepage = `${registryUrl}/providers/${repository}`;
|
|
65
|
-
return dep;
|
|
54
|
+
async queryTerraformRegistryV2(registryUrl, packageName) {
|
|
55
|
+
const repository = TerraformProviderDatasource.getRepository({ packageName });
|
|
56
|
+
const providerUrl = `${joinUrlParts(registryUrl, "v2/providers", repository)}?${getQueryString({ include: "provider-versions" })}`;
|
|
57
|
+
const { body: res } = await this.http.getJson(providerUrl, TerraformProviderV2Response);
|
|
58
|
+
res.homepage = `${registryUrl}/providers/${repository}`;
|
|
59
|
+
return res;
|
|
66
60
|
}
|
|
67
61
|
/**
|
|
68
62
|
* Query a registry using the Provider Registry Protocol that all registries
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["hashicorpVersioning.id","p.map"],"sources":["../../../../lib/modules/datasource/terraform-provider/index.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { asTimestamp } from '../../../util/timestamp.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport * as hashicorpVersioning from '../../versioning/hashicorp/index.ts';\nimport { TerraformDatasource } from '../terraform-module/base.ts';\nimport type { ServiceDiscoveryResult } from '../terraform-module/types.ts';\nimport { createSDBackendURL } from '../terraform-module/utils.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport type {\n TerraformBuild,\n TerraformProvider,\n TerraformProviderReleaseBackend,\n TerraformProviderVersions,\n TerraformRegistryBuildResponse,\n TerraformRegistryVersions,\n VersionDetailResponse,\n} from './types.ts';\n\nexport class TerraformProviderDatasource extends TerraformDatasource {\n static override readonly id = 'terraform-provider';\n\n static readonly hashicorpReleaseUrl = 'https://releases.hashicorp.com';\n static readonly terraformRegistryUrl = 'https://registry.terraform.io';\n\n static readonly defaultRegistryUrls = [\n TerraformProviderDatasource.terraformRegistryUrl,\n TerraformProviderDatasource.hashicorpReleaseUrl,\n ];\n\n static repositoryRegex = regEx(/^hashicorp\\/(?<packageName>\\S+)$/);\n\n constructor() {\n super(TerraformProviderDatasource.id);\n }\n\n override readonly defaultRegistryUrls =\n TerraformProviderDatasource.defaultRegistryUrls;\n\n override readonly defaultVersioning = hashicorpVersioning.id;\n\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is only supported for the latest version, and is determined from the `published_at` field in the results and only for `https://registry.terraform.io`';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the the `source` field in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n logger.trace(\n `terraform-provider.getDependencies() packageName: ${packageName}`,\n );\n\n if (registryUrl === TerraformProviderDatasource.terraformRegistryUrl) {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n return await this.queryTerraformRegistry(\n serviceDiscovery,\n registryUrl,\n repository,\n );\n }\n if (registryUrl === TerraformProviderDatasource.hashicorpReleaseUrl) {\n return await this.queryReleaseBackend(packageName, registryUrl);\n }\n\n // Fall back to the standard Provider Registry Protocol for other registries.\n return await this.queryProviderRegistry(registryUrl, packageName);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = config.registryUrl;\n const repo = TerraformProviderDatasource.getRepository(config);\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getReleases:${url}/${repo}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private static getRepository({ packageName }: GetReleasesConfig): string {\n return packageName.includes('/') ? packageName : `hashicorp/${packageName}`;\n }\n\n /**\n * Query the Terraform Registry using the undocumented extended provider API.\n * This provides more information than the base Provider Registry Protocol,\n * such as the release date for the latest version and the source URL.\n */\n private async queryTerraformRegistry(\n serviceDiscovery: ServiceDiscoveryResult,\n registryUrl: string,\n repository: string,\n ): Promise<ReleaseResult> {\n const backendURL = createSDBackendURL(\n registryUrl,\n 'providers.v1',\n serviceDiscovery,\n repository,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProvider>(backendURL)\n ).body;\n const dep: ReleaseResult = {\n releases: res.versions.map((version) => ({\n version,\n })),\n };\n if (res.source) {\n dep.sourceUrl = res.source;\n }\n // set published date for latest release\n const latestVersion = dep.releases.find(\n (release) => res.version === release.version,\n );\n if (latestVersion) {\n latestVersion.releaseTimestamp = asTimestamp(res.published_at);\n }\n dep.homepage = `${registryUrl}/providers/${repository}`;\n return dep;\n }\n\n /**\n * Query a registry using the Provider Registry Protocol that all registries\n * are required to implement.\n * https://www.terraform.io/internals/provider-registry-protocol\n */\n private async queryProviderRegistry(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const serviceDiscovery: ServiceDiscoveryResult =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n const backendURL = createSDBackendURL(\n registryUrl,\n 'providers.v1',\n serviceDiscovery,\n `${repository}/versions`,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProviderVersions>(backendURL)\n ).body;\n const dep: ReleaseResult = {\n releases: res.versions.map(({ version }) => ({\n version,\n })),\n };\n return dep;\n }\n\n private async queryReleaseBackend(\n packageName: string,\n registryURL: string,\n ): Promise<ReleaseResult | null> {\n const hashicorpPackage = packageName.replace('hashicorp/', '');\n const backendLookUpName = `terraform-provider-${hashicorpPackage}`;\n const backendURL = joinUrlParts(\n registryURL,\n backendLookUpName,\n `index.json`,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProviderReleaseBackend>(\n backendURL,\n )\n ).body;\n\n const dep: ReleaseResult = {\n releases: Object.keys(res.versions).map((version) => ({\n version,\n })),\n sourceUrl: joinUrlParts(\n 'https://github.com/terraform-providers',\n backendLookUpName,\n ),\n };\n return dep;\n }\n\n private async _getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n if (registryURL === TerraformProviderDatasource.hashicorpReleaseUrl) {\n // check if registryURL === secondary backend\n const repositoryRegexResult =\n TerraformProviderDatasource.repositoryRegex.exec(repository)?.groups;\n if (!repositoryRegexResult) {\n // non hashicorp builds are not supported with releases.hashicorp.com\n return null;\n }\n const packageName = repositoryRegexResult.packageName;\n const backendLookUpName = `terraform-provider-${packageName}`;\n let versionReleaseBackend: VersionDetailResponse;\n try {\n versionReleaseBackend = await this.getReleaseBackendIndex(\n backendLookUpName,\n version,\n );\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, backendLookUpName, version },\n `Failed to retrieve builds for ${backendLookUpName} ${version}`,\n );\n // throw an error to disable caching\n throw new ExternalHostError(err);\n }\n return versionReleaseBackend.builds;\n }\n\n // check public or private Terraform registry\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryURL);\n if (!serviceDiscovery) {\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(`Service discovery not found for ${registryURL}`),\n );\n }\n const backendURL = createSDBackendURL(\n registryURL,\n 'providers.v1',\n serviceDiscovery,\n repository,\n );\n const versionsResponse = (\n await this.http.getJsonUnchecked<TerraformRegistryVersions>(\n `${backendURL}/versions`,\n )\n ).body;\n if (!versionsResponse.versions) {\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(`Failed to retrieve version list for ${backendURL}`),\n );\n }\n const builds = versionsResponse.versions.find(\n (value) => value.version === version,\n );\n if (!builds) {\n // should never happen, but just in case\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(\n `No builds found for ${repository}:${version} on ${registryURL}`,\n ),\n );\n }\n const result = await p.map(\n builds.platforms,\n async (platform) => {\n const buildURL = `${backendURL}/${version}/download/${platform.os}/${platform.arch}`;\n try {\n const res = (\n await this.http.getJsonUnchecked<TerraformRegistryBuildResponse>(\n buildURL,\n )\n ).body;\n const newBuild: TerraformBuild = {\n name: repository,\n url: res.download_url,\n version,\n ...res,\n };\n return newBuild;\n } catch (err) {\n /* v8 ignore next 3 -- hard to test */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug({ err, url: buildURL }, 'Failed to retrieve build');\n // throw an error to disable caching\n throw new ExternalHostError(err);\n }\n },\n { concurrency: 4 },\n );\n\n return result;\n }\n\n getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getBuilds:${registryURL}/${repository}/${version}`,\n },\n () => this._getBuilds(registryURL, repository, version),\n );\n }\n\n private async _getZipHashes(\n zipHashUrl: string,\n ): Promise<string[] | undefined> {\n // The hashes are formatted as the result of sha256sum in plain text, each line: <hash>\\t<filename>\n let rawHashData: string;\n try {\n rawHashData = (await this.http.getText(zipHashUrl)).body;\n } catch (err) {\n /* v8 ignore next 3 -- hard to test */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, zipHashUrl },\n `Failed to retrieve zip hashes from ${zipHashUrl}`,\n );\n return undefined;\n }\n\n return rawHashData\n .trimEnd()\n .split('\\n')\n .map((line) => line.split(/\\s/)[0]);\n }\n\n getZipHashes(zipHashUrl: string): Promise<string[] | undefined> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getZipHashes:${zipHashUrl}`,\n },\n () => this._getZipHashes(zipHashUrl),\n );\n }\n\n private async _getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return (\n await this.http.getJsonUnchecked<VersionDetailResponse>(\n `${TerraformProviderDatasource.hashicorpReleaseUrl}/${backendLookUpName}/${version}/index.json`,\n )\n ).body;\n }\n\n getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getReleaseBackendIndex:${backendLookUpName}/${version}`,\n },\n () => this._getReleaseBackendIndex(backendLookUpName, version),\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["hashicorpVersioning.id","p.map"],"sources":["../../../../lib/modules/datasource/terraform-provider/index.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { logger } from '../../../logger/index.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { withCache } from '../../../util/cache/package/with-cache.ts';\nimport * as p from '../../../util/promises.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { getQueryString, joinUrlParts } from '../../../util/url.ts';\nimport * as hashicorpVersioning from '../../versioning/hashicorp/index.ts';\nimport { TerraformDatasource } from '../terraform-module/base.ts';\nimport type { ServiceDiscoveryResult } from '../terraform-module/types.ts';\nimport { createSDBackendURL } from '../terraform-module/utils.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { TerraformProviderV2Response } from './schema.ts';\nimport type {\n TerraformBuild,\n TerraformProviderReleaseBackend,\n TerraformProviderVersions,\n TerraformRegistryBuildResponse,\n TerraformRegistryVersions,\n VersionDetailResponse,\n} from './types.ts';\n\nexport class TerraformProviderDatasource extends TerraformDatasource {\n static override readonly id = 'terraform-provider';\n\n static readonly hashicorpReleaseUrl = 'https://releases.hashicorp.com';\n static readonly terraformRegistryUrl = 'https://registry.terraform.io';\n\n static readonly defaultRegistryUrls = [\n TerraformProviderDatasource.terraformRegistryUrl,\n TerraformProviderDatasource.hashicorpReleaseUrl,\n ];\n\n static repositoryRegex = regEx(/^hashicorp\\/(?<packageName>\\S+)$/);\n\n constructor() {\n super(TerraformProviderDatasource.id);\n }\n\n override readonly defaultRegistryUrls =\n TerraformProviderDatasource.defaultRegistryUrls;\n\n override readonly defaultVersioning = hashicorpVersioning.id;\n\n override readonly registryStrategy = 'hunt';\n\n override readonly releaseTimestampSupport = true;\n override readonly releaseTimestampNote =\n 'The release timestamp is determined from the `published-at` field in the Terraform Registry v2 API response and is only available for `https://registry.terraform.io`.';\n override readonly sourceUrlSupport = 'package';\n override readonly sourceUrlNote =\n 'The source URL is determined from the the `source` field in the results.';\n\n private async _getReleases({\n packageName,\n registryUrl,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n /* v8 ignore next 3 -- should never happen */\n if (!registryUrl) {\n return null;\n }\n logger.trace(\n `terraform-provider.getDependencies() packageName: ${packageName}`,\n );\n\n if (registryUrl === TerraformProviderDatasource.terraformRegistryUrl) {\n return await this.queryTerraformRegistryV2(registryUrl, packageName);\n }\n if (registryUrl === TerraformProviderDatasource.hashicorpReleaseUrl) {\n return await this.queryReleaseBackend(packageName, registryUrl);\n }\n\n // Fall back to the standard Provider Registry Protocol for other registries.\n return await this.queryProviderRegistry(registryUrl, packageName);\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n const url = config.registryUrl;\n const repo = TerraformProviderDatasource.getRepository(config);\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getReleases:${url}/${repo}`,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n private static getRepository({ packageName }: GetReleasesConfig): string {\n return packageName.includes('/') ? packageName : `hashicorp/${packageName}`;\n }\n\n /**\n * Query the Terraform Registry using the undocumented v2 JSON:API.\n *\n * Returns release timestamps for all versions, unlike the v1 API\n * which only exposed the timestamp for the latest version.\n */\n private async queryTerraformRegistryV2(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const providerUrl = `${joinUrlParts(\n registryUrl,\n 'v2/providers',\n repository,\n )}?${getQueryString({ include: 'provider-versions' })}`;\n const { body: res } = await this.http.getJson(\n providerUrl,\n TerraformProviderV2Response,\n );\n res.homepage = `${registryUrl}/providers/${repository}`;\n return res;\n }\n\n /**\n * Query a registry using the Provider Registry Protocol that all registries\n * are required to implement.\n * https://www.terraform.io/internals/provider-registry-protocol\n */\n private async queryProviderRegistry(\n registryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult> {\n const repository = TerraformProviderDatasource.getRepository({\n packageName,\n });\n const serviceDiscovery: ServiceDiscoveryResult =\n await this.getTerraformServiceDiscoveryResult(registryUrl);\n const backendURL = createSDBackendURL(\n registryUrl,\n 'providers.v1',\n serviceDiscovery,\n `${repository}/versions`,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProviderVersions>(backendURL)\n ).body;\n const dep: ReleaseResult = {\n releases: res.versions.map(({ version }) => ({\n version,\n })),\n };\n return dep;\n }\n\n private async queryReleaseBackend(\n packageName: string,\n registryURL: string,\n ): Promise<ReleaseResult | null> {\n const hashicorpPackage = packageName.replace('hashicorp/', '');\n const backendLookUpName = `terraform-provider-${hashicorpPackage}`;\n const backendURL = joinUrlParts(\n registryURL,\n backendLookUpName,\n `index.json`,\n );\n const res = (\n await this.http.getJsonUnchecked<TerraformProviderReleaseBackend>(\n backendURL,\n )\n ).body;\n\n const dep: ReleaseResult = {\n releases: Object.keys(res.versions).map((version) => ({\n version,\n })),\n sourceUrl: joinUrlParts(\n 'https://github.com/terraform-providers',\n backendLookUpName,\n ),\n };\n return dep;\n }\n\n private async _getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n if (registryURL === TerraformProviderDatasource.hashicorpReleaseUrl) {\n // check if registryURL === secondary backend\n const repositoryRegexResult =\n TerraformProviderDatasource.repositoryRegex.exec(repository)?.groups;\n if (!repositoryRegexResult) {\n // non hashicorp builds are not supported with releases.hashicorp.com\n return null;\n }\n const packageName = repositoryRegexResult.packageName;\n const backendLookUpName = `terraform-provider-${packageName}`;\n let versionReleaseBackend: VersionDetailResponse;\n try {\n versionReleaseBackend = await this.getReleaseBackendIndex(\n backendLookUpName,\n version,\n );\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, backendLookUpName, version },\n `Failed to retrieve builds for ${backendLookUpName} ${version}`,\n );\n // throw an error to disable caching\n throw new ExternalHostError(err);\n }\n return versionReleaseBackend.builds;\n }\n\n // check public or private Terraform registry\n const serviceDiscovery =\n await this.getTerraformServiceDiscoveryResult(registryURL);\n if (!serviceDiscovery) {\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(`Service discovery not found for ${registryURL}`),\n );\n }\n const backendURL = createSDBackendURL(\n registryURL,\n 'providers.v1',\n serviceDiscovery,\n repository,\n );\n const versionsResponse = (\n await this.http.getJsonUnchecked<TerraformRegistryVersions>(\n `${backendURL}/versions`,\n )\n ).body;\n if (!versionsResponse.versions) {\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(`Failed to retrieve version list for ${backendURL}`),\n );\n }\n const builds = versionsResponse.versions.find(\n (value) => value.version === version,\n );\n if (!builds) {\n // should never happen, but just in case\n // throw an error to disable caching\n throw new ExternalHostError(\n new Error(\n `No builds found for ${repository}:${version} on ${registryURL}`,\n ),\n );\n }\n const result = await p.map(\n builds.platforms,\n async (platform) => {\n const buildURL = `${backendURL}/${version}/download/${platform.os}/${platform.arch}`;\n try {\n const res = (\n await this.http.getJsonUnchecked<TerraformRegistryBuildResponse>(\n buildURL,\n )\n ).body;\n const newBuild: TerraformBuild = {\n name: repository,\n url: res.download_url,\n version,\n ...res,\n };\n return newBuild;\n } catch (err) {\n /* v8 ignore next 3 -- hard to test */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug({ err, url: buildURL }, 'Failed to retrieve build');\n // throw an error to disable caching\n throw new ExternalHostError(err);\n }\n },\n { concurrency: 4 },\n );\n\n return result;\n }\n\n getBuilds(\n registryURL: string,\n repository: string,\n version: string,\n ): Promise<TerraformBuild[] | null> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getBuilds:${registryURL}/${repository}/${version}`,\n },\n () => this._getBuilds(registryURL, repository, version),\n );\n }\n\n private async _getZipHashes(\n zipHashUrl: string,\n ): Promise<string[] | undefined> {\n // The hashes are formatted as the result of sha256sum in plain text, each line: <hash>\\t<filename>\n let rawHashData: string;\n try {\n rawHashData = (await this.http.getText(zipHashUrl)).body;\n } catch (err) {\n /* v8 ignore next 3 -- hard to test */\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n { err, zipHashUrl },\n `Failed to retrieve zip hashes from ${zipHashUrl}`,\n );\n return undefined;\n }\n\n return rawHashData\n .trimEnd()\n .split('\\n')\n .map((line) => line.split(/\\s/)[0]);\n }\n\n getZipHashes(zipHashUrl: string): Promise<string[] | undefined> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getZipHashes:${zipHashUrl}`,\n },\n () => this._getZipHashes(zipHashUrl),\n );\n }\n\n private async _getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return (\n await this.http.getJsonUnchecked<VersionDetailResponse>(\n `${TerraformProviderDatasource.hashicorpReleaseUrl}/${backendLookUpName}/${version}/index.json`,\n )\n ).body;\n }\n\n getReleaseBackendIndex(\n backendLookUpName: string,\n version: string,\n ): Promise<VersionDetailResponse> {\n return withCache(\n {\n namespace: `datasource-${TerraformProviderDatasource.id}`,\n key: `getReleaseBackendIndex:${backendLookUpName}/${version}`,\n },\n () => this._getReleaseBackendIndex(backendLookUpName, version),\n );\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { LooseArray } from "../../../util/schema-utils/index.js";
|
|
2
|
+
import { MaybeTimestamp } from "../../../util/timestamp.js";
|
|
3
|
+
import { z } from "zod/v3";
|
|
4
|
+
//#region lib/modules/datasource/terraform-provider/schema.ts
|
|
5
|
+
const ProviderAttributes = z.object({ source: z.string().optional() });
|
|
6
|
+
const ProviderVersion = z.object({
|
|
7
|
+
type: z.literal("provider-versions"),
|
|
8
|
+
attributes: z.object({
|
|
9
|
+
version: z.string(),
|
|
10
|
+
"published-at": MaybeTimestamp
|
|
11
|
+
})
|
|
12
|
+
}).transform((resource) => ({
|
|
13
|
+
version: resource.attributes.version,
|
|
14
|
+
releaseTimestamp: resource.attributes["published-at"]
|
|
15
|
+
}));
|
|
16
|
+
const TerraformProviderV2Response = z.object({
|
|
17
|
+
data: z.object({ attributes: ProviderAttributes }),
|
|
18
|
+
included: LooseArray(ProviderVersion).catch([])
|
|
19
|
+
}).transform((response) => ({
|
|
20
|
+
sourceUrl: response.data.attributes.source,
|
|
21
|
+
releases: response.included
|
|
22
|
+
}));
|
|
23
|
+
//#endregion
|
|
24
|
+
export { TerraformProviderV2Response };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/datasource/terraform-provider/schema.ts"],"sourcesContent":["import { z } from 'zod/v3';\nimport { LooseArray } from '../../../util/schema-utils/index.ts';\nimport { MaybeTimestamp } from '../../../util/timestamp.ts';\nimport type { Release, ReleaseResult } from '../types.ts';\n\nconst ProviderAttributes = z.object({\n source: z.string().optional(),\n});\n\nconst ProviderVersion = z\n .object({\n type: z.literal('provider-versions'),\n attributes: z.object({\n version: z.string(),\n 'published-at': MaybeTimestamp,\n }),\n })\n .transform(\n (resource): Release => ({\n version: resource.attributes.version,\n releaseTimestamp: resource.attributes['published-at'],\n }),\n );\n\nexport const TerraformProviderV2Response = z\n .object({\n data: z.object({\n attributes: ProviderAttributes,\n }),\n included: LooseArray(ProviderVersion).catch([]),\n })\n .transform(\n (response): ReleaseResult => ({\n sourceUrl: response.data.attributes.source,\n releases: response.included,\n }),\n );\n\nexport type TerraformProviderV2Response = z.infer<\n typeof TerraformProviderV2Response\n>;\n"],"mappings":";;;;AAKA,MAAM,qBAAqB,EAAE,OAAO,EAClC,QAAQ,EAAE,QAAQ,CAAC,UAAU,EAC9B,CAAC;AAEF,MAAM,kBAAkB,EACrB,OAAO;CACN,MAAM,EAAE,QAAQ,oBAAoB;CACpC,YAAY,EAAE,OAAO;EACnB,SAAS,EAAE,QAAQ;EACnB,gBAAgB;EACjB,CAAC;CACH,CAAC,CACD,WACE,cAAuB;CACtB,SAAS,SAAS,WAAW;CAC7B,kBAAkB,SAAS,WAAW;CACvC,EACF;AAEH,MAAa,8BAA8B,EACxC,OAAO;CACN,MAAM,EAAE,OAAO,EACb,YAAY,oBACb,CAAC;CACF,UAAU,WAAW,gBAAgB,CAAC,MAAM,EAAE,CAAC;CAChD,CAAC,CACD,WACE,cAA6B;CAC5B,WAAW,SAAS,KAAK,WAAW;CACpC,UAAU,SAAS;CACpB,EACF"}
|
|
@@ -17,7 +17,49 @@ function getDependencyType(scope) {
|
|
|
17
17
|
if (scope && scopeNames.has(scope)) return scope;
|
|
18
18
|
return "compile";
|
|
19
19
|
}
|
|
20
|
+
function parseCoords(coordsStr) {
|
|
21
|
+
const parts = coordsStr.split(":");
|
|
22
|
+
if (parts.length < 3) {
|
|
23
|
+
logger.trace({ coordsStr }, "ant manager: coords has fewer than 3 parts");
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const [groupId, artifactId] = parts;
|
|
27
|
+
if (!groupId || !artifactId) {
|
|
28
|
+
logger.trace({ coordsStr }, "ant manager: coords has empty groupId or artifactId");
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
let scope;
|
|
32
|
+
let rawVersion;
|
|
33
|
+
if (parts.length >= 4 && scopeNames.has(parts.at(-1))) {
|
|
34
|
+
scope = parts.at(-1);
|
|
35
|
+
rawVersion = parts.at(-2);
|
|
36
|
+
} else rawVersion = parts.at(-1);
|
|
37
|
+
return {
|
|
38
|
+
groupId,
|
|
39
|
+
artifactId,
|
|
40
|
+
rawVersion,
|
|
41
|
+
scope
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function collectCoordsDependency(node, packageFile, content) {
|
|
45
|
+
const coordsStr = node.attr.coords;
|
|
46
|
+
const parsed = parseCoords(coordsStr);
|
|
47
|
+
if (!parsed) return null;
|
|
48
|
+
const dep = {
|
|
49
|
+
datasource: MavenDatasource.id,
|
|
50
|
+
depName: `${parsed.groupId}:${parsed.artifactId}`,
|
|
51
|
+
currentValue: parsed.rawVersion,
|
|
52
|
+
depType: getDependencyType(parsed.scope ?? node.attr.scope),
|
|
53
|
+
registryUrls: []
|
|
54
|
+
};
|
|
55
|
+
dep.fileReplacePosition = findAttrValuePosition(content, node, "coords") + coordsStr.lastIndexOf(parsed.rawVersion);
|
|
56
|
+
return {
|
|
57
|
+
dep,
|
|
58
|
+
depPackageFile: packageFile
|
|
59
|
+
};
|
|
60
|
+
}
|
|
20
61
|
function collectDependency(node, packageFile, content) {
|
|
62
|
+
if (node.attr.coords) return collectCoordsDependency(node, packageFile, content);
|
|
21
63
|
const { groupId, artifactId, version, scope } = node.attr;
|
|
22
64
|
if (!version || !groupId || !artifactId) return null;
|
|
23
65
|
const dep = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/ant/extract.ts"],"sourcesContent":["import upath from 'upath';\nimport type { XmlElement } from 'xmldoc';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { MavenDatasource } from '../../datasource/maven/index.ts';\nimport { isXmlElement } from '../nuget/util.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n PackageFileContent,\n} from '../types.ts';\nimport {\n applyProps,\n findAttrValuePosition,\n parsePropertiesFile,\n resolveChainedProps,\n} from './properties.ts';\nimport type { AntProp } from './types.ts';\n\nexport { parsePropertiesFile } from './properties.ts';\n\nconst scopeNames = new Set([\n 'compile',\n 'runtime',\n 'test',\n 'provided',\n 'system',\n]);\n\nfunction getDependencyType(scope: string | undefined): string {\n if (scope && scopeNames.has(scope)) {\n return scope;\n }\n return 'compile';\n}\n\ninterface RawDep {\n dep: PackageDependency;\n depPackageFile: string;\n}\n\nfunction collectDependency(\n node: XmlElement,\n packageFile: string,\n content: string,\n): RawDep | null {\n const { groupId, artifactId, version, scope } = node.attr;\n\n if (!version || !groupId || !artifactId) {\n return null;\n }\n\n const dep: PackageDependency = {\n datasource: MavenDatasource.id,\n depName: `${groupId}:${artifactId}`,\n currentValue: version,\n depType: getDependencyType(scope),\n registryUrls: [],\n };\n\n dep.fileReplacePosition = findAttrValuePosition(content, node, 'version');\n\n return { dep, depPackageFile: packageFile };\n}\n\nfunction walkNode(\n node: XmlElement | XmlDocument,\n rawDeps: RawDep[],\n packageFile: string,\n content: string,\n): void {\n for (const child of node.children) {\n if (!isXmlElement(child)) {\n continue;\n }\n\n if (child.name === 'dependency') {\n const rawDep = collectDependency(child, packageFile, content);\n if (rawDep) {\n rawDeps.push(rawDep);\n }\n } else {\n walkNode(child, rawDeps, packageFile, content);\n }\n }\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n let doc: XmlDocument;\n try {\n doc = new XmlDocument(content);\n } catch {\n logger.debug(`ant manager: could not parse XML ${packageFile}`);\n return null;\n }\n\n const rawDeps: RawDep[] = [];\n walkNode(doc, rawDeps, packageFile, content);\n\n const deps = rawDeps.map((rd) => rd.dep);\n\n if (deps.length === 0) {\n return null;\n }\n\n return { deps };\n}\n\n/**\n * Walk an XML node tree in document order, processing properties,\n * property file references, and dependencies as they appear.\n */\nasync function walkNodeInOrder(\n node: XmlElement | XmlDocument,\n packageFile: string,\n content: string,\n visitedFiles: Set<string>,\n allProps: Record<string, AntProp>,\n allRawDeps: RawDep[],\n): Promise<void> {\n const baseDir = upath.dirname(packageFile);\n\n for (const child of node.children) {\n if (!isXmlElement(child)) {\n continue;\n }\n\n if (child.name === 'property') {\n // Handle inline property definition\n const name = child.attr.name;\n const value = child.attr.value;\n if (name && value && !(name in allProps)) {\n const pos = findAttrValuePosition(content, child, 'value');\n allProps[name] = { val: value, fileReplacePosition: pos, packageFile };\n }\n\n // Handle property file reference\n const file = child.attr.file;\n if (file) {\n const propFilePath = file.startsWith('/')\n ? file\n : upath.join(baseDir, file);\n\n if (!visitedFiles.has(propFilePath)) {\n visitedFiles.add(propFilePath);\n const propContent = await readLocalFile(propFilePath, 'utf8');\n if (propContent) {\n parsePropertiesFile(propContent, propFilePath, allProps);\n } else {\n logger.debug(\n `ant manager: could not read properties file ${propFilePath}`,\n );\n }\n }\n }\n } else if (child.name === 'import' && child.attr.file) {\n const importedFile = upath.normalize(\n upath.join(baseDir, child.attr.file),\n );\n await walkXmlFile(importedFile, visitedFiles, allProps, allRawDeps);\n } else if (child.name === 'dependency') {\n const rawDep = collectDependency(child, packageFile, content);\n if (rawDep) {\n allRawDeps.push(rawDep);\n }\n } else {\n await walkNodeInOrder(\n child,\n packageFile,\n content,\n visitedFiles,\n allProps,\n allRawDeps,\n );\n }\n }\n}\n\nasync function walkXmlFile(\n packageFile: string,\n visitedFiles: Set<string>,\n allProps: Record<string, AntProp>,\n allRawDeps: RawDep[],\n): Promise<void> {\n if (visitedFiles.has(packageFile)) {\n return;\n }\n visitedFiles.add(packageFile);\n\n const content = await readLocalFile(packageFile, 'utf8');\n if (!content) {\n logger.debug(`ant manager: could not read ${packageFile}`);\n return;\n }\n\n let doc: XmlDocument;\n try {\n doc = new XmlDocument(content);\n } catch {\n logger.debug(`ant manager: could not parse XML ${packageFile}`);\n return;\n }\n\n await walkNodeInOrder(\n doc,\n packageFile,\n content,\n visitedFiles,\n allProps,\n allRawDeps,\n );\n}\n\nexport async function extractAllPackageFiles(\n _config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile[] | null> {\n const results: PackageFile[] = [];\n const seen = new Set<string>();\n\n for (const packageFile of packageFiles) {\n if (seen.has(packageFile)) {\n continue;\n }\n seen.add(packageFile);\n\n const visitedFiles = new Set<string>();\n const allProps: Record<string, AntProp> = {};\n const allRawDeps: RawDep[] = [];\n\n await walkXmlFile(packageFile, visitedFiles, allProps, allRawDeps);\n\n // Resolve chained property values before applying to deps\n resolveChainedProps(allProps);\n\n // Apply property resolution to all dependencies\n const resolvedDeps = allRawDeps.map((rawDep) =>\n applyProps(rawDep.dep, rawDep.depPackageFile, allProps),\n );\n\n if (resolvedDeps.length === 0) {\n continue;\n }\n\n // Group deps by their target file (propSource or original packageFile)\n const fileMap = new Map<string, PackageDependency[]>();\n for (let i = 0; i < resolvedDeps.length; i++) {\n const dep = resolvedDeps[i];\n const targetFile = dep.propSource ?? allRawDeps[i].depPackageFile;\n if (!fileMap.has(targetFile)) {\n fileMap.set(targetFile, []);\n }\n fileMap.get(targetFile)!.push(dep);\n }\n\n for (const [pkgFile, deps] of fileMap) {\n // Clean up internal propSource field\n for (const dep of deps) {\n delete dep.propSource;\n }\n results.push({ packageFile: pkgFile, deps });\n }\n }\n\n return results.length > 0 ? results : null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/ant/extract.ts"],"sourcesContent":["import upath from 'upath';\nimport type { XmlElement } from 'xmldoc';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { MavenDatasource } from '../../datasource/maven/index.ts';\nimport { isXmlElement } from '../nuget/util.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n PackageFileContent,\n} from '../types.ts';\nimport {\n applyProps,\n findAttrValuePosition,\n parsePropertiesFile,\n resolveChainedProps,\n} from './properties.ts';\nimport type { AntProp } from './types.ts';\n\nexport { parsePropertiesFile } from './properties.ts';\n\nconst scopeNames = new Set([\n 'compile',\n 'runtime',\n 'test',\n 'provided',\n 'system',\n]);\n\nfunction getDependencyType(scope: string | undefined): string {\n if (scope && scopeNames.has(scope)) {\n return scope;\n }\n return 'compile';\n}\n\nfunction parseCoords(coordsStr: string): {\n groupId: string;\n artifactId: string;\n rawVersion: string;\n scope: string | undefined;\n} | null {\n const parts = coordsStr.split(':');\n if (parts.length < 3) {\n logger.trace({ coordsStr }, 'ant manager: coords has fewer than 3 parts');\n return null;\n }\n\n const [groupId, artifactId] = parts;\n if (!groupId || !artifactId) {\n logger.trace(\n { coordsStr },\n 'ant manager: coords has empty groupId or artifactId',\n );\n return null;\n }\n\n let scope: string | undefined;\n let rawVersion: string;\n\n if (parts.length >= 4 && scopeNames.has(parts.at(-1)!)) {\n scope = parts.at(-1);\n rawVersion = parts.at(-2)!;\n } else {\n rawVersion = parts.at(-1)!;\n }\n\n return { groupId, artifactId, rawVersion, scope };\n}\n\ninterface RawDep {\n dep: PackageDependency;\n depPackageFile: string;\n}\n\nfunction collectCoordsDependency(\n node: XmlElement,\n packageFile: string,\n content: string,\n): RawDep | null {\n const coordsStr = node.attr.coords;\n\n const parsed = parseCoords(coordsStr);\n if (!parsed) {\n return null;\n }\n\n const dep: PackageDependency = {\n datasource: MavenDatasource.id,\n depName: `${parsed.groupId}:${parsed.artifactId}`,\n currentValue: parsed.rawVersion,\n depType: getDependencyType(parsed.scope ?? node.attr.scope),\n registryUrls: [],\n };\n\n // Position at the version substring within the coords attribute value\n const coordsValuePos = findAttrValuePosition(content, node, 'coords');\n const versionOffset = coordsStr.lastIndexOf(parsed.rawVersion);\n dep.fileReplacePosition = coordsValuePos + versionOffset;\n\n return { dep, depPackageFile: packageFile };\n}\n\nfunction collectDependency(\n node: XmlElement,\n packageFile: string,\n content: string,\n): RawDep | null {\n if (node.attr.coords) {\n return collectCoordsDependency(node, packageFile, content);\n }\n\n const { groupId, artifactId, version, scope } = node.attr;\n\n if (!version || !groupId || !artifactId) {\n return null;\n }\n\n const dep: PackageDependency = {\n datasource: MavenDatasource.id,\n depName: `${groupId}:${artifactId}`,\n currentValue: version,\n depType: getDependencyType(scope),\n registryUrls: [],\n };\n\n dep.fileReplacePosition = findAttrValuePosition(content, node, 'version');\n\n return { dep, depPackageFile: packageFile };\n}\n\nfunction walkNode(\n node: XmlElement | XmlDocument,\n rawDeps: RawDep[],\n packageFile: string,\n content: string,\n): void {\n for (const child of node.children) {\n if (!isXmlElement(child)) {\n continue;\n }\n\n if (child.name === 'dependency') {\n const rawDep = collectDependency(child, packageFile, content);\n if (rawDep) {\n rawDeps.push(rawDep);\n }\n } else {\n walkNode(child, rawDeps, packageFile, content);\n }\n }\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n let doc: XmlDocument;\n try {\n doc = new XmlDocument(content);\n } catch {\n logger.debug(`ant manager: could not parse XML ${packageFile}`);\n return null;\n }\n\n const rawDeps: RawDep[] = [];\n walkNode(doc, rawDeps, packageFile, content);\n\n const deps = rawDeps.map((rd) => rd.dep);\n\n if (deps.length === 0) {\n return null;\n }\n\n return { deps };\n}\n\n/**\n * Walk an XML node tree in document order, processing properties,\n * property file references, and dependencies as they appear.\n */\nasync function walkNodeInOrder(\n node: XmlElement | XmlDocument,\n packageFile: string,\n content: string,\n visitedFiles: Set<string>,\n allProps: Record<string, AntProp>,\n allRawDeps: RawDep[],\n): Promise<void> {\n const baseDir = upath.dirname(packageFile);\n\n for (const child of node.children) {\n if (!isXmlElement(child)) {\n continue;\n }\n\n if (child.name === 'property') {\n // Handle inline property definition\n const name = child.attr.name;\n const value = child.attr.value;\n if (name && value && !(name in allProps)) {\n const pos = findAttrValuePosition(content, child, 'value');\n allProps[name] = { val: value, fileReplacePosition: pos, packageFile };\n }\n\n // Handle property file reference\n const file = child.attr.file;\n if (file) {\n const propFilePath = file.startsWith('/')\n ? file\n : upath.join(baseDir, file);\n\n if (!visitedFiles.has(propFilePath)) {\n visitedFiles.add(propFilePath);\n const propContent = await readLocalFile(propFilePath, 'utf8');\n if (propContent) {\n parsePropertiesFile(propContent, propFilePath, allProps);\n } else {\n logger.debug(\n `ant manager: could not read properties file ${propFilePath}`,\n );\n }\n }\n }\n } else if (child.name === 'import' && child.attr.file) {\n const importedFile = upath.normalize(\n upath.join(baseDir, child.attr.file),\n );\n await walkXmlFile(importedFile, visitedFiles, allProps, allRawDeps);\n } else if (child.name === 'dependency') {\n const rawDep = collectDependency(child, packageFile, content);\n if (rawDep) {\n allRawDeps.push(rawDep);\n }\n } else {\n await walkNodeInOrder(\n child,\n packageFile,\n content,\n visitedFiles,\n allProps,\n allRawDeps,\n );\n }\n }\n}\n\nasync function walkXmlFile(\n packageFile: string,\n visitedFiles: Set<string>,\n allProps: Record<string, AntProp>,\n allRawDeps: RawDep[],\n): Promise<void> {\n if (visitedFiles.has(packageFile)) {\n return;\n }\n visitedFiles.add(packageFile);\n\n const content = await readLocalFile(packageFile, 'utf8');\n if (!content) {\n logger.debug(`ant manager: could not read ${packageFile}`);\n return;\n }\n\n let doc: XmlDocument;\n try {\n doc = new XmlDocument(content);\n } catch {\n logger.debug(`ant manager: could not parse XML ${packageFile}`);\n return;\n }\n\n await walkNodeInOrder(\n doc,\n packageFile,\n content,\n visitedFiles,\n allProps,\n allRawDeps,\n );\n}\n\nexport async function extractAllPackageFiles(\n _config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile[] | null> {\n const results: PackageFile[] = [];\n const seen = new Set<string>();\n\n for (const packageFile of packageFiles) {\n if (seen.has(packageFile)) {\n continue;\n }\n seen.add(packageFile);\n\n const visitedFiles = new Set<string>();\n const allProps: Record<string, AntProp> = {};\n const allRawDeps: RawDep[] = [];\n\n await walkXmlFile(packageFile, visitedFiles, allProps, allRawDeps);\n\n // Resolve chained property values before applying to deps\n resolveChainedProps(allProps);\n\n // Apply property resolution to all dependencies\n const resolvedDeps = allRawDeps.map((rawDep) =>\n applyProps(rawDep.dep, rawDep.depPackageFile, allProps),\n );\n\n if (resolvedDeps.length === 0) {\n continue;\n }\n\n // Group deps by their target file (propSource or original packageFile)\n const fileMap = new Map<string, PackageDependency[]>();\n for (let i = 0; i < resolvedDeps.length; i++) {\n const dep = resolvedDeps[i];\n const targetFile = dep.propSource ?? allRawDeps[i].depPackageFile;\n if (!fileMap.has(targetFile)) {\n fileMap.set(targetFile, []);\n }\n fileMap.get(targetFile)!.push(dep);\n }\n\n for (const [pkgFile, deps] of fileMap) {\n // Clean up internal propSource field\n for (const dep of deps) {\n delete dep.propSource;\n }\n results.push({ packageFile: pkgFile, deps });\n }\n }\n\n return results.length > 0 ? results : null;\n}\n"],"mappings":"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"}
|
|
@@ -14,7 +14,13 @@ function updateDependency({ fileContent, upgrade }) {
|
|
|
14
14
|
if (quoteChar === "\"" || quoteChar === "'") endIndex = rightPart.indexOf(quoteChar);
|
|
15
15
|
else {
|
|
16
16
|
const newlineIndex = rightPart.indexOf("\n");
|
|
17
|
-
|
|
17
|
+
const lineEnd = newlineIndex === -1 ? rightPart.length : newlineIndex;
|
|
18
|
+
const nearestQuote = [rightPart.indexOf("\""), rightPart.indexOf("'")].filter((i) => i !== -1 && i < lineEnd);
|
|
19
|
+
if (nearestQuote.length > 0) {
|
|
20
|
+
const quoteEnd = Math.min(...nearestQuote);
|
|
21
|
+
const colonIndex = rightPart.indexOf(":");
|
|
22
|
+
endIndex = colonIndex !== -1 && colonIndex < quoteEnd ? colonIndex : quoteEnd;
|
|
23
|
+
} else endIndex = lineEnd;
|
|
18
24
|
}
|
|
19
25
|
const currentFound = rightPart.slice(0, endIndex);
|
|
20
26
|
if (currentFound === newValue) return fileContent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","names":[],"sources":["../../../../lib/modules/manager/ant/update.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport type { UpdateDependencyConfig } from '../types.ts';\n\n/** For external .properties files: updateDependency is necessary because extractPackageFile can't reconstruct dep metadata from a .properties file alone */\nexport function updateDependency({\n fileContent,\n upgrade,\n}: UpdateDependencyConfig): string | null {\n const { depName, currentValue, newValue, fileReplacePosition } = upgrade;\n\n if (fileReplacePosition === undefined || fileReplacePosition === null) {\n logger.debug({ depName }, 'No fileReplacePosition for ant dependency');\n return null;\n }\n\n const leftPart = fileContent.slice(0, fileReplacePosition);\n const rightPart = fileContent.slice(fileReplacePosition);\n\n // Find the end of the value (closing quote or end of line for .properties files)\n let endIndex: number;\n const quoteChar = leftPart.at(-1);\n if (quoteChar === '\"' || quoteChar === \"'\") {\n endIndex = rightPart.indexOf(quoteChar);\n } else {\n // .properties file
|
|
1
|
+
{"version":3,"file":"update.js","names":[],"sources":["../../../../lib/modules/manager/ant/update.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport type { UpdateDependencyConfig } from '../types.ts';\n\n/** For external .properties files: updateDependency is necessary because extractPackageFile can't reconstruct dep metadata from a .properties file alone */\nexport function updateDependency({\n fileContent,\n upgrade,\n}: UpdateDependencyConfig): string | null {\n const { depName, currentValue, newValue, fileReplacePosition } = upgrade;\n\n if (fileReplacePosition === undefined || fileReplacePosition === null) {\n logger.debug({ depName }, 'No fileReplacePosition for ant dependency');\n return null;\n }\n\n const leftPart = fileContent.slice(0, fileReplacePosition);\n const rightPart = fileContent.slice(fileReplacePosition);\n\n // Find the end of the value (closing quote or end of line for .properties files)\n let endIndex: number;\n const quoteChar = leftPart.at(-1);\n if (quoteChar === '\"' || quoteChar === \"'\") {\n endIndex = rightPart.indexOf(quoteChar);\n } else {\n // Could be a .properties file or a substring inside a coords attribute\n const newlineIndex = rightPart.indexOf('\\n');\n const lineEnd = newlineIndex === -1 ? rightPart.length : newlineIndex;\n\n // Check for closing quote before newline (indicates coords attribute)\n const nearestQuote = [\n rightPart.indexOf('\"'),\n rightPart.indexOf(\"'\"),\n ].filter((i) => i !== -1 && i < lineEnd);\n\n if (nearestQuote.length > 0) {\n // Inside a quoted attribute (coords) - version ends at : or closing quote\n const quoteEnd = Math.min(...nearestQuote);\n const colonIndex = rightPart.indexOf(':');\n endIndex =\n colonIndex !== -1 && colonIndex < quoteEnd ? colonIndex : quoteEnd;\n } else {\n // .properties file: value ends at newline or EOF\n endIndex = lineEnd;\n }\n }\n\n const currentFound = rightPart.slice(0, endIndex);\n\n if (currentFound === newValue) {\n return fileContent;\n }\n\n if (currentFound === currentValue || upgrade.sharedVariableName) {\n return `${leftPart}${newValue}${rightPart.slice(endIndex)}`;\n }\n\n logger.debug(\n { depName, currentFound, currentValue, newValue },\n 'ant: unexpected value at fileReplacePosition',\n );\n return null;\n}\n"],"mappings":";;;AAIA,SAAgB,iBAAiB,EAC/B,aACA,WACwC;CACxC,MAAM,EAAE,SAAS,cAAc,UAAU,wBAAwB;AAEjE,KAAI,wBAAwB,KAAA,KAAa,wBAAwB,MAAM;AACrE,SAAO,MAAM,EAAE,SAAS,EAAE,4CAA4C;AACtE,SAAO;;CAGT,MAAM,WAAW,YAAY,MAAM,GAAG,oBAAoB;CAC1D,MAAM,YAAY,YAAY,MAAM,oBAAoB;CAGxD,IAAI;CACJ,MAAM,YAAY,SAAS,GAAG,GAAG;AACjC,KAAI,cAAc,QAAO,cAAc,IACrC,YAAW,UAAU,QAAQ,UAAU;MAClC;EAEL,MAAM,eAAe,UAAU,QAAQ,KAAK;EAC5C,MAAM,UAAU,iBAAiB,KAAK,UAAU,SAAS;EAGzD,MAAM,eAAe,CACnB,UAAU,QAAQ,KAAI,EACtB,UAAU,QAAQ,IAAI,CACvB,CAAC,QAAQ,MAAM,MAAM,MAAM,IAAI,QAAQ;AAExC,MAAI,aAAa,SAAS,GAAG;GAE3B,MAAM,WAAW,KAAK,IAAI,GAAG,aAAa;GAC1C,MAAM,aAAa,UAAU,QAAQ,IAAI;AACzC,cACE,eAAe,MAAM,aAAa,WAAW,aAAa;QAG5D,YAAW;;CAIf,MAAM,eAAe,UAAU,MAAM,GAAG,SAAS;AAEjD,KAAI,iBAAiB,SACnB,QAAO;AAGT,KAAI,iBAAiB,gBAAgB,QAAQ,mBAC3C,QAAO,GAAG,WAAW,WAAW,UAAU,MAAM,SAAS;AAG3D,QAAO,MACL;EAAE;EAAS;EAAc;EAAc;EAAU,EACjD,+CACD;AACD,QAAO"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
const hashMap = /* @__PURE__ */ new Map();
|
|
3
3
|
hashMap.set("ansible", "1fbc76f78daa14a8c9ab1142e9d1e05c746c0419a9f1455e4279f476590d0c04");
|
|
4
4
|
hashMap.set("ansible-galaxy", "8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f");
|
|
5
|
-
hashMap.set("ant", "
|
|
5
|
+
hashMap.set("ant", "8163eadb2be169a09e26cacd7bd3530741cb0e27397d6743cd1791294f31dba7");
|
|
6
6
|
hashMap.set("argocd", "5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce");
|
|
7
7
|
hashMap.set("asdf", "1f6fcf620e9c6cd35991380cb6eafb94ec60cd77cbd13335ebe3a1d9727416c9");
|
|
8
8
|
hashMap.set("azure-pipelines", "4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796");
|
|
@@ -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','1fbc76f78daa14a8c9ab1142e9d1e05c746c0419a9f1455e4279f476590d0c04');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','27e1e1b4b077554dbc62e54893f2a3a0372228e7afdd2bdc68c6335dc7654c4e');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','1f6fcf620e9c6cd35991380cb6eafb94ec60cd77cbd13335ebe3a1d9727416c9');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','fad98996bea8626525ab925f83a6ae0ce9262c53770e7aa7cb448a1e0f1ddf21');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','c6e0ad88ea468664c3a33263baf7452d83d2d37ff09ba920e18f64ee81fd0acb');\nhashMap.set('bazel-module','ff071fcf8b53036956627d2a430ccdf256e30bee4d7e80c329379879d836a931');\nhashMap.set('bazelisk','b6ec532dfa7c8f82ad4084df864ac6276e87c27285369323902afc146d3537ac');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','1322232bf1d0c4fa796e31a00488453bdcd00d4958431d9e424c1635e60a99bd');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6d7e9d2018ac03e15f19e8b40ef70dd87d509d5affca24bc464d085899880a25');\nhashMap.set('cake','288c3c36a50371b26957fa71992cc335228d53563c75597b36919ac7286e96eb');\nhashMap.set('cargo','308d7ab4c6d24027b050bf659dfab0e510d9a22f8134695a7c68214908ee4634');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','135937d4720718304adb0ba998516f8ce38c3220ccd18b00b8c70c62b45df4da');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','b6ac3b4a6b8a5b32daed37bf695fe177cdb1b4a94ae7f7fb2f4c4c096c0a004c');\nhashMap.set('composer','cdb6895574020cec402e0b878e4078b62f1acfd0392a861cbb523036634f6383');\nhashMap.set('conan','aecc3917d77146db4e57dd12944be1beff860e90b7ebdd2d8fbc449fc1a06574');\nhashMap.set('copier','faa3b79991256a6fc0957fdcd530a1bc8aee65913d5aff2b1b4d226dcd44d008');\nhashMap.set('cpanfile','6a1d67d9c8751123deaf0c7f3ac38a07024e960c140f8228fcbcb93954fdca01');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','bcf5334e8a21190baaa25436acf2f17fbf095504262a4e9ee7c62ffb644eb716');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','322b95f7e55dd78d7fe71306a6f649479eca61c60d75bb10b23604a230dbdd08');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','427e0c1a5b1d8337503a9a568a76532fbde0bab8b355fa8f47312de50eadf2f6');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','fbbf1c7b7b6f4166fa3beee96a3283d007b388e9ecb6a14f76123c8ab8c78071');\nhashMap.set('github-actions','d8f83c65da1e80b639ad44a0d8641e7e97b1d93a1b6c873603333d337ad02011');\nhashMap.set('gitlabci','0dec44dd398bfc5b3c19d0929bea2fef7f386c94acfd1b1d7bc2a31d81d96fd6');\nhashMap.set('gitlabci-include','354cfc4ea327c6d5cd5bee1f17763832efc7f5402e9fd22c579239fccb9c6dab');\nhashMap.set('glasskube','253d6db30bdec75ed5ab5d26f31d69bc07813ba10089a28da12c6a29eff4ec70');\nhashMap.set('gleam','b717a48c525ad6b1d434c6a9db828ddebbb85e94519e89ddc4040878e3600e84');\nhashMap.set('gomod','82e877b22c0dd0217368760bb5d38430657fff63d07c289793a866f0845d2976');\nhashMap.set('gradle','f430d8d768b56889ad1e5a69965841e85cc700e364d15db7bce680e8a5d6f821');\nhashMap.set('gradle-wrapper','90d2ecb9d0b113f8e946d4ea221c040f17f91af846e1ff4f9fc1514ad4324b74');\nhashMap.set('haskell-cabal','d796ec6859e63ab4f1b7030c4016071202c3a44c7c11d4a9131d7e2ba19b396d');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','e5783484b81247279563da3c835afe4002edfc412e13fb91877818ca44ae65f2');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','7724bf6cc3ff4afec1809899f619a332f4350049b9578b5c4634514b4448cf2b');\nhashMap.set('hermit','672c328e4baea3a1ccd2cde2364db01c8033a8c077bf63a5b914fc20ee1de838');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','56ef90301143874355fd2ed25dff7c646875f701f97422d02e01d45608a88f31');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','4b73c32ddc3fe45d9777106d45b116777a2960e6e631256a6553060e602f893c');\nhashMap.set('kotlin-script','99ef296792a0ca575ed31d3defb514b05a58083dc01c52ea0890c69d867ba1dd');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','1e44d6ef8622252dac6d9649fb04badd12d4827eb2a55f74792aa9de2b915775');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','fd6bfc21be851ed076eabea1a91a89b25eb82129734c7cb0c2e684385cf1ea69');\nhashMap.set('maven-wrapper','9a868d1328f911eb72f9e65a64d46c86ae347aab0153d1cf4e9a62ad9e0d6cb0');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','b816a49c8525716454d0a2bc9127916d5b27e5cca7b2aa2030312f218942af3e');\nhashMap.set('mise','38177382f3785cfe7cce92994bfb429b68f5165e6eef1bdcd2c7a3d8d5414da2');\nhashMap.set('mix','1116e1adf1c18c866f0a9e6fa065c4fb9da055d8d150e625344899bb94095481');\nhashMap.set('nix','f3ffec2f14e7261de8068895b91392e992dcef208fbaf52110d6862e4712c031');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','eaf9fe4981de8f7504227f3be88445f60f87ba74f9b9c7e54284bc2bb41320b3');\nhashMap.set('nuget','42175b1906e8e91ae0731a13d92d0df065108063665f8a36150aeae73aafdc78');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','f503497a4adef31b29572176e9a69d52fa9b0bfe3477b6e228c906aeb4861de5');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','89152ad6c89f278395f32d289dc3890823c233366547d228e97dd1319aa144b5');\nhashMap.set('pip_requirements','d5c474c524bc7adc1aae065da0531bd22d9f7f52523b018f2461f6c29e12fdf3');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','50f5a54ed714fd3d738c1aa9a353cf3aab767899acdcb763088d4bd04f3a737b');\nhashMap.set('pixi','b17af6eaa33e7babcc52cfc9a617c7801c0efb1125bbd6d0d4e9f6fe33afd353');\nhashMap.set('poetry','7f227b8b912b405df7735e9dc7c178f03021844f0c027d4b321c023c330c390a');\nhashMap.set('pre-commit','a6a6e847fdb0f56650e66ef7d69e68de752b390913f79ac31d1a7ec5955d03da');\nhashMap.set('pub','0fbad9f77579fcec3a623c6feab56e71934c67a79bb8f4f0f847452051d2a0ba');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e355e13e104351a8b3516a8e272fc5f7e625c9f39b0c492ba27283a36227c2d4');\nhashMap.set('renovate-config-presets','a394fe55f8b6ba356f29f76efd9f0d34b56baceb111e6d92f95b29b5ca50ac67');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('sbt','74125bd9c76a5724092258cd1dee1ea99fc0d735b463a2b64fedc5d950efde2a');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('sveltos','167a5cc79098803be3b815a28cc40ef3361c455751e1d6a7a99ba91bfce26709');\nhashMap.set('swift','79ec9a6a2a8bb4853bb78bbb3a2a6e64e3b32b0ddeb312385abb3a14366ad505');\nhashMap.set('tekton','4e35c75bba4abc9c3cf49c55da6c19db4f4e9181d1fd9583288ab55ef7c944fd');\nhashMap.set('terraform','5bd62ce12c23896b8ecb2385a60a3cb9eb72badf10f9984bfed38f50f9262266');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','b8474c65383a702602eee432cc1434f9a49a1ef886d1213de92d7a84fb98b9cd');\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','4627230d3b7698c41aac192d57b65b091c860c8f858c89d6af4b06ed6a32fae6');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('jsonata','3b5f465b586993f92c8490e70885e7eecce9b6556bcc376dd9c11db8ee9e6960');\nhashMap.set('regex','7b643b49e498465cf91b25b8b840bb1fec8c8a3a59bfa8f97a39c976675325a0');"],"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','1fbc76f78daa14a8c9ab1142e9d1e05c746c0419a9f1455e4279f476590d0c04');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','8163eadb2be169a09e26cacd7bd3530741cb0e27397d6743cd1791294f31dba7');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','1f6fcf620e9c6cd35991380cb6eafb94ec60cd77cbd13335ebe3a1d9727416c9');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','fad98996bea8626525ab925f83a6ae0ce9262c53770e7aa7cb448a1e0f1ddf21');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','c6e0ad88ea468664c3a33263baf7452d83d2d37ff09ba920e18f64ee81fd0acb');\nhashMap.set('bazel-module','ff071fcf8b53036956627d2a430ccdf256e30bee4d7e80c329379879d836a931');\nhashMap.set('bazelisk','b6ec532dfa7c8f82ad4084df864ac6276e87c27285369323902afc146d3537ac');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','1322232bf1d0c4fa796e31a00488453bdcd00d4958431d9e424c1635e60a99bd');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6d7e9d2018ac03e15f19e8b40ef70dd87d509d5affca24bc464d085899880a25');\nhashMap.set('cake','288c3c36a50371b26957fa71992cc335228d53563c75597b36919ac7286e96eb');\nhashMap.set('cargo','308d7ab4c6d24027b050bf659dfab0e510d9a22f8134695a7c68214908ee4634');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','135937d4720718304adb0ba998516f8ce38c3220ccd18b00b8c70c62b45df4da');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','b6ac3b4a6b8a5b32daed37bf695fe177cdb1b4a94ae7f7fb2f4c4c096c0a004c');\nhashMap.set('composer','cdb6895574020cec402e0b878e4078b62f1acfd0392a861cbb523036634f6383');\nhashMap.set('conan','aecc3917d77146db4e57dd12944be1beff860e90b7ebdd2d8fbc449fc1a06574');\nhashMap.set('copier','faa3b79991256a6fc0957fdcd530a1bc8aee65913d5aff2b1b4d226dcd44d008');\nhashMap.set('cpanfile','6a1d67d9c8751123deaf0c7f3ac38a07024e960c140f8228fcbcb93954fdca01');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','bcf5334e8a21190baaa25436acf2f17fbf095504262a4e9ee7c62ffb644eb716');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','322b95f7e55dd78d7fe71306a6f649479eca61c60d75bb10b23604a230dbdd08');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','427e0c1a5b1d8337503a9a568a76532fbde0bab8b355fa8f47312de50eadf2f6');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','fbbf1c7b7b6f4166fa3beee96a3283d007b388e9ecb6a14f76123c8ab8c78071');\nhashMap.set('github-actions','d8f83c65da1e80b639ad44a0d8641e7e97b1d93a1b6c873603333d337ad02011');\nhashMap.set('gitlabci','0dec44dd398bfc5b3c19d0929bea2fef7f386c94acfd1b1d7bc2a31d81d96fd6');\nhashMap.set('gitlabci-include','354cfc4ea327c6d5cd5bee1f17763832efc7f5402e9fd22c579239fccb9c6dab');\nhashMap.set('glasskube','253d6db30bdec75ed5ab5d26f31d69bc07813ba10089a28da12c6a29eff4ec70');\nhashMap.set('gleam','b717a48c525ad6b1d434c6a9db828ddebbb85e94519e89ddc4040878e3600e84');\nhashMap.set('gomod','82e877b22c0dd0217368760bb5d38430657fff63d07c289793a866f0845d2976');\nhashMap.set('gradle','f430d8d768b56889ad1e5a69965841e85cc700e364d15db7bce680e8a5d6f821');\nhashMap.set('gradle-wrapper','90d2ecb9d0b113f8e946d4ea221c040f17f91af846e1ff4f9fc1514ad4324b74');\nhashMap.set('haskell-cabal','d796ec6859e63ab4f1b7030c4016071202c3a44c7c11d4a9131d7e2ba19b396d');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','e5783484b81247279563da3c835afe4002edfc412e13fb91877818ca44ae65f2');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','7724bf6cc3ff4afec1809899f619a332f4350049b9578b5c4634514b4448cf2b');\nhashMap.set('hermit','672c328e4baea3a1ccd2cde2364db01c8033a8c077bf63a5b914fc20ee1de838');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','56ef90301143874355fd2ed25dff7c646875f701f97422d02e01d45608a88f31');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','4b73c32ddc3fe45d9777106d45b116777a2960e6e631256a6553060e602f893c');\nhashMap.set('kotlin-script','99ef296792a0ca575ed31d3defb514b05a58083dc01c52ea0890c69d867ba1dd');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','1e44d6ef8622252dac6d9649fb04badd12d4827eb2a55f74792aa9de2b915775');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','fd6bfc21be851ed076eabea1a91a89b25eb82129734c7cb0c2e684385cf1ea69');\nhashMap.set('maven-wrapper','9a868d1328f911eb72f9e65a64d46c86ae347aab0153d1cf4e9a62ad9e0d6cb0');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','b816a49c8525716454d0a2bc9127916d5b27e5cca7b2aa2030312f218942af3e');\nhashMap.set('mise','38177382f3785cfe7cce92994bfb429b68f5165e6eef1bdcd2c7a3d8d5414da2');\nhashMap.set('mix','1116e1adf1c18c866f0a9e6fa065c4fb9da055d8d150e625344899bb94095481');\nhashMap.set('nix','f3ffec2f14e7261de8068895b91392e992dcef208fbaf52110d6862e4712c031');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','eaf9fe4981de8f7504227f3be88445f60f87ba74f9b9c7e54284bc2bb41320b3');\nhashMap.set('nuget','42175b1906e8e91ae0731a13d92d0df065108063665f8a36150aeae73aafdc78');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','f503497a4adef31b29572176e9a69d52fa9b0bfe3477b6e228c906aeb4861de5');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','89152ad6c89f278395f32d289dc3890823c233366547d228e97dd1319aa144b5');\nhashMap.set('pip_requirements','d5c474c524bc7adc1aae065da0531bd22d9f7f52523b018f2461f6c29e12fdf3');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','50f5a54ed714fd3d738c1aa9a353cf3aab767899acdcb763088d4bd04f3a737b');\nhashMap.set('pixi','b17af6eaa33e7babcc52cfc9a617c7801c0efb1125bbd6d0d4e9f6fe33afd353');\nhashMap.set('poetry','7f227b8b912b405df7735e9dc7c178f03021844f0c027d4b321c023c330c390a');\nhashMap.set('pre-commit','a6a6e847fdb0f56650e66ef7d69e68de752b390913f79ac31d1a7ec5955d03da');\nhashMap.set('pub','0fbad9f77579fcec3a623c6feab56e71934c67a79bb8f4f0f847452051d2a0ba');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e355e13e104351a8b3516a8e272fc5f7e625c9f39b0c492ba27283a36227c2d4');\nhashMap.set('renovate-config-presets','a394fe55f8b6ba356f29f76efd9f0d34b56baceb111e6d92f95b29b5ca50ac67');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('sbt','74125bd9c76a5724092258cd1dee1ea99fc0d735b463a2b64fedc5d950efde2a');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('sveltos','167a5cc79098803be3b815a28cc40ef3361c455751e1d6a7a99ba91bfce26709');\nhashMap.set('swift','79ec9a6a2a8bb4853bb78bbb3a2a6e64e3b32b0ddeb312385abb3a14366ad505');\nhashMap.set('tekton','4e35c75bba4abc9c3cf49c55da6c19db4f4e9181d1fd9583288ab55ef7c944fd');\nhashMap.set('terraform','5bd62ce12c23896b8ecb2385a60a3cb9eb72badf10f9984bfed38f50f9262266');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','b8474c65383a702602eee432cc1434f9a49a1ef886d1213de92d7a84fb98b9cd');\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','4627230d3b7698c41aac192d57b65b091c860c8f858c89d6af4b06ed6a32fae6');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('jsonata','3b5f465b586993f92c8490e70885e7eecce9b6556bcc376dd9c11db8ee9e6960');\nhashMap.set('regex','7b643b49e498465cf91b25b8b840bb1fec8c8a3a59bfa8f97a39c976675325a0');"],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ declare const GithubVulnerabilityAlerts: z.ZodEffects<z.ZodEffects<z.ZodArray<z.
|
|
|
26
26
|
security_vulnerability: {
|
|
27
27
|
severity: "low" | "medium" | "high" | "critical";
|
|
28
28
|
package: {
|
|
29
|
-
ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "
|
|
29
|
+
ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "nuget" | "actions" | "pip" | "rubygems";
|
|
30
30
|
name: string;
|
|
31
31
|
};
|
|
32
32
|
vulnerable_version_range: string;
|
|
@@ -63,7 +63,7 @@ declare const GithubVulnerabilityAlerts: z.ZodEffects<z.ZodEffects<z.ZodArray<z.
|
|
|
63
63
|
security_vulnerability: {
|
|
64
64
|
severity: "low" | "medium" | "high" | "critical";
|
|
65
65
|
package: {
|
|
66
|
-
ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "
|
|
66
|
+
ecosystem: "composer" | "maven" | "npm" | "rust" | "go" | "nuget" | "actions" | "pip" | "rubygems";
|
|
67
67
|
name: string;
|
|
68
68
|
};
|
|
69
69
|
vulnerable_version_range: string;
|
|
@@ -36,7 +36,6 @@ var PackageCacheFile = class PackageCacheFile extends PackageCacheBase {
|
|
|
36
36
|
key
|
|
37
37
|
}, "Returning cached value");
|
|
38
38
|
this.expiryMap.set(this.getKey(namespace, key), expiry);
|
|
39
|
-
if (!cached.compress) return cached.value;
|
|
40
39
|
const json = await decompressFromBase64(cached.value);
|
|
41
40
|
return JSON.parse(json);
|
|
42
41
|
} catch {
|
|
@@ -55,7 +54,6 @@ var PackageCacheFile = class PackageCacheFile extends PackageCacheBase {
|
|
|
55
54
|
const compressedValue = await compressToBase64(JSON.stringify(value));
|
|
56
55
|
const expiry = DateTime.local().plus({ minutes: hardTtlMinutes });
|
|
57
56
|
const payload = JSON.stringify({
|
|
58
|
-
compress: true,
|
|
59
57
|
value: compressedValue,
|
|
60
58
|
expiry
|
|
61
59
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.js","names":[],"sources":["../../../../../lib/util/cache/package/impl/file.ts"],"sourcesContent":["import cacache from 'cacache';\nimport { LRUCache } from 'lru-cache';\nimport { DateTime } from 'luxon';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { compressToBase64, decompressFromBase64 } from '../../../compress.ts';\nimport type { PackageCacheNamespace } from '../types.ts';\nimport { PackageCacheBase } from './base.ts';\n\nexport class PackageCacheFile extends PackageCacheBase {\n static create(cacheDir: string): PackageCacheFile {\n const cacheFileName = upath.join(cacheDir, '/renovate/renovate-cache-v1');\n logger.debug(`Initializing Renovate internal cache into ${cacheFileName}`);\n return new PackageCacheFile(cacheFileName);\n }\n\n private readonly cacheFileName: string;\n\n private readonly expiryMap = new LRUCache<string, DateTime>({\n // Assuming 50 bytes per entry, this limits the memory footprint of this\n // to around 5MB.\n max: 100000,\n });\n\n private constructor(cacheFileName: string) {\n super();\n this.cacheFileName = cacheFileName;\n }\n\n private getKey(namespace: PackageCacheNamespace, key: string): string {\n return `${namespace}-${key}`;\n }\n\n override async get<T = unknown>(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<T | undefined> {\n try {\n const entry = await cacache.get(\n this.cacheFileName,\n this.getKey(namespace, key),\n );\n const raw = entry.data.toString();\n const cached = JSON.parse(raw);\n\n if (!cached) {\n return undefined;\n }\n\n const expiry = DateTime.fromISO(cached.expiry);\n if (!expiry.isValid || DateTime.local() >= expiry) {\n await this.rm(namespace, key);\n return undefined;\n }\n\n logger.trace({ namespace, key }, 'Returning cached value');\n this.expiryMap.set(this.getKey(namespace, key), expiry);\n\n
|
|
1
|
+
{"version":3,"file":"file.js","names":[],"sources":["../../../../../lib/util/cache/package/impl/file.ts"],"sourcesContent":["import cacache from 'cacache';\nimport { LRUCache } from 'lru-cache';\nimport { DateTime } from 'luxon';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { compressToBase64, decompressFromBase64 } from '../../../compress.ts';\nimport type { PackageCacheNamespace } from '../types.ts';\nimport { PackageCacheBase } from './base.ts';\n\nexport class PackageCacheFile extends PackageCacheBase {\n static create(cacheDir: string): PackageCacheFile {\n const cacheFileName = upath.join(cacheDir, '/renovate/renovate-cache-v1');\n logger.debug(`Initializing Renovate internal cache into ${cacheFileName}`);\n return new PackageCacheFile(cacheFileName);\n }\n\n private readonly cacheFileName: string;\n\n private readonly expiryMap = new LRUCache<string, DateTime>({\n // Assuming 50 bytes per entry, this limits the memory footprint of this\n // to around 5MB.\n max: 100000,\n });\n\n private constructor(cacheFileName: string) {\n super();\n this.cacheFileName = cacheFileName;\n }\n\n private getKey(namespace: PackageCacheNamespace, key: string): string {\n return `${namespace}-${key}`;\n }\n\n override async get<T = unknown>(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<T | undefined> {\n try {\n const entry = await cacache.get(\n this.cacheFileName,\n this.getKey(namespace, key),\n );\n const raw = entry.data.toString();\n const cached = JSON.parse(raw);\n\n if (!cached) {\n return undefined;\n }\n\n const expiry = DateTime.fromISO(cached.expiry);\n if (!expiry.isValid || DateTime.local() >= expiry) {\n await this.rm(namespace, key);\n return undefined;\n }\n\n logger.trace({ namespace, key }, 'Returning cached value');\n this.expiryMap.set(this.getKey(namespace, key), expiry);\n\n const json = await decompressFromBase64(cached.value);\n return JSON.parse(json);\n } catch {\n logger.trace({ namespace, key }, 'Cache miss');\n }\n return undefined;\n }\n\n override async set(\n namespace: PackageCacheNamespace,\n key: string,\n value: unknown,\n hardTtlMinutes: number,\n ): Promise<void> {\n logger.trace({ namespace, key, hardTtlMinutes }, 'Saving cached value');\n const serialized = JSON.stringify(value);\n const compressedValue = await compressToBase64(serialized);\n const expiry = DateTime.local().plus({ minutes: hardTtlMinutes });\n const payload = JSON.stringify({\n value: compressedValue,\n expiry,\n });\n await cacache.put(this.cacheFileName, this.getKey(namespace, key), payload);\n this.expiryMap.set(this.getKey(namespace, key), expiry);\n }\n\n override async destroy(): Promise<void> {\n logger.debug('Checking file package cache for expired items');\n let totalCount = 0;\n let deletedCount = 0;\n let errorCount = 0;\n const startTime = Date.now();\n for await (const item of cacache.ls.stream(this.cacheFileName)) {\n try {\n totalCount += 1;\n const cacheEntry = item as unknown as cacache.CacheObject;\n const cachedExpiry = this.expiryMap.get(cacheEntry.key);\n if (cachedExpiry !== undefined) {\n if (DateTime.local() <= cachedExpiry) {\n continue;\n }\n await cacache.rm.entry(this.cacheFileName, cacheEntry.key);\n await cacache.rm.content(this.cacheFileName, cacheEntry.integrity);\n this.expiryMap.delete(cacheEntry.key);\n deletedCount += 1;\n continue;\n }\n const entry = await cacache.get(this.cacheFileName, cacheEntry.key);\n let cached: { expiry?: string } | undefined;\n try {\n const raw = entry.data.toString();\n cached = JSON.parse(raw);\n } catch {\n logger.debug('Error parsing cached value - deleting');\n }\n\n if (cached) {\n if (!cached.expiry) {\n continue;\n }\n const expiry = DateTime.fromISO(cached.expiry);\n if (expiry.isValid && DateTime.local() <= expiry) {\n continue;\n }\n }\n\n await cacache.rm.entry(this.cacheFileName, cacheEntry.key);\n await cacache.rm.content(this.cacheFileName, cacheEntry.integrity);\n deletedCount += 1;\n } catch (err) {\n logger.trace({ err }, 'Error cleaning up cache entry');\n errorCount += 1;\n }\n }\n if (errorCount > 0) {\n logger.debug(`Error count cleaning up cache: ${errorCount}`);\n }\n const durationMs = Date.now() - startTime;\n logger.debug(\n `Deleted ${deletedCount} of ${totalCount} file cached entries in ${durationMs}ms`,\n );\n }\n\n private async rm(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<void> {\n logger.trace({ namespace, key }, 'Removing cache entry');\n await cacache.rm.entry(this.cacheFileName, this.getKey(namespace, key));\n }\n}\n"],"mappings":"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"}
|
|
@@ -61,7 +61,6 @@ var PackageCacheRedis = class PackageCacheRedis extends PackageCacheBase {
|
|
|
61
61
|
namespace,
|
|
62
62
|
key
|
|
63
63
|
}, "Returning cached value");
|
|
64
|
-
if (!cached.compress) return cached.value;
|
|
65
64
|
const json = await decompressFromBase64(cached.value);
|
|
66
65
|
return JSON.parse(json);
|
|
67
66
|
} catch {
|
|
@@ -88,7 +87,6 @@ var PackageCacheRedis = class PackageCacheRedis extends PackageCacheBase {
|
|
|
88
87
|
const compressedValue = await compressToBase64(JSON.stringify(value));
|
|
89
88
|
const expiry = DateTime.local().plus({ minutes: hardTtlMinutes });
|
|
90
89
|
const payload = JSON.stringify({
|
|
91
|
-
compress: true,
|
|
92
90
|
value: compressedValue,
|
|
93
91
|
expiry
|
|
94
92
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis.js","names":[],"sources":["../../../../../lib/util/cache/package/impl/redis.ts"],"sourcesContent":["import type { RedisClusterOptions } from '@redis/client';\nimport { createClient, createCluster } from '@redis/client';\nimport { DateTime } from 'luxon';\nimport { logger } from '../../../../logger/index.ts';\nimport { compressToBase64, decompressFromBase64 } from '../../../compress.ts';\nimport { regEx } from '../../../regex.ts';\nimport { parseUrl } from '../../../url.ts';\nimport type { PackageCacheNamespace } from '../types.ts';\nimport { PackageCacheBase } from './base.ts';\n\nexport function normalizeRedisUrl(url: string): string {\n return url.replace(regEx(/^(rediss?)\\+cluster:\\/\\//), '$1://');\n}\n\ntype RedisClient =\n | ReturnType<typeof createClient>\n | ReturnType<typeof createCluster>;\n\nexport class PackageCacheRedis extends PackageCacheBase {\n static async create(\n url: string,\n prefix: string | undefined,\n ): Promise<PackageCacheRedis> {\n const rprefix = prefix ?? '';\n logger.debug('Redis cache init');\n\n const rewrittenUrl = normalizeRedisUrl(url);\n const clusteredMode = rewrittenUrl !== url;\n\n const config = {\n url: rewrittenUrl,\n socket: {\n reconnectStrategy: (retries: number) => Math.min(retries * 100, 3000),\n },\n pingInterval: 30000,\n };\n\n let client: RedisClient;\n\n if (clusteredMode) {\n const clusterConfig: RedisClusterOptions = { rootNodes: [config] };\n\n const parsedUrl = parseUrl(rewrittenUrl);\n if (parsedUrl?.username) {\n clusterConfig.defaults = {\n username: parsedUrl.username,\n };\n }\n\n if (parsedUrl?.password) {\n clusterConfig.defaults ??= {};\n clusterConfig.defaults.password = parsedUrl.password;\n }\n\n client = createCluster(clusterConfig);\n } else {\n client = createClient(config);\n }\n\n await client.connect();\n logger.debug('Redis cache connected');\n return new PackageCacheRedis(client, rprefix);\n }\n\n private readonly client: RedisClient;\n private readonly rprefix: string;\n\n private constructor(client: RedisClient, rprefix: string) {\n super();\n this.client = client;\n this.rprefix = rprefix;\n }\n\n private getKey(namespace: PackageCacheNamespace, key: string): string {\n return `${this.rprefix}${namespace}-${key}`;\n }\n\n override async get<T = unknown>(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<T | undefined> {\n logger.trace(`cache.get(${namespace}, ${key})`);\n try {\n const raw = await this.client.get(this.getKey(namespace, key));\n if (!raw) {\n return undefined;\n }\n\n const cached = JSON.parse(raw);\n\n const expiry = DateTime.fromISO(cached.expiry);\n if (!expiry.isValid || DateTime.local() >= expiry) {\n await this.rm(namespace, key);\n return undefined;\n }\n\n logger.trace(\n { rprefix: this.rprefix, namespace, key },\n 'Returning cached value',\n );\n\n
|
|
1
|
+
{"version":3,"file":"redis.js","names":[],"sources":["../../../../../lib/util/cache/package/impl/redis.ts"],"sourcesContent":["import type { RedisClusterOptions } from '@redis/client';\nimport { createClient, createCluster } from '@redis/client';\nimport { DateTime } from 'luxon';\nimport { logger } from '../../../../logger/index.ts';\nimport { compressToBase64, decompressFromBase64 } from '../../../compress.ts';\nimport { regEx } from '../../../regex.ts';\nimport { parseUrl } from '../../../url.ts';\nimport type { PackageCacheNamespace } from '../types.ts';\nimport { PackageCacheBase } from './base.ts';\n\nexport function normalizeRedisUrl(url: string): string {\n return url.replace(regEx(/^(rediss?)\\+cluster:\\/\\//), '$1://');\n}\n\ntype RedisClient =\n | ReturnType<typeof createClient>\n | ReturnType<typeof createCluster>;\n\nexport class PackageCacheRedis extends PackageCacheBase {\n static async create(\n url: string,\n prefix: string | undefined,\n ): Promise<PackageCacheRedis> {\n const rprefix = prefix ?? '';\n logger.debug('Redis cache init');\n\n const rewrittenUrl = normalizeRedisUrl(url);\n const clusteredMode = rewrittenUrl !== url;\n\n const config = {\n url: rewrittenUrl,\n socket: {\n reconnectStrategy: (retries: number) => Math.min(retries * 100, 3000),\n },\n pingInterval: 30000,\n };\n\n let client: RedisClient;\n\n if (clusteredMode) {\n const clusterConfig: RedisClusterOptions = { rootNodes: [config] };\n\n const parsedUrl = parseUrl(rewrittenUrl);\n if (parsedUrl?.username) {\n clusterConfig.defaults = {\n username: parsedUrl.username,\n };\n }\n\n if (parsedUrl?.password) {\n clusterConfig.defaults ??= {};\n clusterConfig.defaults.password = parsedUrl.password;\n }\n\n client = createCluster(clusterConfig);\n } else {\n client = createClient(config);\n }\n\n await client.connect();\n logger.debug('Redis cache connected');\n return new PackageCacheRedis(client, rprefix);\n }\n\n private readonly client: RedisClient;\n private readonly rprefix: string;\n\n private constructor(client: RedisClient, rprefix: string) {\n super();\n this.client = client;\n this.rprefix = rprefix;\n }\n\n private getKey(namespace: PackageCacheNamespace, key: string): string {\n return `${this.rprefix}${namespace}-${key}`;\n }\n\n override async get<T = unknown>(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<T | undefined> {\n logger.trace(`cache.get(${namespace}, ${key})`);\n try {\n const raw = await this.client.get(this.getKey(namespace, key));\n if (!raw) {\n return undefined;\n }\n\n const cached = JSON.parse(raw);\n\n const expiry = DateTime.fromISO(cached.expiry);\n if (!expiry.isValid || DateTime.local() >= expiry) {\n await this.rm(namespace, key);\n return undefined;\n }\n\n logger.trace(\n { rprefix: this.rprefix, namespace, key },\n 'Returning cached value',\n );\n\n const json = await decompressFromBase64(cached.value);\n return JSON.parse(json);\n } catch {\n logger.trace({ rprefix: this.rprefix, namespace, key }, 'Cache miss');\n }\n return undefined;\n }\n\n override async set(\n namespace: PackageCacheNamespace,\n key: string,\n value: unknown,\n hardTtlMinutes: number,\n ): Promise<void> {\n logger.trace(\n { rprefix: this.rprefix, namespace, key, hardTtlMinutes },\n 'Saving cached value',\n );\n\n const ttlSeconds = Math.floor(hardTtlMinutes * 60);\n\n try {\n if (ttlSeconds <= 0) {\n await this.rm(namespace, key);\n return;\n }\n\n const serialized = JSON.stringify(value);\n const compressedValue = await compressToBase64(serialized);\n const expiry = DateTime.local().plus({ minutes: hardTtlMinutes });\n const payload = JSON.stringify({\n value: compressedValue,\n expiry,\n });\n await this.client.set(this.getKey(namespace, key), payload, {\n EX: ttlSeconds,\n });\n } catch (err) {\n logger.once.warn({ err }, 'Error while setting Redis cache value');\n }\n }\n\n override destroy(): Promise<void> {\n try {\n // https://github.com/redis/node-redis#disconnecting\n this.client.destroy();\n } catch (err) {\n logger.warn({ err }, 'Redis cache destroy failed');\n }\n return Promise.resolve();\n }\n\n private async rm(\n namespace: PackageCacheNamespace,\n key: string,\n ): Promise<void> {\n logger.trace(\n { rprefix: this.rprefix, namespace, key },\n 'Removing cache entry',\n );\n await this.client.del(this.getKey(namespace, key));\n }\n}\n"],"mappings":"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"}
|
package/dist/util/git/index.js
CHANGED
|
@@ -136,7 +136,9 @@ async function fetchBranchCommits(preferUpstream = true) {
|
|
|
136
136
|
"--heads",
|
|
137
137
|
url
|
|
138
138
|
];
|
|
139
|
-
|
|
139
|
+
const localDir = GlobalConfig.get("localDir");
|
|
140
|
+
const repoExists = await fs.pathExists(upath.join(localDir, ".git/HEAD"));
|
|
141
|
+
if (config.extraCloneOpts && !repoExists) Object.entries(config.extraCloneOpts).forEach((e) => opts.unshift(e[0], `${e[1]}`));
|
|
140
142
|
try {
|
|
141
143
|
const lsRemoteRes = await gitRetry(() => git.raw(opts));
|
|
142
144
|
logger.trace({ lsRemoteRes }, "git ls-remote result");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../lib/util/git/index.ts"],"sourcesContent":["import 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 { Options, TaskOptions } from 'simple-git';\nimport { ResetMode, simpleGit } from 'simple-git';\nimport { setTimeout } from 'timers/promises';\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 { getChildEnv } from '../exec/utils.ts';\nimport { newlineRegex, regEx } from '../regex.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 LocalConfig,\n LongCommitSha,\n PushFilesConfig,\n StatusResult,\n StorageConfig,\n TreeItem,\n} from './types.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\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(simpleGit());\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 if (config.extraCloneOpts) {\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 sha as LongCommitSha;\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 // TODO: safe to pass all env variables? use `getChildEnv` instead?\n git = instrumentGit(\n simpleGit(GlobalConfig.get('localDir'), simpleGitConfig()).env({\n ...getEnv(),\n LANG: 'C.UTF-8',\n LC_ALL: 'C.UTF-8',\n }),\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 function (): 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 = (\n await git.raw(['rev-parse', 'HEAD'])\n ).trim() as LongCommitSha;\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 = (\n await git.revparse('HEAD')\n ).trim() as LongCommitSha;\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 try {\n return await getCommitDate(branchSha);\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 = (\n await git.raw(['rev-parse', 'HEAD'])\n ).trim() as LongCommitSha;\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 = (\n await git.revparse('HEAD')\n ).trim() as LongCommitSha;\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(branchName: string): Promise<void> {\n await syncGit();\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 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(refSpecToMerge: 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([\n '-B',\n config.currentBranch,\n 'origin/' + config.currentBranch,\n ]),\n );\n status = await git.status();\n await fetchRevSpec(refSpecToMerge);\n await gitRetry(() => git.merge(['FETCH_HEAD']));\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 = (\n await git.revparse([branchName])\n ).trim() as LongCommitSha;\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 = (await git.revparse([branchName])).trim() as LongCommitSha;\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 treeItemRegex = regEx(\n /^(?<mode>\\d{6})\\s+(?<type>blob|tree|commit)\\s+(?<sha>[0-9a-f]{40})\\s+(?<path>.*)$/,\n);\n\nconst treeShaRegex = regEx(/tree\\s+(?<treeSha>[0-9a-f]{40})\\s*/);\n\n/**\n *\n * Obtain top-level items of commit tree.\n * We don't need subtree items, so here are 2 steps only.\n *\n * Step 1: commit SHA -> tree SHA\n *\n * $ git cat-file -p <commit-sha>\n *\n * > tree <tree-sha>\n * > parent 59b8b0e79319b7dc38f7a29d618628f3b44c2fd7\n * > ...\n *\n * Step 2: tree SHA -> tree items (top-level)\n *\n * $ git cat-file -p <tree-sha>\n *\n * > 040000 tree 389400684d1f004960addc752be13097fe85d776 src\n * > ...\n * > 100644 blob 7d2edde437ad4e7bceb70dbfe70e93350d99c98b package.json\n *\n */\nexport async function listCommitTree(\n commitSha: LongCommitSha,\n): Promise<TreeItem[]> {\n const commitOutput = await git.catFile(['-p', commitSha]);\n /* v8 ignore next -- will never happen */\n const { treeSha } = treeShaRegex.exec(commitOutput)?.groups ?? {};\n const contents = await git.catFile(['-p', treeSha]);\n const lines = contents.split(newlineRegex);\n const result: TreeItem[] = [];\n for (const line of lines) {\n const matchGroups = treeItemRegex.exec(line)?.groups;\n if (matchGroups) {\n const { path, mode, type, sha } = matchGroups;\n result.push({ path, mode, type, sha: sha as LongCommitSha });\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 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 { Options, TaskOptions } from 'simple-git';\nimport { ResetMode, simpleGit } from 'simple-git';\nimport { setTimeout } from 'timers/promises';\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 { getChildEnv } from '../exec/utils.ts';\nimport { newlineRegex, regEx } from '../regex.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 LocalConfig,\n LongCommitSha,\n PushFilesConfig,\n StatusResult,\n StorageConfig,\n TreeItem,\n} from './types.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\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(simpleGit());\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 sha as LongCommitSha;\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 // TODO: safe to pass all env variables? use `getChildEnv` instead?\n git = instrumentGit(\n simpleGit(GlobalConfig.get('localDir'), simpleGitConfig()).env({\n ...getEnv(),\n LANG: 'C.UTF-8',\n LC_ALL: 'C.UTF-8',\n }),\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 function (): 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 = (\n await git.raw(['rev-parse', 'HEAD'])\n ).trim() as LongCommitSha;\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 = (\n await git.revparse('HEAD')\n ).trim() as LongCommitSha;\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 try {\n return await getCommitDate(branchSha);\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 = (\n await git.raw(['rev-parse', 'HEAD'])\n ).trim() as LongCommitSha;\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 = (\n await git.revparse('HEAD')\n ).trim() as LongCommitSha;\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(branchName: string): Promise<void> {\n await syncGit();\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 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(refSpecToMerge: 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([\n '-B',\n config.currentBranch,\n 'origin/' + config.currentBranch,\n ]),\n );\n status = await git.status();\n await fetchRevSpec(refSpecToMerge);\n await gitRetry(() => git.merge(['FETCH_HEAD']));\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 = (\n await git.revparse([branchName])\n ).trim() as LongCommitSha;\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 = (await git.revparse([branchName])).trim() as LongCommitSha;\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 treeItemRegex = regEx(\n /^(?<mode>\\d{6})\\s+(?<type>blob|tree|commit)\\s+(?<sha>[0-9a-f]{40})\\s+(?<path>.*)$/,\n);\n\nconst treeShaRegex = regEx(/tree\\s+(?<treeSha>[0-9a-f]{40})\\s*/);\n\n/**\n *\n * Obtain top-level items of commit tree.\n * We don't need subtree items, so here are 2 steps only.\n *\n * Step 1: commit SHA -> tree SHA\n *\n * $ git cat-file -p <commit-sha>\n *\n * > tree <tree-sha>\n * > parent 59b8b0e79319b7dc38f7a29d618628f3b44c2fd7\n * > ...\n *\n * Step 2: tree SHA -> tree items (top-level)\n *\n * $ git cat-file -p <tree-sha>\n *\n * > 040000 tree 389400684d1f004960addc752be13097fe85d776 src\n * > ...\n * > 100644 blob 7d2edde437ad4e7bceb70dbfe70e93350d99c98b package.json\n *\n */\nexport async function listCommitTree(\n commitSha: LongCommitSha,\n): Promise<TreeItem[]> {\n const commitOutput = await git.catFile(['-p', commitSha]);\n /* v8 ignore next -- will never happen */\n const { treeSha } = treeShaRegex.exec(commitOutput)?.groups ?? {};\n const contents = await git.catFile(['-p', treeSha]);\n const lines = contents.split(newlineRegex);\n const result: TreeItem[] = [];\n for (const line of lines) {\n const matchGroups = treeItemRegex.exec(line)?.groups;\n if (matchGroups) {\n const { path, mode, type, sha } = matchGroups;\n result.push({ path, mode, type, sha: sha as LongCommitSha });\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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"}
|
|
@@ -81,7 +81,7 @@ async function ensurePr(prConfig) {
|
|
|
81
81
|
if (existingPr.bodyStruct?.rebaseRequested) logger.debug("PR rebase requested, so skipping cache check");
|
|
82
82
|
else if (prCache) {
|
|
83
83
|
logger.trace({ prCache }, "Found existing PR cache");
|
|
84
|
-
if (validatePrCache(prCache, prBodyFingerprint)) return {
|
|
84
|
+
if (validatePrCache(prCache, prBodyFingerprint) && !config.autoApprove) return {
|
|
85
85
|
type: "with-pr",
|
|
86
86
|
pr: existingPr
|
|
87
87
|
};
|
|
@@ -208,7 +208,7 @@ async function ensurePr(prConfig) {
|
|
|
208
208
|
const prCurrentLabels = existingPr.labels;
|
|
209
209
|
const configuredLabels = prepareLabels(config);
|
|
210
210
|
const labelsNeedUpdate = shouldUpdateLabels(prInitialLabels, prCurrentLabels, configuredLabels);
|
|
211
|
-
if (existingPr?.targetBranch === config.baseBranch && existingPrTitle === newPrTitle && existingPrBodyHash === newPrBodyHash && !labelsNeedUpdate) {
|
|
211
|
+
if (existingPr?.targetBranch === config.baseBranch && existingPrTitle === newPrTitle && existingPrBodyHash === newPrBodyHash && !labelsNeedUpdate && !config.autoApprove) {
|
|
212
212
|
setPrCache(branchName, prBodyFingerprint, false);
|
|
213
213
|
logger.debug(`Pull Request #${existingPr.number} does not need updating`);
|
|
214
214
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/workers/repository/update/pr/index.ts"],"sourcesContent":["import { isArray, isNonEmptyArray, isNumber } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport {\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n} from '../../../../constants/error-messages.ts';\nimport { pkg } from '../../../../expose.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { ensureComment } from '../../../../modules/platform/comment.ts';\nimport type {\n PlatformPrOptions,\n Pr,\n PrDebugData,\n UpdatePrConfig,\n} from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport {\n getPrBodyStruct,\n hashBody,\n} from '../../../../modules/platform/pr-body.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getElapsedHours } from '../../../../util/date.ts';\nimport { stripEmojis } from '../../../../util/emoji.ts';\nimport { fingerprint } from '../../../../util/fingerprint.ts';\nimport { getBranchLastCommitTime } from '../../../../util/git/index.ts';\nimport { memoize } from '../../../../util/memoize.ts';\nimport { incCountValue, isLimitReached } from '../../../global/limits.ts';\nimport type {\n BranchConfig,\n BranchUpgradeConfig,\n PrBlockedBy,\n} from '../../../types.ts';\nimport { embedChangelogs } from '../../changelog/index.ts';\nimport { resolveBranchStatus } from '../branch/status-checks.ts';\nimport { getPrBody } from './body/index.ts';\nimport {\n getChangedLabels,\n prepareLabels,\n shouldUpdateLabels,\n} from './labels.ts';\nimport { addParticipants } from './participants.ts';\nimport { getPrCache, setPrCache } from './pr-cache.ts';\nimport {\n generatePrBodyFingerprintConfig,\n validatePrCache,\n} from './pr-fingerprint.ts';\nimport { tryReuseAutoclosedPr } from './pr-reuse.ts';\n\nexport function getPlatformPrOptions(\n config: RenovateConfig & PlatformPrOptions,\n): PlatformPrOptions {\n const usePlatformAutomerge = Boolean(\n config.automerge &&\n (config.automergeType === 'pr' || config.automergeType === 'branch') &&\n config.platformAutomerge,\n );\n\n return {\n autoApprove: !!config.autoApprove,\n automergeStrategy: config.automergeStrategy,\n azureWorkItemId: config.azureWorkItemId ?? 0,\n bbAutoResolvePrTasks: !!config.bbAutoResolvePrTasks,\n bbUseDefaultReviewers: !!config.bbUseDefaultReviewers,\n gitLabIgnoreApprovals: !!config.gitLabIgnoreApprovals,\n forkModeDisallowMaintainerEdits: !!config.forkModeDisallowMaintainerEdits,\n usePlatformAutomerge,\n };\n}\n\nexport interface ResultWithPr {\n type: 'with-pr';\n pr: Pr;\n}\n\nexport interface ResultWithoutPr {\n type: 'without-pr';\n prBlockedBy: PrBlockedBy;\n}\n\nexport type EnsurePrResult = ResultWithPr | ResultWithoutPr;\n\nexport function updatePrDebugData(\n targetBranch: string,\n labels: string[],\n debugData: PrDebugData | undefined,\n): PrDebugData {\n const createdByRenovateVersion = debugData?.createdInVer ?? pkg.version;\n const updatedByRenovateVersion = pkg.version;\n\n const updatedPrDebugData: PrDebugData = {\n createdInVer: createdByRenovateVersion,\n updatedInVer: updatedByRenovateVersion,\n targetBranch,\n };\n\n // Add labels to the debug data object.\n // When to add:\n // 1. Add it when a new PR is created, i.e., when debugData is undefined.\n // 2. Add it if an existing PR already has labels in the debug data, confirming that we can update its labels.\n if (!debugData || isArray(debugData.labels)) {\n updatedPrDebugData.labels = labels;\n }\n\n return updatedPrDebugData;\n}\n\nfunction hasNotIgnoredReviewers(pr: Pr, config: BranchConfig): boolean {\n if (\n isNonEmptyArray(config.ignoreReviewers) &&\n isNonEmptyArray(pr.reviewers)\n ) {\n const ignoreReviewers = new Set(config.ignoreReviewers);\n return (\n pr.reviewers.filter((reviewer) => !ignoreReviewers.has(reviewer)).length >\n 0\n );\n }\n return isNonEmptyArray(pr.reviewers);\n}\n\nfunction addPullRequestNoteIfAttestationHasBeenLost(\n upgrade: BranchUpgradeConfig,\n currentReleaseHasAttestation: boolean | undefined,\n): void {\n const { packageName, depName, currentVersion, newVersion } = upgrade;\n const name = packageName ?? depName;\n\n const newRelease = upgrade.releases?.find(\n (release) => release.version === newVersion,\n );\n\n if (\n newRelease &&\n currentReleaseHasAttestation === true &&\n newRelease.attestation !== true\n ) {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n [\n '> :stop_sign: **Caution**',\n '>',\n `> ${name} ${currentVersion} was released with an attestation, but ${newVersion} has no attestation.`,\n `> Verify that release ${newVersion} was published by the expected author.`,\n '\\n',\n ].join('\\n'),\n );\n }\n}\n\n// Ensures that PR exists with matching title/body\nexport async function ensurePr(\n prConfig: BranchConfig,\n): Promise<EnsurePrResult> {\n const config: BranchConfig = { ...prConfig };\n const filteredPrConfig = generatePrBodyFingerprintConfig(config);\n const prBodyFingerprint = fingerprint(filteredPrConfig);\n logger.trace({ config }, 'ensurePr');\n // If there is a group, it will use the config of the first upgrade in the array\n const {\n branchName,\n ignoreTests,\n internalChecksAsSuccess,\n prTitle = '',\n upgrades,\n hasAttestation: currentReleaseHasAttestation,\n } = config;\n const getBranchStatus = memoize(() =>\n resolveBranchStatus(branchName, !!internalChecksAsSuccess, ignoreTests),\n );\n const dependencyDashboardCheck =\n config.dependencyDashboardChecks?.[config.branchName];\n // Check if PR already exists\n const existingPr =\n (await platform.getBranchPr(branchName, config.baseBranch)) ??\n (await tryReuseAutoclosedPr(branchName, prTitle));\n const prCache = getPrCache(branchName);\n if (existingPr) {\n logger.debug('Found existing PR');\n if (existingPr.bodyStruct?.rebaseRequested) {\n logger.debug('PR rebase requested, so skipping cache check');\n } else if (prCache) {\n logger.trace({ prCache }, 'Found existing PR cache');\n // return if pr cache is valid and pr was not changed in the past 24hrs\n if (validatePrCache(prCache, prBodyFingerprint)) {\n return { type: 'with-pr', pr: existingPr };\n }\n } else if (config.repositoryCache === 'enabled') {\n logger.debug('PR cache not found');\n }\n }\n config.upgrades = [];\n\n if (config.artifactErrors?.length) {\n logger.debug('Forcing PR because of artifact errors');\n config.forcePr = true;\n }\n\n if (dependencyDashboardCheck === 'approvePr') {\n logger.debug('Forcing PR because of dependency dashboard approval');\n config.forcePr = true;\n }\n\n if (!existingPr) {\n // Only create a PR if a branch automerge has failed\n if (\n config.automerge === true &&\n config.automergeType?.startsWith('branch') &&\n !config.forcePr\n ) {\n logger.debug(`Branch automerge is enabled`);\n if (\n config.stabilityStatus !== 'yellow' &&\n (await getBranchStatus()) === 'yellow' &&\n isNumber(config.prNotPendingHours)\n ) {\n logger.debug('Checking how long this branch has been pending');\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n if (getElapsedHours(lastCommitTime) >= config.prNotPendingHours) {\n logger.debug(\n `Branch exceeds prNotPending=${config.prNotPendingHours}, hours - forcing PR creation`,\n );\n config.forcePr = true;\n }\n }\n if (config.forcePr || (await getBranchStatus()) === 'red') {\n logger.debug(`Branch tests failed, so will create PR`);\n } else {\n // Branch should be automerged, so we don't want to create a PR\n return { type: 'without-pr', prBlockedBy: 'BranchAutomerge' };\n }\n }\n if (config.prCreation === 'status-success') {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) !== 'green') {\n logger.debug(`Branch status isn't green - not creating PR`);\n return { type: 'without-pr', prBlockedBy: 'AwaitingTests' };\n }\n logger.debug('Branch status success');\n } else if (\n config.prCreation === 'approval' &&\n dependencyDashboardCheck !== 'approvePr'\n ) {\n return { type: 'without-pr', prBlockedBy: 'NeedsApproval' };\n } else if (config.prCreation === 'not-pending' && !config.forcePr) {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) === 'yellow') {\n logger.debug(`Branch status is yellow - checking timeout`);\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n const elapsedHours = getElapsedHours(lastCommitTime);\n if (\n !dependencyDashboardCheck &&\n ((config.stabilityStatus && config.stabilityStatus !== 'yellow') ||\n (isNumber(config.prNotPendingHours) &&\n elapsedHours < config.prNotPendingHours))\n ) {\n logger.debug(\n `Branch is ${elapsedHours} hours old - skipping PR creation as prNotPendingHours is set to ${config.prNotPendingHours}`,\n );\n return {\n type: 'without-pr',\n prBlockedBy: 'AwaitingTests',\n };\n }\n const prNotPendingHours = String(config.prNotPendingHours);\n logger.debug(\n `prNotPendingHours=${prNotPendingHours} threshold hit - creating PR`,\n );\n }\n logger.debug('Branch status success');\n }\n }\n\n const processedUpgrades: string[] = [];\n const commitRepos: string[] = [];\n\n function getRepoNameWithSourceDirectory(\n upgrade: BranchUpgradeConfig,\n ): string {\n // TODO: types (#22198)\n return `${upgrade.repoName!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n }\n\n if (config.fetchChangeLogs === 'pr') {\n // fetch changelogs when not already done;\n await embedChangelogs(upgrades);\n }\n\n // Get changelog and then generate template strings\n for (const upgrade of upgrades) {\n // TODO: types (#22198)\n const upgradeKey = `${upgrade.depType!}-${upgrade.depName!}-${upgrade.manager}-${upgrade.currentVersion ?? ''}-${upgrade.currentValue ?? ''}-${upgrade.newVersion ?? ''}-${upgrade.newValue ?? ''}`;\n if (processedUpgrades.includes(upgradeKey)) {\n continue;\n }\n processedUpgrades.push(upgradeKey);\n\n const logJSON = upgrade.logJSON;\n\n if (logJSON) {\n if (typeof logJSON.error === 'undefined') {\n if (logJSON.project) {\n upgrade.repoName = logJSON.project.repository;\n }\n upgrade.hasReleaseNotes = false;\n upgrade.releases = [];\n if (\n logJSON.hasReleaseNotes &&\n upgrade.repoName &&\n !commitRepos.includes(getRepoNameWithSourceDirectory(upgrade))\n ) {\n commitRepos.push(getRepoNameWithSourceDirectory(upgrade));\n upgrade.hasReleaseNotes = logJSON.hasReleaseNotes;\n if (logJSON.versions) {\n for (const version of logJSON.versions) {\n const release = { ...version };\n upgrade.releases.push(release);\n }\n }\n }\n } else if (logJSON.error === 'MissingGithubToken') {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n [\n '> :exclamation: **Important**',\n '> ',\n '> Release Notes retrieval for this PR were skipped because no github.com credentials were available. ',\n '> If you are self-hosted, please see [this instruction](https://github.com/renovatebot/renovate/blob/master/docs/usage/examples/self-hosting.md#githubcom-token-for-release-notes).',\n '\\n',\n ].join('\\n'),\n );\n }\n }\n\n addPullRequestNoteIfAttestationHasBeenLost(\n upgrade,\n currentReleaseHasAttestation,\n );\n\n config.upgrades.push(upgrade);\n }\n\n config.hasReleaseNotes = config.upgrades.some((upg) => upg.hasReleaseNotes);\n\n const releaseNotesSources: string[] = [];\n for (const upgrade of config.upgrades) {\n let notesSourceUrl = upgrade.releases?.[0]?.releaseNotes?.notesSourceUrl;\n // TODO: types (#22198)\n notesSourceUrl ??= `${upgrade.sourceUrl!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n\n if (upgrade.hasReleaseNotes && notesSourceUrl) {\n if (releaseNotesSources.includes(notesSourceUrl)) {\n logger.debug(\n { depName: upgrade.depName },\n 'Removing duplicate release notes',\n );\n upgrade.hasReleaseNotes = false;\n } else {\n releaseNotesSources.push(notesSourceUrl);\n }\n }\n }\n\n const prBody = getPrBody(\n config,\n {\n debugData: updatePrDebugData(\n config.baseBranch,\n prepareLabels(config), // include labels in debug data\n existingPr?.bodyStruct?.debugData,\n ),\n },\n config,\n );\n\n try {\n if (existingPr) {\n logger.debug('Processing existing PR');\n\n if (\n !existingPr.hasAssignees &&\n !hasNotIgnoredReviewers(existingPr, config) &&\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) === 'red'\n ) {\n logger.debug(`Setting assignees and reviewers as status checks failed`);\n await addParticipants(config, existingPr);\n }\n // Check if existing PR needs updating\n const existingPrTitle = stripEmojis(existingPr.title);\n const existingPrBodyHash = existingPr.bodyStruct?.hash;\n const newPrTitle = stripEmojis(prTitle);\n const newPrBodyHash = hashBody(prBody);\n\n const prInitialLabels = existingPr.bodyStruct?.debugData?.labels;\n const prCurrentLabels = existingPr.labels;\n const configuredLabels = prepareLabels(config);\n\n const labelsNeedUpdate = shouldUpdateLabels(\n prInitialLabels,\n prCurrentLabels,\n configuredLabels,\n );\n\n if (\n existingPr?.targetBranch === config.baseBranch &&\n existingPrTitle === newPrTitle &&\n existingPrBodyHash === newPrBodyHash &&\n !labelsNeedUpdate\n ) {\n // adds or-cache for existing PRs\n setPrCache(branchName, prBodyFingerprint, false);\n logger.debug(\n `Pull Request #${existingPr.number} does not need updating`,\n );\n return { type: 'with-pr', pr: existingPr };\n }\n\n const updatePrConfig: UpdatePrConfig = {\n number: existingPr.number,\n prTitle,\n prBody,\n platformPrOptions: getPlatformPrOptions(config),\n };\n // PR must need updating\n if (existingPr?.targetBranch !== config.baseBranch) {\n logger.debug(\n {\n branchName,\n oldBaseBranch: existingPr?.targetBranch,\n newBaseBranch: config.baseBranch,\n },\n 'PR base branch has changed',\n );\n updatePrConfig.targetBranch = config.baseBranch;\n }\n\n if (labelsNeedUpdate) {\n logger.debug(\n {\n branchName,\n prCurrentLabels,\n configuredLabels,\n },\n 'PR labels have changed',\n );\n\n // Divide labels into three categories:\n // i) addLabels: Labels that need to be added\n // ii) removeLabels: Labels that need to be removed\n // iii) labels: New labels for the PR, replacing the old labels array entirely.\n // This distinction is necessary because different platforms update labels differently\n // For more details, refer to the updatePr function of each platform.\n\n const [addLabels, removeLabels] = getChangedLabels(\n prCurrentLabels,\n configuredLabels,\n );\n\n // for Gitea\n updatePrConfig.labels = configuredLabels;\n\n // for GitHub, GitLab\n updatePrConfig.addLabels = addLabels;\n updatePrConfig.removeLabels = removeLabels;\n }\n if (existingPrTitle !== newPrTitle) {\n logger.debug(\n {\n branchName,\n oldPrTitle: existingPr.title,\n newPrTitle: prTitle,\n },\n 'PR title changed',\n );\n } else if (!config.committedFiles && !config.rebaseRequested) {\n logger.debug(\n {\n prTitle,\n },\n 'PR body changed',\n );\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would update PR #${existingPr.number}`);\n return { type: 'with-pr', pr: existingPr };\n } else {\n await platform.updatePr(updatePrConfig);\n logger.info({ pr: existingPr.number, prTitle }, `PR updated`);\n setPrCache(branchName, prBodyFingerprint, true);\n }\n return {\n type: 'with-pr',\n pr: {\n ...existingPr,\n bodyStruct: getPrBodyStruct(prBody),\n title: prTitle,\n targetBranch: config.baseBranch,\n },\n };\n }\n logger.debug({ branch: branchName, prTitle }, `Creating PR`);\n if (config.updateType === 'rollback') {\n logger.info('Creating Rollback PR');\n }\n let pr: Pr | null;\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { labels: prepareLabels(config) },\n 'DRY-RUN: Would create PR: ' + prTitle,\n );\n pr = { number: 0 } as never;\n } else {\n try {\n if (\n !dependencyDashboardCheck &&\n isLimitReached('ConcurrentPRs', prConfig) &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Skipping PR - limit reached');\n return { type: 'without-pr', prBlockedBy: 'RateLimited' };\n }\n pr = await platform.createPr({\n sourceBranch: branchName,\n targetBranch: config.baseBranch,\n prTitle,\n prBody,\n labels: prepareLabels(config),\n platformPrOptions: getPlatformPrOptions(config),\n draftPR: !!config.draftPR,\n milestone: config.milestone,\n });\n\n incCountValue('ConcurrentPRs');\n incCountValue('HourlyPRs');\n logger.info(\n { pr: pr?.number, prTitle, labels: pr?.labels },\n 'PR created',\n );\n } catch (err) {\n logger.debug({ err }, 'Pull request creation error');\n if (\n err.body?.message === 'Validation failed' &&\n err.body.errors?.length &&\n err.body.errors.some((error: { message?: string }) =>\n error.message?.startsWith('A pull request already exists'),\n )\n ) {\n logger.warn('A pull requests already exists');\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n if (err.statusCode === 502) {\n logger.warn(\n { branch: branchName },\n 'Deleting branch due to server error',\n );\n await scm.deleteBranch(branchName);\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n }\n if (\n pr &&\n config.branchAutomergeFailureMessage &&\n !config.suppressNotifications?.includes('branchAutomergeFailure')\n ) {\n const topic = 'Branch automerge failure';\n let content =\n 'This PR was configured for branch automerge. However, this is not possible, so it has been raised as a PR instead.';\n if (config.branchAutomergeFailureMessage === 'branch status error') {\n content += '\\n___\\n * Branch has one or more failed status checks';\n }\n content = platform.massageMarkdown(content, config.rebaseLabel);\n logger.debug('Adding branch automerge failure message to PR');\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would add comment to PR #${pr.number}`);\n } else {\n await ensureComment({\n number: pr.number,\n topic,\n content,\n });\n }\n }\n // Skip assign and review if automerging PR\n if (pr) {\n if (\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) !== 'red'\n ) {\n logger.debug(\n `Skipping assignees and reviewers as automerge=${config.automerge}`,\n );\n } else {\n await addParticipants(config, pr);\n }\n setPrCache(branchName, prBodyFingerprint, true);\n logger.debug(`Created Pull Request #${pr.number}`);\n return { type: 'with-pr', pr };\n }\n } catch (err) {\n if (\n // oxlint-disable-next-line typescript/prefer-optional-chain -- instanceof is not a null guard\n err instanceof ExternalHostError ||\n err.message === REPOSITORY_CHANGED ||\n err.message === PLATFORM_RATE_LIMIT_EXCEEDED ||\n err.message === PLATFORM_INTEGRATION_UNAUTHORIZED\n ) {\n logger.debug('Passing error up');\n throw err;\n }\n logger.warn({ err, prTitle }, 'Failed to ensure PR');\n }\n if (existingPr) {\n return { type: 'with-pr', pr: existingPr };\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,SAAgB,qBACd,QACmB;CACnB,MAAM,uBAAuB,QAC3B,OAAO,cACN,OAAO,kBAAkB,QAAQ,OAAO,kBAAkB,aAC3D,OAAO,kBACR;AAED,QAAO;EACL,aAAa,CAAC,CAAC,OAAO;EACtB,mBAAmB,OAAO;EAC1B,iBAAiB,OAAO,mBAAmB;EAC3C,sBAAsB,CAAC,CAAC,OAAO;EAC/B,uBAAuB,CAAC,CAAC,OAAO;EAChC,uBAAuB,CAAC,CAAC,OAAO;EAChC,iCAAiC,CAAC,CAAC,OAAO;EAC1C;EACD;;AAeH,SAAgB,kBACd,cACA,QACA,WACa;CAIb,MAAM,qBAAkC;EACtC,cAJ+B,WAAW,gBAAgB,IAAI;EAK9D,cAJ+B,IAAI;EAKnC;EACD;AAMD,KAAI,CAAC,aAAa,QAAQ,UAAU,OAAO,CACzC,oBAAmB,SAAS;AAG9B,QAAO;;AAGT,SAAS,uBAAuB,IAAQ,QAA+B;AACrE,KACE,gBAAgB,OAAO,gBAAgB,IACvC,gBAAgB,GAAG,UAAU,EAC7B;EACA,MAAM,kBAAkB,IAAI,IAAI,OAAO,gBAAgB;AACvD,SACE,GAAG,UAAU,QAAQ,aAAa,CAAC,gBAAgB,IAAI,SAAS,CAAC,CAAC,SAClE;;AAGJ,QAAO,gBAAgB,GAAG,UAAU;;AAGtC,SAAS,2CACP,SACA,8BACM;CACN,MAAM,EAAE,aAAa,SAAS,gBAAgB,eAAe;CAC7D,MAAM,OAAO,eAAe;CAE5B,MAAM,aAAa,QAAQ,UAAU,MAClC,YAAY,QAAQ,YAAY,WAClC;AAED,KACE,cACA,iCAAiC,QACjC,WAAW,gBAAgB,MAC3B;AACA,UAAQ,gBAAgB,EAAE;AAC1B,UAAQ,YAAY,KAClB;GACE;GACA;GACA,KAAK,KAAK,GAAG,eAAe,yCAAyC,WAAW;GAChF,yBAAyB,WAAW;GACpC;GACD,CAAC,KAAK,KAAK,CACb;;;AAKL,eAAsB,SACpB,UACyB;CACzB,MAAM,SAAuB,EAAE,GAAG,UAAU;CAE5C,MAAM,oBAAoB,YADD,gCAAgC,OAAO,CACT;AACvD,QAAO,MAAM,EAAE,QAAQ,EAAE,WAAW;CAEpC,MAAM,EACJ,YACA,aACA,yBACA,UAAU,IACV,UACA,gBAAgB,iCACd;CACJ,MAAM,kBAAkB,cACtB,oBAAoB,YAAY,CAAC,CAAC,yBAAyB,YAAY,CACxE;CACD,MAAM,2BACJ,OAAO,4BAA4B,OAAO;CAE5C,MAAM,aACH,MAAM,SAAS,YAAY,YAAY,OAAO,WAAW,IACzD,MAAM,qBAAqB,YAAY,QAAQ;CAClD,MAAM,UAAU,WAAW,WAAW;AACtC,KAAI,YAAY;AACd,SAAO,MAAM,oBAAoB;AACjC,MAAI,WAAW,YAAY,gBACzB,QAAO,MAAM,+CAA+C;WACnD,SAAS;AAClB,UAAO,MAAM,EAAE,SAAS,EAAE,0BAA0B;AAEpD,OAAI,gBAAgB,SAAS,kBAAkB,CAC7C,QAAO;IAAE,MAAM;IAAW,IAAI;IAAY;aAEnC,OAAO,oBAAoB,UACpC,QAAO,MAAM,qBAAqB;;AAGtC,QAAO,WAAW,EAAE;AAEpB,KAAI,OAAO,gBAAgB,QAAQ;AACjC,SAAO,MAAM,wCAAwC;AACrD,SAAO,UAAU;;AAGnB,KAAI,6BAA6B,aAAa;AAC5C,SAAO,MAAM,sDAAsD;AACnE,SAAO,UAAU;;AAGnB,KAAI,CAAC,YAAY;AAEf,MACE,OAAO,cAAc,QACrB,OAAO,eAAe,WAAW,SAAS,IAC1C,CAAC,OAAO,SACR;AACA,UAAO,MAAM,8BAA8B;AAC3C,OACE,OAAO,oBAAoB,YAC1B,MAAM,iBAAiB,KAAM,YAC9B,SAAS,OAAO,kBAAkB,EAClC;AACA,WAAO,MAAM,iDAAiD;AAE9D,QAAI,gBADmB,MAAM,wBAAwB,WAAW,CAC7B,IAAI,OAAO,mBAAmB;AAC/D,YAAO,MACL,+BAA+B,OAAO,kBAAkB,+BACzD;AACD,YAAO,UAAU;;;AAGrB,OAAI,OAAO,WAAY,MAAM,iBAAiB,KAAM,MAClD,QAAO,MAAM,yCAAyC;OAGtD,QAAO;IAAE,MAAM;IAAc,aAAa;IAAmB;;AAGjE,MAAI,OAAO,eAAe,kBAAkB;AAC1C,UAAO,MAAM,kCAAkC;AAC/C,OAAK,MAAM,iBAAiB,KAAM,SAAS;AACzC,WAAO,MAAM,8CAA8C;AAC3D,WAAO;KAAE,MAAM;KAAc,aAAa;KAAiB;;AAE7D,UAAO,MAAM,wBAAwB;aAErC,OAAO,eAAe,cACtB,6BAA6B,YAE7B,QAAO;GAAE,MAAM;GAAc,aAAa;GAAiB;WAClD,OAAO,eAAe,iBAAiB,CAAC,OAAO,SAAS;AACjE,UAAO,MAAM,kCAAkC;AAC/C,OAAK,MAAM,iBAAiB,KAAM,UAAU;AAC1C,WAAO,MAAM,6CAA6C;IAE1D,MAAM,eAAe,gBADE,MAAM,wBAAwB,WAAW,CACZ;AACpD,QACE,CAAC,6BACC,OAAO,mBAAmB,OAAO,oBAAoB,YACpD,SAAS,OAAO,kBAAkB,IACjC,eAAe,OAAO,oBAC1B;AACA,YAAO,MACL,aAAa,aAAa,mEAAmE,OAAO,oBACrG;AACD,YAAO;MACL,MAAM;MACN,aAAa;MACd;;IAEH,MAAM,oBAAoB,OAAO,OAAO,kBAAkB;AAC1D,WAAO,MACL,qBAAqB,kBAAkB,8BACxC;;AAEH,UAAO,MAAM,wBAAwB;;;CAIzC,MAAM,oBAA8B,EAAE;CACtC,MAAM,cAAwB,EAAE;CAEhC,SAAS,+BACP,SACQ;AAER,SAAO,GAAG,QAAQ,WAChB,QAAQ,kBAAkB,IAAI,QAAQ,oBAAoB;;AAI9D,KAAI,OAAO,oBAAoB,KAE7B,OAAM,gBAAgB,SAAS;AAIjC,MAAK,MAAM,WAAW,UAAU;EAE9B,MAAM,aAAa,GAAG,QAAQ,QAAS,GAAG,QAAQ,QAAS,GAAG,QAAQ,QAAQ,GAAG,QAAQ,kBAAkB,GAAG,GAAG,QAAQ,gBAAgB,GAAG,GAAG,QAAQ,cAAc,GAAG,GAAG,QAAQ,YAAY;AAC/L,MAAI,kBAAkB,SAAS,WAAW,CACxC;AAEF,oBAAkB,KAAK,WAAW;EAElC,MAAM,UAAU,QAAQ;AAExB,MAAI;OACE,OAAO,QAAQ,UAAU,aAAa;AACxC,QAAI,QAAQ,QACV,SAAQ,WAAW,QAAQ,QAAQ;AAErC,YAAQ,kBAAkB;AAC1B,YAAQ,WAAW,EAAE;AACrB,QACE,QAAQ,mBACR,QAAQ,YACR,CAAC,YAAY,SAAS,+BAA+B,QAAQ,CAAC,EAC9D;AACA,iBAAY,KAAK,+BAA+B,QAAQ,CAAC;AACzD,aAAQ,kBAAkB,QAAQ;AAClC,SAAI,QAAQ,SACV,MAAK,MAAM,WAAW,QAAQ,UAAU;MACtC,MAAM,UAAU,EAAE,GAAG,SAAS;AAC9B,cAAQ,SAAS,KAAK,QAAQ;;;cAI3B,QAAQ,UAAU,sBAAsB;AACjD,YAAQ,gBAAgB,EAAE;AAC1B,YAAQ,YAAY,KAClB;KACE;KACA;KACA;KACA;KACA;KACD,CAAC,KAAK,KAAK,CACb;;;AAIL,6CACE,SACA,6BACD;AAED,SAAO,SAAS,KAAK,QAAQ;;AAG/B,QAAO,kBAAkB,OAAO,SAAS,MAAM,QAAQ,IAAI,gBAAgB;CAE3E,MAAM,sBAAgC,EAAE;AACxC,MAAK,MAAM,WAAW,OAAO,UAAU;EACrC,IAAI,iBAAiB,QAAQ,WAAW,IAAI,cAAc;AAE1D,qBAAmB,GAAG,QAAQ,YAC5B,QAAQ,kBAAkB,IAAI,QAAQ,oBAAoB;AAG5D,MAAI,QAAQ,mBAAmB,eAC7B,KAAI,oBAAoB,SAAS,eAAe,EAAE;AAChD,UAAO,MACL,EAAE,SAAS,QAAQ,SAAS,EAC5B,mCACD;AACD,WAAQ,kBAAkB;QAE1B,qBAAoB,KAAK,eAAe;;CAK9C,MAAM,SAAS,UACb,QACA,EACE,WAAW,kBACT,OAAO,YACP,cAAc,OAAO,EACrB,YAAY,YAAY,UACzB,EACF,EACD,OACD;AAED,KAAI;AACF,MAAI,YAAY;AACd,UAAO,MAAM,yBAAyB;AAEtC,OACE,CAAC,WAAW,gBACZ,CAAC,uBAAuB,YAAY,OAAO,IAC3C,OAAO,aACP,CAAC,OAAO,mBACP,MAAM,iBAAiB,KAAM,OAC9B;AACA,WAAO,MAAM,0DAA0D;AACvE,UAAM,gBAAgB,QAAQ,WAAW;;GAG3C,MAAM,kBAAkB,YAAY,WAAW,MAAM;GACrD,MAAM,qBAAqB,WAAW,YAAY;GAClD,MAAM,aAAa,YAAY,QAAQ;GACvC,MAAM,gBAAgB,SAAS,OAAO;GAEtC,MAAM,kBAAkB,WAAW,YAAY,WAAW;GAC1D,MAAM,kBAAkB,WAAW;GACnC,MAAM,mBAAmB,cAAc,OAAO;GAE9C,MAAM,mBAAmB,mBACvB,iBACA,iBACA,iBACD;AAED,OACE,YAAY,iBAAiB,OAAO,cACpC,oBAAoB,cACpB,uBAAuB,iBACvB,CAAC,kBACD;AAEA,eAAW,YAAY,mBAAmB,MAAM;AAChD,WAAO,MACL,iBAAiB,WAAW,OAAO,yBACpC;AACD,WAAO;KAAE,MAAM;KAAW,IAAI;KAAY;;GAG5C,MAAM,iBAAiC;IACrC,QAAQ,WAAW;IACnB;IACA;IACA,mBAAmB,qBAAqB,OAAO;IAChD;AAED,OAAI,YAAY,iBAAiB,OAAO,YAAY;AAClD,WAAO,MACL;KACE;KACA,eAAe,YAAY;KAC3B,eAAe,OAAO;KACvB,EACD,6BACD;AACD,mBAAe,eAAe,OAAO;;AAGvC,OAAI,kBAAkB;AACpB,WAAO,MACL;KACE;KACA;KACA;KACD,EACD,yBACD;IASD,MAAM,CAAC,WAAW,gBAAgB,iBAChC,iBACA,iBACD;AAGD,mBAAe,SAAS;AAGxB,mBAAe,YAAY;AAC3B,mBAAe,eAAe;;AAEhC,OAAI,oBAAoB,WACtB,QAAO,MACL;IACE;IACA,YAAY,WAAW;IACvB,YAAY;IACb,EACD,mBACD;YACQ,CAAC,OAAO,kBAAkB,CAAC,OAAO,gBAC3C,QAAO,MACL,EACE,SACD,EACD,kBACD;AAGH,OAAI,aAAa,IAAI,SAAS,EAAE;AAC9B,WAAO,KAAK,6BAA6B,WAAW,SAAS;AAC7D,WAAO;KAAE,MAAM;KAAW,IAAI;KAAY;UACrC;AACL,UAAM,SAAS,SAAS,eAAe;AACvC,WAAO,KAAK;KAAE,IAAI,WAAW;KAAQ;KAAS,EAAE,aAAa;AAC7D,eAAW,YAAY,mBAAmB,KAAK;;AAEjD,UAAO;IACL,MAAM;IACN,IAAI;KACF,GAAG;KACH,YAAY,gBAAgB,OAAO;KACnC,OAAO;KACP,cAAc,OAAO;KACtB;IACF;;AAEH,SAAO,MAAM;GAAE,QAAQ;GAAY;GAAS,EAAE,cAAc;AAC5D,MAAI,OAAO,eAAe,WACxB,QAAO,KAAK,uBAAuB;EAErC,IAAI;AACJ,MAAI,aAAa,IAAI,SAAS,EAAE;AAC9B,UAAO,KACL,EAAE,QAAQ,cAAc,OAAO,EAAE,EACjC,+BAA+B,QAChC;AACD,QAAK,EAAE,QAAQ,GAAG;QAElB,KAAI;AACF,OACE,CAAC,4BACD,eAAe,iBAAiB,SAAS,IACzC,CAAC,OAAO,sBACR;AACA,WAAO,MAAM,8BAA8B;AAC3C,WAAO;KAAE,MAAM;KAAc,aAAa;KAAe;;AAE3D,QAAK,MAAM,SAAS,SAAS;IAC3B,cAAc;IACd,cAAc,OAAO;IACrB;IACA;IACA,QAAQ,cAAc,OAAO;IAC7B,mBAAmB,qBAAqB,OAAO;IAC/C,SAAS,CAAC,CAAC,OAAO;IAClB,WAAW,OAAO;IACnB,CAAC;AAEF,iBAAc,gBAAgB;AAC9B,iBAAc,YAAY;AAC1B,UAAO,KACL;IAAE,IAAI,IAAI;IAAQ;IAAS,QAAQ,IAAI;IAAQ,EAC/C,aACD;WACM,KAAK;AACZ,UAAO,MAAM,EAAE,KAAK,EAAE,8BAA8B;AACpD,OACE,IAAI,MAAM,YAAY,uBACtB,IAAI,KAAK,QAAQ,UACjB,IAAI,KAAK,OAAO,MAAM,UACpB,MAAM,SAAS,WAAW,gCAAgC,CAC3D,EACD;AACA,WAAO,KAAK,iCAAiC;AAC7C,WAAO;KAAE,MAAM;KAAc,aAAa;KAAS;;AAErD,OAAI,IAAI,eAAe,KAAK;AAC1B,WAAO,KACL,EAAE,QAAQ,YAAY,EACtB,sCACD;AACD,UAAM,IAAI,aAAa,WAAW;;AAEpC,UAAO;IAAE,MAAM;IAAc,aAAa;IAAS;;AAGvD,MACE,MACA,OAAO,iCACP,CAAC,OAAO,uBAAuB,SAAS,yBAAyB,EACjE;GACA,MAAM,QAAQ;GACd,IAAI,UACF;AACF,OAAI,OAAO,kCAAkC,sBAC3C,YAAW;AAEb,aAAU,SAAS,gBAAgB,SAAS,OAAO,YAAY;AAC/D,UAAO,MAAM,gDAAgD;AAC7D,OAAI,aAAa,IAAI,SAAS,CAC5B,QAAO,KAAK,qCAAqC,GAAG,SAAS;OAE7D,OAAM,cAAc;IAClB,QAAQ,GAAG;IACX;IACA;IACD,CAAC;;AAIN,MAAI,IAAI;AACN,OACE,OAAO,aACP,CAAC,OAAO,mBACP,MAAM,iBAAiB,KAAM,MAE9B,QAAO,MACL,iDAAiD,OAAO,YACzD;OAED,OAAM,gBAAgB,QAAQ,GAAG;AAEnC,cAAW,YAAY,mBAAmB,KAAK;AAC/C,UAAO,MAAM,yBAAyB,GAAG,SAAS;AAClD,UAAO;IAAE,MAAM;IAAW;IAAI;;UAEzB,KAAK;AACZ,MAEE,eAAe,qBACf,IAAI,YAAA,wBACJ,IAAI,YAAA,yBACJ,IAAI,YAAA,4BACJ;AACA,UAAO,MAAM,mBAAmB;AAChC,SAAM;;AAER,SAAO,KAAK;GAAE;GAAK;GAAS,EAAE,sBAAsB;;AAEtD,KAAI,WACF,QAAO;EAAE,MAAM;EAAW,IAAI;EAAY;AAE5C,QAAO;EAAE,MAAM;EAAc,aAAa;EAAS"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/workers/repository/update/pr/index.ts"],"sourcesContent":["import { isArray, isNonEmptyArray, isNumber } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport {\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n} from '../../../../constants/error-messages.ts';\nimport { pkg } from '../../../../expose.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { ensureComment } from '../../../../modules/platform/comment.ts';\nimport type {\n PlatformPrOptions,\n Pr,\n PrDebugData,\n UpdatePrConfig,\n} from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport {\n getPrBodyStruct,\n hashBody,\n} from '../../../../modules/platform/pr-body.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getElapsedHours } from '../../../../util/date.ts';\nimport { stripEmojis } from '../../../../util/emoji.ts';\nimport { fingerprint } from '../../../../util/fingerprint.ts';\nimport { getBranchLastCommitTime } from '../../../../util/git/index.ts';\nimport { memoize } from '../../../../util/memoize.ts';\nimport { incCountValue, isLimitReached } from '../../../global/limits.ts';\nimport type {\n BranchConfig,\n BranchUpgradeConfig,\n PrBlockedBy,\n} from '../../../types.ts';\nimport { embedChangelogs } from '../../changelog/index.ts';\nimport { resolveBranchStatus } from '../branch/status-checks.ts';\nimport { getPrBody } from './body/index.ts';\nimport {\n getChangedLabels,\n prepareLabels,\n shouldUpdateLabels,\n} from './labels.ts';\nimport { addParticipants } from './participants.ts';\nimport { getPrCache, setPrCache } from './pr-cache.ts';\nimport {\n generatePrBodyFingerprintConfig,\n validatePrCache,\n} from './pr-fingerprint.ts';\nimport { tryReuseAutoclosedPr } from './pr-reuse.ts';\n\nexport function getPlatformPrOptions(\n config: RenovateConfig & PlatformPrOptions,\n): PlatformPrOptions {\n const usePlatformAutomerge = Boolean(\n config.automerge &&\n (config.automergeType === 'pr' || config.automergeType === 'branch') &&\n config.platformAutomerge,\n );\n\n return {\n autoApprove: !!config.autoApprove,\n automergeStrategy: config.automergeStrategy,\n azureWorkItemId: config.azureWorkItemId ?? 0,\n bbAutoResolvePrTasks: !!config.bbAutoResolvePrTasks,\n bbUseDefaultReviewers: !!config.bbUseDefaultReviewers,\n gitLabIgnoreApprovals: !!config.gitLabIgnoreApprovals,\n forkModeDisallowMaintainerEdits: !!config.forkModeDisallowMaintainerEdits,\n usePlatformAutomerge,\n };\n}\n\nexport interface ResultWithPr {\n type: 'with-pr';\n pr: Pr;\n}\n\nexport interface ResultWithoutPr {\n type: 'without-pr';\n prBlockedBy: PrBlockedBy;\n}\n\nexport type EnsurePrResult = ResultWithPr | ResultWithoutPr;\n\nexport function updatePrDebugData(\n targetBranch: string,\n labels: string[],\n debugData: PrDebugData | undefined,\n): PrDebugData {\n const createdByRenovateVersion = debugData?.createdInVer ?? pkg.version;\n const updatedByRenovateVersion = pkg.version;\n\n const updatedPrDebugData: PrDebugData = {\n createdInVer: createdByRenovateVersion,\n updatedInVer: updatedByRenovateVersion,\n targetBranch,\n };\n\n // Add labels to the debug data object.\n // When to add:\n // 1. Add it when a new PR is created, i.e., when debugData is undefined.\n // 2. Add it if an existing PR already has labels in the debug data, confirming that we can update its labels.\n if (!debugData || isArray(debugData.labels)) {\n updatedPrDebugData.labels = labels;\n }\n\n return updatedPrDebugData;\n}\n\nfunction hasNotIgnoredReviewers(pr: Pr, config: BranchConfig): boolean {\n if (\n isNonEmptyArray(config.ignoreReviewers) &&\n isNonEmptyArray(pr.reviewers)\n ) {\n const ignoreReviewers = new Set(config.ignoreReviewers);\n return (\n pr.reviewers.filter((reviewer) => !ignoreReviewers.has(reviewer)).length >\n 0\n );\n }\n return isNonEmptyArray(pr.reviewers);\n}\n\nfunction addPullRequestNoteIfAttestationHasBeenLost(\n upgrade: BranchUpgradeConfig,\n currentReleaseHasAttestation: boolean | undefined,\n): void {\n const { packageName, depName, currentVersion, newVersion } = upgrade;\n const name = packageName ?? depName;\n\n const newRelease = upgrade.releases?.find(\n (release) => release.version === newVersion,\n );\n\n if (\n newRelease &&\n currentReleaseHasAttestation === true &&\n newRelease.attestation !== true\n ) {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n [\n '> :stop_sign: **Caution**',\n '>',\n `> ${name} ${currentVersion} was released with an attestation, but ${newVersion} has no attestation.`,\n `> Verify that release ${newVersion} was published by the expected author.`,\n '\\n',\n ].join('\\n'),\n );\n }\n}\n\n// Ensures that PR exists with matching title/body\nexport async function ensurePr(\n prConfig: BranchConfig,\n): Promise<EnsurePrResult> {\n const config: BranchConfig = { ...prConfig };\n const filteredPrConfig = generatePrBodyFingerprintConfig(config);\n const prBodyFingerprint = fingerprint(filteredPrConfig);\n logger.trace({ config }, 'ensurePr');\n // If there is a group, it will use the config of the first upgrade in the array\n const {\n branchName,\n ignoreTests,\n internalChecksAsSuccess,\n prTitle = '',\n upgrades,\n hasAttestation: currentReleaseHasAttestation,\n } = config;\n const getBranchStatus = memoize(() =>\n resolveBranchStatus(branchName, !!internalChecksAsSuccess, ignoreTests),\n );\n const dependencyDashboardCheck =\n config.dependencyDashboardChecks?.[config.branchName];\n // Check if PR already exists\n const existingPr =\n (await platform.getBranchPr(branchName, config.baseBranch)) ??\n (await tryReuseAutoclosedPr(branchName, prTitle));\n const prCache = getPrCache(branchName);\n if (existingPr) {\n logger.debug('Found existing PR');\n if (existingPr.bodyStruct?.rebaseRequested) {\n logger.debug('PR rebase requested, so skipping cache check');\n } else if (prCache) {\n logger.trace({ prCache }, 'Found existing PR cache');\n // return if pr cache is valid and pr was not changed in the past 24hrs\n // skip cache when autoApprove is set, since new commits may have\n // reset platform approvals (e.g. GitLab's \"Remove all approvals\" setting)\n if (validatePrCache(prCache, prBodyFingerprint) && !config.autoApprove) {\n return { type: 'with-pr', pr: existingPr };\n }\n } else if (config.repositoryCache === 'enabled') {\n logger.debug('PR cache not found');\n }\n }\n config.upgrades = [];\n\n if (config.artifactErrors?.length) {\n logger.debug('Forcing PR because of artifact errors');\n config.forcePr = true;\n }\n\n if (dependencyDashboardCheck === 'approvePr') {\n logger.debug('Forcing PR because of dependency dashboard approval');\n config.forcePr = true;\n }\n\n if (!existingPr) {\n // Only create a PR if a branch automerge has failed\n if (\n config.automerge === true &&\n config.automergeType?.startsWith('branch') &&\n !config.forcePr\n ) {\n logger.debug(`Branch automerge is enabled`);\n if (\n config.stabilityStatus !== 'yellow' &&\n (await getBranchStatus()) === 'yellow' &&\n isNumber(config.prNotPendingHours)\n ) {\n logger.debug('Checking how long this branch has been pending');\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n if (getElapsedHours(lastCommitTime) >= config.prNotPendingHours) {\n logger.debug(\n `Branch exceeds prNotPending=${config.prNotPendingHours}, hours - forcing PR creation`,\n );\n config.forcePr = true;\n }\n }\n if (config.forcePr || (await getBranchStatus()) === 'red') {\n logger.debug(`Branch tests failed, so will create PR`);\n } else {\n // Branch should be automerged, so we don't want to create a PR\n return { type: 'without-pr', prBlockedBy: 'BranchAutomerge' };\n }\n }\n if (config.prCreation === 'status-success') {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) !== 'green') {\n logger.debug(`Branch status isn't green - not creating PR`);\n return { type: 'without-pr', prBlockedBy: 'AwaitingTests' };\n }\n logger.debug('Branch status success');\n } else if (\n config.prCreation === 'approval' &&\n dependencyDashboardCheck !== 'approvePr'\n ) {\n return { type: 'without-pr', prBlockedBy: 'NeedsApproval' };\n } else if (config.prCreation === 'not-pending' && !config.forcePr) {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) === 'yellow') {\n logger.debug(`Branch status is yellow - checking timeout`);\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n const elapsedHours = getElapsedHours(lastCommitTime);\n if (\n !dependencyDashboardCheck &&\n ((config.stabilityStatus && config.stabilityStatus !== 'yellow') ||\n (isNumber(config.prNotPendingHours) &&\n elapsedHours < config.prNotPendingHours))\n ) {\n logger.debug(\n `Branch is ${elapsedHours} hours old - skipping PR creation as prNotPendingHours is set to ${config.prNotPendingHours}`,\n );\n return {\n type: 'without-pr',\n prBlockedBy: 'AwaitingTests',\n };\n }\n const prNotPendingHours = String(config.prNotPendingHours);\n logger.debug(\n `prNotPendingHours=${prNotPendingHours} threshold hit - creating PR`,\n );\n }\n logger.debug('Branch status success');\n }\n }\n\n const processedUpgrades: string[] = [];\n const commitRepos: string[] = [];\n\n function getRepoNameWithSourceDirectory(\n upgrade: BranchUpgradeConfig,\n ): string {\n // TODO: types (#22198)\n return `${upgrade.repoName!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n }\n\n if (config.fetchChangeLogs === 'pr') {\n // fetch changelogs when not already done;\n await embedChangelogs(upgrades);\n }\n\n // Get changelog and then generate template strings\n for (const upgrade of upgrades) {\n // TODO: types (#22198)\n const upgradeKey = `${upgrade.depType!}-${upgrade.depName!}-${upgrade.manager}-${upgrade.currentVersion ?? ''}-${upgrade.currentValue ?? ''}-${upgrade.newVersion ?? ''}-${upgrade.newValue ?? ''}`;\n if (processedUpgrades.includes(upgradeKey)) {\n continue;\n }\n processedUpgrades.push(upgradeKey);\n\n const logJSON = upgrade.logJSON;\n\n if (logJSON) {\n if (typeof logJSON.error === 'undefined') {\n if (logJSON.project) {\n upgrade.repoName = logJSON.project.repository;\n }\n upgrade.hasReleaseNotes = false;\n upgrade.releases = [];\n if (\n logJSON.hasReleaseNotes &&\n upgrade.repoName &&\n !commitRepos.includes(getRepoNameWithSourceDirectory(upgrade))\n ) {\n commitRepos.push(getRepoNameWithSourceDirectory(upgrade));\n upgrade.hasReleaseNotes = logJSON.hasReleaseNotes;\n if (logJSON.versions) {\n for (const version of logJSON.versions) {\n const release = { ...version };\n upgrade.releases.push(release);\n }\n }\n }\n } else if (logJSON.error === 'MissingGithubToken') {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n [\n '> :exclamation: **Important**',\n '> ',\n '> Release Notes retrieval for this PR were skipped because no github.com credentials were available. ',\n '> If you are self-hosted, please see [this instruction](https://github.com/renovatebot/renovate/blob/master/docs/usage/examples/self-hosting.md#githubcom-token-for-release-notes).',\n '\\n',\n ].join('\\n'),\n );\n }\n }\n\n addPullRequestNoteIfAttestationHasBeenLost(\n upgrade,\n currentReleaseHasAttestation,\n );\n\n config.upgrades.push(upgrade);\n }\n\n config.hasReleaseNotes = config.upgrades.some((upg) => upg.hasReleaseNotes);\n\n const releaseNotesSources: string[] = [];\n for (const upgrade of config.upgrades) {\n let notesSourceUrl = upgrade.releases?.[0]?.releaseNotes?.notesSourceUrl;\n // TODO: types (#22198)\n notesSourceUrl ??= `${upgrade.sourceUrl!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n\n if (upgrade.hasReleaseNotes && notesSourceUrl) {\n if (releaseNotesSources.includes(notesSourceUrl)) {\n logger.debug(\n { depName: upgrade.depName },\n 'Removing duplicate release notes',\n );\n upgrade.hasReleaseNotes = false;\n } else {\n releaseNotesSources.push(notesSourceUrl);\n }\n }\n }\n\n const prBody = getPrBody(\n config,\n {\n debugData: updatePrDebugData(\n config.baseBranch,\n prepareLabels(config), // include labels in debug data\n existingPr?.bodyStruct?.debugData,\n ),\n },\n config,\n );\n\n try {\n if (existingPr) {\n logger.debug('Processing existing PR');\n\n if (\n !existingPr.hasAssignees &&\n !hasNotIgnoredReviewers(existingPr, config) &&\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) === 'red'\n ) {\n logger.debug(`Setting assignees and reviewers as status checks failed`);\n await addParticipants(config, existingPr);\n }\n // Check if existing PR needs updating\n const existingPrTitle = stripEmojis(existingPr.title);\n const existingPrBodyHash = existingPr.bodyStruct?.hash;\n const newPrTitle = stripEmojis(prTitle);\n const newPrBodyHash = hashBody(prBody);\n\n const prInitialLabels = existingPr.bodyStruct?.debugData?.labels;\n const prCurrentLabels = existingPr.labels;\n const configuredLabels = prepareLabels(config);\n\n const labelsNeedUpdate = shouldUpdateLabels(\n prInitialLabels,\n prCurrentLabels,\n configuredLabels,\n );\n\n if (\n existingPr?.targetBranch === config.baseBranch &&\n existingPrTitle === newPrTitle &&\n existingPrBodyHash === newPrBodyHash &&\n !labelsNeedUpdate &&\n !config.autoApprove\n ) {\n // adds or-cache for existing PRs\n setPrCache(branchName, prBodyFingerprint, false);\n logger.debug(\n `Pull Request #${existingPr.number} does not need updating`,\n );\n return { type: 'with-pr', pr: existingPr };\n }\n\n const updatePrConfig: UpdatePrConfig = {\n number: existingPr.number,\n prTitle,\n prBody,\n platformPrOptions: getPlatformPrOptions(config),\n };\n // PR must need updating\n if (existingPr?.targetBranch !== config.baseBranch) {\n logger.debug(\n {\n branchName,\n oldBaseBranch: existingPr?.targetBranch,\n newBaseBranch: config.baseBranch,\n },\n 'PR base branch has changed',\n );\n updatePrConfig.targetBranch = config.baseBranch;\n }\n\n if (labelsNeedUpdate) {\n logger.debug(\n {\n branchName,\n prCurrentLabels,\n configuredLabels,\n },\n 'PR labels have changed',\n );\n\n // Divide labels into three categories:\n // i) addLabels: Labels that need to be added\n // ii) removeLabels: Labels that need to be removed\n // iii) labels: New labels for the PR, replacing the old labels array entirely.\n // This distinction is necessary because different platforms update labels differently\n // For more details, refer to the updatePr function of each platform.\n\n const [addLabels, removeLabels] = getChangedLabels(\n prCurrentLabels,\n configuredLabels,\n );\n\n // for Gitea\n updatePrConfig.labels = configuredLabels;\n\n // for GitHub, GitLab\n updatePrConfig.addLabels = addLabels;\n updatePrConfig.removeLabels = removeLabels;\n }\n if (existingPrTitle !== newPrTitle) {\n logger.debug(\n {\n branchName,\n oldPrTitle: existingPr.title,\n newPrTitle: prTitle,\n },\n 'PR title changed',\n );\n } else if (!config.committedFiles && !config.rebaseRequested) {\n logger.debug(\n {\n prTitle,\n },\n 'PR body changed',\n );\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would update PR #${existingPr.number}`);\n return { type: 'with-pr', pr: existingPr };\n } else {\n await platform.updatePr(updatePrConfig);\n logger.info({ pr: existingPr.number, prTitle }, `PR updated`);\n setPrCache(branchName, prBodyFingerprint, true);\n }\n return {\n type: 'with-pr',\n pr: {\n ...existingPr,\n bodyStruct: getPrBodyStruct(prBody),\n title: prTitle,\n targetBranch: config.baseBranch,\n },\n };\n }\n logger.debug({ branch: branchName, prTitle }, `Creating PR`);\n if (config.updateType === 'rollback') {\n logger.info('Creating Rollback PR');\n }\n let pr: Pr | null;\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { labels: prepareLabels(config) },\n 'DRY-RUN: Would create PR: ' + prTitle,\n );\n pr = { number: 0 } as never;\n } else {\n try {\n if (\n !dependencyDashboardCheck &&\n isLimitReached('ConcurrentPRs', prConfig) &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Skipping PR - limit reached');\n return { type: 'without-pr', prBlockedBy: 'RateLimited' };\n }\n pr = await platform.createPr({\n sourceBranch: branchName,\n targetBranch: config.baseBranch,\n prTitle,\n prBody,\n labels: prepareLabels(config),\n platformPrOptions: getPlatformPrOptions(config),\n draftPR: !!config.draftPR,\n milestone: config.milestone,\n });\n\n incCountValue('ConcurrentPRs');\n incCountValue('HourlyPRs');\n logger.info(\n { pr: pr?.number, prTitle, labels: pr?.labels },\n 'PR created',\n );\n } catch (err) {\n logger.debug({ err }, 'Pull request creation error');\n if (\n err.body?.message === 'Validation failed' &&\n err.body.errors?.length &&\n err.body.errors.some((error: { message?: string }) =>\n error.message?.startsWith('A pull request already exists'),\n )\n ) {\n logger.warn('A pull requests already exists');\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n if (err.statusCode === 502) {\n logger.warn(\n { branch: branchName },\n 'Deleting branch due to server error',\n );\n await scm.deleteBranch(branchName);\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n }\n if (\n pr &&\n config.branchAutomergeFailureMessage &&\n !config.suppressNotifications?.includes('branchAutomergeFailure')\n ) {\n const topic = 'Branch automerge failure';\n let content =\n 'This PR was configured for branch automerge. However, this is not possible, so it has been raised as a PR instead.';\n if (config.branchAutomergeFailureMessage === 'branch status error') {\n content += '\\n___\\n * Branch has one or more failed status checks';\n }\n content = platform.massageMarkdown(content, config.rebaseLabel);\n logger.debug('Adding branch automerge failure message to PR');\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would add comment to PR #${pr.number}`);\n } else {\n await ensureComment({\n number: pr.number,\n topic,\n content,\n });\n }\n }\n // Skip assign and review if automerging PR\n if (pr) {\n if (\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) !== 'red'\n ) {\n logger.debug(\n `Skipping assignees and reviewers as automerge=${config.automerge}`,\n );\n } else {\n await addParticipants(config, pr);\n }\n setPrCache(branchName, prBodyFingerprint, true);\n logger.debug(`Created Pull Request #${pr.number}`);\n return { type: 'with-pr', pr };\n }\n } catch (err) {\n if (\n // oxlint-disable-next-line typescript/prefer-optional-chain -- instanceof is not a null guard\n err instanceof ExternalHostError ||\n err.message === REPOSITORY_CHANGED ||\n err.message === PLATFORM_RATE_LIMIT_EXCEEDED ||\n err.message === PLATFORM_INTEGRATION_UNAUTHORIZED\n ) {\n logger.debug('Passing error up');\n throw err;\n }\n logger.warn({ err, prTitle }, 'Failed to ensure PR');\n }\n if (existingPr) {\n return { type: 'with-pr', pr: existingPr };\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\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.
|
|
4
|
+
"version": "43.121.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
"@redis/client": "5.11.0",
|
|
122
122
|
"@renovatebot/detect-tools": "3.0.0",
|
|
123
123
|
"@renovatebot/good-enough-parser": "2.0.0",
|
|
124
|
-
"@renovatebot/osv-offline": "2.
|
|
124
|
+
"@renovatebot/osv-offline": "2.5.0",
|
|
125
125
|
"@renovatebot/pep440": "4.2.2",
|
|
126
126
|
"@renovatebot/pgp": "1.3.5",
|
|
127
127
|
"@renovatebot/ruby-semver": "4.1.2",
|
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 43.
|
|
3
|
+
"title": "JSON schema for Renovate 43.121.0 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "43.
|
|
5
|
+
"x-renovate-version": "43.121.0",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"properties": {
|