summaryrefslogtreecommitdiff
path: root/t/perf/p5315-pack-objects-filter.sh
blob: 445ff25be232b977ff3fab6bcfdb653f85db9e4e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/bin/sh

test_description='Tests pack-objects performance with filters and --path-walk'
. ./perf-lib.sh

test_perf_large_repo

test_expect_success 'setup filter inputs' '
	# Sample a few depth-2 directories from the test repo to build
	# a cone-mode sparse-checkout definition.  The sampling picks
	# directories at evenly-spaced positions so the choice is stable
	# and scales to repos of any shape.

	git ls-tree -d HEAD >top-entries &&
	grep "^040000" top-entries |
		awk "{print \$4;}" >top-dirs &&
	top_nr=$(wc -l <top-dirs) &&

	while read tdir
	do
		git ls-tree -d --format="$tdir/%(path)" "HEAD:$tdir" || return 1
	done <top-dirs >depth2-dirs &&

	d2_nr=$(wc -l <depth2-dirs) &&

	if test "$d2_nr" -ge 2
	then
		# Pick two directories from evenly-spaced positions.
		first=$(sed -n "1p" depth2-dirs) &&
		mid=$(sed -n "$((d2_nr / 2 + 1))p" depth2-dirs) &&

		p1=$(dirname "$first") &&
		p2=$(dirname "$mid") &&

		# Build cone-mode sparse-checkout patterns.
		{
			echo "/*" &&
			echo "!/*/" &&
			echo "/$p1/" &&
			echo "!/$p1/*/" &&
			if test "$p1" != "$p2"
			then
				echo "/$p2/" &&
				echo "!/$p2/*/"
			fi &&
			echo "/$first/" &&
			if test "$first" != "$mid"
			then
				echo "/$mid/"
			fi
		} >sparse-patterns &&

		git hash-object -w sparse-patterns >sparse-oid &&
		echo "Sparse cone: $first $mid" &&
		cat sparse-patterns &&
		test_set_prereq SPARSE_OID
	elif test "$top_nr" -ge 1
	then
		# Fallback: use a single top-level directory.
		first=$(sed -n "1p" top-dirs) &&
		{
			echo "/*" &&
			echo "!/*/" &&
			echo "/$first/"
		} >sparse-patterns &&

		git hash-object -w sparse-patterns >sparse-oid &&
		echo "Sparse cone: $first" &&
		cat sparse-patterns &&
		test_set_prereq SPARSE_OID
	fi
'

test_perf 'repack (no filter)' '
	git pack-objects --stdout --no-reuse-delta --revs --all </dev/null >pk
'

test_size 'repack size (no filter)' '
	test_file_size pk
'

test_perf 'repack (no filter, --path-walk)' '
	git pack-objects --stdout --no-reuse-delta --revs --all --path-walk </dev/null >pk
'

test_size 'repack size (no filter, --path-walk)' '
	test_file_size pk
'

test_perf 'repack (blob:none)' '
	git pack-objects --stdout --no-reuse-delta --revs --all --filter=blob:none </dev/null >pk
'

test_size 'repack size (blob:none)' '
	test_file_size pk
'

test_perf 'repack (blob:none, --path-walk)' '
	git pack-objects --stdout --no-reuse-delta --revs --all --path-walk \
		--filter=blob:none </dev/null >pk
'

test_size 'repack size (blob:none, --path-walk)' '
	test_file_size pk
'

test_perf 'repack (sparse:oid)' \
	--prereq SPARSE_OID '
	git pack-objects --stdout --no-reuse-delta --revs --all \
		--filter=sparse:oid=$(cat sparse-oid) </dev/null >pk
'

test_size 'repack size (sparse:oid)' \
	--prereq SPARSE_OID '
	test_file_size pk
'

test_perf 'repack (sparse:oid, --path-walk)' \
	--prereq SPARSE_OID '
	git pack-objects --stdout --no-reuse-delta --revs --all --path-walk \
		--filter=sparse:oid=$(cat sparse-oid) </dev/null >pk
'

test_size 'repack size (sparse:oid, --path-walk)' \
	--prereq SPARSE_OID '
	test_file_size pk
'

test_done