reflog: fix expire --single-worktree

33d7bdd645 (builtin/reflog.c: use parse-options api for expire, delete subcommands, 2022-01-06) broke the option --single-worktree of git reflog expire and added a non-printable short flag for it, presumably by accident. While before it set the variable "all_worktrees" to 0, now it sets it to 1, its default value. --no-single-worktree is required now to set it to 0. Fix it by replacing the variable with one that has the opposite meaning, to avoid the negation and its potential for confusion. The new variable "single_worktree" directly captures whether --single-worktree was given. Also remove the unprintable short flag SOH (start of heading) because it is undocumented, hard to use and is likely to have been added by mistake in connection with the negation bug above. Signed-off-by: René Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

René Scharfe committed Oct 28, 2023 at 13:58 UTC 26d4c51d36a1f4f9463eb694758474243d7877e6
2 files changed +26 -3
builtin/reflog.c
+3 -3
@@ -243,7 +243,7 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
243 {
244 struct cmd_reflog_expire_cb cmd = { 0 };
245 timestamp_t now = time(NULL);
246 - int i, status, do_all, all_worktrees = 1;
246 + int i, status, do_all, single_worktree = 0;
247 unsigned int flags = 0;
248 int verbose = 0;
249 reflog_expiry_should_prune_fn *should_prune_fn = should_expire_reflog_ent;
@@ -268,7 +268,7 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
268 OPT_BOOL(0, "stale-fix", &cmd.stalefix,
269 N_("prune any reflog entries that point to broken commits")),
270 OPT_BOOL(0, "all", &do_all, N_("process the reflogs of all references")),
271 - OPT_BOOL(1, "single-worktree", &all_worktrees,
271 + OPT_BOOL(0, "single-worktree", &single_worktree,
272 N_("limits processing to reflogs from the current worktree only")),
273 OPT_END()
274 };
@@ -318,7 +318,7 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
318
319 worktrees = get_worktrees();
320 for (p = worktrees; *p; p++) {
321 - if (!all_worktrees && !(*p)->is_current)
321 + if (single_worktree && !(*p)->is_current)
322 continue;
323 collected.worktree = *p;
324 refs_for_each_reflog(get_worktree_ref_store(*p),
t/t1410-reflog.sh
+23
@@ -446,6 +446,29 @@ test_expect_success 'expire with multiple worktrees' '
446 )
447 '
448
449 +test_expect_success 'expire one of multiple worktrees' '
450 + git init main-wt2 &&
451 + (
452 + cd main-wt2 &&
453 + test_tick &&
454 + test_commit foo &&
455 + git worktree add link-wt &&
456 + test_tick &&
457 + test_commit -C link-wt foobar &&
458 + test_tick &&
459 + test-tool ref-store worktree:link-wt for-each-reflog-ent HEAD \
460 + >expect-link-wt &&
461 + git reflog expire --verbose --all --expire=$test_tick \
462 + --single-worktree &&
463 + test-tool ref-store worktree:main for-each-reflog-ent HEAD \
464 + >actual-main &&
465 + test-tool ref-store worktree:link-wt for-each-reflog-ent HEAD \
466 + >actual-link-wt &&
467 + test_must_be_empty actual-main &&
468 + test_cmp expect-link-wt actual-link-wt
469 + )
470 +'
471 +
472 test_expect_success REFFILES 'empty reflog' '
473 test_when_finished "rm -rf empty" &&
474 git init empty &&