]> git.ipfire.org Git - thirdparty/git.git/commitdiff
maintenance: add checking logic in `pack_refs_condition()`
authorKarthik Nayak <karthik.188@gmail.com>
Thu, 6 Nov 2025 08:22:33 +0000 (09:22 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 6 Nov 2025 18:00:07 +0000 (10:00 -0800)
The 'git-maintenance(1)' command supports an '--auto' flag. Usage of the
flag ensures to run maintenance tasks only if certain thresholds are
met. The heuristic is defined on a task level, wherein each task defines
an 'auto_condition', which states if the task should be run.

The 'pack-refs' task is hard-coded to return 1 as:
1. There was never a way to check if the reference backend needs to be
optimized without actually performing the optimization.
2. We can pass in the '--auto' flag to 'git-pack-refs(1)' which would
optimize based on heuristics.

The previous commit added a `refs_optimize_required()` function, which
can be used to check if a reference backend required optimization. Use
this within `pack_refs_condition()`.

This allows us to add a 'git maintenance is-needed' subcommand which can
notify the user if maintenance is needed without actually performing the
optimization. Without this change, the reference backend would always
state that optimization is needed.

Since we import 'revision.h', we need to remove the definition for
'SEEN' which is duplicated in the included header.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/gc.c
object.h

index c6d62c74a7169ff0e844435044991eb9c14824ba..c3e7a84ec28641626e017e17a5f7db2545b51b52 100644 (file)
@@ -35,6 +35,7 @@
 #include "path.h"
 #include "reflog.h"
 #include "rerere.h"
+#include "revision.h"
 #include "blob.h"
 #include "tree.h"
 #include "promisor-remote.h"
@@ -285,12 +286,26 @@ static void maintenance_run_opts_release(struct maintenance_run_opts *opts)
 
 static int pack_refs_condition(UNUSED struct gc_config *cfg)
 {
-       /*
-        * The auto-repacking logic for refs is handled by the ref backends and
-        * exposed via `git pack-refs --auto`. We thus always return truish
-        * here and let the backend decide for us.
-        */
-       return 1;
+       struct string_list included_refs = STRING_LIST_INIT_NODUP;
+       struct ref_exclusions excludes = REF_EXCLUSIONS_INIT;
+       struct refs_optimize_opts optimize_opts = {
+               .exclusions = &excludes,
+               .includes = &included_refs,
+               .flags = REFS_OPTIMIZE_PRUNE | REFS_OPTIMIZE_AUTO,
+       };
+       bool required;
+
+       /* Check for all refs, similar to 'git refs optimize --all'. */
+       string_list_append(optimize_opts.includes, "*");
+
+       if (refs_optimize_required(get_main_ref_store(the_repository),
+                                  &optimize_opts, &required))
+               return 0;
+
+       clear_ref_exclusions(&excludes);
+       string_list_clear(&included_refs, 0);
+
+       return required == true;
 }
 
 static int maintenance_task_pack_refs(struct maintenance_run_opts *opts,
@@ -1090,9 +1105,6 @@ static int maintenance_opt_schedule(const struct option *opt, const char *arg,
        return 0;
 }
 
-/* Remember to update object flag allocation in object.h */
-#define SEEN           (1u<<0)
-
 struct cg_auto_data {
        int num_not_in_graph;
        int limit;
index 1499f63d507c32c5c1c2b1d0244beb584439c7d4..832299e763876c66038753bf24be75eab82025ad 100644 (file)
--- a/object.h
+++ b/object.h
@@ -79,7 +79,6 @@ void object_array_init(struct object_array *array);
  * list-objects-filter.c:                                      21
  * bloom.c:                                                    2122
  * builtin/fsck.c:           0--3
- * builtin/gc.c:             0
  * builtin/index-pack.c:                                     2021
  * reflog.c:                           10--12
  * builtin/show-branch.c:    0-------------------------------------------26