@matheusbsbs / matheus-bagliano / commits / a95ce12430
Fork 0

maintenance: replace run_auto_gc()

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>

Derrick Stolee committed Sep 17, 2020 at 18:11 UTC a95ce124305adcc4980241b8877e06db1d6ed411
10 files changed +25 -23
Documentation/fetch-options.txt
+4 -2
@@ -95,9 +95,11 @@ ifndef::git-pull[]
95 Allow several <repository> and <group> arguments to be
96 specified. No <refspec>s may be specified.
97
98 +--[no-]auto-maintenance::
99 --[no-]auto-gc::
99 - Run `git gc --auto` at the end to perform garbage collection
100 - if needed. This is enabled by default.
100 + Run `git maintenance run --auto` at the end to perform automatic
101 + repository maintenance if needed. (`--[no-]auto-gc` is a synonym.)
102 + This is enabled by default.
103
104 --[no-]write-commit-graph::
105 Write a commit-graph after fetching. This overrides the config
Documentation/git-clone.txt
+3 -3
@@ -78,9 +78,9 @@ repository using this option and then delete branches (or use any
78 other Git command that makes any existing commit unreferenced) in the
79 source repository, some objects may become unreferenced (or dangling).
80 These objects may be removed by normal Git operations (such as `git commit`)
81 -which automatically call `git gc --auto`. (See linkgit:git-gc[1].)
82 -If these objects are removed and were referenced by the cloned repository,
83 -then the cloned repository will become corrupt.
81 +which automatically call `git maintenance run --auto`. (See
82 +linkgit:git-maintenance[1].) If these objects are removed and were referenced
83 +by the cloned repository, then the cloned repository will become corrupt.
84 +
85 Note that running `git repack` without the `--local` option in a repository
86 cloned with `--shared` will copy objects from the source repository into a pack
builtin/am.c
+1 -1
@@ -1795,7 +1795,7 @@ next:
1795 if (!state->rebasing) {
1796 am_destroy(state);
1797 close_object_store(the_repository->objects);
1798 - run_auto_gc(state->quiet);
1798 + run_auto_maintenance(state->quiet);
1799 }
1800 }
1801
builtin/commit.c
+1 -1
@@ -1702,7 +1702,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
1702 git_test_write_commit_graph_or_die();
1703
1704 repo_rerere(the_repository, 0);
1705 - run_auto_gc(quiet);
1705 + run_auto_maintenance(quiet);
1706 run_commit_hook(use_editor, get_index_file(), "post-commit", NULL);
1707 if (amend && !no_post_rewrite) {
1708 commit_post_rewrite(the_repository, current_head, &oid);
builtin/fetch.c
+4 -2
@@ -199,8 +199,10 @@ static struct option builtin_fetch_options[] = {
199 OPT_STRING_LIST(0, "negotiation-tip", &negotiation_tip, N_("revision"),
200 N_("report that we have only objects reachable from this object")),
201 OPT_PARSE_LIST_OBJECTS_FILTER(&filter_options),
202 + OPT_BOOL(0, "auto-maintenance", &enable_auto_gc,
203 + N_("run 'maintenance --auto' after fetching")),
204 OPT_BOOL(0, "auto-gc", &enable_auto_gc,
203 - N_("run 'gc --auto' after fetching")),
205 + N_("run 'maintenance --auto' after fetching")),
206 OPT_BOOL(0, "show-forced-updates", &fetch_show_forced_updates,
207 N_("check for forced-updates on all updated branches")),
208 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)
1893 close_object_store(the_repository->objects);
1894
1895 if (enable_auto_gc)
1894 - run_auto_gc(verbosity < 0);
1896 + run_auto_maintenance(verbosity < 0);
1897
1898 return result;
1899 }
builtin/merge.c
+1 -1
@@ -456,7 +456,7 @@ static void finish(struct commit *head_commit,
456 * user should see them.
457 */
458 close_object_store(the_repository->objects);
459 - run_auto_gc(verbosity < 0);
459 + run_auto_maintenance(verbosity < 0);
460 }
461 }
462 if (new_head && show_diffstat) {
builtin/rebase.c
+2 -2
@@ -728,10 +728,10 @@ static int finish_rebase(struct rebase_options *opts)
728 apply_autostash(state_dir_path("autostash", opts));
729 close_object_store(the_repository->objects);
730 /*
731 - * We ignore errors in 'gc --auto', since the
731 + * We ignore errors in 'git maintenance run --auto', since the
732 * user should see them.
733 */
734 - run_auto_gc(!(opts->flags & (REBASE_NO_QUIET|REBASE_VERBOSE)));
734 + run_auto_maintenance(!(opts->flags & (REBASE_NO_QUIET|REBASE_VERBOSE)));
735 if (opts->type == REBASE_MERGE) {
736 struct replay_opts replay = REPLAY_OPTS_INIT;
737
run-command.c
+7 -9
@@ -1866,15 +1866,13 @@ int run_processes_parallel_tr2(int n, get_next_task_fn get_next_task,
1866 return result;
1867 }
1868
1869 -int run_auto_gc(int quiet)
1869 +int run_auto_maintenance(int quiet)
1870 {
1871 - struct strvec argv_gc_auto = STRVEC_INIT;
1872 - int status;
1871 + struct child_process maint = CHILD_PROCESS_INIT;
1872
1874 - strvec_pushl(&argv_gc_auto, "gc", "--auto", NULL);
1875 - if (quiet)
1876 - strvec_push(&argv_gc_auto, "--quiet");
1877 - status = run_command_v_opt(argv_gc_auto.v, RUN_GIT_CMD);
1878 - strvec_clear(&argv_gc_auto);
1879 - return status;
1873 + maint.git_cmd = 1;
1874 + strvec_pushl(&maint.args, "maintenance", "run", "--auto", NULL);
1875 + strvec_push(&maint.args, quiet ? "--quiet" : "--no-quiet");
1876 +
1877 + return run_command(&maint);
1878 }
run-command.h
+1 -1
@@ -221,7 +221,7 @@ int run_hook_ve(const char *const *env, const char *name, va_list args);
221 /*
222 * Trigger an auto-gc
223 */
224 -int run_auto_gc(int quiet);
224 +int run_auto_maintenance(int quiet);
225
226 #define RUN_COMMAND_NO_STDIN 1
227 #define RUN_GIT_CMD 2 /*If this is to be git sub-command */
t/t5510-fetch.sh
+1 -1
@@ -934,7 +934,7 @@ test_expect_success 'fetching with auto-gc does not lock up' '
934 git config fetch.unpackLimit 1 &&
935 git config gc.autoPackLimit 1 &&
936 git config gc.autoDetach false &&
937 - GIT_ASK_YESNO="$D/askyesno" git fetch >fetch.out 2>&1 &&
937 + GIT_ASK_YESNO="$D/askyesno" git fetch --verbose >fetch.out 2>&1 &&
938 test_i18ngrep "Auto packing the repository" fetch.out &&
939 ! grep "Should I try again" fetch.out
940 )