summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2013-09-11 13:06:20 +0700
committerNicolas Pitre <nico@fluxnic.net>2013-09-13 21:00:31 -0400
commit740931162751fb50d99f98eb7753eb5cdce94172 (patch)
tree0cb7a7ef8f1dffc92d51d479b409de7b665b22ca
parent573087deb57743d67afd8f2ff18c0802e0033d33 (diff)
downloadgit-740931162751fb50d99f98eb7753eb5cdce94172.tar.gz
index-pack, pack-objects: allow creating .idx v2 with .pack v4
While .idx v3 is recommended because it's smaller, there is no reason why .idx v2 can't use with .pack v4. Enable it, at least for the test suite as some tests may need the extra information from show-index. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Nicolas Pitre <nico@fluxnic.net>
-rw-r--r--builtin/index-pack.c14
-rw-r--r--builtin/pack-objects.c14
2 files changed, 20 insertions, 8 deletions
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 1895adf1b8..f071ed900c 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -89,7 +89,7 @@ static int verbose;
static int show_stat;
static int check_self_contained_and_connected;
static int packv4;
-
+static int idx_version_set;
static struct progress *progress;
/* We always read in 4kB chunks. */
@@ -1892,8 +1892,9 @@ static int git_index_pack_config(const char *k, const char *v, void *cb)
if (!strcmp(k, "pack.indexversion")) {
opts->version = git_config_int(k, v);
- if (opts->version > 2)
+ if (opts->version > 3)
die(_("bad pack.indexversion=%"PRIu32), opts->version);
+ idx_version_set = 1;
return 0;
}
if (!strcmp(k, "pack.threads")) {
@@ -2107,12 +2108,13 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
} else if (!prefixcmp(arg, "--index-version=")) {
char *c;
opts.version = strtoul(arg + 16, &c, 10);
- if (opts.version > 2)
+ if (opts.version > 3)
die(_("bad %s"), arg);
if (*c == ',')
opts.off32_limit = strtoul(c+1, &c, 0);
if (*c || opts.off32_limit & 0x80000000)
die(_("bad %s"), arg);
+ idx_version_set = 1;
} else
usage(index_pack_usage);
continue;
@@ -2151,6 +2153,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
if (!index_name)
die(_("--verify with no packfile name given"));
read_idx_option(&opts, index_name);
+ idx_version_set = 1;
opts.flags |= WRITE_IDX_VERIFY | WRITE_IDX_STRICT;
}
if (strict)
@@ -2167,6 +2170,9 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
curr_pack = open_pack_file(pack_name);
parse_pack_header();
+ if (!packv4 && opts.version >= 3)
+ die(_("pack idx version %d requires at least pack version 4"),
+ opts.version);
objects = xcalloc(nr_objects + 1, sizeof(struct object_entry));
deltas = xcalloc(nr_objects, sizeof(struct delta_entry));
parse_dictionaries();
@@ -2180,7 +2186,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
if (show_stat)
show_pack_info(stat_only);
- if (packv4)
+ if (packv4 && !idx_version_set)
opts.version = 3;
idx_objects = xmalloc((nr_objects) * sizeof(struct pack_idx_entry *));
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 4ed1b1162d..6d3c1c8fcb 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -66,7 +66,7 @@ static uint32_t nr_objects, nr_alloc, nr_result, nr_written;
static struct packv4_tables v4;
-static int non_empty;
+static int non_empty, idx_version_set;
static int reuse_delta = 1, reuse_object = 1;
static int keep_unreachable, unpack_unreachable, include_tag;
static unsigned long unpack_unreachable_expiration;
@@ -2206,7 +2206,8 @@ static void prepare_pack(int window, int depth)
sort_dict_entries_by_hits(v4.commit_ident_table);
sort_dict_entries_by_hits(v4.tree_path_table);
v4.all_objs = xmalloc(nr_objects * sizeof(*v4.all_objs));
- pack_idx_opts.version = 3;
+ if (!idx_version_set)
+ pack_idx_opts.version = 3;
allow_ofs_delta = 0;
}
@@ -2320,9 +2321,10 @@ static int git_pack_config(const char *k, const char *v, void *cb)
}
if (!strcmp(k, "pack.indexversion")) {
pack_idx_opts.version = git_config_int(k, v);
- if (pack_idx_opts.version > 2)
+ if (pack_idx_opts.version > 3)
die("bad pack.indexversion=%"PRIu32,
pack_idx_opts.version);
+ idx_version_set = 1;
return 0;
}
return git_default_config(k, v, cb);
@@ -2605,12 +2607,13 @@ static int option_parse_index_version(const struct option *opt,
char *c;
const char *val = arg;
pack_idx_opts.version = strtoul(val, &c, 10);
- if (pack_idx_opts.version > 2)
+ if (pack_idx_opts.version > 3)
die(_("unsupported index version %s"), val);
if (*c == ',' && c[1])
pack_idx_opts.off32_limit = strtoul(c+1, &c, 0);
if (*c || pack_idx_opts.off32_limit & 0x80000000)
die(_("bad index version '%s'"), val);
+ idx_version_set = 1;
return 0;
}
@@ -2740,6 +2743,9 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
usage_with_options(pack_usage, pack_objects_options);
if (pack_version != 2 && pack_version != 4)
die(_("pack version %d is not supported"), pack_version);
+ if (pack_version < 4 && pack_idx_opts.version >= 3)
+ die(_("pack idx version %d cannot be used with pack version %d"),
+ pack_idx_opts.version, pack_version);
rp_av[rp_ac++] = "pack-objects";
if (thin) {