branch: prepare delete_branches for a bulk caller

Teach delete_branches() a new mode for the upcoming --delete-merged
caller that checks whether a branch is merged into its upstream without
falling back to HEAD when there is no upstream. Existing callers keep
their current behavior.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
jch
Harald Nordgren 2026-07-25 11:32:13 +00:00 committed by Junio C Hamano
parent 3b329696f9
commit 01df07c9df
1 changed files with 9 additions and 4 deletions

View File

@ -168,10 +168,13 @@ static int branch_merged(int kind, const char *name,
* upstream, if any, otherwise with HEAD", we should just
* return the result of the repo_in_merge_bases() above without
* any of the following code, but during the transition period,
* a gentle reminder is in order.
* a gentle reminder is in order. Callers that opt out of the
* HEAD fallback by passing head_rev=NULL are not interested in
* the reminder either: they have already established that the
* branch has an upstream, so HEAD is irrelevant to the decision.
*/
if (head_rev != reference_rev) {
int expect = head_rev ? repo_in_merge_bases(the_repository, rev, head_rev) : 0;
if (head_rev && head_rev != reference_rev) {
int expect = repo_in_merge_bases(the_repository, rev, head_rev);
if (expect < 0)
exit(128);
if (expect == merged)
@ -193,6 +196,7 @@ enum delete_branch_flags {
DELETE_BRANCH_FORCE = (1 << 0),
DELETE_BRANCH_QUIET = (1 << 1),
DELETE_BRANCH_SKIP_UNMERGED = (1 << 2),
DELETE_BRANCH_NO_HEAD_FALLBACK = (1 << 3),
};

static int check_branch_commit(const char *branchname, const char *refname,
@ -262,7 +266,8 @@ static int delete_branches(int argc, const char **argv, int kinds,
}
branch_name_pos = strcspn(fmt, "%");

if (!(flags & DELETE_BRANCH_FORCE))
if (!(flags & DELETE_BRANCH_FORCE) &&
!(flags & DELETE_BRANCH_NO_HEAD_FALLBACK))
head_rev = lookup_commit_reference(the_repository, &head_oid);

for (i = 0; i < argc; i++, strbuf_reset(&bname)) {