From: Jeff Hostetler <jeffh...@microsoft.com>

Signed-off-by: Jeff Hostetler <jeffh...@microsoft.com>
---
 t/t6112-rev-list-filters-objects.sh | 237 ++++++++++++++++++++++++++++++++++++
 1 file changed, 237 insertions(+)
 create mode 100755 t/t6112-rev-list-filters-objects.sh

diff --git a/t/t6112-rev-list-filters-objects.sh 
b/t/t6112-rev-list-filters-objects.sh
new file mode 100755
index 0000000..66ff022
--- /dev/null
+++ b/t/t6112-rev-list-filters-objects.sh
@@ -0,0 +1,237 @@
+#!/bin/sh
+
+test_description='git rev-list with object filtering'
+
+. ./test-lib.sh
+
+# test the omit-all filter
+
+test_expect_success 'setup' '
+       echo "{print \$1}" >print_1.awk &&
+       echo "{print \$2}" >print_2.awk &&
+
+       for n in 1 2 3 4 5
+       do
+               echo $n > file.$n
+               git add file.$n
+               git commit -m "$n"
+       done
+'
+
+# Verify the omitted ("~OID") lines match the predicted list of OIDs.
+test_expect_success 'omit-all-blobs omitted 5 blobs' '
+       git ls-files -s file.1 file.2 file.3 file.4 file.5 \
+               | awk -f print_2.awk \
+               | sort >expected &&
+       git rev-list HEAD --quiet --objects --filter-print-omitted 
--filter-omit-all-blobs \
+               | awk -f print_1.awk \
+               | sed "s/~//" >observed &&
+       test_cmp observed expected
+'
+
+# Verify the complete OID list matches the unfiltered OIDs plus the omitted 
OIDs.
+test_expect_success 'omit-all-blobs nothing else changed' '
+       git rev-list HEAD --objects \
+               | awk -f print_1.awk \
+               | sort >expected &&
+       git rev-list HEAD --objects --filter-print-omitted 
--filter-omit-all-blobs \
+               | awk -f print_1.awk \
+               | sed "s/~//" \
+               | sort >observed &&
+       test_cmp observed expected
+'
+
+# test the size-based filtering.
+
+test_expect_success 'setup_large' '
+       for n in 1000 10000
+       do
+               printf "%"$n"s" X > large.$n
+               git add large.$n
+               git commit -m "$n"
+       done
+'
+
+test_expect_success 'omit-large-blobs omit 2 blobs' '
+       git ls-files -s large.1000 large.10000 \
+               | awk -f print_2.awk \
+               | sort >expected &&
+       git rev-list HEAD --quiet --objects --filter-print-omitted 
--filter-omit-large-blobs=500 \
+               | awk -f print_1.awk \
+               | sed "s/~//" >observed &&
+       test_cmp observed expected
+'
+
+test_expect_success 'omit-large-blobs nothing else changed' '
+       git rev-list HEAD --objects \
+               | awk -f print_1.awk \
+               | sort >expected &&
+       git rev-list HEAD --objects --filter-print-omitted 
--filter-omit-large-blobs=500 \
+               | awk -f print_1.awk \
+               | sed "s/~//" \
+               | sort >observed &&
+       test_cmp observed expected
+'
+
+# boundary test around the size parameter.
+# filter is strictly less than the value, so size 500 and 1000 should have the
+# same results, but 1001 should filter more.
+
+test_expect_success 'omit-large-blobs omit 2 blobs' '
+       git ls-files -s large.1000 large.10000 \
+               | awk -f print_2.awk \
+               | sort >expected &&
+       git rev-list HEAD --quiet --objects --filter-print-omitted 
--filter-omit-large-blobs=1000 \
+               | awk -f print_1.awk \
+               | sed "s/~//" >observed &&
+       test_cmp observed expected
+'
+
+test_expect_success 'omit-large-blobs omit 1 blob' '
+       git ls-files -s large.10000 \
+               | awk -f print_2.awk \
+               | sort >expected &&
+       git rev-list HEAD --quiet --objects --filter-print-omitted 
--filter-omit-large-blobs=1001 \
+               | awk -f print_1.awk \
+               | sed "s/~//" >observed &&
+       test_cmp observed expected
+'
+
+test_expect_success 'omit-large-blobs omit 1 blob (1k)' '
+       git ls-files -s large.10000 \
+               | awk -f print_2.awk \
+               | sort >expected &&
+       git rev-list HEAD --quiet --objects --filter-print-omitted 
--filter-omit-large-blobs=1k \
+               | awk -f print_1.awk \
+               | sed "s/~//" >observed &&
+       test_cmp observed expected
+'
+
+test_expect_success 'omit-large-blobs omit no blob (1m)' '
+       cat </dev/null >expected &&
+       git rev-list HEAD --quiet --objects --filter-print-omitted 
--filter-omit-large-blobs=1m \
+               | awk -f print_1.awk \
+               | sed "s/~//" >observed &&
+       test_cmp observed expected
+'
+
+# Test sparse-pattern filtering (using explicit local patterns).
+# We use the same disk format as sparse-checkout to specify the
+# filtering, but do not require sparse-checkout to be enabled.
+
+test_expect_success 'setup using sparse file' '
+       mkdir dir1 &&
+       for n in sparse1 sparse2
+       do
+               echo $n > $n
+               git add $n
+               echo dir1/$n > dir1/$n
+               git add dir1/$n
+       done &&
+       git commit -m "sparse" &&
+       echo dir1/ >pattern1 &&
+       echo sparse1 >pattern2
+'
+
+# pattern1 should only include the 2 dir1/* files.
+# and omit the 5 file.*, 2 large.*, and 2 top-level sparse* files.
+test_expect_success 'sparse using path pattern1' '
+       git rev-list HEAD --objects --filter-print-omitted 
--filter-use-path=pattern1 >out &&
+
+       grep "^~" out >blobs.omitted &&
+       test $(cat blobs.omitted | wc -l) = 9 &&
+
+       grep "dir1/sparse" out >blobs.included &&
+       test $(cat blobs.included | wc -l) = 2
+'
+
+# pattern2 should include the sparse1 and dir1/sparse1.
+# and omit the 5 file.*, 2 large.*, and the 2 sparse2 files.
+test_expect_success 'sparse using path pattern2' '
+       git rev-list HEAD --objects --filter-print-omitted 
--filter-use-path=pattern2 >out &&
+
+       grep "^~" out >blobs.omitted &&
+       test $(cat blobs.omitted | wc -l) = 9 &&
+
+       grep "sparse1" out >blobs.included &&
+       test $(cat blobs.included | wc -l) = 2
+'
+
+# Test sparse-pattern filtering (using a blob in the repo).
+# This could be used to later let pack-objects do filtering.
+
+# pattern1 should only include the 2 dir1/* files.
+# and omit the 5 file.*, 2 large.*, 2 top-level sparse*, and 1 pattern file.
+test_expect_success 'sparse using OID for pattern1' '
+       git add pattern1 &&
+       git commit -m "pattern1" &&
+
+       git rev-list HEAD --objects >normal.output &&
+       grep "pattern1" <normal.output | awk "{print \$1;}" >pattern1.oid &&
+
+       git rev-list HEAD --objects --filter-print-omitted 
--filter-use-blob=`cat pattern1.oid` >out &&
+
+       grep "^~" out >blobs.omitted &&
+       test $(cat blobs.omitted | wc -l) = 10 &&
+
+       grep "dir1/sparse" out >blobs.included &&
+       test $(cat blobs.included | wc -l) = 2
+'
+
+# repeat previous test but use blob-ish expression rather than OID.
+test_expect_success 'sparse using blob-ish to get OID for pattern spec' '
+       git rev-list HEAD --objects --filter-print-omitted 
--filter-use-blob=HEAD:pattern1 >out &&
+
+       grep "^~" out >blobs.omitted &&
+       test $(cat blobs.omitted | wc -l) = 10 &&
+
+       grep "dir1/sparse" out >blobs.included &&
+       test $(cat blobs.included | wc -l) = 2
+'
+
+# pattern2 should include the sparse1 and dir1/sparse1.
+# and omit the 5 file.*, 2 large.*, 2 top-level sparse*, and 2 pattern files.
+test_expect_success 'sparse using OID for pattern2' '
+       git add pattern2 &&
+       git commit -m "pattern2" &&
+
+       git rev-list HEAD --objects >normal.output &&
+       grep "pattern2" <normal.output | awk "{print \$1;}" >pattern2.oid &&
+
+       git rev-list HEAD --objects --filter-print-omitted 
--filter-use-blob=`cat pattern2.oid` >out &&
+
+       grep "^~" out >blobs.omitted &&
+       test $(cat blobs.omitted | wc -l) = 11 &&
+
+       grep "sparse1" out >blobs.included &&
+       test $(cat blobs.included | wc -l) = 2
+'
+
+# repeat previous test but use blob-ish expression rather than OID.
+test_expect_success 'sparse using blob-ish rather than OID for pattern2' '
+       git rev-list HEAD --objects --filter-print-omitted 
--filter-use-blob=HEAD:pattern2 >out &&
+
+       grep "^~" out >blobs.omitted &&
+       test $(cat blobs.omitted | wc -l) = 11 &&
+
+       grep "sparse1" out >blobs.included &&
+       test $(cat blobs.included | wc -l) = 2
+'
+
+# delete some loose objects and test rev-list printing them as missing.
+test_expect_success 'print missing objects' '
+       git ls-files -s file.1 file.2 file.3 file.4 file.5 \
+               | awk -f print_2.awk \
+               | sort >expected &&
+       for id in `cat expected | sed "s|..|&/|"`
+       do
+               rm .git/objects/$id
+       done &&
+       git rev-list --quiet HEAD --filter-print-missing --objects \
+               | awk -f print_1.awk \
+               | sed "s/?//" \
+               | sort >observed &&
+       test_cmp observed expected
+'
+
+test_done
-- 
2.9.3

Reply via email to