tests/test-pending.t
author Brodie Rao <brodie@sf.io>
Mon, 16 Sep 2013 01:08:29 -0700
changeset 20192 38fad5e76ee8
parent 16975 921458360270
child 24822 8678b1eafbcf
permissions -rw-r--r--
branches: simplify with repo.branchmap().iterbranches() Running hg branches on the PyPy repo (with 996) over a busy NFS server, before this change: $ time hg --profile branches > /dev/null CallCount Recursive Total(s) Inline(s) module:lineno(function) 1069 0 1.2955 1.2955 <open> 1063 0 0.5576 0.5576 <method 'close' of 'file' objects> 4122 0 0.1993 0.0449 mercurial.repoview:161(changelog) 8240 0 0.0771 0.0299 mercurial.changelog:133(tip) 4122 0 0.0422 0.0204 mercurial.localrepo:26(__get__) 8240 0 0.0252 0.0131 <len> 4122 0 0.0060 0.0037 mercurial.repoview:112(filterrevs) 8240 0 0.0028 0.0028 <hash> 3029 0 0.2139 0.0390 mercurial.context:202(__init__) 3029 0 0.1402 0.0339 mercurial.repoview:161(changelog) 3029 0 0.0240 0.0087 mercurial.changelog:183(rev) 9087 0 0.0067 0.0067 <isinstance> 1096 0 0.0025 0.0025 <binascii.unhexlify> 4125 0 0.0015 0.0015 <len> 4229 0 0.0344 0.0344 mercurial.revlog:296(rev) 1061 0 0.0343 0.0343 <method 'seek' of 'file' objects> 1063 0 0.0339 0.0339 <method 'read' of 'file' objects> 40476 16488 0.0479 0.0311 <len> 16488 0 0.0216 0.0168 mercurial.revlog:262(__len__) 8240 0 0.0771 0.0299 mercurial.changelog:133(tip) 8240 0 0.0281 0.0203 mercurial.changelog:190(node) 8240 0 0.0191 0.0095 <len> 1342 0 0.0278 0.0278 <zlib.decompress> 1074 0 2.2143 0.0266 mercurial.changelog:270(read) 1074 0 2.1328 0.0230 mercurial.revlog:907(revision) 1073 0 0.0208 0.0108 mercurial.changelog:28(decodeextra) 2148 0 0.0072 0.0072 <method 'split' of 'str' objects> 2148 0 0.0211 0.0038 mercurial.encoding:61(tolocal) 1074 0 0.0028 0.0028 <method 'index' of 'str' objects> 1061 0 1.9811 0.0237 mercurial.revlog:817(_loadchunk) real 0m2.742s user 0m0.811s sys 0m0.188s After this change: $ time hg --profile branches > /dev/null CallCount Recursive Total(s) Inline(s) module:lineno(function) 2092 0 0.1444 0.0292 mercurial.context:202(__init__) 2092 0 0.0908 0.0216 mercurial.repoview:161(changelog) 2092 0 0.0164 0.0057 mercurial.changelog:183(rev) 6276 0 0.0045 0.0045 <isinstance> 1096 0 0.0024 0.0024 <binascii.unhexlify> 3188 0 0.0013 0.0013 <len> 2218 0 0.0230 0.0230 mercurial.revlog:296(rev) 2111 0 0.1028 0.0218 mercurial.repoview:161(changelog) 4218 0 0.0387 0.0146 mercurial.changelog:133(tip) 2111 0 0.0238 0.0104 mercurial.localrepo:26(__get__) 4218 0 0.0122 0.0062 <len> 2111 0 0.0038 0.0021 mercurial.repoview:112(filterrevs) 4218 0 0.0014 0.0014 <hash> 20240 8444 0.0233 0.0149 <len> 8444 0 0.0110 0.0084 mercurial.revlog:262(__len__) 4218 0 0.0387 0.0146 mercurial.changelog:133(tip) 4218 0 0.0144 0.0103 mercurial.changelog:190(node) 4218 0 0.0097 0.0048 <len> 2398 1 0.0271 0.0115 mercurial.localrepo:26(__get__) 2398 1 0.0146 0.0046 mercurial.scmutil:939(__get__) 2124 0 0.0009 0.0009 mercurial.localrepo:330(unfiltered) 274 0 0.0002 0.0002 mercurial.repoview:192(unfiltered) 4 0 0.1409 0.0112 mercurial.branchmap:19(read) 1096 0 0.1113 0.0028 mercurial.localrepo:407(__contains__) 1098 0 0.0020 0.0020 <method 'split' of 'str' objects> 1097 0 0.0019 0.0019 <binascii.unhexlify> 1096 0 0.0093 0.0018 mercurial.encoding:61(tolocal) 1096 0 0.0010 0.0010 <method 'append' of 'list' objects> 4349 0 0.0150 0.0105 mercurial.changelog:190(node) 4349 0 0.0045 0.0045 mercurial.revlog:317(node) real 0m0.362s user 0m0.329s sys 0m0.024s

