diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts index 99fac93..05d437d 100644 --- a/__tests__/git.test.ts +++ b/__tests__/git.test.ts @@ -165,6 +165,30 @@ describe('ref', () => { 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 => { + 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 () => { jest.spyOn(Exec, 'getExecOutput').mockImplementation((cmd, args): Promise => { const fullCmd = `${cmd} ${args?.join(' ')}`; diff --git a/src/git.ts b/src/git.ts index 2cf7491..33d89c0 100644 --- a/src/git.ts +++ b/src/git.ts @@ -137,12 +137,18 @@ export class Git { return `refs/tags/${ref.split(':')[1].trim()}`; } - // Otherwise, it's a branch "/, " + // Branch refs are formatted as "/, " const branchMatch = ref.match(/^[^/]+\/[^/]+, (.+)$/); if (branchMatch) { return `refs/heads/${branchMatch[1].trim()}`; } + // Pull request merge refs are formatted as "pull//" + const prMatch = ref.match(/^pull\/\d+\/(head|merge)$/); + if (prMatch) { + return `refs/${ref}`; + } + throw new Error(`Unsupported detached HEAD ref in "${res}"`); }