Re: [PATCH 19/21] index-pack, pack-objects: allow creating .idx v2 with .pack v4

2013-09-11 Thread Nicolas Pitre
On Wed, 11 Sep 2013, Nguyễn Thái Ngọc Duy wrote:

> 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 need to this kind of information from show-index
> and show-index does not support .idx v3.

FYI, I've added that ability to show-index in my tree.  The output does 
not include the actual object SHA1 though.

[...]
> @@ -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 does not work with pack version %d"),
> + opts.version, 4);

I don't think this is what you really meant here.  I've amended this 
patch with:

diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 4607dc6..f071ed9 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -2171,8 +2171,8 @@ 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 does not work with pack version %d"),
-   opts.version, 4);
+   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();


Nicolas


[PATCH 19/21] index-pack, pack-objects: allow creating .idx v2 with .pack v4

2013-09-10 Thread Nguyễn Thái Ngọc Duy
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 need to this kind of information from show-index
and show-index does not support .idx v3.

Signed-off-by: Nguyễn Thái Ngọc Duy 
---
 builtin/index-pack.c   | 14 ++
 builtin/pack-objects.c | 14 ++
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 1895adf..4607dc6 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 & 0x8000)
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 does not work with pack version %d"),
+   opts.version, 4);
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 ac25973..f604fa5 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;
@@ -2205,7 +2205,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;
}
 
@@ -2319,9 +2320,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);
@@ -2604,12 +2606,13 @@ static int option_parse_index_version(const struct 
option *opt,
char *c;
const char *val = arg