mirror of https://github.com/actions/checkout.git
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
|
||||||
|
|
|
@ -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