@ -15,13 +15,15 @@
#define FAILED_RUN "failed to run %s"
#define FAILED_RUN "failed to run %s"
static const char builtin_gc_usage[] = "git-gc [--prune]";
static const char builtin_gc_usage[] = "git-gc [--prune] [--aggressive]";
static int pack_refs = -1;
static int pack_refs = -1;
static int aggressive_window = -1;
#define MAX_ADD 10
static const char *argv_pack_refs[] = {"pack-refs", "--prune", NULL};
static const char *argv_pack_refs[] = {"pack-refs", "--prune", NULL};
static const char *argv_reflog[] = {"reflog", "expire", "--all", NULL};
static const char *argv_reflog[] = {"reflog", "expire", "--all", NULL};
static const char *argv_repack[] = {"repack", "-a", "-d", "-l", NULL};
static const char *argv_repack[MAX_ADD] = {"repack", "-a", "-d", "-l", NULL};
static const char *argv_prune[] = {"prune", NULL};
static const char *argv_prune[] = {"prune", NULL};
static const char *argv_rerere[] = {"rerere", "gc", NULL};
static const char *argv_rerere[] = {"rerere", "gc", NULL};
@ -34,13 +36,31 @@ static int gc_config(const char *var, const char *value)
pack_refs = git_config_bool(var, value);
pack_refs = git_config_bool(var, value);
return 0;
return 0;
}
}
if (!strcmp(var, "gc.aggressivewindow")) {
aggressive_window = git_config_int(var, value);
return 0;
}
return git_default_config(var, value);
return git_default_config(var, value);
}
}
static void append_option(const char **cmd, const char *opt, int max_length)
{
int i;
for (i = 0; cmd[i]; i++)
;
if (i + 2 >= max_length)
die("Too many options specified");
cmd[i++] = opt;
cmd[i] = NULL;
}
int cmd_gc(int argc, const char **argv, const char *prefix)
int cmd_gc(int argc, const char **argv, const char *prefix)
{
{
int i;
int i;
int prune = 0;
int prune = 0;
char buf[80];
git_config(gc_config);
git_config(gc_config);
@ -53,6 +73,14 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
prune = 1;
prune = 1;
continue;
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;
}
/* perhaps other parameters later... */
/* perhaps other parameters later... */
break;
break;
}
}