]> git.ipfire.org Git - thirdparty/git.git/commitdiff
maintenance: replace run_auto_gc()
authorDerrick Stolee <dstolee@microsoft.com>
Thu, 17 Sep 2020 18:11:44 +0000 (18:11 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 17 Sep 2020 18:30:05 +0000 (11:30 -0700)
The run_auto_gc() method is used in several places to trigger a check
for repo maintenance after some Git commands, such as 'git commit' or
'git fetch'.

To allow for extra customization of this maintenance activity, replace
the 'git gc --auto [--quiet]' call with one to 'git maintenance run
--auto [--quiet]'. As we extend the maintenance builtin with other
steps, users will be able to select different maintenance activities.

Rename run_auto_gc() to run_auto_maintenance() to be clearer what is
happening on this call, and to expose all callers in the current diff.
Rewrite the method to use a struct child_process to simplify the calls
slightly.

Since 'git fetch' already allows disabling the 'git gc --auto'
subprocess, add an equivalent option with a different name to be more
descriptive of the new behavior: '--[no-]maintenance'. Update the
documentation to include these options at the same time.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/fetch-options.txt
Documentation/git-clone.txt
builtin/am.c
builtin/commit.c
builtin/fetch.c
builtin/merge.c
builtin/rebase.c
run-command.c
run-command.h
t/t5510-fetch.sh

index 07d06ff445caa87e3aa81653af779d1ccca44651..b65a758661eb6808df13801ea73c2d56985700cc 100644 (file)
@@ -95,9 +95,11 @@ ifndef::git-pull[]
        Allow several <repository> and <group> arguments to be
        specified. No <refspec>s may be specified.
 
+--[no-]auto-maintenance::
 --[no-]auto-gc::
-       Run `git gc --auto` at the end to perform garbage collection
-       if needed. This is enabled by default.
+       Run `git maintenance run --auto` at the end to perform automatic
+       repository maintenance if needed. (`--[no-]auto-gc` is a synonym.)
+       This is enabled by default.
 
 --[no-]write-commit-graph::
        Write a commit-graph after fetching. This overrides the config
index c898310099895f92e884b7852af28786c6564c8b..097e6a86c5bdf31c9b30e277e9659bb3015081af 100644 (file)
@@ -78,9 +78,9 @@ repository using this option and then delete branches (or use any
 other Git command that makes any existing commit unreferenced) in the
 source repository, some objects may become unreferenced (or dangling).
 These objects may be removed by normal Git operations (such as `git commit`)
-which automatically call `git gc --auto`. (See linkgit:git-gc[1].)
-If these objects are removed and were referenced by the cloned repository,
-then the cloned repository will become corrupt.
+which automatically call `git maintenance run --auto`. (See
+linkgit:git-maintenance[1].) If these objects are removed and were referenced
+by the cloned repository, then the cloned repository will become corrupt.
 +
 Note that running `git repack` without the `--local` option in a repository
 cloned with `--shared` will copy objects from the source repository into a pack
index dd4e6c2d9b7f478c322a469fd64cbaf3de285d17..68e9d173790ab35ec813cadeefbcfd063ec7e1ed 100644 (file)
@@ -1795,7 +1795,7 @@ next:
        if (!state->rebasing) {
                am_destroy(state);
                close_object_store(the_repository->objects);
-               run_auto_gc(state->quiet);
+               run_auto_maintenance(state->quiet);
        }
 }
 
index 69ac78d5e524f49e5da993e16cf3b74cf080926e..f9b0a0c05d5881f6eb549a41d309611750640148 100644 (file)
@@ -1702,7 +1702,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
        git_test_write_commit_graph_or_die();
 
        repo_rerere(the_repository, 0);
