test-hook
265 lines
| 6.7 KiB
| text/plain
|
TextLexer
/ tests / test-hook
Thomas Arendsen Hein
|
r800 | #!/bin/sh | ||
mpm@selenic.com
|
r487 | |||
Alexis S. L. Carvalho
|
r4286 | cp "$TESTDIR"/printenv.py . | ||
Vadim Gelfer
|
r1734 | # commit hooks can see env vars | ||
hg init a | ||||
cd a | ||||
mpm@selenic.com
|
r487 | echo "[hooks]" > .hg/hgrc | ||
Thomas Arendsen Hein
|
r4368 | echo 'commit = unset HG_LOCAL HG_TAG; python ../printenv.py commit' >> .hg/hgrc | ||
echo 'commit.b = unset HG_LOCAL HG_TAG; python ../printenv.py commit.b' >> .hg/hgrc | ||||
echo 'precommit = unset HG_LOCAL HG_NODE HG_TAG; python ../printenv.py precommit' >> .hg/hgrc | ||||
echo 'pretxncommit = unset HG_LOCAL HG_TAG; python ../printenv.py pretxncommit' >> .hg/hgrc | ||||
Alexis S. L. Carvalho
|
r4286 | echo 'pretxncommit.tip = hg -q tip' >> .hg/hgrc | ||
Thomas Arendsen Hein
|
r4634 | echo 'pre-identify = python ../printenv.py pre-identify 1' >> .hg/hgrc | ||
echo 'pre-cat = python ../printenv.py pre-cat' >> .hg/hgrc | ||||
echo 'post-cat = python ../printenv.py post-cat' >> .hg/hgrc | ||||
mpm@selenic.com
|
r487 | echo a > a | ||
hg add a | ||||
Thomas Arendsen Hein
|
r1933 | hg commit -m a -d "1000000 0" | ||
Vadim Gelfer
|
r1734 | |||
hg clone . ../b | ||||
cd ../b | ||||
# changegroup hooks can see env vars | ||||
echo '[hooks]' > .hg/hgrc | ||||
Alexis S. L. Carvalho
|
r4286 | echo 'prechangegroup = python ../printenv.py prechangegroup' >> .hg/hgrc | ||
echo 'changegroup = python ../printenv.py changegroup' >> .hg/hgrc | ||||
echo 'incoming = python ../printenv.py incoming' >> .hg/hgrc | ||||
Vadim Gelfer
|
r1734 | |||
# pretxncommit and commit hooks can see both parents of merge | ||||
cd ../a | ||||
echo b >> a | ||||
hg commit -m a1 -d "1 0" | ||||
hg update -C 0 | ||||
echo b > b | ||||
hg add b | ||||
hg commit -m b -d '1 0' | ||||
Vadim Gelfer
|
r2283 | hg merge 1 | ||
Vadim Gelfer
|
r1734 | hg commit -m merge -d '2 0' | ||
Matt Mackall
|
r4630 | # test generic hooks | ||
hg id | ||||
Thomas Arendsen Hein
|
r4659 | hg cat b | ||
Matt Mackall
|
r4630 | |||
Vadim Gelfer
|
r1734 | cd ../b | ||
hg pull ../a | ||||
# tag hooks can see env vars | ||||
cd ../a | ||||
Alexis S. L. Carvalho
|
r4286 | echo 'pretag = python ../printenv.py pretag' >> .hg/hgrc | ||
Thomas Arendsen Hein
|
r4368 | echo 'tag = unset HG_PARENT1 HG_PARENT2; python ../printenv.py tag' >> .hg/hgrc | ||
Vadim Gelfer
|
r1734 | hg tag -d '3 0' a | ||
hg tag -l la | ||||
# pretag hook can forbid tagging | ||||
Alexis S. L. Carvalho
|
r4286 | echo 'pretag.forbid = python ../printenv.py pretag.forbid 1' >> .hg/hgrc | ||
Vadim Gelfer
|
r1734 | hg tag -d '4 0' fa | ||
hg tag -l fla | ||||
# pretxncommit hook can see changeset, can roll back txn, changeset | ||||
# no more there after | ||||
Alexis S. L. Carvalho
|
r4286 | echo 'pretxncommit.forbid0 = hg tip -q' >> .hg/hgrc | ||
echo 'pretxncommit.forbid1 = python ../printenv.py pretxncommit.forbid 1' >> .hg/hgrc | ||||
Vadim Gelfer
|
r1734 | echo z > z | ||
hg add z | ||||
hg -q tip | ||||
hg commit -m 'fail' -d '4 0' | ||||
hg -q tip | ||||
# precommit hook can prevent commit | ||||
Alexis S. L. Carvalho
|
r4286 | echo 'precommit.forbid = python ../printenv.py precommit.forbid 1' >> .hg/hgrc | ||
Vadim Gelfer
|
r1734 | hg commit -m 'fail' -d '4 0' | ||
hg -q tip | ||||
Vadim Gelfer
|
r2266 | # preupdate hook can prevent update | ||
Alexis S. L. Carvalho
|
r4286 | echo 'preupdate = python ../printenv.py preupdate' >> .hg/hgrc | ||
Vadim Gelfer
|
r2266 | hg update 1 | ||
# update hook | ||||
Alexis S. L. Carvalho
|
r4286 | echo 'update = python ../printenv.py update' >> .hg/hgrc | ||
Vadim Gelfer
|
r2266 | hg update | ||
Vadim Gelfer
|
r1734 | # prechangegroup hook can prevent incoming changes | ||
cd ../b | ||||
hg -q tip | ||||
echo '[hooks]' > .hg/hgrc | ||||
Alexis S. L. Carvalho
|
r4286 | echo 'prechangegroup.forbid = python ../printenv.py prechangegroup.forbid 1' >> .hg/hgrc | ||
Vadim Gelfer
|
r1734 | hg pull ../a | ||
# pretxnchangegroup hook can see incoming changes, can roll back txn, | ||||
# incoming changes no longer there after | ||||
echo '[hooks]' > .hg/hgrc | ||||
Alexis S. L. Carvalho
|
r4286 | echo 'pretxnchangegroup.forbid0 = hg tip -q' >> .hg/hgrc | ||
echo 'pretxnchangegroup.forbid1 = python ../printenv.py pretxnchangegroup.forbid 1' >> .hg/hgrc | ||||
Vadim Gelfer
|
r1734 | hg pull ../a | ||
hg -q tip | ||||
Vadim Gelfer
|
r1736 | |||
# outgoing hooks can see env vars | ||||
rm .hg/hgrc | ||||
echo '[hooks]' > ../a/.hg/hgrc | ||||
Alexis S. L. Carvalho
|
r4286 | echo 'preoutgoing = python ../printenv.py preoutgoing' >> ../a/.hg/hgrc | ||
echo 'outgoing = python ../printenv.py outgoing' >> ../a/.hg/hgrc | ||||
Vadim Gelfer
|
r1736 | hg pull ../a | ||
Vadim Gelfer
|
r2227 | hg rollback | ||
Vadim Gelfer
|
r1736 | |||
# preoutgoing hook can prevent outgoing changes | ||||
Alexis S. L. Carvalho
|
r4286 | echo 'preoutgoing.forbid = python ../printenv.py preoutgoing.forbid 1' >> ../a/.hg/hgrc | ||
Vadim Gelfer
|
r1736 | hg pull ../a | ||
Fred Wulff
|
r8907 | # outgoing hooks work for local clones | ||
cd .. | ||||
echo '[hooks]' > a/.hg/hgrc | ||||
echo 'preoutgoing = python ../printenv.py preoutgoing' >> a/.hg/hgrc | ||||
echo 'outgoing = python ../printenv.py outgoing' >> a/.hg/hgrc | ||||
hg clone a c | ||||
rm -rf c | ||||
# preoutgoing hook can prevent outgoing changes for local clones | ||||
echo 'preoutgoing.forbid = python ../printenv.py preoutgoing.forbid 1' >> a/.hg/hgrc | ||||
hg clone a zzz | ||||
cd b | ||||
Vadim Gelfer
|
r2155 | cat > hooktests.py <<EOF | ||
from mercurial import util | ||||
uncallable = 0 | ||||
def printargs(args): | ||||
args.pop('ui', None) | ||||
args.pop('repo', None) | ||||
a = list(args.items()) | ||||
a.sort() | ||||
print 'hook args:' | ||||
for k, v in a: | ||||
print ' ', k, v | ||||
def passhook(**args): | ||||
printargs(args) | ||||
def failhook(**args): | ||||
printargs(args) | ||||
Vadim Gelfer
|
r2221 | return True | ||
Vadim Gelfer
|
r2155 | |||
class LocalException(Exception): | ||||
pass | ||||
def raisehook(**args): | ||||
raise LocalException('exception from hook') | ||||
def aborthook(**args): | ||||
raise util.Abort('raise abort from hook') | ||||
def brokenhook(**args): | ||||
return 1 + {} | ||||
class container: | ||||
unreachable = 1 | ||||
EOF | ||||
echo '# test python hooks' | ||||
Thomas Arendsen Hein
|
r2164 | PYTHONPATH="`pwd`:$PYTHONPATH" | ||
Vadim Gelfer
|
r2155 | export PYTHONPATH | ||
echo '[hooks]' > ../a/.hg/hgrc | ||||
echo 'preoutgoing.broken = python:hooktests.brokenhook' >> ../a/.hg/hgrc | ||||
hg pull ../a 2>&1 | grep 'raised an exception' | ||||
echo '[hooks]' > ../a/.hg/hgrc | ||||
echo 'preoutgoing.raise = python:hooktests.raisehook' >> ../a/.hg/hgrc | ||||
hg pull ../a 2>&1 | grep 'raised an exception' | ||||
echo '[hooks]' > ../a/.hg/hgrc | ||||
echo 'preoutgoing.abort = python:hooktests.aborthook' >> ../a/.hg/hgrc | ||||
hg pull ../a | ||||
echo '[hooks]' > ../a/.hg/hgrc | ||||
echo 'preoutgoing.fail = python:hooktests.failhook' >> ../a/.hg/hgrc | ||||
hg pull ../a | ||||
echo '[hooks]' > ../a/.hg/hgrc | ||||
echo 'preoutgoing.uncallable = python:hooktests.uncallable' >> ../a/.hg/hgrc | ||||
hg pull ../a | ||||
echo '[hooks]' > ../a/.hg/hgrc | ||||
echo 'preoutgoing.nohook = python:hooktests.nohook' >> ../a/.hg/hgrc | ||||
hg pull ../a | ||||
echo '[hooks]' > ../a/.hg/hgrc | ||||
echo 'preoutgoing.nomodule = python:nomodule' >> ../a/.hg/hgrc | ||||
hg pull ../a | ||||
echo '[hooks]' > ../a/.hg/hgrc | ||||
echo 'preoutgoing.badmodule = python:nomodule.nowhere' >> ../a/.hg/hgrc | ||||
hg pull ../a | ||||
echo '[hooks]' > ../a/.hg/hgrc | ||||
echo 'preoutgoing.unreachable = python:hooktests.container.unreachable' >> ../a/.hg/hgrc | ||||
hg pull ../a | ||||
echo '[hooks]' > ../a/.hg/hgrc | ||||
echo 'preoutgoing.pass = python:hooktests.passhook' >> ../a/.hg/hgrc | ||||
hg pull ../a | ||||
echo '# make sure --traceback works' | ||||
echo '[hooks]' > .hg/hgrc | ||||
echo 'commit.abort = python:hooktests.aborthook' >> .hg/hgrc | ||||
echo a >> a | ||||
hg --traceback commit -A -m a 2>&1 | grep '^Traceback' | ||||
Alexis S. L. Carvalho
|
r4070 | cd .. | ||
hg init c | ||||
cd c | ||||
cat > hookext.py <<EOF | ||||
def autohook(**args): | ||||
print "Automatically installed hook" | ||||
def reposetup(ui, repo): | ||||
repo.ui.setconfig("hooks", "commit.auto", autohook) | ||||
EOF | ||||
echo '[extensions]' >> .hg/hgrc | ||||
echo 'hookext = hookext.py' >> .hg/hgrc | ||||
touch foo | ||||
hg add foo | ||||
hg ci -m 'add foo' | ||||
echo >> foo | ||||
hg ci --debug -m 'change foo' | sed -e 's/ at .*>/>/' | ||||
Alexis S. L. Carvalho
|
r4085 | hg showconfig hooks | sed -e 's/ at .*>/>/' | ||
Henri Wiechers
|
r9014 | echo '# test python hook configured with python:[file]:[hook] syntax' | ||
cd .. | ||||
mkdir d | ||||
cd d | ||||
hg init repo | ||||
mkdir hooks | ||||
cd hooks | ||||
cat > testhooks.py <<EOF | ||||
def testhook(**args): | ||||
print 'hook works' | ||||
EOF | ||||
echo '[hooks]' > ../repo/.hg/hgrc | ||||
echo "pre-commit.test = python:`pwd`/testhooks.py:testhook" >> ../repo/.hg/hgrc | ||||
cd ../repo | ||||
hg commit | ||||
Bryan O'Sullivan
|
r9851 | cd ../../b | ||
echo '# make sure --traceback works on hook import failure' | ||||
cat > importfail.py <<EOF | ||||
import somebogusmodule | ||||
# dereference something in the module to force demandimport to load it | ||||
somebogusmodule.whatever | ||||
EOF | ||||
echo '[hooks]' > .hg/hgrc | ||||
echo 'precommit.importfail = python:importfail.whatever' >> .hg/hgrc | ||||
echo a >> a | ||||
Mads Kiilerich
|
r10079 | hg --traceback commit -Ama 2>&1 | egrep '^(exception|Traceback|ImportError)' | ||
Bryan O'Sullivan
|
r9851 | |||
Vadim Gelfer
|
r1736 | exit 0 | ||