Merge pull request #224 from neilime/fix/git-suuport-grafted-pull-refs

fix(git): supports grafted pull refs
This commit is contained in:
CrazyMax 2023-12-15 16:58:16 +01:00 committed by GitHub
commit 5430d017a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 1 deletions

View File

@ -165,6 +165,30 @@ describe('ref', () => {
expect(ref).toEqual('refs/tags/8.0.0'); expect(ref).toEqual('refs/tags/8.0.0');
}); });
it('returns mocked detached pull request merge ref (shallow clone)', async () => {
jest.spyOn(Exec, 'getExecOutput').mockImplementation((cmd, args): Promise<ExecOutput> => {
const fullCmd = `${cmd} ${args?.join(' ')}`;
let result = '';
switch (fullCmd) {
case 'git branch --show-current':
result = '';
break;
case 'git show -s --pretty=%D':
result = 'grafted, HEAD, pull/221/merge';
break;
}
return Promise.resolve({
stdout: result,
stderr: '',
exitCode: 0
});
});
const ref = await Git.ref();
expect(ref).toEqual('refs/pull/221/merge');
});
it('should throws an error when detached HEAD ref is not supported', async () => { it('should throws an error when detached HEAD ref is not supported', async () => {
jest.spyOn(Exec, 'getExecOutput').mockImplementation((cmd, args): Promise<ExecOutput> => { jest.spyOn(Exec, 'getExecOutput').mockImplementation((cmd, args): Promise<ExecOutput> => {
const fullCmd = `${cmd} ${args?.join(' ')}`; const fullCmd = `${cmd} ${args?.join(' ')}`;

View File

@ -137,12 +137,18 @@ export class Git {
return `refs/tags/${ref.split(':')[1].trim()}`; return `refs/tags/${ref.split(':')[1].trim()}`;
} }
// Otherwise, it's a branch "<origin>/<branch-name>, <branch-name>" // Branch refs are formatted as "<origin>/<branch-name>, <branch-name>"
const branchMatch = ref.match(/^[^/]+\/[^/]+, (.+)$/); const branchMatch = ref.match(/^[^/]+\/[^/]+, (.+)$/);
if (branchMatch) { if (branchMatch) {
return `refs/heads/${branchMatch[1].trim()}`; return `refs/heads/${branchMatch[1].trim()}`;
} }
// Pull request merge refs are formatted as "pull/<number>/<state>"
const prMatch = ref.match(/^pull\/\d+\/(head|merge)$/);
if (prMatch) {
return `refs/${ref}`;
}
throw new Error(`Unsupported detached HEAD ref in "${res}"`); throw new Error(`Unsupported detached HEAD ref in "${res}"`);
} }