diff --git a/__test__/git-auth-helper.test.ts b/__test__/git-auth-helper.test.ts index 1bcc140..8275935 100644 --- a/__test__/git-auth-helper.test.ts +++ b/__test__/git-auth-helper.test.ts @@ -769,19 +769,43 @@ describe('git-auth-helper tests', () => { // Arrange await setup(testCredentialsConfigPath_matchesCredentialsConfigPaths) const authHelper = gitAuthHelper.createAuthHelper(git, settings) - + // Get a real credentials config path - const credentialsConfigPath = await (authHelper as any).getCredentialsConfigPath() - + const credentialsConfigPath = await ( + authHelper as any + ).getCredentialsConfigPath() + // Act & Assert - expect((authHelper as any).testCredentialsConfigPath(credentialsConfigPath)).toBe(true) - expect((authHelper as any).testCredentialsConfigPath('/some/path/git-credentials-12345678-abcd-1234-5678-123456789012.config')).toBe(true) - expect((authHelper as any).testCredentialsConfigPath('/some/path/git-credentials-abcdef12-3456-7890-abcd-ef1234567890.config')).toBe(true) - + expect( + (authHelper as any).testCredentialsConfigPath(credentialsConfigPath) + ).toBe(true) + expect( + (authHelper as any).testCredentialsConfigPath( + '/some/path/git-credentials-12345678-abcd-1234-5678-123456789012.config' + ) + ).toBe(true) + expect( + (authHelper as any).testCredentialsConfigPath( + '/some/path/git-credentials-abcdef12-3456-7890-abcd-ef1234567890.config' + ) + ).toBe(true) + // Test invalid paths - expect((authHelper as any).testCredentialsConfigPath('/some/path/other-config.config')).toBe(false) - expect((authHelper as any).testCredentialsConfigPath('/some/path/git-credentials-invalid.config')).toBe(false) - expect((authHelper as any).testCredentialsConfigPath('/some/path/git-credentials-.config')).toBe(false) + expect( + (authHelper as any).testCredentialsConfigPath( + '/some/path/other-config.config' + ) + ).toBe(false) + expect( + (authHelper as any).testCredentialsConfigPath( + '/some/path/git-credentials-invalid.config' + ) + ).toBe(false) + expect( + (authHelper as any).testCredentialsConfigPath( + '/some/path/git-credentials-.config' + ) + ).toBe(false) expect((authHelper as any).testCredentialsConfigPath('')).toBe(false) }) }) @@ -890,7 +914,11 @@ async function setup(testName: string): Promise { } ), tryConfigUnsetValue: jest.fn( - async (key: string, value: string, globalConfig?: boolean): Promise => { + async ( + key: string, + value: string, + globalConfig?: boolean + ): Promise => { const configPath = globalConfig ? path.join(git.env['HOME'] || tempHomedir, '.gitconfig') : localGitConfigPath diff --git a/dist/index.js b/dist/index.js index 10eb642..bdc80bc 100644 --- a/dist/index.js +++ b/dist/index.js @@ -472,7 +472,7 @@ class GitAuthHelper { } } // SSH command - core.info("Removing SSH command configuration"); + core.info('Removing SSH command configuration'); yield this.removeGitConfig(SSH_COMMAND_KEY); yield this.removeSubmoduleGitConfig(SSH_COMMAND_KEY); }); @@ -485,13 +485,13 @@ class GitAuthHelper { return __awaiter(this, void 0, void 0, function* () { var _a; // Remove HTTP extra header - core.info("Removing HTTP extra header"); + core.info('Removing HTTP extra header'); yield this.removeGitConfig(this.tokenConfigKey); yield this.removeSubmoduleGitConfig(this.tokenConfigKey); // Collect credentials config paths that need to be removed const credentialsPaths = new Set(); // Remove includeIf entries that point to git-credentials-*.config files - core.info("Removing includeIf entries pointing to credentials config files"); + core.info('Removing includeIf entries pointing to credentials config files'); const mainCredentialsPaths = yield this.removeIncludeIfCredentials(); mainCredentialsPaths.forEach(path => credentialsPaths.add(path)); // Remove submodule includeIf entries that point to git-credentials-*.config files @@ -1060,7 +1060,10 @@ class GitCommandManager { if (output.exitCode !== 0) { return []; } - return output.stdout.trim().split('\n').filter(value => value.trim()); + return output.stdout + .trim() + .split('\n') + .filter(value => value.trim()); }); } tryGetConfigKeys(pattern, globalConfig, configFile) { @@ -1077,7 +1080,10 @@ class GitCommandManager { if (output.exitCode !== 0) { return []; } - return output.stdout.trim().split('\n').filter(key => key.trim()); + return output.stdout + .trim() + .split('\n') + .filter(key => key.trim()); }); } tryReset() { diff --git a/src/git-auth-helper.ts b/src/git-auth-helper.ts index 8bec327..18ad968 100644 --- a/src/git-auth-helper.ts +++ b/src/git-auth-helper.ts @@ -348,7 +348,9 @@ class GitAuthHelper { placeholderIndex < 0 || placeholderIndex != content.lastIndexOf(this.tokenPlaceholderConfigValue) ) { - throw new Error(`Unable to replace auth placeholder in ${credentialsConfigPath}`) + throw new Error( + `Unable to replace auth placeholder in ${credentialsConfigPath}` + ) } assert.ok(this.tokenConfigValue, 'tokenConfigValue is not defined') content = content.replace( @@ -445,7 +447,7 @@ class GitAuthHelper { } // SSH command - core.info("Removing SSH command configuration") + core.info('Removing SSH command configuration') await this.removeGitConfig(SSH_COMMAND_KEY) await this.removeSubmoduleGitConfig(SSH_COMMAND_KEY) } @@ -456,7 +458,7 @@ class GitAuthHelper { */ private async removeToken(): Promise { // Remove HTTP extra header - core.info("Removing HTTP extra header") + core.info('Removing HTTP extra header') await this.removeGitConfig(this.tokenConfigKey) await this.removeSubmoduleGitConfig(this.tokenConfigKey) @@ -464,14 +466,15 @@ class GitAuthHelper { const credentialsPaths = new Set() // Remove includeIf entries that point to git-credentials-*.config files - core.info("Removing includeIf entries pointing to credentials config files") + core.info('Removing includeIf entries pointing to credentials config files') const mainCredentialsPaths = await this.removeIncludeIfCredentials() mainCredentialsPaths.forEach(path => credentialsPaths.add(path)) // Remove submodule includeIf entries that point to git-credentials-*.config files const submoduleConfigPaths = await this.git.getSubmoduleConfigPaths(true) for (const configPath of submoduleConfigPaths) { - const submoduleCredentialsPaths = await this.removeIncludeIfCredentials(configPath) + const submoduleCredentialsPaths = + await this.removeIncludeIfCredentials(configPath) submoduleCredentialsPaths.forEach(path => credentialsPaths.add(path)) } @@ -491,7 +494,9 @@ class GitAuthHelper { ) } } else { - core.debug(`Skipping removal of credentials config '${credentialsPath}' - not under RUNNER_TEMP`) + core.debug( + `Skipping removal of credentials config '${credentialsPath}' - not under RUNNER_TEMP` + ) } } } @@ -528,13 +533,19 @@ class GitAuthHelper { * @param configPath Optional path to a specific git config file to operate on * @returns Array of unique credentials config file paths that were found and removed */ - private async removeIncludeIfCredentials(configPath?: string): Promise { + private async removeIncludeIfCredentials( + configPath?: string + ): Promise { const credentialsPaths = new Set() - + try { // Get all includeIf.gitdir keys - const keys = await this.git.tryGetConfigKeys('^includeIf\\.gitdir:', false, configPath) - + const keys = await this.git.tryGetConfigKeys( + '^includeIf\\.gitdir:', + false, + configPath + ) + for (const key of keys) { // Get all values for this key const values = await this.git.tryGetConfigValues(key, false, configPath) @@ -556,7 +567,7 @@ class GitAuthHelper { core.debug(`Error during includeIf cleanup: ${err}`) } } - + return Array.from(credentialsPaths) } diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts index 71a5e9e..a45e15a 100644 --- a/src/git-command-manager.ts +++ b/src/git-command-manager.ts @@ -61,11 +61,24 @@ export interface IGitCommandManager { tagExists(pattern: string): Promise tryClean(): Promise tryConfigUnset(configKey: string, globalConfig?: boolean): Promise - tryConfigUnsetValue(configKey: string, configValue: string, globalConfig?: boolean, configFile?: string): Promise + tryConfigUnsetValue( + configKey: string, + configValue: string, + globalConfig?: boolean, + configFile?: string + ): Promise tryDisableAutomaticGarbageCollection(): Promise tryGetFetchUrl(): Promise - tryGetConfigValues(configKey: string, globalConfig?: boolean, configFile?: string): Promise - tryGetConfigKeys(pattern: string, globalConfig?: boolean, configFile?: string): Promise + tryGetConfigValues( + configKey: string, + globalConfig?: boolean, + configFile?: string + ): Promise + tryGetConfigKeys( + pattern: string, + globalConfig?: boolean, + configFile?: string + ): Promise tryReset(): Promise version(): Promise } @@ -494,7 +507,7 @@ class GitCommandManager { args.push(globalConfig ? '--global' : '--local') } args.push('--unset', configKey, configValue) - + const output = await this.execGit(args, true) return output.exitCode === 0 } @@ -537,14 +550,17 @@ class GitCommandManager { 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()) + return output.stdout + .trim() + .split('\n') + .filter(value => value.trim()) } async tryGetConfigKeys( @@ -559,14 +575,17 @@ class GitCommandManager { 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()) + return output.stdout + .trim() + .split('\n') + .filter(key => key.trim()) } async tryReset(): Promise {