test-commandserver.t
886 lines
| 26.3 KiB
| text/troff
|
Tads3Lexer
/ tests / test-commandserver.t
Yuya Nishihara
|
r22568 | #if windows | ||
$ PYTHONPATH="$TESTDIR/../contrib;$PYTHONPATH" | ||||
#else | ||||
$ PYTHONPATH="$TESTDIR/../contrib:$PYTHONPATH" | ||||
#endif | ||||
$ export PYTHONPATH | ||||
Yuya Nishihara
|
r23053 | typical client does not want echo-back messages, so test without it: | ||
$ grep -v '^promptecho ' < $HGRCPATH >> $HGRCPATH.new | ||||
$ mv $HGRCPATH.new $HGRCPATH | ||||
Yuya Nishihara
|
r22568 | $ hg init repo | ||
$ cd repo | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def hellomessage(server): | ||||
... ch, data = readchannel(server) | ||||
Yuya Nishihara
|
r22571 | ... print '%c, %r' % (ch, data) | ||
Yuya Nishihara
|
r22568 | ... # run an arbitrary command to make sure the next thing the server | ||
... # sends isn't part of the hello message | ||||
... runcommand(server, ['id']) | ||||
Yuya Nishihara
|
r23036 | o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob) | ||
Yuya Nishihara
|
r22572 | *** runcommand id | ||
Yuya Nishihara
|
r22567 | 000000000000 tip | ||
Yuya Nishihara
|
r22568 | |||
>>> from hgclient import check | ||||
>>> @check | ||||
... def unknowncommand(server): | ||||
... server.stdin.write('unknowncommand\n') | ||||
Yuya Nishihara
|
r22567 | abort: unknown command unknowncommand | ||
Yuya Nishihara
|
r22568 | |||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def checkruncommand(server): | ||||
... # hello block | ||||
... readchannel(server) | ||||
... | ||||
... # no args | ||||
... runcommand(server, []) | ||||
... | ||||
... # global options | ||||
... runcommand(server, ['id', '--quiet']) | ||||
... | ||||
... # make sure global options don't stick through requests | ||||
... runcommand(server, ['id']) | ||||
... | ||||
... # --config | ||||
... runcommand(server, ['id', '--config', 'ui.quiet=True']) | ||||
... | ||||
... # make sure --config doesn't stick | ||||
... runcommand(server, ['id']) | ||||
... | ||||
... # negative return code should be masked | ||||
... runcommand(server, ['id', '-runknown']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand | ||
Yuya Nishihara
|
r22567 | Mercurial Distributed SCM | ||
basic commands: | ||||
add add the specified files on the next commit | ||||
annotate show changeset information by line for each file | ||||
clone make a copy of an existing repository | ||||
commit commit the specified files or all outstanding changes | ||||
diff diff repository (or selected files) | ||||
export dump the header and diffs for one or more changesets | ||||
forget forget the specified files on the next commit | ||||
init create a new repository in the given directory | ||||
log show revision history of entire repository or files | ||||
anatoly techtonik
|
r23400 | merge merge another revision into working directory | ||
Yuya Nishihara
|
r22567 | pull pull changes from the specified source | ||
push push changes to the specified destination | ||||
remove remove the specified files on the next commit | ||||
serve start stand-alone webserver | ||||
status show changed files in the working directory | ||||
summary summarize working directory state | ||||
update update working directory (or switch revisions) | ||||
(use "hg help" for the full list of commands or "hg -v" for details) | ||||
Yuya Nishihara
|
r22572 | *** runcommand id --quiet | ||
Yuya Nishihara
|
r22567 | 000000000000 | ||
Yuya Nishihara
|
r22572 | *** runcommand id | ||
Yuya Nishihara
|
r22567 | 000000000000 tip | ||
Yuya Nishihara
|
r22572 | *** runcommand id --config ui.quiet=True | ||
Yuya Nishihara
|
r22567 | 000000000000 | ||
Yuya Nishihara
|
r22572 | *** runcommand id | ||
Yuya Nishihara
|
r22567 | 000000000000 tip | ||
Yuya Nishihara
|
r22572 | *** runcommand id -runknown | ||
Yuya Nishihara
|
r22567 | abort: unknown revision 'unknown'! | ||
[255] | ||||
Yuya Nishihara
|
r22568 | |||
>>> from hgclient import readchannel, check | ||||
>>> @check | ||||
... def inputeof(server): | ||||
... readchannel(server) | ||||
... server.stdin.write('runcommand\n') | ||||
... # close stdin while server is waiting for input | ||||
... server.stdin.close() | ||||
... | ||||
... # server exits with 1 if the pipe closed while reading the command | ||||
... print 'server exit code =', server.wait() | ||||
Yuya Nishihara
|
r22567 | server exit code = 1 | ||
Yuya Nishihara
|
r22568 | |||
>>> import cStringIO | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def serverinput(server): | ||||
... readchannel(server) | ||||
... | ||||
... patch = """ | ||||
... # HG changeset patch | ||||
... # User test | ||||
... # Date 0 0 | ||||
... # Node ID c103a3dec114d882c98382d684d8af798d09d857 | ||||
... # Parent 0000000000000000000000000000000000000000 | ||||
... 1 | ||||
... | ||||
... diff -r 000000000000 -r c103a3dec114 a | ||||
... --- /dev/null Thu Jan 01 00:00:00 1970 +0000 | ||||
... +++ b/a Thu Jan 01 00:00:00 1970 +0000 | ||||
... @@ -0,0 +1,1 @@ | ||||
... +1 | ||||
... """ | ||||
... | ||||
... runcommand(server, ['import', '-'], input=cStringIO.StringIO(patch)) | ||||
... runcommand(server, ['log']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand import - | ||
Yuya Nishihara
|
r22567 | applying patch from stdin | ||
Yuya Nishihara
|
r22572 | *** runcommand log | ||
Yuya Nishihara
|
r22567 | changeset: 0:eff892de26ec | ||
tag: tip | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: 1 | ||||
Yuya Nishihara
|
r22568 | |||
check that --cwd doesn't persist between requests: | ||||
$ mkdir foo | ||||
$ touch foo/bar | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def cwd(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['--cwd', 'foo', 'st', 'bar']) | ||||
... runcommand(server, ['st', 'foo/bar']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand --cwd foo st bar | ||
Yuya Nishihara
|
r22567 | ? bar | ||
Yuya Nishihara
|
r22572 | *** runcommand st foo/bar | ||
Yuya Nishihara
|
r22567 | ? foo/bar | ||
Yuya Nishihara
|
r22568 | |||
$ rm foo/bar | ||||
check that local configs for the cached repo aren't inherited when -R is used: | ||||
$ cat <<EOF >> .hg/hgrc | ||||
> [ui] | ||||
> foo = bar | ||||
> EOF | ||||
>>> from hgclient import readchannel, sep, runcommand, check | ||||
>>> @check | ||||
... def localhgrc(server): | ||||
... readchannel(server) | ||||
... | ||||
... # the cached repo local hgrc contains ui.foo=bar, so showconfig should | ||||
... # show it | ||||
... runcommand(server, ['showconfig'], outfilter=sep) | ||||
... | ||||
... # but not for this repo | ||||
... runcommand(server, ['init', 'foo']) | ||||
... runcommand(server, ['-R', 'foo', 'showconfig', 'ui', 'defaults']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand showconfig | ||
Yuya Nishihara
|
r22567 | bundle.mainreporoot=$TESTTMP/repo | ||
defaults.backout=-d "0 0" | ||||
defaults.commit=-d "0 0" | ||||
defaults.shelve=--date "0 0" | ||||
defaults.tag=-d "0 0" | ||||
Pierre-Yves David
|
r25290 | devel.all-warnings=true | ||
Matt Harbison
|
r23388 | largefiles.usercache=$TESTTMP/.cache/largefiles | ||
Yuya Nishihara
|
r22567 | ui.slash=True | ||
ui.interactive=False | ||||
ui.mergemarkers=detailed | ||||
ui.foo=bar | ||||
ui.nontty=true | ||||
Yuya Nishihara
|
r22572 | *** runcommand init foo | ||
*** runcommand -R foo showconfig ui defaults | ||||
Yuya Nishihara
|
r22567 | defaults.backout=-d "0 0" | ||
defaults.commit=-d "0 0" | ||||
defaults.shelve=--date "0 0" | ||||
defaults.tag=-d "0 0" | ||||
ui.slash=True | ||||
ui.interactive=False | ||||
ui.mergemarkers=detailed | ||||
ui.nontty=true | ||||
Yuya Nishihara
|
r22568 | |||
$ rm -R foo | ||||
#if windows | ||||
$ PYTHONPATH="$TESTTMP/repo;$PYTHONPATH" | ||||
#else | ||||
$ PYTHONPATH="$TESTTMP/repo:$PYTHONPATH" | ||||
#endif | ||||
$ cat <<EOF > hook.py | ||||
> import sys | ||||
> def hook(**args): | ||||
> print 'hook talking' | ||||
> print 'now try to read something: %r' % sys.stdin.read() | ||||
> EOF | ||||
>>> import cStringIO | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def hookoutput(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['--config', | ||||
... 'hooks.pre-identify=python:hook.hook', | ||||
... 'id'], | ||||
... input=cStringIO.StringIO('some input')) | ||||
Yuya Nishihara
|
r22572 | *** runcommand --config hooks.pre-identify=python:hook.hook id | ||
Yuya Nishihara
|
r22567 | hook talking | ||
now try to read something: 'some input' | ||||
eff892de26ec tip | ||||
Yuya Nishihara
|
r22568 | |||
$ rm hook.py* | ||||
$ echo a >> a | ||||
>>> import os | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def outsidechanges(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['status']) | ||||
... os.system('hg ci -Am2') | ||||
... runcommand(server, ['tip']) | ||||
... runcommand(server, ['status']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand status | ||
Yuya Nishihara
|
r22567 | M a | ||
Yuya Nishihara
|
r22572 | *** runcommand tip | ||
Yuya Nishihara
|
r22567 | changeset: 1:d3a0a68be6de | ||
tag: tip | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: 2 | ||||
Yuya Nishihara
|
r22572 | *** runcommand status | ||
Yuya Nishihara
|
r22568 | |||
>>> import os | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def bookmarks(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['bookmarks']) | ||||
... | ||||
... # changes .hg/bookmarks | ||||
... os.system('hg bookmark -i bm1') | ||||
... os.system('hg bookmark -i bm2') | ||||
... runcommand(server, ['bookmarks']) | ||||
... | ||||
... # changes .hg/bookmarks.current | ||||
... os.system('hg upd bm1 -q') | ||||
... runcommand(server, ['bookmarks']) | ||||
... | ||||
... runcommand(server, ['bookmarks', 'bm3']) | ||||
... f = open('a', 'ab') | ||||
... f.write('a\n') | ||||
... f.close() | ||||
... runcommand(server, ['commit', '-Amm']) | ||||
... runcommand(server, ['bookmarks']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand bookmarks | ||
Yuya Nishihara
|
r22567 | no bookmarks set | ||
Yuya Nishihara
|
r22572 | *** runcommand bookmarks | ||
Yuya Nishihara
|
r22567 | bm1 1:d3a0a68be6de | ||
bm2 1:d3a0a68be6de | ||||
Yuya Nishihara
|
r22572 | *** runcommand bookmarks | ||
Yuya Nishihara
|
r22567 | * bm1 1:d3a0a68be6de | ||
bm2 1:d3a0a68be6de | ||||
Yuya Nishihara
|
r22572 | *** runcommand bookmarks bm3 | ||
*** runcommand commit -Amm | ||||
*** runcommand bookmarks | ||||
Yuya Nishihara
|
r22567 | bm1 1:d3a0a68be6de | ||
bm2 1:d3a0a68be6de | ||||
* bm3 2:aef17e88f5f0 | ||||
Yuya Nishihara
|
r22568 | |||
>>> import os | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def tagscache(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['id', '-t', '-r', '0']) | ||||
... os.system('hg tag -r 0 foo') | ||||
... runcommand(server, ['id', '-t', '-r', '0']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand id -t -r 0 | ||
Yuya Nishihara
|
r22567 | |||
Yuya Nishihara
|
r22572 | *** runcommand id -t -r 0 | ||
Yuya Nishihara
|
r22567 | foo | ||
Yuya Nishihara
|
r22568 | |||
>>> import os | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def setphase(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['phase', '-r', '.']) | ||||
... os.system('hg phase -r . -p') | ||||
... runcommand(server, ['phase', '-r', '.']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand phase -r . | ||
Yuya Nishihara
|
r22567 | 3: draft | ||
Yuya Nishihara
|
r22572 | *** runcommand phase -r . | ||
Yuya Nishihara
|
r22567 | 3: public | ||
Yuya Nishihara
|
r22568 | |||
$ echo a >> a | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def rollback(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['phase', '-r', '.', '-p']) | ||||
... runcommand(server, ['commit', '-Am.']) | ||||
... runcommand(server, ['rollback']) | ||||
... runcommand(server, ['phase', '-r', '.']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand phase -r . -p | ||
Yuya Nishihara
|
r22567 | no phases changed | ||
Yuya Nishihara
|
r22572 | *** runcommand commit -Am. | ||
*** runcommand rollback | ||||
Yuya Nishihara
|
r22567 | repository tip rolled back to revision 3 (undo commit) | ||
working directory now based on revision 3 | ||||
Yuya Nishihara
|
r22572 | *** runcommand phase -r . | ||
Yuya Nishihara
|
r22567 | 3: public | ||
Yuya Nishihara
|
r22568 | |||
>>> import os | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def branch(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['branch']) | ||||
... os.system('hg branch foo') | ||||
... runcommand(server, ['branch']) | ||||
... os.system('hg branch default') | ||||
Yuya Nishihara
|
r22572 | *** runcommand branch | ||
Yuya Nishihara
|
r22567 | default | ||
marked working directory as branch foo | ||||
(branches are permanent and global, did you want a bookmark?) | ||||
Yuya Nishihara
|
r22572 | *** runcommand branch | ||
Yuya Nishihara
|
r22567 | foo | ||
marked working directory as branch default | ||||
(branches are permanent and global, did you want a bookmark?) | ||||
Yuya Nishihara
|
r22568 | |||
$ touch .hgignore | ||||
>>> import os | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def hgignore(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['commit', '-Am.']) | ||||
... f = open('ignored-file', 'ab') | ||||
... f.write('') | ||||
... f.close() | ||||
... f = open('.hgignore', 'ab') | ||||
... f.write('ignored-file') | ||||
... f.close() | ||||
... runcommand(server, ['status', '-i', '-u']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand commit -Am. | ||
Yuya Nishihara
|
r22567 | adding .hgignore | ||
Yuya Nishihara
|
r22572 | *** runcommand status -i -u | ||
Yuya Nishihara
|
r22567 | I ignored-file | ||
Yuya Nishihara
|
r22568 | |||
Yuya Nishihara
|
r26405 | cache of non-public revisions should be invalidated on repository change | ||
(issue4855): | ||||
>>> import os | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def phasesetscacheaftercommit(server): | ||||
... readchannel(server) | ||||
... # load _phasecache._phaserevs and _phasesets | ||||
... runcommand(server, ['log', '-qr', 'draft()']) | ||||
... # create draft commits by another process | ||||
... for i in xrange(5, 7): | ||||
Matt Harbison
|
r26431 | ... f = open('a', 'ab') | ||
... f.seek(0, os.SEEK_END) | ||||
... f.write('a\n') | ||||
... f.close() | ||||
Yuya Nishihara
|
r26405 | ... os.system('hg commit -Aqm%d' % i) | ||
... # new commits should be listed as draft revisions | ||||
... runcommand(server, ['log', '-qr', 'draft()']) | ||||
*** runcommand log -qr draft() | ||||
4:7966c8e3734d | ||||
*** runcommand log -qr draft() | ||||
4:7966c8e3734d | ||||
5:41f6602d1c4f | ||||
6:10501e202c35 | ||||
>>> import os | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def phasesetscacheafterstrip(server): | ||||
... readchannel(server) | ||||
... # load _phasecache._phaserevs and _phasesets | ||||
... runcommand(server, ['log', '-qr', 'draft()']) | ||||
... # strip cached revisions by another process | ||||
... os.system('hg --config extensions.strip= strip -q 5') | ||||
... # shouldn't abort by "unknown revision '6'" | ||||
... runcommand(server, ['log', '-qr', 'draft()']) | ||||
*** runcommand log -qr draft() | ||||
4:7966c8e3734d | ||||
5:41f6602d1c4f | ||||
6:10501e202c35 | ||||
*** runcommand log -qr draft() | ||||
4:7966c8e3734d | ||||
cache of phase roots should be invalidated on strip (issue3827): | ||||
Yuya Nishihara
|
r22568 | >>> import os | ||
>>> from hgclient import readchannel, sep, runcommand, check | ||||
>>> @check | ||||
... def phasecacheafterstrip(server): | ||||
... readchannel(server) | ||||
... | ||||
... # create new head, 5:731265503d86 | ||||
... runcommand(server, ['update', '-C', '0']) | ||||
... f = open('a', 'ab') | ||||
... f.write('a\n') | ||||
... f.close() | ||||
... runcommand(server, ['commit', '-Am.', 'a']) | ||||
... runcommand(server, ['log', '-Gq']) | ||||
... | ||||
... # make it public; draft marker moves to 4:7966c8e3734d | ||||
... runcommand(server, ['phase', '-p', '.']) | ||||
... # load _phasecache.phaseroots | ||||
... runcommand(server, ['phase', '.'], outfilter=sep) | ||||
... | ||||
... # strip 1::4 outside server | ||||
... os.system('hg -q --config extensions.mq= strip 1') | ||||
... | ||||
... # shouldn't raise "7966c8e3734d: no node!" | ||||
... runcommand(server, ['branches']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand update -C 0 | ||
Yuya Nishihara
|
r22567 | 1 files updated, 0 files merged, 2 files removed, 0 files unresolved | ||
(leaving bookmark bm3) | ||||
Yuya Nishihara
|
r22572 | *** runcommand commit -Am. a | ||
Yuya Nishihara
|
r22567 | created new head | ||
Yuya Nishihara
|
r22572 | *** runcommand log -Gq | ||
Yuya Nishihara
|
r22567 | @ 5:731265503d86 | ||
| | ||||
| o 4:7966c8e3734d | ||||
| | | ||||
| o 3:b9b85890c400 | ||||
| | | ||||
| o 2:aef17e88f5f0 | ||||
| | | ||||
| o 1:d3a0a68be6de | ||||
|/ | ||||
o 0:eff892de26ec | ||||
Yuya Nishihara
|
r22572 | *** runcommand phase -p . | ||
*** runcommand phase . | ||||
Yuya Nishihara
|
r22567 | 5: public | ||
Yuya Nishihara
|
r22572 | *** runcommand branches | ||
Yuya Nishihara
|
r22567 | default 1:731265503d86 | ||
Yuya Nishihara
|
r22568 | |||
Yuya Nishihara
|
r26251 | in-memory cache must be reloaded if transaction is aborted. otherwise | ||
changelog and manifest would have invalid node: | ||||
$ echo a >> a | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def txabort(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['commit', '--config', 'hooks.pretxncommit=false', | ||||
... '-mfoo']) | ||||
... runcommand(server, ['verify']) | ||||
*** runcommand commit --config hooks.pretxncommit=false -mfoo | ||||
transaction abort! | ||||
rollback completed | ||||
abort: pretxncommit hook exited with status 1 | ||||
[255] | ||||
*** runcommand verify | ||||
checking changesets | ||||
checking manifests | ||||
crosschecking files in changesets and manifests | ||||
checking files | ||||
1 files, 2 changesets, 2 total revisions | ||||
$ hg revert --no-backup -aq | ||||
Durham Goode
|
r22955 | $ cat >> .hg/hgrc << EOF | ||
> [experimental] | ||||
> evolution=createmarkers | ||||
Yuya Nishihara
|
r22568 | > EOF | ||
>>> import os | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def obsolete(server): | ||||
... readchannel(server) | ||||
... | ||||
... runcommand(server, ['up', 'null']) | ||||
... runcommand(server, ['phase', '-df', 'tip']) | ||||
... cmd = 'hg debugobsolete `hg log -r tip --template {node}`' | ||||
... if os.name == 'nt': | ||||
... cmd = 'sh -c "%s"' % cmd # run in sh, not cmd.exe | ||||
... os.system(cmd) | ||||
... runcommand(server, ['log', '--hidden']) | ||||
... runcommand(server, ['log']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand up null | ||
Yuya Nishihara
|
r22567 | 0 files updated, 0 files merged, 1 files removed, 0 files unresolved | ||
Yuya Nishihara
|
r22572 | *** runcommand phase -df tip | ||
*** runcommand log --hidden | ||||
Yuya Nishihara
|
r22567 | changeset: 1:731265503d86 | ||
tag: tip | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: . | ||||
changeset: 0:eff892de26ec | ||||
bookmark: bm1 | ||||
bookmark: bm2 | ||||
bookmark: bm3 | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: 1 | ||||
Yuya Nishihara
|
r22572 | *** runcommand log | ||
Yuya Nishihara
|
r22567 | changeset: 0:eff892de26ec | ||
bookmark: bm1 | ||||
bookmark: bm2 | ||||
bookmark: bm3 | ||||
tag: tip | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: 1 | ||||
Yuya Nishihara
|
r22568 | |||
$ cat <<EOF >> .hg/hgrc | ||||
> [extensions] | ||||
> mq = | ||||
> EOF | ||||
>>> import os | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def mqoutsidechanges(server): | ||||
... readchannel(server) | ||||
... | ||||
... # load repo.mq | ||||
... runcommand(server, ['qapplied']) | ||||
... os.system('hg qnew 0.diff') | ||||
... # repo.mq should be invalidated | ||||
... runcommand(server, ['qapplied']) | ||||
... | ||||
... runcommand(server, ['qpop', '--all']) | ||||
... os.system('hg qqueue --create foo') | ||||
... # repo.mq should be recreated to point to new queue | ||||
... runcommand(server, ['qqueue', '--active']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand qapplied | ||
*** runcommand qapplied | ||||
Yuya Nishihara
|
r22567 | 0.diff | ||
Yuya Nishihara
|
r22572 | *** runcommand qpop --all | ||
Yuya Nishihara
|
r22567 | popping 0.diff | ||
patch queue now empty | ||||
Yuya Nishihara
|
r22572 | *** runcommand qqueue --active | ||
Yuya Nishihara
|
r22567 | foo | ||
Yuya Nishihara
|
r22568 | |||
$ cat <<EOF > dbgui.py | ||||
Yuya Nishihara
|
r23324 | > import os, sys | ||
Yuya Nishihara
|
r22568 | > from mercurial import cmdutil, commands | ||
> cmdtable = {} | ||||
> command = cmdutil.command(cmdtable) | ||||
> @command("debuggetpass", norepo=True) | ||||
> def debuggetpass(ui): | ||||
> ui.write("%s\\n" % ui.getpass()) | ||||
Yuya Nishihara
|
r22783 | > @command("debugprompt", norepo=True) | ||
> def debugprompt(ui): | ||||
> ui.write("%s\\n" % ui.prompt("prompt:")) | ||||
Yuya Nishihara
|
r23324 | > @command("debugreadstdin", norepo=True) | ||
> def debugreadstdin(ui): | ||||
> ui.write("read: %r\n" % sys.stdin.read(1)) | ||||
> @command("debugwritestdout", norepo=True) | ||||
> def debugwritestdout(ui): | ||||
> os.write(1, "low-level stdout fd and\n") | ||||
> sys.stdout.write("stdout should be redirected to /dev/null\n") | ||||
> sys.stdout.flush() | ||||
Yuya Nishihara
|
r22568 | > EOF | ||
$ cat <<EOF >> .hg/hgrc | ||||
> [extensions] | ||||
> dbgui = dbgui.py | ||||
> EOF | ||||
>>> import cStringIO | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def getpass(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['debuggetpass', '--config', | ||||
... 'ui.interactive=True'], | ||||
... input=cStringIO.StringIO('1234\n')) | ||||
Yuya Nishihara
|
r22783 | ... runcommand(server, ['debugprompt', '--config', | ||
... 'ui.interactive=True'], | ||||
... input=cStringIO.StringIO('5678\n')) | ||||
Yuya Nishihara
|
r23324 | ... runcommand(server, ['debugreadstdin']) | ||
... runcommand(server, ['debugwritestdout']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand debuggetpass --config ui.interactive=True | ||
Yuya Nishihara
|
r22567 | password: 1234 | ||
Yuya Nishihara
|
r22783 | *** runcommand debugprompt --config ui.interactive=True | ||
prompt: 5678 | ||||
Yuya Nishihara
|
r23324 | *** runcommand debugreadstdin | ||
read: '' | ||||
*** runcommand debugwritestdout | ||||
Yuya Nishihara
|
r22568 | |||
Yuya Nishihara
|
r23322 | run commandserver in commandserver, which is silly but should work: | ||
>>> import cStringIO | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def nested(server): | ||||
... print '%c, %r' % readchannel(server) | ||||
... class nestedserver(object): | ||||
... stdin = cStringIO.StringIO('getencoding\n') | ||||
... stdout = cStringIO.StringIO() | ||||
... runcommand(server, ['serve', '--cmdserver', 'pipe'], | ||||
... output=nestedserver.stdout, input=nestedserver.stdin) | ||||
... nestedserver.stdout.seek(0) | ||||
... print '%c, %r' % readchannel(nestedserver) # hello | ||||
... print '%c, %r' % readchannel(nestedserver) # getencoding | ||||
o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob) | ||||
*** runcommand serve --cmdserver pipe | ||||
o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob) | ||||
r, '*' (glob) | ||||
Yuya Nishihara
|
r22568 | |||
start without repository: | ||||
$ cd .. | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def hellomessage(server): | ||||
... ch, data = readchannel(server) | ||||
Yuya Nishihara
|
r22571 | ... print '%c, %r' % (ch, data) | ||
Yuya Nishihara
|
r22568 | ... # run an arbitrary command to make sure the next thing the server | ||
... # sends isn't part of the hello message | ||||
... runcommand(server, ['id']) | ||||
Yuya Nishihara
|
r23036 | o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob) | ||
Yuya Nishihara
|
r22572 | *** runcommand id | ||
Yuya Nishihara
|
r22567 | abort: there is no Mercurial repository here (.hg not found) | ||
[255] | ||||
Yuya Nishihara
|
r22568 | |||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def startwithoutrepo(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['init', 'repo2']) | ||||
... runcommand(server, ['id', '-R', 'repo2']) | ||||
Yuya Nishihara
|
r22572 | *** runcommand init repo2 | ||
*** runcommand id -R repo2 | ||||
Yuya Nishihara
|
r22567 | 000000000000 tip | ||
Yuya Nishihara
|
r22994 | |||
Yuya Nishihara
|
r26142 | don't fall back to cwd if invalid -R path is specified (issue4805): | ||
$ cd repo | ||||
$ hg serve --cmdserver pipe -R ../nonexistent | ||||
abort: repository ../nonexistent not found! | ||||
[255] | ||||
$ cd .. | ||||
Yuya Nishihara
|
r22994 | unix domain socket: | ||
$ cd repo | ||||
$ hg update -q | ||||
Matt Mackall
|
r23095 | #if unix-socket unix-permissions | ||
Yuya Nishihara
|
r22994 | |||
>>> import cStringIO | ||||
>>> from hgclient import unixserver, readchannel, runcommand, check | ||||
>>> server = unixserver('.hg/server.sock', '.hg/server.log') | ||||
>>> def hellomessage(conn): | ||||
... ch, data = readchannel(conn) | ||||
... print '%c, %r' % (ch, data) | ||||
... runcommand(conn, ['id']) | ||||
>>> check(hellomessage, server.connect) | ||||
Yuya Nishihara
|
r23036 | o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob) | ||
Yuya Nishihara
|
r22994 | *** runcommand id | ||
eff892de26ec tip bm1/bm2/bm3 | ||||
>>> def unknowncommand(conn): | ||||
... readchannel(conn) | ||||
... conn.stdin.write('unknowncommand\n') | ||||
>>> check(unknowncommand, server.connect) # error sent to server.log | ||||
>>> def serverinput(conn): | ||||
... readchannel(conn) | ||||
... patch = """ | ||||
... # HG changeset patch | ||||
... # User test | ||||
... # Date 0 0 | ||||
... 2 | ||||
... | ||||
... diff -r eff892de26ec -r 1ed24be7e7a0 a | ||||
... --- a/a | ||||
... +++ b/a | ||||
... @@ -1,1 +1,2 @@ | ||||
... 1 | ||||
... +2 | ||||
... """ | ||||
... runcommand(conn, ['import', '-'], input=cStringIO.StringIO(patch)) | ||||
... runcommand(conn, ['log', '-rtip', '-q']) | ||||
>>> check(serverinput, server.connect) | ||||
*** runcommand import - | ||||
applying patch from stdin | ||||
*** runcommand log -rtip -q | ||||
2:1ed24be7e7a0 | ||||
>>> server.shutdown() | ||||
$ cat .hg/server.log | ||||
listening at .hg/server.sock | ||||
abort: unknown command unknowncommand | ||||
killed! | ||||
Yuya Nishihara
|
r28511 | $ rm .hg/server.log | ||
if server crashed before hello, traceback will be sent to 'e' channel as | ||||
last ditch: | ||||
$ cat <<EOF >> .hg/hgrc | ||||
> [cmdserver] | ||||
> log = inexistent/path.log | ||||
> EOF | ||||
>>> from hgclient import unixserver, readchannel, check | ||||
>>> server = unixserver('.hg/server.sock', '.hg/server.log') | ||||
>>> def earlycrash(conn): | ||||
... while True: | ||||
... try: | ||||
... ch, data = readchannel(conn) | ||||
... if not data.startswith(' '): | ||||
... print '%c, %r' % (ch, data) | ||||
... except EOFError: | ||||
... break | ||||
>>> check(earlycrash, server.connect) | ||||
e, 'Traceback (most recent call last):\n' | ||||
e, "IOError: *" (glob) | ||||
>>> server.shutdown() | ||||
$ cat .hg/server.log | grep -v '^ ' | ||||
listening at .hg/server.sock | ||||
Traceback (most recent call last): | ||||
IOError: * (glob) | ||||
killed! | ||||
Matt Mackall
|
r23095 | #endif | ||
#if no-unix-socket | ||||
Yuya Nishihara
|
r22994 | |||
$ hg serve --cmdserver unix -a .hg/server.sock | ||||
abort: unsupported platform | ||||
[255] | ||||
#endif | ||||
FUJIWARA Katsunori
|
r28265 | |||
$ cd .. | ||||
Test that accessing to invalid changelog cache is avoided at | ||||
subsequent operations even if repo object is reused even after failure | ||||
of transaction (see 0a7610758c42 also) | ||||
"hg log" after failure of transaction is needed to detect invalid | ||||
cache in repoview: this can't detect by "hg verify" only. | ||||
Combination of "finalization" and "empty-ness of changelog" (2 x 2 = | ||||
4) are tested, because '00changelog.i' are differently changed in each | ||||
cases. | ||||
$ cat > $TESTTMP/failafterfinalize.py <<EOF | ||||
> # extension to abort transaction after finalization forcibly | ||||
> from mercurial import commands, error, extensions, lock as lockmod | ||||
> def fail(tr): | ||||
> raise error.Abort('fail after finalization') | ||||
> def reposetup(ui, repo): | ||||
> class failrepo(repo.__class__): | ||||
> def commitctx(self, ctx, error=False): | ||||
> if self.ui.configbool('failafterfinalize', 'fail'): | ||||
> # 'sorted()' by ASCII code on category names causes | ||||
> # invoking 'fail' after finalization of changelog | ||||
> # using "'cl-%i' % id(self)" as category name | ||||
> self.currenttransaction().addfinalize('zzzzzzzz', fail) | ||||
> return super(failrepo, self).commitctx(ctx, error) | ||||
> repo.__class__ = failrepo | ||||
> EOF | ||||
$ hg init repo3 | ||||
$ cd repo3 | ||||
$ cat <<EOF >> $HGRCPATH | ||||
> [ui] | ||||
> logtemplate = {rev} {desc|firstline} ({files})\n | ||||
> | ||||
> [extensions] | ||||
> failafterfinalize = $TESTTMP/failafterfinalize.py | ||||
> EOF | ||||
- test failure with "empty changelog" | ||||
$ echo foo > foo | ||||
$ hg add foo | ||||
(failuer before finalization) | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def abort(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['commit', | ||||
... '--config', 'hooks.pretxncommit=false', | ||||
... '-mfoo']) | ||||
... runcommand(server, ['log']) | ||||
... runcommand(server, ['verify', '-q']) | ||||
*** runcommand commit --config hooks.pretxncommit=false -mfoo | ||||
transaction abort! | ||||
rollback completed | ||||
abort: pretxncommit hook exited with status 1 | ||||
[255] | ||||
*** runcommand log | ||||
*** runcommand verify -q | ||||
(failuer after finalization) | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def abort(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['commit', | ||||
... '--config', 'failafterfinalize.fail=true', | ||||
... '-mfoo']) | ||||
... runcommand(server, ['log']) | ||||
... runcommand(server, ['verify', '-q']) | ||||
*** runcommand commit --config failafterfinalize.fail=true -mfoo | ||||
transaction abort! | ||||
rollback completed | ||||
abort: fail after finalization | ||||
[255] | ||||
*** runcommand log | ||||
*** runcommand verify -q | ||||
- test failure with "not-empty changelog" | ||||
$ echo bar > bar | ||||
$ hg add bar | ||||
$ hg commit -mbar bar | ||||
(failure before finalization) | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def abort(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['commit', | ||||
... '--config', 'hooks.pretxncommit=false', | ||||
... '-mfoo', 'foo']) | ||||
... runcommand(server, ['log']) | ||||
... runcommand(server, ['verify', '-q']) | ||||
*** runcommand commit --config hooks.pretxncommit=false -mfoo foo | ||||
transaction abort! | ||||
rollback completed | ||||
abort: pretxncommit hook exited with status 1 | ||||
[255] | ||||
*** runcommand log | ||||
0 bar (bar) | ||||
*** runcommand verify -q | ||||
(failure after finalization) | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def abort(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['commit', | ||||
... '--config', 'failafterfinalize.fail=true', | ||||
... '-mfoo', 'foo']) | ||||
... runcommand(server, ['log']) | ||||
... runcommand(server, ['verify', '-q']) | ||||
*** runcommand commit --config failafterfinalize.fail=true -mfoo foo | ||||
transaction abort! | ||||
rollback completed | ||||
abort: fail after finalization | ||||
[255] | ||||
*** runcommand log | ||||
0 bar (bar) | ||||
*** runcommand verify -q | ||||