Compare commits

...

4 Commits

Author SHA1 Message Date
Nacho Orlandoni
98fbe9c947
Merge 65f77605c087408bbcd9625573126b12c4059ebf into 11bd71901bbe5b1630ceea73d27597364c9af683 2024-10-30 03:05:09 +00:00
John Wesley Walker III
11bd71901b
Prepare 4.2.2 Release (#1953)
Some checks failed
Check dist / check-dist (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Licensed / Check licenses (push) Has been cancelled
Build and Test / build (push) Has been cancelled
Build and Test / test (macos-latest) (push) Has been cancelled
Build and Test / test (ubuntu-latest) (push) Has been cancelled
Build and Test / test (windows-latest) (push) Has been cancelled
Build and Test / test-proxy (push) Has been cancelled
Build and Test / test-bypass-proxy (push) Has been cancelled
Build and Test / test-git-container (push) Has been cancelled
Build and Test / test-output (push) Has been cancelled
* Prepare 4.2.2 Release

---------

Co-authored-by: Josh Gross <joshmgross@github.com>
2024-10-23 16:24:28 +02:00
John Wesley Walker III
e3d2460bbb
Expand unit test coverage (#1946) 2024-10-23 15:59:08 +02:00
Nacho Orlandoni
65f77605c0
Reference support
* Add support for reference repository parameter

---------

Co-authored-by: Diego Dompe <ddompe@gmail.com>
2023-10-28 11:30:25 -04:00
14 changed files with 115 additions and 4 deletions

View File

@ -1,5 +1,9 @@
# Changelog # Changelog
## v4.2.2
* `url-helper.ts` now leverages well-known environment variables by @jww3 in https://github.com/actions/checkout/pull/1941
* Expand unit test coverage for `isGhes` by @jww3 in https://github.com/actions/checkout/pull/1946
## v4.2.1 ## v4.2.1
* Check out other refs/* by commit if provided, fall back to ref by @orhantoy in https://github.com/actions/checkout/pull/1924 * Check out other refs/* by commit if provided, fall back to ref by @orhantoy in https://github.com/actions/checkout/pull/1924

View File

@ -103,6 +103,11 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
# Default: true # Default: true
show-progress: '' show-progress: ''
# 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: ''

View File

@ -763,6 +763,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) => {
@ -824,7 +825,8 @@ async function setup(testName: string): Promise<void> {
sshUser: '', sshUser: '',
workflowOrganizationId: 123456, workflowOrganizationId: 123456,
setSafeDirectory: true, setSafeDirectory: true,
githubServerUrl: githubServerUrl githubServerUrl: githubServerUrl,
reference: '/some/path'
} }
} }

View File

@ -478,6 +478,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(),

View File

@ -91,6 +91,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 () => {

View File

@ -24,13 +24,50 @@ describe('getServerUrl tests', () => {
}) })
describe('isGhes tests', () => { describe('isGhes tests', () => {
const pristineEnv = process.env
beforeEach(() => {
jest.resetModules()
process.env = {...pristineEnv}
})
afterAll(() => {
process.env = pristineEnv
})
it('basics', async () => { it('basics', async () => {
delete process.env['GITHUB_SERVER_URL']
expect(urlHelper.isGhes()).toBeFalsy() expect(urlHelper.isGhes()).toBeFalsy()
expect(urlHelper.isGhes('https://github.com')).toBeFalsy() expect(urlHelper.isGhes('https://github.com')).toBeFalsy()
expect(urlHelper.isGhes('https://contoso.ghe.com')).toBeFalsy() expect(urlHelper.isGhes('https://contoso.ghe.com')).toBeFalsy()
expect(urlHelper.isGhes('https://test.github.localhost')).toBeFalsy() expect(urlHelper.isGhes('https://test.github.localhost')).toBeFalsy()
expect(urlHelper.isGhes('https://src.onpremise.fabrikam.com')).toBeTruthy() expect(urlHelper.isGhes('https://src.onpremise.fabrikam.com')).toBeTruthy()
}) })
it('returns false when the GITHUB_SERVER_URL environment variable is not defined', async () => {
delete process.env['GITHUB_SERVER_URL']
expect(urlHelper.isGhes()).toBeFalsy()
})
it('returns false when the GITHUB_SERVER_URL environment variable is set to github.com', async () => {
process.env['GITHUB_SERVER_URL'] = 'https://github.com'
expect(urlHelper.isGhes()).toBeFalsy()
})
it('returns false when the GITHUB_SERVER_URL environment variable is set to a GitHub Enterprise Cloud-style URL', async () => {
process.env['GITHUB_SERVER_URL'] = 'https://contoso.ghe.com'
expect(urlHelper.isGhes()).toBeFalsy()
})
it('returns false when the GITHUB_SERVER_URL environment variable has a .localhost suffix', async () => {
process.env['GITHUB_SERVER_URL'] = 'https://mock-github.localhost'
expect(urlHelper.isGhes()).toBeFalsy()
})
it('returns true when the GITHUB_SERVER_URL environment variable is set to some other URL', async () => {
process.env['GITHUB_SERVER_URL'] = 'https://src.onpremise.fabrikam.com'
expect(urlHelper.isGhes()).toBeTruthy()
})
}) })
describe('getServerApiUrl tests', () => { describe('getServerApiUrl tests', () => {

View File

@ -80,6 +80,12 @@ inputs:
show-progress: show-progress:
description: 'Whether to show progress status output when fetching.' description: 'Whether to show progress status output when fetching.'
default: true default: true
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
View File

@ -748,6 +748,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];
} }
@ -1239,6 +1246,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');
@ -1831,6 +1849,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;
}); });
} }

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "checkout", "name": "checkout",
"version": "4.2.1", "version": "4.2.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "checkout", "name": "checkout",
"version": "4.2.1", "version": "4.2.2",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/core": "^1.10.1", "@actions/core": "^1.10.1",

View File

@ -1,6 +1,6 @@
{ {
"name": "checkout", "name": "checkout",
"version": "4.2.1", "version": "4.2.2",
"description": "checkout action", "description": "checkout action",
"main": "lib/main.js", "main": "lib/main.js",
"scripts": { "scripts": {

View File

@ -48,6 +48,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
@ -364,6 +365,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]
} }

View File

@ -113,6 +113,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

View File

@ -49,6 +49,11 @@ export interface IGitSourceSettings {
*/ */
fetchDepth: number fetchDepth: number
/**
* The local reference repository
*/
reference: string | undefined
/** /**
* Fetch tags, even if fetchDepth > 0 (default: false) * Fetch tags, even if fetchDepth > 0 (default: false)
*/ */
@ -59,6 +64,11 @@ export interface IGitSourceSettings {
*/ */
showProgress: boolean showProgress: boolean
/**
* The local reference repository
*/
reference: string | undefined
/** /**
* Indicates whether to fetch LFS objects * Indicates whether to fetch LFS objects
*/ */

View File

@ -161,5 +161,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
} }