diff options
| author | Paul Buetow <paul@buetow.org> | 2025-07-13 17:37:16 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-07-13 17:37:16 +0300 |
| commit | fa5ef028ec9a7af801710eed190057d3b3c172f0 (patch) | |
| tree | 41ef41dd1edace0438be20c4f35328c0fbfd8090 /internal/cmd/release.go | |
| parent | 79225d4df3a181f08a2160ff8ec361001b9dea18 (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.go | 106 |
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 |
