@leroysheep / LeeRoySheep / commits / 29364f1624

run-command: honor "gc.auto" for auto-maintenance

The "gc.auto" configuration has traditionally been used to turn off running git-gc(1) as part of our auto-maintenance. We have eventually switched over to git-maintenance(1) in a95ce12430 (maintenance: replace run_auto_gc(), 2020-09-17), and with 1942d48380 (maintenance: optionally skip --auto process, 2020-08-28) we have introduced "maintenance.auto" to control whether or not to run auto-maintenance. At that point though we still shelled out to git-gc(1) internally. So if "gc.auto=0" was set we would still _execute_ git-maintenance(1), but the command would have exited fast because git-gc(1) itself knew to honor the config key. This has recently changed though, as we have adapted the default maintenance strategy to not use git-gc(1) anymore. The consequence is that "gc.auto=0" doesn't have an effect anymore, which is a somewhat surprising change in behaviour for our users. Adapt `run_auto_maintenance()` so that it knows to also read "gc.auto", similar to how it also reads both "maintenance.autoDetach" and "gc.autoDetach". Reported-by: Jean-Christophe Manciot <actionmystique@gmail.com> Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed May 13, 2026 at 09:31 UTC 29364f16242abd490160f66d2d239ac45e1d45fb
2 files changed +32 -3
run-command.c
+7 -3
index c146a56532..28202a81d8 100644 --- a/run-command.c +++ b/run-command.c @@ -1944,10 +1944,14 @@ void run_processes_parallel(const struct run_process_parallel_opts *opts) int prepare_auto_maintenance(struct repository *r, int quiet, struct child_process *maint) { - int enabled, auto_detach; + int enabled = 1, auto_detach; - if (!repo_config_get_bool(r, "maintenance.auto", &enabled) && - !enabled) + if (repo_config_get_bool(r, "maintenance.auto", &enabled)) { + int gc_threshold; + if (!repo_config_get_int(r, "gc.auto", &gc_threshold)) + enabled = gc_threshold > 0; + } + if (!enabled) return 0; /*
t/t7900-maintenance.sh
+25
index df0bbc1669..97c8c701bb 100755 --- a/t/t7900-maintenance.sh +++ b/t/t7900-maintenance.sh @@ -73,6 +73,31 @@ test_expect_success 'maintenance.auto config option' ' test_subcommand ! git maintenance run --auto --quiet --detach <false ' +test_expect_success 'gc.auto config option' ' + GIT_TRACE2_EVENT="$(pwd)/default" git commit --quiet --allow-empty -m 1 && + test_subcommand git maintenance run --auto --quiet --detach <default && + GIT_TRACE2_EVENT="$(pwd)/true" \ + git -c gc.auto=1 commit --quiet --allow-empty -m 2 && + test_subcommand git maintenance run --auto --quiet --detach <true && + GIT_TRACE2_EVENT="$(pwd)/false" \ + git -c gc.auto=0 commit --quiet --allow-empty -m 3 && + test_subcommand ! git maintenance run --auto --quiet --detach <false +' + +test_expect_success 'maintenance.auto overrides gc.auto' ' + test_when_finished "rm -f trace" && + + test_config maintenance.auto false && + test_config gc.auto 1 && + GIT_TRACE2_EVENT="$(pwd)/trace" git commit --quiet --allow-empty -m 1 && + test_subcommand ! git maintenance run --auto --quiet --detach <trace && + + test_config maintenance.auto true && + test_config gc.auto 0 && + GIT_TRACE2_EVENT="$(pwd)/trace" git commit --quiet --allow-empty -m 1 && + test_subcommand git maintenance run --auto --quiet --detach <trace +' + for cfg in maintenance.autoDetach gc.autoDetach do test_expect_success "$cfg=true config option" '