diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts index 6bb2b3c9..e0bb55e9 100644 --- a/__tests__/git.test.ts +++ b/__tests__/git.test.ts @@ -408,6 +408,50 @@ describe('ref', () => { const ref = await Git.ref(); expect(ref).toEqual('refs/remotes/unusual-format'); }); + + it('returns mocked detached tag ref when commit also has branch decorations', async () => { + vi.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 = 'HEAD, tag: v8.0.0, origin/release-branch'; + break; + } + return Promise.resolve({ + stdout: result, + stderr: '', + exitCode: 0 + }); + }); + const ref = await Git.ref(); + expect(ref).toEqual('refs/tags/v8.0.0'); + }); + + it('returns mocked detached tag ref (shallow clone) when commit also has branch decorations', async () => { + vi.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, tag: v8.0.0, origin/release-branch'; + break; + } + return Promise.resolve({ + stdout: result, + stderr: '', + exitCode: 0 + }); + }); + const ref = await Git.ref(); + expect(ref).toEqual('refs/tags/v8.0.0'); + }); }); describe('fullCommit', () => { diff --git a/src/git.ts b/src/git.ts index addedfa1..e59961ea 100644 --- a/src/git.ts +++ b/src/git.ts @@ -138,7 +138,7 @@ export class Git { // Tag refs are formatted as "tag: " if (ref.startsWith('tag: ')) { - return `refs/tags/${ref.split(':')[1].trim()}`; + return `refs/tags/${ref.slice('tag: '.length).split(',')[0].trim()}`; } // Pull request merge refs are formatted as "pull//"