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) }