diff --git a/make.go b/make.go index 9f48c07..1dd1b09 100644 --- a/make.go +++ b/make.go @@ -383,7 +383,7 @@ func makeUpstreamSourceTarball(repo, revision string, forcePrerelease bool) (*up log.Printf("Determining upstream version number\n") - u.version, err = pkgVersionFromGit(repoDir, &u, forcePrerelease) + u.version, err = pkgVersionFromGit(repoDir, &u, revision, forcePrerelease) if err != nil { return nil, fmt.Errorf("get package version from Git: %w", err) } diff --git a/version.go b/version.go index e1d1501..d3d28c9 100644 --- a/version.go +++ b/version.go @@ -6,6 +6,7 @@ import ( "os" "os/exec" "regexp" + "slices" "strconv" "strings" "time" @@ -32,16 +33,32 @@ var ( // Besides returning the Debian upstream version, the "upstream" struct // struct fields u.version, u.commitIsh, u.hasRelease and u.isRelease // are also set. +// `preferredRev` should be empty if there are no user preferences. // TODO: also support other VCS -func pkgVersionFromGit(gitdir string, u *upstream, forcePrerelease bool) (string, error) { +func pkgVersionFromGit(gitdir string, u *upstream, preferredRev string, forcePrerelease bool) (string, error) { var latestTag string var commitsAhead int + var cmd *exec.Cmd + + // If the user specifies a valid tag as the preferred revision, that tag should be used without additional heuristics. + if u.rr != nil { + if out, err := u.rr.VCS.Tags(gitdir); err == nil && slices.Contains(out, preferredRev) { + latestTag = preferredRev + goto FoundLatestTag + } + } + // Find @latest version tag (whether annotated or not) - cmd := exec.Command("git", "describe", "--abbrev=0", "--tags", "--exclude", "*/v*") + cmd = exec.Command("git", "describe", "--abbrev=0", "--tags", "--exclude", "*/v*") cmd.Dir = gitdir if out, err := cmd.Output(); err == nil { latestTag = strings.TrimSpace(string(out)) + } + +FoundLatestTag: + + if len(latestTag) > 0 { u.hasRelease = true u.tag = latestTag log.Printf("Found latest tag %q", latestTag) diff --git a/version_test.go b/version_test.go index acf24a9..92820b7 100644 --- a/version_test.go +++ b/version_test.go @@ -45,7 +45,7 @@ func TestSnapshotVersion(t *testing.T) { } var u upstream - got, err := pkgVersionFromGit(tempdir, &u, false) + got, err := pkgVersionFromGit(tempdir, &u, "", false) if err != nil { t.Fatalf("Determining package version from git failed: %v", err) } @@ -55,7 +55,7 @@ func TestSnapshotVersion(t *testing.T) { gitCmdOrFatal(t, tempdir, "tag", "-a", "v1", "-m", "release v1") - got, err = pkgVersionFromGit(tempdir, &u, false) + got, err = pkgVersionFromGit(tempdir, &u, "", false) if err != nil { t.Fatalf("Determining package version from git failed: %v", err) } @@ -75,7 +75,7 @@ func TestSnapshotVersion(t *testing.T) { t.Fatalf("Could not run %v: %v", cmd.Args, err) } - got, err = pkgVersionFromGit(tempdir, &u, false) + got, err = pkgVersionFromGit(tempdir, &u, "", false) if err != nil { t.Fatalf("Determining package version from git failed: %v", err) } @@ -95,7 +95,7 @@ func TestSnapshotVersion(t *testing.T) { t.Fatalf("Could not run %v: %v", cmd.Args, err) } - got, err = pkgVersionFromGit(tempdir, &u, false) + got, err = pkgVersionFromGit(tempdir, &u, "", false) if err != nil { t.Fatalf("Determining package version from git failed: %v", err) }