branch: convert delete_branches() to a flags argument

delete_branches() takes separate force and quiet parameters, while check_branch_commit() takes force. The next commits would grow this collection further. Replace them with a single unsigned flags argument and an enum. Test the FORCE and QUIET bits directly from flags at each use site so that mutating or forwarding flags cannot leave cached values stale. No change in behavior. Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Harald Nordgren committed Jul 22, 2026 at 07:10 UTC 106300f724b5c17dc384166d58c2c874f9ff4112
1 file changed +24 -16
builtin/branch.c
+24 -16
@@ -189,16 +189,22 @@ static int branch_merged(int kind, const char *name,
189 return merged;
190 }
191
192 +enum delete_branch_flags {
193 + DELETE_BRANCH_FORCE = (1 << 0),
194 + DELETE_BRANCH_QUIET = (1 << 1),
195 +};
196 +
197 static int check_branch_commit(const char *branchname, const char *refname,
198 const struct object_id *oid, struct commit *head_rev,
194 - int kinds, int force)
199 + int kinds, unsigned int flags)
200 {
201 struct commit *rev = lookup_commit_reference(the_repository, oid);
197 - if (!force && !rev) {
202 + if (!(flags & DELETE_BRANCH_FORCE) && !rev) {
203 error(_("couldn't look up commit object for '%s'"), refname);
204 return -1;
205 }
201 - if (!force && !branch_merged(kinds, branchname, rev, head_rev)) {
206 + if (!(flags & DELETE_BRANCH_FORCE) &&
207 + !branch_merged(kinds, branchname, rev, head_rev)) {
208 error(_("the branch '%s' is not fully merged"), branchname);
209 advise_if_enabled(ADVICE_FORCE_DELETE_BRANCH,
210 _("If you are sure you want to delete it, "
@@ -217,8 +223,8 @@ static void delete_branch_config(const char *branchname)
223 strbuf_release(&buf);
224 }
225
220 -static int delete_branches(int argc, const char **argv, int force, int kinds,
221 - int quiet)
226 +static int delete_branches(int argc, const char **argv, int kinds,
227 + unsigned int flags)
228 {
229 struct commit *head_rev = NULL;
230 struct object_id oid;
@@ -241,7 +247,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
247 remote_branch = 1;
248 allowed_interpret = INTERPRET_BRANCH_REMOTE;
249
244 - force = 1;
250 + flags |= DELETE_BRANCH_FORCE;
251 break;
252 case FILTER_REFS_BRANCHES:
253 fmt = "refs/heads/%s";
@@ -252,12 +258,12 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
258 }
259 branch_name_pos = strcspn(fmt, "%");
260
255 - if (!force)
261 + if (!(flags & DELETE_BRANCH_FORCE))
262 head_rev = lookup_commit_reference(the_repository, &head_oid);
263
264 for (i = 0; i < argc; i++, strbuf_reset(&bname)) {
265 char *target = NULL;
260 - int flags = 0;
266 + int ref_flags = 0;
267
268 copy_branchname(&bname, argv[i], allowed_interpret);
269 free(name);
@@ -279,7 +285,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
285 RESOLVE_REF_READING
286 | RESOLVE_REF_NO_RECURSE
287 | RESOLVE_REF_ALLOW_BAD_NAME,
282 - &oid, &flags);
288 + &oid, &ref_flags);
289 if (!target) {
290 if (remote_branch) {
291 error(_("remote-tracking branch '%s' not found"), bname.buf);
@@ -291,7 +297,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
297 | RESOLVE_REF_NO_RECURSE
298 | RESOLVE_REF_ALLOW_BAD_NAME,
299 &oid,
294 - &flags);
300 + &ref_flags);
301 FREE_AND_NULL(virtual_name);
302
303 if (virtual_target)
@@ -306,16 +312,16 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
312 continue;
313 }
314
309 - if (!(flags & (REF_ISSYMREF|REF_ISBROKEN)) &&
315 + if (!(ref_flags & (REF_ISSYMREF|REF_ISBROKEN)) &&
316 check_branch_commit(bname.buf, name, &oid, head_rev, kinds,
311 - force)) {
317 + flags)) {
318 ret = 1;
319 goto next;
320 }
321
322 item = string_list_append(&refs_to_delete, name);
317 - item->util = xstrdup((flags & REF_ISBROKEN) ? "broken"
318 - : (flags & REF_ISSYMREF) ? target
323 + item->util = xstrdup((ref_flags & REF_ISBROKEN) ? "broken"
324 + : (ref_flags & REF_ISSYMREF) ? target
325 : repo_find_unique_abbrev(the_repository, &oid, DEFAULT_ABBREV));
326
327 next:
@@ -330,7 +336,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
336 char *name = item->string;
337 if (!refs_ref_exists(get_main_ref_store(the_repository), name)) {
338 char *refname = name + branch_name_pos;
333 - if (!quiet)
339 + if (!(flags & DELETE_BRANCH_QUIET))
340 printf(remote_branch
341 ? _("Deleted remote-tracking branch %s (was %s).\n")
342 : _("Deleted branch %s (was %s).\n"),
@@ -872,7 +878,9 @@ int cmd_branch(int argc,
878 if (delete) {
879 if (!argc)
880 die(_("branch name required"));
875 - ret = delete_branches(argc, argv, delete > 1, filter.kind, quiet);
881 + ret = delete_branches(argc, argv, filter.kind,
882 + (delete > 1 ? DELETE_BRANCH_FORCE : 0) |
883 + (quiet ? DELETE_BRANCH_QUIET : 0));
884 goto out;
885 } else if (show_current) {
886 print_current_branch_name();