tests/test-hgwebdir
author Sune Foldager <cryo@cyanite.org>
Thu, 15 Apr 2010 21:59:21 +0200
branchstable
changeset 10925 a101a743c570
parent 10878 c63a6ddbbf9a
child 11677 8f8a7976f4bc
permissions -rwxr-xr-x
prepush: rewrite most of the code from scratch For servers with branchmap support, the algorithm now works as follows: 1. A list of branches in outgoing changesets is created. 2. Using the remote branchmap, a check for new branches is performed. 3. A map (from branch to head list) of locally known remote heads before the push is created, and one which, after step 4, will contain the locally known remote heads after the push. 4. The post-push head map is updated with the outgoing changesets, using the branch cache update mechanism. 5. A check for new heads is performed, by comparing the length of the head list before and after push, for each branch. If there are new heads, an error depending on whether or not there are incoming changes on the branch, is returned. 6. If the push is allowed, a warning is written if there are incoming changes on any branches involved in the push. For old servers, an algorithm similar to step 4-6 above is used to check for new topological heads only. Two bugs are also fixed: 1. Sometimes you would be allowed to push new branch heads without --force. A test for this case was added. 2. You would get the "note: unsynced remote changes!" warning if there were any incoming changesets, even if they were on unrelated branches.

#!/bin/sh
# Tests some basic hgwebdir functionality. Tests setting up paths and
# collection, different forms of 404s and the subdirectory support.

mkdir webdir
cd webdir

hg init a
echo a > a/a
hg --cwd a ci -Ama -d'1 0'
# create a mercurial queue repository
hg --cwd a qinit --config extensions.hgext.mq= -c

hg init b
echo b > b/b
hg --cwd b ci -Amb -d'2 0'

# create a nested repository
cd b
hg init d
echo d > d/d
hg --cwd d ci -Amd -d'3 0'
cd ..

hg init c
echo c > c/c
hg --cwd c ci -Amc -d'3 0'

root=`pwd`
cd ..


cat > paths.conf <<EOF
[paths]
a=$root/a
b=$root/b
EOF

hg serve -p $HGPORT -d --pid-file=hg.pid --webdir-conf paths.conf \
    -A access-paths.log -E error-paths-1.log
cat hg.pid >> $DAEMON_PIDS

echo % should give a 404 - file does not exist
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/a/file/tip/bork?style=raw'

echo % should succeed
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/a/file/tip/a?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/b/file/tip/b?style=raw'

echo % should give a 404 - repo is not published
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/c/file/tip/c?style=raw'

echo % atom-log without basedir
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/a/atom-log' \
    | grep '<link' | sed 's|//[.a-zA-Z0-9_-]*:[0-9][0-9]*/|//example.com:8080/|'

echo % rss-log without basedir
"$TESTDIR/get-with-headers.py" localhost:$HGPORT '/a/rss-log' \
    | grep '<guid' | sed 's|//[.a-zA-Z0-9_-]*:[0-9][0-9]*/|//example.com:8080/|'

cat > paths.conf <<EOF
[paths]
t/a/=$root/a
b=$root/b
coll=$root/*
rcoll=$root/**
EOF

hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
    -A access-paths.log -E error-paths-2.log
cat hg.pid >> $DAEMON_PIDS

echo % should succeed, slashy names
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/?style=paper' \
	| sed "s/[0-9]\{1,\} seconds\{0,1\} ago/seconds ago/"
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t/?style=paper' \
	| sed "s/[0-9]\{1,\} seconds\{0,1\} ago/seconds ago/"
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t/a?style=atom' \
	| sed "s/http:\/\/[^/]*\//http:\/\/127.0.0.1\//"
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t/a/?style=atom' \
	| sed "s/http:\/\/[^/]*\//http:\/\/127.0.0.1\//"
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t/a/file/tip/a?style=raw'
# Test [paths] '*' extension
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/coll/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/coll/a/file/tip/a?style=raw'
#test [paths] '**' extension
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/rcoll/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/rcoll/b/d/file/tip/d?style=raw'


"$TESTDIR/killdaemons.py"
cat > paths.conf <<EOF
[paths]
t/a = $root/a
t/b = $root/b
c = $root/c
[web]
descend=false
EOF

hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
    -A access-paths.log -E error-paths-3.log
cat hg.pid >> $DAEMON_PIDS
echo % test descend = False
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '/t/?style=raw'


cat > collections.conf <<EOF
[collections]
$root=$root
EOF

hg serve --config web.baseurl=http://hg.example.com:8080/ -p $HGPORT2 -d \
    --pid-file=hg.pid --webdir-conf collections.conf \
    -A access-collections.log -E error-collections.log
cat hg.pid >> $DAEMON_PIDS

echo % collections: should succeed
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/a/file/tip/a?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/b/file/tip/b?style=raw'
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/c/file/tip/c?style=raw'

echo % atom-log with basedir /
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/a/atom-log' \
    | grep '<link' | sed 's|//[.a-zA-Z0-9_-]*:[0-9][0-9]*/|//example.com:8080/|'

echo % rss-log with basedir /
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/a/rss-log' \
    | grep '<guid' | sed 's|//[.a-zA-Z0-9_-]*:[0-9][0-9]*/|//example.com:8080/|'

"$TESTDIR/killdaemons.py"

hg serve --config web.baseurl=http://hg.example.com:8080/foo/ -p $HGPORT2 -d \
    --pid-file=hg.pid --webdir-conf collections.conf \
    -A access-collections-2.log -E error-collections-2.log
cat hg.pid >> $DAEMON_PIDS

echo % atom-log with basedir /foo/
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/a/atom-log' \
    | grep '<link' | sed 's|//[.a-zA-Z0-9_-]*:[0-9][0-9]*/|//example.com:8080/|'

echo % rss-log with basedir /foo/
"$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '/a/rss-log' \
    | grep '<guid' | sed 's|//[.a-zA-Z0-9_-]*:[0-9][0-9]*/|//example.com:8080/|'

echo % paths errors 1
cat error-paths-1.log
echo % paths errors 2
cat error-paths-2.log
echo % paths errors 3
cat error-paths-3.log
echo % collections errors
cat error-collections.log
echo % collections errors 2
cat error-collections-2.log