difftool --no-index: error out on --dir-diff (and don't crash)
[gitweb.git] / t / t5310-pack-bitmaps.sh
index 2d22a17c4a7f9dcc402e89e73ce01c97ebd4ba48..82d7f7f6a5bbdc5609e0b76c97a3ae14f6a53a92 100755 (executable)
@@ -9,7 +9,8 @@ objpath () {
 
 # show objects present in pack ($1 should be associated *.idx)
 list_packed_objects () {
-       git show-index <"$1" | cut -d' ' -f2
+       git show-index <"$1" >object-list &&
+       cut -d' ' -f2 object-list
 }
 
 # has_any pattern-file content-file
@@ -190,6 +191,7 @@ test_expect_success 'pack-objects respects --honor-pack-keep (local bitmapped pa
 
 test_expect_success 'pack-objects respects --local (non-local bitmapped pack)' '
        mv .git/objects/pack/$packbitmap.* alt.git/objects/pack/ &&
+       rm -f .git/objects/pack/multi-pack-index &&
        test_when_finished "mv alt.git/objects/pack/$packbitmap.* .git/objects/pack/" &&
        echo HEAD | git pack-objects --local --stdout --revs >3b.pack &&
        git index-pack 3b.pack &&
@@ -204,8 +206,8 @@ test_expect_success 'pack-objects to file can use bitmap' '
        # verify equivalent packs are generated with/without using bitmap index
        packasha1=$(git pack-objects --no-use-bitmap-index --all packa </dev/null) &&
        packbsha1=$(git pack-objects --use-bitmap-index --all packb </dev/null) &&
-       list_packed_objects <packa-$packasha1.idx >packa.objects &&
-       list_packed_objects <packb-$packbsha1.idx >packb.objects &&
+       list_packed_objects packa-$packasha1.idx >packa.objects &&
+       list_packed_objects packb-$packbsha1.idx >packb.objects &&
        test_cmp packa.objects packb.objects
 '
 
@@ -309,9 +311,8 @@ test_expect_success 'pack reuse respects --honor-pack-keep' '
        done &&
        reusable_pack --honor-pack-keep >empty.pack &&
        git index-pack empty.pack &&
-       >expect &&
        git show-index <empty.idx >actual &&
-       test_cmp expect actual
+       test_must_be_empty actual
 '
 
 test_expect_success 'pack reuse respects --local' '
@@ -319,17 +320,15 @@ test_expect_success 'pack reuse respects --local' '
        test_when_finished "mv alt.git/objects/pack/* .git/objects/pack/" &&
        reusable_pack --local >empty.pack &&
        git index-pack empty.pack &&
-       >expect &&
        git show-index <empty.idx >actual &&
-       test_cmp expect actual
+       test_must_be_empty actual
 '
 
 test_expect_success 'pack reuse respects --incremental' '
        reusable_pack --incremental >empty.pack &&
        git index-pack empty.pack &&
-       >expect &&
        git show-index <empty.idx >actual &&
-       test_cmp expect actual
+       test_must_be_empty actual
 '
 
 test_expect_success 'truncated bitmap fails gracefully' '
@@ -337,11 +336,104 @@ test_expect_success 'truncated bitmap fails gracefully' '
        git rev-list --use-bitmap-index --count --all >expect &&
        bitmap=$(ls .git/objects/pack/*.bitmap) &&
        test_when_finished "rm -f $bitmap" &&
-       head -c 512 <$bitmap >$bitmap.tmp &&
+       test_copy_bytes 512 <$bitmap >$bitmap.tmp &&
        mv -f $bitmap.tmp $bitmap &&
        git rev-list --use-bitmap-index --count --all >actual 2>stderr &&
        test_cmp expect actual &&
        test_i18ngrep corrupt stderr
 '
 
+# have_delta <obj> <expected_base>
+#
+# Note that because this relies on cat-file, it might find _any_ copy of an
+# object in the repository. The caller is responsible for making sure
+# there's only one (e.g., via "repack -ad", or having just fetched a copy).
+have_delta () {
+       echo $2 >expect &&
+       echo $1 | git cat-file --batch-check="%(deltabase)" >actual &&
+       test_cmp expect actual
+}
+
+# Create a state of history with these properties:
+#
+#  - refs that allow a client to fetch some new history, while sharing some old
+#    history with the server; we use branches delta-reuse-old and
+#    delta-reuse-new here
+#
+#  - the new history contains an object that is stored on the server as a delta
+#    against a base that is in the old history
+#
+#  - the base object is not immediately reachable from the tip of the old
+#    history; finding it would involve digging down through history we know the
+#    other side has
+#
+# This should result in a state where fetching from old->new would not
+# traditionally reuse the on-disk delta (because we'd have to dig to realize
+# that the client has it), but we will do so if bitmaps can tell us cheaply
+# that the other side has it.
+test_expect_success 'set up thin delta-reuse parent' '
+       # This first commit contains the buried base object.
+       test-tool genrandom delta 16384 >file &&
+       git add file &&
+       git commit -m "delta base" &&
+       base=$(git rev-parse --verify HEAD:file) &&
+
+       # These intermediate commits bury the base back in history.
+       # This becomes the "old" state.
+       for i in 1 2 3 4 5
+       do
+               echo $i >file &&
+               git commit -am "intermediate $i" || return 1
+       done &&
+       git branch delta-reuse-old &&
+
+       # And now our new history has a delta against the buried base. Note
+       # that this must be smaller than the original file, since pack-objects
+       # prefers to create deltas from smaller objects to larger.
+       test-tool genrandom delta 16300 >file &&
+       git commit -am "delta result" &&
+       delta=$(git rev-parse --verify HEAD:file) &&
+       git branch delta-reuse-new &&
+
+       # Repack with bitmaps and double check that we have the expected delta
+       # relationship.
+       git repack -adb &&
+       have_delta $delta $base
+'
+
+# Now we can sanity-check the non-bitmap behavior (that the server is not able
+# to reuse the delta). This isn't strictly something we care about, so this
+# test could be scrapped in the future. But it makes sure that the next test is
+# actually triggering the feature we want.
+#
+# Note that our tools for working with on-the-wire "thin" packs are limited. So
+# we actually perform the fetch, retain the resulting pack, and inspect the
+# result.
+test_expect_success 'fetch without bitmaps ignores delta against old base' '
+       test_config pack.usebitmaps false &&
+       test_when_finished "rm -rf client.git" &&
+       git init --bare client.git &&
+       (
+               cd client.git &&
+               git config transfer.unpackLimit 1 &&
+               git fetch .. delta-reuse-old:delta-reuse-old &&
+               git fetch .. delta-reuse-new:delta-reuse-new &&
+               have_delta $delta $ZERO_OID
+       )
+'
+
+# And do the same for the bitmap case, where we do expect to find the delta.
+test_expect_success 'fetch with bitmaps can reuse old base' '
+       test_config pack.usebitmaps true &&
+       test_when_finished "rm -rf client.git" &&
+       git init --bare client.git &&
+       (
+               cd client.git &&
+               git config transfer.unpackLimit 1 &&
+               git fetch .. delta-reuse-old:delta-reuse-old &&
+               git fetch .. delta-reuse-new:delta-reuse-new &&
+               have_delta $delta $base
+       )
+'
+
 test_done