From: Jonathan Nieder <jrnieder@gmail.com>
To: Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, sandals@crustytoothpaste.net,
steadmon@google.com, peff@peff.net, congdanhqx@gmail.com,
phillip.wood123@gmail.com, emilyshaffer@google.com,
sluongng@gmail.com, jonathantanmy@google.com,
Derrick Stolee <derrickstolee@github.com>,
Derrick Stolee <dstolee@microsoft.com>
Subject: Re: [PATCH 01/11] maintenance: create basic maintenance runner
Date: Wed, 12 Aug 2020 14:03:26 -0700 [thread overview]
Message-ID: <20200812210326.GA104953@google.com> (raw)
In-Reply-To: <2b9deb6d6a23e53bec75e109f2e3ef9217420425.1596728921.git.gitgitgadget@gmail.com>
Derrick Stolee wrote:
> Helped-by: Jonathan Nieder <jrnieder@gmail.com>
> Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
> ---
> .gitignore | 1 +
> Documentation/git-maintenance.txt | 57 +++++++++++++++++++++++++++++++
> builtin.h | 1 +
> builtin/gc.c | 57 +++++++++++++++++++++++++++++++
> git.c | 1 +
> t/t7900-maintenance.sh | 19 +++++++++++
> t/test-lib-functions.sh | 33 ++++++++++++++++++
> 7 files changed, 169 insertions(+)
> create mode 100644 Documentation/git-maintenance.txt
> create mode 100755 t/t7900-maintenance.sh
Looks reasonable.
[...]
> --- /dev/null
> +++ b/Documentation/git-maintenance.txt
> @@ -0,0 +1,57 @@
> +git-maintenance(1)
> +==================
> +
> +NAME
> +----
> +git-maintenance - Run tasks to optimize Git repository data
> +
> +
> +SYNOPSIS
> +--------
> +[verse]
> +'git maintenance' run [<options>]
> +
> +
> +DESCRIPTION
> +-----------
> +Run tasks to optimize Git repository data, speeding up other Git commands
> +and reducing storage requirements for the repository.
> ++
> +Git commands that add repository data, such as `git add` or `git fetch`,
> +are optimized for a responsive user experience. These commands do not take
> +time to optimize the Git data, since such optimizations scale with the full
> +size of the repository while these user commands each perform a relatively
> +small action.
> ++
> +The `git maintenance` command provides flexibility for how to optimize the
> +Git repository.
> +
> +SUBCOMMANDS
> +-----------
> +
> +run::
> + Run one or more maintenance tasks.
This is still confusing --- shouldn't it say something like "Run the
`gc` maintenance task (see below)"?
[...]
> +TASKS
> +-----
> +
> +gc::
> + Cleanup unnecessary files and optimize the local repository. "GC"
nit: cleanup is the noun, "clean up" is the verb
> + stands for "garbage collection," but this task performs many
> + smaller tasks. This task can be rather expensive for large
nit: the word "rather" is not doing much work here, so we could leave
it out
> + repositories, as it repacks all Git objects into a single pack-file.
> + It can also be disruptive in some situations, as it deletes stale
> + data.
What stale data is this referring to? Where can I read more about
what disruption it causes (or in other words, as a user, how would I
decide when *not* to run this command)?
[...]
> +OPTIONS
> +-------
> +--auto::
> + When combined with the `run` subcommand, run maintenance tasks
> + only if certain thresholds are met. For example, the `gc` task
> + runs when the number of loose objects exceeds the number stored
> + in the `gc.auto` config setting, or when the number of pack-files
> + exceeds the `gc.autoPackLimit` config setting.
Hm, today I learned. I had thought that --auto doesn't only affect
thresholds but also would affect how aggressive the gc is when
triggered, but the git-gc(1) manpage agrees with what's said above.
Is there a way we can share information between the two to avoid one
falling out of date? For example, should git-gc.txt point to this
page for the authoritative description?
[...]
> --- a/builtin/gc.c
> +++ b/builtin/gc.c
> @@ -699,3 +699,60 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
>
> return 0;
> }
> +
> +static const char * const builtin_maintenance_usage[] = {
> + N_("git maintenance run [<options>]"),
not about this patch: I wish we could automatically generate a usage
string in this simple kind of case, to decrease the burden on
translators.
[...]
> +static int maintenance_task_gc(struct maintenance_opts *opts)
> +{
> + struct child_process child = CHILD_PROCESS_INIT;
> +
> + child.git_cmd = 1;
> + strvec_push(&child.args, "gc");
> +
> + if (opts->auto_flag)
> + strvec_push(&child.args, "--auto");
> +
> + close_object_store(the_repository->objects);
Interesting --- what does this function call do?
> + return run_command(&child);
> +}
> +
> +static int maintenance_run(struct maintenance_opts *opts)
> +{
> + return maintenance_task_gc(opts);
> +}
> +
> +int cmd_maintenance(int argc, const char **argv, const char *prefix)
> +{
> + static struct maintenance_opts opts;
> + static struct option builtin_maintenance_options[] = {
> + OPT_BOOL(0, "auto", &opts.auto_flag,
> + N_("run tasks based on the state of the repository")),
> + OPT_END()
> + };
optional: these could be local instead of static
> +
> + memset(&opts, 0, sizeof(opts));
not needed if it's static. If it's not static, could use `opts = {0}`
where it's declared to do the same thing in a simpler way.
> +
> + if (argc == 2 && !strcmp(argv[1], "-h"))
> + usage_with_options(builtin_maintenance_usage,
> + builtin_maintenance_options);
> +
> + argc = parse_options(argc, argv, prefix,
> + builtin_maintenance_options,
> + builtin_maintenance_usage,
> + PARSE_OPT_KEEP_UNKNOWN);
> +
> + if (argc == 1) {
> + if (!strcmp(argv[0], "run"))
> + return maintenance_run(&opts);
> + }
> +
> + usage_with_options(builtin_maintenance_usage,
> + builtin_maintenance_options);
optional: could reverse this test to get the uninteresting case out of
the way first:
if (argc != 1)
usage ...
...
That would also allow making the usage string when argv[0] is not
"run" more specific.
[...]
> --- /dev/null
> +++ b/t/t7900-maintenance.sh
> @@ -0,0 +1,19 @@
> +#!/bin/sh
> +
> +test_description='git maintenance builtin'
> +
> +. ./test-lib.sh
> +
> +test_expect_success 'help text' '
> + test_expect_code 129 git maintenance -h 2>err &&
> + test_i18ngrep "usage: git maintenance run" err
> +'
> +
> +test_expect_success 'run [--auto]' '
> + GIT_TRACE2_EVENT="$(pwd)/run-no-auto.txt" git maintenance run &&
> + GIT_TRACE2_EVENT="$(pwd)/run-auto.txt" git maintenance run --auto &&
> + test_subcommand git gc <run-no-auto.txt &&
> + test_subcommand git gc --auto <run-auto.txt
Nice.
[...]
> --- a/t/test-lib-functions.sh
> +++ b/t/test-lib-functions.sh
> @@ -1561,3 +1561,36 @@ test_path_is_hidden () {
> case "$("$SYSTEMROOT"/system32/attrib "$1")" in *H*?:*) return 0;; esac
> return 1
> }
> +
> +# Check that the given command was invoked as part of the
> +# trace2-format trace on stdin.
> +#
> +# test_subcommand [!] <command> <args>... < <trace>
> +#
> +# For example, to look for an invocation of "git upload-pack
> +# /path/to/repo"
> +#
> +# GIT_TRACE2_EVENT=event.log git fetch ... &&
> +# test_subcommand git upload-pack "$PATH" <event.log
> +#
> +# If the first parameter passed is !, this instead checks that
> +# the given command was not called.
> +#
> +test_subcommand () {
> + local negate=
> + if test "$1" = "!"
> + then
> + negate=t
> + shift
> + fi
> +
> + local expr=$(printf '"%s",' "$@")
> + expr="${expr%,}"
> +
> + if test -n "$negate"
> + then
> + ! grep "\[$expr\]"
> + else
> + grep "\[$expr\]"
> + fi
> +}
With whatever subset of the changes described above makes sense,
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Thanks for your patient work.
next prev parent reply other threads:[~2020-08-12 21:03 UTC|newest]
Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-06 15:48 [PATCH 00/11] Maintenance I: Command, gc and commit-graph tasks Derrick Stolee via GitGitGadget
2020-08-06 15:48 ` [PATCH 01/11] maintenance: create basic maintenance runner Derrick Stolee via GitGitGadget
2020-08-07 22:16 ` Martin Ågren
2020-08-12 21:03 ` Jonathan Nieder [this message]
2020-08-12 22:07 ` Junio C Hamano
2020-08-12 22:50 ` Jonathan Nieder
2020-08-14 1:05 ` Derrick Stolee
2020-08-06 15:48 ` [PATCH 02/11] maintenance: add --quiet option Derrick Stolee via GitGitGadget
2020-08-06 15:48 ` [PATCH 03/11] maintenance: replace run_auto_gc() Derrick Stolee via GitGitGadget
2020-08-06 15:48 ` [PATCH 04/11] maintenance: initialize task array Derrick Stolee via GitGitGadget
2020-08-06 15:48 ` [PATCH 05/11] maintenance: add commit-graph task Derrick Stolee via GitGitGadget
2020-08-07 22:29 ` Martin Ågren
2020-08-12 13:30 ` Derrick Stolee
2020-08-14 12:23 ` Martin Ågren
2020-08-06 15:48 ` [PATCH 06/11] maintenance: add --task option Derrick Stolee via GitGitGadget
2020-08-06 15:48 ` [PATCH 07/11] maintenance: take a lock on the objects directory Derrick Stolee via GitGitGadget
2020-08-06 15:48 ` [PATCH 08/11] maintenance: create maintenance.<task>.enabled config Derrick Stolee via GitGitGadget
2020-08-06 15:48 ` [PATCH 09/11] maintenance: use pointers to check --auto Derrick Stolee via GitGitGadget
2020-08-06 15:48 ` [PATCH 10/11] maintenance: add auto condition for commit-graph task Derrick Stolee via GitGitGadget
2020-08-06 15:48 ` [PATCH 11/11] maintenance: add trace2 regions for task execution Derrick Stolee via GitGitGadget
2020-08-18 14:22 ` [PATCH v2 00/11] Maintenance I: Command, gc and commit-graph tasks Derrick Stolee via GitGitGadget
2020-08-18 14:22 ` [PATCH v2 01/11] maintenance: create basic maintenance runner Derrick Stolee via GitGitGadget
2020-08-18 14:22 ` [PATCH v2 02/11] maintenance: add --quiet option Derrick Stolee via GitGitGadget
2020-08-18 14:23 ` [PATCH v2 03/11] maintenance: replace run_auto_gc() Derrick Stolee via GitGitGadget
2020-08-18 14:23 ` [PATCH v2 04/11] maintenance: initialize task array Derrick Stolee via GitGitGadget
2020-08-18 23:46 ` Jonathan Tan
2020-08-18 14:23 ` [PATCH v2 05/11] maintenance: add commit-graph task Derrick Stolee via GitGitGadget
2020-08-18 23:51 ` Jonathan Tan
2020-08-19 15:04 ` Derrick Stolee
2020-08-19 17:43 ` Jonathan Tan
2020-08-18 14:23 ` [PATCH v2 06/11] maintenance: add --task option Derrick Stolee via GitGitGadget
2020-08-19 0:00 ` Jonathan Tan
2020-08-19 0:36 ` Junio C Hamano
2020-08-19 15:09 ` Derrick Stolee
2020-08-19 17:35 ` Jonathan Tan
2020-08-18 14:23 ` [PATCH v2 07/11] maintenance: take a lock on the objects directory Derrick Stolee via GitGitGadget
2020-08-19 0:04 ` Jonathan Tan
2020-08-19 15:10 ` Derrick Stolee
2020-08-18 14:23 ` [PATCH v2 08/11] maintenance: create maintenance.<task>.enabled config Derrick Stolee via GitGitGadget
2020-08-18 14:23 ` [PATCH v2 09/11] maintenance: use pointers to check --auto Derrick Stolee via GitGitGadget
2020-08-18 14:23 ` [PATCH v2 10/11] maintenance: add auto condition for commit-graph task Derrick Stolee via GitGitGadget
2020-08-19 0:09 ` Jonathan Tan
2020-08-19 15:15 ` Derrick Stolee
2020-08-18 14:23 ` [PATCH v2 11/11] maintenance: add trace2 regions for task execution Derrick Stolee via GitGitGadget
2020-08-19 0:11 ` Jonathan Tan
2020-08-18 20:18 ` [PATCH v2 00/11] Maintenance I: Command, gc and commit-graph tasks Junio C Hamano
2020-08-19 14:51 ` Derrick Stolee
2020-08-25 18:33 ` [PATCH v3 " Derrick Stolee via GitGitGadget
2020-08-25 18:33 ` [PATCH v3 01/11] maintenance: create basic maintenance runner Derrick Stolee via GitGitGadget
2020-08-25 18:33 ` [PATCH v3 02/11] maintenance: add --quiet option Derrick Stolee via GitGitGadget
2020-08-25 18:33 ` [PATCH v3 03/11] maintenance: replace run_auto_gc() Derrick Stolee via GitGitGadget
2020-08-25 18:33 ` [PATCH v3 04/11] maintenance: initialize task array Derrick Stolee via GitGitGadget
2020-08-25 18:33 ` [PATCH v3 05/11] maintenance: add commit-graph task Derrick Stolee via GitGitGadget
2020-08-25 18:33 ` [PATCH v3 06/11] maintenance: add --task option Derrick Stolee via GitGitGadget
2020-08-25 18:33 ` [PATCH v3 07/11] maintenance: take a lock on the objects directory Derrick Stolee via GitGitGadget
2020-08-26 23:02 ` Jonathan Tan
2020-08-25 18:33 ` [PATCH v3 08/11] maintenance: create maintenance.<task>.enabled config Derrick Stolee via GitGitGadget
2020-08-25 18:33 ` [PATCH v3 09/11] maintenance: use pointers to check --auto Derrick Stolee via GitGitGadget
2020-08-25 18:33 ` [PATCH v3 10/11] maintenance: add auto condition for commit-graph task Derrick Stolee via GitGitGadget
2020-08-26 23:02 ` Jonathan Tan
2020-08-26 23:56 ` Junio C Hamano
2020-08-25 18:33 ` [PATCH v3 11/11] maintenance: add trace2 regions for task execution Derrick Stolee via GitGitGadget
2020-09-04 13:09 ` [PATCH v4 00/11] Maintenance I: Command, gc and commit-graph tasks Derrick Stolee via GitGitGadget
2020-09-04 13:09 ` [PATCH v4 01/11] maintenance: create basic maintenance runner Derrick Stolee via GitGitGadget
2020-09-04 13:09 ` [PATCH v4 02/11] maintenance: add --quiet option Derrick Stolee via GitGitGadget
2020-09-04 13:09 ` [PATCH v4 03/11] maintenance: replace run_auto_gc() Derrick Stolee via GitGitGadget
2020-09-04 13:09 ` [PATCH v4 04/11] maintenance: initialize task array Derrick Stolee via GitGitGadget
2020-09-04 13:09 ` [PATCH v4 05/11] maintenance: add commit-graph task Derrick Stolee via GitGitGadget
2020-09-04 13:09 ` [PATCH v4 06/11] maintenance: add --task option Derrick Stolee via GitGitGadget
2020-09-04 13:09 ` [PATCH v4 07/11] maintenance: take a lock on the objects directory Derrick Stolee via GitGitGadget
2020-09-04 13:09 ` [PATCH v4 08/11] maintenance: create maintenance.<task>.enabled config Derrick Stolee via GitGitGadget
2020-09-04 13:09 ` [PATCH v4 09/11] maintenance: use pointers to check --auto Derrick Stolee via GitGitGadget
2020-09-04 13:09 ` [PATCH v4 10/11] maintenance: add auto condition for commit-graph task Derrick Stolee via GitGitGadget
2020-09-04 13:09 ` [PATCH v4 11/11] maintenance: add trace2 regions for task execution Derrick Stolee via GitGitGadget
2020-09-17 18:11 ` [PATCH v5 00/11] Maintenance I: Command, gc and commit-graph tasks Derrick Stolee via GitGitGadget
2020-09-17 18:11 ` [PATCH v5 01/11] maintenance: create basic maintenance runner Derrick Stolee via GitGitGadget
2020-09-17 18:11 ` [PATCH v5 02/11] maintenance: add --quiet option Derrick Stolee via GitGitGadget
2020-09-17 18:11 ` [PATCH v5 03/11] maintenance: replace run_auto_gc() Derrick Stolee via GitGitGadget
2020-09-17 18:11 ` [PATCH v5 04/11] maintenance: initialize task array Derrick Stolee via GitGitGadget
2020-09-17 18:11 ` [PATCH v5 05/11] maintenance: add commit-graph task Derrick Stolee via GitGitGadget
2020-09-17 18:11 ` [PATCH v5 06/11] maintenance: add --task option Derrick Stolee via GitGitGadget
2020-09-17 18:11 ` [PATCH v5 07/11] maintenance: take a lock on the objects directory Derrick Stolee via GitGitGadget
2020-09-21 13:36 ` Ævar Arnfjörð Bjarmason
2020-09-21 13:43 ` Derrick Stolee
2020-09-21 19:29 ` Junio C Hamano
2020-09-17 18:11 ` [PATCH v5 08/11] maintenance: create maintenance.<task>.enabled config Derrick Stolee via GitGitGadget
2020-09-17 18:11 ` [PATCH v5 09/11] maintenance: use pointers to check --auto Derrick Stolee via GitGitGadget
2020-09-17 18:11 ` [PATCH v5 10/11] maintenance: add auto condition for commit-graph task Derrick Stolee via GitGitGadget
2020-09-17 18:11 ` [PATCH v5 11/11] maintenance: add trace2 regions for task execution Derrick Stolee via GitGitGadget
2020-09-17 18:35 ` [PATCH v5 00/11] Maintenance I: Command, gc and commit-graph tasks Junio C Hamano
2020-09-18 13:14 ` Johannes Schindelin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200812210326.GA104953@google.com \
--to=jrnieder@gmail.com \
--cc=congdanhqx@gmail.com \
--cc=derrickstolee@github.com \
--cc=dstolee@microsoft.com \
--cc=emilyshaffer@google.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=jonathantanmy@google.com \
--cc=peff@peff.net \
--cc=phillip.wood123@gmail.com \
--cc=sandals@crustytoothpaste.net \
--cc=sluongng@gmail.com \
--cc=steadmon@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.