Merge branch 'mh/rebase-skip-hard'
[gitweb.git] / builtin-gc.c
index 23ad2b6a21a81f469e813173ba04d626949e972f..799c263936d19ef8e66b21f83a370c4fcfe9e5f5 100644 (file)
 
 #include "builtin.h"
 #include "cache.h"
+#include "parse-options.h"
 #include "run-command.h"
 
 #define FAILED_RUN "failed to run %s"
 
-static const char builtin_gc_usage[] = "git-gc [--prune] [--aggressive]";
+static const char * const builtin_gc_usage[] = {
+       "git-gc [options]",
+       NULL
+};
 
 static int pack_refs = 1;
 static int aggressive_window = -1;
@@ -26,7 +30,7 @@ static int gc_auto_pack_limit = 20;
 #define MAX_ADD 10
 static const char *argv_pack_refs[] = {"pack-refs", "--all", "--prune", NULL};
 static const char *argv_reflog[] = {"reflog", "expire", "--all", NULL};
-static const char *argv_repack[MAX_ADD] = {"repack", "-a", "-d", "-l", NULL};
+static const char *argv_repack[MAX_ADD] = {"repack", "-d", "-l", NULL};
 static const char *argv_prune[] = {"prune", NULL};
 static const char *argv_rerere[] = {"rerere", "gc", NULL};
 
@@ -143,8 +147,6 @@ static int too_many_packs(void)
 
 static int need_to_gc(void)
 {
-       int ac = 0;
-
        /*
         * Setting gc.auto and gc.autopacklimit to 0 or negative can
         * disable the automatic gc.
@@ -158,51 +160,43 @@ static int need_to_gc(void)
         * we run "repack -A -d -l".  Otherwise we tell the caller
         * there is no need.
         */
-       argv_repack[ac++] = "repack";
        if (too_many_packs())
-               argv_repack[ac++] = "-A";
+               append_option(argv_repack, "-A", MAX_ADD);
        else if (!too_many_loose_objects())
                return 0;
-       argv_repack[ac++] = "-d";
-       argv_repack[ac++] = "-l";
-       argv_repack[ac++] = NULL;
        return 1;
 }
 
 int cmd_gc(int argc, const char **argv, const char *prefix)
 {
-       int i;
        int prune = 0;
+       int aggressive = 0;
        int auto_gc = 0;
        char buf[80];
 
+       struct option builtin_gc_options[] = {
+               OPT_BOOLEAN(0, "prune", &prune, "prune unreferenced objects"),
+               OPT_BOOLEAN(0, "aggressive", &aggressive, "be more thorough (increased runtime)"),
+               OPT_BOOLEAN(0, "auto", &auto_gc, "enable auto-gc mode"),
+               OPT_END()
+       };
+
        git_config(gc_config);
 
        if (pack_refs < 0)
                pack_refs = !is_bare_repository();
 
-       for (i = 1; i < argc; i++) {
-               const char *arg = argv[i];
-               if (!strcmp(arg, "--prune")) {
-                       prune = 1;
-                       continue;
-               }
-               if (!strcmp(arg, "--aggressive")) {
-                       append_option(argv_repack, "-f", MAX_ADD);
-                       if (aggressive_window > 0) {
-                               sprintf(buf, "--window=%d", aggressive_window);
-                               append_option(argv_repack, buf, MAX_ADD);
-                       }
-                       continue;
-               }
-               if (!strcmp(arg, "--auto")) {
-                       auto_gc = 1;
-                       continue;
+       argc = parse_options(argc, argv, builtin_gc_options, builtin_gc_usage, 0);
+       if (argc > 0)
+               usage_with_options(builtin_gc_usage, builtin_gc_options);
+
+       if (aggressive) {
+               append_option(argv_repack, "-f", MAX_ADD);
+               if (aggressive_window > 0) {
+                       sprintf(buf, "--window=%d", aggressive_window);
+                       append_option(argv_repack, buf, MAX_ADD);
                }
-               break;
        }
-       if (i != argc)
-               usage(builtin_gc_usage);
 
        if (auto_gc) {
                /*
@@ -211,6 +205,20 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
                prune = 0;
                if (!need_to_gc())
                        return 0;
+               fprintf(stderr, "Packing your repository for optimum "
+                       "performance. You may also\n"
+                       "run \"git gc\" manually. See "
+                       "\"git help gc\" for more information.\n");
+       } else {
+               /*
+                * Use safer (for shared repos) "-A" option to
+                * repack when not pruning. Auto-gc makes its
+                * own decision.
+                */
+               if (prune)
+                       append_option(argv_repack, "-a", MAX_ADD);
+               else
+                       append_option(argv_repack, "-A", MAX_ADD);
        }
 
        if (pack_refs && run_command_v_opt(argv_pack_refs, RUN_GIT_CMD))