]> asedeno.scripts.mit.edu Git - git.git/blobdiff - builtin-gc.c
Merge git://git.kernel.org/pub/scm/gitk/gitk
[git.git] / builtin-gc.c
index 6323e0d9db9f2e0119bd52bdc45bb5d8434d355d..ac34788c89c315d036ab041afbac91a0302e6d6a 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;
@@ -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,10 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
                prune = 0;
                if (!need_to_gc())
                        return 0;
+               fprintf(stderr, "Auto 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