git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v4 00/23] Multi-pack-index (MIDX)

From
Derrick Stolee <stolee@gmail.com>
Date
Jul 12, 2018, 19:39 UTC
Message-ID
<20180712193940.21065-1-dstolee@microsoft.com>
In-Reply-To
<20180706005321.124643-1-dstolee@microsoft.com>

v3 had a lot of interesting feedback, most of which was non-functional, but made a big impact on the shape of the patch, especially the test script.

These are the important changes:
* 'git multi-pack-index' will report usage if the 'write' verb is not
  provided, or if extra parameters are provided. A later series will
  create the 'verify' verb.
* t5319-multi-pack-index.sh has a reoganized way to generate object
  data, so it has fewer code clones.
* 'test-tool read-midx' uses '-' instead of '_'.
* The global 'core_multi_pack_index' is replaced with a one-time call to
  git_config_bool() per repository that loads a multi-pack-index.
* 'struct multi_pack_index' is now defined in midx.h and kept anonymous
  to object-store.h.
* Added a test that 'git repack' removes the multi-pack-index.
* Fixed a doc bug when linking to the technical docs.

I included the diff between the latest ds/multi-pack-index and this series as part of this message.

You can see the CI builds for Linux, Mac, and Windows linked from the GitHub pull request [1].

Thanks, -Stolee

[1] https://github.com/gitgitgadget/git/pull/5
Derrick Stolee (23):
  multi-pack-index: add design document
  multi-pack-index: add format details
  multi-pack-index: add builtin
  multi-pack-index: add 'write' verb
  midx: write header information to lockfile
  multi-pack-index: load into memory
  t5319: expand test data
  packfile: generalize pack directory list
  multi-pack-index: read packfile list
  multi-pack-index: write pack names in chunk
  midx: read pack names into array
  midx: sort and deduplicate objects from packfiles
  midx: write object ids in a chunk
  midx: write object id fanout chunk
  midx: write object offsets
  config: create core.multiPackIndex setting
  midx: read objects from multi-pack-index
  midx: use midx in abbreviation calculations
  midx: use existing midx when writing new one
  midx: use midx in approximate_object_count
  midx: prevent duplicate packfile loads
  packfile: skip loading index if in multi-pack-index
  midx: clear midx on repack
 .gitignore                                   |   3 +-
 Documentation/config.txt                     |   5 +
 Documentation/git-multi-pack-index.txt       |  56 ++
 Documentation/technical/multi-pack-index.txt | 109 +++
 Documentation/technical/pack-format.txt      |  77 ++
 Makefile                                     |   3 +
 builtin.h                                    |   1 +
 builtin/multi-pack-index.c                   |  47 +
 builtin/repack.c                             |   9 +
 command-list.txt                             |   1 +
 git.c                                        |   1 +
 midx.c                                       | 918 +++++++++++++++++++
 midx.h                                       |  44 +
 object-store.h                               |   9 +
 packfile.c                                   | 169 +++-
 packfile.h                                   |   9 +
 sha1-name.c                                  |  70 ++
 t/helper/test-read-midx.c                    |  51 ++
 t/helper/test-tool.c                         |   1 +
 t/helper/test-tool.h                         |   1 +
 t/t5319-multi-pack-index.sh                  | 179 ++++
 21 files changed, 1720 insertions(+), 43 deletions(-)
 create mode 100644 Documentation/git-multi-pack-index.txt
 create mode 100644 Documentation/technical/multi-pack-index.txt
 create mode 100644 builtin/multi-pack-index.c
 create mode 100644 midx.c
 create mode 100644 midx.h
 create mode 100644 t/helper/test-read-midx.c
 create mode 100755 t/t5319-multi-pack-index.sh
base-commit: 53f9a3e157dbbc901a02ac2c73346d375e24978c
-- 
2.18.0.118.gd4f65b8d14

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 9dcde07a34..25f817ca42 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -910,7 +910,8 @@ core.commitGraph::
 
 core.multiPackIndex::
 	Use the multi-pack-index file to track multiple packfiles using a
-	single index. See link:technical/multi-pack-index[1].
+	single index. See link:technical/multi-pack-index.html[the
+	multi-pack-index design document].
 
 core.sparseCheckout::
 	Enable "sparse checkout" feature. See section "Sparse checkout" in
diff --git a/Documentation/git-multi-pack-index.txt b/Documentation/git-multi-pack-index.txt
index be97c9372e..a62af1caca 100644
--- a/Documentation/git-multi-pack-index.txt
+++ b/Documentation/git-multi-pack-index.txt
@@ -9,7 +9,7 @@ git-multi-pack-index - Write and verify multi-pack-indexes
 SYNOPSIS
 --------
 [verse]
-'git multi-pack-index' [--object-dir <dir>] <verb>
+'git multi-pack-index' [--object-dir=<dir>] <verb>
 
 DESCRIPTION
 -----------
@@ -18,7 +18,7 @@ Write or verify a multi-pack-index (MIDX) file.
 OPTIONS
 -------
 
---object-dir <dir>::
+--object-dir=<dir>::
 	Use given directory for the location of Git objects. We check
 	`<dir>/packs/multi-pack-index` for the current MIDX file, and
 	`<dir>/packs` for the pack-files to index.
@@ -37,7 +37,7 @@ EXAMPLES
 $ git multi-pack-index write
 -----------------------------------------------
 
