Skip to content

Commit 3f3acde

Browse files
committed
addressing review comments
1 parent bfebb7f commit 3f3acde

2 files changed

Lines changed: 22 additions & 4 deletions

File tree

cmd/sync.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ conflicts interactively.
4141
Use --prune to delete local branches for merged PRs. Stack metadata is
4242
preserved so that rebase and display logic continue to work correctly.
4343
If you are on a branch that would be pruned, your checkout is moved to
44-
the nearest active branch or the trunk.`,
44+
the first active branch in the stack, or the trunk if all are merged.`,
4545
RunE: func(cmd *cobra.Command, args []string) error {
4646
return runSync(cfg, opts)
4747
},
@@ -417,9 +417,6 @@ func runSync(cfg *config.Config, opts *syncOptions) error {
417417
if err := git.DeleteBranch(name, true); err != nil {
418418
cfg.Warningf("Failed to delete %s: %v", name, err)
419419
} else {
420-
// Also remove the remote-tracking ref so that
421-
// `git checkout <name>` doesn't recreate the branch.
422-
_ = git.DeleteTrackingRef(remote, name)
423420
cfg.Successf("Pruned %s (merged)", name)
424421
pruned++
425422
}
@@ -431,6 +428,13 @@ func runSync(cfg *config.Config, opts *syncOptions) error {
431428
cfg.Printf("")
432429
cfg.Printf("No merged branches to prune")
433430
}
431+
432+
// Clean up remote-tracking refs for all merged branches, even if
433+
// the local branch was already deleted. This prevents
434+
// `git checkout <name>` from resurrecting the branch.
435+
for _, b := range merged {
436+
_ = git.DeleteTrackingRef(remote, b.Branch)
437+
}
434438
}
435439

436440
// --- Step 7: Update base SHAs and save ---

cmd/sync_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,7 @@ func TestSync_Prune_DeletesMergedBranches(t *testing.T) {
10351035
writeStackFile(t, tmpDir, s)
10361036

10371037
var deletedBranches []string
1038+
var deletedTrackingRefs []string
10381039

10391040
mock := newSyncMock(tmpDir, "b2")
10401041
mock.BranchExistsFn = func(name string) bool { return true }
@@ -1043,6 +1044,10 @@ func TestSync_Prune_DeletesMergedBranches(t *testing.T) {
10431044
assert.True(t, force, "should force-delete merged branch")
10441045
return nil
10451046
}
1047+
mock.DeleteTrackingRefFn = func(remote, branch string) error {
1048+
deletedTrackingRefs = append(deletedTrackingRefs, remote+"/"+branch)
1049+
return nil
1050+
}
10461051

10471052
restore := git.SetOps(mock)
10481053
defer restore()
@@ -1060,6 +1065,7 @@ func TestSync_Prune_DeletesMergedBranches(t *testing.T) {
10601065

10611066
assert.NoError(t, err)
10621067
assert.Equal(t, []string{"b1"}, deletedBranches)
1068+
assert.Equal(t, []string{"origin/b1"}, deletedTrackingRefs, "should delete remote-tracking ref for pruned branch")
10631069
assert.Contains(t, output, "Pruned b1 (merged)")
10641070
assert.Contains(t, output, "Pruned 1 merged branch")
10651071
}
@@ -1087,6 +1093,12 @@ func TestSync_Prune_SkipsNonExistentBranches(t *testing.T) {
10871093
return nil
10881094
}
10891095

1096+
var deletedTrackingRefs []string
1097+
mock.DeleteTrackingRefFn = func(remote, branch string) error {
1098+
deletedTrackingRefs = append(deletedTrackingRefs, remote+"/"+branch)
1099+
return nil
1100+
}
1101+
10901102
restore := git.SetOps(mock)
10911103
defer restore()
10921104

@@ -1103,6 +1115,8 @@ func TestSync_Prune_SkipsNonExistentBranches(t *testing.T) {
11031115

11041116
assert.NoError(t, err)
11051117
assert.Contains(t, output, "No merged branches to prune")
1118+
// Tracking ref should still be cleaned up even though local branch is gone
1119+
assert.Equal(t, []string{"origin/b1"}, deletedTrackingRefs, "should delete tracking ref even when local branch is already gone")
11061120
}
11071121

11081122
// TestSync_Prune_SwitchesToLowestUnmergedBranch verifies that when the user is

0 commit comments

Comments
 (0)