From ceb164c6a8826db1e763aecca49098a8c2584b7f Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 12 Jul 2025 13:51:48 +0300 Subject: feat: add automatic release checking and creation - Add --check-releases flag for manual release checking - Enable automatic release checking after sync operations by default - Add --no-check-releases flag to disable automatic checking - Add --auto-create-releases flag for unattended release creation - Generate release notes from commit history - Support version tag formats: vX.Y.Z, vX.Y, vX, X.Y.Z, X.Y, X - Use tokens from gitsyncer config (with fallback to env vars and files) - Show release notes preview before creating releases - Group commits by type (features, fixes, other) in release notes --- cmd/gitsyncer/main.go | 69 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 21 deletions(-) (limited to 'cmd') diff --git a/cmd/gitsyncer/main.go b/cmd/gitsyncer/main.go index f27cff6..d4a3e6f 100644 --- a/cmd/gitsyncer/main.go +++ b/cmd/gitsyncer/main.go @@ -6,6 +6,7 @@ import ( "path/filepath" "codeberg.org/snonux/gitsyncer/internal/cli" + "codeberg.org/snonux/gitsyncer/internal/config" "codeberg.org/snonux/gitsyncer/internal/state" ) @@ -23,6 +24,15 @@ func saveBatchRunState(flags *cli.Flags) { } } +// runReleaseCheckIfEnabled runs release checking after successful sync operations +func runReleaseCheckIfEnabled(cfg *config.Config, flags *cli.Flags) { + // Run release checks automatically unless disabled + if !flags.NoCheckReleases { + fmt.Println("\nChecking for missing releases...") + cli.HandleCheckReleases(cfg, flags) + } +} + func main() { // Parse command-line flags flags := cli.ParseFlags() @@ -102,10 +112,13 @@ func main() { // Handle sync operation if flags.SyncRepo != "" { exitCode := cli.HandleSync(cfg, flags) - if exitCode == 0 && flags.Showcase { - showcaseCode := cli.HandleShowcase(cfg, flags) - if showcaseCode != 0 { - os.Exit(showcaseCode) + if exitCode == 0 { + runReleaseCheckIfEnabled(cfg, flags) + if flags.Showcase { + showcaseCode := cli.HandleShowcase(cfg, flags) + if showcaseCode != 0 { + os.Exit(showcaseCode) + } } } os.Exit(exitCode) @@ -114,10 +127,13 @@ func main() { // Handle sync all operation if flags.SyncAll { exitCode := cli.HandleSyncAll(cfg, flags) - if exitCode == 0 && flags.Showcase { - showcaseCode := cli.HandleShowcase(cfg, flags) - if showcaseCode != 0 { - os.Exit(showcaseCode) + if exitCode == 0 { + runReleaseCheckIfEnabled(cfg, flags) + if flags.Showcase { + showcaseCode := cli.HandleShowcase(cfg, flags) + if showcaseCode != 0 { + os.Exit(showcaseCode) + } } } os.Exit(exitCode) @@ -127,10 +143,13 @@ func main() { if flags.SyncCodebergPublic { exitCode := cli.HandleSyncCodebergPublic(cfg, flags) if exitCode != 0 || !flags.SyncGitHubPublic { - if exitCode == 0 && flags.Showcase && !flags.SyncGitHubPublic { - showcaseCode := cli.HandleShowcase(cfg, flags) - if showcaseCode != 0 { - os.Exit(showcaseCode) + if exitCode == 0 { + runReleaseCheckIfEnabled(cfg, flags) + if flags.Showcase && !flags.SyncGitHubPublic { + showcaseCode := cli.HandleShowcase(cfg, flags) + if showcaseCode != 0 { + os.Exit(showcaseCode) + } } } os.Exit(exitCode) @@ -141,22 +160,30 @@ func main() { if flags.SyncGitHubPublic { exitCode := cli.HandleSyncGitHubPublic(cfg, flags) - // Run showcase generation if requested and sync was successful - if exitCode == 0 && flags.Showcase { - showcaseCode := cli.HandleShowcase(cfg, flags) - if showcaseCode != 0 { - os.Exit(showcaseCode) - } - } - - // Save batch run state if this was a successful batch run if exitCode == 0 { + // Run release checks after successful sync + runReleaseCheckIfEnabled(cfg, flags) + + // Run showcase generation if requested + if flags.Showcase { + showcaseCode := cli.HandleShowcase(cfg, flags) + if showcaseCode != 0 { + os.Exit(showcaseCode) + } + } + + // Save batch run state if this was a successful batch run saveBatchRunState(flags) } os.Exit(exitCode) } + // Handle check releases flag + if flags.CheckReleases { + os.Exit(cli.HandleCheckReleases(cfg, flags)) + } + // Handle standalone showcase mode (no sync operations specified) if flags.Showcase { fmt.Println("Running showcase generation for all repositories (clone-only mode)...") -- cgit v1.2.3