diff --git a/gen/generate.go b/gen/generate.go index b0734491..9f3ae7e6 100644 --- a/gen/generate.go +++ b/gen/generate.go @@ -4,6 +4,7 @@ import ( "bytes" _ "embed" "flag" + "fmt" "io" "os" "path/filepath" @@ -27,34 +28,38 @@ func main() { docs := flag.Bool("docs", false, "generate markdown docs") flag.Parse() - if *outputDir == "" { - panic("output directory is empty") + + if err := run(*outputDir, *docs); err != nil { + fmt.Fprintln(os.Stderr, "generate:", err) + os.Exit(1) + } +} + +func run(outputDir string, docs bool) error { + if outputDir == "" { + return fmt.Errorf("output directory is empty") } // when -docs is set, create a list of all supported markdown events as yaml on stdout // todo(cbrgm): clean this up a little bit - if *docs { - err := ExecuteMarkdownTemplate("", webhookMarkdownTemplate, params) - if err != nil { - panic(err) - } - return + if docs { + return ExecuteMarkdownTemplate("", webhookMarkdownTemplate, params) } imp, err := goGithubImportPath("go.mod") if err != nil { - panic(err) + return err } params.GoGithubImport = imp - out := filepath.Join(".", *outputDir) + out := filepath.Clean(outputDir) if err := os.MkdirAll(out, os.ModePerm); err != nil { - panic("failed to create output directory") + return fmt.Errorf("create output dir: %w", err) } // create events.go if err := ExecuteWebhookEventTemplate(filepath.Join(out, "events"), params); err != nil { - panic(err) + return err } // create individual files for each webhook event type @@ -67,9 +72,10 @@ func main() { Webhooks: []GithubWebhooks{param}, }) if err != nil { - panic(err) + return err } } + return nil } func ExecuteWebhookEventTemplate(file string, data any) error { diff --git a/gen/generate_test.go b/gen/generate_test.go new file mode 100644 index 00000000..5775106f --- /dev/null +++ b/gen/generate_test.go @@ -0,0 +1,37 @@ +package main + +import ( + "os" + "path/filepath" + "strings" + "testing" +) + +// run() generates events.go referencing the go.mod-derived import path. +func TestRunGeneratesEvents(t *testing.T) { + orig, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + defer func() { + if err := os.Chdir(orig); err != nil { + t.Fatal(err) + } + }() + + // run() reads ./go.mod, so execute from the repo root. + if err := os.Chdir(".."); err != nil { + t.Fatal(err) + } + dir := t.TempDir() + if err := run(dir, false); err != nil { + t.Fatalf("run failed: %v", err) + } + data, err := os.ReadFile(filepath.Join(dir, "events.go")) + if err != nil { + t.Fatalf("events.go not generated: %v", err) + } + if !strings.Contains(string(data), "google/go-github/v") { + t.Fatal("generated events.go missing go-github import") + } +}