From efad8fdb67f55ff084095be8690350b7a7801aca Mon Sep 17 00:00:00 2001 From: Anirudh Oppiliappan Date: Tue, 25 Mar 2025 09:28:05 +0000 Subject: [PATCH] knotserver: return the build version at /version Version is currently set during build time using ldflags, but if not, it will attempt to pick up the Go module version (if installed via 'go install' or 'go get', for example). --- .air/knotserver.toml | 2 +- knotserver/handler.go | 30 ++++++++++++++++++++++++++++++ 2 file(s) changed, 31 insertion(s)(+), 1 deletion(s)(-) diff --git a/.air/knotserver.toml b/.air/knotserver.toml --- a/.air/knotserver.toml +++ b/.air/knotserver.toml @@ -1,5 +1,5 @@ [build] -cmd = "go build -o .bin/knot ./cmd/knotserver/main.go" +cmd = 'go build -ldflags "-X tangled.sh/tangled.sh/core/knotserver.version=$(git describe --tags --long)" -o .bin/knot ./cmd/knotserver/main.go' bin = ".bin/knot" root = "." diff --git a/knotserver/handler.go b/knotserver/handler.go --- a/knotserver/handler.go +++ b/knotserver/handler.go @@ -5,6 +5,7 @@ "fmt" "log/slog" "net/http" + "runtime/debug" "github.com/go-chi/chi/v5" "tangled.sh/tangled.sh/core/jetstream" @@ -66,6 +67,7 @@ } r.Get("/", h.Index) + r.Get("/version", h.Version) r.Route("/{did}", func(r chi.Router) { // Repo routes r.Route("/{name}", func(r chi.Router) { @@ -123,4 +125,32 @@ r.Get("/keys", h.Keys) return r, nil +} + +// version is set during build time. +var version string + +func (h *Handle) Version(w http.ResponseWriter, r *http.Request) { + if version == "" { + info, ok := debug.ReadBuildInfo() + if !ok { + http.Error(w, "failed to read build info", http.StatusInternalServerError) + return + } + + var modVer string + for _, mod := range info.Deps { + if mod.Path == "tangled.sh/tangled.sh/knotserver" { + version = mod.Version + break + } + } + + if modVer == "" { + version = "unknown" + } + } + + w.Header().Set("Content-Type", "text/plain") + fmt.Fprintf(w, "knotserver/%s", version) } -- tangled.sh