-       run_auto_gc(quiet);
+       run_auto_maintenance(quiet);
        run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
        if (amend && !no_post_rewrite) {
                commit_post_rewrite(the_repository, current_head, &oid);
index 2eb8d6a5a5c015ad1530502bfd5db666d5d6b9e0..cb38e6f5ecf7929e61082a7428c9c84331857560 100644 (file)
@@ -199,8 +199,10 @@ static struct option builtin_fetch_options[] = {
        OPT_STRING_LIST(0, "negotiation-tip", &negotiation_tip, N_("revision"),
                        N_("report that we have only objects reachable from this object")),
        OPT_PARSE_LIST_OBJECTS_FILTER(&filter_options),
+       OPT_BOOL(0, "auto-maintenance", &enable_auto_gc,
+                N_("run 'maintenance --auto' after fetching")),
        OPT_BOOL(0, "auto-gc", &enable_auto_gc,
-                N_("run 'gc --auto' after fetching")),
+                N_("run 'maintenance --auto' after fetching")),
        OPT_BOOL(0, "show-forced-updates", &fetch_show_forced_updates,
                 N_("check for forced-updates on all updated branches")),
        OPT_BOOL(0, "write-commit-graph", &fetch_write_commit_graph,
@@ -1891,7 +1893,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
        close_object_store(the_repository->objects);
 
        if (enable_auto_gc)
-               run_auto_gc(verbosity < 0);
+               run_auto_maintenance(verbosity < 0);
 
        return result;
 }
index 74829a838e2104868aef6401ba945e7e84952820..8f31bfab565c1fd270304454c19aba67ce0e653f 100644 (file)
@@ -456,7 +456,7 @@ static void finish(struct commit *head_commit,
                         * user should see them.
                         */
                        close_object_store(the_repository->objects);
-                       run_auto_gc(verbosity < 0);
+                       run_auto_maintenance(verbosity < 0);
                }
        }
        if (new_head && show_diffstat) {
index dadb52fa92e7f28e0c81b27b74b9a23b289e4be9..9ffba9009dce4bd5f56800af0d05d77834ff976c 100644 (file)
@@ -728,10 +728,10 @@ static int finish_rebase(struct rebase_options *opts)
        apply_autostash(state_dir_path("autostash", opts));
        close_object_store(the_repository->objects);
        /*
-        * We ignore errors in 'gc --auto', since the
+        * We ignore errors in 'git maintenance run --auto', since the
         * user should see them.
         */
-       run_auto_gc(!(opts->flags & (REBASE_NO_QUIET|REBASE_VERBOSE)));
+       run_auto_maintenance(!(opts->flags & (REBASE_NO_QUIET|REBASE_VERBOSE)));
        if (opts->type == REBASE_MERGE) {
                struct replay_opts replay = REPLAY_OPTS_INIT;
 
index cc9c3296ba0cbb852300d7d5ccb3d6f29f931034..2ee59acdc8c828ad81ccb7526bd7f23fc460d095 100644 (file)
@@ -1866,15 +1866,13 @@ int run_processes_parallel_tr2(int n, get_next_task_fn get_next_task,
        return result;
 }
 
-int run_auto_gc(int quiet)
+int run_auto_maintenance(int quiet)
 {
-       struct strvec argv_gc_auto = STRVEC_INIT;
-       int status;
+       struct child_process maint = CHILD_PROCESS_INIT;
 
-       strvec_pushl(&argv_gc_auto, "gc", "--auto", NULL);
-       if (quiet)
-               strvec_push(&argv_gc_auto, "--quiet");
-       status = run_command_v_opt(argv_gc_auto.v, RUN_GIT_CMD);
-       strvec_clear(&argv_gc_auto);
-       return status;
+       maint.git_cmd = 1;
+       strvec_pushl(&maint.args, "maintenance", "run", "--auto", NULL);
+       strvec_push(&maint.args, quiet ? "--quiet" : "--no-quiet");
+
+       return run_command(&maint);
 }
index 8b9bfaef16c8d1932ba1449da205675113097103..6472b38bde448cd256697b0b3cbd962cdf3da333 100644 (file)
@@ -221,7 +221,7 @@ int run_hook_ve(const char *const *env, const char *name, va_list args);
 /*
  * Trigger an auto-gc
  */
-int run_auto_gc(int quiet);
+int run_auto_maintenance(int quiet);
 
 #define RUN_COMMAND_NO_STDIN 1
 #define RUN_GIT_CMD         2  /*If this is to be git sub-command */
index 2a1abe91f0fd34b7929aa636ab43542c6e45ea54..a9682c56691d8f38702b1f521b9ed1f17fae2989 100755 (executable)
@@ -934,7 +934,7 @@ test_expect_success 'fetching with auto-gc does not lock up' '
                git config fetch.unpackLimit 1 &&
                git config gc.autoPackLimit 1 &&
                git config gc.autoDetach false &&
-               GIT_ASK_YESNO="$D/askyesno" git fetch >fetch.out 2>&1 &&
+               GIT_ASK_YESNO="$D/askyesno" git fetch --verbose >fetch.out 2>&1 &&
                test_i18ngrep "Auto packing the repository" fetch.out &&
                ! grep "Should I try again" fetch.out
        )