Harden release publication plumbing
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"io"
|
||||
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/app"
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/buildinfo"
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/config"
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/report"
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/timeutil"
|
||||
@@ -16,6 +17,7 @@ const helpText = `weatherreporter prepares weather reports from normalized forec
|
||||
|
||||
Usage:
|
||||
weatherreporter --help
|
||||
weatherreporter --version
|
||||
weatherreporter generate daily --date YYYY-MM-DD [--config PATH] [--units VALUE] [--tz NAME] [--out PATH] [--llm-debug-dir PATH] [--quiet]
|
||||
weatherreporter generate today [--config PATH] [--units VALUE] [--tz NAME] [--out PATH] [--date YYYY-MM-DD] [--llm-debug-dir PATH] [--quiet]
|
||||
weatherreporter generate tomorrow [--config PATH] [--units VALUE] [--tz NAME] [--out PATH] [--llm-debug-dir PATH] [--quiet]
|
||||
@@ -31,6 +33,7 @@ Usage:
|
||||
|
||||
Options:
|
||||
-h, --help Show this help message.
|
||||
--version Show the Weatherreporter version.
|
||||
--config PATH Load configuration from PATH instead of /usr/local/etc/weatherreporter/config.yml.
|
||||
--units VALUE Override weather API units.
|
||||
--tz NAME Override weather API timezone.
|
||||
@@ -43,6 +46,7 @@ Options:
|
||||
type Runner struct {
|
||||
Clock timeutil.Clock
|
||||
ExecutorFactory ExecutorFactory
|
||||
Version string
|
||||
}
|
||||
|
||||
func Run(ctx context.Context, args []string, stdout io.Writer, stderr io.Writer) error {
|
||||
@@ -57,6 +61,17 @@ func (r Runner) Run(ctx context.Context, args []string, stdout io.Writer, stderr
|
||||
_, err := fmt.Fprint(stdout, helpText)
|
||||
return err
|
||||
}
|
||||
if args[0] == "--version" {
|
||||
if len(args) != 1 {
|
||||
return fmt.Errorf("--version does not accept arguments")
|
||||
}
|
||||
version := r.Version
|
||||
if version == "" {
|
||||
version = buildinfo.Version
|
||||
}
|
||||
_, err := fmt.Fprintf(stdout, "weatherreporter %s\n", version)
|
||||
return err
|
||||
}
|
||||
|
||||
switch args[0] {
|
||||
case "generate":
|
||||
|
||||
@@ -88,6 +88,7 @@ func TestRunnerHelpListsOnlySupportedCommands(t *testing.T) {
|
||||
t.Fatalf("Run(--help) error = %v", err)
|
||||
}
|
||||
for _, command := range []string{
|
||||
"--version",
|
||||
"generate daily", "generate today", "generate tomorrow", "generate hourly", "run morning", "run evening",
|
||||
"inspect reports", "inspect metadata", "inspect modules", "inspect data-package", "inspect prior", "inspect sources",
|
||||
} {
|
||||
@@ -102,6 +103,30 @@ func TestRunnerHelpListsOnlySupportedCommands(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestRunnerVersion(t *testing.T) {
|
||||
for _, test := range []struct {
|
||||
name string
|
||||
runner Runner
|
||||
version string
|
||||
}{
|
||||
{name: "development default", runner: Runner{}, version: "development"},
|
||||
{name: "injected release", runner: Runner{Version: "v0.9.0-test"}, version: "v0.9.0-test"},
|
||||
} {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
output, err := runCLICommand(test.runner, "--version")
|
||||
if err != nil {
|
||||
t.Fatalf("Run(--version) error = %v", err)
|
||||
}
|
||||
if output.stdout != "weatherreporter "+test.version+"\n" || output.stderr != "" {
|
||||
t.Fatalf("Run(--version) output = stdout %q stderr %q", output.stdout, output.stderr)
|
||||
}
|
||||
})
|
||||
}
|
||||
if _, err := runCLICommand(Runner{Version: "v0.9.0-test"}, "--version", "extra"); err == nil {
|
||||
t.Fatal("Run(--version extra) error = nil")
|
||||
}
|
||||
}
|
||||
|
||||
func TestResolveSupportedCommandsAndFlags(t *testing.T) {
|
||||
configPath := writeCLIConfig(t, t.TempDir(), "")
|
||||
runner, constructions := countingRunner(cliExecutor{})
|
||||
|
||||
Reference in New Issue
Block a user