diff --git a/cmd/dev/dev_push.go b/cmd/dev/dev_push.go index 398af28b..6a401c9b 100644 --- a/cmd/dev/dev_push.go +++ b/cmd/dev/dev_push.go @@ -141,9 +141,7 @@ func runPush(registryPath string, force bool) error { succeeded++ } else { // Check if this is a non-fast-forward error (diverged branch) - isNFF := git.IsNonFastForward(r.Error) - fmt.Fprintf(os.Stderr, "[DEBUG] IsNonFastForward=%v, err=%q\n", isNFF, r.Error) - if isNFF { + if git.IsNonFastForward(r.Error) { fmt.Printf(" %s %s: %s\n", warningStyle.Render("!"), r.Name, i18n.T("cmd.dev.push.diverged")) divergedRepos = append(divergedRepos, r) } else { diff --git a/cmd/dev/dev_work.go b/cmd/dev/dev_work.go index cca9cca9..75429115 100644 --- a/cmd/dev/dev_work.go +++ b/cmd/dev/dev_work.go @@ -186,11 +186,41 @@ func runWork(registryPath string, statusOnly, autoCommit bool) error { results := git.PushMultiple(ctx, pushPaths, names) + var divergedRepos []git.PushResult + for _, r := range results { if r.Success { fmt.Printf(" %s %s\n", successStyle.Render("v"), r.Name) } else { - fmt.Printf(" %s %s: %s\n", errorStyle.Render("x"), r.Name, r.Error) + // Check if this is a non-fast-forward error (diverged branch) + if git.IsNonFastForward(r.Error) { + fmt.Printf(" %s %s: %s\n", warningStyle.Render("!"), r.Name, i18n.T("cmd.dev.push.diverged")) + divergedRepos = append(divergedRepos, r) + } else { + fmt.Printf(" %s %s: %s\n", errorStyle.Render("x"), r.Name, r.Error) + } + } + } + + // Handle diverged repos - offer to pull and retry + if len(divergedRepos) > 0 { + fmt.Println() + fmt.Printf("%s\n", i18n.T("cmd.dev.push.diverged_help")) + if shared.Confirm(i18n.T("cmd.dev.push.pull_and_retry")) { + fmt.Println() + for _, r := range divergedRepos { + fmt.Printf(" %s %s...\n", dimStyle.Render("↓"), r.Name) + if err := git.Pull(ctx, r.Path); err != nil { + fmt.Printf(" %s %s: %s\n", errorStyle.Render("x"), r.Name, err) + continue + } + fmt.Printf(" %s %s...\n", dimStyle.Render("↑"), r.Name) + if err := git.Push(ctx, r.Path); err != nil { + fmt.Printf(" %s %s: %s\n", errorStyle.Render("x"), r.Name, err) + continue + } + fmt.Printf(" %s %s\n", successStyle.Render("v"), r.Name) + } } }