maintenance: create maintenance.<task>.enabled config

Currently, a normal run of "git maintenance run" will only run the 'gc'
task, as it is the only one enabled. This is mostly for backwards-
compatible reasons since "git maintenance run --auto" commands replaced
previous "git gc --auto" commands after some Git processes. Users could
manually run specific maintenance tasks by calling "git maintenance run
--task=<task>" directly.

Allow users to customize which steps are run automatically using config.
The 'maintenance.<task>.enabled' option then can turn on these other
tasks (or turn off the 'gc' task).

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Derrick Stolee 2020-09-17 18:11:49 +00:00 committed by Junio C Hamano
parent d7514f6ed5
commit 65d655b52d
5 changed files with 44 additions and 5 deletions

View File

@ -398,6 +398,8 @@ include::config/mailinfo.txt[]


include::config/mailmap.txt[] include::config/mailmap.txt[]


include::config/maintenance.txt[]

include::config/man.txt[] include::config/man.txt[]


include::config/merge.txt[] include::config/merge.txt[]

View File

@ -0,0 +1,6 @@
maintenance.<task>.enabled::
This boolean config option controls whether the maintenance task
with name `<task>` is run when no `--task` option is specified to
`git maintenance run`. These config values are ignored if a
`--task` option exists. By default, only `maintenance.gc.enabled`
is true.

View File

@ -30,9 +30,11 @@ SUBCOMMANDS
----------- -----------


run:: run::
Run one or more maintenance tasks. If one or more `--task=<task>` Run one or more maintenance tasks. If one or more `--task` options
options are specified, then those tasks are run in the provided are specified, then those tasks are run in that order. Otherwise,
order. Otherwise, only the `gc` task is run. the tasks are determined by which `maintenance.<task>.enabled`
config options are true. By default, only `maintenance.gc.enabled`
is true.


TASKS TASKS
----- -----
@ -67,8 +69,10 @@ OPTIONS


--task=<task>:: --task=<task>::
If this option is specified one or more times, then only run the If this option is specified one or more times, then only run the
specified tasks in the specified order. See the 'TASKS' section specified tasks in the specified order. If no `--task=<task>`
for the list of accepted `<task>` values. arguments are specified, then only the tasks with
`maintenance.<task>.enabled` configured as `true` are considered.
See the 'TASKS' section for the list of accepted `<task>` values.


GIT GIT
--- ---

View File

@ -841,6 +841,24 @@ static int maintenance_run_tasks(struct maintenance_run_opts *opts)
return result; return result;
} }


static void initialize_task_config(void)
{
int i;
struct strbuf config_name = STRBUF_INIT;
for (i = 0; i < TASK__COUNT; i++) {
int config_value;

strbuf_setlen(&config_name, 0);
strbuf_addf(&config_name, "maintenance.%s.enabled",
tasks[i].name);

if (!git_config_get_bool(config_name.buf, &config_value))
tasks[i].enabled = config_value;
}

strbuf_release(&config_name);
}

static int task_option_parse(const struct option *opt, static int task_option_parse(const struct option *opt,
const char *arg, int unset) const char *arg, int unset)
{ {
@ -889,6 +907,7 @@ static int maintenance_run(int argc, const char **argv, const char *prefix)
memset(&opts, 0, sizeof(opts)); memset(&opts, 0, sizeof(opts));


opts.quiet = !isatty(2); opts.quiet = !isatty(2);
initialize_task_config();


for (i = 0; i < TASK__COUNT; i++) for (i = 0; i < TASK__COUNT; i++)
tasks[i].selected_order = -1; tasks[i].selected_order = -1;

View File

@ -27,6 +27,14 @@ test_expect_success 'run [--auto|--quiet]' '
test_subcommand git gc --no-quiet <run-no-quiet.txt test_subcommand git gc --no-quiet <run-no-quiet.txt
' '


test_expect_success 'maintenance.<task>.enabled' '
git config maintenance.gc.enabled false &&
git config maintenance.commit-graph.enabled true &&
GIT_TRACE2_EVENT="$(pwd)/run-config.txt" git maintenance run 2>err &&
test_subcommand ! git gc --quiet <run-config.txt &&
test_subcommand git commit-graph write --split --reachable --no-progress <run-config.txt
'

test_expect_success 'run --task=<task>' ' test_expect_success 'run --task=<task>' '
GIT_TRACE2_EVENT="$(pwd)/run-commit-graph.txt" \ GIT_TRACE2_EVENT="$(pwd)/run-commit-graph.txt" \
git maintenance run --task=commit-graph 2>/dev/null && git maintenance run --task=commit-graph 2>/dev/null &&