From: Patrick Steinhardt Date: Tue, 3 Jun 2025 14:01:19 +0000 (+0200) Subject: builtin/gc: avoid global state in `gc_before_repack()` X-Git-Tag: v2.51.0-rc0~108^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d2b084c66037f1a77b3e061ae7e4d96cbdbf6c05;p=thirdparty%2Fgit.git builtin/gc: avoid global state in `gc_before_repack()` The `gc_before_repack()` should only ever run once in git-gc(1), but we may end up calling it twice when the "--detach" flag is passed. The duplicated call is avoided though via a static flag in this function. This pattern is somewhat unintuitive though. Refactor it to drop the static flag and instead guard the second call of `gc_before_repack()` via `opts.detach`. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- diff --git a/builtin/gc.c b/builtin/gc.c index fdd0dd09be..4a5c4b2044 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -816,22 +816,14 @@ done: return ret; } -static void gc_before_repack(struct maintenance_run_opts *opts, - struct gc_config *cfg) +static int gc_before_repack(struct maintenance_run_opts *opts, + struct gc_config *cfg) { - /* - * We may be called twice, as both the pre- and - * post-daemonized phases will call us, but running these - * commands more than once is pointless and wasteful. - */ - static int done = 0; - if (done++) - return; - if (cfg->pack_refs && maintenance_task_pack_refs(opts, cfg)) - die(FAILED_RUN, "pack-refs"); + return error(FAILED_RUN, "pack-refs"); if (cfg->prune_reflogs && maintenance_task_reflog_expire(opts, cfg)) - die(FAILED_RUN, "reflog"); + return error(FAILED_RUN, "reflog"); + return 0; } int cmd_gc(int argc, @@ -965,7 +957,8 @@ int cmd_gc(int argc, goto out; } - gc_before_repack(&opts, &cfg); /* dies on failure */ + if (gc_before_repack(&opts, &cfg) < 0) + die(NULL); delete_tempfile(&pidfile); /* @@ -995,7 +988,8 @@ int cmd_gc(int argc, free(path); } - gc_before_repack(&opts, &cfg); + if (opts.detach <= 0) + gc_before_repack(&opts, &cfg); if (!repository_format_precious_objects) { struct child_process repack_cmd = CHILD_PROCESS_INIT;