From: Junio C Hamano <gitster@pobox.com>
To: Pushkar Singh <pushkarkumarsingh1970@gmail.com>
Cc: git@vger.kernel.org, peff@peff.net, ps@pks.im, r.norouzi@proton.me
Subject: Re: [PATCH v2] reflog: fix default expiry periods
Date: Wed, 23 Sep 2026 12:26:51 -0700 [thread overview]
Message-ID: <xmqqpky3ahvo.fsf@gitster.g> (raw)
In-Reply-To: <20260923102140.25475-2-pushkarkumarsingh1970@gmail.com> (Pushkar Singh's message of "Wed, 23 Sep 2026 10:21:41 +0000")
Pushkar Singh <pushkarkumarsingh1970@gmail.com> writes:
> The default reflog expiry periods were swapped when they were moved to
> REFLOG_EXPIRE_OPTIONS_INIT() by 85658275702b (builtin/reflog: stop storing
> default reflog expiry dates globally).
>
> This caused reachable entries to expire after 30 days instead of 90 days,
> and unreachable entries after 90 days instead of 30 days.
>
> Reported-by: r.norouzi <r.norouzi@proton.me>
> Signed-off-by: Pushkar Singh <pushkarkumarsingh1970@gmail.com>
> ---
The above reads very well.
> #define REFLOG_EXPIRE_OPTIONS_INIT(now) { \
> - .default_expire_total = now - 30 * 24 * 3600, \
> - .default_expire_unreachable = now - 90 * 24 * 3600, \
> + .default_expire_total = now - 90 * 24 * 3600, \
> + .default_expire_unreachable = now - 30 * 24 * 3600, \
> }
and the fix is very straight-forward.
> diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh
> index 8f78cf4b01..c494aa5ef0 100755
> --- a/t/t1410-reflog.sh
> +++ b/t/t1410-reflog.sh
> @@ -153,6 +153,51 @@ test_expect_success 'reflog expire should not barf on an annotated tag' '
> test_grep ! "error: [Oo]bject .* not a commit" err
> '
>
> +test_expect_success 'reflog expire uses the correct default expiry periods' '
> + test_when_finished "rm -rf reachable-keep reachable-expire unreachable" &&
> + git init reachable-keep &&
> + (
> + cd reachable-keep &&
> + timestamp=$(test-tool date timestamp "60.days.ago") &&
> + timestamp=${timestamp#* -> } &&
> + test_commit --no-tag --date "$timestamp +0000" old &&
> + git reflog expire --all &&
> + test_stdout_line_count = 1 git reflog refs/heads/main
> + ) &&
> + git init reachable-expire &&
> + (
> + cd reachable-expire &&
> + timestamp=$(test-tool date timestamp "100.days.ago") &&
> + timestamp=${timestamp#* -> } &&
> + test_commit --no-tag --date "$timestamp +0000" old &&
> + git reflog expire --all &&
> + test_stdout_line_count = 0 git reflog refs/heads/main
> + ) &&
> + git init unreachable &&
> + (
> + cd unreachable &&
> + test_commit --no-tag base &&
> + base=$(git rev-parse HEAD) &&
> + timestamp=$(test-tool date timestamp "20.days.ago") &&
> + timestamp=${timestamp#* -> } &&
> + test_commit --no-tag --date "$timestamp +0000" old-20 &&
> + old20=$(git rev-parse HEAD) &&
> + git update-ref refs/heads/main "$base" &&
> + timestamp=$(test-tool date timestamp "40.days.ago") &&
> + timestamp=${timestamp#* -> } &&
> + test_commit --no-tag --date "$timestamp +0000" old-40 &&
> + old40=$(git rev-parse HEAD) &&
> + git update-ref refs/heads/main "$base" &&
> + git rev-list --all --objects >reachable &&
> + test_grep ! "$old20" reachable &&
> + test_grep ! "$old40" reachable &&
> + git reflog expire --all &&
> + git reflog --format='%H' refs/heads/main >actual &&
> + test_grep "$old20" actual &&
> + test_grep ! "$old40" actual
> + )
> +'
This one is curious in a few ways.
For reachable ones before and after the cut-off timestamp, we have
separate blocks to test them independently, but for unreachable
ones, we dedicatge only one block. Is there a good reason for this
distinction?
As some people worry about repository set-up and tear-down cost, it
may please them more if you create a single test repository, prepare
four cases in it, and test them with a single "reflog expire --all".
On the other hand, it makes it easier to debug these tests if you
create one test repository for each of the four cases and test them
independently, but if we are going that route, we would rather want
to have one "test_expect_success" block for each of these four
cases.
This "one test_expect_success block that has three repositories, one
is used to test two cases and each of the other two is used to test
the remaining two cases separately" arrangement looks puzzling.
next prev parent reply other threads:[~2026-09-23 19:26 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-19 18:32 reflog expire: default expiry times swapped since 2.50 r.norouzi
2026-09-22 16:54 ` [PATCH] reflog: fix default expiry periods Pushkar Singh
2026-09-22 17:27 ` Junio C Hamano
2026-09-22 18:02 ` Jeff King
2026-09-23 12:21 ` Patrick Steinhardt
2026-09-23 10:21 ` [PATCH v2] " Pushkar Singh
2026-09-23 19:26 ` Junio C Hamano [this message]
2026-09-24 14:12 ` Patrick Steinhardt
2026-09-24 15:46 ` Jeff King
2026-09-24 17:45 ` Junio C Hamano
2026-09-24 18:43 ` Jeff King
2026-09-28 6:53 ` Patrick Steinhardt
2026-09-24 17:43 ` Junio C Hamano
2026-09-24 17:58 ` [PATCH v3] " Pushkar Singh
2026-09-24 18:26 ` Junio C Hamano
2026-09-28 7:02 ` Patrick Steinhardt
2026-09-28 14:50 ` Junio C Hamano
2026-09-29 5:45 ` Patrick Steinhardt
2026-09-29 18:31 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqpky3ahvo.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
--cc=ps@pks.im \
--cc=pushkarkumarsingh1970@gmail.com \
--cc=r.norouzi@proton.me \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox