Mercurial > hg
view tests/test-hook @ 5096:ad6b97132b81
merge: fix a copy detection bug (issue672)
When merging rev1 and rev2, we want to search for copies that happened
in rev1 but not in rev2 and vice-versa. We were starting the search at
rev1/rev2 and then going back, stopping as soon as we reached the revno
of the ancestor, but that can miss some cases (see the new
test-issue672).
Now we calculate the revisions that are ancestors of rev1 or rev2 (but
not both) and make sure the search doesn't stop too early.
Simplified test provided by mpm, based on a test case provided by
Edward Lee.
author | Alexis S. L. Carvalho <alexis@cecm.usp.br> |
---|---|
date | Sun, 12 Aug 2007 12:15:10 -0300 |
parents | 7a7d4937272b |
children | e9ef409e6399 |
line wrap: on
line source
#!/bin/sh cp "$TESTDIR"/printenv.py . # commit hooks can see env vars hg init a cd a echo "[hooks]" > .hg/hgrc 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 echo 'pretxncommit.tip = hg -q tip' >> .hg/hgrc 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 echo a > a hg add a hg commit -m a -d "1000000 0" hg clone . ../b cd ../b # changegroup hooks can see env vars echo '[hooks]' > .hg/hgrc echo 'prechangegroup = python ../printenv.py prechangegroup' >> .hg/hgrc echo 'changegroup = python ../printenv.py changegroup' >> .hg/hgrc echo 'incoming = python ../printenv.py incoming' >> .hg/hgrc # 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' hg merge 1 hg commit -m merge -d '2 0' # test generic hooks hg id hg cat b cd ../b hg pull ../a # tag hooks can see env vars cd ../a echo 'pretag = python ../printenv.py pretag' >> .hg/hgrc echo 'tag = unset HG_PARENT1 HG_PARENT2; python ../printenv.py tag' >> .hg/hgrc hg tag -d '3 0' a hg tag -l la # pretag hook can forbid tagging echo 'pretag.forbid = python ../printenv.py pretag.forbid 1' >> .hg/hgrc hg tag -d '4 0' fa hg tag -l fla # pretxncommit hook can see changeset, can roll back txn, changeset # no more there after echo 'pretxncommit.forbid0 = hg tip -q' >> .hg/hgrc echo 'pretxncommit.forbid1 = python ../printenv.py pretxncommit.forbid 1' >> .hg/hgrc echo z > z hg add z hg -q tip hg commit -m 'fail' -d '4 0' hg -q tip # precommit hook can prevent commit echo 'precommit.forbid = python ../printenv.py precommit.forbid 1' >> .hg/hgrc hg commit -m 'fail' -d '4 0' hg -q tip # preupdate hook can prevent update echo 'preupdate = python ../printenv.py preupdate' >> .hg/hgrc hg update 1 # update hook echo 'update = python ../printenv.py update' >> .hg/hgrc hg update # prechangegroup hook can prevent incoming changes cd ../b hg -q tip echo '[hooks]' > .hg/hgrc echo 'prechangegroup.forbid = python ../printenv.py prechangegroup.forbid 1' >> .hg/hgrc hg pull ../a # pretxnchangegroup hook can see incoming changes, can roll back txn, # incoming changes no longer there after echo '[hooks]' > .hg/hgrc echo 'pretxnchangegroup.forbid0 = hg tip -q' >> .hg/hgrc echo 'pretxnchangegroup.forbid1 = python ../printenv.py pretxnchangegroup.forbid 1' >> .hg/hgrc hg pull ../a hg -q tip # outgoing hooks can see env vars rm .hg/hgrc echo '[hooks]' > ../a/.hg/hgrc echo 'preoutgoing = python ../printenv.py preoutgoing' >> ../a/.hg/hgrc echo 'outgoing = python ../printenv.py outgoing' >> ../a/.hg/hgrc hg pull ../a hg rollback # preoutgoing hook can prevent outgoing changes echo 'preoutgoing.forbid = python ../printenv.py preoutgoing.forbid 1' >> ../a/.hg/hgrc hg pull ../a 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) return True 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' PYTHONPATH="`pwd`:$PYTHONPATH" 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' 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 .*>/>/' hg showconfig hooks | sed -e 's/ at .*>/>/' exit 0