@@ -37,6 +37,12 @@ register::
`maintenance.<task>.schedule`. The tasks that are enabled are safe
for running in the background without disrupting foreground
processes.
++
+If your repository has no 'maintenance.<task>.schedule' configuration
+values set, then Git will set configuration values to some recommended
+settings. These settings disable foreground maintenance while performing
+maintenance tasks in the background that will not interrupt foreground Git
+operations.
run::
Run one or more maintenance tasks. If one or more `--task` options
@@ -1415,6 +1415,47 @@ static int maintenance_run(int argc, const char **argv, const char *prefix)
return maintenance_run_tasks(&opts);
}
+static int has_schedule_config(void)
+{
+ int i, found = 0;
+ struct strbuf config_name = STRBUF_INIT;
+ size_t prefix;
+
+ strbuf_addstr(&config_name, "maintenance.");
+ prefix = config_name.len;
+
+ for (i = 0; !found && i < TASK__COUNT; i++) {
+ int value;
+
+ strbuf_setlen(&config_name, prefix);
+ strbuf_addf(&config_name, "%s.schedule", tasks[i].name);
+
+ if (!git_config_get_int(config_name.buf, &value))
+ found = 1;
+ }
+
+ strbuf_release(&config_name);
+ return found;
+}
+
+static void set_recommended_schedule(void)
+{
+ git_config_set("maintenance.auto", "false");
+ git_config_set("maintenance.gc.enabled", "false");
+
+ git_config_set("maintenance.prefetch.enabled", "true");
+ git_config_set("maintenance.prefetch.schedule", "3500");
+
+ git_config_set("maintenance.commit-graph.enabled", "true");
+ git_config_set("maintenance.commit-graph.schedule", "3500");
+
+ git_config_set("maintenance.loose-objects.enabled", "true");
+ git_config_set("maintenance.loose-objects.schedule", "86000");
+
+ git_config_set("maintenance.incremental-repack.enabled", "true");
+ git_config_set("maintenance.incremental-repack.schedule", "86000");
+}
+
static int maintenance_register(void)
{
struct child_process config_set = CHILD_PROCESS_INIT;
@@ -1424,6 +1465,9 @@ static int maintenance_register(void)
if (!the_repository || !the_repository->gitdir)
return 0;
+ if (has_schedule_config())
+ set_recommended_schedule();
+
config_get.git_cmd = 1;
strvec_pushl(&config_get.args, "config", "--global", "--get", "maintenance.repo",
the_repository->worktree ? the_repository->worktree
@@ -300,6 +300,11 @@ test_expect_success 'register and unregister' '
git config --global --add maintenance.repo /existing2 &&
git config --global --get-all maintenance.repo >before &&
git maintenance register &&
+ test_cmp_config false maintenance.auto &&
+ test_cmp_config false maintenance.gc.enabled &&
+ test_cmp_config true maintenance.prefetch.enabled &&
+ test_cmp_config 3500 maintenance.commit-graph.schedule &&
+ test_cmp_config 86000 maintenance.incremental-repack.schedule &&
git config --global --get-all maintenance.repo >actual &&
cp before after &&
pwd >>after &&