[PATCH 2 of 2 RFC] cmdserver: allow to start server without repository

Augie Fackler raf at durin42.com
Thu Mar 6 09:37:03 CST 2014


On Thu, Mar 06, 2014 at 10:02:03PM +0900, Yuya Nishihara wrote:
> # HG changeset patch
> # User Yuya Nishihara <yuya at tcha.org>
> # Date 1393856484 -32400
> #      Mon Mar 03 23:21:24 2014 +0900
> # Node ID e80644fac8a3fb63a420aefd68253e251a954253
> # Parent  f5a932e110053629281ab0597349dc78a045418e
> cmdserver: allow to start server without repository

Queueing these, thanks.

>
> 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.
>
> diff --git a/mercurial/commands.py b/mercurial/commands.py
> --- a/mercurial/commands.py
> +++ b/mercurial/commands.py
> @@ -5168,7 +5168,6 @@ def serve(ui, repo, **opts):
>          s.serve_forever()
>
>      if opts["cmdserver"]:
> -        checkrepo()
>          s = commandserver.server(ui, repo, opts["cmdserver"])
>          return s.serve()
>
> diff --git a/mercurial/commandserver.py b/mercurial/commandserver.py
> --- a/mercurial/commandserver.py
> +++ b/mercurial/commandserver.py
> @@ -142,11 +142,15 @@ class server(object):
>              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 @@ class server(object):
>          # 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)
> diff --git a/tests/test-commandserver.py b/tests/test-commandserver.py
> --- a/tests/test-commandserver.py
> +++ b/tests/test-commandserver.py
> @@ -294,6 +294,11 @@ def mqoutsidechanges(server):
>      # 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 @@ if __name__ == '__main__':
>      hgrc.write('[extensions]\nmq=\n')
>      hgrc.close()
>      check(mqoutsidechanges)
> +
> +    os.chdir('..')
> +    check(hellomessage)
> +    check(startwithoutrepo)
> diff --git a/tests/test-commandserver.py.out b/tests/test-commandserver.py.out
> --- a/tests/test-commandserver.py.out
> +++ b/tests/test-commandserver.py.out
> @@ -237,3 +237,16 @@ popping 0.diff
>  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
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list