-* Write a MIDX file for the packfiles in an alternate.
+* Write a MIDX file for the packfiles in an alternate object store.
 +
 -----------------------------------------------
 $ git multi-pack-index --object-dir <alt> write
diff --git a/builtin/multi-pack-index.c b/builtin/multi-pack-index.c
index 14b32e1373..6a7aa00cf2 100644
--- a/builtin/multi-pack-index.c
+++ b/builtin/multi-pack-index.c
@@ -5,7 +5,7 @@
 #include "midx.h"
 
 static char const * const builtin_multi_pack_index_usage[] = {
-	N_("git multi-pack-index [--object-dir <dir>] [write]"),
+	N_("git multi-pack-index [--object-dir=<dir>] write"),
 	NULL
 };
 
@@ -18,14 +18,10 @@ int cmd_multi_pack_index(int argc, const char **argv,
 {
 	static struct option builtin_multi_pack_index_options[] = {
 		OPT_FILENAME(0, "object-dir", &opts.object_dir,
-		  N_("The object directory containing set of packfile and pack-index pairs")),
+		  N_("object directory containing set of packfile and pack-index pairs")),
 		OPT_END(),
 	};
 
-	if (argc == 2 && !strcmp(argv[1], "-h"))
-		usage_with_options(builtin_multi_pack_index_usage,
-				   builtin_multi_pack_index_options);
-
 	git_config(git_default_config, NULL);
 
 	argc = parse_options(argc, argv, prefix,
@@ -36,11 +32,16 @@ int cmd_multi_pack_index(int argc, const char **argv,
 		opts.object_dir = get_object_directory();
 
 	if (argc == 0)
-		usage_with_options(builtin_multi_pack_index_usage,
-				   builtin_multi_pack_index_options);
+		goto usage;
+
+	if (!strcmp(argv[0], "write")) {
+		if (argc > 1)
+			goto usage;
 
-	if (!strcmp(argv[0], "write"))
 		return write_midx_file(opts.object_dir);
+	}
 
-	return 0;
+usage:
+	usage_with_options(builtin_multi_pack_index_usage,
+			   builtin_multi_pack_index_options);
 }
diff --git a/builtin/repack.c b/builtin/repack.c
index 66a7d8e8ea..7f7cdc8b17 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -335,12 +335,6 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 	for_each_string_list_item(item, &names) {
 		for (ext = 0; ext < ARRAY_SIZE(exts); ext++) {
 			char *fname, *fname_old;
-			fname = mkpathdup("%s/pack-%s%s", packdir,
-						item->string, exts[ext].name);
-			if (!file_exists(fname)) {
-				free(fname);
-				continue;
-			}
 
 			if (!midx_cleared) {
 				/* if we move a packfile, it will invalidated the midx */
@@ -348,6 +342,13 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
 				midx_cleared = 1;
 			}
 
+			fname = mkpathdup("%s/pack-%s%s", packdir,
+						item->string, exts[ext].name);
+			if (!file_exists(fname)) {
+				free(fname);
+				continue;
+			}
+
 			fname_old = mkpathdup("%s/old-%s%s", packdir,
 						item->string, exts[ext].name);
 			if (file_exists(fname_old))
diff --git a/cache.h b/cache.h
index d12aa49710..89a107a7f7 100644
--- a/cache.h
+++ b/cache.h
@@ -814,7 +814,6 @@ extern char *git_replace_ref_base;
 extern int fsync_object_files;
 extern int core_preload_index;
 extern int core_commit_graph;
-extern int core_multi_pack_index;
 extern int core_apply_sparse_checkout;
 extern int precomposed_unicode;
 extern int protect_hfs;
diff --git a/config.c b/config.c
index 95d8da4243..fbbf0f8e9f 100644
--- a/config.c
+++ b/config.c
@@ -1313,11 +1313,6 @@ static int git_default_core_config(const char *var, const char *value)
 		return 0;
 	}
 
-	if (!strcmp(var, "core.multipackindex")) {
-		core_multi_pack_index = git_config_bool(var, value);
-		return 0;
-	}
-
 	if (!strcmp(var, "core.sparsecheckout")) {
 		core_apply_sparse_checkout = git_config_bool(var, value);
 		return 0;
diff --git a/environment.c b/environment.c
index b9bc919cdb..2a6de2330b 100644
--- a/environment.c
+++ b/environment.c
@@ -67,7 +67,6 @@ enum object_creation_mode object_creation_mode = OBJECT_CREATION_MODE;
 char *notes_ref_name;
 int grafts_replace_parents = 1;
 int core_commit_graph;
-int core_multi_pack_index;
 int core_apply_sparse_checkout;
 int merge_log_config = -1;
 int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
diff --git a/midx.c b/midx.c
index 8afd08f3fe..19b7df338e 100644
--- a/midx.c
+++ b/midx.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "config.h"
 #include "csum-file.h"
 #include "dir.h"
 #include "lockfile.h"
@@ -60,7 +61,6 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir)
 	midx_size = xsize_t(st.st_size);
 
 	if (midx_size < MIDX_MIN_SIZE) {
-		close(fd);
 		error(_("multi-pack-index file %s is too small"), midx_name);
 		goto cleanup_fail;
 	}
@@ -69,8 +69,7 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir)
 
 	midx_map = xmmap(NULL, midx_size, PROT_READ, MAP_PRIVATE, fd, 0);
 
-	m = xcalloc(1, sizeof(*m) + strlen(object_dir) + 1);
-	strcpy(m->object_dir, object_dir);
+	FLEX_ALLOC_MEM(m, object_dir, object_dir, strlen(object_dir));
 	m->fd = fd;
 	m->data = midx_map;
 	m->data_len = midx_size;
@@ -171,7 +170,6 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir)
 	return m;
 
 cleanup_fail:
-	/* no need to check for NULL when freeing */
 	free(m);
 	free(midx_name);
 	if (midx_map)
@@ -324,8 +322,10 @@ int prepare_multi_pack_index_one(struct repository *r, const char *object_dir)
 {
 	struct multi_pack_index *m = r->objects->multi_pack_index;
 	struct multi_pack_index *m_search;
+	int config_value;
 
-	if (!core_multi_pack_index)
+	if (repo_config_get_bool(r, "core.multipackindex", &config_value) ||
+	    !config_value)
 		return 0;
 
 	for (m_search = m; m_search; m_search = m_search->next)
@@ -382,7 +382,8 @@ static void add_pack_to_midx(const char *full_path, size_t full_path_len,
 		ALLOC_GROW(packs->names, packs->nr + 1, packs->alloc_names);
 
 		packs->list[packs->nr] = add_packed_git(full_path,
-							full_path_len, 0);
+							full_path_len,
+							0);
 
 		if (!packs->list[packs->nr]) {
 			warning(_("failed to add packfile '%s'"),
@@ -661,8 +662,8 @@ static size_t write_midx_oid_lookup(struct hashfile *f, unsigned char hash_len,
 			struct pack_midx_entry *next = list;
 			if (oidcmp(&obj->oid, &next->oid) >= 0)
 				BUG("OIDs not in order: %s >= %s",
-				oid_to_hex(&obj->oid),
-				oid_to_hex(&next->oid));
+				    oid_to_hex(&obj->oid),
+				    oid_to_hex(&next->oid));
 		}
 
 		hashwrite(f, obj->oid.hash, (int)hash_len);
diff --git a/midx.h b/midx.h
index 5a42cbed1d..e3b07f1586 100644
--- a/midx.h
+++ b/midx.h
@@ -3,7 +3,31 @@
 
 #include "repository.h"
 
-struct multi_pack_index;
+struct multi_pack_index {
+	struct multi_pack_index *next;
+
+	int fd;
+
+	const unsigned char *data;
+	size_t data_len;
+
+	uint32_t signature;
+	unsigned char version;
+	unsigned char hash_len;
+	unsigned char num_chunks;
+	uint32_t num_packs;
+	uint32_t num_objects;
+
+	const unsigned char *chunk_pack_names;
+	const uint32_t *chunk_oid_fanout;
+	const unsigned char *chunk_oid_lookup;
+	const unsigned char *chunk_object_offsets;
+	const unsigned char *chunk_large_offsets;
+
+	const char **pack_names;
+	struct packed_git **packs;
+	char object_dir[FLEX_ARRAY];
+};
 
 struct multi_pack_index *load_multi_pack_index(const char *object_dir);
 int bsearch_midx(const struct object_id *oid, struct multi_pack_index *m, uint32_t *result);
diff --git a/object-store.h b/object-store.h
index 03cc278758..c2b162489a 100644
--- a/object-store.h
+++ b/object-store.h
@@ -84,31 +84,7 @@ struct packed_git {
 	char pack_name[FLEX_ARRAY]; /* more */
 };
 
-struct multi_pack_index {
-	struct multi_pack_index *next;
-
-	int fd;
-
-	const unsigned char *data;
-	size_t data_len;
-
-	uint32_t signature;
-	unsigned char version;
-	unsigned char hash_len;
-	unsigned char num_chunks;
-	uint32_t num_packs;
-	uint32_t num_objects;
-
-	const unsigned char *chunk_pack_names;
-	const uint32_t *chunk_oid_fanout;
-	const unsigned char *chunk_oid_lookup;
-	const unsigned char *chunk_object_offsets;
-	const unsigned char *chunk_large_offsets;
-
-	const char **pack_names;
-	struct packed_git **packs;
-	char object_dir[FLEX_ARRAY];
-};
+struct multi_pack_index;
 
 struct raw_object_store {
 	/*
diff --git a/t/helper/test-read-midx.c b/t/helper/test-read-midx.c
index 20771d1c1d..8e19972e89 100644
--- a/t/helper/test-read-midx.c
+++ b/t/helper/test-read-midx.c
@@ -1,6 +1,3 @@
-/*
- * test-mktemp.c: code to exercise the creation of temporary files
- */
 #include "test-tool.h"
 #include "cache.h"
 #include "midx.h"
@@ -13,7 +10,7 @@ static int read_midx_file(const char *object_dir)
 	struct multi_pack_index *m = load_multi_pack_index(object_dir);
 
 	if (!m)
-		return 0;
+		return 1;
 
 	printf("header: %08x %d %d %d\n",
 	       m->signature,
@@ -24,15 +21,15 @@ static int read_midx_file(const char *object_dir)
 	printf("chunks:");
 
 	if (m->chunk_pack_names)
-		printf(" pack_names");
+		printf(" pack-names");
 	if (m->chunk_oid_fanout)
-		printf(" oid_fanout");
+		printf(" oid-fanout");
 	if (m->chunk_oid_lookup)
-		printf(" oid_lookup");
+		printf(" oid-lookup");
 	if (m->chunk_object_offsets)
-		printf(" object_offsets");
+		printf(" object-offsets");
 	if (m->chunk_large_offsets)
-		printf(" large_offsets");
+		printf(" large-offsets");
 
 	printf("\nnum_objects: %d\n", m->num_objects);
 
@@ -40,7 +37,7 @@ static int read_midx_file(const char *object_dir)
 	for (i = 0; i < m->num_packs; i++)
 		printf("%s\n", m->pack_names[i]);
 
-	printf("object_dir: %s\n", m->object_dir);
+	printf("object-dir: %s\n", m->object_dir);
 
 	return 0;
 }
@@ -48,7 +45,7 @@ static int read_midx_file(const char *object_dir)
 int cmd__read_midx(int argc, const char **argv)
 {
 	if (argc != 2)
-		usage("read-midx <object_dir>");
+		usage("read-midx <object-dir>");
 
 	return read_midx_file(argv[1]);
 }
diff --git a/t/t5319-multi-pack-index.sh b/t/t5319-multi-pack-index.sh
index 4c630ecab4..5ad6614465 100755
--- a/t/t5319-multi-pack-index.sh
+++ b/t/t5319-multi-pack-index.sh
@@ -11,17 +11,19 @@ midx_read_expect () {
 	NUM_CHUNKS=$3
 	OBJECT_DIR=$4
 	EXTRA_CHUNKS="$5"
-	cat >expect <<-EOF
-	header: 4d494458 1 $NUM_CHUNKS $NUM_PACKS
-	chunks: pack_names oid_fanout oid_lookup object_offsets$EXTRA_CHUNKS
-	num_objects: $NUM_OBJECTS
-	packs:
-	EOF
-	if [ $NUM_PACKS -ge 1 ]
-	then
-		ls $OBJECT_DIR/pack/ | grep idx | sort >> expect
-	fi
-	printf "object_dir: $OBJECT_DIR\n" >>expect &&
+	{
+		cat <<-EOF &&
+		header: 4d494458 1 $NUM_CHUNKS $NUM_PACKS
+		chunks: pack-names oid-fanout oid-lookup object-offsets$EXTRA_CHUNKS
+		num_objects: $NUM_OBJECTS
+		packs:
+		EOF
+		if test $NUM_PACKS -ge 1
+		then
+			ls $OBJECT_DIR/pack/ | grep idx | sort
+		fi &&
+		printf "object-dir: $OBJECT_DIR\n"
+	} >expect &&
 	test-tool read-midx $OBJECT_DIR >actual &&
 	test_cmp expect actual
 }
@@ -32,35 +34,55 @@ test_expect_success 'write midx with no packs' '
 	midx_read_expect 0 0 4 .
 '
 
+generate_objects () {
+	i=$1
+	iii=$(printf '%03i' $i)
+	{
+		test-tool genrandom "bar" 200 &&
+		test-tool genrandom "baz $iii" 50
+	} >wide_delta_$iii &&
+	{
+		test-tool genrandom "foo"$i 100 &&
+		test-tool genrandom "foo"$(( $i + 1 )) 100 &&
+		test-tool genrandom "foo"$(( $i + 2 )) 100
+	} >deep_delta_$iii &&
+	{
+		echo $iii &&
+		test-tool genrandom "$iii" 8192
+	} >file_$iii &&
+	git update-index --add file_$iii deep_delta_$iii wide_delta_$iii
+}
+
+commit_and_list_objects () {
+	{
+		echo 101 &&
+		test-tool genrandom 100 8192;
+	} >file_101 &&
+	git update-index --add file_101 &&
+	tree=$(git write-tree) &&
+	commit=$(git commit-tree $tree -p HEAD</dev/null) &&
+	{
+		echo $tree &&
+		git ls-tree $tree | sed -e "s/.* \\([0-9a-f]*\\)	.*/\\1/"
+	} >obj-list &&
+	git reset --hard $commit
+}
+
 test_expect_success 'create objects' '
+	test_commit initial &&
 	for i in $(test_seq 1 5)
 	do
-		iii=$(printf '%03i' $i)
-		test-tool genrandom "bar" 200 >wide_delta_$iii &&
-		test-tool genrandom "baz $iii" 50 >>wide_delta_$iii &&
-		test-tool genrandom "foo"$i 100 >deep_delta_$iii &&
-		test-tool genrandom "foo"$(expr $i + 1) 100 >>deep_delta_$iii &&
-		test-tool genrandom "foo"$(expr $i + 2) 100 >>deep_delta_$iii &&
-		echo $iii >file_$iii &&
-		test-tool genrandom "$iii" 8192 >>file_$iii &&
-		git update-index --add file_$iii deep_delta_$iii wide_delta_$iii &&
-		i=$(expr $i + 1) || return 1
+		generate_objects $i
 	done &&
-	{ echo 101 && test-tool genrandom 100 8192; } >file_101 &&
-	git update-index --add file_101 &&
-	tree=$(git write-tree) &&
-	commit=$(git commit-tree $tree </dev/null) && {
-	echo $tree &&
-	git ls-tree $tree | sed -e "s/.* \\([0-9a-f]*\\)	.*/\\1/"
-	} >obj-list &&
-	git update-ref HEAD $commit
+	commit_and_list_objects
 '
 
 test_expect_success 'write midx with one v1 pack' '
-	pack=$(git pack-objects --index-version=1 pack/test <obj-list) &&
-	test_when_finished rm pack/test-$pack.pack pack/test-$pack.idx pack/multi-pack-index &&
-	git multi-pack-index --object-dir=. write &&
-	midx_read_expect 1 17 4 .
+	pack=$(git pack-objects --index-version=1 $objdir/pack/test <obj-list) &&
+	test_when_finished rm $objdir/pack/test-$pack.pack \
+		$objdir/pack/test-$pack.idx $objdir/pack/multi-pack-index &&
+	git multi-pack-index --object-dir=$objdir write &&
+	midx_read_expect 1 18 4 $objdir
 '
 
 midx_git_two_modes() {
@@ -80,81 +102,33 @@ compare_results_with_midx() {
 test_expect_success 'write midx with one v2 pack' '
 	git pack-objects --index-version=2,0x40 $objdir/pack/test <obj-list &&
 	git multi-pack-index --object-dir=$objdir write &&
-	midx_read_expect 1 17 4 $objdir
+	midx_read_expect 1 18 4 $objdir
 '
 
-midx_git_two_modes() {
-	git -c core.multiPackIndex=false $1 >expect &&
-	git -c core.multiPackIndex=true $1 >actual &&
-	test_cmp expect actual
-}
-
-compare_results_with_midx() {
-	MSG=$1
-	test_expect_success "check normal git operations: $MSG" '
-		midx_git_two_modes "rev-list --objects --all" &&
-		midx_git_two_modes "log --raw" &&
-		midx_git_two_modes "log --oneline"
-	'
-}
-
 compare_results_with_midx "one v2 pack"
 
-test_expect_success 'Add more objects' '
+test_expect_success 'add more objects' '
 	for i in $(test_seq 6 10)
 	do
-		iii=$(printf '%03i' $i)
-		test-tool genrandom "bar" 200 >wide_delta_$iii &&
-		test-tool genrandom "baz $iii" 50 >>wide_delta_$iii &&
-		test-tool genrandom "foo"$i 100 >deep_delta_$iii &&
-		test-tool genrandom "foo"$(expr $i + 1) 100 >>deep_delta_$iii &&
-		test-tool genrandom "foo"$(expr $i + 2) 100 >>deep_delta_$iii &&
-		echo $iii >file_$iii &&
-		test-tool genrandom "$iii" 8192 >>file_$iii &&
-		git update-index --add file_$iii deep_delta_$iii wide_delta_$iii &&
-		i=$(expr $i + 1) || return 1
+		generate_objects $i
 	done &&
-	{ echo 101 && test-tool genrandom 100 8192; } >file_101 &&
-	git update-index --add file_101 &&
-	tree=$(git write-tree) &&
-	commit=$(git commit-tree $tree -p HEAD</dev/null) && {
-	echo $tree &&
-	git ls-tree $tree | sed -e "s/.* \\([0-9a-f]*\\)	.*/\\1/"
-	} >obj-list2 &&
-	git update-ref HEAD $commit
+	commit_and_list_objects
 '
 
 test_expect_success 'write midx with two packs' '
-	git pack-objects --index-version=1 $objdir/pack/test-2 <obj-list2 &&
+	git pack-objects --index-version=1 $objdir/pack/test-2 <obj-list &&
 	git multi-pack-index --object-dir=$objdir write &&
-	midx_read_expect 2 33 4 $objdir
+	midx_read_expect 2 34 4 $objdir
 '
 
 compare_results_with_midx "two packs"
 
-test_expect_success 'Add more packs' '
-	for j in $(test_seq 1 10)
+test_expect_success 'add more packs' '
+	for j in $(test_seq 11 20)
 	do
-		iii=$(printf '%03i' $i)
-		test-tool genrandom "bar" 200 >wide_delta_$iii &&
-		test-tool genrandom "baz $iii" 50 >>wide_delta_$iii &&
-		test-tool genrandom "foo"$i 100 >deep_delta_$iii &&
-		test-tool genrandom "foo"$(expr $i + 1) 100 >>deep_delta_$iii &&
-		test-tool genrandom "foo"$(expr $i + 2) 100 >>deep_delta_$iii &&
-		echo $iii >file_$iii &&
-		test-tool genrandom "$iii" 8192 >>file_$iii &&
-		git update-index --add file_$iii deep_delta_$iii wide_delta_$iii &&
-		{ echo 101 && test-tool genrandom 100 8192; } >file_101 &&
-		git update-index --add file_101 &&
-		tree=$(git write-tree) &&
-		commit=$(git commit-tree $tree -p HEAD</dev/null) && {
-		echo $tree &&
-		git ls-tree $tree | sed -e "s/.* \\([0-9a-f]*\\)	.*/\\1/"
-		} >obj-list &&
-		git update-ref HEAD $commit &&
-		git pack-objects --index-version=2 $objdir/pack/test-pack <obj-list &&
-		i=$(expr $i + 1) || return 1 &&
-		j=$(expr $j + 1) || return 1
+		generate_objects $j &&
+		commit_and_list_objects &&
+		git pack-objects --index-version=2 $objdir/pack/test-pack <obj-list
 	done
 '
 
@@ -162,13 +136,22 @@ compare_results_with_midx "mixed mode (two packs + extra)"
 
 test_expect_success 'write midx with twelve packs' '
 	git multi-pack-index --object-dir=$objdir write &&
-	midx_read_expect 12 73 4 $objdir
+	midx_read_expect 12 74 4 $objdir
 '
 
 compare_results_with_midx "twelve packs"
 
+test_expect_success 'repack removes multi-pack-index' '
+	test_path_is_file $objdir/pack/multi-pack-index &&
+	git repack -adf &&
+	test_path_is_missing $objdir/pack/multi-pack-index
+'
+
+compare_results_with_midx "after repack"
+
+
 # usage: corrupt_data <file> <pos> [<data>]
-corrupt_data() {
+corrupt_data () {
 	file=$1
 	pos=$2
 	data="${3:-\0}"
@@ -180,12 +163,17 @@ corrupt_data() {
 test_expect_success 'force some 64-bit offsets with pack-objects' '
 	mkdir objects64 &&
 	mkdir objects64/pack &&
+	for i in $(test_seq 1 11)
+	do
+		generate_objects 11
+	done &&
+	commit_and_list_objects &&
 	pack64=$(git pack-objects --index-version=2,0x40 objects64/pack/test-64 <obj-list) &&
 	idx64=objects64/pack/test-64-$pack64.idx &&
 	chmod u+w $idx64 &&
-	corrupt_data $idx64 2899 "\02" &&
-	midx64=$(git multi-pack-index write --object-dir=objects64) &&
-	midx_read_expect 1 62 5 objects64 " large_offsets"
+	corrupt_data $idx64 2999 "\02" &&
+	midx64=$(git multi-pack-index --object-dir=objects64 write) &&
+	midx_read_expect 1 63 5 objects64 " large-offsets"
 '
 
 test_done
Previous: Eric SunshineNext: Derrick Stolee
Message 162 of 192 in “Multi-pack-index (MIDX)”
  1. 00/23 Multi-pack-index (MIDX)Derrick Stolee, Jun 7, 2018
  2. 01/23 midx: add design documentDerrick Stolee, Jun 7, 2018
  3. Stefan BellerJun 11, 2018
  4. Derrick StoleeJun 18, 2018
  5. 03/23 midx: add midx builtinDerrick Stolee, Jun 7, 2018
  6. Duy NguyenJun 7, 2018
  7. Derrick StoleeJun 18, 2018
  8. Stefan BellerJun 11, 2018
  9. Derrick StoleeJun 18, 2018
  10. Stefan BellerJun 18, 2018
  11. Derrick StoleeJun 18, 2018
  12. 04/23 midx: add 'write' subcommand and basic wiringDerrick Stolee, Jun 7, 2018
  13. Duy NguyenJun 7, 2018
  14. 09/23 midx: write pack names in chunkDerrick Stolee, Jun 7, 2018
  15. Duy NguyenJun 7, 2018
  16. Derrick StoleeJun 21, 2018
  17. Junio C HamanoJun 21, 2018
  18. Derrick StoleeJun 22, 2018
  19. Junio C HamanoJun 22, 2018
  20. Derrick StoleeJun 22, 2018
  21. 12/23 midx: write object ids in a chunkDerrick Stolee, Jun 7, 2018
  22. Duy NguyenJun 9, 2018
  23. 10/23 midx: write a lookup into the pack names chunkDerrick Stolee, Jun 7, 2018
  24. Duy NguyenJun 9, 2018
  25. Derrick StoleeJun 21, 2018
  26. 16/23 midx: prepare midxed_git structDerrick Stolee, Jun 7, 2018
  27. Duy NguyenJun 9, 2018
  28. 11/23 midx: sort and deduplicate objects from packfilesDerrick Stolee, Jun 7, 2018
  29. Duy NguyenJun 9, 2018
  30. Derrick StoleeJun 21, 2018
  31. 21/23 midx: prevent duplicate packfile loadsDerrick Stolee, Jun 7, 2018
  32. Duy NguyenJun 9, 2018
  33. 23/23 midx: clear midx on repackDerrick Stolee, Jun 7, 2018
  34. Duy NguyenJun 9, 2018
  35. Derrick StoleeJun 22, 2018
  36. 22/23 midx: use midx to find ref-deltasDerrick Stolee, Jun 7, 2018
  37. 13/23 midx: write object id fanout chunkDerrick Stolee, Jun 7, 2018
  38. Duy NguyenJun 9, 2018
  39. Derrick StoleeJun 21, 2018
  40. 14/23 midx: write object offsetsDerrick Stolee, Jun 7, 2018
  41. Duy NguyenJun 9, 2018
  42. 20/23 midx: use midx in approximate_object_countDerrick Stolee, Jun 7, 2018
  43. Duy NguyenJun 9, 2018
  44. Derrick StoleeJun 22, 2018
  45. 19/23 midx: use existing midx when writing new oneDerrick Stolee, Jun 7, 2018
  46. 15/23 midx: create core.midx config settingDerrick Stolee, Jun 7, 2018
  47. 18/23 midx: use midx in abbreviation calculationsDerrick Stolee, Jun 7, 2018
  48. Duy NguyenJun 9, 2018
  49. Derrick StoleeJun 22, 2018
  50. 17/23 midx: read objects from multi-pack-indexDerrick Stolee, Jun 7, 2018
  51. Duy NguyenJun 9, 2018
  52. Derrick StoleeJun 21, 2018
  53. 05/23 midx: write header information to lockfileDerrick Stolee, Jun 7, 2018
  54. Duy NguyenJun 7, 2018
  55. Duy NguyenJun 12, 2018
  56. Derrick StoleeJun 19, 2018
  57. Duy NguyenJun 19, 2018
  58. Derrick StoleeJun 19, 2018
  59. 08/23 midx: read packfiles from pack directoryDerrick Stolee, Jun 7, 2018
  60. Duy NguyenJun 7, 2018
  61. packfile: generalize pack directory listDerrick Stolee, Jun 20, 2018
  62. 07/23 midx: expand test dataDerrick Stolee, Jun 7, 2018
  63. 06/23 midx: struct midxed_git and 'read' subcommandDerrick Stolee, Jun 7, 2018
  64. Duy NguyenJun 7, 2018
  65. Derrick StoleeJun 20, 2018
  66. Duy NguyenJun 7, 2018
  67. Derrick StoleeJun 20, 2018
  68. Duy NguyenJun 20, 2018
  69. Derrick StoleeJun 20, 2018
  70. 02/23 midx: add midx format details to pack-format.txtDerrick Stolee, Jun 7, 2018
  71. Stefan BellerJun 11, 2018
  72. Derrick StoleeJun 18, 2018
  73. Stefan BellerJun 18, 2018
  74. Derrick StoleeJun 7, 2018
  75. Ævar Arnfjörð BjarmasonJun 7, 2018
  76. Derrick StoleeJun 7, 2018
  77. 00/24 Multi-pack-index (MIDX)Derrick Stolee, Jun 25, 2018
  78. 01/24 multi-pack-index: add design documentDerrick Stolee, Jun 25, 2018
  79. 02/24 multi-pack-index: add format detailsDerrick Stolee, Jun 25, 2018
  80. 04/24 multi-pack-index: add 'write' verbDerrick Stolee, Jun 25, 2018
  81. 03/24 multi-pack-index: add builtinDerrick Stolee, Jun 25, 2018
  82. Junio C HamanoJun 25, 2018
  83. 05/24 midx: write header information to lockfileDerrick Stolee, Jun 25, 2018
  84. Junio C HamanoJun 25, 2018
  85. Derrick StoleeJul 5, 2018
  86. 08/24 packfile: generalize pack directory listDerrick Stolee, Jun 25, 2018
  87. Junio C HamanoJun 25, 2018
  88. 09/24 multi-pack-index: read packfile listDerrick Stolee, Jun 25, 2018
  89. 06/24 multi-pack-index: load into memoryDerrick Stolee, Jun 25, 2018
  90. Junio C HamanoJun 25, 2018
  91. Derrick StoleeJul 5, 2018
  92. Eric SunshineJul 5, 2018
  93. Junio C HamanoJul 6, 2018
  94. 11/24 midx: read pack names into arrayDerrick Stolee, Jun 25, 2018
  95. Eric SunshineJun 25, 2018
  96. 12/24 midx: sort and deduplicate objects from packfilesDerrick Stolee, Jun 25, 2018
  97. 13/24 midx: write object ids in a chunkDerrick Stolee, Jun 25, 2018
  98. 14/24 midx: write object id fanout chunkDerrick Stolee, Jun 25, 2018
  99. 15/24 midx: write object offsetsDerrick Stolee, Jun 25, 2018
  100. 16/24 config: create core.multiPackIndex settingDerrick Stolee, Jun 25, 2018
  101. 18/24 midx: read objects from multi-pack-indexDerrick Stolee, Jun 25, 2018
  102. 10/24 multi-pack-index: write pack names in chunkDerrick Stolee, Jun 25, 2018
  103. 19/24 midx: use midx in abbreviation calculationsDerrick Stolee, Jun 25, 2018
  104. 17/24 midx: prepare midxed_git structDerrick Stolee, Jun 25, 2018
  105. 23/24 packfile: skip loading index if in multi-pack-indexDerrick Stolee, Jun 25, 2018
  106. 24/24 midx: clear midx on repackDerrick Stolee, Jun 25, 2018
  107. 20/24 midx: use existing midx when writing new oneDerrick Stolee, Jun 25, 2018
  108. 22/24 midx: prevent duplicate packfile loadsDerrick Stolee, Jun 25, 2018
  109. 21/24 midx: use midx in approximate_object_countDerrick Stolee, Jun 25, 2018
  110. 07/24 multi-pack-index: expand test dataDerrick Stolee, Jun 25, 2018
  111. Junio C HamanoJun 25, 2018
  112. 00/24 Multi-pack-index (MIDX)Derrick Stolee, Jul 6, 2018
  113. 01/24 multi-pack-index: add design documentDerrick Stolee, Jul 6, 2018
  114. 02/24 multi-pack-index: add format detailsDerrick Stolee, Jul 6, 2018
  115. 04/24 multi-pack-index: add 'write' verbDerrick Stolee, Jul 6, 2018
  116. Eric SunshineJul 6, 2018
  117. 03/24 multi-pack-index: add builtinDerrick Stolee, Jul 6, 2018
  118. Eric SunshineJul 6, 2018
  119. 05/24 midx: write header information to lockfileDerrick Stolee, Jul 6, 2018
  120. 08/24 packfile: generalize pack directory listDerrick Stolee, Jul 6, 2018
  121. 06/24 multi-pack-index: load into memoryDerrick Stolee, Jul 6, 2018
  122. Eric SunshineJul 6, 2018
  123. Eric SunshineJul 6, 2018
  124. Junio C HamanoJul 9, 2018
  125. Derrick StoleeJul 12, 2018
  126. 09/24 multi-pack-index: read packfile listDerrick Stolee, Jul 6, 2018
  127. 10/24 multi-pack-index: write pack names in chunkDerrick Stolee, Jul 6, 2018
  128. 13/24 midx: write object ids in a chunkDerrick Stolee, Jul 6, 2018
  129. Eric SunshineJul 6, 2018
  130. 12/24 midx: sort and deduplicate objects from packfilesDerrick Stolee, Jul 6, 2018
  131. 14/24 midx: write object id fanout chunkDerrick Stolee, Jul 6, 2018
  132. 15/24 midx: write object offsetsDerrick Stolee, Jul 6, 2018
  133. Eric SunshineJul 6, 2018
  134. Derrick StoleeJul 12, 2018
  135. 18/24 midx: read objects from multi-pack-indexDerrick Stolee, Jul 6, 2018
  136. 19/24 midx: use midx in abbreviation calculationsDerrick Stolee, Jul 6, 2018
  137. 20/24 midx: use existing midx when writing new oneDerrick Stolee, Jul 6, 2018
  138. 24/24 midx: clear midx on repackDerrick Stolee, Jul 6, 2018
  139. Eric SunshineJul 6, 2018
  140. 21/24 midx: use midx in approximate_object_countDerrick Stolee, Jul 6, 2018
  141. 22/24 midx: prevent duplicate packfile loadsDerrick Stolee, Jul 6, 2018
  142. 23/24 packfile: skip loading index if in multi-pack-indexDerrick Stolee, Jul 6, 2018
  143. 16/24 config: create core.multiPackIndex settingDerrick Stolee, Jul 6, 2018
  144. Eric SunshineJul 6, 2018
  145. Derrick StoleeJul 12, 2018
  146. Derrick StoleeJul 12, 2018
  147. SZEDER GáborJul 11, 2018
  148. Derrick StoleeJul 12, 2018
  149. SZEDER GáborJul 12, 2018
  150. Derrick StoleeJul 12, 2018
  151. Junio C HamanoJul 12, 2018
  152. 17/24 midx: prepare midxed_git structDerrick Stolee, Jul 6, 2018
  153. Eric SunshineJul 6, 2018
  154. 07/24 multi-pack-index: expand test dataDerrick Stolee, Jul 6, 2018
  155. Eric SunshineJul 6, 2018
  156. Eric SunshineJul 6, 2018
  157. Derrick StoleeJul 12, 2018
  158. Eric SunshineJul 12, 2018
  159. Derrick StoleeJul 12, 2018
  160. 11/24 midx: read pack names into arrayDerrick Stolee, Jul 6, 2018
  161. Eric SunshineJul 6, 2018
  162. 00/23 Multi-pack-index (MIDX)Derrick Stolee, Jul 12, 2018
  163. 02/23 multi-pack-index: add format detailsDerrick Stolee, Jul 12, 2018
  164. 01/23 multi-pack-index: add design documentDerrick Stolee, Jul 12, 2018
  165. 03/23 multi-pack-index: add builtinDerrick Stolee, Jul 12, 2018
  166. Junio C HamanoJul 20, 2018
  167. brian m. carlsonJul 20, 2018
  168. Junio C HamanoJul 20, 2018
  169. 04/23 multi-pack-index: add 'write' verbDerrick Stolee, Jul 12, 2018
  170. Eric SunshineJul 12, 2018
  171. 06/23 multi-pack-index: load into memoryDerrick Stolee, Jul 12, 2018
  172. 05/23 midx: write header information to lockfileDerrick Stolee, Jul 12, 2018
  173. 07/23 t5319: expand test dataDerrick Stolee, Jul 12, 2018
  174. 08/23 packfile: generalize pack directory listDerrick Stolee, Jul 12, 2018
  175. 09/23 multi-pack-index: read packfile listDerrick Stolee, Jul 12, 2018
  176. 11/23 midx: read pack names into arrayDerrick Stolee, Jul 12, 2018
  177. 10/23 multi-pack-index: write pack names in chunkDerrick Stolee, Jul 12, 2018
  178. 12/23 midx: sort and deduplicate objects from packfilesDerrick Stolee, Jul 12, 2018
  179. 13/23 midx: write object ids in a chunkDerrick Stolee, Jul 12, 2018
  180. 14/23 midx: write object id fanout chunkDerrick Stolee, Jul 12, 2018
  181. 15/23 midx: write object offsetsDerrick Stolee, Jul 12, 2018
  182. 16/23 config: create core.multiPackIndex settingDerrick Stolee, Jul 12, 2018
  183. Junio C HamanoJul 12, 2018
  184. Derrick StoleeJul 13, 2018
  185. 17/23 midx: read objects from multi-pack-indexDerrick Stolee, Jul 12, 2018
  186. 18/23 midx: use midx in abbreviation calculationsDerrick Stolee, Jul 12, 2018
  187. 19/23 midx: use existing midx when writing new oneDerrick Stolee, Jul 12, 2018
  188. 20/23 midx: use midx in approximate_object_countDerrick Stolee, Jul 12, 2018
  189. 21/23 midx: prevent duplicate packfile loadsDerrick Stolee, Jul 12, 2018
  190. 23/23 midx: clear midx on repackDerrick Stolee, Jul 12, 2018
  191. 22/23 packfile: skip loading index if in multi-pack-indexDerrick Stolee, Jul 12, 2018
  192. Junio C HamanoJul 12, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.