Verify that pending changesets are seen by pretxn* hooks but not by other
processes that access the destination repo while the hooks are running.

The hooks (python and external) both reject changesets after some think time,
during which another process runs pull.  Each hook creates a file ('notify') to
indicate to the controlling process that it is running; the process removes the
file to indicate the hook can terminate.

init env vars

  $ d=`pwd`
  $ maxwait=20

utility to run the test - start a push in the background and run pull

  $ dotest() {
  >     rm -f notify
  >     printf 'push '; hg -R child-push tip --template '{node}\n'
  >     hg -R child-push -q push > push.out 2>&1 &
  > 
  >     # wait for hook to create the notify file
  >     i=$maxwait
  >     while [ ! -f notify -a $i != 0 ]; do
  >         sleep 1
  >         i=`expr $i - 1`
  >     done
  > 
  >     # run pull
  >     hg -R child-pull -q pull
  >     rc=$?
  > 
  >     # tell hook to finish; notify should exist.
  >     rm notify
  >     wait
  > 
  >     cat push.out
  >     printf 'pull '; hg -R child-pull tip --template '{node}\n'
  >     return $rc
  > }

python hook

  $ cat <<EOF > reject.py
  > import os, time
  > from mercurial import ui, localrepo
  > def rejecthook(ui, repo, hooktype, node, **opts):
  >     ui.write('hook %s\\n' % repo['tip'].hex())
  >     # create the notify file so caller knows we're running
  >     fpath = os.path.join('$d', 'notify')
  >     f = open(fpath, 'w')
  >     f.close()
  >     # wait for ack - caller should delete the notify file
  >     i = $maxwait
  >     while os.path.exists(fpath) and i > 0:
  >         time.sleep(1)
  >         i -= 1
  >     return True # reject the changesets
  > EOF

external hook

  $ cat <<EOF > reject.sh
  > printf 'hook '; hg tip --template '{node}\\n'
  > # create the notify file so caller knows we're running
  > fpath=$d/notify
  > touch \$fpath
  > # wait for ack - caller should delete the notify file
  > i=$maxwait
  > while [ -f \$fpath -a \$i != 0 ]; do
  >     sleep 1
  >     i=\`expr \$i - 1\`
  > done
  > exit 1 # reject the changesets
  > EOF

create repos

  $ hg init parent
  $ hg clone -q parent child-push
  $ hg clone -q parent child-pull
  $ echo a > child-push/a
  $ hg -R child-push add child-push/a
  $ hg -R child-push commit -m a -d '1000000 0'

test python hook

  $ cat <<EOF > parent/.hg/hgrc
  > [extensions]
  > reject = $d/reject.py
  > [hooks]
  > pretxnchangegroup = python:reject.rejecthook
  > EOF

  $ dotest
  push 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
  hook 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
  transaction abort!
  rollback completed
  abort: pretxnchangegroup hook failed
  pull 0000000000000000000000000000000000000000

test external hook

  $ cat <<EOF > parent/.hg/hgrc
  > [hooks]
  > pretxnchangegroup = sh $d/reject.sh
  > EOF

  $ dotest
  push 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
  hook 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
  transaction abort!
  rollback completed
  abort: pretxnchangegroup hook exited with status 1
  pull 0000000000000000000000000000000000000000