diff --git a/version/mkversion/mkversion.go b/version/mkversion/mkversion.go index 06e19e53c..af5244e91 100644 --- a/version/mkversion/mkversion.go +++ b/version/mkversion/mkversion.go @@ -150,14 +150,14 @@ func InfoFrom(dir string) (VersionInfo, error) { } // Note, this mechanism doesn't correctly support go.mod replacements, - // or go workdirs. We only parse out the commit hash from go.mod's + // or go workdirs. We only parse out the commit ref from go.mod's // "require" line, nothing else. - tailscaleHash, err := tailscaleModuleHash(modBs) + tailscaleRef, err := tailscaleModuleRef(modBs) if err != nil { return VersionInfo{}, err } - v, err := infoFromCache(tailscaleHash, runner) + v, err := infoFromCache(tailscaleRef, runner) if err != nil { return VersionInfo{}, err } @@ -171,9 +171,10 @@ func InfoFrom(dir string) (VersionInfo, error) { return mkOutput(v) } -// tailscaleModuleHash returns the git hash of the 'require tailscale.com' line -// in the given go.mod bytes. -func tailscaleModuleHash(modBs []byte) (string, error) { +// tailscaleModuleRef returns the git ref of the 'require tailscale.com' line +// in the given go.mod bytes. The ref is either a short commit hash, or a git +// tag. +func tailscaleModuleRef(modBs []byte) (string, error) { mod, err := modfile.Parse("go.mod", modBs, nil) if err != nil { return "", err @@ -187,7 +188,8 @@ func tailscaleModuleHash(modBs []byte) (string, error) { if i := strings.LastIndexByte(req.Mod.Version, '-'); i != -1 { return req.Mod.Version[i+1:], nil } - return "", fmt.Errorf("couldn't parse git hash from tailscale.com version %q", req.Mod.Version) + // If there are no dashes, the version is a tag. + return req.Mod.Version, nil } return "", fmt.Errorf("no require tailscale.com line in go.mod") } @@ -310,7 +312,7 @@ type verInfo struct { // sentinel patch number. const unknownPatchVersion = 9999999 -func infoFromCache(shortHash string, runner dirRunner) (verInfo, error) { +func infoFromCache(ref string, runner dirRunner) (verInfo, error) { cacheDir, err := os.UserCacheDir() if err != nil { return verInfo{}, fmt.Errorf("Getting user cache dir: %w", err) @@ -324,16 +326,16 @@ func infoFromCache(shortHash string, runner dirRunner) (verInfo, error) { } } - if !r.ok("git", "cat-file", "-e", shortHash) { + if !r.ok("git", "cat-file", "-e", ref) { if !r.ok("git", "fetch", "origin") { return verInfo{}, fmt.Errorf("updating OSS repo failed") } } - hash, err := r.output("git", "rev-parse", shortHash) + hash, err := r.output("git", "rev-parse", ref) if err != nil { return verInfo{}, err } - date, err := r.output("git", "log", "-n1", "--format=%ct", shortHash) + date, err := r.output("git", "log", "-n1", "--format=%ct", ref) if err != nil { return verInfo{}, err }