]> git.ipfire.org Git - thirdparty/git.git/blobdiff - t/t7700-repack.sh
Merge branch 'bk/p4-misc-usability'
[thirdparty/git.git] / t / t7700-repack.sh
index 4e855bc21b45c47a2646f7524b66bbdda87698c8..25b235c06303850e17b90f5fc6c0f84bb962c4c8 100755 (executable)
@@ -4,129 +4,104 @@ test_description='git repack works correctly'
 
 . ./test-lib.sh
 
-commit_and_pack() {
-       test_commit "$@" >/dev/null &&
-       SHA1=$(git pack-objects --all --unpacked --incremental .git/objects/pack/pack </dev/null) &&
-       echo pack-${SHA1}.pack
+commit_and_pack () {
+       test_commit "$@" 1>&2 &&
+       incrpackid=$(git pack-objects --all --unpacked --incremental .git/objects/pack/pack </dev/null) &&
+       echo pack-${incrpackid}.pack
+}
+
+test_no_missing_in_packs () {
+       myidx=$(ls -1 .git/objects/pack/*.idx) &&
+       test_path_is_file "$myidx" &&
+       git verify-pack -v alt_objects/pack/*.idx >orig.raw &&
+       sed -n -e "s/^\($OID_REGEX\).*/\1/p" orig.raw | sort >orig &&
+       git verify-pack -v $myidx >dest.raw &&
+       cut -d" " -f1 dest.raw | sort >dest &&
+       comm -23 orig dest >missing &&
+       test_must_be_empty missing
+}
+
+# we expect $packid and $oid to be defined
+test_has_duplicate_object () {
+       want_duplicate_object="$1"
+       found_duplicate_object=false
+       for p in .git/objects/pack/*.idx
+       do
+               idx=$(basename $p)
+               test "pack-$packid.idx" = "$idx" && continue
+               git verify-pack -v $p >packlist || return $?
+               if grep "^$oid" packlist
+               then
+                       found_duplicate_object=true
+                       echo "DUPLICATE OBJECT FOUND"
+                       break
+               fi
+       done &&
+       test "$want_duplicate_object" = "$found_duplicate_object"
 }
 
 test_expect_success 'objects in packs marked .keep are not repacked' '
-       echo content1 > file1 &&
-       echo content2 > file2 &&
+       echo content1 >file1 &&
+       echo content2 >file2 &&
        git add . &&
        test_tick &&
        git commit -m initial_commit &&
        # Create two packs
        # The first pack will contain all of the objects except one
-       git rev-list --objects --all | grep -v file2 |
-               git pack-objects pack > /dev/null &&
+       git rev-list --objects --all >objs &&
+       grep -v file2 objs | git pack-objects pack &&
        # The second pack will contain the excluded object
-       packsha1=$(git rev-list --objects --all | grep file2 |
-               git pack-objects pack) &&
-       >pack-$packsha1.keep &&
-       objsha1=$(git verify-pack -v pack-$packsha1.idx | head -n 1 |
-               sed -e "s/^\([0-9a-f]\{40\}\).*/\1/") &&
+       packid=$(grep file2 objs | git pack-objects pack) &&
+       >pack-$packid.keep &&
+       git verify-pack -v pack-$packid.idx >packlist &&
+       oid=$(head -n 1 packlist | sed -e "s/^\($OID_REGEX\).*/\1/") &&
        mv pack-* .git/objects/pack/ &&
        git repack -A -d -l &&
        git prune-packed &&
-       for p in .git/objects/pack/*.idx; do
-               idx=$(basename $p)
-               test "pack-$packsha1.idx" = "$idx" && continue
-               if git verify-pack -v $p | egrep "^$objsha1"; then
-                       found_duplicate_object=1
-                       echo "DUPLICATE OBJECT FOUND"
-                       break
-               fi
-       done &&
-       test -z "$found_duplicate_object"
+       test_has_duplicate_object false
 '
 
 test_expect_success 'writing bitmaps via command-line can duplicate .keep objects' '
-       # build on $objsha1, $packsha1, and .keep state from previous
+       # build on $oid, $packid, and .keep state from previous
        git repack -Adbl &&
-       test_when_finished "found_duplicate_object=" &&
-       for p in .git/objects/pack/*.idx; do
-               idx=$(basename $p)
-               test "pack-$packsha1.idx" = "$idx" && continue
-               if git verify-pack -v $p | egrep "^$objsha1"; then
-                       found_duplicate_object=1
-                       echo "DUPLICATE OBJECT FOUND"
-                       break
-               fi
-       done &&
-       test "$found_duplicate_object" = 1
+       test_has_duplicate_object true
 '
 
 test_expect_success 'writing bitmaps via config can duplicate .keep objects' '
-       # build on $objsha1, $packsha1, and .keep state from previous
+       # build on $oid, $packid, and .keep state from previous
        git -c repack.writebitmaps=true repack -Adl &&
-       test_when_finished "found_duplicate_object=" &&
-       for p in .git/objects/pack/*.idx; do
-               idx=$(basename $p)
-               test "pack-$packsha1.idx" = "$idx" && continue
-               if git verify-pack -v $p | egrep "^$objsha1"; then
-                       found_duplicate_object=1
-                       echo "DUPLICATE OBJECT FOUND"
-                       break
-               fi
-       done &&
-       test "$found_duplicate_object" = 1
+       test_has_duplicate_object true
 '
 
 test_expect_success 'loose objects in alternate ODB are not repacked' '
        mkdir alt_objects &&
-       echo $(pwd)/alt_objects > .git/objects/info/alternates &&
-       echo content3 > file3 &&
-       objsha1=$(GIT_OBJECT_DIRECTORY=alt_objects git hash-object -w file3) &&
+       echo $(pwd)/alt_objects >.git/objects/info/alternates &&
+       echo content3 >file3 &&
+       oid=$(GIT_OBJECT_DIRECTORY=alt_objects git hash-object -w file3) &&
        git add file3 &&
        test_tick &&
        git commit -m commit_file3 &&
        git repack -a -d -l &&
        git prune-packed &&
-       for p in .git/objects/pack/*.idx; do
-               if git verify-pack -v $p | egrep "^$objsha1"; then
-                       found_duplicate_object=1
-                       echo "DUPLICATE OBJECT FOUND"
-                       break
-               fi
-       done &&
-       test -z "$found_duplicate_object"
+       test_has_duplicate_object false
 '
 
 test_expect_success 'packed obs in alt ODB are repacked even when local repo is packless' '
        mkdir alt_objects/pack &&
        mv .git/objects/pack/* alt_objects/pack &&
        git repack -a &&
-       myidx=$(ls -1 .git/objects/pack/*.idx) &&
-       test -f "$myidx" &&
-       for p in alt_objects/pack/*.idx; do
-               git verify-pack -v $p | sed -n -e "/^[0-9a-f]\{40\}/p"
-       done | while read sha1 rest; do
-               if ! ( git verify-pack -v $myidx | grep "^$sha1" ); then
-                       echo "Missing object in local pack: $sha1"
-                       return 1
-               fi
-       done
+       test_no_missing_in_packs
 '
 
 test_expect_success 'packed obs in alt ODB are repacked when local repo has packs' '
        rm -f .git/objects/pack/* &&
-       echo new_content >> file1 &&
+       echo new_content >>file1 &&
        git add file1 &&
        test_tick &&
        git commit -m more_content &&
        git repack &&
        git repack -a -d &&
-       myidx=$(ls -1 .git/objects/pack/*.idx) &&
-       test -f "$myidx" &&
-       for p in alt_objects/pack/*.idx; do
-               git verify-pack -v $p | sed -n -e "/^[0-9a-f]\{40\}/p"
-       done | while read sha1 rest; do
-               if ! ( git verify-pack -v $myidx | grep "^$sha1" ); then
-                       echo "Missing object in local pack: $sha1"
-                       return 1
-               fi
-       done
+       test_no_missing_in_packs
 '
 
 test_expect_success 'packed obs in alternate ODB kept pack are repacked' '
@@ -134,7 +109,7 @@ test_expect_success 'packed obs in alternate ODB kept pack are repacked' '
        for p in alt_objects/pack/*.pack
        do
                base_name=$(basename $p .pack) &&
-               if test -f alt_objects/pack/$base_name.keep
+               if test_path_is_file alt_objects/pack/$base_name.keep
                then
                        rm alt_objects/pack/$base_name.keep
                else
@@ -142,22 +117,13 @@ test_expect_success 'packed obs in alternate ODB kept pack are repacked' '
                fi
        done &&
        git repack -a -d &&
-       myidx=$(ls -1 .git/objects/pack/*.idx) &&
-       test -f "$myidx" &&
-       for p in alt_objects/pack/*.idx; do
-               git verify-pack -v $p | sed -n -e "/^[0-9a-f]\{40\}/p"
-       done | while read sha1 rest; do
-               if ! ( git verify-pack -v $myidx | grep "^$sha1" ); then
-                       echo "Missing object in local pack: $sha1"
-                       return 1
-               fi
-       done
+       test_no_missing_in_packs
 '
 
 test_expect_success 'packed unreachable obs in alternate ODB are not loosened' '
        rm -f alt_objects/pack/*.keep &&
        mv .git/objects/pack/* alt_objects/pack/ &&
-       csha1=$(git rev-parse HEAD^{commit}) &&
+       coid=$(git rev-parse HEAD^{commit}) &&
        git reset --hard HEAD^ &&
        test_tick &&
        git reflog expire --expire=$test_tick --expire-unreachable=$test_tick --all &&
@@ -167,15 +133,15 @@ test_expect_success 'packed unreachable obs in alternate ODB are not loosened' '
            --unpack-unreachable </dev/null pack &&
        rm -f .git/objects/pack/* &&
        mv pack-* .git/objects/pack/ &&
-       test 0 = $(git verify-pack -v -- .git/objects/pack/*.idx |
-               egrep "^$csha1 " | sort | uniq | wc -l) &&
-       echo > .git/objects/info/alternates &&
-       test_must_fail git show $csha1
+       git verify-pack -v -- .git/objects/pack/*.idx >packlist &&
+       ! grep "^$coid " packlist &&
+       echo >.git/objects/info/alternates &&
+       test_must_fail git show $coid
 '
 
 test_expect_success 'local packed unreachable obs that exist in alternate ODB are not loosened' '
-       echo $(pwd)/alt_objects > .git/objects/info/alternates &&
-       echo "$csha1" | git pack-objects --non-empty --all --reflog pack &&
+       echo $(pwd)/alt_objects >.git/objects/info/alternates &&
+       echo "$coid" | git pack-objects --non-empty --all --reflog pack &&
        rm -f .git/objects/pack/* &&
        mv pack-* .git/objects/pack/ &&
        # The pack-objects call on the next line is equivalent to
@@ -184,10 +150,10 @@ test_expect_success 'local packed unreachable obs that exist in alternate ODB ar
            --unpack-unreachable </dev/null pack &&
        rm -f .git/objects/pack/* &&
        mv pack-* .git/objects/pack/ &&
-       test 0 = $(git verify-pack -v -- .git/objects/pack/*.idx |
-               egrep "^$csha1 " | sort | uniq | wc -l) &&
-       echo > .git/objects/info/alternates &&
-       test_must_fail git show $csha1
+       git verify-pack -v -- .git/objects/pack/*.idx >packlist &&
+       ! grep "^$coid " &&
+       echo >.git/objects/info/alternates &&
+       test_must_fail git show $coid
 '
 
 test_expect_success 'objects made unreachable by grafts only are kept' '
@@ -196,7 +162,7 @@ test_expect_success 'objects made unreachable by grafts only are kept' '
        H0=$(git rev-parse HEAD) &&
        H1=$(git rev-parse HEAD^) &&
        H2=$(git rev-parse HEAD^^) &&
-       echo "$H0 $H2" > .git/info/grafts &&
+       echo "$H0 $H2" >.git/info/grafts &&
        git reflog expire --expire=$test_tick --expire-unreachable=$test_tick --all &&
        git repack -a -d &&
        git cat-file -t $H1
@@ -235,7 +201,7 @@ test_expect_success 'incremental repack does not complain' '
 
 test_expect_success 'bitmaps can be disabled on bare repos' '
        git -c repack.writeBitmaps=false -C bare.git repack -ad &&
-       bitmap=$(ls bare.git/objects/pack/*.bitmap 2>/dev/null || :) &&
+       bitmap=$(ls bare.git/objects/pack/*.bitmap || :) &&
        test -z "$bitmap"
 '