#!/bin/sh
# The log page and its search. The searching checks use the repository whose
# name contains a space and a term containing a space, so every link cgit
# writes back has to escape the path and the query, which escape differently.
test_description='Check content on log page'
. ./setup.sh
test_expect_success 'generate foo/log' 'cgit_url "foo/log" >tmp'
test_expect_success 'find commit 1' 'grep "commit 1" tmp'
test_expect_success 'find commit 5' 'grep "commit 5" tmp'
test_expect_success 'generate bar/log' 'cgit_url "bar/log" >tmp'
test_expect_success 'find commit 1' 'grep ">commit 1<" tmp'
test_expect_success 'find commit 50' 'grep "commit 50" tmp'
# The switch button submits the select as h, so whatever head the request
# follows has to sit in the list selected, or submitting would quietly move
# the visitor to the first branch.
test_expect_success 'a detached head stays selected in the switcher' '
sha=$(git -C repos/foo rev-parse master~1) &&
cgit_url "foo/log&h=$sha" >tmp &&
grep "option value=.$sha. selected" tmp
'
test_expect_success 'a tag head stays selected in the switcher' '
git -C repos/foo tag t-switch master~1 &&
cgit_url "foo/log&h=t-switch" >tmp &&
grep "option value=.t-switch. selected>t-switch (detached)" tmp &&
git -C repos/foo tag -d t-switch
'
test_expect_success 'a branch head keeps its plain option' '
cgit_url "foo/log&h=master" >tmp &&
grep "option value=.master. selected>master<" tmp &&
! grep "detached" tmp
'
test_expect_success 'generate "with%20space/log?qt=grep&q=commit+1"' '
cgit_url "with+space/log&qt=grep&q=commit+1" >tmp
'
test_expect_success 'find commit 1' 'grep ">commit 1<" tmp'
test_expect_success 'find link with %20 in path' 'grep "/with%20space/log/?qt=grep" tmp'
test_expect_success 'find link with + in arg' 'grep "/log/?qt=grep&q=commit+1" tmp'
test_expect_success 'no links with space in path' '! grep "href=./with space/" tmp'
test_expect_success 'no links with space in arg' '! grep "q=commit 1" tmp'
test_expect_success 'commit 2 is not visible' '! grep "commit 2" tmp'
# A search that matches nothing says so in a row of its own, rather than
# leaving the table a header with nothing under it.
test_expect_success 'a search matching nothing says so' '
cgit_url "foo/log&qt=grep&q=no+such+commit" >tmp &&
grep "^Status: 200" tmp &&
grep "
| No commits match the search |
" tmp &&
cgit_url "foo/log&qt=grep&q=commit+1" >tmp &&
! grep "No commits match" tmp
'
# Following a file diffs each commit for the name the file had there, so the
# root commit that created it has to be diffed too, and paging has to go on
# asking about the name the visitor followed rather than the older one.
test_expect_success 'set up a renamed file to follow' '
test_create_repo repos/fol &&
(
cd repos/fol &&
echo 1 >a.txt &&
git add a.txt &&
git commit -m "create a" &&
for i in 2 3 4
do
echo $i >>a.txt &&
git commit -am "edit a $i" || return 1
done &&
git mv a.txt b.txt &&
git commit -m "rename to b" &&
for i in 6 7 8
do
echo $i >>b.txt &&
git commit -am "edit b $i" || return 1
done
) &&
cgitrc_repo folrc fol enable-follow-links=1 max-commit-count=3
'
test_expect_success 'a followed log reaches the root commit' '
cgit_rc folrc "url=fol/log/b.txt&follow=1&ofs=6" >tmp &&
grep ">edit a 2<" tmp &&
grep ">create a<" tmp
'
test_expect_success 'the pager of a followed log keeps the name followed' '
cgit_rc folrc "url=fol/log/b.txt&follow=1&ofs=3" >tmp &&
grep ">edit a 3<" tmp &&
grep "href=./fol/log/b.txt?follow=1.>\[prev\]" tmp &&
grep "href=./fol/log/b.txt?ofs=6&follow=1.>\[next\]" tmp
'
test_expect_success 'a cut subject keeps whole characters' '
git -C repos/foo commit --allow-empty -m "日本語の説明文です日本語の説明文です" &&
cgitrc_copy subjectrc max-message-length=20 &&
cgit_rc subjectrc "url=foo/log/" >tmp &&
grep ">日本語の説\.\.\." tmp
'
test_expect_success 'the log draws the commit graph when enabled' '
cgitrc_copy graphrc enable-commit-graph=1 &&
cgit_rc graphrc "url=foo/log/" >tmp &&
grep "class=.commitgraph." tmp &&
grep " | " tmp
'
# A followed log is walked without the graph, so its first column holds the
# age whatever enable-commit-graph says.
test_expect_success 'a followed log heads its age column with the graph on' '
{
echo "enable-commit-graph=1" &&
cat folrc
} >folgraphrc &&
cgit_rc folgraphrc "url=fol/log/b.txt&follow=1" >tmp &&
grep "Age | Commit message" tmp &&
! grep "aria-label=.Graph." tmp
'
# The search is literal, so text that is no valid regular expression still
# finds the commit holding it.
test_expect_success 'a search for brackets matches them literally' '
git -C repos/foo commit --allow-empty -m "fix [brackets] in docs" &&
cgit_url "foo/log&qt=grep&q=%5Bbrackets" >tmp &&
grep "^Status: 200" tmp &&
grep "fix \\[brackets\\] in docs" tmp
'
# A range is walked in full before the first row, so a missing parent fails
# the walk while the page can still answer with an error of its own.
test_expect_success 'a walk that cannot start answers one error page' '
git clone -q repos/foo gap &&
old=$(git -C gap rev-parse HEAD~4) &&
parent=$(git -C gap rev-parse HEAD~2) &&
rm gap/.git/objects/$(echo $parent | cut -c1-2)/$(echo $parent | cut -c3-) &&
cgitrc_repo gaprc gap "repo.path=$PWD/gap/.git" &&
cgit_rc gaprc "url=gap/log/&qt=range&q=$old..master" >tmp 2>err &&
test $(grep -c "^Status:" tmp) = 1 &&
grep "^Status: 500" tmp &&
grep "Unable to read the history" tmp
'
test_done
|