diff --git a/make.go b/make.go index c7e7505..2e199fd 100644 --- a/make.go +++ b/make.go @@ -386,7 +386,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..1527885 100644 --- a/version.go +++ b/version.go @@ -6,6 +6,7 @@ import ( "os" "os/exec" "regexp" + "slices" "strconv" "strings" "time" @@ -32,16 +33,33 @@ 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 - // Find @latest version tag (whether annotated or not) - 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)) + var cmd *exec.Cmd // the temporary shell commands we execute + + // 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 + } + } + + // Find @latest version tag (whether annotated or not) when the user + // (1) does not specify a version tag, or + // (2) specifies an invalid version tag. + if len(latestTag) == 0 { + 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)) + } + } + + 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) }