summaryrefslogtreecommitdiff
path: root/t/t5500-fetch-pack.sh
blob: e15e14fc32fd748f1dd62c1a9507aa4f08288d0a (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
130
131
132
133
134
135
136
#!/bin/sh
#
# Copyright (c) 2005 Johannes Schindelin
#

test_description='Testing multi_ack pack fetching

'
. ./test-lib.sh

# Test fetch-pack/upload-pack pair.

# Some convenience functions

function show_count () {
	commit_count=$(($commit_count+1))
	printf "      %d\r" $commit_count
}

function add () {
	local name=$1
	local text="$@"
	local branch=${name:0:1}
	local parents=""

	shift
	while test $1; do
		parents="$parents -p $1"
		shift
	done

	echo "$text" > test.txt
	git-update-index --add test.txt
	tree=$(git-write-tree)
	# make sure timestamps are in correct order
	sec=$(($sec+1))
	commit=$(echo "$text" | GIT_AUTHOR_DATE=$sec \
		git-commit-tree $tree $parents 2>>log2.txt)
	export $name=$commit
	echo $commit > .git/refs/heads/$branch
	eval ${branch}TIP=$commit
}

function count_objects () {
	ls .git/objects/??/* 2>>log2.txt | wc -l | tr -d " "
}

function test_expect_object_count () {
	local message=$1
	local count=$2

	output="$(count_objects)"
	test_expect_success \
		"new object count $message" \
		"test $count = $output"
}

function test_repack () {
	local rep=$1

	test_expect_success "repack && prune-packed in $rep" \
		'(git-repack && git-prune-packed)2>>log.txt'
}

function pull_to_client () {
	local number=$1
	local heads=$2
	local count=$3
	local no_strict_count_check=$4

	cd client
	test_expect_success "$number pull" \
		"git-fetch-pack -v .. $heads > log.txt 2>&1"
	case "$heads" in *A*) echo $ATIP > .git/refs/heads/A;; esac
	case "$heads" in *B*) echo $BTIP > .git/refs/heads/B;; esac
	git-symbolic-ref HEAD refs/heads/${heads:0:1}
	test_expect_success "fsck" 'git-fsck-objects --full > fsck.txt 2>&1'
	test_expect_object_count "after $number pull" $count
	pack_count=$(grep Unpacking log.txt|tr -dc "0-9")
	test -z "$pack_count" && pack_count=0
	if [ -z "$no_strict_count_check" ]; then
		test_expect_success "minimal count" "test $count = $pack_count"
	else
		test $count != $pack_count && \
			echo "WARNING: $pack_count objects transmitted, only $count of which were needed"
	fi
	cd ..
}

# Here begins the actual testing

# A1 - ... - A20 - A21
#    \
#      B1  -   B2 - .. - B70

# client pulls A20, B1. Then tracks only B. Then pulls A.

(
	mkdir client &&
	cd client &&
	git-init-db 2>> log2.txt
)

add A1

prev=1; cur=2; while [ $cur -le 10 ]; do
	add A$cur $(eval echo \$A$prev)
	prev=$cur
	cur=$(($cur+1))
done

add B1 $A1

echo $ATIP > .git/refs/heads/A
echo $BTIP > .git/refs/heads/B
git-symbolic-ref HEAD refs/heads/B

pull_to_client 1st "B A" $((11*3))

(cd client; test_repack client)

add A11 $A10

prev=1; cur=2; while [ $cur -le 65 ]; do
	add B$cur $(eval echo \$B$prev)
	prev=$cur
	cur=$(($cur+1))
done

pull_to_client 2nd "B" $((64*3))

(cd client; test_repack client)

pull_to_client 3rd "A" $((1*3)) # old fails

test_done