1#!/bin/sh 2 3test_description='handling of duplicate objects in incoming packfiles' 4. ./test-lib.sh 5. "$TEST_DIRECTORY"/lib-pack.sh 6 7# The sha1s we have in our pack. It's important that these have the same 8# starting byte, so that they end up in the same fanout section of the index. 9# That lets us make sure we are exercising the binary search with both sets. 10LO_SHA1=e68fe8129b546b101aee9510c5328e7f21ca1d18 11HI_SHA1=e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 12 13# And here's a "missing sha1" which will produce failed lookups. It must also 14# be in the same fanout section, and should be between the two (so that during 15# our binary search, we are sure to end up looking at one or the other of the 16# duplicate runs). 17MISSING_SHA1='e69d000000000000000000000000000000000000' 18 19# git will never intentionally create packfiles with 20# duplicate objects, so we have to construct them by hand. 21# 22# $1 is the name of the packfile to create 23# 24# $2 is the number of times to duplicate each object 25create_pack () { 26 pack_header "$((2 * $2))">"$1"&& 27for i in$(test_seq 1 "$2");do 28 pack_obj $LO_SHA1&& 29 pack_obj $HI_SHA1 30done>>"$1"&& 31 pack_trailer "$1" 32} 33 34# double-check that create_pack actually works 35test_expect_success 'pack with no duplicates'' 36 create_pack no-dups.pack 1 && 37 git index-pack --stdin <no-dups.pack 38' 39 40test_expect_success 'index-pack will allow duplicate objects by default'' 41 clear_packs && 42 create_pack dups.pack 100 && 43 git index-pack --stdin <dups.pack 44' 45 46test_expect_success 'create batch-check test vectors'' 47 cat >input <<-EOF && 48$LO_SHA1 49$HI_SHA1 50$MISSING_SHA1 51 EOF 52 cat >expect <<-EOF 53$LO_SHA1blob 2 54$HI_SHA1blob 0 55$MISSING_SHA1missing 56 EOF 57' 58 59test_expect_success 'lookup in duplicated pack'' 60 git cat-file --batch-check <input >actual && 61 test_cmp expect actual 62' 63 64test_expect_success 'index-pack can reject packs with duplicates'' 65 clear_packs && 66 create_pack dups.pack 2 && 67 test_must_fail git index-pack --strict --stdin <dups.pack && 68 test_expect_code 1 git cat-file -e$LO_SHA1 69' 70 71test_done