From d146b6caf80673aad09b26c4bfd117a1ca072dde Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 27 Sep 2025 16:49:42 +0300 Subject: [PATCH] bridgev2/mxmain: move version calculation to go-util --- bridgev2/matrix/mxmain/main.go | 98 ++++++---------------------------- go.mod | 2 +- go.sum | 4 +- 3 files changed, 19 insertions(+), 85 deletions(-) diff --git a/bridgev2/matrix/mxmain/main.go b/bridgev2/matrix/mxmain/main.go index 9fec278d..9e409875 100644 --- a/bridgev2/matrix/mxmain/main.go +++ b/bridgev2/matrix/mxmain/main.go @@ -26,6 +26,7 @@ import ( "go.mau.fi/util/dbutil" "go.mau.fi/util/exerrors" "go.mau.fi/util/exzerolog" + "go.mau.fi/util/progver" "gopkg.in/yaml.v3" flag "maunium.net/go/mauflag" @@ -89,11 +90,7 @@ type BridgeMain struct { RegistrationPath string SaveConfig bool - baseVersion string - commit string - LinkifiedVersion string - VersionDesc string - BuildTime time.Time + ver progver.ProgramVersion AdditionalShortFlags string AdditionalLongFlags string @@ -102,14 +99,7 @@ type BridgeMain struct { } type VersionJSONOutput struct { - Name string - URL string - - Version string - IsRelease bool - Commit string - FormattedVersion string - BuildTime time.Time + progver.ProgramVersion OS string Arch string @@ -150,18 +140,11 @@ func (br *BridgeMain) PreInit() { flag.PrintHelp() os.Exit(0) } else if *version { - fmt.Println(br.VersionDesc) + fmt.Println(br.ver.FormattedVersion) os.Exit(0) } else if *versionJSON { output := VersionJSONOutput{ - URL: br.URL, - Name: br.Name, - - Version: br.baseVersion, - IsRelease: br.Version == br.baseVersion, - Commit: br.commit, - FormattedVersion: br.Version, - BuildTime: br.BuildTime, + ProgramVersion: br.ver, OS: runtime.GOOS, Arch: runtime.GOARCH, @@ -243,8 +226,8 @@ func (br *BridgeMain) Init() { br.Log.Info(). Str("name", br.Name). - Str("version", br.Version). - Time("built_at", br.BuildTime). + Str("version", br.ver.FormattedVersion). + Time("built_at", br.ver.BuildTime). Str("go_version", runtime.Version()). Msg("Initializing bridge") @@ -258,7 +241,7 @@ func (br *BridgeMain) Init() { br.Matrix.AS.DoublePuppetValue = br.Name br.Bridge.Commands.(*commands.Processor).AddHandler(&commands.FullHandler{ Func: func(ce *commands.Event) { - ce.Reply("[%s](%s) %s (%s)", br.Name, br.URL, br.LinkifiedVersion, br.BuildTime.Format(time.RFC1123)) + ce.Reply(br.ver.MarkdownDescription()) }, Name: "version", Help: commands.HelpMeta{ @@ -427,21 +410,6 @@ func (br *BridgeMain) Stop() { br.Bridge.StopWithTimeout(5 * time.Second) } -func semverToCalver(semver string) string { - parts := strings.SplitN(semver, ".", 3) - if len(parts) < 2 { - panic(fmt.Errorf("invalid semver for calendar versioning: %s", semver)) - } - if len(parts[1]) != 4 { - panic(fmt.Errorf("invalid minor semver component for calendar versioning: %s", parts[1])) - } - calver := parts[1][:2] + "." + parts[1][2:] - if len(parts) == 3 { - calver += "." + parts[2] - } - return calver -} - // InitVersion formats the bridge version and build time nicely for things like // the `version` bridge command on Matrix and the `--version` CLI flag. // @@ -464,46 +432,12 @@ func semverToCalver(semver string) string { // // (to use both at the same time, simply merge the ldflags into one, `-ldflags "-X '...' -X ..."`) func (br *BridgeMain) InitVersion(tag, commit, rawBuildTime string) { - br.baseVersion = br.Version - rawTag := tag - if len(tag) > 0 && tag[0] == 'v' { - tag = tag[1:] - } - if br.SemCalVer && len(tag) > 0 { - tag = semverToCalver(tag) - } - if tag != br.Version { - suffix := "" - if !strings.HasSuffix(br.Version, "+dev") { - suffix = "+dev" - } - if len(commit) > 8 { - br.Version = fmt.Sprintf("%s%s.%s", br.Version, suffix, commit[:8]) - } else { - br.Version = fmt.Sprintf("%s%s.unknown", br.Version, suffix) - } - } - - br.LinkifiedVersion = fmt.Sprintf("v%s", br.Version) - if tag == br.Version { - br.LinkifiedVersion = fmt.Sprintf("[v%s](%s/releases/v%s)", br.Version, br.URL, rawTag) - } else if len(commit) > 8 { - br.LinkifiedVersion = strings.Replace(br.LinkifiedVersion, commit[:8], fmt.Sprintf("[%s](%s/commit/%s)", commit[:8], br.URL, commit), 1) - } - var buildTime time.Time - if rawBuildTime != "unknown" { - buildTime, _ = time.Parse(time.RFC3339, rawBuildTime) - } - var builtWith string - if buildTime.IsZero() { - rawBuildTime = "unknown" - builtWith = runtime.Version() - } else { - rawBuildTime = buildTime.Format(time.RFC1123) - builtWith = fmt.Sprintf("built at %s with %s", rawBuildTime, runtime.Version()) - } - mautrix.DefaultUserAgent = fmt.Sprintf("%s/%s %s", br.Name, br.Version, mautrix.DefaultUserAgent) - br.VersionDesc = fmt.Sprintf("%s %s (%s)", br.Name, br.Version, builtWith) - br.commit = commit - br.BuildTime = buildTime + br.ver = progver.ProgramVersion{ + Name: br.Name, + URL: br.URL, + BaseVersion: br.Version, + SemCalVer: br.SemCalVer, + }.Init(tag, commit, rawBuildTime) + mautrix.DefaultUserAgent = fmt.Sprintf("%s/%s %s", br.Name, br.ver.FormattedVersion, mautrix.DefaultUserAgent) + br.Version = br.ver.FormattedVersion } diff --git a/go.mod b/go.mod index 751e8015..c9d082a3 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/tidwall/gjson v1.18.0 github.com/tidwall/sjson v1.2.5 github.com/yuin/goldmark v1.7.13 - go.mau.fi/util v0.9.1 + go.mau.fi/util v0.9.2-0.20250927140851-50bb0cc52015 go.mau.fi/zeroconfig v0.2.0 golang.org/x/crypto v0.42.0 golang.org/x/exp v0.0.0-20250911091902-df9299821621 diff --git a/go.sum b/go.sum index dafb9600..5133d5b6 100644 --- a/go.sum +++ b/go.sum @@ -51,8 +51,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= -go.mau.fi/util v0.9.1 h1:A+XKHRsjKkFi2qOm4RriR1HqY2hoOXNS3WFHaC89r2Y= -go.mau.fi/util v0.9.1/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ= +go.mau.fi/util v0.9.2-0.20250927140851-50bb0cc52015 h1:aRnDwmJNAP+/EspXpo7MhSJxfS+g49MzGvnLkcNFUEc= +go.mau.fi/util v0.9.2-0.20250927140851-50bb0cc52015/go.mod h1:M0bM9SyaOWJniaHs9hxEzz91r5ql6gYq6o1q5O1SsjQ= go.mau.fi/zeroconfig v0.2.0 h1:e/OGEERqVRRKlgaro7E6bh8xXiKFSXB3eNNIud7FUjU= go.mau.fi/zeroconfig v0.2.0/go.mod h1:J0Vn0prHNOm493oZoQ84kq83ZaNCYZnq+noI1b1eN8w= golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=