Use charmbracelet/huh for an interactive add flow. Add a preview subcommand to enter/exit per-project pre-release tags. Move stamp.toml into .stamp/ and add ConfigPath helper. Prefer --snapshot then project PreTag when computing versions and promote bumps to pre-release when appropriate. Export CurrentVersion and add required TUI deps to go.mod.
99 lines
2.5 KiB
Go
99 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/urfave/cli/v3"
|
|
|
|
"git.thokra.dev/thokra/stamp/internal/config"
|
|
)
|
|
|
|
func previewCmd() *cli.Command {
|
|
return &cli.Command{
|
|
Name: "preview",
|
|
Usage: "manage pre-release mode for a project",
|
|
Commands: []*cli.Command{
|
|
{
|
|
Name: "enter",
|
|
Usage: "put a project into pre-release mode",
|
|
ArgsUsage: "<project> <tag>",
|
|
Action: func(ctx context.Context, cmd *cli.Command) error {
|
|
if cmd.Args().Len() < 2 {
|
|
return fmt.Errorf("usage: stamp preview enter <project> <tag>")
|
|
}
|
|
projectName := cmd.Args().Get(0)
|
|
tag := cmd.Args().Get(1)
|
|
|
|
repoRoot, err := findRepoRoot(".")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cfg, err := config.Load(repoRoot)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
project := cfg.FindProject(projectName)
|
|
if project == nil {
|
|
return fmt.Errorf("project %q not found in stamp.toml", projectName)
|
|
}
|
|
|
|
if project.PreTag != "" {
|
|
return fmt.Errorf("project %q is already in pre-release mode with tag %q — run `stamp preview exit %s` first",
|
|
projectName, project.PreTag, projectName)
|
|
}
|
|
|
|
project.PreTag = tag
|
|
|
|
if err := config.Save(repoRoot, cfg); err != nil {
|
|
return fmt.Errorf("saving stamp.toml: %w", err)
|
|
}
|
|
|
|
fmt.Printf("🔬 %s is now in pre-release mode (tag: %s).\n", projectName, tag)
|
|
fmt.Printf(" `stamp version` will produce versions like 1.2.3-%s.0\n", tag)
|
|
return nil
|
|
},
|
|
},
|
|
{
|
|
Name: "exit",
|
|
Usage: "take a project out of pre-release mode",
|
|
ArgsUsage: "<project>",
|
|
Action: func(ctx context.Context, cmd *cli.Command) error {
|
|
if cmd.Args().Len() == 0 {
|
|
return fmt.Errorf("usage: stamp preview exit <project>")
|
|
}
|
|
projectName := cmd.Args().First()
|
|
|
|
repoRoot, err := findRepoRoot(".")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cfg, err := config.Load(repoRoot)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
project := cfg.FindProject(projectName)
|
|
if project == nil {
|
|
return fmt.Errorf("project %q not found in stamp.toml", projectName)
|
|
}
|
|
|
|
if project.PreTag == "" {
|
|
return fmt.Errorf("project %q is not in pre-release mode", projectName)
|
|
}
|
|
|
|
project.PreTag = ""
|
|
|
|
if err := config.Save(repoRoot, cfg); err != nil {
|
|
return fmt.Errorf("saving stamp.toml: %w", err)
|
|
}
|
|
|
|
fmt.Printf("✓ %s is no longer in pre-release mode. The next `stamp version` will produce a normal release.\n", projectName)
|
|
return nil
|
|
},
|
|
},
|
|
},
|
|
}
|
|
}
|