On Sat, Feb 8, 2014 at 8:08 AM, Nguyễn Thái Ngọc Duy <pclouds@gmail.com> wrote:
Show 73 quoted lines
> `gc --auto` takes time and can block the user temporarily (but not any
> less annoyingly). Make it run in background on systems that support
> it. The only thing lost with running in background is printouts. But
> gc output is not really interesting. You can keep it in foreground by
> changing gc.autodetach.
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
> Documentation/config.txt | 4 ++++
> builtin/gc.c | 23 ++++++++++++++++++-----
> t/t5400-send-pack.sh | 1 +
> 3 files changed, 23 insertions(+), 5 deletions(-)
>
> diff --git a/Documentation/config.txt b/Documentation/config.txt
> index 5f4d793..4781773 100644
> --- a/Documentation/config.txt
> +++ b/Documentation/config.txt
> @@ -1167,6 +1167,10 @@ gc.autopacklimit::
> --auto` consolidates them into one larger pack. The
> default value is 50. Setting this to 0 disables it.
>
> +gc.autodetach::
> + Make `git gc --auto` return immediately andrun in background
> + if the system supports it. Default is true.
> +
> gc.packrefs::
> Running `git pack-refs` in a repository renders it
> unclonable by Git versions prior to 1.5.1.2 over dumb
> diff --git a/builtin/gc.c b/builtin/gc.c
> index c19545d..ed5cc3c 100644
> --- a/builtin/gc.c
> +++ b/builtin/gc.c
> @@ -29,6 +29,7 @@ static int pack_refs = 1;
> static int aggressive_window = 250;
> static int gc_auto_threshold = 6700;
> static int gc_auto_pack_limit = 50;
> +static int detach_auto = 1;
> static const char *prune_expire = "2.weeks.ago";
>
> static struct argv_array pack_refs_cmd = ARGV_ARRAY_INIT;
> @@ -73,6 +74,10 @@ static int gc_config(const char *var, const char *value, void *cb)
> gc_auto_pack_limit = git_config_int(var, value);
> return 0;
> }
> + if (!strcmp(var, "gc.autodetach")) {
> + detach_auto = git_config_bool(var, value);
> + return 0;
> + }
> if (!strcmp(var, "gc.pruneexpire")) {
> if (value && strcmp(value, "now")) {
> unsigned long now = approxidate("now");
> @@ -301,11 +306,19 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
> */
> if (!need_to_gc())
> return 0;
> - if (!quiet)
> - fprintf(stderr,
> - _("Auto packing the repository for optimum performance. You may also\n"
> - "run \"git gc\" manually. See "
> - "\"git help gc\" for more information.\n"));
> + if (!quiet) {
> + if (detach_auto)
> + fprintf(stderr, _("Auto packing the repository in background for optimum performance.\n"));
> + else
> + fprintf(stderr, _("Auto packing the repository for optimum performance.\n"));
> + fprintf(stderr, _("See \"git help gc\" for manual housekeeping.\n"));
> + }
> + if (detach_auto)
> + /*
> + * failure to daemonize is ok, we'll continue
> + * in foreground
> + */
> + daemonize();