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

[PATCH 5/9] midx: fix bug that skips midx with alternates

From
Derrick Stolee <dstolee@microsoft.com>
Date
Aug 20, 2018, 16:52 UTC
Message-ID
<20180820165124.152146-6-dstolee@microsoft.com>
In-Reply-To
<20180820165124.152146-1-dstolee@microsoft.com>

The logic for constructing the linked list of multi-pack-indexes in the object store is incorrect. If the local object store has a multi-pack-index, but an alternate does not, then the list is dropped.

Add tests that would have revealed this bug.
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
---
 midx.c                      | 11 ++++++-----
 t/t5319-multi-pack-index.sh | 17 +++++++++++++++++
 2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/midx.c b/midx.c
index 7fa75a37a3..0710c4c175 100644
--- a/midx.c
+++ b/midx.c
@@ -331,7 +331,7 @@ int midx_contains_pack(struct multi_pack_index *m, const char *idx_name)
 
 int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local)
 {
-	struct multi_pack_index *m = r->objects->multi_pack_index;
+	struct multi_pack_index *m;
 	struct multi_pack_index *m_search;
 	int config_value;
 
@@ -339,14 +339,15 @@ int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, i
 	    !config_value)
 		return 0;
 
-	for (m_search = m; m_search; m_search = m_search->next)
+	for (m_search = r->objects->multi_pack_index; m_search; m_search = m_search->next)
 		if (!strcmp(object_dir, m_search->object_dir))
 			return 1;
 
-	r->objects->multi_pack_index = load_multi_pack_index(object_dir, local);
+	m = load_multi_pack_index(object_dir, local);
 
-	if (r->objects->multi_pack_index) {
-		r->objects->multi_pack_index->next = m;
+	if (m) {
+		m->next = r->objects->multi_pack_index;
+		r->objects->multi_pack_index = m;
 		return 1;
 	}
 
diff --git a/t/t5319-multi-pack-index.sh b/t/t5319-multi-pack-index.sh
index ae1d5d4592..4b6e2825a6 100755
--- a/t/t5319-multi-pack-index.sh
+++ b/t/t5319-multi-pack-index.sh
@@ -149,6 +149,23 @@ test_expect_success 'repack removes multi-pack-index' '
 
 compare_results_with_midx "after repack"
 
+test_expect_success 'multi-pack-index and alternates' '
+	git init --bare alt.git &&
+	echo $(pwd)/alt.git/objects >.git/objects/info/alternates &&
+	echo content1 >file1 &&
+	altblob=$(GIT_DIR=alt.git git hash-object -w file1) &&
+	git cat-file blob $altblob &&
+	git rev-list --all
+'
+
+compare_results_with_midx "with alternate (local midx)"
+
+test_expect_success 'multi-pack-index in an alternate' '
+	mv .git/objects/pack/* alt.git/objects/pack
+'
+
+compare_results_with_midx "with alternate (remote midx)"
+
 
 # usage: corrupt_data <file> <pos> [<data>]
 corrupt_data () {
-- 
2.18.0.118.gd4f65b8d14
Previous: Derrick StoleeNext: Derrick Stolee
Message 7 of 18 in “multi-pack-index cleanups”
  1. 0/9 multi-pack-index cleanupsDerrick Stolee, Aug 20, 2018
  2. 1/9 multi-pack-index: provide more helpful usage infoDerrick Stolee, Aug 20, 2018
  3. 3/9 midx: mark bad packed objectsDerrick Stolee, Aug 20, 2018
  4. Stefan BellerAug 20, 2018
  5. Derrick StoleeAug 21, 2018
  6. 4/9 midx: stop reporting garbageDerrick Stolee, Aug 20, 2018
  7. 5/9 midx: fix bug that skips midx with alternatesDerrick Stolee, Aug 20, 2018
  8. 6/9 packfile: add all_packs listDerrick Stolee, Aug 20, 2018
  9. 7/9 treewide: use get_all_packsDerrick Stolee, Aug 20, 2018
  10. Stefan BellerAug 20, 2018
  11. Derrick StoleeAug 21, 2018
  12. 2/9 multi-pack-index: store local propertyDerrick Stolee, Aug 20, 2018
  13. Stefan BellerAug 20, 2018
  14. 8/9 midx: test a few commands that use get_all_packsDerrick Stolee, Aug 20, 2018
  15. Stefan BellerAug 20, 2018
  16. 9/9 pack-objects: consider packs in multi-pack-indexDerrick Stolee, Aug 20, 2018
  17. Duy NguyenAug 21, 2018
  18. Derrick StoleeAug 21, 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.