@@ -123,14 +123,20 @@ teardown() {
123123 [ " $status " -eq 0 ]
124124}
125125
126+ @test " cmd_clean rejects --to without --merged" {
127+ run cmd_clean --to main
128+ [ " $status " -eq 1 ]
129+ [[ " $output " == * " --to can only be used with --merged" * ]]
130+ }
131+
126132@test " cmd_clean --merged --force removes dirty merged worktrees" {
127133 create_test_worktree " merged-force"
128134 echo " dirty" > " $TEST_WORKTREES_DIR /merged-force/dirty.txt"
129135 git -C " $TEST_WORKTREES_DIR /merged-force" add dirty.txt
130136
131137 _clean_detect_provider () { printf " github" ; }
132138 ensure_provider_cli () { return 0; }
133- check_branch_merged () { [ " $2 " = " merged-force" ]; }
139+ check_branch_merged () { [ " $2 " = " merged-force" ] && [ -z " $3 " ] ; }
134140 run_hooks_in () { return 0; }
135141 run_hooks () { return 0; }
136142
@@ -139,6 +145,54 @@ teardown() {
139145 [ ! -d " $TEST_WORKTREES_DIR /merged-force" ]
140146}
141147
148+ @test " cmd_clean --merged --to filters by target ref" {
149+ create_test_worktree " merged-to-main"
150+ create_test_worktree " merged-to-feature"
151+
152+ _clean_detect_provider () { printf " github" ; }
153+ ensure_provider_cli () { return 0; }
154+ check_branch_merged () {
155+ [ " $3 " = " main" ] && [ " $2 " = " merged-to-main" ]
156+ }
157+ run_hooks_in () { return 0; }
158+ run_hooks () { return 0; }
159+
160+ run cmd_clean --merged --to main --yes
161+ [ " $status " -eq 0 ]
162+ [ ! -d " $TEST_WORKTREES_DIR /merged-to-main" ]
163+ [ -d " $TEST_WORKTREES_DIR /merged-to-feature" ]
164+ }
165+
166+ @test " cmd_clean passes current branch HEAD to merged check" {
167+ create_test_worktree " merged-tip"
168+ local branch_tip
169+ branch_tip=$( git -C " $TEST_WORKTREES_DIR /merged-tip" rev-parse HEAD)
170+
171+ _clean_detect_provider () { printf " github" ; }
172+ ensure_provider_cli () { return 0; }
173+ check_branch_merged () { [ " $2 " = " merged-tip" ] && [ " $3 " = " main" ] && [ " $4 " = " $branch_tip " ]; }
174+ run_hooks_in () { return 0; }
175+ run_hooks () { return 0; }
176+
177+ run cmd_clean --merged --to main --yes
178+ [ " $status " -eq 0 ]
179+ [ ! -d " $TEST_WORKTREES_DIR /merged-tip" ]
180+ }
181+
182+ @test " cmd_clean does not log dirty skip for non-merged worktree" {
183+ create_test_worktree " dirty-not-merged"
184+ echo " dirty" > " $TEST_WORKTREES_DIR /dirty-not-merged/dirty.txt"
185+ git -C " $TEST_WORKTREES_DIR /dirty-not-merged" add dirty.txt
186+
187+ _clean_detect_provider () { printf " github" ; }
188+ ensure_provider_cli () { return 0; }
189+ check_branch_merged () { return 1; }
190+
191+ run cmd_clean --merged --to main --yes
192+ [ " $status " -eq 0 ]
193+ [[ " $output " != * " dirty-not-merged" * ]]
194+ }
195+
142196@test " cmd_clean --merged --force skips the current active worktree" {
143197 create_test_worktree " active-merged"
144198 cd " $TEST_WORKTREES_DIR /active-merged" || false
@@ -147,7 +201,7 @@ teardown() {
147201
148202 _clean_detect_provider () { printf " github" ; }
149203 ensure_provider_cli () { return 0; }
150- check_branch_merged () { [ " $2 " = " active-merged" ]; }
204+ check_branch_merged () { [ " $2 " = " active-merged" ] && [ -z " $3 " ] ; }
151205 run_hooks_in () { return 0; }
152206 run_hooks () { return 0; }
153207
0 commit comments