aboutsummaryrefslogtreecommitdiffstats
path: root/builtin/gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtin/gc.c')
-rw-r--r--builtin/gc.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/builtin/gc.c b/builtin/gc.c
index 55a3d836f0..13c24bca7d 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -755,9 +755,17 @@ static int maintenance_task_gc(struct maintenance_run_opts *opts)
typedef int maintenance_task_fn(struct maintenance_run_opts *opts);
+/*
+ * An auto condition function returns 1 if the task should run
+ * and 0 if the task should NOT run. See needs_to_gc() for an
+ * example.
+ */
+typedef int maintenance_auto_fn(void);
+
struct maintenance_task {
const char *name;
maintenance_task_fn *fn;
+ maintenance_auto_fn *auto_condition;
unsigned enabled:1;
/* -1 if not selected. */
@@ -776,6 +784,7 @@ static struct maintenance_task tasks[] = {
[TASK_GC] = {
"gc",
maintenance_task_gc,
+ need_to_gc,
1,
},
[TASK_COMMIT_GRAPH] = {
@@ -831,6 +840,11 @@ static int maintenance_run_tasks(struct maintenance_run_opts *opts)
if (!found_selected && !tasks[i].enabled)
continue;
+ if (opts->auto_flag &&
+ (!tasks[i].auto_condition ||
+ !tasks[i].auto_condition()))
+ continue;
+
if (tasks[i].fn(opts)) {
error(_("task '%s' failed"), tasks[i].name);
result = 1;
@@ -845,6 +859,8 @@ static void initialize_task_config(void)
{
int i;
struct strbuf config_name = STRBUF_INIT;
+ gc_config();
+
for (i = 0; i < TASK__COUNT; i++) {
int config_value;