summaryrefslogtreecommitdiff
path: root/internal/cmd/release.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-07-13 17:37:16 +0300
committerPaul Buetow <paul@buetow.org>2025-07-13 17:37:16 +0300
commitfa5ef028ec9a7af801710eed190057d3b3c172f0 (patch)
tree41ef41dd1edace0438be20c4f35328c0fbfd8090 /internal/cmd/release.go
parent79225d4df3a181f08a2160ff8ec361001b9dea18 (diff)
refactor: restructure CLI with cobra command framework
- Replace flat flags with organized command structure - Add commands: sync, list, manage, release, showcase, test - Implement subcommands for better organization: - sync: repo, all, codeberg-to-github, github-to-codeberg, bidirectional - list: orgs, repos - manage: delete-repo, clean, batch-run - release: check, create (with --ai-notes support) - showcase: with --force, --output, --format, --exclude - test: github-token, codeberg-token, config - Add comprehensive help with examples for all commands - Fix config loading bug when path is empty - Update README.md with new command structure and examples - Maintain backward compatibility (old flags still work with warnings) The new structure provides better discoverability, consistent naming, and logical grouping of related functionality. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Diffstat (limited to 'internal/cmd/release.go')
-rw-r--r--internal/cmd/release.go106
1 files changed, 106 insertions, 0 deletions
diff --git a/internal/cmd/release.go b/internal/cmd/release.go
new file mode 100644
index 0000000..e7ce80a
--- /dev/null
+++ b/internal/cmd/release.go
@@ -0,0 +1,106 @@
+package cmd
+
+import (
+ "os"
+
+ "github.com/spf13/cobra"
+ "codeberg.org/snonux/gitsyncer/internal/cli"
+)
+
+var (
+ autoRelease bool
+ aiNotes bool
+ updateExisting bool
+ templatePath string
+)
+
+var releaseCmd = &cobra.Command{
+ Use: "release",
+ Short: "Manage releases across platforms",
+ Long: `Check for version tags without releases and create them across
+GitHub and Codeberg. Supports AI-generated release notes using Claude.`,
+}
+
+var releaseCheckCmd = &cobra.Command{
+ Use: "check [repo]",
+ Short: "Check for missing releases",
+ Long: `Check for version tags that don't have corresponding releases.
+If no repository is specified, checks all configured repositories.`,
+ Args: cobra.MaximumNArgs(1),
+ Example: ` # Check all repositories
+ gitsyncer release check
+
+ # Check specific repository
+ gitsyncer release check myproject
+
+ # Check with dry-run
+ gitsyncer release check --dry-run`,
+ Run: func(cmd *cobra.Command, args []string) {
+ flags := buildFlags()
+ flags.CheckReleases = true
+
+ if len(args) > 0 {
+ // Check specific repo
+ exitCode := cli.HandleCheckReleasesForRepo(cfg, flags, args[0])
+ os.Exit(exitCode)
+ } else {
+ // Check all repos
+ exitCode := cli.HandleCheckReleases(cfg, flags)
+ os.Exit(exitCode)
+ }
+ },
+}
+
+var releaseCreateCmd = &cobra.Command{
+ Use: "create [repo]",
+ Short: "Create releases for version tags",
+ Long: `Create releases for version tags that don't have them.
+If no repository is specified, processes all configured repositories.`,
+ Args: cobra.MaximumNArgs(1),
+ Example: ` # Create releases with confirmation prompts
+ gitsyncer release create
+
+ # Auto-create without prompts
+ gitsyncer release create --auto
+
+ # Create with AI-generated notes
+ gitsyncer release create --ai-notes
+
+ # Update existing releases with AI notes
+ gitsyncer release create --update-existing --ai-notes
+
+ # Create for specific repository
+ gitsyncer release create myproject --ai-notes`,
+ Run: func(cmd *cobra.Command, args []string) {
+ flags := buildFlags()
+ flags.CheckReleases = true
+ flags.AutoCreateReleases = autoRelease
+ flags.AIReleaseNotes = aiNotes
+ flags.UpdateReleases = updateExisting
+
+ if len(args) > 0 {
+ // Create releases for specific repo
+ exitCode := cli.HandleCheckReleasesForRepo(cfg, flags, args[0])
+ os.Exit(exitCode)
+ } else {
+ // Create releases for all repos
+ exitCode := cli.HandleCheckReleases(cfg, flags)
+ os.Exit(exitCode)
+ }
+ },
+}
+
+func init() {
+ rootCmd.AddCommand(releaseCmd)
+ releaseCmd.AddCommand(releaseCheckCmd)
+ releaseCmd.AddCommand(releaseCreateCmd)
+
+ // Release flags
+ releaseCmd.PersistentFlags().BoolVar(&dryRun, "dry-run", false, "preview what releases would be created")
+
+ // Create-specific flags
+ releaseCreateCmd.Flags().BoolVar(&autoRelease, "auto", false, "skip confirmation prompts")
+ releaseCreateCmd.Flags().BoolVar(&aiNotes, "ai-notes", false, "generate release notes using Claude AI based on git diff")
+ releaseCreateCmd.Flags().BoolVar(&updateExisting, "update-existing", false, "update existing releases with new AI-generated notes")
+ releaseCreateCmd.Flags().StringVar(&templatePath, "template", "", "custom template for release notes")
+} \ No newline at end of file