Re: [PATCH v3] reflog: fix default expiry periods
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Sep 24, 2026, 18:26 UTC
- Message-ID
- <xmqqwlsa1p5d.fsf@gitster.g>
- In-Reply-To
- <20260924175843.8383-2-pushkarkumarsingh1970@gmail.com>
Pushkar Singh <pushkarkumarsingh1970@gmail.com> writes:
Show 17 quoted lines
> 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> > --- > Changes in v3: > - Split the regression test into four independent cases, covering > reachable and unreachable entries before and after their expiry periods. > > reflog.h | 4 +-- > t/t1410-reflog.sh | 66 +++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 68 insertions(+), 2 deletions(-)
This iteration has its tests much more nicely organized than the previous round. Looking very good.
After this patch graduates to 'master' and the dust settles, we might want to clean-up the repetitive and verbose combinations of turning a human-readable timespec into a machine-usable timestamp into a single helper that is easier to use. But that is outside the scope of this change, I would say.
Show 92 quoted lines
> diff --git a/reflog.h b/reflog.h
> index b996712c00..3bdd1ca8a5 100644
> --- a/reflog.h
> +++ b/reflog.h
> @@ -23,8 +23,8 @@ struct reflog_expire_options {
> int recno;
> };
> #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, \
> }
>
> /*
> diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh
> index 8f78cf4b01..93b5b49e1d 100755
> --- a/t/t1410-reflog.sh
> +++ b/t/t1410-reflog.sh
> @@ -153,6 +153,72 @@ 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 keeps reachable entries for 90 days' '
> + test_when_finished "rm -rf reachable-keep" &&
> + 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
> + )
> +'
> +
> +test_expect_success 'reflog expire removes reachable entries after 90 days' '
> + test_when_finished "rm -rf reachable-expire" &&
> + 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
> + )
> +'
> +
> +test_expect_success 'reflog expire keeps unreachable entries for 30 days' '
> + test_when_finished "rm -rf unreachable-keep" &&
> + git init unreachable-keep &&
> + (
> + cd unreachable-keep &&
> + 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 &&
> + old=$(git rev-parse HEAD) &&
> + git update-ref refs/heads/main "$base" &&
> + git rev-list --all --objects >reachable &&
> + test_grep ! "$old" reachable &&
> + git reflog expire --all &&
> + git reflog --format='%H' refs/heads/main >actual &&
> + test_grep "$old" actual
> + )
> +'
> +
> +test_expect_success 'reflog expire removes unreachable entries after 30 days' '
> + test_when_finished "rm -rf unreachable-expire" &&
> + git init unreachable-expire &&
> + (
> + cd unreachable-expire &&
> + test_commit --no-tag base &&
> + base=$(git rev-parse HEAD) &&
> + timestamp=$(test-tool date timestamp "40.days.ago") &&
> + timestamp=${timestamp#* -> } &&
> + test_commit --no-tag --date "$timestamp +0000" old &&
> + old=$(git rev-parse HEAD) &&
> + git update-ref refs/heads/main "$base" &&
> + git rev-list --all --objects >reachable &&
> + test_grep ! "$old" reachable &&
> + git reflog expire --all &&
> + git reflog --format='%H' refs/heads/main >actual &&
> + test_grep ! "$old" actual
> + )
> +'
> +
> test_expect_success 'corrupt and check' '
>
> corrupt $F &&