summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland Dreier <roland@digitalvampire.org>2007-02-25 09:34:27 -0800
committerJunio C Hamano <junkio@cox.net>2007-02-25 10:50:12 -0800
commitffa84ffb77b06f9793967fb4f4dd5c946da8e341 (patch)
tree1e6022bcbb3cb3691af80f55fea5ab2f36ad2215
parent128917274943bd0e2dea69862c5a9893a962e350 (diff)
downloadgit-ffa84ffb77b06f9793967fb4f4dd5c946da8e341.tar.gz
Allow arbitrary number of arguments to git-pack-objects
If a repository ever gets in a situation where there are too many packs (more than 60 or so), perhaps because of frequent use of git-fetch -k or incremental git-repack, then it becomes impossible to fully repack the repository with git-repack -a. That command just dies with the cryptic message fatal: too many internal rev-list options This message comes from git-pack-objects, which is passed one command line option like --unpacked=pack-<SHA1>.pack for each pack file to be repacked. However, the current code has a static limit of 64 command line arguments and just aborts if more arguments are passed to it. Fix this by dynamically allocating the array of command line arguments, and doubling the size each time it overflows. Signed-off-by: Roland Dreier <roland@digitalvampire.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--builtin-pack-objects.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
index 3824ee33ac..971388276a 100644
--- a/builtin-pack-objects.c
+++ b/builtin-pack-objects.c
@@ -1551,9 +1551,12 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
int use_internal_rev_list = 0;
int thin = 0;
int i;
- const char *rp_av[64];
+ const char **rp_av;
+ int rp_ac_alloc = 64;
int rp_ac;
+ rp_av = xcalloc(rp_ac_alloc, sizeof(*rp_av));
+
rp_av[0] = "pack-objects";
rp_av[1] = "--objects"; /* --thin will make it --objects-edge */
rp_ac = 2;
@@ -1626,8 +1629,11 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
!strcmp("--reflog", arg) ||
!strcmp("--all", arg)) {
use_internal_rev_list = 1;
- if (ARRAY_SIZE(rp_av) - 1 <= rp_ac)
- die("too many internal rev-list options");
+ if (rp_ac >= rp_ac_alloc - 1) {
+ rp_ac_alloc = alloc_nr(rp_ac_alloc);
+ rp_av = xrealloc(rp_av,
+ rp_ac_alloc * sizeof(*rp_av));
+ }
rp_av[rp_ac++] = arg;
continue;
}