Merge branch 'nd/daemonize-gc'
authorJunio C Hamano <gitster@pobox.com>
Mon, 16 Jun 2014 19:18:12 +0000 (12:18 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Jun 2014 19:18:12 +0000 (12:18 -0700)
"git gc --auto" was recently changed to run in the background to
give control back early to the end-user sitting in front of the
terminal, but it forgot that housekeeping involving reflogs should
be done without other processes competing for accesses to the refs.

* nd/daemonize-gc:
gc --auto: do not lock refs in the background

1  2 
builtin/gc.c
diff --combined builtin/gc.c
index 85f5c2bc62ec1ead593f5aa2e3d7077e65f2f061,4588af70df9902f43b818d6ab107b47b0a282845..8d219d8c42cb4dfb64468f9b4d82648bff646685
@@@ -26,7 -26,7 +26,8 @@@ static const char * const builtin_gc_us
  };
  
  static int pack_refs = 1;
+ static int prune_reflogs = 1;
 +static int aggressive_depth = 250;
  static int aggressive_window = 250;
  static int gc_auto_threshold = 6700;
  static int gc_auto_pack_limit = 50;
@@@ -67,10 -67,6 +68,10 @@@ static int gc_config(const char *var, c
                aggressive_window = git_config_int(var, value);
                return 0;
        }
 +      if (!strcmp(var, "gc.aggressivedepth")) {
 +              aggressive_depth = git_config_int(var, value);
 +              return 0;
 +      }
        if (!strcmp(var, "gc.auto")) {
                gc_auto_threshold = git_config_int(var, value);
                return 0;
@@@ -189,7 -185,7 +190,7 @@@ static int need_to_gc(void
        else if (!too_many_loose_objects())
                return 0;
  
 -      if (run_hook(NULL, "pre-auto-gc", NULL))
 +      if (run_hook_le(NULL, "pre-auto-gc", NULL))
                return 0;
        return 1;
  }
  static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
  {
        static struct lock_file lock;
 -      static char locking_host[128];
        char my_host[128];
        struct strbuf sb = STRBUF_INIT;
        struct stat st;
        uintmax_t pid;
        FILE *fp;
 -      int fd, should_exit;
 +      int fd;
  
        if (pidfile)
                /* already locked */
        fd = hold_lock_file_for_update(&lock, git_path("gc.pid"),
                                       LOCK_DIE_ON_ERROR);
        if (!force) {
 +              static char locking_host[128];
 +              int should_exit;
                fp = fopen(git_path("gc.pid"), "r");
                memset(locking_host, 0, sizeof(locking_host));
                should_exit =
        return NULL;
  }
  
+ static int gc_before_repack(void)
+ {
+       if (pack_refs && run_command_v_opt(pack_refs_cmd.argv, RUN_GIT_CMD))
+               return error(FAILED_RUN, pack_refs_cmd.argv[0]);
+       if (prune_reflogs && run_command_v_opt(reflog.argv, RUN_GIT_CMD))
+               return error(FAILED_RUN, reflog.argv[0]);
+       pack_refs = 0;
+       prune_reflogs = 0;
+       return 0;
+ }
  int cmd_gc(int argc, const char **argv, const char *prefix)
  {
        int aggressive = 0;
  
        if (aggressive) {
                argv_array_push(&repack, "-f");
 -              argv_array_push(&repack, "--depth=250");
 +              if (aggressive_depth > 0)
 +                      argv_array_pushf(&repack, "--depth=%d", aggressive_depth);
                if (aggressive_window > 0)
                        argv_array_pushf(&repack, "--window=%d", aggressive_window);
        }
                                fprintf(stderr, _("Auto packing the repository for optimum performance.\n"));
                        fprintf(stderr, _("See \"git help gc\" for manual housekeeping.\n"));
                }
-               if (detach_auto)
+               if (detach_auto) {
+                       if (gc_before_repack())
+                               return -1;
                        /*
                         * failure to daemonize is ok, we'll continue
                         * in foreground
                         */
                        daemonize();
+               }
        } else
                add_repack_all_option();
  
                    name, (uintmax_t)pid);
        }
  
-       if (pack_refs && run_command_v_opt(pack_refs_cmd.argv, RUN_GIT_CMD))
-               return error(FAILED_RUN, pack_refs_cmd.argv[0]);
-       if (run_command_v_opt(reflog.argv, RUN_GIT_CMD))
-               return error(FAILED_RUN, reflog.argv[0]);
+       if (gc_before_repack())
+               return -1;
  
        if (run_command_v_opt(repack.argv, RUN_GIT_CMD))
                return error(FAILED_RUN, repack.argv[0]);