commit 2" tmp
'
test_expect_success 'a filter that cannot run answers one error page' '
{
echo "commit-filter=exec:$PWD/no/such/filter" &&
cat robrc
} >badfilterrc &&
CGIT_CONFIG="$PWD/badfilterrc" QUERY_STRING="url=rob/commit/" cgit >tmp 2>err &&
test $(grep -c "^Status:" tmp) = 1 &&
grep "Unable to complete the request" tmp &&
grep "Unable to run filter $PWD/no/such/filter" err &&
grep "Unable to exec filter" err
'
test_expect_success 'a filter that exits without reading does not end cgit' '
{
echo "email-filter=exec:/usr/bin/true" &&
cat robrc
} >truerc &&
CGIT_CONFIG="$PWD/truerc" QUERY_STRING="url=rob/log/" cgit >tmp &&
grep "^Status:" tmp
'
test_expect_success 'a commit encoding header is read without its newline' '
(
cd repos/rob &&
echo more >file-1 &&
git add file-1 &&
git -c i18n.commitEncoding=ISO-8859-1 commit -m "$(printf "caf\351")"
) &&
robq "url=rob/commit/" >tmp &&
grep "
caf$(printf "\303\251")<" tmp
'
test_expect_success 'a submodule below the about path does not end the request' '
(
cd repos/rob &&
git update-index --add --cacheinfo 160000,$sha,sub &&
git commit -m gitlink
) &&
{
echo "mimetype.png=image/png" &&
cat robrc &&
echo "repo.readme=master:file-1"
} >aboutrc &&
CGIT_CONFIG="$PWD/aboutrc" QUERY_STRING="url=rob/about/sub" cgit >tmp 2>err &&
grep "^Status:" tmp &&
! grep "fatal" err
'
test_expect_success 'a missing image on the about page errors as html' '
CGIT_CONFIG="$PWD/aboutrc" QUERY_STRING="url=rob/about/missing.png" cgit >tmp &&
grep "^Status: 404" tmp &&
grep "^Content-Type: text/html" tmp
'
test_expect_success 'a snapshot name holding a slash is refused' '
robq "url=rob/snapshot/:/../../...tar.gz" >tmp &&
grep "^Status: 404" tmp &&
robq "url=rob/snapshot/rob-master.tar.gz" >tmp &&
grep "^Status: 200" tmp
'
test_expect_success 'a path opening with a colon is refused on the log and patch pages' '
robq "url=rob/log/:%25x" >tmp &&
grep "^Status: 400" tmp &&
robq "url=rob/patch/:%25x" >tmp &&
grep "^Status: 400" tmp &&
test $(grep -c "^Status:" tmp) = 1
'
test_expect_success 'a revision spelled like an option is refused' '
git -C repos/rob update-ref refs/heads/--stdin HEAD &&
robq "url=rob/log/&h=--stdin" >tmp &&
grep "^Status: 404" tmp &&
robq "url=rob/blame/file-1&id=--stdin" >tmp &&
grep "^Status: 400" tmp &&
robq "url=rob/atom/&h=--stdin" >tmp &&
grep "^Status: 404" tmp
'
test_expect_success 'the blob page reads a file through an annotated tag' '
git -C repos/rob -c tag.gpgsign=false tag -a -m note ann HEAD &&
robq "url=rob/blob/&h=ann&path=file-1" >tmp &&
strip_headers
body &&
printf "more\n" >want &&
test_cmp want body
'
# The plain page walks a path out of whatever commit the id names, and the
# blob page used to answer such a request with the raw commit object.
test_expect_success 'the blob page walks a path out of the commit or tag the id names' '
tip=$(git -C repos/rob rev-parse HEAD) &&
robq "url=rob/blob/file-1&id=$tip" >tmp &&
strip_headers body &&
test_cmp want body &&
tag=$(git -C repos/rob rev-parse ann) &&
robq "url=rob/blob/file-1&id=$tag" >tmp &&
strip_headers body &&
test_cmp want body &&
robq "url=rob/blob/missing&id=$tip" >tmp &&
grep "^Status: 404" tmp
'
test_expect_success 'the commit page shows a message whole when text follows its trailers' '
(
cd repos/rob &&
echo again >file-1 &&
git add file-1 &&
git commit -F - <<-\EOF
Subject
Body text.
Signed-off-by: A U Thor
Conflicts:
file-1
EOF
) &&
{
echo "enable-commit-trailers=1" &&
cat robrc
} >trailrc &&
CGIT_CONFIG="$PWD/trailrc" QUERY_STRING="url=rob/commit/" cgit >tmp &&
! grep "commit-trailers" tmp &&
grep "Conflicts:" tmp
'
test_expect_success 'a revision expression that walks the history is refused' '
robq "url=rob/log/&h=:/zzzz" >tmp &&
grep "^Status: 404" tmp &&
robq "url=rob/commit/&id=HEAD^{/zzzz}" >tmp &&
grep "^Status: 400" tmp &&
robq "url=rob/log/&qt=range&q=:/zzzz" >tmp &&
grep "^Status: 400" tmp &&
robq "url=rob/log/&qt=range&q=master~1..master" >tmp &&
grep "^Status: 400" tmp &&
robq "url=rob/log/&qt=range&q=$sha..master" >tmp &&
grep "^Status: 200" tmp
'
test_expect_success 'the log search is literal' '
robq "url=rob/log/&qt=grep&q=commit.1" >tmp &&
! grep ">commit 1" tmp &&
robq "url=rob/log/&qt=grep&q=commit%201" >tmp &&
grep ">commit 1" tmp
'
test_expect_success 'a commit with a broken tree line does not crash the blob page' '
git clone -q repos/rob broken &&
(
cd broken &&
bad=$(git cat-file commit HEAD | sed "s/^tree .*/tree not-a-hash/" |
git hash-object -t commit -w --stdin --literally) &&
echo $bad >.git/refs/heads/bad
) &&
{
echo "virtual-root=/" &&
echo "cache-size=0" &&
echo "repo.url=broken" &&
echo "repo.path=$PWD/broken/.git" &&
echo "repo.readme=:file-1"
} >brokenrc &&
CGIT_CONFIG="$PWD/brokenrc" QUERY_STRING="url=broken/blob/&h=bad&path=file-1" cgit >tmp &&
grep "^Status: 404" tmp
'
test_expect_success 'a die inside git answers one 500 page and logs the reason' '
printf "[core\n" >>broken/.git/config &&
CGIT_CONFIG="$PWD/brokenrc" QUERY_STRING="url=broken/log/" cgit >tmp 2>err &&
grep "^Status: 500" tmp &&
test $(grep -c "^Status:" tmp) = 1 &&
grep "bad config line" err &&
! grep "bad config line" tmp
'
test_expect_success 'a history with a missing parent renders up to the gap' '
git clone -q repos/rob gap &&
older=$(git -C gap rev-parse HEAD~3) &&
parent=$(git -C gap rev-parse HEAD~2) &&
rm gap/.git/objects/$(echo $parent | cut -c1-2)/$(echo $parent | cut -c3-) &&
{
echo "virtual-root=/" &&
echo "cache-size=0" &&
echo "repo.url=gap" &&
echo "repo.path=$PWD/gap/.git"
} >gaprc &&
CGIT_CONFIG="$PWD/gaprc" QUERY_STRING="url=gap/log/" cgit >tmp 2>err &&
test $(grep -c "^Status:" tmp) = 1 &&
grep "Unable to complete the request" tmp &&
grep "Failed to traverse parents" err &&
CGIT_CONFIG="$PWD/gaprc" QUERY_STRING="url=gap/patch/&id2=$older" cgit >tmp &&
test $(grep -c "^Status:" tmp) = 1 &&
grep "^Status: 500" tmp
'
test_expect_success 'a filter pipeline sees the default SIGPIPE disposition' '
cat >pipe.sh <<-\EOF &&
#!/bin/sh
n=0
while test $n -lt 20000
do
echo line
n=$((n + 1))
done | head -c 5
EOF
chmod +x pipe.sh &&
{
echo "source-filter=exec:$PWD/pipe.sh" &&
cat robrc
} >piperc &&
CGIT_CONFIG="$PWD/piperc" QUERY_STRING="url=rob/tree/file-1" cgit >tmp 2>err &&
grep "^Status: 200" tmp &&
! grep -i "broken pipe" err
'
test_expect_success 'the fallback branch skips a name spelled like an option' '
git -C repos/rob update-ref refs/heads/-first HEAD &&
git -C repos/rob symbolic-ref HEAD refs/heads/gone &&
robq "url=rob/" >tmp &&
git -C repos/rob symbolic-ref HEAD refs/heads/master &&
grep "^Status: 200" tmp
'
# Such a branch is refused as a head, so the switcher must not offer a
# choice that can only lead to an error page.
test_expect_success 'the branch switcher leaves out a name spelled like an option' '
grep "