feat(cmd): release v1.10.0 — shallow clone guard and --check preflight
ci / vet, staticcheck, test, build (push) Successful in 3m46s
docs / Build and deploy docs (push) Failing after 11s
release / Build and publish release (push) Successful in 4m34s

- refuse to release when the clone is shallow and no previous release tag
  is found: tags beyond the fetch depth would silently restart versioning
  at X.Y.0; --allow-shallow bypasses the guard for a true first release
- new --check preflight validates the release environment without
  releasing: branch resolution + pattern, working tree, tag discovery,
  shallow clone, remote origin URL parse (same parse the push performs),
  push auth method, version files, release target — all problems reported
  at once, non-zero exit on failure
- .releaser.gitlab-ci.yml gains an optional .releaser:check MR-pipeline
  job; CI examples now set GIT_DEPTH: 0

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-16 22:12:17 +02:00
parent 2a6a65ce80
commit 37db8e97ca
11 changed files with 539 additions and 1 deletions
+12
View File
@@ -69,6 +69,18 @@ func CurrentBranch(repo *gogit.Repository) (string, error) {
return "", fmt.Errorf("HEAD is detached and no CI branch variable is set (%s) — use --branch to specify the release branch", strings.Join(ciBranchEnvVars, ", "))
}
// IsShallow reports whether the repository is a shallow clone. In shallow CI
// checkouts (GitLab CI defaults to GIT_DEPTH: 20) release tags beyond the
// fetch depth are invisible to LatestTag, which would silently restart
// versioning at X.Y.0.
func IsShallow(repo *gogit.Repository) (bool, error) {
roots, err := repo.Storer.Shallow()
if err != nil {
return false, err
}
return len(roots) > 0, nil
}
type tagCandidate struct {
name string
patch int