diff --git a/cmd/sdlc/cmd_branch.go b/cmd/sdlc/cmd_branch.go index e5f7e8c..edeed44 100644 --- a/cmd/sdlc/cmd_branch.go +++ b/cmd/sdlc/cmd_branch.go @@ -52,20 +52,25 @@ var branchCreateCmd = &cobra.Command{ } } - pushCmd := exec.Command("git", "push", "origin", "HEAD") - pushCmd.Dir = root - if _, err := pushCmd.CombinedOutput(); err != nil { - // Retry once — transient Gitea failures are common - time.Sleep(2 * time.Second) - retryCmd := exec.Command("git", "push", "origin", "HEAD") - retryCmd.Dir = root - if retryOut, retryErr := retryCmd.CombinedOutput(); retryErr != nil { - // Roll back the local commit so state doesn't diverge - rollbackCmd := exec.Command("git", "reset", "--soft", "HEAD~1") - rollbackCmd.Dir = root - _ = rollbackCmd.Run() - return fmt.Errorf("failed to push branch state to remote (branch not created): %s: %w", - strings.TrimSpace(string(retryOut)), retryErr) + // Only push if origin remote exists (skip in local-only/test contexts) + hasOrigin := exec.Command("git", "remote", "get-url", "origin") + hasOrigin.Dir = root + if hasOrigin.Run() == nil { + pushCmd := exec.Command("git", "push", "origin", "HEAD") + pushCmd.Dir = root + if _, err := pushCmd.CombinedOutput(); err != nil { + // Retry once — transient Gitea failures are common + time.Sleep(2 * time.Second) + retryCmd := exec.Command("git", "push", "origin", "HEAD") + retryCmd.Dir = root + if retryOut, retryErr := retryCmd.CombinedOutput(); retryErr != nil { + // Roll back the local commit so state doesn't diverge + rollbackCmd := exec.Command("git", "reset", "--soft", "HEAD~1") + rollbackCmd.Dir = root + _ = rollbackCmd.Run() + return fmt.Errorf("failed to push branch state to remote (branch not created): %s: %w", + strings.TrimSpace(string(retryOut)), retryErr) + } } }