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();