diff --git a/cmd/proxy/main.go b/cmd/proxy/main.go index 15a71c0..02cb272 100644 --- a/cmd/proxy/main.go +++ b/cmd/proxy/main.go @@ -267,7 +267,10 @@ func runServe() { logger := setupLogger(cfg.Log.Level, cfg.Log.Format) // Create and start server - srv, err := server.New(cfg, logger) + srv, err := server.New(cfg, logger, server.BuildInfo{ + Version: Version, + Commit: Commit, + }) if err != nil { logger.Error("failed to create server", "error", err) os.Exit(1) diff --git a/internal/server/layout.go b/internal/server/layout.go index ef39858..d96f540 100644 --- a/internal/server/layout.go +++ b/internal/server/layout.go @@ -2,17 +2,24 @@ package server import "net/http" -// Layout carries per-request fields consumed by the shared base template -// (canonical URL, og:url). It is embedded in every page data struct so that -// templates can reference {{.UIBaseURL}} and {{.CanonicalPath}} alongside the -// page's own fields. +// BuildInfo identifies the running proxy binary. +type BuildInfo struct { + Version string + Commit string +} + +// Layout carries shared fields consumed by the base template. It is embedded +// in every page data struct so templates can access canonical URL and build +// information alongside the page's own fields. type Layout struct { + BuildInfo UIBaseURL string CanonicalPath string } func (s *Server) layoutFor(r *http.Request) Layout { return Layout{ + BuildInfo: s.buildInfo, UIBaseURL: s.cfg.UIBaseURL, CanonicalPath: r.URL.Path, } diff --git a/internal/server/server.go b/internal/server/server.go index e677bc9..e2966d6 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -91,6 +91,7 @@ type Server struct { db *database.DB storage storage.Storage logger *slog.Logger + buildInfo BuildInfo http *http.Server templates *Templates cancel context.CancelFunc @@ -98,7 +99,7 @@ type Server struct { } // New creates a new Server with the given configuration. -func New(cfg *config.Config, logger *slog.Logger) (*Server, error) { +func New(cfg *config.Config, logger *slog.Logger, buildInfo BuildInfo) (*Server, error) { // Initialize database var db *database.DB var err error @@ -152,6 +153,7 @@ func New(cfg *config.Config, logger *slog.Logger) (*Server, error) { db: db, storage: store, logger: logger, + buildInfo: buildInfo, templates: &Templates{}, healthCache: hc, }, nil diff --git a/internal/server/server_test.go b/internal/server/server_test.go index 98b58cc..3401654 100644 --- a/internal/server/server_test.go +++ b/internal/server/server_test.go @@ -100,10 +100,14 @@ func newTestServer(t *testing.T) *testServer { // Create a minimal server struct for the handlers s := &Server{ - cfg: cfg, - db: db, - storage: store, - logger: logger, + cfg: cfg, + db: db, + storage: store, + logger: logger, + buildInfo: BuildInfo{ + Version: "test-version", + Commit: "test-commit", + }, templates: &Templates{}, healthCache: hc, } @@ -313,6 +317,9 @@ func TestDashboard(t *testing.T) { if !strings.Contains(body, "Cached Artifacts") { t.Error("dashboard should contain stats") } + if !strings.Contains(body, "proxy test-version (test-commit)") { + t.Error("dashboard footer should contain build information") + } if !strings.Contains(body, "Popular Packages") { t.Error("dashboard should contain popular packages section") } @@ -1327,10 +1334,14 @@ func TestNewServer_StorageConnectivityCheck(t *testing.T) { logger := slog.New(slog.NewTextHandler(io.Discard, nil)) - srv, err := New(cfg, logger) + buildInfo := BuildInfo{Version: "test-version", Commit: "test-commit"} + srv, err := New(cfg, logger, buildInfo) if err != nil { t.Fatalf("New() failed: %v", err) } + if srv.buildInfo != buildInfo { + t.Errorf("build info = %#v, want %#v", srv.buildInfo, buildInfo) + } // On Windows, OpenBucket normalises to file:///C:/path; on Unix the // absolute path already starts with /, so file:// + /path == file:///path. diff --git a/internal/server/templates/layout/footer.html b/internal/server/templates/layout/footer.html index 5aa970d..d8b7acf 100644 --- a/internal/server/templates/layout/footer.html +++ b/internal/server/templates/layout/footer.html @@ -12,6 +12,11 @@
+ proxy {{.Version}}{{if .Commit}} ({{.Commit}}){{end}} +
+ {{end}}