From: Jeff Hostetler <[email protected]>
Signed-off-by: Jeff Hostetler <[email protected]>
---
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