From 8f65fd7b051e2b30697ff9a61202cd52eab2d475 Mon Sep 17 00:00:00 2001 From: clawbot <35+clawbot@noreply.example.org> Date: Sun, 4 Oct 2026 22:27:09 +0000 Subject: [PATCH] Move pixad's startup from cmd/pixad into internal/app (closes #206) cmd/pixad/main.go built the command line and its --config flag, set PIXA_CONFIG_PATH from that flag, ignored SIGPIPE and started the fx app. REPO_POLICIES.md now requires cmd/ to hold only one call into internal/ or pkg/, so that code moves unchanged to Run in the new internal/app package, and main calls app.Run(Version). Version stays in main, so the -X main.Version build flags in the Dockerfile and the Makefile do not change. Model: opus-5-5 --- TODO.md | 5 +++ cmd/pixad/main.go | 63 ++------------------------------- internal/app/app.go | 70 +++++++++++++++++++++++++++++++++++++ internal/globals/globals.go | 4 +-- 4 files changed, 79 insertions(+), 63 deletions(-) create mode 100644 internal/app/app.go diff --git a/TODO.md b/TODO.md index 2a34c53..6edc4d0 100644 --- a/TODO.md +++ b/TODO.md @@ -31,6 +31,11 @@ P2: security: per-IP rate limiting on the image routes # Completed Steps +- 2026-10-04 `cmd/pixad/main.go` is one call into `internal/` (closes #206): + what it did (the command line and its `--config` flag, setting + `PIXA_CONFIG_PATH`, ignoring `SIGPIPE`, starting the fx app) is now `Run` in + `internal/app`, unchanged, and `main` calls it with `Version`, which the build + still sets through `-X main.Version`. That code had no tests to move. - 2026-10-04 `.dockerignore` keeps secrets out at every depth (closes #205): the file is now the standard one from `sneak/prompts`, whose patterns match in every directory and, for environment files and private keys, in any letter diff --git a/cmd/pixad/main.go b/cmd/pixad/main.go index be56d5f..7806619 100644 --- a/cmd/pixad/main.go +++ b/cmd/pixad/main.go @@ -1,69 +1,10 @@ // Package main is the entry point for the pixad image proxy server. package main -import ( - "fmt" - "os" - "os/signal" - "syscall" - - "github.com/spf13/cobra" - "go.uber.org/fx" - "sneak.berlin/go/pixa/internal/config" - "sneak.berlin/go/pixa/internal/database" - "sneak.berlin/go/pixa/internal/globals" - "sneak.berlin/go/pixa/internal/handlers" - "sneak.berlin/go/pixa/internal/healthcheck" - "sneak.berlin/go/pixa/internal/logger" - "sneak.berlin/go/pixa/internal/middleware" - "sneak.berlin/go/pixa/internal/server" -) +import "sneak.berlin/go/pixa/internal/app" var Version string //nolint:gochecknoglobals // set by ldflags -var configPath string //nolint:gochecknoglobals // cobra flag - func main() { - rootCmd := &cobra.Command{ - Use: "pixad", - Short: "Pixa image caching proxy server", - Run: run, - } - - rootCmd.Flags().StringVarP(&configPath, "config", "c", "", "path to config file") - - err := rootCmd.Execute() - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func run(_ *cobra.Command, _ []string) { - globals.Version = Version - - // Set config path in environment if specified via flag - if configPath != "" { - _ = os.Setenv("PIXA_CONFIG_PATH", configPath) - } - - // A write to a closed stdout or stderr must not end the process. - signal.Ignore(syscall.SIGPIPE) - - fx.New( - fx.Provide( - config.New, - database.New, - globals.New, - handlers.New, - logger.New, - server.New, - middleware.New, - healthcheck.New, - ), - fx.Invoke( - func(log *logger.Logger) { log.Identify() }, - func(*server.Server) {}, - ), - ).Run() + app.Run(Version) } diff --git a/internal/app/app.go b/internal/app/app.go new file mode 100644 index 0000000..3521236 --- /dev/null +++ b/internal/app/app.go @@ -0,0 +1,70 @@ +// Package app reads the pixad command line and runs the server. +package app + +import ( + "fmt" + "os" + "os/signal" + "syscall" + + "github.com/spf13/cobra" + "go.uber.org/fx" + "sneak.berlin/go/pixa/internal/config" + "sneak.berlin/go/pixa/internal/database" + "sneak.berlin/go/pixa/internal/globals" + "sneak.berlin/go/pixa/internal/handlers" + "sneak.berlin/go/pixa/internal/healthcheck" + "sneak.berlin/go/pixa/internal/logger" + "sneak.berlin/go/pixa/internal/middleware" + "sneak.berlin/go/pixa/internal/server" +) + +var configPath string //nolint:gochecknoglobals // cobra flag + +// Run reads the command line and runs the server until it stops, with +// version as the version pixad logs and reports. It exits the process +// with status 1 when the command line is not valid. +func Run(version string) { + globals.Version = version + + rootCmd := &cobra.Command{ + Use: "pixad", + Short: "Pixa image caching proxy server", + Run: run, + } + + rootCmd.Flags().StringVarP(&configPath, "config", "c", "", "path to config file") + + err := rootCmd.Execute() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func run(_ *cobra.Command, _ []string) { + // Set config path in environment if specified via flag + if configPath != "" { + _ = os.Setenv("PIXA_CONFIG_PATH", configPath) + } + + // A write to a closed stdout or stderr must not end the process. + signal.Ignore(syscall.SIGPIPE) + + fx.New( + fx.Provide( + config.New, + database.New, + globals.New, + handlers.New, + logger.New, + server.New, + middleware.New, + healthcheck.New, + ), + fx.Invoke( + func(log *logger.Logger) { log.Identify() }, + func(*server.Server) {}, + ), + ).Run() +} diff --git a/internal/globals/globals.go b/internal/globals/globals.go index ac00731..7a3d2bb 100644 --- a/internal/globals/globals.go +++ b/internal/globals/globals.go @@ -7,8 +7,8 @@ import ( const appname = "pixad" -// Version is populated from main() via ldflags. -var Version string //nolint:gochecknoglobals // set from main +// Version is set by app.Run to the version main was built with. +var Version string //nolint:gochecknoglobals // set by app.Run // Globals holds application-wide constants. type Globals struct {