From c1275adfa37c0697fb55f9c817e4b3ddbe5ae13d Mon Sep 17 00:00:00 2001 From: wuyangfan <1102042793@qq.com> Date: Sat, 30 May 2026 12:48:51 +0800 Subject: [PATCH] feat: add version metadata and -v/--version flag Closes #26. Declare ldflags-injected build variables and print them when -v or --version is passed. --- find_replace.go | 5 +++++ version.go | 29 +++++++++++++++++++++++++++++ version_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 version.go create mode 100644 version_test.go diff --git a/find_replace.go b/find_replace.go index 9bdbe79..aa2ddde 100644 --- a/find_replace.go +++ b/find_replace.go @@ -77,6 +77,11 @@ func run(args []string, stderr io.Writer) int { // Remove date/time from logging output. log.SetFlags(0) + if len(args) == 2 && (args[1] == "-v" || args[1] == "--version") { + fmt.Fprintln(stderr, versionString()) + return 0 + } + if len(args) != 3 { fmt.Fprintln(stderr, "Usage: find-replace FIND REPLACE") return 1 diff --git a/version.go b/version.go new file mode 100644 index 0000000..14222d5 --- /dev/null +++ b/version.go @@ -0,0 +1,29 @@ +package main + +import "fmt" + +// Build metadata injected by build.sh via -ldflags -X. +var ( + GitTag string + GitCommit string + GoVersion string + BuildTimestamp string + BuildOS string + BuildArch string + BuildTainted string +) + +func versionString() string { + tag := GitTag + if tag == "" { + tag = "dev" + } + commit := GitCommit + if commit == "" { + commit = "unknown" + } + return fmt.Sprintf( + "find-replace %s (%s) go=%s built=%s os=%s arch=%s tainted=%s", + tag, commit, GoVersion, BuildTimestamp, BuildOS, BuildArch, BuildTainted, + ) +} diff --git a/version_test.go b/version_test.go new file mode 100644 index 0000000..0362d41 --- /dev/null +++ b/version_test.go @@ -0,0 +1,39 @@ +package main + +import ( + "strings" + "testing" +) + +func TestVersionString(t *testing.T) { + GitTag = "v1.2.3" + GitCommit = "abc1234" + GoVersion = "go1.22.0" + BuildTimestamp = "2026-01-01T00:00:00Z" + BuildOS = "linux" + BuildArch = "amd64" + BuildTainted = "false" + + got := versionString() + for _, want := range []string{"v1.2.3", "abc1234", "go1.22.0", "linux", "amd64"} { + if !strings.Contains(got, want) { + t.Fatalf("versionString() = %q; want substring %q", got, want) + } + } +} + +func TestRunVersionFlag(t *testing.T) { + code := run([]string{"find-replace", "--version"}, ioDiscard{t}) + if code != 0 { + t.Fatalf("run --version exit = %d; want 0", code) + } +} + +type ioDiscard struct{ t *testing.T } + +func (d ioDiscard) Write(p []byte) (int, error) { + if !strings.Contains(string(p), "find-replace") { + d.t.Fatalf("version output = %q; want find-replace", p) + } + return len(p), nil +}