renovate 43.272.9 → 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.
- package/dist/config/global.d.ts +1 -1
- package/dist/config/global.js.map +1 -1
- package/dist/modules/platform/default-scm.js +4 -1
- package/dist/modules/platform/default-scm.js.map +1 -1
- package/dist/modules/platform/local/scm.js +3 -0
- package/dist/modules/platform/local/scm.js.map +1 -1
- package/dist/modules/platform/types.d.ts +1 -0
- package/dist/util/git/index.d.ts +2 -1
- package/dist/util/git/index.js +20 -2
- package/dist/util/git/index.js.map +1 -1
- package/dist/workers/repository/process/limits.js +2 -1
- package/dist/workers/repository/process/limits.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
package/dist/config/global.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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"}
|
|
@@ -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"}
|
|
@@ -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[]>;
|
package/dist/util/git/index.d.ts
CHANGED
|
@@ -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
|
package/dist/util/git/index.js
CHANGED
|
@@ -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":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../lib/util/git/index.ts"],"sourcesContent":["import { setTimeout } from 'node:timers/promises';\nimport URL from 'node:url';\nimport {\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 =
|
|
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
|
|
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
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 43.
|
|
3
|
+
"title": "JSON schema for Renovate 43.273.0 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "43.
|
|
5
|
+
"x-renovate-version": "43.273.0",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|