pack-objects: consider packs in multi-pack-index
When running 'git pack-objects --local', we want to avoid packing objects that are in an alternate. Currently, we check for these objects using the packed_git_mru list, which excludes the pack-files covered by a multi-pack-index. Add a new iteration over the multi-pack-indexes to find these copies and mark them as unwanted. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									e9ab2ed7de
								
							
						
					
					
						commit
						6a22d52126
					
				|  | @ -31,6 +31,7 @@ | ||||||
| #include "packfile.h" | #include "packfile.h" | ||||||
| #include "object-store.h" | #include "object-store.h" | ||||||
| #include "dir.h" | #include "dir.h" | ||||||
|  | #include "midx.h" | ||||||
|  |  | ||||||
| #define IN_PACK(obj) oe_in_pack(&to_pack, obj) | #define IN_PACK(obj) oe_in_pack(&to_pack, obj) | ||||||
| #define SIZE(obj) oe_size(&to_pack, obj) | #define SIZE(obj) oe_size(&to_pack, obj) | ||||||
|  | @ -1040,6 +1041,7 @@ static int want_object_in_pack(const struct object_id *oid, | ||||||
| { | { | ||||||
| 	int want; | 	int want; | ||||||
| 	struct list_head *pos; | 	struct list_head *pos; | ||||||
|  | 	struct multi_pack_index *m; | ||||||
|  |  | ||||||
| 	if (!exclude && local && has_loose_object_nonlocal(oid)) | 	if (!exclude && local && has_loose_object_nonlocal(oid)) | ||||||
| 		return 0; | 		return 0; | ||||||
|  | @ -1054,6 +1056,32 @@ static int want_object_in_pack(const struct object_id *oid, | ||||||
| 		if (want != -1) | 		if (want != -1) | ||||||
| 			return want; | 			return want; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	for (m = get_multi_pack_index(the_repository); m; m = m->next) { | ||||||
|  | 		struct pack_entry e; | ||||||
|  | 		if (fill_midx_entry(oid, &e, m)) { | ||||||
|  | 			struct packed_git *p = e.p; | ||||||
|  | 			off_t offset; | ||||||
|  |  | ||||||
|  | 			if (p == *found_pack) | ||||||
|  | 				offset = *found_offset; | ||||||
|  | 			else | ||||||
|  | 				offset = find_pack_entry_one(oid->hash, p); | ||||||
|  |  | ||||||
|  | 			if (offset) { | ||||||
|  | 				if (!*found_pack) { | ||||||
|  | 					if (!is_pack_valid(p)) | ||||||
|  | 						continue; | ||||||
|  | 					*found_offset = offset; | ||||||
|  | 					*found_pack = p; | ||||||
|  | 				} | ||||||
|  | 				want = want_found_object(exclude, p); | ||||||
|  | 				if (want != -1) | ||||||
|  | 					return want; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	list_for_each(pos, get_packed_git_mru(the_repository)) { | 	list_for_each(pos, get_packed_git_mru(the_repository)) { | ||||||
| 		struct packed_git *p = list_entry(pos, struct packed_git, mru); | 		struct packed_git *p = list_entry(pos, struct packed_git, mru); | ||||||
| 		off_t offset; | 		off_t offset; | ||||||
|  |  | ||||||
|  | @ -176,7 +176,13 @@ test_expect_success 'multi-pack-index and alternates' ' | ||||||
| compare_results_with_midx "with alternate (local midx)" | compare_results_with_midx "with alternate (local midx)" | ||||||
|  |  | ||||||
| test_expect_success 'multi-pack-index in an alternate' ' | test_expect_success 'multi-pack-index in an alternate' ' | ||||||
| 	mv .git/objects/pack/* alt.git/objects/pack | 	mv .git/objects/pack/* alt.git/objects/pack && | ||||||
|  | 	test_commit add_local_objects && | ||||||
|  | 	git repack --local && | ||||||
|  | 	git multi-pack-index write && | ||||||
|  | 	midx_read_expect 1 3 4 $objdir && | ||||||
|  | 	git reset --hard HEAD~1 && | ||||||
|  | 	rm -f .git/objects/pack/* | ||||||
| ' | ' | ||||||
|  |  | ||||||
| compare_results_with_midx "with alternate (remote midx)" | compare_results_with_midx "with alternate (remote midx)" | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Derrick Stolee
						Derrick Stolee