Thread (211 messages) 211 messages, 6 authors, 1d ago

Re: [PATCH v18 7/7] branch: add --dry-run for --delete-merged

From: Phillip Wood <hidden>
Date: 2026-07-13 15:27:36

Hi Harald

On 24/06/2026 22:55, Harald Nordgren via GitGitGadget wrote:
From: Harald Nordgren <redacted>

With --dry-run, --delete-merged prints the local branches it would
delete, one "Would delete branch <name>" line each, and exits
without touching any ref. The same filtering applies, so the output
is exactly the set that the real run would delete.
The same filtering as what? I think something like

"git branch --dry-run --delete-merged ..." prints one line per ref that 
would be deleted without modifing any refs.

would be sufficient
--dry-run is only meaningful together with --delete-merged and is
rejected otherwise.
Good
quoted hunk ↗ jump to hunk
@@ -346,13 +348,20 @@ static int delete_branches(int argc, const char **argv, int kinds,
  		free(target);
  	}
  
-	if (refs_delete_refs(get_main_ref_store(the_repository), NULL, &refs_to_delete, REF_NO_DEREF))
+	if (!dry_run &&
+	    refs_delete_refs(get_main_ref_store(the_repository), NULL, &refs_to_delete, REF_NO_DEREF))
  		ret = 1;
  
  	for_each_string_list_item(item, &refs_to_delete) {
  		char *describe_ref = item->util;
  		char *name = item->string;
-		if (!refs_ref_exists(get_main_ref_store(the_repository), name)) {
+		if (dry_run) {
+			if (!quiet)
This matches what we do without '--dry-run' but what use is '--dry-run 
--quiet' if it does not print anything?
quoted hunk ↗ jump to hunk
+				printf(remote_branch
+					? _("Would delete remote-tracking branch %s (was %s).\n")
+					: _("Would delete branch %s (was %s).\n"),
+					name + branch_name_pos, describe_ref);
+		} else if (!refs_ref_exists(get_main_ref_store(the_repository), name)) {
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index b7595610d9..cddcde341d 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -1892,8 +1892,12 @@ test_expect_success '--delete-merged deletes merged branches and spares the rest
  	) &&
  	sha=$(git -C repo rev-parse --short merged) &&
  
-	git -C repo branch --delete-merged origin/next >actual 2>&1 &&
+	git -C repo branch --dry-run --delete-merged origin/next >actual 2>&1 &&
+	echo "Would delete branch merged (was $sha)." >expect &&
+	test_cmp expect actual &&
+	git -C repo rev-parse --verify refs/heads/merged &&
  
+	git -C repo branch --delete-merged origin/next >actual 2>&1 &&
I was wondering why the diff shows the line above being deleted and then 
added, it is because previously there was a blank line after it. The 
test for --dry-run looks good.
quoted hunk ↗ jump to hunk
  	echo "Deleted branch merged (was $sha)." >expect &&
  	test_cmp expect actual &&
  	git -C repo for-each-ref --format="%(refname:short)" refs/heads/ >actual &&
@@ -2050,4 +2054,9 @@ test_expect_success "branch -d still deletes a deleteMerged=false branch" '
  	test_must_fail git -C repo rev-parse --verify refs/heads/kept
  '
  
+test_expect_success '--dry-run without --delete-merged is rejected' '
+	test_must_fail git -C forked branch --dry-run 2>err &&
+	test_grep "requires --delete-merged" err
Nice

Thanks

Phillip
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help