diff options
| author | eric sciple <ericsciple@users.noreply.github.com> | 2026-01-09 13:42:23 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-09 13:42:23 -0600 |
| commit | 5921bc8a76f21dbff8ef5088dc2dc3b479ab5309 (patch) | |
| tree | b4c76471127cb4a7e8d0205a8ed8b04f646baaa8 /src/git-source-provider.ts | |
| parent | 72bc64336da5b556e438a70b19caa4f80eebee98 (diff) | |
Fix tag handling: preserve annotations and explicit fetch-tags (#2356)v6.0.2
This PR fixes several issues with tag handling in the checkout action:
1. fetch-tags: true now works (fixes #1471)
- Tags refspec is now included in getRefSpec() when fetchTags=true
- Previously tags were only fetched during a separate fetch that was
overwritten by the main fetch
2. Tag checkout preserves annotations (fixes #290)
- Tags are fetched via refspec (+refs/tags/*:refs/tags/*) instead of
--tags flag
- This fetches the actual tag objects, preserving annotations
3. Tag checkout with fetch-tags: true no longer fails (fixes #1467)
- When checking out a tag with fetchTags=true, only the wildcard
refspec is used (specific tag refspec is redundant)
Changes:
- src/ref-helper.ts: getRefSpec() now accepts fetchTags parameter and
prepends tags refspec when true
- src/git-command-manager.ts: fetch() simplified to always use --no-tags,
tags are fetched explicitly via refspec
- src/git-source-provider.ts: passes fetchTags to getRefSpec()
- Added E2E test for fetch-tags option
Related #1471, #1467, #290
Diffstat (limited to 'src/git-source-provider.ts')
| -rw-r--r-- | src/git-source-provider.ts | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/git-source-provider.ts b/src/git-source-provider.ts index 2d35138..ec87178 100644 --- a/src/git-source-provider.ts +++ b/src/git-source-provider.ts @@ -159,7 +159,6 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> { const fetchOptions: { filter?: string fetchDepth?: number - fetchTags?: boolean showProgress?: boolean } = {} @@ -182,12 +181,35 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> { if (!(await refHelper.testRef(git, settings.ref, settings.commit))) { refSpec = refHelper.getRefSpec(settings.ref, settings.commit) await git.fetch(refSpec, fetchOptions) + + // Verify the ref now matches. For branches, the targeted fetch above brings + // in the specific commit. For tags (fetched by ref), this will fail if + // the tag was moved after the workflow was triggered. + if (!(await refHelper.testRef(git, settings.ref, settings.commit))) { + throw new Error( + `The ref '${settings.ref}' does not point to the expected commit '${settings.commit}'. ` + + `The ref may have been updated after the workflow was triggered.` + ) + } } } else { fetchOptions.fetchDepth = settings.fetchDepth - fetchOptions.fetchTags = settings.fetchTags - const refSpec = refHelper.getRefSpec(settings.ref, settings.commit) + const refSpec = refHelper.getRefSpec( + settings.ref, + settings.commit, + settings.fetchTags + ) await git.fetch(refSpec, fetchOptions) + + // For tags, verify the ref still points to the expected commit. + // Tags are fetched by ref (not commit), so if a tag was moved after the + // workflow was triggered, we would silently check out the wrong commit. + if (!(await refHelper.testRef(git, settings.ref, settings.commit))) { + throw new Error( + `The ref '${settings.ref}' does not point to the expected commit '${settings.commit}'. ` + + `The ref may have been updated after the workflow was triggered.` + ) + } } core.endGroup() |
