]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/maintenance: add a `--detach` flag
authorPatrick Steinhardt <ps@pks.im>
Fri, 16 Aug 2024 10:45:15 +0000 (12:45 +0200)
committerJunio C Hamano <gitster@pobox.com>
Fri, 16 Aug 2024 16:46:26 +0000 (09:46 -0700)
Same as the preceding commit, add a `--[no-]detach` flag to the
git-maintenance(1) command. This will be used in a subsequent commit to
fix backgrounding of that command when configured with a non-standard
set of tasks.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/gc.c
t/t7900-maintenance.sh

index 269a77960fba0941cac8cf2d7ef989593db7fe5d..63106e2028f07595eee6d2a5a51e817ad4f00f6e 100644 (file)
@@ -1426,6 +1426,10 @@ static int maintenance_run_tasks(struct maintenance_run_opts *opts,
        }
        free(lock_path);
 
+       /* Failure to daemonize is ok, we'll continue in foreground. */
+       if (opts->detach > 0)
+               daemonize();
+
        for (i = 0; !found_selected && i < TASK__COUNT; i++)
                found_selected = tasks[i].selected_order >= 0;
 
@@ -1552,6 +1556,8 @@ static int maintenance_run(int argc, const char **argv, const char *prefix)
        struct option builtin_maintenance_run_options[] = {
                OPT_BOOL(0, "auto", &opts.auto_flag,
                         N_("run tasks based on the state of the repository")),
+               OPT_BOOL(0, "detach", &opts.detach,
+                        N_("perform maintenance in the background")),
                OPT_CALLBACK(0, "schedule", &opts.schedule, N_("frequency"),
                             N_("run tasks based on frequency"),
                             maintenance_opt_schedule),
index 8595489cebe25c70e90c783b15e0b09a14e109fa..771525aa4bf9a9cd71992f6f23a06edbc66f2a9e 100755 (executable)
@@ -908,4 +908,43 @@ test_expect_success 'failed schedule prevents config change' '
        done
 '
 
+test_expect_success '--no-detach causes maintenance to not run in background' '
+       test_when_finished "rm -rf repo" &&
+       git init repo &&
+       (
+               cd repo &&
+
+               # Prepare the repository such that git-maintenance(1) ends up
+               # outputting something.
+               test_commit something &&
+               git config set maintenance.gc.enabled false &&
+               git config set maintenance.loose-objects.enabled true &&
+               git config set maintenance.loose-objects.auto 1 &&
+               git config set maintenance.incremental-repack.enabled true &&
+
+               # We have no better way to check whether or not the task ran in
+               # the background than to verify whether it output anything. The
+               # next testcase checks the reverse, making this somewhat safer.
+               git maintenance run --no-detach >out 2>&1 &&
+               test_line_count = 1 out
+       )
+'
+
+test_expect_success '--detach causes maintenance to run in background' '
+       test_when_finished "rm -rf repo" &&
+       git init repo &&
+       (
+               cd repo &&
+
+               test_commit something &&
+               git config set maintenance.gc.enabled false &&
+               git config set maintenance.loose-objects.enabled true &&
+               git config set maintenance.loose-objects.auto 1 &&
+               git config set maintenance.incremental-repack.enabled true &&
+
+               git maintenance run --detach >out 2>&1 &&
+               test_must_be_empty out
+       )
+'
+
 test_done