Mercurial > hg
changeset 20650:e811b93f2cb1
cmdserver: allow to start server without repository
Typical use case is to clone repository through command server. Clone may
require user interaction, so command-server protocol is beneficial over
raw stdio channels.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Mon, 03 Mar 2014 23:21:24 +0900 |
parents | 9524938c8ff8 |
children | c1a52dd56eb4 |
files | mercurial/commands.py mercurial/commandserver.py tests/test-commandserver.py tests/test-commandserver.py.out |
diffstat | 4 files changed, 38 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/commands.py Mon Mar 03 23:11:17 2014 +0900 +++ b/mercurial/commands.py Mon Mar 03 23:21:24 2014 +0900 @@ -5168,7 +5168,6 @@ s.serve_forever() if opts["cmdserver"]: - checkrepo() s = commandserver.server(ui, repo, opts["cmdserver"]) return s.serve()
--- a/mercurial/commandserver.py Mon Mar 03 23:11:17 2014 +0900 +++ b/mercurial/commandserver.py Mon Mar 03 23:21:24 2014 +0900 @@ -142,11 +142,15 @@ else: logfile = open(logpath, 'a') - # the ui here is really the repo ui so take its baseui so we don't end - # up with its local configuration - self.ui = repo.baseui - self.repo = repo - self.repoui = repo.ui + if repo: + # the ui here is really the repo ui so take its baseui so we don't + # end up with its local configuration + self.ui = repo.baseui + self.repo = repo + self.repoui = repo.ui + else: + self.ui = ui + self.repo = self.repoui = None if mode == 'pipe': self.cerr = channeledoutput(sys.stderr, sys.stdout, 'e') @@ -183,12 +187,13 @@ # copy the uis so changes (e.g. --config or --verbose) don't # persist between requests copiedui = self.ui.copy() - self.repo.baseui = copiedui - # clone ui without using ui.copy because this is protected - repoui = self.repoui.__class__(self.repoui) - repoui.copy = copiedui.copy # redo copy protection - self.repo.ui = self.repo.dirstate._ui = repoui - self.repo.invalidateall() + if self.repo: + self.repo.baseui = copiedui + # clone ui without using ui.copy because this is protected + repoui = self.repoui.__class__(self.repoui) + repoui.copy = copiedui.copy # redo copy protection + self.repo.ui = self.repo.dirstate._ui = repoui + self.repo.invalidateall() req = dispatch.request(args[:], copiedui, self.repo, self.cin, self.cout, self.cerr)
--- a/tests/test-commandserver.py Mon Mar 03 23:11:17 2014 +0900 +++ b/tests/test-commandserver.py Mon Mar 03 23:21:24 2014 +0900 @@ -294,6 +294,11 @@ # repo.mq should be recreated to point to new queue runcommand(server, ['qqueue', '--active']) +def startwithoutrepo(server): + readchannel(server) + runcommand(server, ['init', 'repo2']) + runcommand(server, ['id', '-R', 'repo2']) + if __name__ == '__main__': os.system('hg init repo') os.chdir('repo') @@ -329,3 +334,7 @@ hgrc.write('[extensions]\nmq=\n') hgrc.close() check(mqoutsidechanges) + + os.chdir('..') + check(hellomessage) + check(startwithoutrepo)
--- a/tests/test-commandserver.py.out Mon Mar 03 23:11:17 2014 +0900 +++ b/tests/test-commandserver.py.out Mon Mar 03 23:21:24 2014 +0900 @@ -237,3 +237,16 @@ patch queue now empty runcommand qqueue --active foo + +testing hellomessage: + +o, 'capabilities: getencoding runcommand\nencoding: ***' + runcommand id +abort: there is no Mercurial repository here (.hg not found) + [255] + +testing startwithoutrepo: + + runcommand init repo2 + runcommand id -R repo2 +000000000000 tip