1#!/bin/sh
2
3test_description='fetch/clone from a shallow clone over http'
4
5GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
6export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
7
8. ./test-lib.sh
9. "$TEST_DIRECTORY"/lib-httpd.sh
10start_httpd
11
12commit() {
13	echo "$1" >tracked &&
14	git add tracked &&
15	test_tick &&
16	git commit -m "$1"
17}
18
19test_expect_success 'setup shallow clone' '
20	test_tick=1500000000 &&
21	commit 1 &&
22	commit 2 &&
23	commit 3 &&
24	commit 4 &&
25	commit 5 &&
26	commit 6 &&
27	commit 7 &&
28	git clone --no-local --depth=5 .git shallow &&
29	git config --global transfer.fsckObjects true
30'
31
32test_expect_success 'clone http repository' '
33	git clone --bare --no-local shallow "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
34	git clone $HTTPD_URL/smart/repo.git clone &&
35	(
36	cd clone &&
37	git fsck &&
38	git log --format=%s origin/main >actual &&
39	cat <<EOF >expect &&
407
416
425
434
443
45EOF
46	test_cmp expect actual
47	)
48'
49
50# This test is tricky. We need large enough "have"s that fetch-pack
51# will put pkt-flush in between. Then we need a "have" the server
52# does not have, it'll send "ACK %s ready"
53test_expect_success 'no shallow lines after receiving ACK ready' '
54	(
55		cd shallow &&
56		for i in $(test_seq 15)
57		do
58			git checkout --orphan unrelated$i &&
59			test_commit unrelated$i &&
60			git push -q "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \
61				refs/heads/unrelated$i:refs/heads/unrelated$i &&
62			git push -q ../clone/.git \
63				refs/heads/unrelated$i:refs/heads/unrelated$i ||
64			exit 1
65		done &&
66		git checkout main &&
67		test_commit new &&
68		git push  "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" main
69	) &&
70	(
71		cd clone &&
72		git checkout --orphan newnew &&
73		test_tick=1400000000 &&
74		test_commit new-too &&
75		# NEEDSWORK: If the overspecification of the expected result is reduced, we
76		# might be able to run this test in all protocol versions.
77		GIT_TRACE_PACKET="$TRASH_DIRECTORY/trace" GIT_TEST_PROTOCOL_VERSION=0 \
78			git fetch --depth=2 &&
79		grep "fetch-pack< ACK .* ready" ../trace &&
80		! grep "fetch-pack> done" ../trace
81	)
82'
83
84test_expect_success 'clone shallow since ...' '
85	test_create_repo shallow-since &&
86	(
87	cd shallow-since &&
88	GIT_COMMITTER_DATE="100000000 +0700" git commit --allow-empty -m one &&
89	GIT_COMMITTER_DATE="200000000 +0700" git commit --allow-empty -m two &&
90	GIT_COMMITTER_DATE="300000000 +0700" git commit --allow-empty -m three &&
91	mv .git "$HTTPD_DOCUMENT_ROOT_PATH/shallow-since.git" &&
92	git clone --shallow-since "300000000 +0700" $HTTPD_URL/smart/shallow-since.git ../shallow11 &&
93	git -C ../shallow11 log --pretty=tformat:%s HEAD >actual &&
94	echo three >expected &&
95	test_cmp expected actual
96	)
97'
98
99test_expect_success 'fetch shallow since ...' '
100	git -C shallow11 fetch --shallow-since "200000000 +0700" origin &&
101	git -C shallow11 log --pretty=tformat:%s origin/main >actual &&
102	cat >expected <<-\EOF &&
103	three
104	two
105	EOF
106	test_cmp expected actual
107'
108
109test_expect_success 'shallow clone exclude tag two' '
110	test_create_repo shallow-exclude &&
111	(
112	cd shallow-exclude &&
113	test_commit one &&
114	test_commit two &&
115	test_commit three &&
116	mv .git "$HTTPD_DOCUMENT_ROOT_PATH/shallow-exclude.git" &&
117	git clone --shallow-exclude two $HTTPD_URL/smart/shallow-exclude.git ../shallow12 &&
118	git -C ../shallow12 log --pretty=tformat:%s HEAD >actual &&
119	echo three >expected &&
120	test_cmp expected actual
121	)
122'
123
124test_expect_success 'fetch exclude tag one' '
125	git -C shallow12 fetch --shallow-exclude one origin &&
126	git -C shallow12 log --pretty=tformat:%s origin/main >actual &&
127	test_write_lines three two >expected &&
128	test_cmp expected actual
129'
130
131test_expect_success 'fetching deepen' '
132	test_create_repo shallow-deepen &&
133	(
134	cd shallow-deepen &&
135	test_commit one &&
136	test_commit two &&
137	test_commit three &&
138	mv .git "$HTTPD_DOCUMENT_ROOT_PATH/shallow-deepen.git" &&
139	git clone --depth 1 $HTTPD_URL/smart/shallow-deepen.git deepen &&
140	mv "$HTTPD_DOCUMENT_ROOT_PATH/shallow-deepen.git" .git &&
141	test_commit four &&
142	git -C deepen log --pretty=tformat:%s main >actual &&
143	echo three >expected &&
144	test_cmp expected actual &&
145	mv .git "$HTTPD_DOCUMENT_ROOT_PATH/shallow-deepen.git" &&
146	git -C deepen fetch --deepen=1 &&
147	git -C deepen log --pretty=tformat:%s origin/main >actual &&
148	cat >expected <<-\EOF &&
149	four
150	three
151	two
152	EOF
153	test_cmp expected actual
154	)
155'
156
157test_done
158