Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support --reference to local repository #1526

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Reference support
* Add support for reference repository parameter

---------

Co-authored-by: Diego Dompe <ddompe@gmail.com>
  • Loading branch information
IOrlandoni and ddompe authored Oct 28, 2023
commit 65f77605c087408bbcd9625573126b12c4059ebf
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -98,6 +98,11 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
# Default: true
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
# Default: false
lfs: ''
4 changes: 3 additions & 1 deletion __test__/git-auth-helper.test.ts
Original file line number Diff line number Diff line change
@@ -762,6 +762,7 @@ async function setup(testName: string): Promise<void> {
lfsInstall: jest.fn(),
log1: jest.fn(),
remoteAdd: jest.fn(),
referenceAdd: jest.fn(),
removeEnvironmentVariable: jest.fn((name: string) => delete git.env[name]),
revParse: jest.fn(),
setEnvironmentVariable: jest.fn((name: string, value: string) => {
@@ -821,7 +822,8 @@ async function setup(testName: string): Promise<void> {
sshStrict: true,
workflowOrganizationId: 123456,
setSafeDirectory: true,
githubServerUrl: githubServerUrl
githubServerUrl: githubServerUrl,
reference: '/some/path'
}
}

1 change: 1 addition & 0 deletions __test__/git-directory-helper.test.ts
Original file line number Diff line number Diff line change
@@ -477,6 +477,7 @@ async function setup(testName: string): Promise<void> {
lfsInstall: jest.fn(),
log1: jest.fn(),
remoteAdd: jest.fn(),
referenceAdd: jest.fn(),
removeEnvironmentVariable: jest.fn(),
revParse: jest.fn(),
setEnvironmentVariable: jest.fn(),
1 change: 1 addition & 0 deletions __test__/input-helper.test.ts
Original file line number Diff line number Diff line change
@@ -91,6 +91,7 @@ describe('input-helper tests', () => {
expect(settings.repositoryOwner).toBe('some-owner')
expect(settings.repositoryPath).toBe(gitHubWorkspace)
expect(settings.setSafeDirectory).toBe(true)
expect(settings.reference).toBe(undefined)
})

it('qualifies ref', async () => {
6 changes: 6 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
@@ -76,6 +76,12 @@ inputs:
show-progress:
description: 'Whether to show progress status output when fetching.'
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:
description: 'Whether to download Git-LFS files'
default: false
20 changes: 20 additions & 0 deletions dist/index.js
Original file line number Diff line number Diff line change
@@ -732,6 +732,13 @@ class GitCommandManager {
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) {
delete this.gitEnv[name];
}
@@ -1211,6 +1218,17 @@ function getSource(settings) {
yield git.init();
yield git.remoteAdd('origin', repositoryUrl);
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
core.startGroup('Disabling automatic garbage collection');
@@ -1790,6 +1808,8 @@ function getInputs() {
// Determine the GitHub URL that the repository is being hosted from
result.githubServerUrl = core.getInput('github-server-url');
core.debug(`GitHub Host URL = ${result.githubServerUrl}`);
result.reference = core.getInput('reference');
core.debug(`Reference repository = ${result.reference}`);
return result;
});
}
10 changes: 10 additions & 0 deletions src/git-command-manager.ts
Original file line number Diff line number Diff line change
@@ -45,6 +45,7 @@ export interface IGitCommandManager {
lfsInstall(): Promise<void>
log1(format?: string): Promise<string>
remoteAdd(remoteName: string, remoteUrl: string): Promise<void>
referenceAdd(reference: string): Promise<void>
removeEnvironmentVariable(name: string): void
revParse(ref: string): Promise<string>
setEnvironmentVariable(name: string, value: string): void
@@ -353,6 +354,15 @@ class GitCommandManager {
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 {
delete this.gitEnv[name]
}
12 changes: 12 additions & 0 deletions src/git-source-provider.ts
Original file line number Diff line number Diff line change
@@ -110,6 +110,18 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
await git.init()
await git.remoteAdd('origin', repositoryUrl)
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
10 changes: 10 additions & 0 deletions src/git-source-settings.ts
Original file line number Diff line number Diff line change
@@ -49,6 +49,11 @@ export interface IGitSourceSettings {
*/
fetchDepth: number

/**
* The local reference repository
*/
reference: string | undefined

/**
* Fetch tags, even if fetchDepth > 0 (default: false)
*/
@@ -59,6 +64,11 @@ export interface IGitSourceSettings {
*/
showProgress: boolean

/**
* The local reference repository
*/
reference: string | undefined

/**
* Indicates whether to fetch LFS objects
*/
3 changes: 3 additions & 0 deletions src/input-helper.ts
Original file line number Diff line number Diff line change
@@ -159,5 +159,8 @@ export async function getInputs(): Promise<IGitSourceSettings> {
result.githubServerUrl = core.getInput('github-server-url')
core.debug(`GitHub Host URL = ${result.githubServerUrl}`)

result.reference = core.getInput('reference')
core.debug(`Reference repository = ${result.reference}`)

return result
}