pack-objects: fix error when packing same pack twice
When passed the same packfile twice via `--stdin-packs` we return an error that the packfile supposedly was not found. This is because when reading packs into the list of included or excluded packfiles, we will happily re-add packfiles even if they are part of the lists already. And while the list can now contain duplicates, we will only set the `util` pointer of the first list entry to the `packed_git` structure. We notice that at a later point when checking that all list entries have their `util` pointer set and die with an error. While this is kind of a nonsensical request, this scenario can be hit when doing geometric repacks. When a repository is connected to an alternate object directory and both have the exact same packfile then both would get added to the geometric sequence. And when we then decide to perform the repack, we will invoke git-pack-objects(1) with the same packfile twice. Fix this bug by removing any duplicates from both the included and excluded packs. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
b7b8f048f5
commit
732194b5f2
@@ -7,6 +7,12 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
||||
TEST_PASSES_SANITIZE_LEAK=true
|
||||
. ./test-lib.sh
|
||||
|
||||
packed_objects () {
|
||||
git show-index <"$1" >tmp-object-list &&
|
||||
cut -d' ' -f2 tmp-object-list | sort &&
|
||||
rm tmp-object-list
|
||||
}
|
||||
|
||||
test_expect_success 'setup for --stdin-packs tests' '
|
||||
git init stdin-packs &&
|
||||
(
|
||||
@@ -142,4 +148,25 @@ test_expect_success '--stdin-packs with broken links' '
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'pack-objects --stdin with duplicate packfile' '
|
||||
test_when_finished "rm -fr repo" &&
|
||||
|
||||
git init repo &&
|
||||
(
|
||||
cd repo &&
|
||||
test_commit "commit" &&
|
||||
git repack -ad &&
|
||||
|
||||
{
|
||||
basename .git/objects/pack/pack-*.pack &&
|
||||
basename .git/objects/pack/pack-*.pack
|
||||
} >packfiles &&
|
||||
|
||||
git pack-objects --stdin-packs generated-pack <packfiles &&
|
||||
packed_objects .git/objects/pack/pack-*.idx >expect &&
|
||||
packed_objects generated-pack-*.idx >actual &&
|
||||
test_cmp expect actual
|
||||
)
|
||||
'
|
||||
|
||||
test_done
|
||||
|
||||
Reference in New Issue
Block a user