test-commandserver.t
543 lines
| 15.4 KiB
| text/troff
|
Tads3Lexer
/ tests / test-commandserver.t
|
r22568 | #if windows | ||
$ PYTHONPATH="$TESTDIR/../contrib;$PYTHONPATH" | ||||
#else | ||||
$ PYTHONPATH="$TESTDIR/../contrib:$PYTHONPATH" | ||||
#endif | ||||
$ export PYTHONPATH | ||||
$ hg init repo | ||||
$ cd repo | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def hellomessage(server): | ||||
... ch, data = readchannel(server) | ||||
|
r22571 | ... print '%c, %r' % (ch, data) | ||
|
r22568 | ... # run an arbitrary command to make sure the next thing the server | ||
... # sends isn't part of the hello message | ||||
... runcommand(server, ['id']) | ||||
|
r22571 | o, 'capabilities: getencoding runcommand\nencoding: *' (glob) | ||
|
r22567 | runcommand id | ||
000000000000 tip | ||||
|
r22568 | |||
>>> from hgclient import check | ||||
>>> @check | ||||
... def unknowncommand(server): | ||||
... server.stdin.write('unknowncommand\n') | ||||
|
r22567 | abort: unknown command unknowncommand | ||
|
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']) | ||||
|
r22567 | runcommand | ||
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 | ||||
merge merge working directory with another revision | ||||
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) | ||||
runcommand id --quiet | ||||
000000000000 | ||||
runcommand id | ||||
000000000000 tip | ||||
runcommand id --config ui.quiet=True | ||||
000000000000 | ||||
runcommand id | ||||
000000000000 tip | ||||
runcommand id -runknown | ||||
abort: unknown revision 'unknown'! | ||||
[255] | ||||
|
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() | ||||
|
r22567 | server exit code = 1 | ||
|
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']) | ||||
|
r22567 | runcommand import - | ||
applying patch from stdin | ||||
runcommand log | ||||
changeset: 0:eff892de26ec | ||||
tag: tip | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: 1 | ||||
|
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']) | ||||
|
r22567 | runcommand --cwd foo st bar | ||
? bar | ||||
runcommand st foo/bar | ||||
? foo/bar | ||||
|
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']) | ||||
|
r22567 | runcommand showconfig | ||
bundle.mainreporoot=$TESTTMP/repo | ||||
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.foo=bar | ||||
ui.nontty=true | ||||
runcommand init foo | ||||
runcommand -R foo showconfig ui defaults | ||||
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 | ||||
|
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')) | ||||
runcommand --config hooks.pre-identify=python:hook.hook id | ||||
|
r22567 | hook talking | ||
now try to read something: 'some input' | ||||
eff892de26ec tip | ||||
|
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']) | ||||
|
r22567 | runcommand status | ||
M a | ||||
runcommand tip | ||||
changeset: 1:d3a0a68be6de | ||||
tag: tip | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: 2 | ||||
runcommand status | ||||
|
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']) | ||||
|
r22567 | runcommand bookmarks | ||
no bookmarks set | ||||
runcommand bookmarks | ||||
bm1 1:d3a0a68be6de | ||||
bm2 1:d3a0a68be6de | ||||
runcommand bookmarks | ||||
* bm1 1:d3a0a68be6de | ||||
bm2 1:d3a0a68be6de | ||||
runcommand bookmarks bm3 | ||||
runcommand commit -Amm | ||||
runcommand bookmarks | ||||
bm1 1:d3a0a68be6de | ||||
bm2 1:d3a0a68be6de | ||||
* bm3 2:aef17e88f5f0 | ||||
|
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']) | ||||
|
r22567 | runcommand id -t -r 0 | ||
runcommand id -t -r 0 | ||||
foo | ||||
|
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', '.']) | ||||
|
r22567 | runcommand phase -r . | ||
3: draft | ||||
runcommand phase -r . | ||||
3: public | ||||
|
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', '.']) | ||||
|
r22567 | runcommand phase -r . -p | ||
no phases changed | ||||
[1] | ||||
runcommand commit -Am. | ||||
runcommand rollback | ||||
repository tip rolled back to revision 3 (undo commit) | ||||
working directory now based on revision 3 | ||||
runcommand phase -r . | ||||
3: public | ||||
|
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') | ||||
|
r22567 | runcommand branch | ||
default | ||||
marked working directory as branch foo | ||||
(branches are permanent and global, did you want a bookmark?) | ||||
runcommand branch | ||||
foo | ||||
marked working directory as branch default | ||||
(branches are permanent and global, did you want a bookmark?) | ||||
|
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']) | ||||
|
r22567 | runcommand commit -Am. | ||
adding .hgignore | ||||
runcommand status -i -u | ||||
I ignored-file | ||||
|
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']) | ||||
|
r22567 | runcommand update -C 0 | ||
1 files updated, 0 files merged, 2 files removed, 0 files unresolved | ||||
(leaving bookmark bm3) | ||||
runcommand commit -Am. a | ||||
created new head | ||||
runcommand log -Gq | ||||
@ 5:731265503d86 | ||||
| | ||||
| o 4:7966c8e3734d | ||||
| | | ||||
| o 3:b9b85890c400 | ||||
| | | ||||
| o 2:aef17e88f5f0 | ||||
| | | ||||
| o 1:d3a0a68be6de | ||||
|/ | ||||
o 0:eff892de26ec | ||||
runcommand phase -p . | ||||
runcommand phase . | ||||
5: public | ||||
runcommand branches | ||||
default 1:731265503d86 | ||||
|
r22568 | |||
$ cat <<EOF > obs.py | ||||
> import mercurial.obsolete | ||||
> mercurial.obsolete._enabled = True | ||||
> EOF | ||||
$ cat <<EOF >> .hg/hgrc | ||||
> [extensions] | ||||
> obs = obs.py | ||||
> 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']) | ||||
|
r22567 | runcommand up null | ||
0 files updated, 0 files merged, 1 files removed, 0 files unresolved | ||||
runcommand phase -df tip | ||||
runcommand log --hidden | ||||
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 | ||||
runcommand log | ||||
changeset: 0:eff892de26ec | ||||
bookmark: bm1 | ||||
bookmark: bm2 | ||||
bookmark: bm3 | ||||
tag: tip | ||||
user: test | ||||
date: Thu Jan 01 00:00:00 1970 +0000 | ||||
summary: 1 | ||||
|
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']) | ||||
|
r22567 | runcommand qapplied | ||
runcommand qapplied | ||||
0.diff | ||||
runcommand qpop --all | ||||
popping 0.diff | ||||
patch queue now empty | ||||
runcommand qqueue --active | ||||
foo | ||||
|
r22568 | |||
$ cat <<EOF > dbgui.py | ||||
> from mercurial import cmdutil, commands | ||||
> cmdtable = {} | ||||
> command = cmdutil.command(cmdtable) | ||||
> @command("debuggetpass", norepo=True) | ||||
> def debuggetpass(ui): | ||||
> ui.write("%s\\n" % ui.getpass()) | ||||
> 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')) | ||||
|
r22567 | runcommand debuggetpass --config ui.interactive=True | ||
password: 1234 | ||||
|
r22568 | |||
start without repository: | ||||
$ cd .. | ||||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def hellomessage(server): | ||||
... ch, data = readchannel(server) | ||||
|
r22571 | ... print '%c, %r' % (ch, data) | ||
|
r22568 | ... # run an arbitrary command to make sure the next thing the server | ||
... # sends isn't part of the hello message | ||||
... runcommand(server, ['id']) | ||||
|
r22571 | o, 'capabilities: getencoding runcommand\nencoding: *' (glob) | ||
|
r22567 | runcommand id | ||
abort: there is no Mercurial repository here (.hg not found) | ||||
[255] | ||||
|
r22568 | |||
>>> from hgclient import readchannel, runcommand, check | ||||
>>> @check | ||||
... def startwithoutrepo(server): | ||||
... readchannel(server) | ||||
... runcommand(server, ['init', 'repo2']) | ||||
... runcommand(server, ['id', '-R', 'repo2']) | ||||
|
r22567 | runcommand init repo2 | ||
runcommand id -R repo2 | ||||
000000000000 tip | ||||