mirror of
				https://github.com/actions/checkout.git
				synced 2025-10-31 11:13:59 +08:00 
			
		
		
		
	Check git version before attempting to disable sparse-checkout (#1656)
				
					
				
			* Check git version before attempting to disable `sparse-checkout` * Bump `MinimumGitSparseCheckoutVersion` to 2.28 due to #1386 * Initial prep for release 4.1.3
This commit is contained in:
		 John Wesley Walker III
					John Wesley Walker III
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							8410ad0602
						
					
				
				
					commit
					cd7d8d697e
				
			| @@ -11,7 +11,9 @@ import {GitVersion} from './git-version' | ||||
|  | ||||
| // Auth header not supported before 2.9 | ||||
| // Wire protocol v2 not supported before 2.18 | ||||
| // sparse-checkout not [well-]supported before 2.28 (see https://github.com/actions/checkout/issues/1386) | ||||
| export const MinimumGitVersion = new GitVersion('2.18') | ||||
| export const MinimumGitSparseCheckoutVersion = new GitVersion('2.28') | ||||
|  | ||||
| export interface IGitCommandManager { | ||||
|   branchDelete(remote: boolean, branch: string): Promise<void> | ||||
| @@ -60,6 +62,7 @@ export interface IGitCommandManager { | ||||
|   tryDisableAutomaticGarbageCollection(): Promise<boolean> | ||||
|   tryGetFetchUrl(): Promise<string> | ||||
|   tryReset(): Promise<boolean> | ||||
|   version(): Promise<GitVersion> | ||||
| } | ||||
|  | ||||
| export async function createCommandManager( | ||||
| @@ -83,6 +86,7 @@ class GitCommandManager { | ||||
|   private lfs = false | ||||
|   private doSparseCheckout = false | ||||
|   private workingDirectory = '' | ||||
|   private gitVersion: GitVersion = new GitVersion() | ||||
|  | ||||
|   // Private constructor; use createCommandManager() | ||||
|   private constructor() {} | ||||
| @@ -480,6 +484,10 @@ class GitCommandManager { | ||||
|     return output.exitCode === 0 | ||||
|   } | ||||
|  | ||||
|   async version(): Promise<GitVersion> { | ||||
|     return this.gitVersion | ||||
|   } | ||||
|  | ||||
|   static async createCommandManager( | ||||
|     workingDirectory: string, | ||||
|     lfs: boolean, | ||||
| @@ -556,23 +564,23 @@ class GitCommandManager { | ||||
|  | ||||
|     // Git version | ||||
|     core.debug('Getting git version') | ||||
|     let gitVersion = new GitVersion() | ||||
|     this.gitVersion = new GitVersion() | ||||
|     let gitOutput = await this.execGit(['version']) | ||||
|     let stdout = gitOutput.stdout.trim() | ||||
|     if (!stdout.includes('\n')) { | ||||
|       const match = stdout.match(/\d+\.\d+(\.\d+)?/) | ||||
|       if (match) { | ||||
|         gitVersion = new GitVersion(match[0]) | ||||
|         this.gitVersion = new GitVersion(match[0]) | ||||
|       } | ||||
|     } | ||||
|     if (!gitVersion.isValid()) { | ||||
|     if (!this.gitVersion.isValid()) { | ||||
|       throw new Error('Unable to determine git version') | ||||
|     } | ||||
|  | ||||
|     // Minimum git version | ||||
|     if (!gitVersion.checkMinimum(MinimumGitVersion)) { | ||||
|     if (!this.gitVersion.checkMinimum(MinimumGitVersion)) { | ||||
|       throw new Error( | ||||
|         `Minimum required git version is ${MinimumGitVersion}. Your git ('${this.gitPath}') is ${gitVersion}` | ||||
|         `Minimum required git version is ${MinimumGitVersion}. Your git ('${this.gitPath}') is ${this.gitVersion}` | ||||
|       ) | ||||
|     } | ||||
|  | ||||
| @@ -606,16 +614,14 @@ class GitCommandManager { | ||||
|  | ||||
|     this.doSparseCheckout = doSparseCheckout | ||||
|     if (this.doSparseCheckout) { | ||||
|       // The `git sparse-checkout` command was introduced in Git v2.25.0 | ||||
|       const minimumGitSparseCheckoutVersion = new GitVersion('2.25') | ||||
|       if (!gitVersion.checkMinimum(minimumGitSparseCheckoutVersion)) { | ||||
|       if (!this.gitVersion.checkMinimum(MinimumGitSparseCheckoutVersion)) { | ||||
|         throw new Error( | ||||
|           `Minimum Git version required for sparse checkout is ${minimumGitSparseCheckoutVersion}. Your git ('${this.gitPath}') is ${gitVersion}` | ||||
|           `Minimum Git version required for sparse checkout is ${MinimumGitSparseCheckoutVersion}. Your git ('${this.gitPath}') is ${this.gitVersion}` | ||||
|         ) | ||||
|       } | ||||
|     } | ||||
|     // Set the user agent | ||||
|     const gitHttpUserAgent = `git/${gitVersion} (github-actions-checkout)` | ||||
|     const gitHttpUserAgent = `git/${this.gitVersion} (github-actions-checkout)` | ||||
|     core.debug(`Set git useragent to: ${gitHttpUserAgent}`) | ||||
|     this.gitEnv['GIT_HTTP_USER_AGENT'] = gitHttpUserAgent | ||||
|   } | ||||
|   | ||||
| @@ -9,7 +9,10 @@ import * as path from 'path' | ||||
| import * as refHelper from './ref-helper' | ||||
| import * as stateHelper from './state-helper' | ||||
| import * as urlHelper from './url-helper' | ||||
| import {IGitCommandManager} from './git-command-manager' | ||||
| import { | ||||
|   MinimumGitSparseCheckoutVersion, | ||||
|   IGitCommandManager | ||||
| } from './git-command-manager' | ||||
| import {IGitSourceSettings} from './git-source-settings' | ||||
|  | ||||
| export async function getSource(settings: IGitSourceSettings): Promise<void> { | ||||
| @@ -209,7 +212,11 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> { | ||||
|  | ||||
|     // Sparse checkout | ||||
|     if (!settings.sparseCheckout) { | ||||
|       await git.disableSparseCheckout() | ||||
|       let gitVersion = await git.version() | ||||
|       // no need to disable sparse-checkout if the installed git runtime doesn't even support it. | ||||
|       if (gitVersion.checkMinimum(MinimumGitSparseCheckoutVersion)) { | ||||
|         await git.disableSparseCheckout() | ||||
|       } | ||||
|     } else { | ||||
|       core.startGroup('Setting up sparse checkout') | ||||
|       if (settings.sparseCheckoutConeMode) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user