Patchwork [5,of,5,V2] chgserver: make _renewui load repo and command line configs

login
register
mail settings
Submitter Jun Wu
Date Feb. 26, 2016, 3:36 p.m.
Message ID <ac5273f401959e4b5845.1456500984@x1c>
Download mbox | patch
Permalink /patch/13417/
State Accepted
Delegated to: Yuya Nishihara
Headers show

Comments

Jun Wu - Feb. 26, 2016, 3:36 p.m.
# HG changeset patch
# User Jun Wu <quark@fb.com>
# Date 1456500166 0
#      Fri Feb 26 15:22:46 2016 +0000
# Node ID ac5273f401959e4b584591363f1700ef7df56fe8
# Parent  93c4a18979328bf50acb2132c031d96fdda46bfc
chgserver: make _renewui load repo and command line configs

Before this patch, there is no way to load repo config in chgserver. This
patch revised _renewui to let it load repo config and take command line
flags passed into consideration.

The _renewui logic is not ideal at present because it's very tricky to know
what should copy and what should not from the old ui object to the new one.
This is partially because the current ui and config object design is not
ideal. In the future, we may want to avoid all ui or config copies.
Yuya Nishihara - Feb. 27, 2016, 7:25 a.m.
On Fri, 26 Feb 2016 15:36:24 +0000, Jun Wu wrote:
> # HG changeset patch
> # User Jun Wu <quark@fb.com>
> # Date 1456500166 0
> #      Fri Feb 26 15:22:46 2016 +0000
> # Node ID ac5273f401959e4b584591363f1700ef7df56fe8
> # Parent  93c4a18979328bf50acb2132c031d96fdda46bfc
> chgserver: make _renewui load repo and command line configs

Queued 1, 4 and 5, thanks. 3 looks good but it depends on 2.

> +def _renewui(srcui, args=None):
> +    if not args:
> +        args = []
> +
>      newui = srcui.__class__()
>      for a in ['fin', 'fout', 'ferr', 'environ']:
>          setattr(newui, a, getattr(srcui, a))
>      if util.safehasattr(srcui, '_csystem'):
>          newui._csystem = srcui._csystem
> +
> +    # load wd and repo config, copied from dispatch.py
> +    cwds = dispatch._earlygetopt(['--cwd'], args)
> +    cwd = cwds and os.path.realpath(cwds[-1]) or None
> +    rpath = dispatch._earlygetopt(["-R", "--repository", "--repo"], args)
> +    path, newui = dispatch._getlocal(newui, rpath, wd=cwd)
> +
> +    # internal config: extensions.chgserver
> +    # copy it. it can only be overrided from command line.
> +    newui.setconfig('extensions', 'chgserver',
> +                    srcui.config('extensions', 'chgserver'), '--config')
> +
> +    # command line args
> +    dispatch._parseconfig(newui, dispatch._earlygetopt(['--config'], args))
> +
>      # stolen from tortoisehg.util.copydynamicconfig()
>      for section, name, value in srcui.walkconfig():
>          source = srcui.configsource(section, name)
> -        if ':' in source:
> -            # path:line
> +        if ':' in source or source == '--config':
> +            # path:line or command line

'--config' would be lost if _renewui() is called without args, but I expect
the current use of _renewui() will be superseded by the config hash. So that's
okay.

Patch

diff --git a/hgext/chgserver.py b/hgext/chgserver.py
--- a/hgext/chgserver.py
+++ b/hgext/chgserver.py
@@ -238,17 +238,35 @@ 
 
     return chgui(srcui)
 
-def _renewui(srcui):
+def _renewui(srcui, args=None):
+    if not args:
+        args = []
+
     newui = srcui.__class__()
     for a in ['fin', 'fout', 'ferr', 'environ']:
         setattr(newui, a, getattr(srcui, a))
     if util.safehasattr(srcui, '_csystem'):
         newui._csystem = srcui._csystem
+
+    # load wd and repo config, copied from dispatch.py
+    cwds = dispatch._earlygetopt(['--cwd'], args)
+    cwd = cwds and os.path.realpath(cwds[-1]) or None
+    rpath = dispatch._earlygetopt(["-R", "--repository", "--repo"], args)
+    path, newui = dispatch._getlocal(newui, rpath, wd=cwd)
+
+    # internal config: extensions.chgserver
+    # copy it. it can only be overrided from command line.
+    newui.setconfig('extensions', 'chgserver',
+                    srcui.config('extensions', 'chgserver'), '--config')
+
+    # command line args
+    dispatch._parseconfig(newui, dispatch._earlygetopt(['--config'], args))
+
     # stolen from tortoisehg.util.copydynamicconfig()
     for section, name, value in srcui.walkconfig():
         source = srcui.configsource(section, name)
-        if ':' in source:
-            # path:line
+        if ':' in source or source == '--config':
+            # path:line or command line
             continue
         if source == 'none':
             # ui.configsource returns 'none' by default