tests/test-commandserver.t
changeset 22568 78b99149ed8a
parent 22567 f9a4a035003d
child 22570 db497a1ef1c1
--- a/tests/test-commandserver.t	Sun Sep 28 14:27:40 2014 +0900
+++ b/tests/test-commandserver.t	Sun Sep 28 16:05:37 2014 +0900
@@ -1,14 +1,64 @@
-#require false
+#if windows
+  $ PYTHONPATH="$TESTDIR/../contrib;$PYTHONPATH"
+#else
+  $ PYTHONPATH="$TESTDIR/../contrib:$PYTHONPATH"
+#endif
+  $ export PYTHONPATH
+
+  $ hg init repo
+  $ cd repo
+
+  >>> import re
+  >>> from hgclient import readchannel, runcommand, check
+  >>> @check
+  ... def hellomessage(server):
+  ...     ch, data = readchannel(server)
+  ...     # escaping python tests output not supported
+  ...     print '%c, %r' % (ch, re.sub('encoding: [a-zA-Z0-9-]+',
+  ...                                  'encoding: ***', data))
+  ... 
+  ...     # run an arbitrary command to make sure the next thing the server
+  ...     # sends isn't part of the hello message
+  ...     runcommand(server, ['id'])
   
   testing hellomessage:
   
   o, 'capabilities: getencoding runcommand\nencoding: ***'
    runcommand id
   000000000000 tip
+
+  >>> from hgclient import check
+  >>> @check
+  ... def unknowncommand(server):
+  ...     server.stdin.write('unknowncommand\n')
   
   testing unknowncommand:
   
   abort: unknown command unknowncommand
+
+  >>> 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'])
   
   testing checkruncommand:
   
@@ -47,10 +97,45 @@
    runcommand id -runknown
   abort: unknown revision 'unknown'!
    [255]
+
+  >>> 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()
   
   testing inputeof:
   
   server exit code = 1
+
+  >>> 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'])
   
   testing serverinput:
   
@@ -63,6 +148,17 @@
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     1
   
+
+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'])
   
   testing cwd:
   
@@ -70,6 +166,29 @@
   ? bar
    runcommand st foo/bar
   ? foo/bar
+
+  $ 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'])
   
   testing localhgrc:
   
@@ -94,13 +213,51 @@
   ui.interactive=False
   ui.mergemarkers=detailed
   ui.nontty=true
+
+  $ 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'))
   
   testing hookoutput:
   
-   runcommand --config hooks.pre-identify=python:test-commandserver.hook id
+   runcommand --config hooks.pre-identify=python:hook.hook id
   hook talking
   now try to read something: 'some input'
   eff892de26ec tip
+
+  $ 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'])
   
   testing outsidechanges:
   
@@ -114,6 +271,29 @@
   summary:     2
   
    runcommand status
+
+  >>> 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'])
   
   testing bookmarks:
   
@@ -131,6 +311,15 @@
      bm1                       1:d3a0a68be6de
      bm2                       1:d3a0a68be6de
    * bm3                       2:aef17e88f5f0
+
+  >>> 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'])
   
   testing tagscache:
   
@@ -138,6 +327,15 @@
   
    runcommand id -t -r 0
   foo
+
+  >>> 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', '.'])
   
   testing setphase:
   
@@ -145,6 +343,16 @@
   3: draft
    runcommand phase -r .
   3: public
+
+  $ 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', '.'])
   
   testing rollback:
   
@@ -157,6 +365,16 @@
   working directory now based on revision 3
    runcommand phase -r .
   3: public
+
+  >>> 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')
   
   testing branch:
   
@@ -168,6 +386,21 @@
   foo
   marked working directory as branch default
   (branches are permanent and global, did you want a bookmark?)
+
+  $ 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'])
   
   testing hgignore:
   
@@ -175,6 +408,31 @@
   adding .hgignore
    runcommand status -i -u
   I ignored-file
+
+  >>> 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'])
   
   testing phasecacheafterstrip:
   
@@ -201,6 +459,30 @@
   5: public
    runcommand branches
   default                        1:731265503d86
+
+  $ 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'])
   
   testing obsolete:
   
@@ -232,6 +514,28 @@
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     1
   
+
+  $ 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'])
   
   testing mqoutsidechanges:
   
@@ -243,11 +547,51 @@
   patch queue now empty
    runcommand qqueue --active
   foo
+
+  $ 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'))
   
   testing getpass:
   
    runcommand debuggetpass --config ui.interactive=True
   password: 1234
+
+
+start without repository:
+
+  $ cd ..
+
+  >>> import re
+  >>> from hgclient import readchannel, runcommand, check
+  >>> @check
+  ... def hellomessage(server):
+  ...     ch, data = readchannel(server)
+  ...     # escaping python tests output not supported
+  ...     print '%c, %r' % (ch, re.sub('encoding: [a-zA-Z0-9-]+',
+  ...                                  'encoding: ***', data))
+  ... 
+  ...     # run an arbitrary command to make sure the next thing the server
+  ...     # sends isn't part of the hello message
+  ...     runcommand(server, ['id'])
   
   testing hellomessage:
   
@@ -255,6 +599,13 @@
    runcommand id
   abort: there is no Mercurial repository here (.hg not found)
    [255]
+
+  >>> from hgclient import readchannel, runcommand, check
+  >>> @check
+  ... def startwithoutrepo(server):
+  ...     readchannel(server)
+  ...     runcommand(server, ['init', 'repo2'])
+  ...     runcommand(server, ['id', '-R', 'repo2'])
   
   testing startwithoutrepo: