9 files changed +81
-8
lines changed Original file line number Diff line number Diff line change @@ -126,6 +126,11 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
126
126
# running from unless specified. Example URLs are https://github.com or
127
127
# https://my-ghes-server.example.com
128
128
github-server-url : ' '
129
+
130
+ # Use the given object format when creating local repository. Specifically, use
131
+ # 'sha256' to checkout a SHA-256 repository.
132
+ # Default: null
133
+ object-format : ' '
129
134
` ` `
130
135
<!-- end usage -->
131
136
@@ -144,6 +149,7 @@ Please refer to the [release page](https://github.com/actions/checkout/releases/
144
149
- [Checkout pull request on closed event](#Checkout-pull-request-on-closed-event)
145
150
- [Push a commit using the built-in token](#Push-a-commit-using-the-built-in-token)
146
151
- [Push a commit to a PR using the built-in token](#Push-a-commit-to-a-PR-using-the-built-in-token)
152
+ - [Checkout SHA-256 repository](#checkout-sha-256-repository)
147
153
148
154
# # Fetch only the root files
149
155
@@ -323,6 +329,14 @@ permissions:
323
329
contents: read
324
330
` ` `
325
331
332
+ # # Checkout SHA-256 repository
333
+
334
+ ` ` ` yaml
335
+ - uses: actions/checkout@v4
336
+ with:
337
+ object-format: sha256
338
+ ` ` `
339
+
326
340
# License
327
341
328
342
The scripts and documentation in this project are released under the [MIT License](LICENSE)
Original file line number Diff line number Diff line change @@ -824,7 +824,8 @@ async function setup(testName: string): Promise<void> {
824
824
sshUser : '' ,
825
825
workflowOrganizationId : 123456 ,
826
826
setSafeDirectory : true ,
827
- githubServerUrl : githubServerUrl
827
+ githubServerUrl : githubServerUrl ,
828
+ objectFormat : undefined
828
829
}
829
830
}
830
831
Original file line number Diff line number Diff line change @@ -375,4 +375,25 @@ describe('Test fetchDepth and fetchTags options', () => {
375
375
expect . any ( Object )
376
376
)
377
377
} )
378
+
379
+ it ( 'should call execGit with the correct arguments when sha256 is used' , async ( ) => {
380
+ jest . spyOn ( exec , 'exec' ) . mockImplementation ( mockExec )
381
+
382
+ const workingDirectory = 'test'
383
+ const lfs = false
384
+ const doSparseCheckout = false
385
+ git = await commandManager . createCommandManager (
386
+ workingDirectory ,
387
+ lfs ,
388
+ doSparseCheckout
389
+ )
390
+
391
+ await git . init ( { objectFormat : 'sha256' } )
392
+
393
+ expect ( mockExec ) . toHaveBeenCalledWith (
394
+ expect . any ( String ) ,
395
+ [ 'init' , '--object-format=sha256' , 'test' ] ,
396
+ expect . any ( Object )
397
+ )
398
+ } )
378
399
} )
Original file line number Diff line number Diff line change @@ -98,6 +98,11 @@ inputs:
98
98
github-server-url :
99
99
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
100
100
required : false
101
+ object-format :
102
+ description : >
103
+ Use the given object format when creating local repository. Specifically, use
104
+ 'sha256' to checkout a SHA-256 repository.
105
+ default : null
101
106
outputs :
102
107
ref :
103
108
description : ' The branch, tag or SHA that was checked out'
Original file line number Diff line number Diff line change @@ -709,9 +709,13 @@ class GitCommandManager {
709
709
getWorkingDirectory() {
710
710
return this.workingDirectory;
711
711
}
712
- init() {
712
+ init(options ) {
713
713
return __awaiter(this, void 0, void 0, function* () {
714
- yield this.execGit(['init', this.workingDirectory]);
714
+ yield this.execGit([
715
+ 'init',
716
+ ...((options === null || options === void 0 ? void 0 : options.objectFormat) ? [`--object-format=${options.objectFormat}`] : []),
717
+ this.workingDirectory
718
+ ]);
715
719
});
716
720
}
717
721
isDetached() {
@@ -1236,7 +1240,7 @@ function getSource(settings) {
1236
1240
// Initialize the repository
1237
1241
if (!fsHelper.directoryExistsSync(path.join(settings.repositoryPath, '.git'))) {
1238
1242
core.startGroup('Initializing the repository');
1239
- yield git.init();
1243
+ yield git.init({ objectFormat: settings.objectFormat } );
1240
1244
yield git.remoteAdd('origin', repositoryUrl);
1241
1245
core.endGroup();
1242
1246
}
@@ -1831,6 +1835,14 @@ function getInputs() {
1831
1835
// Determine the GitHub URL that the repository is being hosted from
1832
1836
result.githubServerUrl = core.getInput('github-server-url');
1833
1837
core.debug(`GitHub Host URL = ${result.githubServerUrl}`);
1838
+ // Object format
1839
+ const objectFormat = core.getInput('object-format');
1840
+ if (objectFormat) {
1841
+ if (objectFormat != 'sha1' && objectFormat != 'sha256') {
1842
+ throw Error(`Invalid object format '${objectFormat}'`);
1843
+ }
1844
+ result.objectFormat = objectFormat;
1845
+ }
1834
1846
return result;
1835
1847
});
1836
1848
}
Original file line number Diff line number Diff line change @@ -42,7 +42,7 @@ export interface IGitCommandManager {
42
42
) : Promise < void >
43
43
getDefaultBranch ( repositoryUrl : string ) : Promise < string >
44
44
getWorkingDirectory ( ) : string
45
- init ( ) : Promise < void >
45
+ init ( options ?: { objectFormat ?: string } ) : Promise < void >
46
46
isDetached ( ) : Promise < boolean >
47
47
lfsFetch ( ref : string ) : Promise < void >
48
48
lfsInstall ( ) : Promise < void >
@@ -327,8 +327,14 @@ class GitCommandManager {
327
327
return this . workingDirectory
328
328
}
329
329
330
- async init ( ) : Promise < void > {
331
- await this . execGit ( [ 'init' , this . workingDirectory ] )
330
+ async init ( options ?: { objectFormat ?: string } ) : Promise < void > {
331
+ await this . execGit ( [
332
+ 'init' ,
333
+ ...( options ?. objectFormat
334
+ ? [ `--object-format=${ options . objectFormat } ` ]
335
+ : [ ] ) ,
336
+ this . workingDirectory
337
+ ] )
332
338
}
333
339
334
340
async isDetached ( ) : Promise < boolean > {
Original file line number Diff line number Diff line change @@ -110,7 +110,7 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
110
110
! fsHelper . directoryExistsSync ( path . join ( settings . repositoryPath , '.git' ) )
111
111
) {
112
112
core . startGroup ( 'Initializing the repository' )
113
- await git . init ( )
113
+ await git . init ( { objectFormat : settings . objectFormat } )
114
114
await git . remoteAdd ( 'origin' , repositoryUrl )
115
115
core . endGroup ( )
116
116
}
Original file line number Diff line number Diff line change @@ -118,4 +118,9 @@ export interface IGitSourceSettings {
118
118
* User override on the GitHub Server/Host URL that hosts the repository to be cloned
119
119
*/
120
120
githubServerUrl : string | undefined
121
+
122
+ /**
123
+ * Object format used for the repo, if it is not default
124
+ */
125
+ objectFormat : 'sha1' | 'sha256' | undefined
121
126
}
Original file line number Diff line number Diff line change @@ -161,5 +161,14 @@ export async function getInputs(): Promise<IGitSourceSettings> {
161
161
result . githubServerUrl = core . getInput ( 'github-server-url' )
162
162
core . debug ( `GitHub Host URL = ${ result . githubServerUrl } ` )
163
163
164
+ // Object format
165
+ const objectFormat = core . getInput ( 'object-format' )
166
+ if ( objectFormat ) {
167
+ if ( objectFormat != 'sha1' && objectFormat != 'sha256' ) {
168
+ throw Error ( `Invalid object format '${ objectFormat } '` )
169
+ }
170
+ result . objectFormat = objectFormat
171
+ }
172
+
164
173
return result
165
174
}
0 commit comments