diff options
| author | eric sciple <ericsciple@users.noreply.github.com> | 2025-11-03 13:08:38 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-03 13:08:38 -0600 |
| commit | ff20ae9cd9d5fc6ce99d108d89ea013d4c12f489 (patch) | |
| tree | d75c06690a2192c6fdeacc5da6222a0683ab81d6 /src/git-command-manager.ts | |
| parent | 33f3caae0058b205c722b2415877b66f0b33d1d9 (diff) | |
Persist creds to a separate file (#2286)
Diffstat (limited to 'src/git-command-manager.ts')
| -rw-r--r-- | src/git-command-manager.ts | 113 |
1 files changed, 110 insertions, 3 deletions
diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts index 8e42a38..a45e15a 100644 --- a/src/git-command-manager.ts +++ b/src/git-command-manager.ts @@ -28,7 +28,8 @@ export interface IGitCommandManager { configKey: string, configValue: string, globalConfig?: boolean, - add?: boolean + add?: boolean, + configFile?: string ): Promise<void> configExists(configKey: string, globalConfig?: boolean): Promise<boolean> fetch( @@ -41,6 +42,7 @@ export interface IGitCommandManager { } ): Promise<void> getDefaultBranch(repositoryUrl: string): Promise<string> + getSubmoduleConfigPaths(recursive: boolean): Promise<string[]> getWorkingDirectory(): string init(): Promise<void> isDetached(): Promise<boolean> @@ -59,8 +61,24 @@ export interface IGitCommandManager { tagExists(pattern: string): Promise<boolean> tryClean(): Promise<boolean> tryConfigUnset(configKey: string, globalConfig?: boolean): Promise<boolean> + tryConfigUnsetValue( + configKey: string, + configValue: string, + globalConfig?: boolean, + configFile?: string + ): Promise<boolean> tryDisableAutomaticGarbageCollection(): Promise<boolean> tryGetFetchUrl(): Promise<string> + tryGetConfigValues( + configKey: string, + globalConfig?: boolean, + configFile?: string + ): Promise<string[]> + tryGetConfigKeys( + pattern: string, + globalConfig?: boolean, + configFile?: string + ): Promise<string[]> tryReset(): Promise<boolean> version(): Promise<GitVersion> } @@ -223,9 +241,15 @@ class GitCommandManager { configKey: string, configValue: string, globalConfig?: boolean, - add?: boolean + add?: boolean, + configFile?: string ): Promise<void> { - const args: string[] = ['config', globalConfig ? '--global' : '--local'] + const args: string[] = ['config'] + if (configFile) { + args.push('--file', configFile) + } else { + args.push(globalConfig ? '--global' : '--local') + } if (add) { args.push('--add') } @@ -323,6 +347,21 @@ class GitCommandManager { throw new Error('Unexpected output when retrieving default branch') } + async getSubmoduleConfigPaths(recursive: boolean): Promise<string[]> { + // Get submodule config file paths. + // Use `--show-origin` to get the config file path for each submodule. + const output = await this.submoduleForeach( + `git config --local --show-origin --name-only --get-regexp remote.origin.url`, + recursive + ) + + // Extract config file paths from the output (lines starting with "file:"). + const configPaths = + output.match(/(?<=(^|\n)file:)[^\t]+(?=\tremote\.origin\.url)/g) || [] + + return configPaths + } + getWorkingDirectory(): string { return this.workingDirectory } @@ -455,6 +494,24 @@ class GitCommandManager { return output.exitCode === 0 } + async tryConfigUnsetValue( + configKey: string, + configValue: string, + globalConfig?: boolean, + configFile?: string + ): Promise<boolean> { + const args = ['config'] + if (configFile) { + args.push('--file', configFile) + } else { + args.push(globalConfig ? '--global' : '--local') + } + args.push('--unset', configKey, configValue) + + const output = await this.execGit(args, true) + return output.exitCode === 0 + } + async tryDisableAutomaticGarbageCollection(): Promise<boolean> { const output = await this.execGit( ['config', '--local', 'gc.auto', '0'], @@ -481,6 +538,56 @@ class GitCommandManager { return stdout } + async tryGetConfigValues( + configKey: string, + globalConfig?: boolean, + configFile?: string + ): Promise<string[]> { + const args = ['config'] + if (configFile) { + args.push('--file', configFile) + } else { + args.push(globalConfig ? '--global' : '--local') + } + args.push('--get-all', configKey) + + const output = await this.execGit(args, true) + + if (output.exitCode !== 0) { + return [] + } + + return output.stdout + .trim() + .split('\n') + .filter(value => value.trim()) + } + + async tryGetConfigKeys( + pattern: string, + globalConfig?: boolean, + configFile?: string + ): Promise<string[]> { + const args = ['config'] + if (configFile) { + args.push('--file', configFile) + } else { + args.push(globalConfig ? '--global' : '--local') + } + args.push('--name-only', '--get-regexp', pattern) + + const output = await this.execGit(args, true) + + if (output.exitCode !== 0) { + return [] + } + + return output.stdout + .trim() + .split('\n') + .filter(key => key.trim()) + } + async tryReset(): Promise<boolean> { const output = await this.execGit(['reset', '--hard', 'HEAD'], true) return output.exitCode === 0 |
