renovate 43.272.8 → 43.273.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.
@@ -1,7 +1,7 @@
1
1
  import { InternalGlobalConfigOptions, RenovateConfig, RepoGlobalConfig } from "./types.js";
2
2
  //#region lib/config/global.d.ts
3
3
  declare class GlobalConfig {
4
- static OPTIONS: readonly (keyof RepoGlobalConfig | keyof InternalGlobalConfigOptions)[];
4
+ static OPTIONS: readonly ["allowCustomCrateRegistries", "allowPlugins", "allowScripts", "allowShellExecutorForPostUpgradeCommands", "allowedCommands", "allowedEnv", "allowedHeaders", "allowedUnsafeExecutions", "autodiscoverRepoOrder", "autodiscoverRepoSort", "bbUseDevelopmentBranch", "binarySource", "cacheDir", "cacheHardTtlMinutes", "cachePrivatePackages", "cacheTtlOverride", "checkedBranches", "configFileNames", "containerbaseDir", "customEnvVariables", "dockerChildPrefix", "dockerCliOptions", "dockerMaxPages", "dockerSidecarImage", "dockerUser", "dryRun", "encryptedWarning", "endpoint", "executionTimeout", "exposeAllEnv", "gitTimeout", "githubTokenWarn", "httpCacheTtlDays", "ignorePrAuthor", "includeMirrors", "localDir", "migratePresets", "onboarding", "onboardingAutoCloseAge", "onboardingBranch", "onboardingCommitMessage", "onboardingConfig", "onboardingConfigFileName", "onboardingNoDeps", "onboardingPrTitle", "platform", "prCacheSyncMaxPages", "presetCachePersistence", "productLinks", "rebaseAllOpenBranches", "repositoryCacheForceLocal", "requireConfig", "s3Endpoint", "s3PathStyle", "toolSettings", "userAgent"];
5
5
  private static config;
6
6
  static get(): RepoGlobalConfig & InternalGlobalConfigOptions;
7
7
  static get<Key extends keyof RepoGlobalConfig | keyof InternalGlobalConfigOptions>(key: Key): Required<RepoGlobalConfig & InternalGlobalConfigOptions>[Key];
@@ -1 +1 @@
1
- {"version":3,"file":"global.js","names":[],"sources":["../../lib/config/global.ts"],"sourcesContent":["import { globalConfigOptionDefaults } from '../global-config-option-defaults.generated.ts';\nimport type {\n InternalGlobalConfigOptions,\n RenovateConfig,\n RepoGlobalConfig,\n} from './types.ts';\n\nexport class GlobalConfig {\n // TODO: once global config work is complete, add a test to make sure this list includes all options with globalOnly=true (#9603)\n static OPTIONS: readonly (\n | keyof RepoGlobalConfig\n | keyof InternalGlobalConfigOptions\n )[] = [\n 'allowCustomCrateRegistries',\n 'allowPlugins',\n 'allowScripts',\n 'allowShellExecutorForPostUpgradeCommands',\n 'allowedCommands',\n 'allowedEnv',\n 'allowedHeaders',\n 'allowedUnsafeExecutions',\n 'autodiscoverRepoOrder',\n 'autodiscoverRepoSort',\n 'bbUseDevelopmentBranch',\n 'binarySource',\n 'cacheDir',\n 'cacheHardTtlMinutes',\n 'cachePrivatePackages',\n 'cacheTtlOverride',\n 'checkedBranches',\n 'configFileNames',\n 'containerbaseDir',\n 'customEnvVariables',\n 'dockerChildPrefix',\n 'dockerCliOptions',\n 'dockerMaxPages',\n 'dockerSidecarImage',\n 'dockerUser',\n 'dryRun',\n 'encryptedWarning',\n 'endpoint',\n 'executionTimeout',\n 'exposeAllEnv',\n 'gitTimeout',\n 'githubTokenWarn',\n 'httpCacheTtlDays',\n 'ignorePrAuthor',\n 'includeMirrors',\n /** NOTE that this is not a config option, but an internal variable **/\n 'localDir',\n 'migratePresets',\n 'onboarding',\n 'onboardingAutoCloseAge',\n 'onboardingBranch',\n 'onboardingCommitMessage',\n 'onboardingConfig',\n 'onboardingConfigFileName',\n 'onboardingNoDeps',\n 'onboardingPrTitle',\n 'platform',\n 'prCacheSyncMaxPages',\n 'presetCachePersistence',\n 'productLinks',\n 'rebaseAllOpenBranches',\n 'repositoryCacheForceLocal',\n 'requireConfig',\n 's3Endpoint',\n 's3PathStyle',\n 'toolSettings',\n 'userAgent',\n ];\n\n private static config: RepoGlobalConfig & InternalGlobalConfigOptions = {};\n\n static get(): RepoGlobalConfig & InternalGlobalConfigOptions;\n static get<\n Key extends keyof RepoGlobalConfig | keyof InternalGlobalConfigOptions,\n >(key: Key): Required<RepoGlobalConfig & InternalGlobalConfigOptions>[Key];\n static get<\n Key extends keyof RepoGlobalConfig | keyof InternalGlobalConfigOptions,\n >(\n key?: Key,\n ):\n | (RepoGlobalConfig & InternalGlobalConfigOptions)\n | Required<RepoGlobalConfig & InternalGlobalConfigOptions>[Key] {\n const defaultValue = key\n ? (globalConfigOptionDefaults[key] as Required<\n RepoGlobalConfig & InternalGlobalConfigOptions\n >[Key])\n : undefined;\n\n return key\n ? ((GlobalConfig.config[key] ?? defaultValue) as Required<\n RepoGlobalConfig & InternalGlobalConfigOptions\n >[Key])\n : GlobalConfig.config;\n }\n\n static set(\n config: RenovateConfig & RepoGlobalConfig & InternalGlobalConfigOptions,\n ): RenovateConfig {\n GlobalConfig.reset();\n\n const result = { ...config };\n for (const option of GlobalConfig.OPTIONS) {\n GlobalConfig.config[option] = config[option] as never;\n delete result[option];\n }\n\n return result;\n }\n\n static reset(): void {\n GlobalConfig.config = {};\n }\n}\n"],"mappings":";;AAOA,IAAa,eAAb,MAAa,aAAa;CAExB,OAAO,UAGD;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,OAAe,SAAyD,CAAC;CAMzE,OAAO,IAGL,KAGgE;EAChE,MAAM,eAAe,MAChB,2BAA2B,OAG5B,KAAA;EAEJ,OAAO,MACD,aAAa,OAAO,QAAQ,eAG9B,aAAa;CACnB;CAEA,OAAO,IACL,QACgB;EAChB,aAAa,MAAM;EAEnB,MAAM,SAAS,EAAE,GAAG,OAAO;EAC3B,KAAK,MAAM,UAAU,aAAa,SAAS;GACzC,aAAa,OAAO,UAAU,OAAO;GACrC,OAAO,OAAO;EAChB;EAEA,OAAO;CACT;CAEA,OAAO,QAAc;EACnB,aAAa,SAAS,CAAC;CACzB;AACF"}
1
+ {"version":3,"file":"global.js","names":[],"sources":["../../lib/config/global.ts"],"sourcesContent":["import { globalConfigOptionDefaults } from '../global-config-option-defaults.generated.ts';\nimport type {\n InternalGlobalConfigOptions,\n RenovateConfig,\n RepoGlobalConfig,\n} from './types.ts';\n\nexport class GlobalConfig {\n // TODO: once global config work is complete, add a test to make sure this list includes all options with globalOnly=true (#9603)\n static OPTIONS = [\n 'allowCustomCrateRegistries',\n 'allowPlugins',\n 'allowScripts',\n 'allowShellExecutorForPostUpgradeCommands',\n 'allowedCommands',\n 'allowedEnv',\n 'allowedHeaders',\n 'allowedUnsafeExecutions',\n 'autodiscoverRepoOrder',\n 'autodiscoverRepoSort',\n 'bbUseDevelopmentBranch',\n 'binarySource',\n 'cacheDir',\n 'cacheHardTtlMinutes',\n 'cachePrivatePackages',\n 'cacheTtlOverride',\n 'checkedBranches',\n 'configFileNames',\n 'containerbaseDir',\n 'customEnvVariables',\n 'dockerChildPrefix',\n 'dockerCliOptions',\n 'dockerMaxPages',\n 'dockerSidecarImage',\n 'dockerUser',\n 'dryRun',\n 'encryptedWarning',\n 'endpoint',\n 'executionTimeout',\n 'exposeAllEnv',\n 'gitTimeout',\n 'githubTokenWarn',\n 'httpCacheTtlDays',\n 'ignorePrAuthor',\n 'includeMirrors',\n /** NOTE that this is not a config option, but an internal variable **/\n 'localDir',\n 'migratePresets',\n 'onboarding',\n 'onboardingAutoCloseAge',\n 'onboardingBranch',\n 'onboardingCommitMessage',\n 'onboardingConfig',\n 'onboardingConfigFileName',\n 'onboardingNoDeps',\n 'onboardingPrTitle',\n 'platform',\n 'prCacheSyncMaxPages',\n 'presetCachePersistence',\n 'productLinks',\n 'rebaseAllOpenBranches',\n 'repositoryCacheForceLocal',\n 'requireConfig',\n 's3Endpoint',\n 's3PathStyle',\n 'toolSettings',\n 'userAgent',\n ] as const satisfies readonly (\n | keyof RepoGlobalConfig\n | keyof InternalGlobalConfigOptions\n )[];\n\n private static config: RepoGlobalConfig & InternalGlobalConfigOptions = {};\n\n static get(): RepoGlobalConfig & InternalGlobalConfigOptions;\n static get<\n Key extends keyof RepoGlobalConfig | keyof InternalGlobalConfigOptions,\n >(key: Key): Required<RepoGlobalConfig & InternalGlobalConfigOptions>[Key];\n static get<\n Key extends keyof RepoGlobalConfig | keyof InternalGlobalConfigOptions,\n >(\n key?: Key,\n ):\n | (RepoGlobalConfig & InternalGlobalConfigOptions)\n | Required<RepoGlobalConfig & InternalGlobalConfigOptions>[Key] {\n const defaultValue = key\n ? (globalConfigOptionDefaults[key] as Required<\n RepoGlobalConfig & InternalGlobalConfigOptions\n >[Key])\n : undefined;\n\n return key\n ? ((GlobalConfig.config[key] ?? defaultValue) as Required<\n RepoGlobalConfig & InternalGlobalConfigOptions\n >[Key])\n : GlobalConfig.config;\n }\n\n static set(\n config: RenovateConfig & RepoGlobalConfig & InternalGlobalConfigOptions,\n ): RenovateConfig {\n GlobalConfig.reset();\n\n const result = { ...config };\n for (const option of GlobalConfig.OPTIONS) {\n GlobalConfig.config[option] = config[option] as never;\n delete result[option];\n }\n\n return result;\n }\n\n static reset(): void {\n GlobalConfig.config = {};\n }\n}\n"],"mappings":";;AAOA,IAAa,eAAb,MAAa,aAAa;CAExB,OAAO,UAAU;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAKA,OAAe,SAAyD,CAAC;CAMzE,OAAO,IAGL,KAGgE;EAChE,MAAM,eAAe,MAChB,2BAA2B,OAG5B,KAAA;EAEJ,OAAO,MACD,aAAa,OAAO,QAAQ,eAG9B,aAAa;CACnB;CAEA,OAAO,IACL,QACgB;EAChB,aAAa,MAAM;EAEnB,MAAM,SAAS,EAAE,GAAG,OAAO;EAC3B,KAAK,MAAM,UAAU,aAAa,SAAS;GACzC,aAAa,OAAO,UAAU,OAAO;GACrC,OAAO,OAAO;EAChB;EAEA,OAAO;CACT;CAEA,OAAO,QAAc;EACnB,aAAa,SAAS,CAAC;CACzB;AACF"}
@@ -164,7 +164,7 @@ function extractPackageFile(content, _packageFile, config) {
164
164
  if (argMatch?.groups?.name) {
165
165
  argsLines[argMatch.groups.name] = [lineNumberInstrStart, lineNumber];
166
166
  let argMatchValue = argMatch.groups?.value;
167
- if (argMatchValue.startsWith("\"") && argMatchValue.endsWith("\"")) argMatchValue = argMatchValue.slice(1, -1);
167
+ if (argMatchValue.startsWith("\"") && argMatchValue.endsWith("\"") || argMatchValue.startsWith("'") && argMatchValue.endsWith("'")) argMatchValue = argMatchValue.slice(1, -1);
168
168
  args[argMatch.groups.name] = argMatchValue || "";
169
169
  }
170
170
  const fromRegex = new RegExp(`^[ \\t]*FROM(?:${escapeChar}[ \\t]*\\r?\\n| |\\t|#.*?\\r?\\n|--platform=\\S+)+(?<image>\\S+)(?:(?:${escapeChar}[ \\t]*\\r?\\n| |\\t|#.*?\\r?\\n)+as[ \\t]+(?<name>\\S+))?`, "im");
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":["ubuntuVersioning.id","debianVersioning.id"],"sources":["../../../../lib/modules/manager/dockerfile/extract.ts"],"sourcesContent":["import { isNonEmptyStringAndNotWhitespace, isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport * as debianVersioning from '../../versioning/debian/index.ts';\nimport * as ubuntuVersioning from '../../versioning/ubuntu/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\n\nconst variableMarker = '$';\n\nexport function extractVariables(image: string): Record<string, string> {\n const variables: Record<string, string> = {};\n const variableRegex = regEx(\n /(?<fullvariable>\\\\?\\$(?<simplearg>\\w+)|\\\\?\\${(?<complexarg>\\w+)(?::.+?)?}+)/gi,\n );\n\n let match: RegExpExecArray | null;\n do {\n match = variableRegex.exec(image);\n if (match?.groups?.fullvariable) {\n variables[match.groups.fullvariable] =\n match.groups?.simplearg || match.groups?.complexarg;\n }\n } while (match);\n\n return variables;\n}\n\nfunction getAutoReplaceTemplate(dep: PackageDependency): string | undefined {\n let template = dep.replaceString;\n\n if (dep.currentValue) {\n let placeholder = '{{#if newValue}}{{newValue}}{{/if}}';\n if (!dep.currentDigest) {\n placeholder += '{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n template = template?.replace(dep.currentValue, placeholder);\n }\n\n if (dep.currentDigest) {\n template = template?.replace(\n dep.currentDigest,\n '{{#if newDigest}}{{newDigest}}{{/if}}',\n );\n }\n\n return template;\n}\n\nfunction processDepForAutoReplace(\n dep: PackageDependency,\n lineNumberRanges: number[][],\n lines: string[],\n linefeed: string,\n): void {\n const lineNumberRangesToReplace: number[][] = [];\n for (const lineNumberRange of lineNumberRanges) {\n for (const lineNumber of lineNumberRange) {\n if (\n (isString(dep.currentValue) &&\n lines[lineNumber].includes(dep.currentValue)) ||\n (isString(dep.currentDigest) &&\n lines[lineNumber].includes(dep.currentDigest))\n ) {\n lineNumberRangesToReplace.push(lineNumberRange);\n }\n }\n }\n\n lineNumberRangesToReplace.sort((a, b) => {\n return a[0] - b[0];\n });\n\n const minLine = lineNumberRangesToReplace[0]?.[0];\n const maxLine = lineNumberRangesToReplace.at(-1)?.[1];\n if (\n lineNumberRanges.length === 1 ||\n minLine === undefined ||\n maxLine === undefined\n ) {\n return;\n }\n\n const unfoldedLineNumbers = Array.from(\n { length: maxLine - minLine + 1 },\n (_v, k) => k + minLine,\n );\n\n dep.replaceString = unfoldedLineNumbers\n .map((lineNumber) => lines[lineNumber])\n .join(linefeed);\n\n if (!dep.currentDigest) {\n dep.replaceString += linefeed;\n }\n\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n}\n\nexport function splitImageParts(currentFrom: string): PackageDependency {\n let isVariable = false;\n let cleanedCurrentFrom = currentFrom;\n\n // Check if we have a variable in format of \"${VARIABLE:-<image>:<defaultVal>@<digest>}\"\n // If so, remove everything except the image, defaultVal and digest.\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n const defaultValueRegex = regEx(/^\\${.+?:-\"?(?<value>.*?)\"?}$/);\n const defaultValueMatch =\n defaultValueRegex.exec(cleanedCurrentFrom)?.groups;\n if (defaultValueMatch?.value) {\n isVariable = true;\n cleanedCurrentFrom = defaultValueMatch.value;\n }\n\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n // If cleanedCurrentFrom contains a variable, after cleaning, e.g. \"$REGISTRY/alpine\", we do not support this.\n return {\n skipReason: 'contains-variable',\n };\n }\n }\n\n const [currentDepTag, currentDigest] = cleanedCurrentFrom.split('@');\n const depTagSplit = currentDepTag.split(':');\n let depName: string;\n let currentValue: string | undefined;\n if (depTagSplit.length === 1 || depTagSplit.at(-1)!.includes('/')) {\n depName = currentDepTag;\n } else {\n currentValue = depTagSplit.pop();\n depName = depTagSplit.join(':');\n }\n\n const dep: PackageDependency = {\n depName,\n packageName: depName,\n currentValue,\n currentDigest,\n };\n\n if (isVariable) {\n dep.replaceString = cleanedCurrentFrom;\n\n if (!dep.currentValue) {\n delete dep.currentValue;\n }\n\n if (!dep.currentDigest) {\n delete dep.currentDigest;\n }\n }\n\n return dep;\n}\n\nconst quayRegex = regEx(/^quay\\.io(?::[1-9][0-9]{0,4})?/i);\n\nexport function getDep(\n currentFrom: string | null | undefined,\n specifyReplaceString = true,\n registryAliases?: Record<string, string>,\n): PackageDependency {\n if (\n !isString(currentFrom) ||\n !isNonEmptyStringAndNotWhitespace(currentFrom)\n ) {\n return {\n skipReason: 'invalid-value',\n };\n }\n\n // Resolve registry aliases first so that we don't need special casing later on:\n for (const [name, value] of Object.entries(registryAliases ?? {})) {\n if (currentFrom.startsWith(`${name}/`)) {\n const depName = currentFrom.substring(name.length + 1);\n const dep = getDep(`${value}/${depName}`, false);\n // retain depName, not sure if condition is necessary\n if (dep.depName?.startsWith(value)) {\n dep.packageName = dep.depName;\n dep.depName = `${name}/${dep.depName.substring(value.length + 1)}`;\n }\n if (specifyReplaceString) {\n dep.replaceString = currentFrom;\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n }\n return dep;\n }\n }\n\n const dep = splitImageParts(currentFrom);\n if (specifyReplaceString) {\n dep.replaceString ??= currentFrom;\n dep.autoReplaceStringTemplate =\n '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n dep.datasource = DockerDatasource.id;\n\n // Pretty up special prefixes\n if (dep.depName) {\n const specialPrefixes = ['amd64', 'arm64', 'library'];\n for (const prefix of specialPrefixes) {\n if (dep.depName.startsWith(`${prefix}/`)) {\n dep.depName = dep.depName.replace(`${prefix}/`, '');\n if (specifyReplaceString) {\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n }\n }\n\n if (dep.depName === 'ubuntu' || dep.depName?.endsWith('/ubuntu')) {\n dep.versioning = ubuntuVersioning.id;\n }\n\n if (\n (dep.depName === 'debian' || dep.depName?.endsWith('/debian')) &&\n debianVersioning.api.isVersion(dep.currentValue)\n ) {\n dep.versioning = debianVersioning.id;\n }\n\n // Don't display quay.io ports\n if (dep.depName && quayRegex.test(dep.depName)) {\n const depName = dep.depName.replace(quayRegex, 'quay.io');\n if (depName !== dep.depName) {\n dep.depName = depName;\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n\n return dep;\n}\n\nexport function extractPackageFile(\n content: string,\n _packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const sanitizedContent = content.replace(regEx(/^\\uFEFF/), ''); // remove bom marker\n const deps: PackageDependency[] = [];\n const stageNames: string[] = [];\n const args: Record<string, string> = {};\n const argsLines: Record<string, number[]> = {};\n\n let escapeChar = '\\\\\\\\';\n let lookForEscapeChar = true;\n let lookForSyntaxDirective = true;\n\n const lineFeed = sanitizedContent.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = sanitizedContent.split(newlineRegex);\n for (let lineNumber = 0; lineNumber < lines.length; ) {\n const lineNumberInstrStart = lineNumber;\n let instruction = lines[lineNumber];\n\n if (lookForEscapeChar) {\n const directivesMatch = regEx(\n /^[ \\t]*#[ \\t]*(?<directive>syntax|escape)[ \\t]*=[ \\t]*(?<escapeChar>\\S)/i,\n ).exec(instruction);\n if (!directivesMatch) {\n lookForEscapeChar = false;\n } else if (directivesMatch.groups?.directive.toLowerCase() === 'escape') {\n if (directivesMatch.groups?.escapeChar === '`') {\n escapeChar = '`';\n }\n lookForEscapeChar = false;\n }\n }\n\n if (lookForSyntaxDirective) {\n const syntaxRegex = regEx(\n '^#[ \\\\t]*syntax[ \\\\t]*=[ \\\\t]*(?<image>\\\\S+)',\n 'im',\n );\n const syntaxMatch = instruction.match(syntaxRegex);\n if (syntaxMatch?.groups?.image) {\n const syntaxImage = syntaxMatch.groups.image;\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n const dep = getDep(syntaxImage, true, config.registryAliases);\n dep.depType = 'syntax';\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile # syntax',\n );\n deps.push(dep);\n }\n lookForSyntaxDirective = false;\n }\n\n const lineContinuationRegex = regEx(`${escapeChar}[ \\\\t]*$|^[ \\\\t]*#`, 'm');\n let lineLookahead = instruction;\n while (\n !lookForEscapeChar &&\n !instruction.trimStart().startsWith('#') &&\n lineContinuationRegex.test(lineLookahead)\n ) {\n lineLookahead = lines[++lineNumber] || '';\n instruction += `\\n${lineLookahead}`;\n }\n\n const argRegex = regEx(\n `^[ \\\\t]*ARG(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+(?<name>\\\\w+)[ =](?<value>\\\\S*)`,\n 'im',\n );\n const argMatch = argRegex.exec(instruction);\n if (argMatch?.groups?.name) {\n argsLines[argMatch.groups.name] = [lineNumberInstrStart, lineNumber];\n let argMatchValue = argMatch.groups?.value;\n\n if (argMatchValue.startsWith('\"') && argMatchValue.endsWith('\"')) {\n argMatchValue = argMatchValue.slice(1, -1);\n }\n\n args[argMatch.groups.name] = argMatchValue || '';\n }\n\n const fromRegex = new RegExp(\n `^[ \\\\t]*FROM(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--platform=\\\\S+)+(?<image>\\\\S+)(?:(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+as[ \\\\t]+(?<name>\\\\S+))?`,\n 'im',\n ); // TODO #12875 complex for re2 has too many not supported groups\n const fromMatch = instruction.match(fromRegex);\n if (fromMatch?.groups?.image) {\n let fromImage = fromMatch.groups.image;\n const lineNumberRanges: number[][] = [[lineNumberInstrStart, lineNumber]];\n\n if (fromImage.includes(variableMarker)) {\n const variables = extractVariables(fromImage);\n for (const [fullVariable, argName] of Object.entries(variables)) {\n const resolvedArgValue = args[argName];\n if (resolvedArgValue || resolvedArgValue === '') {\n fromImage = fromImage.replaceAll(fullVariable, resolvedArgValue);\n lineNumberRanges.push(argsLines[argName]);\n }\n }\n }\n\n if (fromMatch.groups?.name) {\n logger.debug(\n `Found a multistage build stage name: ${fromMatch.groups.name}`,\n );\n stageNames.push(fromMatch.groups.name);\n }\n if (fromImage === 'scratch') {\n logger.debug('Skipping scratch');\n } else if (fromImage && stageNames.includes(fromImage)) {\n logger.debug(`Skipping alias FROM image:${fromImage}`);\n } else {\n const dep = getDep(fromImage, true, config.registryAliases);\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile FROM',\n );\n deps.push(dep);\n }\n }\n\n const copyFromRegex = new RegExp(\n `^[ \\\\t]*COPY(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--from=(?<image>\\\\S+)`,\n 'im',\n ); // TODO #12875 complex for re2 has too many not supported groups\n const copyFromMatch = instruction.match(copyFromRegex);\n if (copyFromMatch?.groups?.image) {\n if (stageNames.includes(copyFromMatch.groups.image)) {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping alias COPY --from',\n );\n } else if (Number.isNaN(Number(copyFromMatch.groups.image))) {\n const dep = getDep(\n copyFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile COPY --from',\n );\n deps.push(dep);\n } else {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping index reference COPY --from',\n );\n }\n }\n\n const runMountFromRegex = regEx(\n `^[ \\\\t]*RUN(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--mount=(?:\\\\S*=\\\\S*,)*from=(?<image>[^, ]+)`,\n 'im',\n );\n const runMountFromMatch = instruction.match(runMountFromRegex);\n if (runMountFromMatch?.groups?.image) {\n if (stageNames.includes(runMountFromMatch.groups.image)) {\n logger.debug(\n { image: runMountFromMatch.groups.image },\n 'Skipping alias RUN --mount=from',\n );\n } else {\n const dep = getDep(\n runMountFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile RUN --mount=from',\n );\n deps.push(dep);\n }\n }\n\n lineNumber += 1;\n }\n\n if (!deps.length) {\n return null;\n }\n for (const d of deps) {\n d.depType ??= 'stage';\n }\n deps.at(-1)!.depType = 'final';\n return { deps };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","names":["ubuntuVersioning.id","debianVersioning.id"],"sources":["../../../../lib/modules/manager/dockerfile/extract.ts"],"sourcesContent":["import { isNonEmptyStringAndNotWhitespace, isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport * as debianVersioning from '../../versioning/debian/index.ts';\nimport * as ubuntuVersioning from '../../versioning/ubuntu/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\n\nconst variableMarker = '$';\n\nexport function extractVariables(image: string): Record<string, string> {\n const variables: Record<string, string> = {};\n const variableRegex = regEx(\n /(?<fullvariable>\\\\?\\$(?<simplearg>\\w+)|\\\\?\\${(?<complexarg>\\w+)(?::.+?)?}+)/gi,\n );\n\n let match: RegExpExecArray | null;\n do {\n match = variableRegex.exec(image);\n if (match?.groups?.fullvariable) {\n variables[match.groups.fullvariable] =\n match.groups?.simplearg || match.groups?.complexarg;\n }\n } while (match);\n\n return variables;\n}\n\nfunction getAutoReplaceTemplate(dep: PackageDependency): string | undefined {\n let template = dep.replaceString;\n\n if (dep.currentValue) {\n let placeholder = '{{#if newValue}}{{newValue}}{{/if}}';\n if (!dep.currentDigest) {\n placeholder += '{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n template = template?.replace(dep.currentValue, placeholder);\n }\n\n if (dep.currentDigest) {\n template = template?.replace(\n dep.currentDigest,\n '{{#if newDigest}}{{newDigest}}{{/if}}',\n );\n }\n\n return template;\n}\n\nfunction processDepForAutoReplace(\n dep: PackageDependency,\n lineNumberRanges: number[][],\n lines: string[],\n linefeed: string,\n): void {\n const lineNumberRangesToReplace: number[][] = [];\n for (const lineNumberRange of lineNumberRanges) {\n for (const lineNumber of lineNumberRange) {\n if (\n (isString(dep.currentValue) &&\n lines[lineNumber].includes(dep.currentValue)) ||\n (isString(dep.currentDigest) &&\n lines[lineNumber].includes(dep.currentDigest))\n ) {\n lineNumberRangesToReplace.push(lineNumberRange);\n }\n }\n }\n\n lineNumberRangesToReplace.sort((a, b) => {\n return a[0] - b[0];\n });\n\n const minLine = lineNumberRangesToReplace[0]?.[0];\n const maxLine = lineNumberRangesToReplace.at(-1)?.[1];\n if (\n lineNumberRanges.length === 1 ||\n minLine === undefined ||\n maxLine === undefined\n ) {\n return;\n }\n\n const unfoldedLineNumbers = Array.from(\n { length: maxLine - minLine + 1 },\n (_v, k) => k + minLine,\n );\n\n dep.replaceString = unfoldedLineNumbers\n .map((lineNumber) => lines[lineNumber])\n .join(linefeed);\n\n if (!dep.currentDigest) {\n dep.replaceString += linefeed;\n }\n\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n}\n\nexport function splitImageParts(currentFrom: string): PackageDependency {\n let isVariable = false;\n let cleanedCurrentFrom = currentFrom;\n\n // Check if we have a variable in format of \"${VARIABLE:-<image>:<defaultVal>@<digest>}\"\n // If so, remove everything except the image, defaultVal and digest.\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n const defaultValueRegex = regEx(/^\\${.+?:-\"?(?<value>.*?)\"?}$/);\n const defaultValueMatch =\n defaultValueRegex.exec(cleanedCurrentFrom)?.groups;\n if (defaultValueMatch?.value) {\n isVariable = true;\n cleanedCurrentFrom = defaultValueMatch.value;\n }\n\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n // If cleanedCurrentFrom contains a variable, after cleaning, e.g. \"$REGISTRY/alpine\", we do not support this.\n return {\n skipReason: 'contains-variable',\n };\n }\n }\n\n const [currentDepTag, currentDigest] = cleanedCurrentFrom.split('@');\n const depTagSplit = currentDepTag.split(':');\n let depName: string;\n let currentValue: string | undefined;\n if (depTagSplit.length === 1 || depTagSplit.at(-1)!.includes('/')) {\n depName = currentDepTag;\n } else {\n currentValue = depTagSplit.pop();\n depName = depTagSplit.join(':');\n }\n\n const dep: PackageDependency = {\n depName,\n packageName: depName,\n currentValue,\n currentDigest,\n };\n\n if (isVariable) {\n dep.replaceString = cleanedCurrentFrom;\n\n if (!dep.currentValue) {\n delete dep.currentValue;\n }\n\n if (!dep.currentDigest) {\n delete dep.currentDigest;\n }\n }\n\n return dep;\n}\n\nconst quayRegex = regEx(/^quay\\.io(?::[1-9][0-9]{0,4})?/i);\n\nexport function getDep(\n currentFrom: string | null | undefined,\n specifyReplaceString = true,\n registryAliases?: Record<string, string>,\n): PackageDependency {\n if (\n !isString(currentFrom) ||\n !isNonEmptyStringAndNotWhitespace(currentFrom)\n ) {\n return {\n skipReason: 'invalid-value',\n };\n }\n\n // Resolve registry aliases first so that we don't need special casing later on:\n for (const [name, value] of Object.entries(registryAliases ?? {})) {\n if (currentFrom.startsWith(`${name}/`)) {\n const depName = currentFrom.substring(name.length + 1);\n const dep = getDep(`${value}/${depName}`, false);\n // retain depName, not sure if condition is necessary\n if (dep.depName?.startsWith(value)) {\n dep.packageName = dep.depName;\n dep.depName = `${name}/${dep.depName.substring(value.length + 1)}`;\n }\n if (specifyReplaceString) {\n dep.replaceString = currentFrom;\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n }\n return dep;\n }\n }\n\n const dep = splitImageParts(currentFrom);\n if (specifyReplaceString) {\n dep.replaceString ??= currentFrom;\n dep.autoReplaceStringTemplate =\n '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n dep.datasource = DockerDatasource.id;\n\n // Pretty up special prefixes\n if (dep.depName) {\n const specialPrefixes = ['amd64', 'arm64', 'library'];\n for (const prefix of specialPrefixes) {\n if (dep.depName.startsWith(`${prefix}/`)) {\n dep.depName = dep.depName.replace(`${prefix}/`, '');\n if (specifyReplaceString) {\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n }\n }\n\n if (dep.depName === 'ubuntu' || dep.depName?.endsWith('/ubuntu')) {\n dep.versioning = ubuntuVersioning.id;\n }\n\n if (\n (dep.depName === 'debian' || dep.depName?.endsWith('/debian')) &&\n debianVersioning.api.isVersion(dep.currentValue)\n ) {\n dep.versioning = debianVersioning.id;\n }\n\n // Don't display quay.io ports\n if (dep.depName && quayRegex.test(dep.depName)) {\n const depName = dep.depName.replace(quayRegex, 'quay.io');\n if (depName !== dep.depName) {\n dep.depName = depName;\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n\n return dep;\n}\n\nexport function extractPackageFile(\n content: string,\n _packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const sanitizedContent = content.replace(regEx(/^\\uFEFF/), ''); // remove bom marker\n const deps: PackageDependency[] = [];\n const stageNames: string[] = [];\n const args: Record<string, string> = {};\n const argsLines: Record<string, number[]> = {};\n\n let escapeChar = '\\\\\\\\';\n let lookForEscapeChar = true;\n let lookForSyntaxDirective = true;\n\n const lineFeed = sanitizedContent.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = sanitizedContent.split(newlineRegex);\n for (let lineNumber = 0; lineNumber < lines.length; ) {\n const lineNumberInstrStart = lineNumber;\n let instruction = lines[lineNumber];\n\n if (lookForEscapeChar) {\n const directivesMatch = regEx(\n /^[ \\t]*#[ \\t]*(?<directive>syntax|escape)[ \\t]*=[ \\t]*(?<escapeChar>\\S)/i,\n ).exec(instruction);\n if (!directivesMatch) {\n lookForEscapeChar = false;\n } else if (directivesMatch.groups?.directive.toLowerCase() === 'escape') {\n if (directivesMatch.groups?.escapeChar === '`') {\n escapeChar = '`';\n }\n lookForEscapeChar = false;\n }\n }\n\n if (lookForSyntaxDirective) {\n const syntaxRegex = regEx(\n '^#[ \\\\t]*syntax[ \\\\t]*=[ \\\\t]*(?<image>\\\\S+)',\n 'im',\n );\n const syntaxMatch = instruction.match(syntaxRegex);\n if (syntaxMatch?.groups?.image) {\n const syntaxImage = syntaxMatch.groups.image;\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n const dep = getDep(syntaxImage, true, config.registryAliases);\n dep.depType = 'syntax';\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile # syntax',\n );\n deps.push(dep);\n }\n lookForSyntaxDirective = false;\n }\n\n const lineContinuationRegex = regEx(`${escapeChar}[ \\\\t]*$|^[ \\\\t]*#`, 'm');\n let lineLookahead = instruction;\n while (\n !lookForEscapeChar &&\n !instruction.trimStart().startsWith('#') &&\n lineContinuationRegex.test(lineLookahead)\n ) {\n lineLookahead = lines[++lineNumber] || '';\n instruction += `\\n${lineLookahead}`;\n }\n\n const argRegex = regEx(\n `^[ \\\\t]*ARG(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+(?<name>\\\\w+)[ =](?<value>\\\\S*)`,\n 'im',\n );\n const argMatch = argRegex.exec(instruction);\n if (argMatch?.groups?.name) {\n argsLines[argMatch.groups.name] = [lineNumberInstrStart, lineNumber];\n let argMatchValue = argMatch.groups?.value;\n\n if (\n (argMatchValue.startsWith('\"') && argMatchValue.endsWith('\"')) ||\n (argMatchValue.startsWith(\"'\") && argMatchValue.endsWith(\"'\"))\n ) {\n argMatchValue = argMatchValue.slice(1, -1);\n }\n\n args[argMatch.groups.name] = argMatchValue || '';\n }\n\n const fromRegex = new RegExp(\n `^[ \\\\t]*FROM(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--platform=\\\\S+)+(?<image>\\\\S+)(?:(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+as[ \\\\t]+(?<name>\\\\S+))?`,\n 'im',\n ); // TODO #12875 complex for re2 has too many not supported groups\n const fromMatch = instruction.match(fromRegex);\n if (fromMatch?.groups?.image) {\n let fromImage = fromMatch.groups.image;\n const lineNumberRanges: number[][] = [[lineNumberInstrStart, lineNumber]];\n\n if (fromImage.includes(variableMarker)) {\n const variables = extractVariables(fromImage);\n for (const [fullVariable, argName] of Object.entries(variables)) {\n const resolvedArgValue = args[argName];\n if (resolvedArgValue || resolvedArgValue === '') {\n fromImage = fromImage.replaceAll(fullVariable, resolvedArgValue);\n lineNumberRanges.push(argsLines[argName]);\n }\n }\n }\n\n if (fromMatch.groups?.name) {\n logger.debug(\n `Found a multistage build stage name: ${fromMatch.groups.name}`,\n );\n stageNames.push(fromMatch.groups.name);\n }\n if (fromImage === 'scratch') {\n logger.debug('Skipping scratch');\n } else if (fromImage && stageNames.includes(fromImage)) {\n logger.debug(`Skipping alias FROM image:${fromImage}`);\n } else {\n const dep = getDep(fromImage, true, config.registryAliases);\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile FROM',\n );\n deps.push(dep);\n }\n }\n\n const copyFromRegex = new RegExp(\n `^[ \\\\t]*COPY(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--from=(?<image>\\\\S+)`,\n 'im',\n ); // TODO #12875 complex for re2 has too many not supported groups\n const copyFromMatch = instruction.match(copyFromRegex);\n if (copyFromMatch?.groups?.image) {\n if (stageNames.includes(copyFromMatch.groups.image)) {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping alias COPY --from',\n );\n } else if (Number.isNaN(Number(copyFromMatch.groups.image))) {\n const dep = getDep(\n copyFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile COPY --from',\n );\n deps.push(dep);\n } else {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping index reference COPY --from',\n );\n }\n }\n\n const runMountFromRegex = regEx(\n `^[ \\\\t]*RUN(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--mount=(?:\\\\S*=\\\\S*,)*from=(?<image>[^, ]+)`,\n 'im',\n );\n const runMountFromMatch = instruction.match(runMountFromRegex);\n if (runMountFromMatch?.groups?.image) {\n if (stageNames.includes(runMountFromMatch.groups.image)) {\n logger.debug(\n { image: runMountFromMatch.groups.image },\n 'Skipping alias RUN --mount=from',\n );\n } else {\n const dep = getDep(\n runMountFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile RUN --mount=from',\n );\n deps.push(dep);\n }\n }\n\n lineNumber += 1;\n }\n\n if (!deps.length) {\n return null;\n }\n for (const d of deps) {\n d.depType ??= 'stage';\n }\n deps.at(-1)!.depType = 'final';\n return { deps };\n}\n"],"mappings":"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"}
@@ -36,7 +36,7 @@ hashMap.set("deps-edn", "c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391
36
36
  hashMap.set("devbox", "c6204becff9e14b60b40f76ecb181f5292d4a2b39bca439afe6f9305cf6ce418");
37
37
  hashMap.set("devcontainer", "24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec");
38
38
  hashMap.set("docker-compose", "5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb");
39
- hashMap.set("dockerfile", "322b95f7e55dd78d7fe71306a6f649479eca61c60d75bb10b23604a230dbdd08");
39
+ hashMap.set("dockerfile", "54122792bf8ea0be98e0a0716e627e3115b40a5f0155ccd7ae0cfc52424a3478");
40
40
  hashMap.set("droneci", "237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee");
41
41
  hashMap.set("fleet", "d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e");
42
42
  hashMap.set("flux", "79fa6ec15676108739e468f43746b1174528ed97cf7e3a2ac3758993141d326d");
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','1d3568f42393d697f8f96d461b72077ee7a1044b654e87667a12f861b3083111');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','0407066010ebb3d7ad4c1afe6b9a3615a3c11d64dc3cf0674cb9dfc3ea272273');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','bd9208444eff1a4958061484db66a47b616c31f15a8d49d23b75c4560fcee83e');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','4994a8bd86d5bfb169d67c08efd8509b58c368c2bf3dd9bbe42553c0fabc3f1a');\nhashMap.set('bazel-module','40f6a862b4e72fcc7262ee41f8b570ea3fd5600d6d552b94ed3301bb201f5db5');\nhashMap.set('bazelisk','d71489650feefb0dbbe7461f924cb50e41c8eef8fe2e11acdec2d42d0212c8ef');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','f2d5b0a7c0c724d30e79e12688b1fc8ff8e344db0cc6389553e2f6001ddf8345');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','629eda7bc52772bcc5b9c7254ce43a4d0a109c8473ba7633235020193102fd1e');\nhashMap.set('cake','ed6d14c96161f1d3d927adc7e333b96585164e1f25151a87990914d57ae17fe1');\nhashMap.set('cargo','197fa953327d70c12fad864eacc4c2f25b8d92dcb7e7e6d19bdda473f650f786');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','38b7fdc82d1d5583870707a04c334aa6dd725b13648febddebed35ce888ca017');\nhashMap.set('composer','829e1483e9519e9ff8d33e40f18a3e3be87ad4a328e32dc1cfb42655709796f8');\nhashMap.set('conan','74ca922a0ffdf1a9dd44b83eb2b3a36c56c7d792031e3a4a484f293046be3ecd');\nhashMap.set('copier','02b3cf090d7b8b8b1c06dd025a7faf6db4e0b5eb58aba7c1da16d15ac934cf61');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','db87814a407e43b8edaf7ccdf1659407fd934597e4253a3f330b8219dc34c40e');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','c6204becff9e14b60b40f76ecb181f5292d4a2b39bca439afe6f9305cf6ce418');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','322b95f7e55dd78d7fe71306a6f649479eca61c60d75bb10b23604a230dbdd08');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','79fa6ec15676108739e468f43746b1174528ed97cf7e3a2ac3758993141d326d');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','2d12dc3bd8bb6d866843b48af2fd6594a99f4b2d6bc52613ff2b14642b78b466');\nhashMap.set('github-actions','a85781cdcfe5557acfb087bafbc78cc0d61a3f0d0d011d5e1cb6a5ba0fb8760b');\nhashMap.set('gitlabci','33c264edf7837fb8fbc4cf0078c8bd2d5a75431039b1db65bf47356df7753125');\nhashMap.set('gitlabci-include','ef696c478c2ac1723b3aca070ba9779be0e702fff0844054251ba0029523d0eb');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','02389785183c39d2896d7893414c5e1060023f95c1fe7b595bd06cc5c1186d39');\nhashMap.set('gomod','0e0ecc704a4c0370ac36f5592c1d0def1581ffb0df6d14114cef009b0365f84c');\nhashMap.set('gradle','62e769489ed98a4635c0f7e4dd839845d3cf487d76a68442eb2b7fe832fcd150');\nhashMap.set('gradle-wrapper','81760ab88a1bed36b0381684396934cf7875e3466c01df8c98f410173f3168f4');\nhashMap.set('haskell-cabal','f232d0e883235f74ed71fd9de4a7468e5fcbda9a1af5beb56c24657f7bf2e891');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','90725ebe5de2d8bb249177123b0de357cf2d55e153501e3ad0ad7b0bef9178e5');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','31f48511403438ceac8f9b813a35d2c10c8f28e7125e8b6a7e12035ba5d5201e');\nhashMap.set('hermit','cdc0007b3612f91a1fa61a9fa137096555014638c75ea8d5465bf71fd6ff6125');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','56ef90301143874355fd2ed25dff7c646875f701f97422d02e01d45608a88f31');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','4023ef4cac55fe58f8d9744ae86b13532298926e35e22d250334cde55c3386ff');\nhashMap.set('kotlin-script','99ef296792a0ca575ed31d3defb514b05a58083dc01c52ea0890c69d867ba1dd');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','95f662ce196b95ee87845488d944cc046f6eb53ac6e10d90581735cd2f7c2d8c');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','f084cdc88320ca1e82af957d0008e7c9ce991d3282cb428f3108a5722239cead');\nhashMap.set('maven-wrapper','976ed8a59cf43b0c765b1a49ebc5669478e78278cf48f4ce3d0deb49647d10e3');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','cc93bddbf77b960f75cb0b6a0748e045fce475034d15e879b36a32dd439fd681');\nhashMap.set('mix','bedc1c384159dc19663827a9a3da0f195a5d4122b60ec5749cd3144cef339371');\nhashMap.set('nix','5c2a27c9525894185d93b81e54eeb663bc2f6192853b220f56211c56e87d8379');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','8573c9b837a14a5085803cfc30efcb494f9108382af8f3f4844bfc147e439617');\nhashMap.set('nuget','815b89106ec2a7e9455f45cbb8ec50ade82172e05a6d4439a0f30730a686f82f');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','d11d77288684578a4d444aecf4e3fba837ada31c676548bba9097e6179b27848');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','52f0aa7c0b2ae5af6c649f7d7dd7202e257887c4f4497a0b70eb3384e349e7de');\nhashMap.set('pip_requirements','133115d094c35139584fd08e20b8a60bfc99de4e82e30020e4acb3c2f33a1a5b');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','b759dbb54b09a9338d61cfb539afe2281b485abe646eb2c6ff309527469cd0dd');\nhashMap.set('pixi','fd925887530c356daaa416057e1941a291d494238b9f519d43f970a3457cc1e6');\nhashMap.set('poetry','60965cf6f1addb4ebb43531b12138fc90560c5145530a69529719325b443cc62');\nhashMap.set('pre-commit','d191792fe6a89025de644421e9e6391c4048f10bf8e46421c676290a35c9e587');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','a0b659f470dab05555cea82da60d414641678555c0bec213b3206b3ae3ead011');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e355e13e104351a8b3516a8e272fc5f7e625c9f39b0c492ba27283a36227c2d4');\nhashMap.set('renovate-config','2a4e4fb671aed5d0c900b8d54c31bfef46ca36d0f4e16b00ff73377b9c09fb69');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','e957f1f1563af4e5fbd1c552ca15632b7808d9d2e51ec0da6022a1f84372caec');\nhashMap.set('sbt','e508c2e2fb8d44e6cbec20f449c8eed096728566e6058187269c637930d388fb');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('sveltos','05b3158e88771ed4629e171592cf4f1bf0ff342f8aeae89be0b340c630cc6d8e');\nhashMap.set('swift','56cdc6fe4cd00519f953459f94323c71677f6bde007537eef891154fb8696db1');\nhashMap.set('tekton','fdc5b9b5edec2a90cda2f858f3ebc532aa8efb1187d1e0b7c89b07796e9cb6cd');\nhashMap.set('terraform','3dc2e8342e5e4ddf0f1cf1910567f13c4cfb20b9eaf375ee522f67946fe3e368');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','ffcbaa67dd65f064d43f8c121c1006115eab1879c4bd38de263b9b90a009c118');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','31247d37bc80aae17039bfa21bd989c5717730c5ef10cf2a6f09841576d012ec');\nhashMap.set('travis','bb482a0195cd009ec3896a6227bb95617f5c84bedb518c7d971e50c62235d9ca');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','ef3374fc0a3d3457172b0ce77bfca120e8044b6fd4fa942348fb837f6023360c');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','46efac5bda6737cccacf2d89ce1d384ee410876c5557b4c02be2275b7c1d862d');\nhashMap.set('regex','dbe6889ea021a05127fed06226d73366fdada2ae577147a5c027996fd325416e');"],"mappings":"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"}
1
+ {"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','1d3568f42393d697f8f96d461b72077ee7a1044b654e87667a12f861b3083111');\nhashMap.set('ansible-galaxy','8226d47128f2018825d4d6f84794e3183eb79c706045fa7e88491edd5e64106f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('argocd','5d35b1992e53130bf83b0e59a0f90ccd3a78919974c69044f306dc5d162f48ce');\nhashMap.set('asdf','0407066010ebb3d7ad4c1afe6b9a3615a3c11d64dc3cf0674cb9dfc3ea272273');\nhashMap.set('azure-pipelines','4f635b0ecd388ee266d992e8281fd40e3db2f5867d86fc1cbce72dc33a66e796');\nhashMap.set('batect','bd9208444eff1a4958061484db66a47b616c31f15a8d49d23b75c4560fcee83e');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','4994a8bd86d5bfb169d67c08efd8509b58c368c2bf3dd9bbe42553c0fabc3f1a');\nhashMap.set('bazel-module','40f6a862b4e72fcc7262ee41f8b570ea3fd5600d6d552b94ed3301bb201f5db5');\nhashMap.set('bazelisk','d71489650feefb0dbbe7461f924cb50e41c8eef8fe2e11acdec2d42d0212c8ef');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','a93effb1f1c5d65b3277c3b4709924eacde282e8efd028a8e3d8c1ce3ef69407');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','f2d5b0a7c0c724d30e79e12688b1fc8ff8e344db0cc6389553e2f6001ddf8345');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','629eda7bc52772bcc5b9c7254ce43a4d0a109c8473ba7633235020193102fd1e');\nhashMap.set('cake','ed6d14c96161f1d3d927adc7e333b96585164e1f25151a87990914d57ae17fe1');\nhashMap.set('cargo','197fa953327d70c12fad864eacc4c2f25b8d92dcb7e7e6d19bdda473f650f786');\nhashMap.set('cdnurl','d3edf6cdc38e92eb43ff5a2b4e8df6a6a13154cf83244725c39e28d7e6ea9177');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','8c0c739f7e4082bbfe8e3fdffebaf43e26f70a1314d95b306e9b93e4f4297886');\nhashMap.set('cocoapods','38b7fdc82d1d5583870707a04c334aa6dd725b13648febddebed35ce888ca017');\nhashMap.set('composer','829e1483e9519e9ff8d33e40f18a3e3be87ad4a328e32dc1cfb42655709796f8');\nhashMap.set('conan','74ca922a0ffdf1a9dd44b83eb2b3a36c56c7d792031e3a4a484f293046be3ecd');\nhashMap.set('copier','02b3cf090d7b8b8b1c06dd025a7faf6db4e0b5eb58aba7c1da16d15ac934cf61');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','db87814a407e43b8edaf7ccdf1659407fd934597e4253a3f330b8219dc34c40e');\nhashMap.set('deps-edn','c87dd5e88587147ad1a78f047b814f3c4aa60d6de30d0c49d849391eeaf1b64c');\nhashMap.set('devbox','c6204becff9e14b60b40f76ecb181f5292d4a2b39bca439afe6f9305cf6ce418');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','5441af5b5abf8d347e46002d47f02f85743401bda28232f49fb7b3bbb772a4fb');\nhashMap.set('dockerfile','54122792bf8ea0be98e0a0716e627e3115b40a5f0155ccd7ae0cfc52424a3478');\nhashMap.set('droneci','237c8de87b9bf653fb943b56e84e99c45f6d86ae27d86e599b3f3f99c35ba8ee');\nhashMap.set('fleet','d73d5d35f10df0599a561d9c8d25f3935350407d0e3bd3a1d1545295f278912e');\nhashMap.set('flux','79fa6ec15676108739e468f43746b1174528ed97cf7e3a2ac3758993141d326d');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','2d12dc3bd8bb6d866843b48af2fd6594a99f4b2d6bc52613ff2b14642b78b466');\nhashMap.set('github-actions','a85781cdcfe5557acfb087bafbc78cc0d61a3f0d0d011d5e1cb6a5ba0fb8760b');\nhashMap.set('gitlabci','33c264edf7837fb8fbc4cf0078c8bd2d5a75431039b1db65bf47356df7753125');\nhashMap.set('gitlabci-include','ef696c478c2ac1723b3aca070ba9779be0e702fff0844054251ba0029523d0eb');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','02389785183c39d2896d7893414c5e1060023f95c1fe7b595bd06cc5c1186d39');\nhashMap.set('gomod','0e0ecc704a4c0370ac36f5592c1d0def1581ffb0df6d14114cef009b0365f84c');\nhashMap.set('gradle','62e769489ed98a4635c0f7e4dd839845d3cf487d76a68442eb2b7fe832fcd150');\nhashMap.set('gradle-wrapper','81760ab88a1bed36b0381684396934cf7875e3466c01df8c98f410173f3168f4');\nhashMap.set('haskell-cabal','f232d0e883235f74ed71fd9de4a7468e5fcbda9a1af5beb56c24657f7bf2e891');\nhashMap.set('helm-requirements','4d90e5e18a380876ad48e21e1ad88ea62e25d973a1ddaa3763447fc0a9f9915b');\nhashMap.set('helm-values','b5c52c6a27d805557418c585c5d3030c95ee641d53057021f3fe060f81b6e1af');\nhashMap.set('helmfile','90725ebe5de2d8bb249177123b0de357cf2d55e153501e3ad0ad7b0bef9178e5');\nhashMap.set('helmsman','ef9680c612f702c7f07aea9b6e5d811e91214dcfa5755c9f3803e9528090935e');\nhashMap.set('helmv3','31f48511403438ceac8f9b813a35d2c10c8f28e7125e8b6a7e12035ba5d5201e');\nhashMap.set('hermit','cdc0007b3612f91a1fa61a9fa137096555014638c75ea8d5465bf71fd6ff6125');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','56ef90301143874355fd2ed25dff7c646875f701f97422d02e01d45608a88f31');\nhashMap.set('html','67c5f3c5c58e96f5dd257ba5987d900cf7fef81d667c3640e96c847b37de35a8');\nhashMap.set('jenkins','268ebfc8a1caf3edeb2192c2b1b2fa4bf18a78a3e731ba20a6c104940a5539f3');\nhashMap.set('jsonnet-bundler','4023ef4cac55fe58f8d9744ae86b13532298926e35e22d250334cde55c3386ff');\nhashMap.set('kotlin-script','99ef296792a0ca575ed31d3defb514b05a58083dc01c52ea0890c69d867ba1dd');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','95f662ce196b95ee87845488d944cc046f6eb53ac6e10d90581735cd2f7c2d8c');\nhashMap.set('leiningen','133fca2c3423f53f2ccc22518153ddbcafbf0f4812376c77e952eb3d24d81f85');\nhashMap.set('maven','f084cdc88320ca1e82af957d0008e7c9ce991d3282cb428f3108a5722239cead');\nhashMap.set('maven-wrapper','976ed8a59cf43b0c765b1a49ebc5669478e78278cf48f4ce3d0deb49647d10e3');\nhashMap.set('meteor','4a93a326b27bedfe52118e27e06f39fecd7c55bd4cd7fccec4cb120cac14cec4');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','cc93bddbf77b960f75cb0b6a0748e045fce475034d15e879b36a32dd439fd681');\nhashMap.set('mix','bedc1c384159dc19663827a9a3da0f195a5d4122b60ec5749cd3144cef339371');\nhashMap.set('nix','5c2a27c9525894185d93b81e54eeb663bc2f6192853b220f56211c56e87d8379');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','8573c9b837a14a5085803cfc30efcb494f9108382af8f3f4844bfc147e439617');\nhashMap.set('nuget','815b89106ec2a7e9455f45cbb8ec50ade82172e05a6d4439a0f30730a686f82f');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','32233a1a8a2725699d7448ba438e3d0b78141f7799cd2b588de278d41e26ed10');\nhashMap.set('pep621','d11d77288684578a4d444aecf4e3fba837ada31c676548bba9097e6179b27848');\nhashMap.set('pep723','b96683163de63ed93207ec0538066705b1e58a1cd5b8bd11c63fc28b26bddba1');\nhashMap.set('pip-compile','52f0aa7c0b2ae5af6c649f7d7dd7202e257887c4f4497a0b70eb3384e349e7de');\nhashMap.set('pip_requirements','133115d094c35139584fd08e20b8a60bfc99de4e82e30020e4acb3c2f33a1a5b');\nhashMap.set('pip_setup','0175fe550c19d9bd31c978bd83fdc088cb40fcacd5d6751f640164274ae64e61');\nhashMap.set('pipenv','b759dbb54b09a9338d61cfb539afe2281b485abe646eb2c6ff309527469cd0dd');\nhashMap.set('pixi','fd925887530c356daaa416057e1941a291d494238b9f519d43f970a3457cc1e6');\nhashMap.set('poetry','60965cf6f1addb4ebb43531b12138fc90560c5145530a69529719325b443cc62');\nhashMap.set('pre-commit','d191792fe6a89025de644421e9e6391c4048f10bf8e46421c676290a35c9e587');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','a0b659f470dab05555cea82da60d414641678555c0bec213b3206b3ae3ead011');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e355e13e104351a8b3516a8e272fc5f7e625c9f39b0c492ba27283a36227c2d4');\nhashMap.set('renovate-config','2a4e4fb671aed5d0c900b8d54c31bfef46ca36d0f4e16b00ff73377b9c09fb69');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','e957f1f1563af4e5fbd1c552ca15632b7808d9d2e51ec0da6022a1f84372caec');\nhashMap.set('sbt','e508c2e2fb8d44e6cbec20f449c8eed096728566e6058187269c637930d388fb');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','7dea08c5708625e753bd56918bc214df7fb4d8543a26e936926a21ab43b5f785');\nhashMap.set('sveltos','05b3158e88771ed4629e171592cf4f1bf0ff342f8aeae89be0b340c630cc6d8e');\nhashMap.set('swift','56cdc6fe4cd00519f953459f94323c71677f6bde007537eef891154fb8696db1');\nhashMap.set('tekton','fdc5b9b5edec2a90cda2f858f3ebc532aa8efb1187d1e0b7c89b07796e9cb6cd');\nhashMap.set('terraform','3dc2e8342e5e4ddf0f1cf1910567f13c4cfb20b9eaf375ee522f67946fe3e368');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','ffcbaa67dd65f064d43f8c121c1006115eab1879c4bd38de263b9b90a009c118');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','31247d37bc80aae17039bfa21bd989c5717730c5ef10cf2a6f09841576d012ec');\nhashMap.set('travis','bb482a0195cd009ec3896a6227bb95617f5c84bedb518c7d971e50c62235d9ca');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','ef3374fc0a3d3457172b0ce77bfca120e8044b6fd4fa942348fb837f6023360c');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','46efac5bda6737cccacf2d89ce1d384ee410876c5557b4c02be2275b7c1d862d');\nhashMap.set('regex','dbe6889ea021a05127fed06226d73366fdada2ae577147a5c027996fd325416e');"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { branchExists, checkoutBranch, commitFiles, deleteBranch, getBranchCommit, getBranchUpdateDate, getFileList, isBranchBehindBase, isBranchConflicted, isBranchModified, mergeBranch, mergeToLocal, syncForkWithUpstream } from "../../util/git/index.js";
1
+ import { branchExists, checkoutBranch, commitFiles, deleteBranch, getAllBranchUpdateDates, getBranchCommit, getBranchUpdateDate, getFileList, isBranchBehindBase, isBranchConflicted, isBranchModified, mergeBranch, mergeToLocal, syncForkWithUpstream } from "../../util/git/index.js";
2
2
  //#region lib/modules/platform/default-scm.ts
3
3
  var DefaultGitScm = class {
4
4
  branchExists(branchName) {
@@ -16,6 +16,9 @@ var DefaultGitScm = class {
16
16
  getBranchUpdateDate(branchName) {
17
17
  return getBranchUpdateDate(branchName);
18
18
  }
19
+ getAllBranchUpdateDates() {
20
+ return getAllBranchUpdateDates();
21
+ }
19
22
  isBranchBehindBase(branchName, baseBranch) {
20
23
  return isBranchBehindBase(branchName, baseBranch);
21
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"default-scm.js","names":["git.branchExists","git.commitFiles","git.deleteBranch","git.getBranchCommit","git.getBranchUpdateDate","git.isBranchBehindBase","git.isBranchConflicted","git.isBranchModified","git.getFileList","git.checkoutBranch","git.mergeBranch","git.mergeToLocal","git.syncForkWithUpstream"],"sources":["../../../lib/modules/platform/default-scm.ts"],"sourcesContent":["import type { DateTime } from 'luxon';\nimport * as git from '../../util/git/index.ts';\nimport type { CommitFilesConfig } from '../../util/git/types.ts';\nimport type { LongCommitSha } from '../../util/schema-utils/git.ts';\nimport type { PlatformScm } from './types.ts';\n\nexport class DefaultGitScm implements PlatformScm {\n branchExists(branchName: string): Promise<boolean> {\n return Promise.resolve(git.branchExists(branchName));\n }\n\n commitAndPush(\n commitConfig: CommitFilesConfig,\n ): Promise<LongCommitSha | null> {\n return git.commitFiles(commitConfig);\n }\n\n deleteBranch(branchName: string): Promise<void> {\n return git.deleteBranch(branchName);\n }\n\n getBranchCommit(branchName: string): Promise<LongCommitSha | null> {\n return Promise.resolve(git.getBranchCommit(branchName));\n }\n\n getBranchUpdateDate(branchName: string): Promise<DateTime | null> {\n return git.getBranchUpdateDate(branchName);\n }\n\n isBranchBehindBase(branchName: string, baseBranch: string): Promise<boolean> {\n return git.isBranchBehindBase(branchName, baseBranch);\n }\n\n isBranchConflicted(baseBranch: string, branch: string): Promise<boolean> {\n return git.isBranchConflicted(baseBranch, branch);\n }\n\n isBranchModified(branchName: string, baseBranch: string): Promise<boolean> {\n return git.isBranchModified(branchName, baseBranch);\n }\n\n getFileList(): Promise<string[]> {\n return git.getFileList();\n }\n\n checkoutBranch(branchName: string): Promise<LongCommitSha> {\n return git.checkoutBranch(branchName);\n }\n\n mergeAndPush(branchName: string): Promise<void> {\n return git.mergeBranch(branchName);\n }\n\n mergeToLocal(branchName: string): Promise<void> {\n return git.mergeToLocal(branchName);\n }\n\n syncForkWithUpstream(branchName: string): Promise<void> {\n return git.syncForkWithUpstream(branchName);\n }\n}\n"],"mappings":";;AAMA,IAAa,gBAAb,MAAkD;CAChD,aAAa,YAAsC;EACjD,OAAO,QAAQ,QAAQA,aAAiB,UAAU,CAAC;CACrD;CAEA,cACE,cAC+B;EAC/B,OAAOC,YAAgB,YAAY;CACrC;CAEA,aAAa,YAAmC;EAC9C,OAAOC,aAAiB,UAAU;CACpC;CAEA,gBAAgB,YAAmD;EACjE,OAAO,QAAQ,QAAQC,gBAAoB,UAAU,CAAC;CACxD;CAEA,oBAAoB,YAA8C;EAChE,OAAOC,oBAAwB,UAAU;CAC3C;CAEA,mBAAmB,YAAoB,YAAsC;EAC3E,OAAOC,mBAAuB,YAAY,UAAU;CACtD;CAEA,mBAAmB,YAAoB,QAAkC;EACvE,OAAOC,mBAAuB,YAAY,MAAM;CAClD;CAEA,iBAAiB,YAAoB,YAAsC;EACzE,OAAOC,iBAAqB,YAAY,UAAU;CACpD;CAEA,cAAiC;EAC/B,OAAOC,YAAgB;CACzB;CAEA,eAAe,YAA4C;EACzD,OAAOC,eAAmB,UAAU;CACtC;CAEA,aAAa,YAAmC;EAC9C,OAAOC,YAAgB,UAAU;CACnC;CAEA,aAAa,YAAmC;EAC9C,OAAOC,aAAiB,UAAU;CACpC;CAEA,qBAAqB,YAAmC;EACtD,OAAOC,qBAAyB,UAAU;CAC5C;AACF"}
1
+ {"version":3,"file":"default-scm.js","names":["git.branchExists","git.commitFiles","git.deleteBranch","git.getBranchCommit","git.getBranchUpdateDate","git.getAllBranchUpdateDates","git.isBranchBehindBase","git.isBranchConflicted","git.isBranchModified","git.getFileList","git.checkoutBranch","git.mergeBranch","git.mergeToLocal","git.syncForkWithUpstream"],"sources":["../../../lib/modules/platform/default-scm.ts"],"sourcesContent":["import type { DateTime } from 'luxon';\nimport * as git from '../../util/git/index.ts';\nimport type { CommitFilesConfig } from '../../util/git/types.ts';\nimport type { LongCommitSha } from '../../util/schema-utils/git.ts';\nimport type { PlatformScm } from './types.ts';\n\nexport class DefaultGitScm implements PlatformScm {\n branchExists(branchName: string): Promise<boolean> {\n return Promise.resolve(git.branchExists(branchName));\n }\n\n commitAndPush(\n commitConfig: CommitFilesConfig,\n ): Promise<LongCommitSha | null> {\n return git.commitFiles(commitConfig);\n }\n\n deleteBranch(branchName: string): Promise<void> {\n return git.deleteBranch(branchName);\n }\n\n getBranchCommit(branchName: string): Promise<LongCommitSha | null> {\n return Promise.resolve(git.getBranchCommit(branchName));\n }\n\n getBranchUpdateDate(branchName: string): Promise<DateTime | null> {\n return git.getBranchUpdateDate(branchName);\n }\n\n getAllBranchUpdateDates(): Promise<Record<string, DateTime>> {\n return git.getAllBranchUpdateDates();\n }\n\n isBranchBehindBase(branchName: string, baseBranch: string): Promise<boolean> {\n return git.isBranchBehindBase(branchName, baseBranch);\n }\n\n isBranchConflicted(baseBranch: string, branch: string): Promise<boolean> {\n return git.isBranchConflicted(baseBranch, branch);\n }\n\n isBranchModified(branchName: string, baseBranch: string): Promise<boolean> {\n return git.isBranchModified(branchName, baseBranch);\n }\n\n getFileList(): Promise<string[]> {\n return git.getFileList();\n }\n\n checkoutBranch(branchName: string): Promise<LongCommitSha> {\n return git.checkoutBranch(branchName);\n }\n\n mergeAndPush(branchName: string): Promise<void> {\n return git.mergeBranch(branchName);\n }\n\n mergeToLocal(branchName: string): Promise<void> {\n return git.mergeToLocal(branchName);\n }\n\n syncForkWithUpstream(branchName: string): Promise<void> {\n return git.syncForkWithUpstream(branchName);\n }\n}\n"],"mappings":";;AAMA,IAAa,gBAAb,MAAkD;CAChD,aAAa,YAAsC;EACjD,OAAO,QAAQ,QAAQA,aAAiB,UAAU,CAAC;CACrD;CAEA,cACE,cAC+B;EAC/B,OAAOC,YAAgB,YAAY;CACrC;CAEA,aAAa,YAAmC;EAC9C,OAAOC,aAAiB,UAAU;CACpC;CAEA,gBAAgB,YAAmD;EACjE,OAAO,QAAQ,QAAQC,gBAAoB,UAAU,CAAC;CACxD;CAEA,oBAAoB,YAA8C;EAChE,OAAOC,oBAAwB,UAAU;CAC3C;CAEA,0BAA6D;EAC3D,OAAOC,wBAA4B;CACrC;CAEA,mBAAmB,YAAoB,YAAsC;EAC3E,OAAOC,mBAAuB,YAAY,UAAU;CACtD;CAEA,mBAAmB,YAAoB,QAAkC;EACvE,OAAOC,mBAAuB,YAAY,MAAM;CAClD;CAEA,iBAAiB,YAAoB,YAAsC;EACzE,OAAOC,iBAAqB,YAAY,UAAU;CACpD;CAEA,cAAiC;EAC/B,OAAOC,YAAgB;CACzB;CAEA,eAAe,YAA4C;EACzD,OAAOC,eAAmB,UAAU;CACtC;CAEA,aAAa,YAAmC;EAC9C,OAAOC,YAAgB,UAAU;CACnC;CAEA,aAAa,YAAmC;EAC9C,OAAOC,aAAiB,UAAU;CACpC;CAEA,qBAAqB,YAAmC;EACtD,OAAOC,qBAAyB,UAAU;CAC5C;AACF"}
@@ -22,6 +22,9 @@ var LocalFs = class {
22
22
  getBranchUpdateDate(_branchName) {
23
23
  return Promise.resolve(null);
24
24
  }
25
+ getAllBranchUpdateDates() {
26
+ return Promise.resolve({});
27
+ }
25
28
  deleteBranch(_branchName) {
26
29
  return Promise.resolve();
27
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scm.js","names":[],"sources":["../../../../lib/modules/platform/local/scm.ts"],"sourcesContent":["import { glob } from 'glob';\nimport type { DateTime } from 'luxon';\nimport { logger } from '../../../logger/index.ts';\nimport { rawExec } from '../../../util/exec/common.ts';\nimport type { CommitFilesConfig } from '../../../util/git/types.ts';\nimport type { LongCommitSha } from '../../../util/schema-utils/git.ts';\nimport type { PlatformScm } from '../types.ts';\n\nlet fileList: string[] | undefined;\nexport class LocalFs implements PlatformScm {\n isBranchBehindBase(\n _branchName: string,\n _baseBranch: string,\n ): Promise<boolean> {\n return Promise.resolve(false);\n }\n isBranchModified(_branchName: string, _baseBranch: string): Promise<boolean> {\n return Promise.resolve(false);\n }\n isBranchConflicted(_baseBranch: string, _branch: string): Promise<boolean> {\n return Promise.resolve(false);\n }\n branchExists(_branchName: string): Promise<boolean> {\n return Promise.resolve(true);\n }\n getBranchCommit(_branchName: string): Promise<LongCommitSha | null> {\n return Promise.resolve(null);\n }\n getBranchUpdateDate(_branchName: string): Promise<DateTime | null> {\n return Promise.resolve(null);\n }\n deleteBranch(_branchName: string): Promise<void> {\n return Promise.resolve();\n }\n commitAndPush(\n _commitConfig: CommitFilesConfig,\n ): Promise<LongCommitSha | null> {\n return Promise.resolve(null);\n }\n\n async getFileList(): Promise<string[]> {\n try {\n // fetch file list using git\n const maxBuffer = 10 * 1024 * 1024; // 10 MiB in bytes\n const stdout = (await rawExec('git ls-files', { maxBuffer })).stdout;\n logger.debug('Got file list using git');\n fileList = stdout.split('\\n');\n } catch {\n logger.debug('Could not get file list using git, using glob instead');\n fileList ??= await glob('**', {\n dot: true,\n nodir: true,\n });\n }\n\n return fileList;\n }\n\n checkoutBranch(_branchName: string): Promise<LongCommitSha | null> {\n return Promise.resolve(null);\n }\n\n mergeAndPush(_branchName: string): Promise<void> {\n return Promise.resolve();\n }\n\n mergeToLocal(_branchName: string): Promise<void> {\n return Promise.resolve();\n }\n}\n"],"mappings":";;;;AAQA,IAAI;AACJ,IAAa,UAAb,MAA4C;CAC1C,mBACE,aACA,aACkB;EAClB,OAAO,QAAQ,QAAQ,KAAK;CAC9B;CACA,iBAAiB,aAAqB,aAAuC;EAC3E,OAAO,QAAQ,QAAQ,KAAK;CAC9B;CACA,mBAAmB,aAAqB,SAAmC;EACzE,OAAO,QAAQ,QAAQ,KAAK;CAC9B;CACA,aAAa,aAAuC;EAClD,OAAO,QAAQ,QAAQ,IAAI;CAC7B;CACA,gBAAgB,aAAoD;EAClE,OAAO,QAAQ,QAAQ,IAAI;CAC7B;CACA,oBAAoB,aAA+C;EACjE,OAAO,QAAQ,QAAQ,IAAI;CAC7B;CACA,aAAa,aAAoC;EAC/C,OAAO,QAAQ,QAAQ;CACzB;CACA,cACE,eAC+B;EAC/B,OAAO,QAAQ,QAAQ,IAAI;CAC7B;CAEA,MAAM,cAAiC;EACrC,IAAI;GAGF,MAAM,UAAU,MAAM,QAAQ,gBAAgB,EAAE,WAD9B,KAAK,OAAO,KAC4B,CAAC,EAAA,CAAG;GAC9D,OAAO,MAAM,yBAAyB;GACtC,WAAW,OAAO,MAAM,IAAI;EAC9B,QAAQ;GACN,OAAO,MAAM,uDAAuD;GACpE,aAAa,MAAM,KAAK,MAAM;IAC5B,KAAK;IACL,OAAO;GACT,CAAC;EACH;EAEA,OAAO;CACT;CAEA,eAAe,aAAoD;EACjE,OAAO,QAAQ,QAAQ,IAAI;CAC7B;CAEA,aAAa,aAAoC;EAC/C,OAAO,QAAQ,QAAQ;CACzB;CAEA,aAAa,aAAoC;EAC/C,OAAO,QAAQ,QAAQ;CACzB;AACF"}
1
+ {"version":3,"file":"scm.js","names":[],"sources":["../../../../lib/modules/platform/local/scm.ts"],"sourcesContent":["import { glob } from 'glob';\nimport type { DateTime } from 'luxon';\nimport { logger } from '../../../logger/index.ts';\nimport { rawExec } from '../../../util/exec/common.ts';\nimport type { CommitFilesConfig } from '../../../util/git/types.ts';\nimport type { LongCommitSha } from '../../../util/schema-utils/git.ts';\nimport type { PlatformScm } from '../types.ts';\n\nlet fileList: string[] | undefined;\nexport class LocalFs implements PlatformScm {\n isBranchBehindBase(\n _branchName: string,\n _baseBranch: string,\n ): Promise<boolean> {\n return Promise.resolve(false);\n }\n isBranchModified(_branchName: string, _baseBranch: string): Promise<boolean> {\n return Promise.resolve(false);\n }\n isBranchConflicted(_baseBranch: string, _branch: string): Promise<boolean> {\n return Promise.resolve(false);\n }\n branchExists(_branchName: string): Promise<boolean> {\n return Promise.resolve(true);\n }\n getBranchCommit(_branchName: string): Promise<LongCommitSha | null> {\n return Promise.resolve(null);\n }\n getBranchUpdateDate(_branchName: string): Promise<DateTime | null> {\n return Promise.resolve(null);\n }\n getAllBranchUpdateDates(): Promise<Record<string, DateTime>> {\n return Promise.resolve({});\n }\n deleteBranch(_branchName: string): Promise<void> {\n return Promise.resolve();\n }\n commitAndPush(\n _commitConfig: CommitFilesConfig,\n ): Promise<LongCommitSha | null> {\n return Promise.resolve(null);\n }\n\n async getFileList(): Promise<string[]> {\n try {\n // fetch file list using git\n const maxBuffer = 10 * 1024 * 1024; // 10 MiB in bytes\n const stdout = (await rawExec('git ls-files', { maxBuffer })).stdout;\n logger.debug('Got file list using git');\n fileList = stdout.split('\\n');\n } catch {\n logger.debug('Could not get file list using git, using glob instead');\n fileList ??= await glob('**', {\n dot: true,\n nodir: true,\n });\n }\n\n return fileList;\n }\n\n checkoutBranch(_branchName: string): Promise<LongCommitSha | null> {\n return Promise.resolve(null);\n }\n\n mergeAndPush(_branchName: string): Promise<void> {\n return Promise.resolve();\n }\n\n mergeToLocal(_branchName: string): Promise<void> {\n return Promise.resolve();\n }\n}\n"],"mappings":";;;;AAQA,IAAI;AACJ,IAAa,UAAb,MAA4C;CAC1C,mBACE,aACA,aACkB;EAClB,OAAO,QAAQ,QAAQ,KAAK;CAC9B;CACA,iBAAiB,aAAqB,aAAuC;EAC3E,OAAO,QAAQ,QAAQ,KAAK;CAC9B;CACA,mBAAmB,aAAqB,SAAmC;EACzE,OAAO,QAAQ,QAAQ,KAAK;CAC9B;CACA,aAAa,aAAuC;EAClD,OAAO,QAAQ,QAAQ,IAAI;CAC7B;CACA,gBAAgB,aAAoD;EAClE,OAAO,QAAQ,QAAQ,IAAI;CAC7B;CACA,oBAAoB,aAA+C;EACjE,OAAO,QAAQ,QAAQ,IAAI;CAC7B;CACA,0BAA6D;EAC3D,OAAO,QAAQ,QAAQ,CAAC,CAAC;CAC3B;CACA,aAAa,aAAoC;EAC/C,OAAO,QAAQ,QAAQ;CACzB;CACA,cACE,eAC+B;EAC/B,OAAO,QAAQ,QAAQ,IAAI;CAC7B;CAEA,MAAM,cAAiC;EACrC,IAAI;GAGF,MAAM,UAAU,MAAM,QAAQ,gBAAgB,EAAE,WAD9B,KAAK,OAAO,KAC4B,CAAC,EAAA,CAAG;GAC9D,OAAO,MAAM,yBAAyB;GACtC,WAAW,OAAO,MAAM,IAAI;EAC9B,QAAQ;GACN,OAAO,MAAM,uDAAuD;GACpE,aAAa,MAAM,KAAK,MAAM;IAC5B,KAAK;IACL,OAAO;GACT,CAAC;EACH;EAEA,OAAO;CACT;CAEA,eAAe,aAAoD;EACjE,OAAO,QAAQ,QAAQ,IAAI;CAC7B;CAEA,aAAa,aAAoC;EAC/C,OAAO,QAAQ,QAAQ;CACzB;CAEA,aAAa,aAAoC;EAC/C,OAAO,QAAQ,QAAQ;CACzB;AACF"}
@@ -271,6 +271,7 @@ interface PlatformScm {
271
271
  branchExists(branchName: string): Promise<boolean>;
272
272
  getBranchCommit(branchName: string): Promise<LongCommitSha | null>;
273
273
  getBranchUpdateDate(branchName: string): Promise<DateTime | null>;
274
+ getAllBranchUpdateDates(): Promise<Record<string, DateTime>>;
274
275
  deleteBranch(branchName: string): Promise<void>;
275
276
  commitAndPush(commitConfig: CommitFilesConfig): Promise<LongCommitSha | null>;
276
277
  getFileList(): Promise<string[]>;
@@ -32,6 +32,7 @@ declare function getRepoStatus(path?: string): Promise<StatusResult>;
32
32
  declare function branchExists(branchName: string): boolean;
33
33
  declare function getBranchCommit(branchName: string): LongCommitSha | null;
34
34
  declare function getBranchUpdateDate(branchName: string): Promise<DateTime | null>;
35
+ declare function getAllBranchUpdateDates(): Promise<Record<string, DateTime>>;
35
36
  declare function getCommitMessages(): Promise<string[]>;
36
37
  declare function checkoutBranch(branchName: string): Promise<LongCommitSha>;
37
38
  declare function checkoutBranchFromRemote(branchName: string, remoteName: string): Promise<LongCommitSha>;
@@ -149,5 +150,5 @@ declare function diffCommitTree(parentCommitSha: LongCommitSha, commitSha: LongC
149
150
  declare function syncForkWithUpstream(branchName: string): Promise<void>;
150
151
  declare function getRemotes(): Promise<string[]>;
151
152
  //#endregion
152
- export { GIT_MINIMUM_VERSION, RENOVATE_FORK_UPSTREAM, branchExists, checkoutBranch, checkoutBranchFromRemote, clearRenovateRefs, cloneSubmodules, commitFiles, createSimpleGit, deleteBranch, diffCommitTree, fetchBranch, fetchRevSpec, forcePushToRemote, getBranchCommit, getBranchFiles, getBranchFilesFromCommit, getBranchLastCommitTime, getBranchList, getBranchUpdateDate, getCommitMessages, getCommitTreeSha, getFile, getFileList, getFiles, getRemotes, getRepoStatus, getSubmodules, getUrl, gitRetry, hasDiff, initRepo, isBranchBehindBase, isBranchConflicted, isBranchModified, isCloned, isFileModeEnabled, mergeBranch, mergeToLocal, prepareCommit, pushCommit, pushCommitToRenovateRef, remoteBranchRef, resetHardFromRemote, resetToCommit, setGitAuthor, setNoVerify, setPlatformIgnoredAuthors, setPrivateKey, setUserRepoConfig, setVirtualBranch, syncForkWithUpstream, syncGit, validateGitVersion, writeGitAuthor };
153
+ export { GIT_MINIMUM_VERSION, RENOVATE_FORK_UPSTREAM, branchExists, checkoutBranch, checkoutBranchFromRemote, clearRenovateRefs, cloneSubmodules, commitFiles, createSimpleGit, deleteBranch, diffCommitTree, fetchBranch, fetchRevSpec, forcePushToRemote, getAllBranchUpdateDates, getBranchCommit, getBranchFiles, getBranchFilesFromCommit, getBranchLastCommitTime, getBranchList, getBranchUpdateDate, getCommitMessages, getCommitTreeSha, getFile, getFileList, getFiles, getRemotes, getRepoStatus, getSubmodules, getUrl, gitRetry, hasDiff, initRepo, isBranchBehindBase, isBranchConflicted, isBranchModified, isCloned, isFileModeEnabled, mergeBranch, mergeToLocal, prepareCommit, pushCommit, pushCommitToRenovateRef, remoteBranchRef, resetHardFromRemote, resetToCommit, setGitAuthor, setNoVerify, setPlatformIgnoredAuthors, setPrivateKey, setUserRepoConfig, setVirtualBranch, syncForkWithUpstream, syncGit, validateGitVersion, writeGitAuthor };
153
154
  //# sourceMappingURL=index.d.ts.map
@@ -24,7 +24,7 @@ import { getCachedModifiedResult, setCachedModifiedResult } from "./modified-cac
24
24
  import { configSigningKey, setPrivateKey, writePrivateKey } from "./private-key.js";
25
25
  import { GitTreeMode } from "./types.js";
26
26
  import { getCachedUpdateDateResult, setCachedUpdateDateResult } from "./update-date-cache.js";
27
- import { isBoolean, isNonEmptyObject, isString } from "@sindresorhus/is";
27
+ import { isBoolean, isNonEmptyObject, isNonEmptyStringAndNotWhitespace, isString } from "@sindresorhus/is";
28
28
  import fs from "fs-extra";
29
29
  import { DateTime } from "luxon";
30
30
  import upath from "upath";
@@ -463,6 +463,24 @@ async function getBranchUpdateDate(branchName) {
463
463
  return null;
464
464
  }
465
465
  }
466
+ async function getAllBranchUpdateDates() {
467
+ logger.debug("getAllBranchUpdateDates");
468
+ await syncGit();
469
+ const raw = await git.raw([
470
+ "for-each-ref",
471
+ "--format=%(refname:short) %(committerdate:iso-strict)",
472
+ "refs/remotes/origin/"
473
+ ]);
474
+ const result = {};
475
+ const lines = raw.trim().split(newlineRegex).filter(isNonEmptyStringAndNotWhitespace);
476
+ for (const line of lines) {
477
+ const [refShort, isoDate] = line.split(" ");
478
+ if (refShort === "origin") continue;
479
+ const branchName = refShort.replace(regEx(/^origin\//), "");
480
+ result[branchName] = DateTime.fromISO(isoDate).toUTC();
481
+ }
482
+ return result;
483
+ }
466
484
  async function getCommitMessages() {
467
485
  logger.debug("getCommitMessages");
468
486
  // v8 ignore else -- TODO: add test #40625
@@ -1338,6 +1356,6 @@ async function getRemotes() {
1338
1356
  }
1339
1357
  }
1340
1358
  //#endregion
1341
- export { GIT_MINIMUM_VERSION, RENOVATE_FORK_UPSTREAM, branchExists, checkoutBranch, checkoutBranchFromRemote, clearRenovateRefs, cloneSubmodules, commitFiles, createSimpleGit, deleteBranch, diffCommitTree, fetchBranch, fetchRevSpec, forcePushToRemote, getBranchCommit, getBranchFiles, getBranchFilesFromCommit, getBranchLastCommitTime, getBranchList, getBranchUpdateDate, getCommitMessages, getCommitTreeSha, getFile, getFileList, getFiles, getRemotes, getRepoStatus, getSubmodules, getUrl, gitRetry, hasDiff, initRepo, isBranchBehindBase, isBranchConflicted, isBranchModified, isCloned, isFileModeEnabled, mergeBranch, mergeToLocal, prepareCommit, pushCommit, pushCommitToRenovateRef, remoteBranchRef, resetHardFromRemote, resetToCommit, setGitAuthor, setNoVerify, setPlatformIgnoredAuthors, setPrivateKey, setUserRepoConfig, setVirtualBranch, syncForkWithUpstream, syncGit, validateGitVersion, writeGitAuthor };
1359
+ export { GIT_MINIMUM_VERSION, RENOVATE_FORK_UPSTREAM, branchExists, checkoutBranch, checkoutBranchFromRemote, clearRenovateRefs, cloneSubmodules, commitFiles, createSimpleGit, deleteBranch, diffCommitTree, fetchBranch, fetchRevSpec, forcePushToRemote, getAllBranchUpdateDates, getBranchCommit, getBranchFiles, getBranchFilesFromCommit, getBranchLastCommitTime, getBranchList, getBranchUpdateDate, getCommitMessages, getCommitTreeSha, getFile, getFileList, getFiles, getRemotes, getRepoStatus, getSubmodules, getUrl, gitRetry, hasDiff, initRepo, isBranchBehindBase, isBranchConflicted, isBranchModified, isCloned, isFileModeEnabled, mergeBranch, mergeToLocal, prepareCommit, pushCommit, pushCommitToRenovateRef, remoteBranchRef, resetHardFromRemote, resetToCommit, setGitAuthor, setNoVerify, setPlatformIgnoredAuthors, setPrivateKey, setUserRepoConfig, setVirtualBranch, syncForkWithUpstream, syncGit, validateGitVersion, writeGitAuthor };
1342
1360
 
1343
1361
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../lib/util/git/index.ts"],"sourcesContent":["import { setTimeout } from 'node:timers/promises';\nimport URL from 'node:url';\nimport { isBoolean, isNonEmptyObject, isString } from '@sindresorhus/is';\nimport fs from 'fs-extra';\nimport { DateTime } from 'luxon';\nimport semver from 'semver';\nimport type {\n Options,\n SimpleGit,\n SimpleGitOptions,\n TaskOptions,\n} from 'simple-git';\nimport { ResetMode, simpleGit } from 'simple-git';\nimport upath from 'upath';\nimport { getConfigFileNames } from '../../config/app-strings.ts';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type { RenovateConfig } from '../../config/types.ts';\nimport {\n CONFIG_VALIDATION,\n INVALID_PATH,\n REPOSITORY_CHANGED,\n REPOSITORY_DISABLED,\n REPOSITORY_EMPTY,\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n UNKNOWN_ERROR,\n} from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport { withInstrumenting } from '../../instrumentation/with-instrumenting.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport type { GitProtocol } from '../../types/git.ts';\nimport { incCountValue, incLimitedValue } from '../../workers/global/limits.ts';\nimport { getCache } from '../cache/repository/index.ts';\nimport { getEnv } from '../env.ts';\nimport type { ExtraEnv } from '../exec/types.ts';\nimport { getChildEnv } from '../exec/utils.ts';\nimport { newlineRegex, regEx } from '../regex.ts';\nimport type { LongCommitSha } from '../schema-utils/git.ts';\nimport { toLongCommitSha } from '../schema-utils/git.ts';\nimport { matchRegexOrGlobList } from '../string-match.ts';\nimport { logWarningIfUnicodeHiddenCharactersInPackageFile } from '../unicode.ts';\nimport { getGitEnvironmentVariables } from './auth.ts';\nimport { parseGitAuthor } from './author.ts';\nimport {\n getCachedBehindBaseResult,\n setCachedBehindBaseResult,\n} from './behind-base-branch-cache.ts';\nimport { getNoVerify, simpleGitConfig } from './config.ts';\nimport {\n getCachedConflictResult,\n setCachedConflictResult,\n} from './conflicts-cache.ts';\nimport {\n bulkChangesDisallowed,\n checkForPlatformFailure,\n handleCommitError,\n} from './error.ts';\nimport type { InstrumentedSimpleGit } from './instrument.ts';\nimport { instrumentGit } from './instrument.ts';\nimport {\n getCachedModifiedResult,\n setCachedModifiedResult,\n} from './modified-cache.ts';\nimport { configSigningKey, writePrivateKey } from './private-key.ts';\nimport type {\n CommitFilesConfig,\n CommitResult,\n DiffTreeItem,\n GitObjectType,\n LocalConfig,\n PushFilesConfig,\n StatusResult,\n StorageConfig,\n} from './types.ts';\nimport { GitTreeMode } from './types.ts';\nimport {\n getCachedUpdateDateResult,\n setCachedUpdateDateResult,\n} from './update-date-cache.ts';\n\nexport { setNoVerify } from './config.ts';\nexport { setPrivateKey } from './private-key.ts';\n\n// Retry parameters\nconst retryCount = 5;\nconst delaySeconds = 3;\nconst delayFactor = 2;\n\nexport const RENOVATE_FORK_UPSTREAM = 'renovate-fork-upstream';\n\nexport function createSimpleGit({\n config,\n env,\n}: {\n config?: Partial<SimpleGitOptions>;\n env?: ExtraEnv;\n} = {}): SimpleGit {\n return simpleGit({ ...simpleGitConfig(), ...config }).env(\n getChildEnv({\n extraEnv: {\n // Git will prompt for known hosts or passwords, unless we activate BatchMode.\n // Set as extraEnv (lowest priority) so that process.env and\n // customEnvVariables can override it.\n GIT_SSH_COMMAND: 'ssh -o BatchMode=yes',\n },\n env: {\n ...env,\n // To ensure the simple-git parsers match correctly, we need\n // to set the `LANG` and `LC_ALL` environment variables to\n // the `C.UTF-8` locale. See the docs for more details:\n // https://github.com/steveukx/git-js/blob/1bb14df0595794a9353d28ccdaeeb06c0b9bf2a5/docs/NON_ENGLISH_LOCALE.md\n //\n // Use \"C.UTF-8\" instead of just \"C\" (as specified in docs) to handle special characters:\n // https://github.com/renovatebot/renovate/pull/18963\n LANG: 'C.UTF-8',\n LC_ALL: 'C.UTF-8',\n },\n }),\n );\n}\n\n// A generic wrapper for simpleGit.* calls to make them more fault-tolerant\nexport async function gitRetry<T>(gitFunc: () => Promise<T>): Promise<T> {\n let round = 0;\n let lastError: Error | undefined;\n\n while (round <= retryCount) {\n if (round > 0) {\n logger.debug(`gitRetry round ${round}`);\n }\n try {\n const res = await gitFunc();\n if (round > 1) {\n logger.debug('Successful retry of git function');\n }\n return res;\n } catch (err) {\n lastError = err;\n logger.debug({ err }, `Git function thrown`);\n // Try to transform the Error to ExternalHostError\n const errChecked = checkForPlatformFailure(err);\n if (errChecked instanceof ExternalHostError) {\n logger.debug(\n { err: errChecked },\n `ExternalHostError thrown in round ${\n round + 1\n } of ${retryCount} - retrying in the next round`,\n );\n } else {\n throw err;\n }\n }\n\n const nextDelay = delayFactor ^ ((round - 1) * delaySeconds);\n logger.trace({ nextDelay }, `Delay next round`);\n await setTimeout(1000 * nextDelay);\n\n round++;\n }\n\n throw lastError!;\n}\n\nasync function isDirectory(dir: string): Promise<boolean> {\n try {\n return (await fs.stat(dir)).isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function getDefaultBranch(git: InstrumentedSimpleGit): Promise<string> {\n logger.debug('getDefaultBranch()');\n // see https://stackoverflow.com/a/62352647/3005034\n try {\n let res = await git.raw(['rev-parse', '--abbrev-ref', 'origin/HEAD']);\n /* v8 ignore next -- TODO: add test #40625 */\n if (!res) {\n logger.debug('Could not determine default branch using git rev-parse');\n const headPrefix = 'HEAD branch: ';\n res = (await git.raw(['remote', 'show', 'origin']))\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith(headPrefix))!\n .replace(headPrefix, '');\n }\n\n return res.replace('origin/', '').trim();\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug({ err }, 'Error getting default branch');\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n if (\n err.message.startsWith(\n 'fatal: ref refs/remotes/origin/HEAD is not a symbolic ref',\n )\n ) {\n throw new Error(REPOSITORY_EMPTY);\n }\n if (err.message.includes(\"fatal: ambiguous argument 'origin/HEAD'\")) {\n logger.warn('Error getting default branch');\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n}\n\nlet config: LocalConfig = {} as any;\n\n// TODO: can be undefined\nlet git: InstrumentedSimpleGit;\nlet gitInitialized: boolean;\nlet submodulesInitizialized: boolean;\n\nlet privateKeySet = false;\n\nlet platformIgnoredAuthors: string[] = [];\n\nexport const GIT_MINIMUM_VERSION = '2.33.0'; // git show-current\n\nexport async function validateGitVersion(): Promise<boolean> {\n let version: string | undefined;\n const globalGit = instrumentGit(createSimpleGit());\n try {\n const { major, minor, patch, installed } = await globalGit.version();\n /* v8 ignore if -- TODO: add test #40625 */\n if (!installed) {\n logger.error('Git not installed');\n return false;\n }\n version = `${major}.${minor}.${patch}`;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.error({ err }, 'Error fetching git version');\n return false;\n }\n /* v8 ignore if -- TODO: add test #40625 */\n if (!(version && semver.gte(version, GIT_MINIMUM_VERSION))) {\n logger.error(\n { detectedVersion: version, minimumVersion: GIT_MINIMUM_VERSION },\n 'Git version needs upgrading',\n );\n return false;\n }\n logger.debug(`Found valid git version: ${version}`);\n return true;\n}\n\nasync function fetchBranchCommits(preferUpstream = true): Promise<void> {\n config.branchCommits = {};\n const url =\n preferUpstream && config.upstreamUrl ? config.upstreamUrl : config.url;\n logger.debug(`fetchBranchCommits(): url=${url}`);\n const opts = ['ls-remote', '--heads', url];\n const localDir = GlobalConfig.get('localDir');\n const repoExists = await fs.pathExists(upath.join(localDir, '.git/HEAD'));\n if (config.extraCloneOpts && !repoExists) {\n Object.entries(config.extraCloneOpts).forEach((e) =>\n // TODO: types (#22198)\n opts.unshift(e[0], `${e[1]!}`),\n );\n }\n try {\n const lsRemoteRes = await gitRetry(() => git.raw(opts));\n logger.trace({ lsRemoteRes }, 'git ls-remote result');\n lsRemoteRes\n .split(newlineRegex)\n .filter(Boolean)\n .map((line) => line.trim().split(regEx(/\\s+/)))\n .forEach(([sha, ref]) => {\n config.branchCommits[ref.replace('refs/heads/', '')] =\n toLongCommitSha(sha);\n });\n\n if (isNonEmptyObject(config.virtualBranches)) {\n for (const [name, branch] of Object.entries(config.virtualBranches)) {\n config.branchCommits[name] = branch.sha;\n }\n }\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 config.virtualBranches ??= {};\n git = instrumentGit(\n createSimpleGit({ config: { baseDir: GlobalConfig.get('localDir') } }),\n );\n gitInitialized = false;\n submodulesInitizialized = false;\n await fetchBranchCommits();\n}\n\nasync function resetToBranch(branchName: string): Promise<void> {\n logger.debug(`resetToBranch(${branchName})`);\n await git.raw(['reset', '--hard']);\n await gitRetry(() => git.checkout(branchName));\n await git.raw(['reset', '--hard', `origin/${branchName}`]);\n await git.raw(['clean', '-fd']);\n}\n\n/* v8 ignore next -- TODO: add test #40625 */\nexport async function resetToCommit(commit: LongCommitSha): Promise<void> {\n logger.debug(`resetToCommit(${commit})`);\n await git.raw(['reset', '--hard', commit]);\n}\n\nasync function deleteLocalBranch(branchName: string): Promise<void> {\n await git.branch(['-D', branchName]);\n}\n\nasync function cleanLocalBranches(): Promise<void> {\n const existingBranches = (await git.raw(['branch']))\n .split(newlineRegex)\n .map((branch) => branch.trim())\n .filter((branch) => branch.length > 0 && !branch.startsWith('* '));\n logger.debug({ existingBranches });\n for (const branchName of existingBranches) {\n await deleteLocalBranch(branchName);\n }\n}\n\nexport function setGitAuthor(gitAuthor: string | undefined): void {\n const gitAuthorParsed = parseGitAuthor(\n gitAuthor ?? 'Renovate Bot <renovate@whitesourcesoftware.com>',\n );\n if (!gitAuthorParsed) {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = 'None';\n error.validationError = 'Invalid gitAuthor';\n error.validationMessage = `\\`gitAuthor\\` is not parsed as valid RFC5322 format: \\`${gitAuthor!}\\``;\n throw error;\n }\n config.gitAuthorName = gitAuthorParsed.name;\n config.gitAuthorEmail = gitAuthorParsed.address;\n}\n\nexport async function writeGitAuthor(): Promise<void> {\n const { gitAuthorName, gitAuthorEmail, writeGitDone } = config;\n /* v8 ignore if -- TODO: add test #40625 */\n if (writeGitDone) {\n return;\n }\n config.writeGitDone = true;\n try {\n // v8 ignore else -- TODO: add test #40625\n if (gitAuthorName) {\n logger.debug(`Setting git author name: ${gitAuthorName}`);\n await git.addConfig('user.name', gitAuthorName);\n }\n // v8 ignore else -- TODO: add test #40625\n if (gitAuthorEmail) {\n logger.debug(`Setting git author email: ${gitAuthorEmail}`);\n await git.addConfig('user.email', gitAuthorEmail);\n }\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n logger.debug(\n { err, gitAuthorName, gitAuthorEmail },\n 'Error setting git author config',\n );\n throw new Error(TEMPORARY_ERROR);\n }\n}\n\nexport function setUserRepoConfig({\n gitIgnoredAuthors,\n gitAuthor,\n}: RenovateConfig): void {\n config.ignoredAuthors = gitIgnoredAuthors ?? [];\n setGitAuthor(gitAuthor);\n}\n\nexport function setPlatformIgnoredAuthors(emails: string[] = []): void {\n platformIgnoredAuthors = emails;\n}\n\nexport async function getSubmodules(): Promise<string[]> {\n try {\n return (\n (await git.raw([\n 'config',\n '--file',\n '.gitmodules',\n '--get-regexp',\n '\\\\.path',\n ])) || ''\n )\n .trim()\n .split(regEx(/[\\n\\s]/))\n .filter((_e: string, i: number) => i % 2);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error getting submodules');\n return [];\n }\n}\n\nexport async function cloneSubmodules(\n shouldClone: boolean,\n cloneSubmodulesFilter: string[] | undefined,\n): Promise<void> {\n if (!shouldClone || submodulesInitizialized) {\n return;\n }\n submodulesInitizialized = true;\n const gitEnv = getChildEnv({ env: getGitEnvironmentVariables() });\n await syncGit();\n const submodules = await getSubmodules();\n for (const submodule of submodules) {\n if (!matchRegexOrGlobList(submodule, cloneSubmodulesFilter ?? ['*'])) {\n logger.debug(\n { cloneSubmodulesFilter },\n `Skipping submodule ${submodule}`,\n );\n continue;\n }\n try {\n logger.debug(`Cloning git submodule at ${submodule}`);\n await gitRetry(() =>\n git.env(gitEnv).submoduleUpdate(['--init', '--recursive', submodule]),\n );\n } catch (err) {\n logger.warn({ err, submodule }, `Unable to initialise git submodule`);\n }\n }\n}\n\nexport function isCloned(): boolean {\n return gitInitialized;\n}\n\nexport async function isFileModeEnabled(): Promise<boolean> {\n if (config.fileModeEnabled === undefined) {\n const value = await git.raw([\n 'config',\n '--type=bool',\n '--default=true',\n '--get',\n 'core.fileMode',\n ]);\n config.fileModeEnabled = value.trim() === 'true';\n }\n\n return config.fileModeEnabled;\n}\n\nexport const syncGit = withInstrumenting(\n { name: 'syncGit' },\n async (): Promise<void> => {\n if (gitInitialized) {\n if (getEnv().RENOVATE_X_CLEAR_HOOKS) {\n await git.raw(['config', 'core.hooksPath', '/dev/null']);\n }\n return;\n }\n /* v8 ignore if -- TODO: add test #40625 */\n if (GlobalConfig.get('platform') === 'local') {\n throw new Error('Cannot sync git when platform=local');\n }\n gitInitialized = true;\n const localDir = GlobalConfig.get('localDir');\n logger.debug(`syncGit(): Initializing git repository into ${localDir}`);\n const gitHead = upath.join(localDir, '.git/HEAD');\n let clone = true;\n\n if (await fs.pathExists(gitHead)) {\n await instrument('fetch', async () => {\n logger.debug(\n `syncGit(): Found existing git repository, attempting git fetch`,\n );\n try {\n await git.raw(['remote', 'set-url', 'origin', config.url]);\n const fetchStart = Date.now();\n await gitRetry(() => git.fetch(['--prune', 'origin']));\n config.currentBranch =\n config.currentBranch || (await getDefaultBranch(git));\n await resetToBranch(config.currentBranch);\n await cleanLocalBranches();\n const durationMs = Math.round(Date.now() - fetchStart);\n logger.info({ durationMs }, 'git fetch completed');\n clone = false;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message === REPOSITORY_EMPTY) {\n throw err;\n }\n logger.info({ err }, 'git fetch error, falling back to git clone');\n }\n });\n }\n if (clone) {\n await instrument('clone', async () => {\n const cloneStart = Date.now();\n try {\n const opts: string[] = [];\n if (config.defaultBranch) {\n opts.push('-b', config.defaultBranch);\n }\n if (config.fullClone) {\n logger.debug('Performing full clone');\n } else {\n logger.debug('Performing blobless clone');\n opts.push('--filter=blob:none');\n }\n if (config.extraCloneOpts) {\n Object.entries(config.extraCloneOpts).forEach((e) =>\n // TODO: types (#22198)\n opts.push(e[0], `${e[1]!}`),\n );\n }\n async function emptyDirAndClone(): Promise<void> {\n await instrument(`fs.emptyDir(${localDir})`, () =>\n fs.emptyDir(localDir),\n );\n await git.clone(config.url, '.', opts);\n }\n await gitRetry(() =>\n instrument('emptyDirAndClone', emptyDirAndClone),\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug({ err }, 'git clone error');\n if (err.message?.includes('No space left on device')) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n if (err.message === REPOSITORY_EMPTY) {\n throw err;\n }\n throw new ExternalHostError(err, 'git');\n }\n const durationMs = Math.round(Date.now() - cloneStart);\n logger.debug({ durationMs }, 'git clone completed');\n });\n }\n try {\n config.currentBranchSha = toLongCommitSha(\n (await git.raw(['rev-parse', 'HEAD'])).trim(),\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message?.includes('fatal: not a git repository')) {\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n }\n // This will only happen now if set in global config\n await instrument('cloneSubmodules', () =>\n cloneSubmodules(!!config.cloneSubmodules, config.cloneSubmodulesFilter),\n );\n try {\n const latestCommit = (await git.log({ n: 1 })).latest;\n logger.debug({ latestCommit }, 'latest repository commit');\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n if (err.message.includes('does not have any commits yet')) {\n throw new Error(REPOSITORY_EMPTY);\n }\n logger.warn({ err }, 'Cannot retrieve latest commit');\n }\n config.currentBranch =\n config.currentBranch ??\n config.defaultBranch ??\n (await getDefaultBranch(git));\n /* v8 ignore next -- TODO: add test #40625 */\n delete getCache()?.semanticCommits;\n\n // If upstreamUrl is set then the bot is running in fork mode\n // The \"upstream\" remote is the original repository which was forked from\n if (config.upstreamUrl) {\n const { upstreamUrl } = config;\n await instrument('sync with upstreamUrl', async () => {\n logger.debug(\n `Bringing default branch up-to-date with ${RENOVATE_FORK_UPSTREAM}, to get latest config`,\n );\n // Add remote if it does not exist\n const remotes = await git.getRemotes(true);\n // v8 ignore else -- TODO: add test #40625\n if (!remotes.some((remote) => remote.name === RENOVATE_FORK_UPSTREAM)) {\n logger.debug(`Adding remote ${RENOVATE_FORK_UPSTREAM}`);\n await git.addRemote(RENOVATE_FORK_UPSTREAM, upstreamUrl);\n }\n await syncForkWithUpstream(config.currentBranch);\n await fetchBranchCommits(false);\n });\n }\n\n if (isNonEmptyObject(config.virtualBranches)) {\n const virtualBranches = config.virtualBranches;\n await instrument('fetch virtual branches', async () => {\n const refSpecs = Object.entries(virtualBranches).map(\n ([name, branch]) => `${branch.ref}:${remoteBranchRef(name)}`,\n );\n await fetchRevSpec(...refSpecs);\n logger.debug(\n `Fetched ${Object.keys(virtualBranches).length} virtual branches`,\n );\n });\n }\n\n config.currentBranchSha = toLongCommitSha(\n (await git.revparse('HEAD')).trim(),\n );\n logger.debug(`Current branch SHA: ${config.currentBranchSha}`);\n },\n);\n\nexport async function getRepoStatus(path?: string): Promise<StatusResult> {\n if (isString(path)) {\n const localDir = GlobalConfig.get('localDir');\n const localPath = upath.resolve(localDir, path);\n if (!localPath.startsWith(upath.resolve(localDir))) {\n logger.warn(\n { localPath, localDir },\n 'Preventing access to file outside the local directory',\n );\n throw new Error(INVALID_PATH);\n }\n }\n\n await syncGit();\n return git.status(path ? [path] : []);\n}\n\nexport function branchExists(branchName: string): boolean {\n return !!config.branchCommits[branchName];\n}\n\n// Return the commit SHA for a branch\nexport function getBranchCommit(branchName: string): LongCommitSha | null {\n return config.branchCommits?.[branchName] || null;\n}\n\n// Return the date of the latest commit for a branch\nexport async function getBranchUpdateDate(\n branchName: string,\n): Promise<DateTime | null> {\n const branchSha = config.branchCommits[branchName];\n if (!branchSha) {\n return null;\n }\n const updateDate = getCachedUpdateDateResult(branchName, branchSha);\n if (updateDate !== null) {\n logger.debug(\n `getBranchUpdateDate(): using cached result \"${updateDate.toISO()}\"`,\n );\n return updateDate;\n }\n await syncGit();\n try {\n const result = await getCommitDate(branchSha);\n setCachedUpdateDateResult(branchName, result);\n return result;\n } catch (err) {\n logger.debug({ err, branchName }, 'Error getting branch update date');\n return null;\n }\n}\n\nexport async function getCommitMessages(): Promise<string[]> {\n logger.debug('getCommitMessages');\n // v8 ignore else -- TODO: add test #40625\n if (GlobalConfig.get('platform') !== 'local') {\n await syncGit();\n }\n try {\n const res = await git.log({\n n: 20,\n format: { message: '%s' },\n '--no-merges': null,\n });\n return res.all.map((commit) => commit.message);\n } catch /* v8 ignore next -- TODO: add test #40625 */ {\n return [];\n }\n}\n\nexport async function checkoutBranch(\n branchName: string,\n): Promise<LongCommitSha> {\n logger.debug(`Setting current branch to ${branchName}`);\n await syncGit();\n try {\n await gitRetry(() =>\n git.checkout(\n submodulesInitizialized\n ? ['-f', '--recurse-submodules', branchName, '--']\n : ['-f', branchName, '--'],\n ),\n );\n config.currentBranch = branchName;\n config.currentBranchSha = toLongCommitSha(\n (await git.raw(['rev-parse', 'HEAD'])).trim(),\n );\n const latestCommitDate = await getCommitDate(config.currentBranchSha);\n // v8 ignore else -- TODO: add test #40625\n if (latestCommitDate) {\n logger.debug(\n { branchName, latestCommitDate, sha: config.currentBranchSha },\n 'latest commit',\n );\n }\n await git.reset(ResetMode.HARD);\n return config.currentBranchSha;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n if (err.message?.includes('fatal: ambiguous argument')) {\n logger.warn({ err }, 'Failed to checkout branch');\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n}\n\nexport async function checkoutBranchFromRemote(\n branchName: string,\n remoteName: string,\n): Promise<LongCommitSha> {\n logger.debug(`Checking out branch ${branchName} from remote ${remoteName}`);\n await syncGit();\n try {\n await gitRetry(() =>\n git.checkoutBranch(branchName, `${remoteName}/${branchName}`),\n );\n config.currentBranch = branchName;\n config.currentBranchSha = toLongCommitSha(\n (await git.revparse('HEAD')).trim(),\n );\n logger.debug(`Checked out branch ${branchName} from remote ${remoteName}`);\n config.branchCommits[branchName] = config.currentBranchSha;\n return config.currentBranchSha;\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n if (err.message?.includes('fatal: ambiguous argument')) {\n logger.warn({ err }, 'Failed to checkout branch');\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n}\n\n/**\n * Returns the remote-tracking ref path for a virtual branch.\n */\nexport function remoteBranchRef(branchName: string): string {\n return `refs/remotes/origin/${branchName}`;\n}\n\n/**\n * Returns whether the given branch is tracked as a virtual branch.\n */\nfunction isVirtualBranch(branchName: string): boolean {\n return branchName in config.virtualBranches;\n}\n\n/**\n * Set a virtual branch's remote-tracking ref and add it to the\n * virtual-branch registry (config.virtualBranches).\n *\n * Used after pushing (to keep tracking in sync with the remote) and in\n * createPr() when the Gerrit change ref becomes available.\n *\n * @param branchName Virtual branch name to set\n * @param ref The ref this virtual branch is fetched from (e.g., 'refs/changes/34/1234/1')\n * @param commitSha The commit SHA the virtual branch points to.\n */\nexport async function setVirtualBranch(\n branchName: string,\n ref: string,\n commitSha: LongCommitSha,\n): Promise<void> {\n logger.debug({ branchName, ref, commitSha }, 'setVirtualBranch()');\n await git.raw(['update-ref', remoteBranchRef(branchName), commitSha]);\n config.branchCommits[branchName] = commitSha;\n config.virtualBranches[branchName] = { ref, sha: commitSha };\n config.branchIsModified[branchName] = false;\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 from: `origin/${baseBranch}`,\n to: `origin/${branchName}`,\n symmetric: false, // means <from>..<to> instead of <from>...<to>\n format: {\n author_email: '%ae',\n committer_email: '%ce',\n },\n });\n\n for (const commit of commits.all) {\n committedAuthors.add(commit.author_email);\n committedAuthors.add(commit.committer_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 for (const ignoredAuthor of platformIgnoredAuthors) {\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 if (isVirtualBranch(branchName)) {\n // Delete the remote-tracking ref.\n // Note: git update-ref -d succeeds even if the ref doesn't exist.\n const ref = remoteBranchRef(branchName);\n logger.debug({ branchName, ref }, 'Deleting virtual branch');\n await git.raw(['update-ref', '-d', ref]);\n delete config.virtualBranches[branchName];\n } else {\n try {\n const deleteCommand = ['push', '--delete', 'origin', branchName];\n\n if (getNoVerify().includes('push')) {\n deleteCommand.push('--no-verify');\n }\n\n await gitRetry(() => git.raw(deleteCommand));\n logger.debug(`Deleted remote branch: ${branchName}`);\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n logger.debug(`No remote branch to delete with name: ${branchName}`);\n }\n }\n try {\n await deleteLocalBranch(branchName);\n /* v8 ignore next -- TODO: add test #40625 (always throws) */\n logger.debug(`Deleted local branch: ${branchName}`);\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n logger.debug(`No local branch to delete with name: ${branchName}`);\n }\n delete config.branchCommits[branchName];\n}\n\nexport async function mergeToLocal(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([\n '-B',\n config.currentBranch,\n `origin/${config.currentBranch}`,\n ]),\n );\n status = await git.status();\n if (isVirtualBranch(branchName)) {\n // Virtual branches are already local and tracked as a remote-tracking ref,\n // so merge it directly without fetching from origin.\n const ref = remoteBranchRef(branchName);\n logger.debug(\n { branchName, ref },\n 'mergeToLocal(): merging virtual branch',\n );\n await git.merge([ref]);\n } else {\n await fetchRevSpec(branchName);\n await gitRetry(() => git.merge(['FETCH_HEAD']));\n }\n } catch (err) {\n logger.debug(\n {\n baseBranch: config.currentBranch,\n baseSha: config.currentBranchSha,\n branchName,\n status,\n err,\n },\n 'mergeLocally error',\n );\n throw err;\n }\n}\n\nexport async function mergeBranch(branchName: string): Promise<void> {\n let status: StatusResult | undefined;\n try {\n await syncGit();\n await writeGitAuthor();\n await git.reset(ResetMode.HARD);\n await gitRetry(() =>\n git.checkout(['-B', branchName, `origin/${branchName}`]),\n );\n await gitRetry(() =>\n git.checkout([\n '-B',\n config.currentBranch,\n `origin/${config.currentBranch}`,\n ]),\n );\n status = await git.status();\n await gitRetry(() => git.merge(['--ff-only', branchName]));\n await gitRetry(() => git.push('origin', config.currentBranch));\n incLimitedValue('Commits');\n } catch (err) {\n logger.debug(\n {\n baseBranch: config.currentBranch,\n baseSha: config.currentBranchSha,\n branchName,\n branchSha: getBranchCommit(branchName),\n status,\n err,\n },\n 'mergeBranch error',\n );\n throw err;\n }\n}\n\nasync function getCommitDate(ref: LongCommitSha | string): Promise<DateTime> {\n const output = await git.show(['-s', '--format=%cI', ref]);\n return DateTime.fromISO(output.trim()).toUTC();\n}\n\nexport async function getBranchLastCommitTime(\n branchName: string,\n): Promise<Date> {\n await syncGit();\n try {\n const time = await getCommitDate(`origin/${branchName}`);\n return time.toJSDate();\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore next 3 -- TODO: add test */\n if (errChecked) {\n throw errChecked;\n }\n return new Date();\n }\n}\n\nexport function getBranchFiles(branchName: string): Promise<string[] | null> {\n return getBranchFilesFromRef(`origin/${branchName}`);\n}\n\nexport function getBranchFilesFromCommit(\n referenceCommit: LongCommitSha,\n): Promise<string[] | null> {\n return getBranchFilesFromRef(referenceCommit);\n}\n\nasync function getBranchFilesFromRef(\n refName: string,\n): Promise<string[] | null> {\n await syncGit();\n try {\n const diff = await gitRetry(() =>\n git.diffSummary([refName, `${refName}^`]),\n );\n return diff.files.map((file) => file.file);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'getBranchFilesFromRef error');\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n return null;\n }\n}\n\nexport async function getFile(\n filePath: string,\n branchName?: string,\n): Promise<string | null> {\n await syncGit();\n try {\n const content = await git.show([\n `origin/${branchName ?? config.currentBranch}:${filePath}`,\n ]);\n\n logWarningIfUnicodeHiddenCharactersInPackageFile(filePath, content);\n\n return content;\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n return null;\n }\n}\n\nexport async function getFiles(\n fileNames: string[],\n): Promise<Record<string, string | null>> {\n const fileContentMap: Record<string, string | null> = {};\n\n for (const fileName of fileNames) {\n fileContentMap[fileName] = await getFile(fileName);\n }\n\n return fileContentMap;\n}\n\nexport async function hasDiff(\n sourceRef: string,\n targetRef: string,\n): Promise<boolean> {\n await syncGit();\n try {\n return (\n (await gitRetry(() => git.diff([sourceRef, targetRef, '--']))) !== ''\n );\n } catch {\n return true;\n }\n}\n\nasync function handleCommitAuth(localDir: string): Promise<void> {\n if (!privateKeySet) {\n await writePrivateKey();\n privateKeySet = true;\n }\n await configSigningKey(localDir);\n await writeGitAuthor();\n}\n\n/**\n *\n * Prepare local branch with commit\n *\n * 0. Hard reset\n * 1. Creates local branch with `origin/` prefix\n * 2. Perform `git add` (respecting mode) and `git remove` for each file\n * 3. Perform commit\n * 4. Check whether resulting commit is empty or not (due to .gitignore)\n * 5. If not empty, return commit info for further processing\n *\n */\nexport async function prepareCommit({\n branchName,\n files,\n message,\n force = false,\n}: CommitFilesConfig): Promise<CommitResult | null> {\n const localDir = GlobalConfig.get('localDir');\n await syncGit();\n logger.debug(`Preparing files for committing to branch ${branchName}`);\n await handleCommitAuth(localDir);\n try {\n await git.reset(ResetMode.HARD);\n await git.raw(['clean', '-fd']);\n const parentCommitSha = config.currentBranchSha;\n await gitRetry(() =>\n git.checkout(['-B', branchName, `origin/${config.currentBranch}`]),\n );\n const deletedFiles: string[] = [];\n const addedModifiedFiles: string[] = [];\n const ignoredFiles: string[] = [];\n for (const file of files) {\n const fileName = file.path;\n if (file.type === 'deletion') {\n try {\n await git.rm([fileName]);\n deletedFiles.push(fileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n logger.trace({ err, fileName }, 'Cannot delete file');\n ignoredFiles.push(fileName);\n }\n } else {\n if (await isDirectory(upath.join(localDir, fileName))) {\n // This is usually a git submodule update\n logger.trace({ fileName }, 'Adding directory commit');\n } else if (file.contents === null) {\n continue;\n } else {\n let contents: Buffer;\n /* v8 ignore else -- TODO: add test #40625 */\n if (typeof file.contents === 'string') {\n contents = Buffer.from(file.contents);\n } else {\n contents = file.contents;\n }\n // some file systems including Windows don't support the mode\n // so the index should be manually updated after adding the file\n if (file.isSymlink) {\n await fs.symlink(file.contents, upath.join(localDir, fileName));\n } else {\n await fs.outputFile(upath.join(localDir, fileName), contents, {\n mode: file.isExecutable ? 0o777 : 0o666,\n });\n }\n }\n try {\n /* v8 ignore next -- TODO: add test #40625 */\n const addParams =\n fileName === getConfigFileNames()[0] ? ['-f', fileName] : fileName;\n await git.add(addParams);\n if (file.isExecutable) {\n await git.raw(['update-index', '--chmod=+x', fileName]);\n }\n addedModifiedFiles.push(fileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (\n !err.message.includes(\n 'The following paths are ignored by one of your .gitignore files',\n )\n ) {\n throw err;\n }\n logger.debug(`Cannot commit ignored file: ${fileName}`);\n ignoredFiles.push(file.path);\n }\n }\n }\n\n const commitOptions: Options = {};\n if (getNoVerify().includes('commit')) {\n commitOptions['--no-verify'] = null;\n }\n\n const commitRes = await git.commit(message, [], commitOptions);\n if (\n isNonEmptyObject(commitRes.summary) &&\n commitRes.summary.changes === 0 &&\n commitRes.summary.insertions === 0 &&\n commitRes.summary.deletions === 0\n ) {\n logger.warn({ commitRes }, 'Detected empty commit - aborting git push');\n return null;\n }\n logger.debug(\n { deletedFiles, ignoredFiles, result: commitRes },\n `git commit`,\n );\n if (!force && !(await hasDiff('HEAD', `origin/${branchName}`))) {\n logger.debug(\n { branchName, deletedFiles, addedModifiedFiles, ignoredFiles },\n 'No file changes detected. Skipping commit',\n );\n return null;\n }\n\n const commitSha = toLongCommitSha(\n (await git.revparse([branchName])).trim(),\n );\n const result: CommitResult = {\n parentCommitSha,\n commitSha,\n files: files.filter((fileChange) => {\n if (fileChange.type === 'deletion') {\n return deletedFiles.includes(fileChange.path);\n }\n return addedModifiedFiles.includes(fileChange.path);\n }),\n };\n\n return result;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n return handleCommitError(err, branchName, files);\n }\n}\n\nexport async function pushCommit({\n sourceRef,\n targetRef,\n files,\n pushOptions,\n}: PushFilesConfig): Promise<boolean> {\n await syncGit();\n logger.debug(`Pushing refSpec ${sourceRef}:${targetRef ?? sourceRef}`);\n let result = false;\n try {\n const gitOptions: TaskOptions = {\n '--force-with-lease': null,\n '-u': null,\n };\n if (getNoVerify().includes('push')) {\n gitOptions['--no-verify'] = null;\n }\n if (pushOptions) {\n gitOptions['--push-option'] = pushOptions;\n }\n\n const pushRes = await gitRetry(() =>\n git.push('origin', `${sourceRef}:${targetRef ?? sourceRef}`, gitOptions),\n );\n delete pushRes.repo;\n logger.debug({ result: pushRes }, 'git push');\n incLimitedValue('Commits');\n incCountValue('HourlyCommits');\n result = true;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n handleCommitError(err, sourceRef, files);\n }\n return result;\n}\n\nexport async function fetchBranch(\n branchName: string,\n): Promise<LongCommitSha | null> {\n await syncGit();\n logger.debug(`Fetching branch ${branchName}`);\n try {\n const ref = `refs/heads/${branchName}:${remoteBranchRef(branchName)}`;\n await gitRetry(() => git.pull(['origin', ref, '--force']));\n const commit = toLongCommitSha((await git.revparse([branchName])).trim());\n config.branchCommits[branchName] = commit;\n config.branchIsModified[branchName] = false;\n return commit;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n return handleCommitError(err, branchName);\n }\n}\n\nexport async function commitFiles(\n commitConfig: CommitFilesConfig,\n): Promise<LongCommitSha | null> {\n try {\n const commitResult = await prepareCommit(commitConfig);\n if (commitResult) {\n const pushResult = await pushCommit({\n sourceRef: commitConfig.branchName,\n files: commitConfig.files,\n });\n // v8 ignore else -- TODO: add test #40625\n if (pushResult) {\n const { branchName } = commitConfig;\n const { commitSha } = commitResult;\n config.branchCommits[branchName] = commitSha;\n config.branchIsModified[branchName] = false;\n return commitSha;\n }\n }\n return null;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message.includes('[rejected] (stale info)')) {\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n }\n}\n\nexport function getUrl({\n protocol,\n auth,\n hostname,\n host,\n repository,\n}: {\n protocol?: GitProtocol;\n auth?: string;\n hostname?: string;\n host?: string;\n repository: string;\n}): string {\n if (protocol === 'ssh') {\n // TODO: types (#22198)\n return `git@${hostname!}:${repository}.git`;\n }\n return URL.format({\n protocol: protocol ?? 'https',\n auth,\n hostname,\n host,\n pathname: `${repository}.git`,\n });\n}\n\nlet remoteRefsExist = false;\n\n/**\n *\n * Non-branch refs allow us to store git objects without triggering CI pipelines.\n * It's useful for API-based branch rebasing.\n *\n * @see https://stackoverflow.com/questions/63866947/pushing-git-non-branch-references-to-a-remote/63868286\n *\n */\nexport async function pushCommitToRenovateRef(\n commitSha: string,\n refName: string,\n): Promise<void> {\n const fullRefName = `refs/renovate/branches/${refName}`;\n await git.raw(['update-ref', fullRefName, commitSha]);\n await git.push(['--force', 'origin', fullRefName]);\n remoteRefsExist = true;\n}\n\n/**\n *\n * Removes all remote \"refs/renovate/branches/*\" refs in two steps:\n *\n * Step 1: list refs\n *\n * $ git ls-remote origin \"refs/renovate/branches/*\"\n *\n * > cca38e9ea6d10946bdb2d0ca5a52c205783897aa refs/renovate/branches/foo\n * > 29ac154936c880068994e17eb7f12da7fdca70e5 refs/renovate/branches/bar\n * > 3fafaddc339894b6d4f97595940fd91af71d0355 refs/renovate/branches/baz\n * > ...\n *\n * Step 2:\n *\n * $ git push --delete origin refs/renovate/branches/foo refs/renovate/branches/bar refs/renovate/branches/baz\n *\n * If Step 2 fails because the repo doesn't allow bulk changes, we'll remove them one by one instead:\n *\n * $ git push --delete origin refs/renovate/branches/foo\n * $ git push --delete origin refs/renovate/branches/bar\n * $ git push --delete origin refs/renovate/branches/baz\n */\nexport async function clearRenovateRefs(): Promise<void> {\n if (!gitInitialized || !remoteRefsExist) {\n return;\n }\n\n logger.debug(`Cleaning up Renovate refs: refs/renovate/branches/*`);\n const renovateRefs: string[] = [];\n\n try {\n const rawOutput = await git.listRemote([\n config.url,\n 'refs/renovate/branches/*',\n ]);\n const refs = rawOutput\n .split(newlineRegex)\n .map((line) => line.replace(regEx(/[0-9a-f]+\\s+/i), '').trim())\n .filter((line) => line.startsWith('refs/renovate/branches/'));\n renovateRefs.push(...refs);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, `Renovate refs cleanup error`);\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (renovateRefs.length) {\n try {\n const pushOpts = ['--delete', 'origin', ...renovateRefs];\n await git.push(pushOpts);\n } catch (err) {\n /* v8 ignore else -- TODO: add test #40625 */\n if (bulkChangesDisallowed(err)) {\n for (const ref of renovateRefs) {\n try {\n const pushOpts = ['--delete', 'origin', ref];\n await git.push(pushOpts);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug({ err }, 'Error deleting \"refs/renovate/branches/*\"');\n break;\n }\n }\n } else {\n logger.warn({ err }, 'Error deleting \"refs/renovate/branches/*\"');\n }\n }\n }\n\n remoteRefsExist = false;\n}\n\nconst diffTreeLineRegex = regEx(\n /^:(?<oldMode>\\d{6})\\s+(?<newMode>\\d{6})\\s+(?<oldSha>[0-9a-f]{40})\\s+(?<newSha>[0-9a-f]{40})\\s+(?<status>[A-Z]\\d*)\\t(?<paths>.+)$/,\n);\n\nconst treeShaRegex = regEx(/tree\\s+(?<treeSha>[0-9a-f]{40})\\s*/);\n\n/**\n * Get the tree SHA for a commit.\n */\nexport async function getCommitTreeSha(\n commitSha: LongCommitSha,\n): Promise<LongCommitSha> {\n const commitOutput = await git.catFile(['-p', commitSha]);\n const { treeSha } = treeShaRegex.exec(commitOutput)?.groups ?? {};\n if (!treeSha) {\n const snippet = commitOutput.split(newlineRegex)[0];\n /* v8 ignore next -- tested, but v8 reports template literal as partial */\n throw new Error(\n `Could not extract tree SHA from commit ${commitSha}: ${snippet}`,\n );\n }\n return toLongCommitSha(treeSha);\n}\n\nfunction treeTypeFromMode(mode: string): GitObjectType {\n switch (mode) {\n case GitTreeMode.Gitlink:\n return 'commit';\n case GitTreeMode.Directory:\n return 'tree';\n default:\n return 'blob';\n }\n}\n\n/**\n * Return only the files that changed between two commits.\n * Deletions have `sha: null` (for use with GitHub's `base_tree` API).\n */\nexport async function diffCommitTree(\n parentCommitSha: LongCommitSha,\n commitSha: LongCommitSha,\n): Promise<DiffTreeItem[]> {\n const output = await git.raw([\n 'diff-tree',\n '-M',\n '-r',\n '--no-commit-id',\n parentCommitSha,\n commitSha,\n ]);\n const result: DiffTreeItem[] = [];\n for (const line of output.split(newlineRegex)) {\n const matchGroups = diffTreeLineRegex.exec(line)?.groups;\n if (matchGroups) {\n const { oldMode, newMode, newSha, status, paths } = matchGroups;\n const statusCode = status[0];\n // R has two tab-separated paths (old\\tnew); A/M/D/T have one.\n // C also has two paths but falls through to default (only the target matters).\n const [sourcePath, targetPath] = paths.split('\\t');\n switch (statusCode) {\n case 'D':\n result.push({\n path: sourcePath,\n mode: oldMode,\n type: treeTypeFromMode(oldMode),\n sha: null,\n });\n break;\n case 'R':\n // Rename: delete source, add target\n result.push({\n path: sourcePath,\n mode: oldMode,\n type: treeTypeFromMode(oldMode),\n sha: null,\n });\n result.push({\n path: targetPath,\n mode: newMode,\n type: treeTypeFromMode(newMode),\n sha: toLongCommitSha(newSha),\n });\n break;\n default:\n // A (add), M (modify), T (type change), C (copy)\n result.push({\n path: targetPath ?? sourcePath,\n mode: newMode,\n type: treeTypeFromMode(newMode),\n sha: toLongCommitSha(newSha),\n });\n break;\n }\n }\n }\n return result;\n}\n\nasync function localBranchExists(branchName: string): Promise<boolean> {\n await syncGit();\n const localBranches = await git.branchLocal();\n return localBranches.all.includes(branchName);\n}\n\n/**\n * Synchronize a forked branch with its upstream counterpart.\n *\n * syncForkWithUpstream updates the fork's branch, to match the corresponding branch in the upstream repository.\n * The steps are:\n * 1. Check if the branch exists locally.\n * 2. If the branch exists locally: checkout the local branch.\n * 3. If the branch does _not_ exist locally: checkout the upstream branch.\n * 4. Reset the local branch to match the upstream branch.\n * 5. Force push the (updated) local branch to the origin repository.\n *\n * @param {string} branchName - The name of the branch to synchronize.\n * @returns A promise that resolves to True if the synchronization is successful, or `false` if an error occurs.\n */\nexport async function syncForkWithUpstream(branchName: string): Promise<void> {\n if (!config.upstreamUrl) {\n return;\n }\n logger.debug(\n `Synchronizing fork with \"${RENOVATE_FORK_UPSTREAM}\" remote for branch ${branchName}`,\n );\n const remotes = await getRemotes();\n /* v8 ignore if -- this should not be possible if upstreamUrl exists */\n if (!remotes.some((r) => r === RENOVATE_FORK_UPSTREAM)) {\n throw new Error('No upstream remote exists, cannot sync fork');\n }\n try {\n await git.fetch([RENOVATE_FORK_UPSTREAM]);\n if (await localBranchExists(branchName)) {\n await checkoutBranch(branchName);\n } else {\n await checkoutBranchFromRemote(branchName, RENOVATE_FORK_UPSTREAM);\n }\n await resetHardFromRemote(`${RENOVATE_FORK_UPSTREAM}/${branchName}`);\n await forcePushToRemote(branchName, 'origin');\n } catch (err) /* v8 ignore next -- shouldn't happen */ {\n logger.error({ err }, 'Error synchronizing fork');\n throw new Error(UNKNOWN_ERROR);\n }\n}\n\nexport async function getRemotes(): Promise<string[]> {\n logger.debug('git.getRemotes()');\n try {\n await syncGit();\n const remotes = await git.getRemotes();\n logger.debug(`Found remotes: ${remotes.map((r) => r.name).join(', ')}`);\n return remotes.map((remote) => remote.name);\n } catch (err) /* v8 ignore next -- git.getRemotes only fails on repo corruption, not simulated in specs */ {\n logger.error({ err }, 'Error getting remotes');\n throw err;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqFA,MAAM,aAAa;AACnB,MAAM,eAAe;AACrB,MAAM,cAAc;AAEpB,MAAa,yBAAyB;AAEtC,SAAgB,gBAAgB,EAC9B,QACA,QAIE,CAAC,GAAc;CACjB,OAAO,UAAU;EAAE,GAAG,gBAAgB;EAAG,GAAG;CAAO,CAAC,CAAC,CAAC,IACpD,YAAY;EACV,UAAU,EAIR,iBAAiB,uBACnB;EACA,KAAK;GACH,GAAG;GAQH,MAAM;GACN,QAAQ;EACV;CACF,CAAC,CACH;AACF;AAGA,eAAsB,SAAY,SAAuC;CACvE,IAAI,QAAQ;CACZ,IAAI;CAEJ,OAAO,SAAS,YAAY;EAC1B,IAAI,QAAQ,GACV,OAAO,MAAM,kBAAkB,OAAO;EAExC,IAAI;GACF,MAAM,MAAM,MAAM,QAAQ;GAC1B,IAAI,QAAQ,GACV,OAAO,MAAM,kCAAkC;GAEjD,OAAO;EACT,SAAS,KAAK;GACZ,YAAY;GACZ,OAAO,MAAM,EAAE,IAAI,GAAG,qBAAqB;GAE3C,MAAM,aAAa,wBAAwB,GAAG;GAC9C,IAAI,sBAAsB,mBACxB,OAAO,MACL,EAAE,KAAK,WAAW,GAClB,qCACE,QAAQ,EACT,MAAM,WAAW,8BACpB;QAEA,MAAM;EAEV;EAEA,MAAM,YAAY,eAAgB,QAAQ,KAAK;EAC/C,OAAO,MAAM,EAAE,UAAU,GAAG,kBAAkB;EAC9C,MAAM,WAAW,MAAO,SAAS;EAEjC;CACF;CAEA,MAAM;AACR;AAEA,eAAe,YAAY,KAA+B;CACxD,IAAI;EACF,QAAQ,MAAM,GAAG,KAAK,GAAG,EAAA,CAAG,YAAY;CAC1C,QAAQ;EACN,OAAO;CACT;AACF;AAEA,eAAe,iBAAiB,KAA6C;CAC3E,OAAO,MAAM,oBAAoB;CAEjC,IAAI;EACF,IAAI,MAAM,MAAM,IAAI,IAAI;GAAC;GAAa;GAAgB;EAAa,CAAC;;EAEpE,IAAI,CAAC,KAAK;GACR,OAAO,MAAM,wDAAwD;GACrE,MAAM,aAAa;GACnB,OAAO,MAAM,IAAI,IAAI;IAAC;IAAU;IAAQ;GAAQ,CAAC,EAAA,CAC9C,MAAM,IAAI,CAAC,CACX,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAC1B,MAAM,SAAS,KAAK,WAAW,UAAU,CAAC,CAAC,CAC3C,QAAQ,YAAY,EAAE;EAC3B;EAEA,OAAO,IAAI,QAAQ,WAAW,EAAE,CAAC,CAAC,KAAK;CACzC,SAAS,oDAAmD;EAC1D,OAAO,MAAM,EAAE,IAAI,GAAG,8BAA8B;EACpD,MAAM,aAAa,wBAAwB,GAAG;EAC9C,IAAI,YACF,MAAM;EAER,IACE,IAAI,QAAQ,WACV,2DACF,GAEA,MAAM,IAAI,MAAM,gBAAgB;EAElC,IAAI,IAAI,QAAQ,SAAS,yCAAyC,GAAG;GACnE,OAAO,KAAK,8BAA8B;GAC1C,MAAM,IAAI,MAAM,eAAe;EACjC;EACA,MAAM;CACR;AACF;AAEA,IAAI,SAAsB,CAAC;AAG3B,IAAI;AACJ,IAAI;AACJ,IAAI;AAEJ,IAAI,gBAAgB;AAEpB,IAAI,yBAAmC,CAAC;AAExC,MAAa,sBAAsB;AAEnC,eAAsB,qBAAuC;CAC3D,IAAI;CACJ,MAAM,YAAY,cAAc,gBAAgB,CAAC;CACjD,IAAI;EACF,MAAM,EAAE,OAAO,OAAO,OAAO,cAAc,MAAM,UAAU,QAAQ;;EAEnE,IAAI,CAAC,WAAW;GACd,OAAO,MAAM,mBAAmB;GAChC,OAAO;EACT;EACA,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG;CACjC,SAAS,oDAAmD;EAC1D,OAAO,MAAM,EAAE,IAAI,GAAG,4BAA4B;EAClD,OAAO;CACT;;CAEA,IAAI,EAAE,WAAW,OAAO,IAAI,SAAA,QAA4B,IAAI;EAC1D,OAAO,MACL;GAAE,iBAAiB;GAAS,gBAAgB;EAAoB,GAChE,6BACF;EACA,OAAO;CACT;CACA,OAAO,MAAM,4BAA4B,SAAS;CAClD,OAAO;AACT;AAEA,eAAe,mBAAmB,iBAAiB,MAAqB;CACtE,OAAO,gBAAgB,CAAC;CACxB,MAAM,MACJ,kBAAkB,OAAO,cAAc,OAAO,cAAc,OAAO;CACrE,OAAO,MAAM,6BAA6B,KAAK;CAC/C,MAAM,OAAO;EAAC;EAAa;EAAW;CAAG;CACzC,MAAM,WAAW,aAAa,IAAI,UAAU;CAC5C,MAAM,aAAa,MAAM,GAAG,WAAW,MAAM,KAAK,UAAU,WAAW,CAAC;CACxE,IAAI,OAAO,kBAAkB,CAAC,YAC5B,OAAO,QAAQ,OAAO,cAAc,CAAC,CAAC,SAAS,MAE7C,KAAK,QAAQ,EAAE,IAAI,GAAG,EAAE,IAAK,CAC/B;CAEF,IAAI;EACF,MAAM,cAAc,MAAM,eAAe,IAAI,IAAI,IAAI,CAAC;EACtD,OAAO,MAAM,EAAE,YAAY,GAAG,sBAAsB;EACpD,YACG,MAAM,YAAY,CAAC,CACnB,OAAO,OAAO,CAAC,CACf,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC,CAAC,CAC9C,SAAS,CAAC,KAAK,SAAS;GACvB,OAAO,cAAc,IAAI,QAAQ,eAAe,EAAE,KAChD,gBAAgB,GAAG;EACvB,CAAC;EAEH,IAAI,iBAAiB,OAAO,eAAe,GACzC,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,OAAO,eAAe,GAChE,OAAO,cAAc,QAAQ,OAAO;EAIxC,OAAO,MAAM,EAAE,eAAe,OAAO,cAAc,GAAG,gBAAgB;CACxE,SAAS,oDAAmD;EAC1D,MAAM,aAAa,wBAAwB,GAAG;EAC9C,IAAI,YACF,MAAM;EAER,OAAO,MAAM,EAAE,IAAI,GAAG,WAAW;EACjC,IAAI,IAAI,SAAS,SAAS,6CAA6C,GACrE,MAAM,IAAI,MAAM,mBAAmB;EAErC,MAAM;CACR;AACF;AAEA,eAAsB,aAAa,GAAG,SAAkC;CACtE,MAAM,eAAe,IAAI,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC;AACxD;AAEA,eAAsB,SAAS,MAAoC;CACjE,SAAS,EAAE,GAAG,KAAK;CACnB,OAAO,iBAAiB,CAAC;CACzB,OAAO,qBAAqB,CAAC;CAC7B,OAAO,mBAAmB,CAAC;CAC3B,OAAO,oBAAoB,CAAC;CAC5B,MAAM,cACJ,gBAAgB,EAAE,QAAQ,EAAE,SAAS,aAAa,IAAI,UAAU,EAAE,EAAE,CAAC,CACvE;CACA,iBAAiB;CACjB,0BAA0B;CAC1B,MAAM,mBAAmB;AAC3B;AAEA,eAAe,cAAc,YAAmC;CAC9D,OAAO,MAAM,iBAAiB,WAAW,EAAE;CAC3C,MAAM,IAAI,IAAI,CAAC,SAAS,QAAQ,CAAC;CACjC,MAAM,eAAe,IAAI,SAAS,UAAU,CAAC;CAC7C,MAAM,IAAI,IAAI;EAAC;EAAS;EAAU,UAAU;CAAY,CAAC;CACzD,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC;AAChC;;AAGA,eAAsB,cAAc,QAAsC;CACxE,OAAO,MAAM,iBAAiB,OAAO,EAAE;CACvC,MAAM,IAAI,IAAI;EAAC;EAAS;EAAU;CAAM,CAAC;AAC3C;AAEA,eAAe,kBAAkB,YAAmC;CAClE,MAAM,IAAI,OAAO,CAAC,MAAM,UAAU,CAAC;AACrC;AAEA,eAAe,qBAAoC;CACjD,MAAM,oBAAoB,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAA,CAC/C,MAAM,YAAY,CAAC,CACnB,KAAK,WAAW,OAAO,KAAK,CAAC,CAAC,CAC9B,QAAQ,WAAW,OAAO,SAAS,KAAK,CAAC,OAAO,WAAW,IAAI,CAAC;CACnE,OAAO,MAAM,EAAE,iBAAiB,CAAC;CACjC,KAAK,MAAM,cAAc,kBACvB,MAAM,kBAAkB,UAAU;AAEtC;AAEA,SAAgB,aAAa,WAAqC;CAChE,MAAM,kBAAkB,eACtB,aAAa,iDACf;CACA,IAAI,CAAC,iBAAiB;EACpB,MAAM,QAAQ,IAAI,MAAM,iBAAiB;EACzC,MAAM,mBAAmB;EACzB,MAAM,kBAAkB;EACxB,MAAM,oBAAoB,0DAA0D,UAAW;EAC/F,MAAM;CACR;CACA,OAAO,gBAAgB,gBAAgB;CACvC,OAAO,iBAAiB,gBAAgB;AAC1C;AAEA,eAAsB,iBAAgC;CACpD,MAAM,EAAE,eAAe,gBAAgB,iBAAiB;;CAExD,IAAI,cACF;CAEF,OAAO,eAAe;CACtB,IAAI;;EAEF,IAAI,eAAe;GACjB,OAAO,MAAM,4BAA4B,eAAe;GACxD,MAAM,IAAI,UAAU,aAAa,aAAa;EAChD;;EAEA,IAAI,gBAAgB;GAClB,OAAO,MAAM,6BAA6B,gBAAgB;GAC1D,MAAM,IAAI,UAAU,cAAc,cAAc;EAClD;CACF,SAAS,oDAAmD;EAC1D,MAAM,aAAa,wBAAwB,GAAG;EAC9C,IAAI,YACF,MAAM;EAER,OAAO,MACL;GAAE;GAAK;GAAe;EAAe,GACrC,iCACF;EACA,MAAM,IAAI,MAAM,eAAe;CACjC;AACF;AAEA,SAAgB,kBAAkB,EAChC,mBACA,aACuB;CACvB,OAAO,iBAAiB,qBAAqB,CAAC;CAC9C,aAAa,SAAS;AACxB;AAEA,SAAgB,0BAA0B,SAAmB,CAAC,GAAS;CACrE,yBAAyB;AAC3B;AAEA,eAAsB,gBAAmC;CACvD,IAAI;EACF,QACG,MAAM,IAAI,IAAI;GACb;GACA;GACA;GACA;GACA;EACF,CAAC,KAAM,GAAA,CAEN,KAAK,CAAC,CACN,MAAM,MAAM,QAAQ,CAAC,CAAC,CACtB,QAAQ,IAAY,MAAc,IAAI,CAAC;CAC5C,SAAS,oDAAmD;EAC1D,OAAO,KAAK,EAAE,IAAI,GAAG,0BAA0B;EAC/C,OAAO,CAAC;CACV;AACF;AAEA,eAAsB,gBACpB,aACA,uBACe;CACf,IAAI,CAAC,eAAe,yBAClB;CAEF,0BAA0B;CAC1B,MAAM,SAAS,YAAY,EAAE,KAAK,2BAA2B,EAAE,CAAC;CAChE,MAAM,QAAQ;CACd,MAAM,aAAa,MAAM,cAAc;CACvC,KAAK,MAAM,aAAa,YAAY;EAClC,IAAI,CAAC,qBAAqB,WAAW,yBAAyB,CAAC,GAAG,CAAC,GAAG;GACpE,OAAO,MACL,EAAE,sBAAsB,GACxB,sBAAsB,WACxB;GACA;EACF;EACA,IAAI;GACF,OAAO,MAAM,4BAA4B,WAAW;GACpD,MAAM,eACJ,IAAI,IAAI,MAAM,CAAC,CAAC,gBAAgB;IAAC;IAAU;IAAe;GAAS,CAAC,CACtE;EACF,SAAS,KAAK;GACZ,OAAO,KAAK;IAAE;IAAK;GAAU,GAAG,oCAAoC;EACtE;CACF;AACF;AAEA,SAAgB,WAAoB;CAClC,OAAO;AACT;AAEA,eAAsB,oBAAsC;CAC1D,IAAI,OAAO,oBAAoB,KAAA,GAAW;EACxC,MAAM,QAAQ,MAAM,IAAI,IAAI;GAC1B;GACA;GACA;GACA;GACA;EACF,CAAC;EACD,OAAO,kBAAkB,MAAM,KAAK,MAAM;CAC5C;CAEA,OAAO,OAAO;AAChB;AAEA,MAAa,UAAU,kBACrB,EAAE,MAAM,UAAU,GAClB,YAA2B;CACzB,IAAI,gBAAgB;EAClB,IAAI,OAAO,CAAC,CAAC,wBACX,MAAM,IAAI,IAAI;GAAC;GAAU;GAAkB;EAAW,CAAC;EAEzD;CACF;;CAEA,IAAI,aAAa,IAAI,UAAU,MAAM,SACnC,MAAM,IAAI,MAAM,qCAAqC;CAEvD,iBAAiB;CACjB,MAAM,WAAW,aAAa,IAAI,UAAU;CAC5C,OAAO,MAAM,+CAA+C,UAAU;CACtE,MAAM,UAAU,MAAM,KAAK,UAAU,WAAW;CAChD,IAAI,QAAQ;CAEZ,IAAI,MAAM,GAAG,WAAW,OAAO,GAC7B,MAAM,WAAW,SAAS,YAAY;EACpC,OAAO,MACL,gEACF;EACA,IAAI;GACF,MAAM,IAAI,IAAI;IAAC;IAAU;IAAW;IAAU,OAAO;GAAG,CAAC;GACzD,MAAM,aAAa,KAAK,IAAI;GAC5B,MAAM,eAAe,IAAI,MAAM,CAAC,WAAW,QAAQ,CAAC,CAAC;GACrD,OAAO,gBACL,OAAO,iBAAkB,MAAM,iBAAiB,GAAG;GACrD,MAAM,cAAc,OAAO,aAAa;GACxC,MAAM,mBAAmB;GACzB,MAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,UAAU;GACrD,OAAO,KAAK,EAAE,WAAW,GAAG,qBAAqB;GACjD,QAAQ;EACV,SAAS,qDAAmD;GAC1D,IAAI,IAAI,YAAA,SACN,MAAM;GAER,OAAO,KAAK,EAAE,IAAI,GAAG,4CAA4C;EACnE;CACF,CAAC;CAEH,IAAI,OACF,MAAM,WAAW,SAAS,YAAY;EACpC,MAAM,aAAa,KAAK,IAAI;EAC5B,IAAI;GACF,MAAM,OAAiB,CAAC;GACxB,IAAI,OAAO,eACT,KAAK,KAAK,MAAM,OAAO,aAAa;GAEtC,IAAI,OAAO,WACT,OAAO,MAAM,uBAAuB;QAC/B;IACL,OAAO,MAAM,2BAA2B;IACxC,KAAK,KAAK,oBAAoB;GAChC;GACA,IAAI,OAAO,gBACT,OAAO,QAAQ,OAAO,cAAc,CAAC,CAAC,SAAS,MAE7C,KAAK,KAAK,EAAE,IAAI,GAAG,EAAE,IAAK,CAC5B;GAEF,eAAe,mBAAkC;IAC/C,MAAM,WAAW,eAAe,SAAS,UACvC,GAAG,SAAS,QAAQ,CACtB;IACA,MAAM,IAAI,MAAM,OAAO,KAAK,KAAK,IAAI;GACvC;GACA,MAAM,eACJ,WAAW,oBAAoB,gBAAgB,CACjD;EACF,SAAS,qDAAmD;GAC1D,OAAO,MAAM,EAAE,IAAI,GAAG,iBAAiB;GACvC,IAAI,IAAI,SAAS,SAAS,yBAAyB,GACjD,MAAM,IAAI,MAAM,8BAA8B;GAEhD,IAAI,IAAI,YAAA,SACN,MAAM;GAER,MAAM,IAAI,kBAAkB,KAAK,KAAK;EACxC;EACA,MAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,UAAU;EACrD,OAAO,MAAM,EAAE,WAAW,GAAG,qBAAqB;CACpD,CAAC;CAEH,IAAI;EACF,OAAO,mBAAmB,iBACvB,MAAM,IAAI,IAAI,CAAC,aAAa,MAAM,CAAC,EAAA,CAAG,KAAK,CAC9C;CACF,SAAS,oDAAmD;EAC1D,IAAI,IAAI,SAAS,SAAS,6BAA6B,GACrD,MAAM,IAAI,MAAM,kBAAkB;EAEpC,MAAM;CACR;CAEA,MAAM,WAAW,yBACf,gBAAgB,CAAC,CAAC,OAAO,iBAAiB,OAAO,qBAAqB,CACxE;CACA,IAAI;EACF,MAAM,gBAAgB,MAAM,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC,EAAA,CAAG;EAC/C,OAAO,MAAM,EAAE,aAAa,GAAG,0BAA0B;CAC3D,SAAS,oDAAmD;EAC1D,MAAM,aAAa,wBAAwB,GAAG;EAC9C,IAAI,YACF,MAAM;EAER,IAAI,IAAI,QAAQ,SAAS,+BAA+B,GACtD,MAAM,IAAI,MAAM,gBAAgB;EAElC,OAAO,KAAK,EAAE,IAAI,GAAG,+BAA+B;CACtD;CACA,OAAO,gBACL,OAAO,iBACP,OAAO,iBACN,MAAM,iBAAiB,GAAG;;CAE7B,OAAO,SAAS,CAAC,EAAE;CAInB,IAAI,OAAO,aAAa;EACtB,MAAM,EAAE,gBAAgB;EACxB,MAAM,WAAW,yBAAyB,YAAY;GACpD,OAAO,MACL,2CAA2C,uBAAuB,uBACpE;;GAIA,IAAI,EAAC,MAFiB,IAAI,WAAW,IAAI,EAAA,CAE5B,MAAM,WAAW,OAAO,SAAA,wBAA+B,GAAG;IACrE,OAAO,MAAM,iBAAiB,wBAAwB;IACtD,MAAM,IAAI,UAAU,wBAAwB,WAAW;GACzD;GACA,MAAM,qBAAqB,OAAO,aAAa;GAC/C,MAAM,mBAAmB,KAAK;EAChC,CAAC;CACH;CAEA,IAAI,iBAAiB,OAAO,eAAe,GAAG;EAC5C,MAAM,kBAAkB,OAAO;EAC/B,MAAM,WAAW,0BAA0B,YAAY;GAIrD,MAAM,aAAa,GAHF,OAAO,QAAQ,eAAe,CAAC,CAAC,KAC9C,CAAC,MAAM,YAAY,GAAG,OAAO,IAAI,GAAG,gBAAgB,IAAI,GAE9B,CAAC;GAC9B,OAAO,MACL,WAAW,OAAO,KAAK,eAAe,CAAC,CAAC,OAAO,kBACjD;EACF,CAAC;CACH;CAEA,OAAO,mBAAmB,iBACvB,MAAM,IAAI,SAAS,MAAM,EAAA,CAAG,KAAK,CACpC;CACA,OAAO,MAAM,uBAAuB,OAAO,kBAAkB;AAC/D,CACF;AAEA,eAAsB,cAAc,MAAsC;CACxE,IAAI,SAAS,IAAI,GAAG;EAClB,MAAM,WAAW,aAAa,IAAI,UAAU;EAC5C,MAAM,YAAY,MAAM,QAAQ,UAAU,IAAI;EAC9C,IAAI,CAAC,UAAU,WAAW,MAAM,QAAQ,QAAQ,CAAC,GAAG;GAClD,OAAO,KACL;IAAE;IAAW;GAAS,GACtB,uDACF;GACA,MAAM,IAAI,MAAM,YAAY;EAC9B;CACF;CAEA,MAAM,QAAQ;CACd,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;AACtC;AAEA,SAAgB,aAAa,YAA6B;CACxD,OAAO,CAAC,CAAC,OAAO,cAAc;AAChC;AAGA,SAAgB,gBAAgB,YAA0C;CACxE,OAAO,OAAO,gBAAgB,eAAe;AAC/C;AAGA,eAAsB,oBACpB,YAC0B;CAC1B,MAAM,YAAY,OAAO,cAAc;CACvC,IAAI,CAAC,WACH,OAAO;CAET,MAAM,aAAa,0BAA0B,YAAY,SAAS;CAClE,IAAI,eAAe,MAAM;EACvB,OAAO,MACL,+CAA+C,WAAW,MAAM,EAAE,EACpE;EACA,OAAO;CACT;CACA,MAAM,QAAQ;CACd,IAAI;EACF,MAAM,SAAS,MAAM,cAAc,SAAS;EAC5C,0BAA0B,YAAY,MAAM;EAC5C,OAAO;CACT,SAAS,KAAK;EACZ,OAAO,MAAM;GAAE;GAAK;EAAW,GAAG,kCAAkC;EACpE,OAAO;CACT;AACF;AAEA,eAAsB,oBAAuC;CAC3D,OAAO,MAAM,mBAAmB;;CAEhC,IAAI,aAAa,IAAI,UAAU,MAAM,SACnC,MAAM,QAAQ;CAEhB,IAAI;EAMF,QAAO,MALW,IAAI,IAAI;GACxB,GAAG;GACH,QAAQ,EAAE,SAAS,KAAK;GACxB,eAAe;EACjB,CAAC,EAAA,CACU,IAAI,KAAK,WAAW,OAAO,OAAO;CAC/C,uDAAsD;EACpD,OAAO,CAAC;CACV;AACF;AAEA,eAAsB,eACpB,YACwB;CACxB,OAAO,MAAM,6BAA6B,YAAY;CACtD,MAAM,QAAQ;CACd,IAAI;EACF,MAAM,eACJ,IAAI,SACF,0BACI;GAAC;GAAM;GAAwB;GAAY;EAAI,IAC/C;GAAC;GAAM;GAAY;EAAI,CAC7B,CACF;EACA,OAAO,gBAAgB;EACvB,OAAO,mBAAmB,iBACvB,MAAM,IAAI,IAAI,CAAC,aAAa,MAAM,CAAC,EAAA,CAAG,KAAK,CAC9C;EACA,MAAM,mBAAmB,MAAM,cAAc,OAAO,gBAAgB;;EAEpE,IAAI,kBACF,OAAO,MACL;GAAE;GAAY;GAAkB,KAAK,OAAO;EAAiB,GAC7D,eACF;EAEF,MAAM,IAAI,MAAM,UAAU,IAAI;EAC9B,OAAO,OAAO;CAChB,SAAS,oDAAmD;EAC1D,MAAM,aAAa,wBAAwB,GAAG;EAC9C,IAAI,YACF,MAAM;EAER,IAAI,IAAI,SAAS,SAAS,2BAA2B,GAAG;GACtD,OAAO,KAAK,EAAE,IAAI,GAAG,2BAA2B;GAChD,MAAM,IAAI,MAAM,eAAe;EACjC;EACA,MAAM;CACR;AACF;AAEA,eAAsB,yBACpB,YACA,YACwB;CACxB,OAAO,MAAM,uBAAuB,WAAW,eAAe,YAAY;CAC1E,MAAM,QAAQ;CACd,IAAI;EACF,MAAM,eACJ,IAAI,eAAe,YAAY,GAAG,WAAW,GAAG,YAAY,CAC9D;EACA,OAAO,gBAAgB;EACvB,OAAO,mBAAmB,iBACvB,MAAM,IAAI,SAAS,MAAM,EAAA,CAAG,KAAK,CACpC;EACA,OAAO,MAAM,sBAAsB,WAAW,eAAe,YAAY;EACzE,OAAO,cAAc,cAAc,OAAO;EAC1C,OAAO,OAAO;CAChB,SAAS,KAAK;EACZ,MAAM,aAAa,wBAAwB,GAAG;;EAE9C,IAAI,YACF,MAAM;EAER,IAAI,IAAI,SAAS,SAAS,2BAA2B,GAAG;GACtD,OAAO,KAAK,EAAE,IAAI,GAAG,2BAA2B;GAChD,MAAM,IAAI,MAAM,eAAe;EACjC;EACA,MAAM;CACR;AACF;;;;AAKA,SAAgB,gBAAgB,YAA4B;CAC1D,OAAO,uBAAuB;AAChC;;;;AAKA,SAAS,gBAAgB,YAA6B;CACpD,OAAO,cAAc,OAAO;AAC9B;;;;;;;;;;;;AAaA,eAAsB,iBACpB,YACA,KACA,WACe;CACf,OAAO,MAAM;EAAE;EAAY;EAAK;CAAU,GAAG,oBAAoB;CACjE,MAAM,IAAI,IAAI;EAAC;EAAc,gBAAgB,UAAU;EAAG;CAAS,CAAC;CACpE,OAAO,cAAc,cAAc;CACnC,OAAO,gBAAgB,cAAc;EAAE;EAAK,KAAK;CAAU;CAC3D,OAAO,iBAAiB,cAAc;AACxC;AAEA,eAAsB,oBACpB,iBACe;CACf,IAAI;EACF,MAAM,WAAW,MAAM,IAAI,MAAM,CAAC,UAAU,eAAe,CAAC;EAC5D,OAAO,MAAM,EAAE,SAAS,GAAG,eAAe;CAC5C,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,+BAA+B;EACrD,MAAM;CACR;AACF;AAEA,eAAsB,kBACpB,YACA,QACe;CACf,IAAI;EACF,MAAM,UAAU,MAAM,IAAI,KAAK;GAAC;GAAQ;GAAY;EAAS,CAAC;EAC9D,OAAO,MAAM,EAAE,QAAQ,GAAG,cAAc;CAC1C,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,+BAA+B;EACrD,MAAM;CACR;AACF;AAEA,eAAsB,cAAiC;CACrD,MAAM,QAAQ;CACd,MAAM,SAAS,OAAO;CACtB,IAAI;CACJ,IAAI;EACF,QAAQ,MAAM,IAAI,IAAI;GAAC;GAAW;GAAM,cAAc;EAAQ,CAAC;CACjE,SAAS,oDAAmD;EAC1D,IAAI,IAAI,SAAS,SAAS,gCAAgC,GAAG;GAC3D,OAAO,MACL,EAAE,IAAI,GACN,uDACF;GACA,MAAM,IAAI,MAAM,kBAAkB;EACpC;EACA,MAAM;CACR;;CAEA,IAAI,CAAC,OACH,OAAO,CAAC;CAGV,OAAO,MACJ,MAAM,YAAY,CAAC,CACnB,OAAO,QAAQ,CAAC,CAChB,QAAQ,SAAS,KAAK,WAAW,KAAK,CAAC,CAAC,CACxC,KAAK,SAAS,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAE;AACjD;AAEA,SAAgB,gBAA0B;CACxC,OAAO,OAAO,KAAK,OAAO,iBAAiB,CAAC,CAAC;AAC/C;AAEA,eAAsB,mBACpB,YACA,YACkB;CAClB,MAAM,gBAAgB,gBAAgB,UAAU;CAChD,MAAM,YAAY,gBAAgB,UAAU;CAC5C,IAAI,WAAW,0BACb,YACA,WACA,YACA,aACF;CACA,IAAI,aAAa,MAAM;EACrB,OAAO,MAAM,+CAA+C,SAAS,EAAE;EACvE,OAAO;CACT;CAEA,OAAO,MACL,qEAAqE,WAAW,EAClF;CAEA,MAAM,QAAQ;CACd,IAAI;EAIF,YAFE,MAAM,IAAI,IAAI;GAAC;GAAY;GAAW,GAAG,UAAW,IAAI;EAAgB,CAAC,EAAA,CACzE,KACmB,MAAM;EAC3B,OAAO,MACL;GAAE;GAAY;EAAW,GACzB,0BAA0B,UAC5B;EACA,0BAA0B,YAAY,QAAQ;EAC9C,OAAO;CACT,SAAS,oDAAmD;EAC1D,MAAM,aAAa,wBAAwB,GAAG;EAC9C,IAAI,YACF,MAAM;EAER,MAAM;CACR;AACF;AAEA,eAAsB,iBACpB,YACA,YACkB;CAClB,IAAI,CAAC,aAAa,UAAU,GAAG;EAC7B,OAAO,MAAM,+BAA+B;EAC5C,OAAO;CACT;CAEA,IAAI,OAAO,iBAAiB,gBAAgB,KAAA,GAC1C,OAAO,OAAO,iBAAiB;CAGjC,MAAM,aAAa,wBACjB,YACA,gBAAgB,UAAU,CAC5B;CACA,IAAI,eAAe,MAAM;EACvB,OAAO,MAAM,6CAA6C,WAAW,EAAE;EACvE,OAAO,iBAAiB,cAAc;EACtC,OAAO;CACT;CAEA,OAAO,MACL,mEAAmE,WAAW,EAChF;CAEA,MAAM,QAAQ;CACd,MAAM,mCAAmB,IAAI,IAAY;CACzC,IAAI;EACF,MAAM,UAAU,MAAM,IAAI,IAAI;GAC5B,MAAM,UAAU;GAChB,IAAI,UAAU;GACd,WAAW;GACX,QAAQ;IACN,cAAc;IACd,iBAAiB;GACnB;EACF,CAAC;EAED,KAAK,MAAM,UAAU,QAAQ,KAAK;GAChC,iBAAiB,IAAI,OAAO,YAAY;GACxC,iBAAiB,IAAI,OAAO,eAAe;EAC7C;CACF,SAAS,oDAAmD;EAC1D,IAAI,IAAI,SAAS,SAAS,qBAAqB,GAAG;GAChD,OAAO,MACL,EAAE,IAAI,GACN,yEACF;GACA,MAAM,IAAI,MAAM,kBAAkB;EACpC;EACA,OAAO,KAAK,EAAE,IAAI,GAAG,iDAAiD;CACxE;CACA,MAAM,EAAE,gBAAgB,mBAAmB;CAE3C,MAAM,kBAAkB,IAAI,IAAI,gBAAgB;;CAGhD,IAAI,gBACF,gBAAgB,OAAO,cAAc;CAGvC,KAAK,MAAM,iBAAiB,gBAC1B,gBAAgB,OAAO,aAAa;CAGtC,KAAK,MAAM,iBAAiB,wBAC1B,gBAAgB,OAAO,aAAa;CAGtC,IAAI,gBAAgB,SAAS,GAAG;EAE9B,OAAO,MACL;GACE;GACA;GACA,kBAAkB,CAAC,GAAG,gBAAgB;GACtC,iBAAiB,CAAC,GAAG,eAAe;GACpC;GACA;EACF,GACA,6BACF;EACA,OAAO,MAAM,6BAA6B;EAC1C,OAAO,iBAAiB,cAAc;EACtC,wBAAwB,YAAY,KAAK;EACzC,OAAO;CACT;CACA,OAAO,MACL;EACE;EACA;EACA,kBAAkB,CAAC,GAAG,gBAAgB;EACtC,iBAAiB,CAAC,GAAG,eAAe;EACpC;EACA;CACF,GACA,4BACF;CACA,OAAO,MACL;EAAE;EAAY;EAAY,qBAAqB,CAAC,GAAG,eAAe;CAAE,GACpE,4BACF;CACA,OAAO,iBAAiB,cAAc;CACtC,wBAAwB,YAAY,IAAI;CACxC,OAAO;AACT;AAEA,eAAsB,mBACpB,YACA,QACkB;CAClB,OAAO,MAAM,sBAAsB,WAAW,IAAI,OAAO,EAAE;CAE3D,MAAM,gBAAgB,gBAAgB,UAAU;CAChD,MAAM,YAAY,gBAAgB,MAAM;CACxC,IAAI,CAAC,iBAAiB,CAAC,WAAW;EAChC,OAAO,KACL;GAAE;GAAY;EAAO,GACrB,2CACF;EACA,OAAO;CACT;CAEA,MAAM,eAAe,wBACnB,QACA,WACA,YACA,aACF;CACA,IAAI,UAAU,YAAY,GAAG;EAC3B,OAAO,MACL,+CAA+C,aAAa,EAC9D;EACA,OAAO;CACT;CAEA,OAAO,MACL,oEAAoE,YACtE;CAEA,IAAI,SAAS;CACb,MAAM,QAAQ;CACd,MAAM,eAAe;CAErB,MAAM,aAAa,OAAO;CAC1B,IAAI;EACF,MAAM,IAAI,MAAM,UAAU,IAAI;EAE9B,IAAI,eAAe,YACjB,MAAM,IAAI,SAAS,UAAU;EAE/B,MAAM,IAAI,MAAM;GAAC;GAAe;GAAW,UAAU;EAAQ,CAAC;CAChE,SAAS,KAAK;EACZ,SAAS;;EAET,IAAI,CAAC,KAAK,KAAK,WAAW,QACxB,OAAO,MACL;GAAE;GAAY;GAAQ;EAAI,GAC1B,mCACF;CAEJ,UAAU;EACR,IAAI;GACF,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC;GAC3B,IAAI,eAAe,YACjB,MAAM,IAAI,SAAS,UAAU;EAEjC,SAAS,qDAAmD;GAC1D,OAAO,MACL;IAAE;IAAY;IAAQ;GAAI,GAC1B,mCACF;EACF;CACF;CAEA,wBAAwB,QAAQ,MAAM;CACtC,OAAO,MAAM,0BAA0B,QAAQ;CAC/C,OAAO;AACT;AAEA,eAAsB,aAAa,YAAmC;CACpE,MAAM,QAAQ;CACd,IAAI,gBAAgB,UAAU,GAAG;EAG/B,MAAM,MAAM,gBAAgB,UAAU;EACtC,OAAO,MAAM;GAAE;GAAY;EAAI,GAAG,yBAAyB;EAC3D,MAAM,IAAI,IAAI;GAAC;GAAc;GAAM;EAAG,CAAC;EACvC,OAAO,OAAO,gBAAgB;CAChC,OACE,IAAI;EACF,MAAM,gBAAgB;GAAC;GAAQ;GAAY;GAAU;EAAU;EAE/D,IAAI,YAAY,CAAC,CAAC,SAAS,MAAM,GAC/B,cAAc,KAAK,aAAa;EAGlC,MAAM,eAAe,IAAI,IAAI,aAAa,CAAC;EAC3C,OAAO,MAAM,0BAA0B,YAAY;CACrD,SAAS,KAAK;EACZ,MAAM,aAAa,wBAAwB,GAAG;;EAE9C,IAAI,YACF,MAAM;EAER,OAAO,MAAM,yCAAyC,YAAY;CACpE;CAEF,IAAI;EACF,MAAM,kBAAkB,UAAU;;EAElC,OAAO,MAAM,yBAAyB,YAAY;CACpD,SAAS,KAAK;EACZ,MAAM,aAAa,wBAAwB,GAAG;;EAE9C,IAAI,YACF,MAAM;EAER,OAAO,MAAM,wCAAwC,YAAY;CACnE;CACA,OAAO,OAAO,cAAc;AAC9B;AAEA,eAAsB,aAAa,YAAmC;CACpE,IAAI;CACJ,IAAI;EACF,MAAM,QAAQ;EACd,MAAM,eAAe;EACrB,MAAM,IAAI,MAAM,UAAU,IAAI;EAC9B,MAAM,eACJ,IAAI,SAAS;GACX;GACA,OAAO;GACP,UAAU,OAAO;EACnB,CAAC,CACH;EACA,SAAS,MAAM,IAAI,OAAO;EAC1B,IAAI,gBAAgB,UAAU,GAAG;GAG/B,MAAM,MAAM,gBAAgB,UAAU;GACtC,OAAO,MACL;IAAE;IAAY;GAAI,GAClB,wCACF;GACA,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC;EACvB,OAAO;GACL,MAAM,aAAa,UAAU;GAC7B,MAAM,eAAe,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;EAChD;CACF,SAAS,KAAK;EACZ,OAAO,MACL;GACE,YAAY,OAAO;GACnB,SAAS,OAAO;GAChB;GACA;GACA;EACF,GACA,oBACF;EACA,MAAM;CACR;AACF;AAEA,eAAsB,YAAY,YAAmC;CACnE,IAAI;CACJ,IAAI;EACF,MAAM,QAAQ;EACd,MAAM,eAAe;EACrB,MAAM,IAAI,MAAM,UAAU,IAAI;EAC9B,MAAM,eACJ,IAAI,SAAS;GAAC;GAAM;GAAY,UAAU;EAAY,CAAC,CACzD;EACA,MAAM,eACJ,IAAI,SAAS;GACX;GACA,OAAO;GACP,UAAU,OAAO;EACnB,CAAC,CACH;EACA,SAAS,MAAM,IAAI,OAAO;EAC1B,MAAM,eAAe,IAAI,MAAM,CAAC,aAAa,UAAU,CAAC,CAAC;EACzD,MAAM,eAAe,IAAI,KAAK,UAAU,OAAO,aAAa,CAAC;EAC7D,gBAAgB,SAAS;CAC3B,SAAS,KAAK;EACZ,OAAO,MACL;GACE,YAAY,OAAO;GACnB,SAAS,OAAO;GAChB;GACA,WAAW,gBAAgB,UAAU;GACrC;GACA;EACF,GACA,mBACF;EACA,MAAM;CACR;AACF;AAEA,eAAe,cAAc,KAAgD;CAC3E,MAAM,SAAS,MAAM,IAAI,KAAK;EAAC;EAAM;EAAgB;CAAG,CAAC;CACzD,OAAO,SAAS,QAAQ,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM;AAC/C;AAEA,eAAsB,wBACpB,YACe;CACf,MAAM,QAAQ;CACd,IAAI;EAEF,QAAO,MADY,cAAc,UAAU,YAAY,EAAA,CAC3C,SAAS;CACvB,SAAS,KAAK;EACZ,MAAM,aAAa,wBAAwB,GAAG;;EAE9C,IAAI,YACF,MAAM;EAER,uBAAO,IAAI,KAAK;CAClB;AACF;AAEA,SAAgB,eAAe,YAA8C;CAC3E,OAAO,sBAAsB,UAAU,YAAY;AACrD;AAEA,SAAgB,yBACd,iBAC0B;CAC1B,OAAO,sBAAsB,eAAe;AAC9C;AAEA,eAAe,sBACb,SAC0B;CAC1B,MAAM,QAAQ;CACd,IAAI;EAIF,QAAO,MAHY,eACjB,IAAI,YAAY,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC,CAC1C,EAAA,CACY,MAAM,KAAK,SAAS,KAAK,IAAI;CAC3C,SAAS,oDAAmD;EAC1D,OAAO,KAAK,EAAE,IAAI,GAAG,6BAA6B;EAClD,MAAM,aAAa,wBAAwB,GAAG;EAC9C,IAAI,YACF,MAAM;EAER,OAAO;CACT;AACF;AAEA,eAAsB,QACpB,UACA,YACwB;CACxB,MAAM,QAAQ;CACd,IAAI;EACF,MAAM,UAAU,MAAM,IAAI,KAAK,CAC7B,UAAU,cAAc,OAAO,cAAc,GAAG,UAClD,CAAC;EAED,iDAAiD,UAAU,OAAO;EAElE,OAAO;CACT,SAAS,KAAK;EACZ,MAAM,aAAa,wBAAwB,GAAG;;EAE9C,IAAI,YACF,MAAM;EAER,OAAO;CACT;AACF;AAEA,eAAsB,SACpB,WACwC;CACxC,MAAM,iBAAgD,CAAC;CAEvD,KAAK,MAAM,YAAY,WACrB,eAAe,YAAY,MAAM,QAAQ,QAAQ;CAGnD,OAAO;AACT;AAEA,eAAsB,QACpB,WACA,WACkB;CAClB,MAAM,QAAQ;CACd,IAAI;EACF,OACG,MAAM,eAAe,IAAI,KAAK;GAAC;GAAW;GAAW;EAAI,CAAC,CAAC,MAAO;CAEvE,QAAQ;EACN,OAAO;CACT;AACF;AAEA,eAAe,iBAAiB,UAAiC;CAC/D,IAAI,CAAC,eAAe;EAClB,MAAM,gBAAgB;EACtB,gBAAgB;CAClB;CACA,MAAM,iBAAiB,QAAQ;CAC/B,MAAM,eAAe;AACvB;;;;;;;;;;;;;AAcA,eAAsB,cAAc,EAClC,YACA,OACA,SACA,QAAQ,SAC0C;CAClD,MAAM,WAAW,aAAa,IAAI,UAAU;CAC5C,MAAM,QAAQ;CACd,OAAO,MAAM,4CAA4C,YAAY;CACrE,MAAM,iBAAiB,QAAQ;CAC/B,IAAI;EACF,MAAM,IAAI,MAAM,UAAU,IAAI;EAC9B,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC;EAC9B,MAAM,kBAAkB,OAAO;EAC/B,MAAM,eACJ,IAAI,SAAS;GAAC;GAAM;GAAY,UAAU,OAAO;EAAe,CAAC,CACnE;EACA,MAAM,eAAyB,CAAC;EAChC,MAAM,qBAA+B,CAAC;EACtC,MAAM,eAAyB,CAAC;EAChC,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,WAAW,KAAK;GACtB,IAAI,KAAK,SAAS,YAChB,IAAI;IACF,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC;IACvB,aAAa,KAAK,QAAQ;GAC5B,SAAS,sDAAmD;IAC1D,MAAM,aAAa,wBAAwB,GAAG;IAC9C,IAAI,YACF,MAAM;IAER,OAAO,MAAM;KAAE;KAAK;IAAS,GAAG,oBAAoB;IACpD,aAAa,KAAK,QAAQ;GAC5B;QACK;IACL,IAAI,MAAM,YAAY,MAAM,KAAK,UAAU,QAAQ,CAAC,GAElD,OAAO,MAAM,EAAE,SAAS,GAAG,yBAAyB;SAC/C,IAAI,KAAK,aAAa,MAC3B;SACK;KACL,IAAI;;KAEJ,IAAI,OAAO,KAAK,aAAa,UAC3B,WAAW,OAAO,KAAK,KAAK,QAAQ;UAEpC,WAAW,KAAK;KAIlB,IAAI,KAAK,WACP,MAAM,GAAG,QAAQ,KAAK,UAAU,MAAM,KAAK,UAAU,QAAQ,CAAC;UAE9D,MAAM,GAAG,WAAW,MAAM,KAAK,UAAU,QAAQ,GAAG,UAAU,EAC5D,MAAM,KAAK,eAAe,MAAQ,IACpC,CAAC;IAEL;IACA,IAAI;;KAEF,MAAM,YACJ,aAAa,mBAAmB,CAAC,CAAC,KAAK,CAAC,MAAM,QAAQ,IAAI;KAC5D,MAAM,IAAI,IAAI,SAAS;KACvB,IAAI,KAAK,cACP,MAAM,IAAI,IAAI;MAAC;MAAgB;MAAc;KAAQ,CAAC;KAExD,mBAAmB,KAAK,QAAQ;IAClC,SAAS,uDAAmD;KAC1D,IACE,CAAC,IAAI,QAAQ,SACX,iEACF,GAEA,MAAM;KAER,OAAO,MAAM,+BAA+B,UAAU;KACtD,aAAa,KAAK,KAAK,IAAI;IAC7B;GACF;EACF;EAEA,MAAM,gBAAyB,CAAC;EAChC,IAAI,YAAY,CAAC,CAAC,SAAS,QAAQ,GACjC,cAAc,iBAAiB;EAGjC,MAAM,YAAY,MAAM,IAAI,OAAO,SAAS,CAAC,GAAG,aAAa;EAC7D,IACE,iBAAiB,UAAU,OAAO,KAClC,UAAU,QAAQ,YAAY,KAC9B,UAAU,QAAQ,eAAe,KACjC,UAAU,QAAQ,cAAc,GAChC;GACA,OAAO,KAAK,EAAE,UAAU,GAAG,2CAA2C;GACtE,OAAO;EACT;EACA,OAAO,MACL;GAAE;GAAc;GAAc,QAAQ;EAAU,GAChD,YACF;EACA,IAAI,CAAC,SAAS,CAAE,MAAM,QAAQ,QAAQ,UAAU,YAAY,GAAI;GAC9D,OAAO,MACL;IAAE;IAAY;IAAc;IAAoB;GAAa,GAC7D,2CACF;GACA,OAAO;EACT;EAgBA,OAAO;GAVL;GACA,WALgB,iBACf,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,EAAA,CAAG,KAAK,CAIhC;GACR,OAAO,MAAM,QAAQ,eAAe;IAClC,IAAI,WAAW,SAAS,YACtB,OAAO,aAAa,SAAS,WAAW,IAAI;IAE9C,OAAO,mBAAmB,SAAS,WAAW,IAAI;GACpD,CAAC;EAGS;CACd,SAAS,oDAAmD;EAC1D,OAAO,kBAAkB,KAAK,YAAY,KAAK;CACjD;AACF;AAEA,eAAsB,WAAW,EAC/B,WACA,WACA,OACA,eACoC;CACpC,MAAM,QAAQ;CACd,OAAO,MAAM,mBAAmB,UAAU,GAAG,aAAa,WAAW;CACrE,IAAI,SAAS;CACb,IAAI;EACF,MAAM,aAA0B;GAC9B,sBAAsB;GACtB,MAAM;EACR;EACA,IAAI,YAAY,CAAC,CAAC,SAAS,MAAM,GAC/B,WAAW,iBAAiB;EAE9B,IAAI,aACF,WAAW,mBAAmB;EAGhC,MAAM,UAAU,MAAM,eACpB,IAAI,KAAK,UAAU,GAAG,UAAU,GAAG,aAAa,aAAa,UAAU,CACzE;EACA,OAAO,QAAQ;EACf,OAAO,MAAM,EAAE,QAAQ,QAAQ,GAAG,UAAU;EAC5C,gBAAgB,SAAS;EACzB,cAAc,eAAe;EAC7B,SAAS;CACX,SAAS,oDAAmD;EAC1D,kBAAkB,KAAK,WAAW,KAAK;CACzC;CACA,OAAO;AACT;AAEA,eAAsB,YACpB,YAC+B;CAC/B,MAAM,QAAQ;CACd,OAAO,MAAM,mBAAmB,YAAY;CAC5C,IAAI;EACF,MAAM,MAAM,cAAc,WAAW,GAAG,gBAAgB,UAAU;EAClE,MAAM,eAAe,IAAI,KAAK;GAAC;GAAU;GAAK;EAAS,CAAC,CAAC;EACzD,MAAM,SAAS,iBAAiB,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,EAAA,CAAG,KAAK,CAAC;EACxE,OAAO,cAAc,cAAc;EACnC,OAAO,iBAAiB,cAAc;EACtC,OAAO;CACT,SAAS,oDAAmD;EAC1D,OAAO,kBAAkB,KAAK,UAAU;CAC1C;AACF;AAEA,eAAsB,YACpB,cAC+B;CAC/B,IAAI;EACF,MAAM,eAAe,MAAM,cAAc,YAAY;EACrD,IAAI;;OAME,MALqB,WAAW;IAClC,WAAW,aAAa;IACxB,OAAO,aAAa;GACtB,CAAC,GAEe;IACd,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,cAAc;IACtB,OAAO,cAAc,cAAc;IACnC,OAAO,iBAAiB,cAAc;IACtC,OAAO;GACT;;EAEF,OAAO;CACT,SAAS,oDAAmD;EAC1D,IAAI,IAAI,QAAQ,SAAS,yBAAyB,GAChD,MAAM,IAAI,MAAM,kBAAkB;EAEpC,MAAM;CACR;AACF;AAEA,SAAgB,OAAO,EACrB,UACA,MACA,UACA,MACA,cAOS;CACT,IAAI,aAAa,OAEf,OAAO,OAAO,SAAU,GAAG,WAAW;CAExC,OAAO,IAAI,OAAO;EAChB,UAAU,YAAY;EACtB;EACA;EACA;EACA,UAAU,GAAG,WAAW;CAC1B,CAAC;AACH;AAEA,IAAI,kBAAkB;;;;;;;;;AAUtB,eAAsB,wBACpB,WACA,SACe;CACf,MAAM,cAAc,0BAA0B;CAC9C,MAAM,IAAI,IAAI;EAAC;EAAc;EAAa;CAAS,CAAC;CACpD,MAAM,IAAI,KAAK;EAAC;EAAW;EAAU;CAAW,CAAC;CACjD,kBAAkB;AACpB;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,eAAsB,oBAAmC;CACvD,IAAI,CAAC,kBAAkB,CAAC,iBACtB;CAGF,OAAO,MAAM,qDAAqD;CAClE,MAAM,eAAyB,CAAC;CAEhC,IAAI;EAKF,MAAM,QAAO,MAJW,IAAI,WAAW,CACrC,OAAO,KACP,0BACF,CAAC,EAAA,CAEE,MAAM,YAAY,CAAC,CACnB,KAAK,SAAS,KAAK,QAAQ,MAAM,eAAe,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAC9D,QAAQ,SAAS,KAAK,WAAW,yBAAyB,CAAC;EAC9D,aAAa,KAAK,GAAG,IAAI;CAC3B,SAAS,oDAAmD;EAC1D,OAAO,KAAK,EAAE,IAAI,GAAG,6BAA6B;CACpD;;CAGA,IAAI,aAAa,QACf,IAAI;EACF,MAAM,WAAW;GAAC;GAAY;GAAU,GAAG;EAAY;EACvD,MAAM,IAAI,KAAK,QAAQ;CACzB,SAAS,KAAK;;EAEZ,IAAI,sBAAsB,GAAG,GAC3B,KAAK,MAAM,OAAO,cAChB,IAAI;GACF,MAAM,WAAW;IAAC;IAAY;IAAU;GAAG;GAC3C,MAAM,IAAI,KAAK,QAAQ;EACzB,SAAS,qDAAmD;GAC1D,OAAO,MAAM,EAAE,IAAI,GAAG,6CAA2C;GACjE;EACF;OAGF,OAAO,KAAK,EAAE,IAAI,GAAG,6CAA2C;CAEpE;CAGF,kBAAkB;AACpB;AAEA,MAAM,oBAAoB,MACxB,kIACF;AAEA,MAAM,eAAe,MAAM,oCAAoC;;;;AAK/D,eAAsB,iBACpB,WACwB;CACxB,MAAM,eAAe,MAAM,IAAI,QAAQ,CAAC,MAAM,SAAS,CAAC;CACxD,MAAM,EAAE,YAAY,aAAa,KAAK,YAAY,CAAC,EAAE,UAAU,CAAC;CAChE,IAAI,CAAC,SAAS;EACZ,MAAM,UAAU,aAAa,MAAM,YAAY,CAAC,CAAC;;EAEjD,MAAM,IAAI,MACR,0CAA0C,UAAU,IAAI,SAC1D;CACF;CACA,OAAO,gBAAgB,OAAO;AAChC;AAEA,SAAS,iBAAiB,MAA6B;CACrD,QAAQ,MAAR;EACE,KAAK,YAAY,SACf,OAAO;EACT,KAAK,YAAY,WACf,OAAO;EACT,SACE,OAAO;CACX;AACF;;;;;AAMA,eAAsB,eACpB,iBACA,WACyB;CACzB,MAAM,SAAS,MAAM,IAAI,IAAI;EAC3B;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,MAAM,SAAyB,CAAC;CAChC,KAAK,MAAM,QAAQ,OAAO,MAAM,YAAY,GAAG;EAC7C,MAAM,cAAc,kBAAkB,KAAK,IAAI,CAAC,EAAE;EAClD,IAAI,aAAa;GACf,MAAM,EAAE,SAAS,SAAS,QAAQ,QAAQ,UAAU;GACpD,MAAM,aAAa,OAAO;GAG1B,MAAM,CAAC,YAAY,cAAc,MAAM,MAAM,GAAI;GACjD,QAAQ,YAAR;IACE,KAAK;KACH,OAAO,KAAK;MACV,MAAM;MACN,MAAM;MACN,MAAM,iBAAiB,OAAO;MAC9B,KAAK;KACP,CAAC;KACD;IACF,KAAK;KAEH,OAAO,KAAK;MACV,MAAM;MACN,MAAM;MACN,MAAM,iBAAiB,OAAO;MAC9B,KAAK;KACP,CAAC;KACD,OAAO,KAAK;MACV,MAAM;MACN,MAAM;MACN,MAAM,iBAAiB,OAAO;MAC9B,KAAK,gBAAgB,MAAM;KAC7B,CAAC;KACD;IACF;KAEE,OAAO,KAAK;MACV,MAAM,cAAc;MACpB,MAAM;MACN,MAAM,iBAAiB,OAAO;MAC9B,KAAK,gBAAgB,MAAM;KAC7B,CAAC;KACD;GACJ;EACF;CACF;CACA,OAAO;AACT;AAEA,eAAe,kBAAkB,YAAsC;CACrE,MAAM,QAAQ;CAEd,QAAO,MADqB,IAAI,YAAY,EAAA,CACvB,IAAI,SAAS,UAAU;AAC9C;;;;;;;;;;;;;;;AAgBA,eAAsB,qBAAqB,YAAmC;CAC5E,IAAI,CAAC,OAAO,aACV;CAEF,OAAO,MACL,4BAA4B,uBAAuB,sBAAsB,YAC3E;;CAGA,IAAI,EAAC,MAFiB,WAAW,EAAA,CAEpB,MAAM,MAAM,MAAA,wBAA4B,GACnD,MAAM,IAAI,MAAM,6CAA6C;CAE/D,IAAI;EACF,MAAM,IAAI,MAAM,CAAC,sBAAsB,CAAC;EACxC,IAAI,MAAM,kBAAkB,UAAU,GACpC,MAAM,eAAe,UAAU;OAE/B,MAAM,yBAAyB,YAAY,sBAAsB;EAEnE,MAAM,oBAAoB,GAAG,uBAAuB,GAAG,YAAY;EACnE,MAAM,kBAAkB,YAAY,QAAQ;CAC9C,SAAS,+CAA8C;EACrD,OAAO,MAAM,EAAE,IAAI,GAAG,0BAA0B;EAChD,MAAM,IAAI,MAAM,aAAa;CAC/B;AACF;AAEA,eAAsB,aAAgC;CACpD,OAAO,MAAM,kBAAkB;CAC/B,IAAI;EACF,MAAM,QAAQ;EACd,MAAM,UAAU,MAAM,IAAI,WAAW;EACrC,OAAO,MAAM,kBAAkB,QAAQ,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG;EACtE,OAAO,QAAQ,KAAK,WAAW,OAAO,IAAI;CAC5C,SAAS,mGAAkG;EACzG,OAAO,MAAM,EAAE,IAAI,GAAG,uBAAuB;EAC7C,MAAM;CACR;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../lib/util/git/index.ts"],"sourcesContent":["import { setTimeout } from 'node:timers/promises';\nimport URL from 'node:url';\nimport {\n isBoolean,\n isNonEmptyObject,\n isNonEmptyStringAndNotWhitespace,\n isString,\n} from '@sindresorhus/is';\nimport fs from 'fs-extra';\nimport { DateTime } from 'luxon';\nimport semver from 'semver';\nimport type {\n Options,\n SimpleGit,\n SimpleGitOptions,\n TaskOptions,\n} from 'simple-git';\nimport { ResetMode, simpleGit } from 'simple-git';\nimport upath from 'upath';\nimport { getConfigFileNames } from '../../config/app-strings.ts';\nimport { GlobalConfig } from '../../config/global.ts';\nimport type { RenovateConfig } from '../../config/types.ts';\nimport {\n CONFIG_VALIDATION,\n INVALID_PATH,\n REPOSITORY_CHANGED,\n REPOSITORY_DISABLED,\n REPOSITORY_EMPTY,\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n UNKNOWN_ERROR,\n} from '../../constants/error-messages.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport { withInstrumenting } from '../../instrumentation/with-instrumenting.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport type { GitProtocol } from '../../types/git.ts';\nimport { incCountValue, incLimitedValue } from '../../workers/global/limits.ts';\nimport { getCache } from '../cache/repository/index.ts';\nimport { getEnv } from '../env.ts';\nimport type { ExtraEnv } from '../exec/types.ts';\nimport { getChildEnv } from '../exec/utils.ts';\nimport { newlineRegex, regEx } from '../regex.ts';\nimport type { LongCommitSha } from '../schema-utils/git.ts';\nimport { toLongCommitSha } from '../schema-utils/git.ts';\nimport { matchRegexOrGlobList } from '../string-match.ts';\nimport { logWarningIfUnicodeHiddenCharactersInPackageFile } from '../unicode.ts';\nimport { getGitEnvironmentVariables } from './auth.ts';\nimport { parseGitAuthor } from './author.ts';\nimport {\n getCachedBehindBaseResult,\n setCachedBehindBaseResult,\n} from './behind-base-branch-cache.ts';\nimport { getNoVerify, simpleGitConfig } from './config.ts';\nimport {\n getCachedConflictResult,\n setCachedConflictResult,\n} from './conflicts-cache.ts';\nimport {\n bulkChangesDisallowed,\n checkForPlatformFailure,\n handleCommitError,\n} from './error.ts';\nimport type { InstrumentedSimpleGit } from './instrument.ts';\nimport { instrumentGit } from './instrument.ts';\nimport {\n getCachedModifiedResult,\n setCachedModifiedResult,\n} from './modified-cache.ts';\nimport { configSigningKey, writePrivateKey } from './private-key.ts';\nimport type {\n CommitFilesConfig,\n CommitResult,\n DiffTreeItem,\n GitObjectType,\n LocalConfig,\n PushFilesConfig,\n StatusResult,\n StorageConfig,\n} from './types.ts';\nimport { GitTreeMode } from './types.ts';\nimport {\n getCachedUpdateDateResult,\n setCachedUpdateDateResult,\n} from './update-date-cache.ts';\n\nexport { setNoVerify } from './config.ts';\nexport { setPrivateKey } from './private-key.ts';\n\n// Retry parameters\nconst retryCount = 5;\nconst delaySeconds = 3;\nconst delayFactor = 2;\n\nexport const RENOVATE_FORK_UPSTREAM = 'renovate-fork-upstream';\n\nexport function createSimpleGit({\n config,\n env,\n}: {\n config?: Partial<SimpleGitOptions>;\n env?: ExtraEnv;\n} = {}): SimpleGit {\n return simpleGit({ ...simpleGitConfig(), ...config }).env(\n getChildEnv({\n extraEnv: {\n // Git will prompt for known hosts or passwords, unless we activate BatchMode.\n // Set as extraEnv (lowest priority) so that process.env and\n // customEnvVariables can override it.\n GIT_SSH_COMMAND: 'ssh -o BatchMode=yes',\n },\n env: {\n ...env,\n // To ensure the simple-git parsers match correctly, we need\n // to set the `LANG` and `LC_ALL` environment variables to\n // the `C.UTF-8` locale. See the docs for more details:\n // https://github.com/steveukx/git-js/blob/1bb14df0595794a9353d28ccdaeeb06c0b9bf2a5/docs/NON_ENGLISH_LOCALE.md\n //\n // Use \"C.UTF-8\" instead of just \"C\" (as specified in docs) to handle special characters:\n // https://github.com/renovatebot/renovate/pull/18963\n LANG: 'C.UTF-8',\n LC_ALL: 'C.UTF-8',\n },\n }),\n );\n}\n\n// A generic wrapper for simpleGit.* calls to make them more fault-tolerant\nexport async function gitRetry<T>(gitFunc: () => Promise<T>): Promise<T> {\n let round = 0;\n let lastError: Error | undefined;\n\n while (round <= retryCount) {\n if (round > 0) {\n logger.debug(`gitRetry round ${round}`);\n }\n try {\n const res = await gitFunc();\n if (round > 1) {\n logger.debug('Successful retry of git function');\n }\n return res;\n } catch (err) {\n lastError = err;\n logger.debug({ err }, `Git function thrown`);\n // Try to transform the Error to ExternalHostError\n const errChecked = checkForPlatformFailure(err);\n if (errChecked instanceof ExternalHostError) {\n logger.debug(\n { err: errChecked },\n `ExternalHostError thrown in round ${\n round + 1\n } of ${retryCount} - retrying in the next round`,\n );\n } else {\n throw err;\n }\n }\n\n const nextDelay = delayFactor ^ ((round - 1) * delaySeconds);\n logger.trace({ nextDelay }, `Delay next round`);\n await setTimeout(1000 * nextDelay);\n\n round++;\n }\n\n throw lastError!;\n}\n\nasync function isDirectory(dir: string): Promise<boolean> {\n try {\n return (await fs.stat(dir)).isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function getDefaultBranch(git: InstrumentedSimpleGit): Promise<string> {\n logger.debug('getDefaultBranch()');\n // see https://stackoverflow.com/a/62352647/3005034\n try {\n let res = await git.raw(['rev-parse', '--abbrev-ref', 'origin/HEAD']);\n /* v8 ignore next -- TODO: add test #40625 */\n if (!res) {\n logger.debug('Could not determine default branch using git rev-parse');\n const headPrefix = 'HEAD branch: ';\n res = (await git.raw(['remote', 'show', 'origin']))\n .split('\\n')\n .map((line) => line.trim())\n .find((line) => line.startsWith(headPrefix))!\n .replace(headPrefix, '');\n }\n\n return res.replace('origin/', '').trim();\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug({ err }, 'Error getting default branch');\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n if (\n err.message.startsWith(\n 'fatal: ref refs/remotes/origin/HEAD is not a symbolic ref',\n )\n ) {\n throw new Error(REPOSITORY_EMPTY);\n }\n if (err.message.includes(\"fatal: ambiguous argument 'origin/HEAD'\")) {\n logger.warn('Error getting default branch');\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n}\n\nlet config: LocalConfig = {} as any;\n\n// TODO: can be undefined\nlet git: InstrumentedSimpleGit;\nlet gitInitialized: boolean;\nlet submodulesInitizialized: boolean;\n\nlet privateKeySet = false;\n\nlet platformIgnoredAuthors: string[] = [];\n\nexport const GIT_MINIMUM_VERSION = '2.33.0'; // git show-current\n\nexport async function validateGitVersion(): Promise<boolean> {\n let version: string | undefined;\n const globalGit = instrumentGit(createSimpleGit());\n try {\n const { major, minor, patch, installed } = await globalGit.version();\n /* v8 ignore if -- TODO: add test #40625 */\n if (!installed) {\n logger.error('Git not installed');\n return false;\n }\n version = `${major}.${minor}.${patch}`;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.error({ err }, 'Error fetching git version');\n return false;\n }\n /* v8 ignore if -- TODO: add test #40625 */\n if (!(version && semver.gte(version, GIT_MINIMUM_VERSION))) {\n logger.error(\n { detectedVersion: version, minimumVersion: GIT_MINIMUM_VERSION },\n 'Git version needs upgrading',\n );\n return false;\n }\n logger.debug(`Found valid git version: ${version}`);\n return true;\n}\n\nasync function fetchBranchCommits(preferUpstream = true): Promise<void> {\n config.branchCommits = {};\n const url =\n preferUpstream && config.upstreamUrl ? config.upstreamUrl : config.url;\n logger.debug(`fetchBranchCommits(): url=${url}`);\n const opts = ['ls-remote', '--heads', url];\n const localDir = GlobalConfig.get('localDir');\n const repoExists = await fs.pathExists(upath.join(localDir, '.git/HEAD'));\n if (config.extraCloneOpts && !repoExists) {\n Object.entries(config.extraCloneOpts).forEach((e) =>\n // TODO: types (#22198)\n opts.unshift(e[0], `${e[1]!}`),\n );\n }\n try {\n const lsRemoteRes = await gitRetry(() => git.raw(opts));\n logger.trace({ lsRemoteRes }, 'git ls-remote result');\n lsRemoteRes\n .split(newlineRegex)\n .filter(Boolean)\n .map((line) => line.trim().split(regEx(/\\s+/)))\n .forEach(([sha, ref]) => {\n config.branchCommits[ref.replace('refs/heads/', '')] =\n toLongCommitSha(sha);\n });\n\n if (isNonEmptyObject(config.virtualBranches)) {\n for (const [name, branch] of Object.entries(config.virtualBranches)) {\n config.branchCommits[name] = branch.sha;\n }\n }\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 config.virtualBranches ??= {};\n git = instrumentGit(\n createSimpleGit({ config: { baseDir: GlobalConfig.get('localDir') } }),\n );\n gitInitialized = false;\n submodulesInitizialized = false;\n await fetchBranchCommits();\n}\n\nasync function resetToBranch(branchName: string): Promise<void> {\n logger.debug(`resetToBranch(${branchName})`);\n await git.raw(['reset', '--hard']);\n await gitRetry(() => git.checkout(branchName));\n await git.raw(['reset', '--hard', `origin/${branchName}`]);\n await git.raw(['clean', '-fd']);\n}\n\n/* v8 ignore next -- TODO: add test #40625 */\nexport async function resetToCommit(commit: LongCommitSha): Promise<void> {\n logger.debug(`resetToCommit(${commit})`);\n await git.raw(['reset', '--hard', commit]);\n}\n\nasync function deleteLocalBranch(branchName: string): Promise<void> {\n await git.branch(['-D', branchName]);\n}\n\nasync function cleanLocalBranches(): Promise<void> {\n const existingBranches = (await git.raw(['branch']))\n .split(newlineRegex)\n .map((branch) => branch.trim())\n .filter((branch) => branch.length > 0 && !branch.startsWith('* '));\n logger.debug({ existingBranches });\n for (const branchName of existingBranches) {\n await deleteLocalBranch(branchName);\n }\n}\n\nexport function setGitAuthor(gitAuthor: string | undefined): void {\n const gitAuthorParsed = parseGitAuthor(\n gitAuthor ?? 'Renovate Bot <renovate@whitesourcesoftware.com>',\n );\n if (!gitAuthorParsed) {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = 'None';\n error.validationError = 'Invalid gitAuthor';\n error.validationMessage = `\\`gitAuthor\\` is not parsed as valid RFC5322 format: \\`${gitAuthor!}\\``;\n throw error;\n }\n config.gitAuthorName = gitAuthorParsed.name;\n config.gitAuthorEmail = gitAuthorParsed.address;\n}\n\nexport async function writeGitAuthor(): Promise<void> {\n const { gitAuthorName, gitAuthorEmail, writeGitDone } = config;\n /* v8 ignore if -- TODO: add test #40625 */\n if (writeGitDone) {\n return;\n }\n config.writeGitDone = true;\n try {\n // v8 ignore else -- TODO: add test #40625\n if (gitAuthorName) {\n logger.debug(`Setting git author name: ${gitAuthorName}`);\n await git.addConfig('user.name', gitAuthorName);\n }\n // v8 ignore else -- TODO: add test #40625\n if (gitAuthorEmail) {\n logger.debug(`Setting git author email: ${gitAuthorEmail}`);\n await git.addConfig('user.email', gitAuthorEmail);\n }\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n logger.debug(\n { err, gitAuthorName, gitAuthorEmail },\n 'Error setting git author config',\n );\n throw new Error(TEMPORARY_ERROR);\n }\n}\n\nexport function setUserRepoConfig({\n gitIgnoredAuthors,\n gitAuthor,\n}: RenovateConfig): void {\n config.ignoredAuthors = gitIgnoredAuthors ?? [];\n setGitAuthor(gitAuthor);\n}\n\nexport function setPlatformIgnoredAuthors(emails: string[] = []): void {\n platformIgnoredAuthors = emails;\n}\n\nexport async function getSubmodules(): Promise<string[]> {\n try {\n return (\n (await git.raw([\n 'config',\n '--file',\n '.gitmodules',\n '--get-regexp',\n '\\\\.path',\n ])) || ''\n )\n .trim()\n .split(regEx(/[\\n\\s]/))\n .filter((_e: string, i: number) => i % 2);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error getting submodules');\n return [];\n }\n}\n\nexport async function cloneSubmodules(\n shouldClone: boolean,\n cloneSubmodulesFilter: string[] | undefined,\n): Promise<void> {\n if (!shouldClone || submodulesInitizialized) {\n return;\n }\n submodulesInitizialized = true;\n const gitEnv = getChildEnv({ env: getGitEnvironmentVariables() });\n await syncGit();\n const submodules = await getSubmodules();\n for (const submodule of submodules) {\n if (!matchRegexOrGlobList(submodule, cloneSubmodulesFilter ?? ['*'])) {\n logger.debug(\n { cloneSubmodulesFilter },\n `Skipping submodule ${submodule}`,\n );\n continue;\n }\n try {\n logger.debug(`Cloning git submodule at ${submodule}`);\n await gitRetry(() =>\n git.env(gitEnv).submoduleUpdate(['--init', '--recursive', submodule]),\n );\n } catch (err) {\n logger.warn({ err, submodule }, `Unable to initialise git submodule`);\n }\n }\n}\n\nexport function isCloned(): boolean {\n return gitInitialized;\n}\n\nexport async function isFileModeEnabled(): Promise<boolean> {\n if (config.fileModeEnabled === undefined) {\n const value = await git.raw([\n 'config',\n '--type=bool',\n '--default=true',\n '--get',\n 'core.fileMode',\n ]);\n config.fileModeEnabled = value.trim() === 'true';\n }\n\n return config.fileModeEnabled;\n}\n\nexport const syncGit = withInstrumenting(\n { name: 'syncGit' },\n async (): Promise<void> => {\n if (gitInitialized) {\n if (getEnv().RENOVATE_X_CLEAR_HOOKS) {\n await git.raw(['config', 'core.hooksPath', '/dev/null']);\n }\n return;\n }\n /* v8 ignore if -- TODO: add test #40625 */\n if (GlobalConfig.get('platform') === 'local') {\n throw new Error('Cannot sync git when platform=local');\n }\n gitInitialized = true;\n const localDir = GlobalConfig.get('localDir');\n logger.debug(`syncGit(): Initializing git repository into ${localDir}`);\n const gitHead = upath.join(localDir, '.git/HEAD');\n let clone = true;\n\n if (await fs.pathExists(gitHead)) {\n await instrument('fetch', async () => {\n logger.debug(\n `syncGit(): Found existing git repository, attempting git fetch`,\n );\n try {\n await git.raw(['remote', 'set-url', 'origin', config.url]);\n const fetchStart = Date.now();\n await gitRetry(() => git.fetch(['--prune', 'origin']));\n config.currentBranch =\n config.currentBranch || (await getDefaultBranch(git));\n await resetToBranch(config.currentBranch);\n await cleanLocalBranches();\n const durationMs = Math.round(Date.now() - fetchStart);\n logger.info({ durationMs }, 'git fetch completed');\n clone = false;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message === REPOSITORY_EMPTY) {\n throw err;\n }\n logger.info({ err }, 'git fetch error, falling back to git clone');\n }\n });\n }\n if (clone) {\n await instrument('clone', async () => {\n const cloneStart = Date.now();\n try {\n const opts: string[] = [];\n if (config.defaultBranch) {\n opts.push('-b', config.defaultBranch);\n }\n if (config.fullClone) {\n logger.debug('Performing full clone');\n } else {\n logger.debug('Performing blobless clone');\n opts.push('--filter=blob:none');\n }\n if (config.extraCloneOpts) {\n Object.entries(config.extraCloneOpts).forEach((e) =>\n // TODO: types (#22198)\n opts.push(e[0], `${e[1]!}`),\n );\n }\n async function emptyDirAndClone(): Promise<void> {\n await instrument(`fs.emptyDir(${localDir})`, () =>\n fs.emptyDir(localDir),\n );\n await git.clone(config.url, '.', opts);\n }\n await gitRetry(() =>\n instrument('emptyDirAndClone', emptyDirAndClone),\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug({ err }, 'git clone error');\n if (err.message?.includes('No space left on device')) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n if (err.message === REPOSITORY_EMPTY) {\n throw err;\n }\n throw new ExternalHostError(err, 'git');\n }\n const durationMs = Math.round(Date.now() - cloneStart);\n logger.debug({ durationMs }, 'git clone completed');\n });\n }\n try {\n config.currentBranchSha = toLongCommitSha(\n (await git.raw(['rev-parse', 'HEAD'])).trim(),\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message?.includes('fatal: not a git repository')) {\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n }\n // This will only happen now if set in global config\n await instrument('cloneSubmodules', () =>\n cloneSubmodules(!!config.cloneSubmodules, config.cloneSubmodulesFilter),\n );\n try {\n const latestCommit = (await git.log({ n: 1 })).latest;\n logger.debug({ latestCommit }, 'latest repository commit');\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n if (err.message.includes('does not have any commits yet')) {\n throw new Error(REPOSITORY_EMPTY);\n }\n logger.warn({ err }, 'Cannot retrieve latest commit');\n }\n config.currentBranch =\n config.currentBranch ??\n config.defaultBranch ??\n (await getDefaultBranch(git));\n /* v8 ignore next -- TODO: add test #40625 */\n delete getCache()?.semanticCommits;\n\n // If upstreamUrl is set then the bot is running in fork mode\n // The \"upstream\" remote is the original repository which was forked from\n if (config.upstreamUrl) {\n const { upstreamUrl } = config;\n await instrument('sync with upstreamUrl', async () => {\n logger.debug(\n `Bringing default branch up-to-date with ${RENOVATE_FORK_UPSTREAM}, to get latest config`,\n );\n // Add remote if it does not exist\n const remotes = await git.getRemotes(true);\n // v8 ignore else -- TODO: add test #40625\n if (!remotes.some((remote) => remote.name === RENOVATE_FORK_UPSTREAM)) {\n logger.debug(`Adding remote ${RENOVATE_FORK_UPSTREAM}`);\n await git.addRemote(RENOVATE_FORK_UPSTREAM, upstreamUrl);\n }\n await syncForkWithUpstream(config.currentBranch);\n await fetchBranchCommits(false);\n });\n }\n\n if (isNonEmptyObject(config.virtualBranches)) {\n const virtualBranches = config.virtualBranches;\n await instrument('fetch virtual branches', async () => {\n const refSpecs = Object.entries(virtualBranches).map(\n ([name, branch]) => `${branch.ref}:${remoteBranchRef(name)}`,\n );\n await fetchRevSpec(...refSpecs);\n logger.debug(\n `Fetched ${Object.keys(virtualBranches).length} virtual branches`,\n );\n });\n }\n\n config.currentBranchSha = toLongCommitSha(\n (await git.revparse('HEAD')).trim(),\n );\n logger.debug(`Current branch SHA: ${config.currentBranchSha}`);\n },\n);\n\nexport async function getRepoStatus(path?: string): Promise<StatusResult> {\n if (isString(path)) {\n const localDir = GlobalConfig.get('localDir');\n const localPath = upath.resolve(localDir, path);\n if (!localPath.startsWith(upath.resolve(localDir))) {\n logger.warn(\n { localPath, localDir },\n 'Preventing access to file outside the local directory',\n );\n throw new Error(INVALID_PATH);\n }\n }\n\n await syncGit();\n return git.status(path ? [path] : []);\n}\n\nexport function branchExists(branchName: string): boolean {\n return !!config.branchCommits[branchName];\n}\n\n// Return the commit SHA for a branch\nexport function getBranchCommit(branchName: string): LongCommitSha | null {\n return config.branchCommits?.[branchName] || null;\n}\n\n// Return the date of the latest commit for a branch\nexport async function getBranchUpdateDate(\n branchName: string,\n): Promise<DateTime | null> {\n const branchSha = config.branchCommits[branchName];\n if (!branchSha) {\n return null;\n }\n const updateDate = getCachedUpdateDateResult(branchName, branchSha);\n if (updateDate !== null) {\n logger.debug(\n `getBranchUpdateDate(): using cached result \"${updateDate.toISO()}\"`,\n );\n return updateDate;\n }\n await syncGit();\n try {\n const result = await getCommitDate(branchSha);\n setCachedUpdateDateResult(branchName, result);\n return result;\n } catch (err) {\n logger.debug({ err, branchName }, 'Error getting branch update date');\n return null;\n }\n}\n\n// Return the commit date of every remote branch tip.\n// Uses a a single `git for-each-ref` call, instead of spawning a `git show` per branch\nexport async function getAllBranchUpdateDates(): Promise<\n Record<string, DateTime>\n> {\n logger.debug('getAllBranchUpdateDates');\n await syncGit();\n\n const raw = await git.raw([\n 'for-each-ref',\n '--format=%(refname:short) %(committerdate:iso-strict)',\n // NOTE that using `origin/` (instead of i.e. `origin/*`) allows us to capture nested branch names\n 'refs/remotes/origin/',\n ]);\n const result: Record<string, DateTime> = {};\n const lines = raw\n .trim()\n .split(newlineRegex)\n .filter(isNonEmptyStringAndNotWhitespace);\n for (const line of lines) {\n const [refShort, isoDate] = line.split(' ');\n // refs/remotes/origin/HEAD, the default branch for the repo, is shortened to `origin`\n if (refShort === 'origin') {\n continue;\n }\n\n const branchName = refShort.replace(regEx(/^origin\\//), '');\n result[branchName] = DateTime.fromISO(isoDate).toUTC();\n }\n return result;\n}\n\nexport async function getCommitMessages(): Promise<string[]> {\n logger.debug('getCommitMessages');\n // v8 ignore else -- TODO: add test #40625\n if (GlobalConfig.get('platform') !== 'local') {\n await syncGit();\n }\n try {\n const res = await git.log({\n n: 20,\n format: { message: '%s' },\n '--no-merges': null,\n });\n return res.all.map((commit) => commit.message);\n } catch /* v8 ignore next -- TODO: add test #40625 */ {\n return [];\n }\n}\n\nexport async function checkoutBranch(\n branchName: string,\n): Promise<LongCommitSha> {\n logger.debug(`Setting current branch to ${branchName}`);\n await syncGit();\n try {\n await gitRetry(() =>\n git.checkout(\n submodulesInitizialized\n ? ['-f', '--recurse-submodules', branchName, '--']\n : ['-f', branchName, '--'],\n ),\n );\n config.currentBranch = branchName;\n config.currentBranchSha = toLongCommitSha(\n (await git.raw(['rev-parse', 'HEAD'])).trim(),\n );\n const latestCommitDate = await getCommitDate(config.currentBranchSha);\n // v8 ignore else -- TODO: add test #40625\n if (latestCommitDate) {\n logger.debug(\n { branchName, latestCommitDate, sha: config.currentBranchSha },\n 'latest commit',\n );\n }\n await git.reset(ResetMode.HARD);\n return config.currentBranchSha;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n if (err.message?.includes('fatal: ambiguous argument')) {\n logger.warn({ err }, 'Failed to checkout branch');\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n}\n\nexport async function checkoutBranchFromRemote(\n branchName: string,\n remoteName: string,\n): Promise<LongCommitSha> {\n logger.debug(`Checking out branch ${branchName} from remote ${remoteName}`);\n await syncGit();\n try {\n await gitRetry(() =>\n git.checkoutBranch(branchName, `${remoteName}/${branchName}`),\n );\n config.currentBranch = branchName;\n config.currentBranchSha = toLongCommitSha(\n (await git.revparse('HEAD')).trim(),\n );\n logger.debug(`Checked out branch ${branchName} from remote ${remoteName}`);\n config.branchCommits[branchName] = config.currentBranchSha;\n return config.currentBranchSha;\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n if (err.message?.includes('fatal: ambiguous argument')) {\n logger.warn({ err }, 'Failed to checkout branch');\n throw new Error(TEMPORARY_ERROR);\n }\n throw err;\n }\n}\n\n/**\n * Returns the remote-tracking ref path for a virtual branch.\n */\nexport function remoteBranchRef(branchName: string): string {\n return `refs/remotes/origin/${branchName}`;\n}\n\n/**\n * Returns whether the given branch is tracked as a virtual branch.\n */\nfunction isVirtualBranch(branchName: string): boolean {\n return branchName in config.virtualBranches;\n}\n\n/**\n * Set a virtual branch's remote-tracking ref and add it to the\n * virtual-branch registry (config.virtualBranches).\n *\n * Used after pushing (to keep tracking in sync with the remote) and in\n * createPr() when the Gerrit change ref becomes available.\n *\n * @param branchName Virtual branch name to set\n * @param ref The ref this virtual branch is fetched from (e.g., 'refs/changes/34/1234/1')\n * @param commitSha The commit SHA the virtual branch points to.\n */\nexport async function setVirtualBranch(\n branchName: string,\n ref: string,\n commitSha: LongCommitSha,\n): Promise<void> {\n logger.debug({ branchName, ref, commitSha }, 'setVirtualBranch()');\n await git.raw(['update-ref', remoteBranchRef(branchName), commitSha]);\n config.branchCommits[branchName] = commitSha;\n config.virtualBranches[branchName] = { ref, sha: commitSha };\n config.branchIsModified[branchName] = false;\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 from: `origin/${baseBranch}`,\n to: `origin/${branchName}`,\n symmetric: false, // means <from>..<to> instead of <from>...<to>\n format: {\n author_email: '%ae',\n committer_email: '%ce',\n },\n });\n\n for (const commit of commits.all) {\n committedAuthors.add(commit.author_email);\n committedAuthors.add(commit.committer_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 for (const ignoredAuthor of platformIgnoredAuthors) {\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 if (isVirtualBranch(branchName)) {\n // Delete the remote-tracking ref.\n // Note: git update-ref -d succeeds even if the ref doesn't exist.\n const ref = remoteBranchRef(branchName);\n logger.debug({ branchName, ref }, 'Deleting virtual branch');\n await git.raw(['update-ref', '-d', ref]);\n delete config.virtualBranches[branchName];\n } else {\n try {\n const deleteCommand = ['push', '--delete', 'origin', branchName];\n\n if (getNoVerify().includes('push')) {\n deleteCommand.push('--no-verify');\n }\n\n await gitRetry(() => git.raw(deleteCommand));\n logger.debug(`Deleted remote branch: ${branchName}`);\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n logger.debug(`No remote branch to delete with name: ${branchName}`);\n }\n }\n try {\n await deleteLocalBranch(branchName);\n /* v8 ignore next -- TODO: add test #40625 (always throws) */\n logger.debug(`Deleted local branch: ${branchName}`);\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n logger.debug(`No local branch to delete with name: ${branchName}`);\n }\n delete config.branchCommits[branchName];\n}\n\nexport async function mergeToLocal(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([\n '-B',\n config.currentBranch,\n `origin/${config.currentBranch}`,\n ]),\n );\n status = await git.status();\n if (isVirtualBranch(branchName)) {\n // Virtual branches are already local and tracked as a remote-tracking ref,\n // so merge it directly without fetching from origin.\n const ref = remoteBranchRef(branchName);\n logger.debug(\n { branchName, ref },\n 'mergeToLocal(): merging virtual branch',\n );\n await git.merge([ref]);\n } else {\n await fetchRevSpec(branchName);\n await gitRetry(() => git.merge(['FETCH_HEAD']));\n }\n } catch (err) {\n logger.debug(\n {\n baseBranch: config.currentBranch,\n baseSha: config.currentBranchSha,\n branchName,\n status,\n err,\n },\n 'mergeLocally error',\n );\n throw err;\n }\n}\n\nexport async function mergeBranch(branchName: string): Promise<void> {\n let status: StatusResult | undefined;\n try {\n await syncGit();\n await writeGitAuthor();\n await git.reset(ResetMode.HARD);\n await gitRetry(() =>\n git.checkout(['-B', branchName, `origin/${branchName}`]),\n );\n await gitRetry(() =>\n git.checkout([\n '-B',\n config.currentBranch,\n `origin/${config.currentBranch}`,\n ]),\n );\n status = await git.status();\n await gitRetry(() => git.merge(['--ff-only', branchName]));\n await gitRetry(() => git.push('origin', config.currentBranch));\n incLimitedValue('Commits');\n } catch (err) {\n logger.debug(\n {\n baseBranch: config.currentBranch,\n baseSha: config.currentBranchSha,\n branchName,\n branchSha: getBranchCommit(branchName),\n status,\n err,\n },\n 'mergeBranch error',\n );\n throw err;\n }\n}\n\nasync function getCommitDate(ref: LongCommitSha | string): Promise<DateTime> {\n const output = await git.show(['-s', '--format=%cI', ref]);\n return DateTime.fromISO(output.trim()).toUTC();\n}\n\nexport async function getBranchLastCommitTime(\n branchName: string,\n): Promise<Date> {\n await syncGit();\n try {\n const time = await getCommitDate(`origin/${branchName}`);\n return time.toJSDate();\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore next 3 -- TODO: add test */\n if (errChecked) {\n throw errChecked;\n }\n return new Date();\n }\n}\n\nexport function getBranchFiles(branchName: string): Promise<string[] | null> {\n return getBranchFilesFromRef(`origin/${branchName}`);\n}\n\nexport function getBranchFilesFromCommit(\n referenceCommit: LongCommitSha,\n): Promise<string[] | null> {\n return getBranchFilesFromRef(referenceCommit);\n}\n\nasync function getBranchFilesFromRef(\n refName: string,\n): Promise<string[] | null> {\n await syncGit();\n try {\n const diff = await gitRetry(() =>\n git.diffSummary([refName, `${refName}^`]),\n );\n return diff.files.map((file) => file.file);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'getBranchFilesFromRef error');\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n return null;\n }\n}\n\nexport async function getFile(\n filePath: string,\n branchName?: string,\n): Promise<string | null> {\n await syncGit();\n try {\n const content = await git.show([\n `origin/${branchName ?? config.currentBranch}:${filePath}`,\n ]);\n\n logWarningIfUnicodeHiddenCharactersInPackageFile(filePath, content);\n\n return content;\n } catch (err) {\n const errChecked = checkForPlatformFailure(err);\n /* v8 ignore if -- TODO: add test #40625 */\n if (errChecked) {\n throw errChecked;\n }\n return null;\n }\n}\n\nexport async function getFiles(\n fileNames: string[],\n): Promise<Record<string, string | null>> {\n const fileContentMap: Record<string, string | null> = {};\n\n for (const fileName of fileNames) {\n fileContentMap[fileName] = await getFile(fileName);\n }\n\n return fileContentMap;\n}\n\nexport async function hasDiff(\n sourceRef: string,\n targetRef: string,\n): Promise<boolean> {\n await syncGit();\n try {\n return (\n (await gitRetry(() => git.diff([sourceRef, targetRef, '--']))) !== ''\n );\n } catch {\n return true;\n }\n}\n\nasync function handleCommitAuth(localDir: string): Promise<void> {\n if (!privateKeySet) {\n await writePrivateKey();\n privateKeySet = true;\n }\n await configSigningKey(localDir);\n await writeGitAuthor();\n}\n\n/**\n *\n * Prepare local branch with commit\n *\n * 0. Hard reset\n * 1. Creates local branch with `origin/` prefix\n * 2. Perform `git add` (respecting mode) and `git remove` for each file\n * 3. Perform commit\n * 4. Check whether resulting commit is empty or not (due to .gitignore)\n * 5. If not empty, return commit info for further processing\n *\n */\nexport async function prepareCommit({\n branchName,\n files,\n message,\n force = false,\n}: CommitFilesConfig): Promise<CommitResult | null> {\n const localDir = GlobalConfig.get('localDir');\n await syncGit();\n logger.debug(`Preparing files for committing to branch ${branchName}`);\n await handleCommitAuth(localDir);\n try {\n await git.reset(ResetMode.HARD);\n await git.raw(['clean', '-fd']);\n const parentCommitSha = config.currentBranchSha;\n await gitRetry(() =>\n git.checkout(['-B', branchName, `origin/${config.currentBranch}`]),\n );\n const deletedFiles: string[] = [];\n const addedModifiedFiles: string[] = [];\n const ignoredFiles: string[] = [];\n for (const file of files) {\n const fileName = file.path;\n if (file.type === 'deletion') {\n try {\n await git.rm([fileName]);\n deletedFiles.push(fileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n const errChecked = checkForPlatformFailure(err);\n if (errChecked) {\n throw errChecked;\n }\n logger.trace({ err, fileName }, 'Cannot delete file');\n ignoredFiles.push(fileName);\n }\n } else {\n if (await isDirectory(upath.join(localDir, fileName))) {\n // This is usually a git submodule update\n logger.trace({ fileName }, 'Adding directory commit');\n } else if (file.contents === null) {\n continue;\n } else {\n let contents: Buffer;\n /* v8 ignore else -- TODO: add test #40625 */\n if (typeof file.contents === 'string') {\n contents = Buffer.from(file.contents);\n } else {\n contents = file.contents;\n }\n // some file systems including Windows don't support the mode\n // so the index should be manually updated after adding the file\n if (file.isSymlink) {\n await fs.symlink(file.contents, upath.join(localDir, fileName));\n } else {\n await fs.outputFile(upath.join(localDir, fileName), contents, {\n mode: file.isExecutable ? 0o777 : 0o666,\n });\n }\n }\n try {\n /* v8 ignore next -- TODO: add test #40625 */\n const addParams =\n fileName === getConfigFileNames()[0] ? ['-f', fileName] : fileName;\n await git.add(addParams);\n if (file.isExecutable) {\n await git.raw(['update-index', '--chmod=+x', fileName]);\n }\n addedModifiedFiles.push(fileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (\n !err.message.includes(\n 'The following paths are ignored by one of your .gitignore files',\n )\n ) {\n throw err;\n }\n logger.debug(`Cannot commit ignored file: ${fileName}`);\n ignoredFiles.push(file.path);\n }\n }\n }\n\n const commitOptions: Options = {};\n if (getNoVerify().includes('commit')) {\n commitOptions['--no-verify'] = null;\n }\n\n const commitRes = await git.commit(message, [], commitOptions);\n if (\n isNonEmptyObject(commitRes.summary) &&\n commitRes.summary.changes === 0 &&\n commitRes.summary.insertions === 0 &&\n commitRes.summary.deletions === 0\n ) {\n logger.warn({ commitRes }, 'Detected empty commit - aborting git push');\n return null;\n }\n logger.debug(\n { deletedFiles, ignoredFiles, result: commitRes },\n `git commit`,\n );\n if (!force && !(await hasDiff('HEAD', `origin/${branchName}`))) {\n logger.debug(\n { branchName, deletedFiles, addedModifiedFiles, ignoredFiles },\n 'No file changes detected. Skipping commit',\n );\n return null;\n }\n\n const commitSha = toLongCommitSha(\n (await git.revparse([branchName])).trim(),\n );\n const result: CommitResult = {\n parentCommitSha,\n commitSha,\n files: files.filter((fileChange) => {\n if (fileChange.type === 'deletion') {\n return deletedFiles.includes(fileChange.path);\n }\n return addedModifiedFiles.includes(fileChange.path);\n }),\n };\n\n return result;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n return handleCommitError(err, branchName, files);\n }\n}\n\nexport async function pushCommit({\n sourceRef,\n targetRef,\n files,\n pushOptions,\n}: PushFilesConfig): Promise<boolean> {\n await syncGit();\n logger.debug(`Pushing refSpec ${sourceRef}:${targetRef ?? sourceRef}`);\n let result = false;\n try {\n const gitOptions: TaskOptions = {\n '--force-with-lease': null,\n '-u': null,\n };\n if (getNoVerify().includes('push')) {\n gitOptions['--no-verify'] = null;\n }\n if (pushOptions) {\n gitOptions['--push-option'] = pushOptions;\n }\n\n const pushRes = await gitRetry(() =>\n git.push('origin', `${sourceRef}:${targetRef ?? sourceRef}`, gitOptions),\n );\n delete pushRes.repo;\n logger.debug({ result: pushRes }, 'git push');\n incLimitedValue('Commits');\n incCountValue('HourlyCommits');\n result = true;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n handleCommitError(err, sourceRef, files);\n }\n return result;\n}\n\nexport async function fetchBranch(\n branchName: string,\n): Promise<LongCommitSha | null> {\n await syncGit();\n logger.debug(`Fetching branch ${branchName}`);\n try {\n const ref = `refs/heads/${branchName}:${remoteBranchRef(branchName)}`;\n await gitRetry(() => git.pull(['origin', ref, '--force']));\n const commit = toLongCommitSha((await git.revparse([branchName])).trim());\n config.branchCommits[branchName] = commit;\n config.branchIsModified[branchName] = false;\n return commit;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n return handleCommitError(err, branchName);\n }\n}\n\nexport async function commitFiles(\n commitConfig: CommitFilesConfig,\n): Promise<LongCommitSha | null> {\n try {\n const commitResult = await prepareCommit(commitConfig);\n if (commitResult) {\n const pushResult = await pushCommit({\n sourceRef: commitConfig.branchName,\n files: commitConfig.files,\n });\n // v8 ignore else -- TODO: add test #40625\n if (pushResult) {\n const { branchName } = commitConfig;\n const { commitSha } = commitResult;\n config.branchCommits[branchName] = commitSha;\n config.branchIsModified[branchName] = false;\n return commitSha;\n }\n }\n return null;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n if (err.message.includes('[rejected] (stale info)')) {\n throw new Error(REPOSITORY_CHANGED);\n }\n throw err;\n }\n}\n\nexport function getUrl({\n protocol,\n auth,\n hostname,\n host,\n repository,\n}: {\n protocol?: GitProtocol;\n auth?: string;\n hostname?: string;\n host?: string;\n repository: string;\n}): string {\n if (protocol === 'ssh') {\n // TODO: types (#22198)\n return `git@${hostname!}:${repository}.git`;\n }\n return URL.format({\n protocol: protocol ?? 'https',\n auth,\n hostname,\n host,\n pathname: `${repository}.git`,\n });\n}\n\nlet remoteRefsExist = false;\n\n/**\n *\n * Non-branch refs allow us to store git objects without triggering CI pipelines.\n * It's useful for API-based branch rebasing.\n *\n * @see https://stackoverflow.com/questions/63866947/pushing-git-non-branch-references-to-a-remote/63868286\n *\n */\nexport async function pushCommitToRenovateRef(\n commitSha: string,\n refName: string,\n): Promise<void> {\n const fullRefName = `refs/renovate/branches/${refName}`;\n await git.raw(['update-ref', fullRefName, commitSha]);\n await git.push(['--force', 'origin', fullRefName]);\n remoteRefsExist = true;\n}\n\n/**\n *\n * Removes all remote \"refs/renovate/branches/*\" refs in two steps:\n *\n * Step 1: list refs\n *\n * $ git ls-remote origin \"refs/renovate/branches/*\"\n *\n * > cca38e9ea6d10946bdb2d0ca5a52c205783897aa refs/renovate/branches/foo\n * > 29ac154936c880068994e17eb7f12da7fdca70e5 refs/renovate/branches/bar\n * > 3fafaddc339894b6d4f97595940fd91af71d0355 refs/renovate/branches/baz\n * > ...\n *\n * Step 2:\n *\n * $ git push --delete origin refs/renovate/branches/foo refs/renovate/branches/bar refs/renovate/branches/baz\n *\n * If Step 2 fails because the repo doesn't allow bulk changes, we'll remove them one by one instead:\n *\n * $ git push --delete origin refs/renovate/branches/foo\n * $ git push --delete origin refs/renovate/branches/bar\n * $ git push --delete origin refs/renovate/branches/baz\n */\nexport async function clearRenovateRefs(): Promise<void> {\n if (!gitInitialized || !remoteRefsExist) {\n return;\n }\n\n logger.debug(`Cleaning up Renovate refs: refs/renovate/branches/*`);\n const renovateRefs: string[] = [];\n\n try {\n const rawOutput = await git.listRemote([\n config.url,\n 'refs/renovate/branches/*',\n ]);\n const refs = rawOutput\n .split(newlineRegex)\n .map((line) => line.replace(regEx(/[0-9a-f]+\\s+/i), '').trim())\n .filter((line) => line.startsWith('refs/renovate/branches/'));\n renovateRefs.push(...refs);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, `Renovate refs cleanup error`);\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (renovateRefs.length) {\n try {\n const pushOpts = ['--delete', 'origin', ...renovateRefs];\n await git.push(pushOpts);\n } catch (err) {\n /* v8 ignore else -- TODO: add test #40625 */\n if (bulkChangesDisallowed(err)) {\n for (const ref of renovateRefs) {\n try {\n const pushOpts = ['--delete', 'origin', ref];\n await git.push(pushOpts);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug({ err }, 'Error deleting \"refs/renovate/branches/*\"');\n break;\n }\n }\n } else {\n logger.warn({ err }, 'Error deleting \"refs/renovate/branches/*\"');\n }\n }\n }\n\n remoteRefsExist = false;\n}\n\nconst diffTreeLineRegex = regEx(\n /^:(?<oldMode>\\d{6})\\s+(?<newMode>\\d{6})\\s+(?<oldSha>[0-9a-f]{40})\\s+(?<newSha>[0-9a-f]{40})\\s+(?<status>[A-Z]\\d*)\\t(?<paths>.+)$/,\n);\n\nconst treeShaRegex = regEx(/tree\\s+(?<treeSha>[0-9a-f]{40})\\s*/);\n\n/**\n * Get the tree SHA for a commit.\n */\nexport async function getCommitTreeSha(\n commitSha: LongCommitSha,\n): Promise<LongCommitSha> {\n const commitOutput = await git.catFile(['-p', commitSha]);\n const { treeSha } = treeShaRegex.exec(commitOutput)?.groups ?? {};\n if (!treeSha) {\n const snippet = commitOutput.split(newlineRegex)[0];\n /* v8 ignore next -- tested, but v8 reports template literal as partial */\n throw new Error(\n `Could not extract tree SHA from commit ${commitSha}: ${snippet}`,\n );\n }\n return toLongCommitSha(treeSha);\n}\n\nfunction treeTypeFromMode(mode: string): GitObjectType {\n switch (mode) {\n case GitTreeMode.Gitlink:\n return 'commit';\n case GitTreeMode.Directory:\n return 'tree';\n default:\n return 'blob';\n }\n}\n\n/**\n * Return only the files that changed between two commits.\n * Deletions have `sha: null` (for use with GitHub's `base_tree` API).\n */\nexport async function diffCommitTree(\n parentCommitSha: LongCommitSha,\n commitSha: LongCommitSha,\n): Promise<DiffTreeItem[]> {\n const output = await git.raw([\n 'diff-tree',\n '-M',\n '-r',\n '--no-commit-id',\n parentCommitSha,\n commitSha,\n ]);\n const result: DiffTreeItem[] = [];\n for (const line of output.split(newlineRegex)) {\n const matchGroups = diffTreeLineRegex.exec(line)?.groups;\n if (matchGroups) {\n const { oldMode, newMode, newSha, status, paths } = matchGroups;\n const statusCode = status[0];\n // R has two tab-separated paths (old\\tnew); A/M/D/T have one.\n // C also has two paths but falls through to default (only the target matters).\n const [sourcePath, targetPath] = paths.split('\\t');\n switch (statusCode) {\n case 'D':\n result.push({\n path: sourcePath,\n mode: oldMode,\n type: treeTypeFromMode(oldMode),\n sha: null,\n });\n break;\n case 'R':\n // Rename: delete source, add target\n result.push({\n path: sourcePath,\n mode: oldMode,\n type: treeTypeFromMode(oldMode),\n sha: null,\n });\n result.push({\n path: targetPath,\n mode: newMode,\n type: treeTypeFromMode(newMode),\n sha: toLongCommitSha(newSha),\n });\n break;\n default:\n // A (add), M (modify), T (type change), C (copy)\n result.push({\n path: targetPath ?? sourcePath,\n mode: newMode,\n type: treeTypeFromMode(newMode),\n sha: toLongCommitSha(newSha),\n });\n break;\n }\n }\n }\n return result;\n}\n\nasync function localBranchExists(branchName: string): Promise<boolean> {\n await syncGit();\n const localBranches = await git.branchLocal();\n return localBranches.all.includes(branchName);\n}\n\n/**\n * Synchronize a forked branch with its upstream counterpart.\n *\n * syncForkWithUpstream updates the fork's branch, to match the corresponding branch in the upstream repository.\n * The steps are:\n * 1. Check if the branch exists locally.\n * 2. If the branch exists locally: checkout the local branch.\n * 3. If the branch does _not_ exist locally: checkout the upstream branch.\n * 4. Reset the local branch to match the upstream branch.\n * 5. Force push the (updated) local branch to the origin repository.\n *\n * @param {string} branchName - The name of the branch to synchronize.\n * @returns A promise that resolves to True if the synchronization is successful, or `false` if an error occurs.\n */\nexport async function syncForkWithUpstream(branchName: string): Promise<void> {\n if (!config.upstreamUrl) {\n return;\n }\n logger.debug(\n `Synchronizing fork with \"${RENOVATE_FORK_UPSTREAM}\" remote for branch ${branchName}`,\n );\n const remotes = await getRemotes();\n /* v8 ignore if -- this should not be possible if upstreamUrl exists */\n if (!remotes.some((r) => r === RENOVATE_FORK_UPSTREAM)) {\n throw new Error('No upstream remote exists, cannot sync fork');\n }\n try {\n await git.fetch([RENOVATE_FORK_UPSTREAM]);\n if (await localBranchExists(branchName)) {\n await checkoutBranch(branchName);\n } else {\n await checkoutBranchFromRemote(branchName, RENOVATE_FORK_UPSTREAM);\n }\n await resetHardFromRemote(`${RENOVATE_FORK_UPSTREAM}/${branchName}`);\n await forcePushToRemote(branchName, 'origin');\n } catch (err) /* v8 ignore next -- shouldn't happen */ {\n logger.error({ err }, 'Error synchronizing fork');\n throw new Error(UNKNOWN_ERROR);\n }\n}\n\nexport async function getRemotes(): Promise<string[]> {\n logger.debug('git.getRemotes()');\n try {\n await syncGit();\n const remotes = await git.getRemotes();\n logger.debug(`Found remotes: ${remotes.map((r) => r.name).join(', ')}`);\n return remotes.map((remote) => remote.name);\n } catch (err) /* v8 ignore next -- git.getRemotes only fails on repo corruption, not simulated in specs */ {\n logger.error({ err }, 'Error getting remotes');\n throw err;\n }\n}\n"],"mappings":"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"}
@@ -44,13 +44,14 @@ async function getCommitsHourlyCount(branches) {
44
44
  const currentHourStart = DateTime.utc().startOf("hour");
45
45
  logger.debug(`Calculating commits so far in this hour currentHourStart=${String(currentHourStart)}, for ${branches.length} branches`);
46
46
  const cachedBranches = getCache().branches ?? [];
47
+ const fallbackUpdateDates = branches.some((branch) => !cachedBranches.find((b) => b.branchName === branch.branchName)?.commitTimestamp) ? await scm.getAllBranchUpdateDates() : {};
47
48
  let soFarThisHour = 0;
48
49
  for (const branch of branches) {
49
50
  const branchCache = cachedBranches.find((b) => b.branchName === branch.branchName);
50
51
  if (branchCache?.commitTimestamp) {
51
52
  if (DateTime.fromISO(branchCache.commitTimestamp).toUTC() > currentHourStart) soFarThisHour++;
52
53
  } else {
53
- const updateDate = await scm.getBranchUpdateDate(branch.branchName);
54
+ const updateDate = fallbackUpdateDates[branch.branchName];
54
55
  if (updateDate && updateDate > currentHourStart) soFarThisHour++;
55
56
  }
56
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"limits.js","names":[],"sources":["../../../../lib/workers/repository/process/limits.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport { getInheritedOrGlobal } from '../../../util/common.ts';\nimport type { BranchConfig } from '../../types.ts';\n\nexport async function getPrHourlyCount(\n config: RenovateConfig,\n): Promise<number> {\n return await instrument('getPrHourlyCount', async () => {\n try {\n const prList = await platform.getPrList();\n const currentHourStart = DateTime.utc().startOf('hour');\n logger.debug(\n `Calculating PRs created so far in this hour currentHourStart=${String(currentHourStart)}`,\n );\n const soFarThisHour = prList.filter(\n (pr) =>\n pr.sourceBranch !== getInheritedOrGlobal('onboardingBranch') &&\n pr.sourceBranch.startsWith(config.branchPrefix!) &&\n DateTime.fromISO(pr.createdAt!).toUTC() > currentHourStart,\n );\n logger.debug(\n `${soFarThisHour.length} PRs have been created so far in this hour.`,\n );\n return soFarThisHour.length;\n } catch (err) {\n // istanbul ignore if\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.error({ err }, 'Error checking PRs created per hour');\n return 0;\n }\n });\n}\n\nexport async function getConcurrentPrsCount(\n config: RenovateConfig,\n branches: BranchConfig[],\n): Promise<number> {\n return await instrument('getConcurrentPrsCount', async () => {\n let openPrCount = 0;\n for (const { branchName } of branches) {\n try {\n const pr = await platform.getBranchPr(branchName, config.baseBranch);\n if (\n pr &&\n pr.sourceBranch !== getInheritedOrGlobal('onboardingBranch') &&\n pr.state === 'open'\n ) {\n openPrCount++;\n }\n } catch (err) {\n // istanbul ignore if\n if (err instanceof ExternalHostError) {\n throw err;\n } else {\n // no-op\n }\n }\n }\n\n logger.debug(`${openPrCount} PRs are currently open`);\n return openPrCount;\n });\n}\n\nexport async function getCommitsHourlyCount(\n branches: BranchConfig[],\n): Promise<number> {\n return await instrument('getCommitsHourlyCount', async () => {\n try {\n const currentHourStart = DateTime.utc().startOf('hour');\n logger.debug(\n `Calculating commits so far in this hour currentHourStart=${String(currentHourStart)}, for ${branches.length} branches`,\n );\n\n const cache = getCache();\n const cachedBranches = cache.branches ?? [];\n\n let soFarThisHour = 0;\n for (const branch of branches) {\n // First try to get from cache\n const branchCache = cachedBranches.find(\n (b) => b.branchName === branch.branchName,\n );\n\n if (branchCache?.commitTimestamp) {\n const commitTime = DateTime.fromISO(\n branchCache.commitTimestamp,\n ).toUTC();\n if (commitTime > currentHourStart) {\n soFarThisHour++;\n }\n } else {\n // Fallback to SCM if not in cache (shouldn't happen often after initial run)\n const updateDate = await scm.getBranchUpdateDate(branch.branchName);\n if (updateDate && updateDate > currentHourStart) {\n soFarThisHour++;\n }\n }\n }\n logger.debug(`${soFarThisHour} commits so far in this hour.`);\n return soFarThisHour;\n } catch (err) {\n logger.error({ err }, 'Error checking commits per hour');\n return 0;\n }\n });\n}\n\nexport async function getConcurrentBranchesCount(\n branches: BranchConfig[],\n): Promise<number> {\n return await instrument('getConcurrentBranchesCount', async () => {\n let existingBranchCount = 0;\n for (const branch of branches) {\n if (await scm.branchExists(branch.branchName)) {\n existingBranchCount++;\n }\n }\n\n logger.debug(`${existingBranchCount} already existing branches found.`);\n return existingBranchCount;\n });\n}\n"],"mappings":";;;;;;;;;AAWA,eAAsB,iBACpB,QACiB;CACjB,OAAO,MAAM,WAAW,oBAAoB,YAAY;EACtD,IAAI;GACF,MAAM,SAAS,MAAM,SAAS,UAAU;GACxC,MAAM,mBAAmB,SAAS,IAAI,CAAC,CAAC,QAAQ,MAAM;GACtD,OAAO,MACL,gEAAgE,OAAO,gBAAgB,GACzF;GACA,MAAM,gBAAgB,OAAO,QAC1B,OACC,GAAG,iBAAiB,qBAAqB,kBAAkB,KAC3D,GAAG,aAAa,WAAW,OAAO,YAAa,KAC/C,SAAS,QAAQ,GAAG,SAAU,CAAC,CAAC,MAAM,IAAI,gBAC9C;GACA,OAAO,MACL,GAAG,cAAc,OAAO,4CAC1B;GACA,OAAO,cAAc;EACvB,SAAS,KAAK;;GAEZ,IAAI,eAAe,mBACjB,MAAM;GAER,OAAO,MAAM,EAAE,IAAI,GAAG,qCAAqC;GAC3D,OAAO;EACT;CACF,CAAC;AACH;AAEA,eAAsB,sBACpB,QACA,UACiB;CACjB,OAAO,MAAM,WAAW,yBAAyB,YAAY;EAC3D,IAAI,cAAc;EAClB,KAAK,MAAM,EAAE,gBAAgB,UAC3B,IAAI;GACF,MAAM,KAAK,MAAM,SAAS,YAAY,YAAY,OAAO,UAAU;GACnE,IACE,MACA,GAAG,iBAAiB,qBAAqB,kBAAkB,KAC3D,GAAG,UAAU,QAEb;EAEJ,SAAS,KAAK;;GAEZ,IAAI,eAAe,mBACjB,MAAM;EAIV;EAGF,OAAO,MAAM,GAAG,YAAY,wBAAwB;EACpD,OAAO;CACT,CAAC;AACH;AAEA,eAAsB,sBACpB,UACiB;CACjB,OAAO,MAAM,WAAW,yBAAyB,YAAY;EAC3D,IAAI;GACF,MAAM,mBAAmB,SAAS,IAAI,CAAC,CAAC,QAAQ,MAAM;GACtD,OAAO,MACL,4DAA4D,OAAO,gBAAgB,EAAE,QAAQ,SAAS,OAAO,UAC/G;GAGA,MAAM,iBADQ,SACa,CAAC,CAAC,YAAY,CAAC;GAE1C,IAAI,gBAAgB;GACpB,KAAK,MAAM,UAAU,UAAU;IAE7B,MAAM,cAAc,eAAe,MAChC,MAAM,EAAE,eAAe,OAAO,UACjC;IAEA,IAAI,aAAa;SACI,SAAS,QAC1B,YAAY,eACd,CAAC,CAAC,MACW,IAAI,kBACf;IAAA,OAEG;KAEL,MAAM,aAAa,MAAM,IAAI,oBAAoB,OAAO,UAAU;KAClE,IAAI,cAAc,aAAa,kBAC7B;IAEJ;GACF;GACA,OAAO,MAAM,GAAG,cAAc,8BAA8B;GAC5D,OAAO;EACT,SAAS,KAAK;GACZ,OAAO,MAAM,EAAE,IAAI,GAAG,iCAAiC;GACvD,OAAO;EACT;CACF,CAAC;AACH;AAEA,eAAsB,2BACpB,UACiB;CACjB,OAAO,MAAM,WAAW,8BAA8B,YAAY;EAChE,IAAI,sBAAsB;EAC1B,KAAK,MAAM,UAAU,UACnB,IAAI,MAAM,IAAI,aAAa,OAAO,UAAU,GAC1C;EAIJ,OAAO,MAAM,GAAG,oBAAoB,kCAAkC;EACtE,OAAO;CACT,CAAC;AACH"}
1
+ {"version":3,"file":"limits.js","names":[],"sources":["../../../../lib/workers/repository/process/limits.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport { getInheritedOrGlobal } from '../../../util/common.ts';\nimport type { BranchConfig } from '../../types.ts';\n\nexport async function getPrHourlyCount(\n config: RenovateConfig,\n): Promise<number> {\n return await instrument('getPrHourlyCount', async () => {\n try {\n const prList = await platform.getPrList();\n const currentHourStart = DateTime.utc().startOf('hour');\n logger.debug(\n `Calculating PRs created so far in this hour currentHourStart=${String(currentHourStart)}`,\n );\n const soFarThisHour = prList.filter(\n (pr) =>\n pr.sourceBranch !== getInheritedOrGlobal('onboardingBranch') &&\n pr.sourceBranch.startsWith(config.branchPrefix!) &&\n DateTime.fromISO(pr.createdAt!).toUTC() > currentHourStart,\n );\n logger.debug(\n `${soFarThisHour.length} PRs have been created so far in this hour.`,\n );\n return soFarThisHour.length;\n } catch (err) {\n // istanbul ignore if\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.error({ err }, 'Error checking PRs created per hour');\n return 0;\n }\n });\n}\n\nexport async function getConcurrentPrsCount(\n config: RenovateConfig,\n branches: BranchConfig[],\n): Promise<number> {\n return await instrument('getConcurrentPrsCount', async () => {\n let openPrCount = 0;\n for (const { branchName } of branches) {\n try {\n const pr = await platform.getBranchPr(branchName, config.baseBranch);\n if (\n pr &&\n pr.sourceBranch !== getInheritedOrGlobal('onboardingBranch') &&\n pr.state === 'open'\n ) {\n openPrCount++;\n }\n } catch (err) {\n // istanbul ignore if\n if (err instanceof ExternalHostError) {\n throw err;\n } else {\n // no-op\n }\n }\n }\n\n logger.debug(`${openPrCount} PRs are currently open`);\n return openPrCount;\n });\n}\n\nexport async function getCommitsHourlyCount(\n branches: BranchConfig[],\n): Promise<number> {\n return await instrument('getCommitsHourlyCount', async () => {\n try {\n const currentHourStart = DateTime.utc().startOf('hour');\n logger.debug(\n `Calculating commits so far in this hour currentHourStart=${String(currentHourStart)}, for ${branches.length} branches`,\n );\n\n const cache = getCache();\n const cachedBranches = cache.branches ?? [];\n\n // if we don't have all of our branches in our cache (for instance, if we're not using the Repository Cache, or this is the first run against a repo), we need to fall back to the SCM\n const needsScmFallback = branches.some(\n (branch) =>\n !cachedBranches.find((b) => b.branchName === branch.branchName)\n ?.commitTimestamp,\n );\n const fallbackUpdateDates = needsScmFallback\n ? await scm.getAllBranchUpdateDates()\n : {};\n\n let soFarThisHour = 0;\n for (const branch of branches) {\n // First try to get from cache\n const branchCache = cachedBranches.find(\n (b) => b.branchName === branch.branchName,\n );\n\n if (branchCache?.commitTimestamp) {\n const commitTime = DateTime.fromISO(\n branchCache.commitTimestamp,\n ).toUTC();\n if (commitTime > currentHourStart) {\n soFarThisHour++;\n }\n } else {\n // Fallback to SCM if not in cache\n const updateDate = fallbackUpdateDates[branch.branchName];\n if (updateDate && updateDate > currentHourStart) {\n soFarThisHour++;\n }\n }\n }\n logger.debug(`${soFarThisHour} commits so far in this hour.`);\n return soFarThisHour;\n } catch (err) {\n logger.error({ err }, 'Error checking commits per hour');\n return 0;\n }\n });\n}\n\nexport async function getConcurrentBranchesCount(\n branches: BranchConfig[],\n): Promise<number> {\n return await instrument('getConcurrentBranchesCount', async () => {\n let existingBranchCount = 0;\n for (const branch of branches) {\n if (await scm.branchExists(branch.branchName)) {\n existingBranchCount++;\n }\n }\n\n logger.debug(`${existingBranchCount} already existing branches found.`);\n return existingBranchCount;\n });\n}\n"],"mappings":";;;;;;;;;AAWA,eAAsB,iBACpB,QACiB;CACjB,OAAO,MAAM,WAAW,oBAAoB,YAAY;EACtD,IAAI;GACF,MAAM,SAAS,MAAM,SAAS,UAAU;GACxC,MAAM,mBAAmB,SAAS,IAAI,CAAC,CAAC,QAAQ,MAAM;GACtD,OAAO,MACL,gEAAgE,OAAO,gBAAgB,GACzF;GACA,MAAM,gBAAgB,OAAO,QAC1B,OACC,GAAG,iBAAiB,qBAAqB,kBAAkB,KAC3D,GAAG,aAAa,WAAW,OAAO,YAAa,KAC/C,SAAS,QAAQ,GAAG,SAAU,CAAC,CAAC,MAAM,IAAI,gBAC9C;GACA,OAAO,MACL,GAAG,cAAc,OAAO,4CAC1B;GACA,OAAO,cAAc;EACvB,SAAS,KAAK;;GAEZ,IAAI,eAAe,mBACjB,MAAM;GAER,OAAO,MAAM,EAAE,IAAI,GAAG,qCAAqC;GAC3D,OAAO;EACT;CACF,CAAC;AACH;AAEA,eAAsB,sBACpB,QACA,UACiB;CACjB,OAAO,MAAM,WAAW,yBAAyB,YAAY;EAC3D,IAAI,cAAc;EAClB,KAAK,MAAM,EAAE,gBAAgB,UAC3B,IAAI;GACF,MAAM,KAAK,MAAM,SAAS,YAAY,YAAY,OAAO,UAAU;GACnE,IACE,MACA,GAAG,iBAAiB,qBAAqB,kBAAkB,KAC3D,GAAG,UAAU,QAEb;EAEJ,SAAS,KAAK;;GAEZ,IAAI,eAAe,mBACjB,MAAM;EAIV;EAGF,OAAO,MAAM,GAAG,YAAY,wBAAwB;EACpD,OAAO;CACT,CAAC;AACH;AAEA,eAAsB,sBACpB,UACiB;CACjB,OAAO,MAAM,WAAW,yBAAyB,YAAY;EAC3D,IAAI;GACF,MAAM,mBAAmB,SAAS,IAAI,CAAC,CAAC,QAAQ,MAAM;GACtD,OAAO,MACL,4DAA4D,OAAO,gBAAgB,EAAE,QAAQ,SAAS,OAAO,UAC/G;GAGA,MAAM,iBADQ,SACa,CAAC,CAAC,YAAY,CAAC;GAQ1C,MAAM,sBALmB,SAAS,MAC/B,WACC,CAAC,eAAe,MAAM,MAAM,EAAE,eAAe,OAAO,UAAU,CAAC,EAC3D,eAEmC,IACvC,MAAM,IAAI,wBAAwB,IAClC,CAAC;GAEL,IAAI,gBAAgB;GACpB,KAAK,MAAM,UAAU,UAAU;IAE7B,MAAM,cAAc,eAAe,MAChC,MAAM,EAAE,eAAe,OAAO,UACjC;IAEA,IAAI,aAAa;SACI,SAAS,QAC1B,YAAY,eACd,CAAC,CAAC,MACW,IAAI,kBACf;IAAA,OAEG;KAEL,MAAM,aAAa,oBAAoB,OAAO;KAC9C,IAAI,cAAc,aAAa,kBAC7B;IAEJ;GACF;GACA,OAAO,MAAM,GAAG,cAAc,8BAA8B;GAC5D,OAAO;EACT,SAAS,KAAK;GACZ,OAAO,MAAM,EAAE,IAAI,GAAG,iCAAiC;GACvD,OAAO;EACT;CACF,CAAC;AACH;AAEA,eAAsB,2BACpB,UACiB;CACjB,OAAO,MAAM,WAAW,8BAA8B,YAAY;EAChE,IAAI,sBAAsB;EAC1B,KAAK,MAAM,UAAU,UACnB,IAAI,MAAM,IAAI,aAAa,OAAO,UAAU,GAC1C;EAIJ,OAAO,MAAM,GAAG,oBAAoB,kCAAkC;EACtE,OAAO;CACT,CAAC;AACH"}
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.272.8",
4
+ "version": "43.273.0",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$id": "https://docs.renovatebot.com/renovate-schema.json",
3
- "title": "JSON schema for Renovate 43.272.8 config files (https://renovatebot.com/)",
3
+ "title": "JSON schema for Renovate 43.273.0 config files (https://renovatebot.com/)",
4
4
  "$schema": "http://json-schema.org/draft-07/schema#",
5
- "x-renovate-version": "43.272.8",
5
+ "x-renovate-version": "43.273.0",
6
6
  "allowComments": true,
7
7
  "type": "object",
8
8
  "definitions": {