mirror of
				https://github.com/actions/checkout.git
				synced 2025-11-04 14:48:39 +08:00 
			
		
		
		
	Add support for reference repository parameter
This commit is contained in:
		
							parent
							
								
									96f53100ba
								
							
						
					
					
						commit
						e60e249777
					
				| 
						 | 
					@ -87,6 +87,11 @@ When Git 2.18 or higher is not in your PATH, falls back to the REST API to downl
 | 
				
			||||||
    # Default: 1
 | 
					    # Default: 1
 | 
				
			||||||
    fetch-depth: ''
 | 
					    fetch-depth: ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Path to a local bare git [reference repository to minimize network
 | 
				
			||||||
 | 
					    # usage](https://git-scm.com/docs/git-clone#Documentation/git-clone.txt---reference-if-ableltrepositorygt).
 | 
				
			||||||
 | 
					    # If the directory doesn't exists this option will ignore it and log a message.
 | 
				
			||||||
 | 
					    reference: ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Whether to download Git-LFS files
 | 
					    # Whether to download Git-LFS files
 | 
				
			||||||
    # Default: false
 | 
					    # Default: false
 | 
				
			||||||
    lfs: ''
 | 
					    lfs: ''
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -762,6 +762,7 @@ async function setup(testName: string): Promise<void> {
 | 
				
			||||||
    lfsInstall: jest.fn(),
 | 
					    lfsInstall: jest.fn(),
 | 
				
			||||||
    log1: jest.fn(),
 | 
					    log1: jest.fn(),
 | 
				
			||||||
    remoteAdd: jest.fn(),
 | 
					    remoteAdd: jest.fn(),
 | 
				
			||||||
 | 
					    referenceAdd: jest.fn(),
 | 
				
			||||||
    removeEnvironmentVariable: jest.fn((name: string) => delete git.env[name]),
 | 
					    removeEnvironmentVariable: jest.fn((name: string) => delete git.env[name]),
 | 
				
			||||||
    revParse: jest.fn(),
 | 
					    revParse: jest.fn(),
 | 
				
			||||||
    setEnvironmentVariable: jest.fn((name: string, value: string) => {
 | 
					    setEnvironmentVariable: jest.fn((name: string, value: string) => {
 | 
				
			||||||
| 
						 | 
					@ -818,7 +819,8 @@ async function setup(testName: string): Promise<void> {
 | 
				
			||||||
    sshStrict: true,
 | 
					    sshStrict: true,
 | 
				
			||||||
    workflowOrganizationId: 123456,
 | 
					    workflowOrganizationId: 123456,
 | 
				
			||||||
    setSafeDirectory: true,
 | 
					    setSafeDirectory: true,
 | 
				
			||||||
    githubServerUrl: githubServerUrl
 | 
					    githubServerUrl: githubServerUrl,
 | 
				
			||||||
 | 
					    reference: '/some/path'
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -477,6 +477,7 @@ async function setup(testName: string): Promise<void> {
 | 
				
			||||||
    lfsInstall: jest.fn(),
 | 
					    lfsInstall: jest.fn(),
 | 
				
			||||||
    log1: jest.fn(),
 | 
					    log1: jest.fn(),
 | 
				
			||||||
    remoteAdd: jest.fn(),
 | 
					    remoteAdd: jest.fn(),
 | 
				
			||||||
 | 
					    referenceAdd: jest.fn(),
 | 
				
			||||||
    removeEnvironmentVariable: jest.fn(),
 | 
					    removeEnvironmentVariable: jest.fn(),
 | 
				
			||||||
    revParse: jest.fn(),
 | 
					    revParse: jest.fn(),
 | 
				
			||||||
    setEnvironmentVariable: jest.fn(),
 | 
					    setEnvironmentVariable: jest.fn(),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,6 +88,7 @@ describe('input-helper tests', () => {
 | 
				
			||||||
    expect(settings.repositoryOwner).toBe('some-owner')
 | 
					    expect(settings.repositoryOwner).toBe('some-owner')
 | 
				
			||||||
    expect(settings.repositoryPath).toBe(gitHubWorkspace)
 | 
					    expect(settings.repositoryPath).toBe(gitHubWorkspace)
 | 
				
			||||||
    expect(settings.setSafeDirectory).toBe(true)
 | 
					    expect(settings.setSafeDirectory).toBe(true)
 | 
				
			||||||
 | 
					    expect(settings.reference).toBe(undefined)
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  it('qualifies ref', async () => {
 | 
					  it('qualifies ref', async () => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,6 +65,12 @@ inputs:
 | 
				
			||||||
  fetch-depth:
 | 
					  fetch-depth:
 | 
				
			||||||
    description: 'Number of commits to fetch. 0 indicates all history for all branches and tags.'
 | 
					    description: 'Number of commits to fetch. 0 indicates all history for all branches and tags.'
 | 
				
			||||||
    default: 1
 | 
					    default: 1
 | 
				
			||||||
 | 
					  reference:
 | 
				
			||||||
 | 
					    required: false
 | 
				
			||||||
 | 
					    description: >
 | 
				
			||||||
 | 
					      Path to a local bare git [reference repository to minimize network usage](https://git-scm.com/docs/git-clone#Documentation/git-clone.txt---reference-if-ableltrepositorygt).
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      If the directory doesn't exists this option will ignore it and log a message.
 | 
				
			||||||
  lfs:
 | 
					  lfs:
 | 
				
			||||||
    description: 'Whether to download Git-LFS files'
 | 
					    description: 'Whether to download Git-LFS files'
 | 
				
			||||||
    default: false
 | 
					    default: false
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										20
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| 
						 | 
					@ -729,6 +729,13 @@ class GitCommandManager {
 | 
				
			||||||
            yield this.execGit(['remote', 'add', remoteName, remoteUrl]);
 | 
					            yield this.execGit(['remote', 'add', remoteName, remoteUrl]);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    referenceAdd(alternateObjects) {
 | 
				
			||||||
 | 
					        return __awaiter(this, void 0, void 0, function* () {
 | 
				
			||||||
 | 
					            const alternatePath = path.join(this.workingDirectory, '.git/objects/info/alternates');
 | 
				
			||||||
 | 
					            core.info(`Adding a git alternate to reference repo at ${alternateObjects}`);
 | 
				
			||||||
 | 
					            yield fs.promises.writeFile(alternatePath, `${alternateObjects}\n`);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    removeEnvironmentVariable(name) {
 | 
					    removeEnvironmentVariable(name) {
 | 
				
			||||||
        delete this.gitEnv[name];
 | 
					        delete this.gitEnv[name];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -1208,6 +1215,17 @@ function getSource(settings) {
 | 
				
			||||||
                yield git.init();
 | 
					                yield git.init();
 | 
				
			||||||
                yield git.remoteAdd('origin', repositoryUrl);
 | 
					                yield git.remoteAdd('origin', repositoryUrl);
 | 
				
			||||||
                core.endGroup();
 | 
					                core.endGroup();
 | 
				
			||||||
 | 
					                if (settings.reference !== undefined) {
 | 
				
			||||||
 | 
					                    const alternateObjects = path.join(settings.reference, '/objects');
 | 
				
			||||||
 | 
					                    if (fsHelper.directoryExistsSync(alternateObjects, false)) {
 | 
				
			||||||
 | 
					                        core.startGroup('Adding a reference repository');
 | 
				
			||||||
 | 
					                        yield git.referenceAdd(alternateObjects);
 | 
				
			||||||
 | 
					                        core.endGroup();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else {
 | 
				
			||||||
 | 
					                        core.warning(`Reference repository was specified, but directory ${alternateObjects} does not exists`);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            // Disable automatic garbage collection
 | 
					            // Disable automatic garbage collection
 | 
				
			||||||
            core.startGroup('Disabling automatic garbage collection');
 | 
					            core.startGroup('Disabling automatic garbage collection');
 | 
				
			||||||
| 
						 | 
					@ -1768,6 +1786,8 @@ function getInputs() {
 | 
				
			||||||
        // Determine the GitHub URL that the repository is being hosted from
 | 
					        // Determine the GitHub URL that the repository is being hosted from
 | 
				
			||||||
        result.githubServerUrl = core.getInput('github-server-url');
 | 
					        result.githubServerUrl = core.getInput('github-server-url');
 | 
				
			||||||
        core.debug(`GitHub Host URL = ${result.githubServerUrl}`);
 | 
					        core.debug(`GitHub Host URL = ${result.githubServerUrl}`);
 | 
				
			||||||
 | 
					        result.reference = core.getInput('reference');
 | 
				
			||||||
 | 
					        core.debug(`Reference repository = ${result.reference}`);
 | 
				
			||||||
        return result;
 | 
					        return result;
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,6 +43,7 @@ export interface IGitCommandManager {
 | 
				
			||||||
  lfsInstall(): Promise<void>
 | 
					  lfsInstall(): Promise<void>
 | 
				
			||||||
  log1(format?: string): Promise<string>
 | 
					  log1(format?: string): Promise<string>
 | 
				
			||||||
  remoteAdd(remoteName: string, remoteUrl: string): Promise<void>
 | 
					  remoteAdd(remoteName: string, remoteUrl: string): Promise<void>
 | 
				
			||||||
 | 
					  referenceAdd(reference: string): Promise<void>
 | 
				
			||||||
  removeEnvironmentVariable(name: string): void
 | 
					  removeEnvironmentVariable(name: string): void
 | 
				
			||||||
  revParse(ref: string): Promise<string>
 | 
					  revParse(ref: string): Promise<string>
 | 
				
			||||||
  setEnvironmentVariable(name: string, value: string): void
 | 
					  setEnvironmentVariable(name: string, value: string): void
 | 
				
			||||||
| 
						 | 
					@ -343,6 +344,15 @@ class GitCommandManager {
 | 
				
			||||||
    await this.execGit(['remote', 'add', remoteName, remoteUrl])
 | 
					    await this.execGit(['remote', 'add', remoteName, remoteUrl])
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  async referenceAdd(alternateObjects: string): Promise<void> {
 | 
				
			||||||
 | 
					    const alternatePath = path.join(
 | 
				
			||||||
 | 
					      this.workingDirectory,
 | 
				
			||||||
 | 
					      '.git/objects/info/alternates'
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    core.info(`Adding a git alternate to reference repo at ${alternateObjects}`)
 | 
				
			||||||
 | 
					    await fs.promises.writeFile(alternatePath, `${alternateObjects}\n`)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  removeEnvironmentVariable(name: string): void {
 | 
					  removeEnvironmentVariable(name: string): void {
 | 
				
			||||||
    delete this.gitEnv[name]
 | 
					    delete this.gitEnv[name]
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,6 +110,18 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
 | 
				
			||||||
      await git.init()
 | 
					      await git.init()
 | 
				
			||||||
      await git.remoteAdd('origin', repositoryUrl)
 | 
					      await git.remoteAdd('origin', repositoryUrl)
 | 
				
			||||||
      core.endGroup()
 | 
					      core.endGroup()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (settings.reference !== undefined) {
 | 
				
			||||||
 | 
					        const alternateObjects = path.join(settings.reference, '/objects')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (fsHelper.directoryExistsSync(alternateObjects, false)) {
 | 
				
			||||||
 | 
					          core.startGroup('Adding a reference repository')
 | 
				
			||||||
 | 
					          await git.referenceAdd(alternateObjects)
 | 
				
			||||||
 | 
					          core.endGroup()
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          core.warning(`Reference repository was specified, but directory ${alternateObjects} does not exists`);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Disable automatic garbage collection
 | 
					    // Disable automatic garbage collection
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,6 +44,11 @@ export interface IGitSourceSettings {
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  fetchDepth: number
 | 
					  fetchDepth: number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * The local reference repository
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  reference: string | undefined
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * Indicates whether to fetch LFS objects
 | 
					   * Indicates whether to fetch LFS objects
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -141,5 +141,8 @@ export async function getInputs(): Promise<IGitSourceSettings> {
 | 
				
			||||||
  result.githubServerUrl = core.getInput('github-server-url')
 | 
					  result.githubServerUrl = core.getInput('github-server-url')
 | 
				
			||||||
  core.debug(`GitHub Host URL = ${result.githubServerUrl}`)
 | 
					  core.debug(`GitHub Host URL = ${result.githubServerUrl}`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  result.reference = core.getInput('reference')
 | 
				
			||||||
 | 
					  core.debug(`Reference repository = ${result.reference}`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return result
 | 
					  return result
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user