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

Add objectFormat setting to allow init()ing a repo with sha256 #1945

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
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
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,11 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
# running from unless specified. Example URLs are https://github.com or
# https://my-ghes-server.example.com
github-server-url: ''

# Use the given object format when creating local repository. Specifically, use
# 'sha256' to checkout a SHA-256 repository.
# Default: null
object-format: ''
```
<!-- end usage -->

Expand All @@ -144,6 +149,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
- [Checkout pull request on closed event](#Checkout-pull-request-on-closed-event)
- [Push a commit using the built-in token](#Push-a-commit-using-the-built-in-token)
- [Push a commit to a PR using the built-in token](#Push-a-commit-to-a-PR-using-the-built-in-token)
- [Checkout SHA-256 repository](#checkout-sha-256-repository)

## Fetch only the root files

Expand Down Expand Up @@ -323,6 +329,14 @@ permissions:
contents: read
```

## Checkout SHA-256 repository

```yaml
- uses: actions/checkout@v4
with:
object-format: sha256
```

# License

The scripts and documentation in this project are released under the [MIT License](LICENSE)
3 changes: 2 additions & 1 deletion __test__/git-auth-helper.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -824,7 +824,8 @@ async function setup(testName: string): Promise<void> {
sshUser: '',
workflowOrganizationId: 123456,
setSafeDirectory: true,
githubServerUrl: githubServerUrl
githubServerUrl: githubServerUrl,
objectFormat: undefined
}
}

Expand Down
21 changes: 21 additions & 0 deletions __test__/git-command-manager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -375,4 +375,25 @@ describe('Test fetchDepth and fetchTags options', () => {
expect.any(Object)
)
})

it('should call execGit with the correct arguments when sha256 is used', async () => {
jest.spyOn(exec, 'exec').mockImplementation(mockExec)

const workingDirectory = 'test'
const lfs = false
const doSparseCheckout = false
git = await commandManager.createCommandManager(
workingDirectory,
lfs,
doSparseCheckout
)

await git.init({objectFormat: 'sha256'})

expect(mockExec).toHaveBeenCalledWith(
expect.any(String),
['init', '--object-format=sha256', 'test'],
expect.any(Object)
)
})
})
5 changes: 5 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,11 @@ inputs:
github-server-url:
description: The base URL for the GitHub instance that you are trying to clone from, will use environment defaults to fetch from the same instance that the workflow is running from unless specified. Example URLs are https://github.com or https://my-ghes-server.example.com
required: false
object-format:
description: >
Use the given object format when creating local repository. Specifically, use
'sha256' to checkout a SHA-256 repository.
default: null
outputs:
ref:
description: 'The branch, tag or SHA that was checked out'
Expand Down
18 changes: 15 additions & 3 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -709,9 +709,13 @@ class GitCommandManager {
getWorkingDirectory() {
return this.workingDirectory;
}
init() {
init(options) {
return __awaiter(this, void 0, void 0, function* () {
yield this.execGit(['init', this.workingDirectory]);
yield this.execGit([
'init',
...((options === null || options === void 0 ? void 0 : options.objectFormat) ? [`--object-format=${options.objectFormat}`] : []),
this.workingDirectory
]);
});
}
isDetached() {
Expand Down Expand Up @@ -1236,7 +1240,7 @@ function getSource(settings) {
// Initialize the repository
if (!fsHelper.directoryExistsSync(path.join(settings.repositoryPath, '.git'))) {
core.startGroup('Initializing the repository');
yield git.init();
yield git.init({ objectFormat: settings.objectFormat });
yield git.remoteAdd('origin', repositoryUrl);
core.endGroup();
}
Expand Down Expand Up @@ -1831,6 +1835,14 @@ 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}`);
// Object format
const objectFormat = core.getInput('object-format');
if (objectFormat) {
if (objectFormat != 'sha1' && objectFormat != 'sha256') {
throw Error(`Invalid object format '${objectFormat}'`);
}
result.objectFormat = objectFormat;
}
return result;
});
}
Expand Down
12 changes: 9 additions & 3 deletions src/git-command-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export interface IGitCommandManager {
): Promise<void>
getDefaultBranch(repositoryUrl: string): Promise<string>
getWorkingDirectory(): string
init(): Promise<void>
init(options?: {objectFormat?: string}): Promise<void>
isDetached(): Promise<boolean>
lfsFetch(ref: string): Promise<void>
lfsInstall(): Promise<void>
Expand Down Expand Up @@ -327,8 +327,14 @@ class GitCommandManager {
return this.workingDirectory
}

async init(): Promise<void> {
await this.execGit(['init', this.workingDirectory])
async init(options?: {objectFormat?: string}): Promise<void> {
await this.execGit([
'init',
...(options?.objectFormat
? [`--object-format=${options.objectFormat}`]
: []),
this.workingDirectory
])
}

async isDetached(): Promise<boolean> {
Expand Down
2 changes: 1 addition & 1 deletion src/git-source-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
!fsHelper.directoryExistsSync(path.join(settings.repositoryPath, '.git'))
) {
core.startGroup('Initializing the repository')
await git.init()
await git.init({objectFormat: settings.objectFormat})
await git.remoteAdd('origin', repositoryUrl)
core.endGroup()
}
Expand Down
5 changes: 5 additions & 0 deletions src/git-source-settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,9 @@ export interface IGitSourceSettings {
* User override on the GitHub Server/Host URL that hosts the repository to be cloned
*/
githubServerUrl: string | undefined

/**
* Object format used for the repo, if it is not default
*/
objectFormat: 'sha1' | 'sha256' | undefined
}
9 changes: 9 additions & 0 deletions src/input-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -161,5 +161,14 @@ export async function getInputs(): Promise<IGitSourceSettings> {
result.githubServerUrl = core.getInput('github-server-url')
core.debug(`GitHub Host URL = ${result.githubServerUrl}`)

// Object format
const objectFormat = core.getInput('object-format')
if (objectFormat) {
if (objectFormat != 'sha1' && objectFormat != 'sha256') {
throw Error(`Invalid object format '${objectFormat}'`)
}
result.objectFormat = objectFormat
}

return result
}