mirror of
				https://github.com/actions/checkout.git
				synced 2025-10-31 11:13:59 +08:00 
			
		
		
		
	set insteadOf url for org-id (#621)
This commit is contained in:
		| @@ -37,7 +37,7 @@ class GitAuthHelper { | ||||
|   private readonly tokenConfigValue: string | ||||
|   private readonly tokenPlaceholderConfigValue: string | ||||
|   private readonly insteadOfKey: string | ||||
|   private readonly insteadOfValue: string | ||||
|   private readonly insteadOfValues: string[] = [] | ||||
|   private sshCommand = '' | ||||
|   private sshKeyPath = '' | ||||
|   private sshKnownHostsPath = '' | ||||
| @@ -45,7 +45,7 @@ class GitAuthHelper { | ||||
|  | ||||
|   constructor( | ||||
|     gitCommandManager: IGitCommandManager, | ||||
|     gitSourceSettings?: IGitSourceSettings | ||||
|     gitSourceSettings: IGitSourceSettings | undefined | ||||
|   ) { | ||||
|     this.git = gitCommandManager | ||||
|     this.settings = gitSourceSettings || (({} as unknown) as IGitSourceSettings) | ||||
| @@ -63,7 +63,12 @@ class GitAuthHelper { | ||||
|  | ||||
|     // Instead of SSH URL | ||||
|     this.insteadOfKey = `url.${serverUrl.origin}/.insteadOf` // "origin" is SCHEME://HOSTNAME[:PORT] | ||||
|     this.insteadOfValue = `git@${serverUrl.hostname}:` | ||||
|     this.insteadOfValues.push(`git@${serverUrl.hostname}:`) | ||||
|     if (this.settings.workflowOrganizationId) { | ||||
|       this.insteadOfValues.push( | ||||
|         `org-${this.settings.workflowOrganizationId}@github.com:` | ||||
|       ) | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   async configureAuth(): Promise<void> { | ||||
| @@ -118,7 +123,9 @@ class GitAuthHelper { | ||||
|       // Configure HTTPS instead of SSH | ||||
|       await this.git.tryConfigUnset(this.insteadOfKey, true) | ||||
|       if (!this.settings.sshKey) { | ||||
|         await this.git.config(this.insteadOfKey, this.insteadOfValue, true) | ||||
|         for (const insteadOfValue of this.insteadOfValues) { | ||||
|           await this.git.config(this.insteadOfKey, insteadOfValue, true, true) | ||||
|         } | ||||
|       } | ||||
|     } catch (err) { | ||||
|       // Unset in case somehow written to the real global config | ||||
| @@ -159,10 +166,12 @@ class GitAuthHelper { | ||||
|         ) | ||||
|       } else { | ||||
|         // Configure HTTPS instead of SSH | ||||
|         await this.git.submoduleForeach( | ||||
|           `git config --local '${this.insteadOfKey}' '${this.insteadOfValue}'`, | ||||
|           this.settings.nestedSubmodules | ||||
|         ) | ||||
|         for (const insteadOfValue of this.insteadOfValues) { | ||||
|           await this.git.submoduleForeach( | ||||
|             `git config --local --add '${this.insteadOfKey}' '${insteadOfValue}'`, | ||||
|             this.settings.nestedSubmodules | ||||
|           ) | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   | ||||
| @@ -21,7 +21,8 @@ export interface IGitCommandManager { | ||||
|   config( | ||||
|     configKey: string, | ||||
|     configValue: string, | ||||
|     globalConfig?: boolean | ||||
|     globalConfig?: boolean, | ||||
|     add?: boolean | ||||
|   ): Promise<void> | ||||
|   configExists(configKey: string, globalConfig?: boolean): Promise<boolean> | ||||
|   fetch(refSpec: string[], fetchDepth?: number): Promise<void> | ||||
| @@ -140,14 +141,15 @@ class GitCommandManager { | ||||
|   async config( | ||||
|     configKey: string, | ||||
|     configValue: string, | ||||
|     globalConfig?: boolean | ||||
|     globalConfig?: boolean, | ||||
|     add?: boolean | ||||
|   ): Promise<void> { | ||||
|     await this.execGit([ | ||||
|       'config', | ||||
|       globalConfig ? '--global' : '--local', | ||||
|       configKey, | ||||
|       configValue | ||||
|     ]) | ||||
|     const args: string[] = ['config', globalConfig ? '--global' : '--local'] | ||||
|     if (add) { | ||||
|       args.push('--add') | ||||
|     } | ||||
|     args.push(...[configKey, configValue]) | ||||
|     await this.execGit(args) | ||||
|   } | ||||
|  | ||||
|   async configExists( | ||||
|   | ||||
| @@ -73,4 +73,9 @@ export interface IGitSourceSettings { | ||||
|    * Indicates whether to persist the credentials on disk to enable scripting authenticated git commands | ||||
|    */ | ||||
|   persistCredentials: boolean | ||||
|  | ||||
|   /** | ||||
|    * Organization ID for the currently running workflow (used for auth settings) | ||||
|    */ | ||||
|   workflowOrganizationId: number | undefined | ||||
| } | ||||
|   | ||||
| @@ -2,9 +2,10 @@ import * as core from '@actions/core' | ||||
| import * as fsHelper from './fs-helper' | ||||
| import * as github from '@actions/github' | ||||
| import * as path from 'path' | ||||
| import * as workflowContextHelper from './workflow-context-helper' | ||||
| import {IGitSourceSettings} from './git-source-settings' | ||||
|  | ||||
| export function getInputs(): IGitSourceSettings { | ||||
| export async function getInputs(): Promise<IGitSourceSettings> { | ||||
|   const result = ({} as unknown) as IGitSourceSettings | ||||
|  | ||||
|   // GitHub workspace | ||||
| @@ -118,5 +119,8 @@ export function getInputs(): IGitSourceSettings { | ||||
|   result.persistCredentials = | ||||
|     (core.getInput('persist-credentials') || 'false').toUpperCase() === 'TRUE' | ||||
|  | ||||
|   // Workflow organization ID | ||||
|   result.workflowOrganizationId = await workflowContextHelper.getOrganizationId() | ||||
|  | ||||
|   return result | ||||
| } | ||||
|   | ||||
| @@ -7,7 +7,7 @@ import * as stateHelper from './state-helper' | ||||
|  | ||||
| async function run(): Promise<void> { | ||||
|   try { | ||||
|     const sourceSettings = inputHelper.getInputs() | ||||
|     const sourceSettings = await inputHelper.getInputs() | ||||
|  | ||||
|     try { | ||||
|       // Register problem matcher | ||||
|   | ||||
							
								
								
									
										30
									
								
								src/workflow-context-helper.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/workflow-context-helper.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| import * as core from '@actions/core' | ||||
| import * as fs from 'fs' | ||||
|  | ||||
| /** | ||||
|  * Gets the organization ID of the running workflow or undefined if the value cannot be loaded from the GITHUB_EVENT_PATH | ||||
|  */ | ||||
| export async function getOrganizationId(): Promise<number | undefined> { | ||||
|   try { | ||||
|     const eventPath = process.env.GITHUB_EVENT_PATH | ||||
|     if (!eventPath) { | ||||
|       core.debug(`GITHUB_EVENT_PATH is not defined`) | ||||
|       return | ||||
|     } | ||||
|  | ||||
|     const content = await fs.promises.readFile(eventPath, {encoding: 'utf8'}) | ||||
|     const event = JSON.parse(content) | ||||
|     const id = event?.repository?.owner?.id | ||||
|     if (typeof id !== 'number') { | ||||
|       core.debug('Repository owner ID not found within GITHUB event info') | ||||
|       return | ||||
|     } | ||||
|  | ||||
|     return id as number | ||||
|   } catch (err) { | ||||
|     core.debug( | ||||
|       `Unable to load organization ID from GITHUB_EVENT_PATH: ${(err as any) | ||||
|         .message || err}` | ||||
|     ) | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 eric sciple
					eric sciple