From 91d6d429cd1648783324dc3a82cb1733e54465dc Mon Sep 17 00:00:00 2001 From: Luca Comellini Date: Thu, 18 Jun 2026 18:13:51 -0700 Subject: [PATCH] Correctly extract tag name when commit has multiple decorations Signed-off-by: Luca Comellini --- __tests__/git.test.ts | 44 +++++++++++++++++++++++++++++++++++++++++++ src/git.ts | 2 +- 2 files changed, 45 insertions(+), 1 deletion(-) 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//"