package main import ( "context" "errors" "fmt" "io" "os" "os/signal" "syscall" "gitea.maximumdirect.net/eric/ReleaseKit" "gitea.maximumdirect.net/eric/ReleaseKit/buildinfo" "gitea.maximumdirect.net/eric/ReleaseKit/cmd/releasekit/internal/cli" ) func main() { ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) code := run(ctx, os.Args[1:], os.Stdout, os.Stderr) stop() os.Exit(code) } func run(ctx context.Context, args []string, stdout, stderr io.Writer) int { invocation, err := cli.Parse(args) if err != nil { fmt.Fprintf(stderr, "%v\n%s\n", err, cli.Usage) return 2 } switch invocation.Command { case cli.VersionCommand: fmt.Fprintf(stdout, "releasekit %s\n", buildinfo.Version()) return 0 case cli.CheckAction, cli.PublishAction: settings, err := cli.LoadSettings(invocation.Repository, invocation.ConfigPath) if err != nil { fmt.Fprintf(stderr, "load profile: %v\n", err) return 2 } request := releasekit.ReleaseRequest{ RepositoryDir: invocation.Repository, Product: settings.Product, Version: invocation.Version, Remote: settings.Remote, Output: stderr, } if len(settings.Checks) != 0 { checks := settings.Checks request.Validate = func(ctx context.Context, candidate releasekit.Candidate) error { return cli.RunChecks(ctx, candidate.RepositoryDir, checks, map[string]string{ "RELEASEKIT_VERSION": candidate.Version, "RELEASEKIT_CANDIDATE": candidate.Commit, }, stderr, stderr) } } if invocation.Command == cli.PublishAction { fmt.Fprintf(stderr, "validating and publishing %s\n", invocation.Version) result, err := releasekit.Publish(ctx, request) if err != nil { fmt.Fprintf(stderr, "publication state=%s phase=%s version=%s commit=%s tag-object=%s: %v\n", result.State, result.Phase, result.Version, result.CandidateCommit, result.TagObject, err) if errors.Is(err, releasekit.ErrInvalidVersion) { return 2 } if result.State == releasekit.PublicationUnknown { return 3 } return 1 } fmt.Fprintf(stdout, "published %s at %s (tag object %s)\n", result.Version, result.CandidateCommit, result.TagObject) return 0 } candidate, err := releasekit.Check(ctx, request) if err != nil { fmt.Fprintf(stderr, "check failed: %v\n", err) if errors.Is(err, releasekit.ErrInvalidVersion) { return 2 } return 1 } fmt.Fprintf(stdout, "local candidate %s at %s is valid\n", candidate.Version, candidate.Commit) return 0 } return 2 }