summaryrefslogtreecommitdiff
path: root/t/t9502-gitweb-standalone-parse-output.sh
blob: 9cf7ab30a8d8f824088a02ddd646fb7a6a881378 (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#!/bin/sh
#
# Copyright (c) 2009 Mark Rada
#

test_description='gitweb as standalone script (parsing script output).

This test runs gitweb (git web interface) as a CGI script from the
commandline, and checks that it produces the correct output, either
in the HTTP header or the actual script output.'


GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME

. ./gitweb-lib.sh

# ----------------------------------------------------------------------
# snapshot file name and prefix

cat >>gitweb_config.perl <<\EOF

$known_snapshot_formats{'tar'} = {
	'display' => 'tar',
	'type' => 'application/x-tar',
	'suffix' => '.tar',
	'format' => 'tar',
};

$feature{'snapshot'}{'default'} = ['tar'];
EOF

# Call check_snapshot with the arguments "<basename> [<prefix>]"
#
# This will check that gitweb HTTP header contains proposed filename
# as <basename> with '.tar' suffix added, and that generated tarfile
# (gitweb message body) has <prefix> as prefix for al files in tarfile
#
# <prefix> default to <basename>
check_snapshot () {
	basename=$1
	prefix=${2:-"$1"}
	echo "basename=$basename"
	grep "filename=.*$basename.tar" gitweb.headers >/dev/null 2>&1 &&
	"$TAR" tf gitweb.body >file_list &&
	! grep -v -e "^$prefix$" -e "^$prefix/" -e "^pax_global_header$" file_list
}

test_expect_success setup '
	test_commit first foo &&
	git branch xx/test &&
	FULL_ID=$(git rev-parse --verify HEAD) &&
	SHORT_ID=$(git rev-parse --verify --short=7 HEAD)
'
test_debug '
	echo "FULL_ID  = $FULL_ID"
	echo "SHORT_ID = $SHORT_ID"
'

test_expect_success 'snapshot: full sha1' '
	gitweb_run "p=.git;a=snapshot;h=$FULL_ID;sf=tar" &&
	check_snapshot ".git-$SHORT_ID"
'
test_debug 'cat gitweb.headers && cat file_list'

test_expect_success 'snapshot: shortened sha1' '
	gitweb_run "p=.git;a=snapshot;h=$SHORT_ID;sf=tar" &&
	check_snapshot ".git-$SHORT_ID"
'
test_debug 'cat gitweb.headers && cat file_list'

test_expect_success 'snapshot: almost full sha1' '
	ID=$(git rev-parse --short=30 HEAD) &&
	gitweb_run "p=.git;a=snapshot;h=$ID;sf=tar" &&
	check_snapshot ".git-$SHORT_ID"
'
test_debug 'cat gitweb.headers && cat file_list'

test_expect_success 'snapshot: HEAD' '
	gitweb_run "p=.git;a=snapshot;h=HEAD;sf=tar" &&
	check_snapshot ".git-HEAD-$SHORT_ID"
'
test_debug 'cat gitweb.headers && cat file_list'

test_expect_success 'snapshot: short branch name (main)' '
	gitweb_run "p=.git;a=snapshot;h=main;sf=tar" &&
	ID=$(git rev-parse --verify --short=7 main) &&
	check_snapshot ".git-main-$ID"
'
test_debug 'cat gitweb.headers && cat file_list'

test_expect_success 'snapshot: short tag name (first)' '
	gitweb_run "p=.git;a=snapshot;h=first;sf=tar" &&
	ID=$(git rev-parse --verify --short=7 first) &&
	check_snapshot ".git-first-$ID"
'
test_debug 'cat gitweb.headers && cat file_list'

test_expect_success 'snapshot: full branch name (refs/heads/main)' '
	gitweb_run "p=.git;a=snapshot;h=refs/heads/main;sf=tar" &&
	ID=$(git rev-parse --verify --short=7 main) &&
	check_snapshot ".git-main-$ID"
'
test_debug 'cat gitweb.headers && cat file_list'

test_expect_success 'snapshot: full tag name (refs/tags/first)' '
	gitweb_run "p=.git;a=snapshot;h=refs/tags/first;sf=tar" &&
	check_snapshot ".git-first"
'
test_debug 'cat gitweb.headers && cat file_list'

test_expect_success 'snapshot: hierarchical branch name (xx/test)' '
	gitweb_run "p=.git;a=snapshot;h=xx/test;sf=tar" &&
	! grep "filename=.*/" gitweb.headers
'
test_debug 'cat gitweb.headers'

# ----------------------------------------------------------------------
# forks of projects

test_expect_success 'forks: setup' '
	git init --bare foo.git &&
	echo file > file &&
	git --git-dir=foo.git --work-tree=. add file &&
	git --git-dir=foo.git --work-tree=. commit -m "Initial commit" &&
	echo "foo" > foo.git/description &&
	git clone --bare foo.git foo.bar.git &&
	echo "foo.bar" > foo.bar.git/description &&
	git clone --bare foo.git foo_baz.git &&
	echo "foo_baz" > foo_baz.git/description &&
	rm -fr   foo &&
	mkdir -p foo &&
	(
		cd foo &&
		git clone --shared --bare ../foo.git foo-forked.git &&
		echo "fork of foo" > foo-forked.git/description
	)
'

test_expect_success 'forks: not skipped unless "forks" feature enabled' '
	gitweb_run "a=project_list" &&
	grep -q ">\\.git<"               gitweb.body &&
	grep -q ">foo\\.git<"            gitweb.body &&
	grep -q ">foo_baz\\.git<"        gitweb.body &&
	grep -q ">foo\\.bar\\.git<"      gitweb.body &&
	grep -q ">foo_baz\\.git<"        gitweb.body &&
	grep -q ">foo/foo-forked\\.git<" gitweb.body &&
	grep -q ">fork of .*<"           gitweb.body
'

test_expect_success 'enable forks feature' '
	cat >>gitweb_config.perl <<-\EOF
	$feature{"forks"}{"default"} = [1];
	EOF
'

test_expect_success 'forks: forks skipped if "forks" feature enabled' '
	gitweb_run "a=project_list" &&
	grep -q ">\\.git<"               gitweb.body &&
	grep -q ">foo\\.git<"            gitweb.body &&
	grep -q ">foo_baz\\.git<"        gitweb.body &&
	grep -q ">foo\\.bar\\.git<"      gitweb.body &&
	grep -q ">foo_baz\\.git<"        gitweb.body &&
	grep -v ">foo/foo-forked\\.git<" gitweb.body &&
	grep -v ">fork of .*<"           gitweb.body
'

test_expect_success 'forks: "forks" action for forked repository' '
	gitweb_run "p=foo.git;a=forks" &&
	grep -q ">foo/foo-forked\\.git<" gitweb.body &&
	grep -q ">fork of foo<"          gitweb.body
'

test_expect_success 'forks: can access forked repository' '
	gitweb_run "p=foo/foo-forked.git;a=summary" &&
	grep -q "200 OK"        gitweb.headers &&
	grep -q ">fork of foo<" gitweb.body
'

test_expect_success 'forks: project_index lists all projects (incl. forks)' '
	cat >expected <<-\EOF &&
	.git
	foo.bar.git
	foo.git
	foo/foo-forked.git
	foo_baz.git
	EOF
	gitweb_run "a=project_index" &&
	sed -e "s/ .*//" <gitweb.body | sort >actual &&
	test_cmp expected actual
'

xss() {
	echo >&2 "Checking $*..." &&
	gitweb_run "$@" &&
	if grep "$TAG" gitweb.body; then
		echo >&2 "xss: $TAG should have been quoted in output"
		return 1
	fi
	return 0
}

test_expect_success 'xss checks' '
	TAG="<magic-xss-tag>" &&
	xss "a=rss&p=$TAG" &&
	xss "a=rss&p=foo.git&f=$TAG" &&
	xss "" "$TAG+"
'

test_done