Patchwork [2,of,2] configitems: add alias support in config

login
register
mail settings
Submitter David Demelier
Date July 3, 2017, 1:55 p.m.
Message ID <160c36de3dd036409b39.1499090147@fedy>
Download mbox | patch
Permalink /patch/21956/
State Changes Requested
Headers show

Comments

David Demelier - July 3, 2017, 1:55 p.m.
# HG changeset patch
# User David Demelier <demelier.david@gmail.com>
# Date 1499079875 -7200
#      Mon Jul 03 13:04:35 2017 +0200
# Node ID 160c36de3dd036409b3954b95290f4a22493ac64
# Parent  2d7f5d2ab80c85251baea4fb49c13aac64f07763
configitems: add alias support in config

Aliases define optional alternatives to existing options. For example the old
option ui.user was deprecated and replaced by ui.username. With this mechanism,
it's even possible to create an alias to an option in a different section.

Add ui.user as alias to ui.username as an example of this concept.

The old alternates principle in ui.config is removed as it was used only for
this option.
Yuya Nishihara - July 4, 2017, 1:44 p.m.
On Mon, 03 Jul 2017 15:55:47 +0200, David Demelier wrote:
> # HG changeset patch
> # User David Demelier <demelier.david@gmail.com>
> # Date 1499079875 -7200
> #      Mon Jul 03 13:04:35 2017 +0200
> # Node ID 160c36de3dd036409b3954b95290f4a22493ac64
> # Parent  2d7f5d2ab80c85251baea4fb49c13aac64f07763
> configitems: add alias support in config
> 
> Aliases define optional alternatives to existing options. For example the old
> option ui.user was deprecated and replaced by ui.username. With this mechanism,
> it's even possible to create an alias to an option in a different section.
> 
> Add ui.user as alias to ui.username as an example of this concept.
> 
> The old alternates principle in ui.config is removed as it was used only for
> this option.

This looks good to me. Does this depend on the previous patch? If not, I'll
queue it.

Please flag as an "(API)" change if you resend.

> diff -r 2d7f5d2ab80c -r 160c36de3dd0 tests/test-config-alias.t
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/tests/test-config-alias.t	Mon Jul 03 13:04:35 2017 +0200

Perhaps the test could be folded into test-config.t, which is pretty small.
David Demelier - July 4, 2017, 3:09 p.m.
Le 04/07/2017 à 15:44, Yuya Nishihara a écrit :
> On Mon, 03 Jul 2017 15:55:47 +0200, David Demelier wrote:
>> # HG changeset patch
>> # User David Demelier <demelier.david@gmail.com>
>> # Date 1499079875 -7200
>> #      Mon Jul 03 13:04:35 2017 +0200
>> # Node ID 160c36de3dd036409b3954b95290f4a22493ac64
>> # Parent  2d7f5d2ab80c85251baea4fb49c13aac64f07763
>> configitems: add alias support in config
>>
>> Aliases define optional alternatives to existing options. For example the old
>> option ui.user was deprecated and replaced by ui.username. With this mechanism,
>> it's even possible to create an alias to an option in a different section.
>>
>> Add ui.user as alias to ui.username as an example of this concept.
>>
>> The old alternates principle in ui.config is removed as it was used only for
>> this option.
> 
> This looks good to me. Does this depend on the previous patch? If not, I'll
> queue it.
> 

It does not but tests for hgweb_mod.py will trigger a warning.

I'm actually chatting with Pierre-Yves about your other question because 
I'm not much fluent with python :)

Regards,

Patch

diff -r 2d7f5d2ab80c -r 160c36de3dd0 mercurial/configitems.py
--- a/mercurial/configitems.py	Wed Jun 28 12:37:31 2017 +0200
+++ b/mercurial/configitems.py	Mon Jul 03 13:04:35 2017 +0200
@@ -32,12 +32,14 @@ 
     :section: the official config section where to find this item,
        :name: the official name within the section,
     :default: default value for this item,
+    :alias: optional list of tuples as alternatives.
     """
 
-    def __init__(self, section, name, default=None):
+    def __init__(self, section, name, default=None, alias=()):
         self.section = section
         self.name = name
         self.default = default
+        self.alias = list(alias)
 
 coreitems = {}
 
@@ -68,3 +70,6 @@ 
 coreconfigitem('ui', 'quiet',
     default=False,
 )
+coreconfigitem('ui', 'username',
+    alias=[('ui', 'user')]
+)
diff -r 2d7f5d2ab80c -r 160c36de3dd0 mercurial/ui.py
--- a/mercurial/ui.py	Wed Jun 28 12:37:31 2017 +0200
+++ b/mercurial/ui.py	Mon Jul 03 13:04:35 2017 +0200
@@ -448,38 +448,39 @@ 
 
     def _config(self, section, name, default=_unset, untrusted=False):
         value = default
-        if isinstance(name, list):
-            alternates = name
-        else:
-            item = self._knownconfig.get(section, {}).get(name)
-            if default is _unset:
-                if item is None:
-                    value = default
-                elif callable(item.default):
+        item = self._knownconfig.get(section, {}).get(name)
+        alternates = [(section, name)]
+
+        if item is not None:
+            alternates.extend(item.alias)
+
+        if default is _unset:
+            if item is None:
+                value = default
+            elif callable(item.default):
                     value = item.default()
-                else:
-                    value = item.default
-            elif item is not None:
-                msg = ("specifying a default value for a registered "
-                       "config item: '%s.%s' '%s'")
-                msg %= (section, name, default)
-                self.develwarn(msg, 2, 'warn-config-default')
+            else:
+                value = item.default
+        elif item is not None:
+            msg = ("specifying a default value for a registered "
+                   "config item: '%s.%s' '%s'")
+            msg %= (section, name, default)
+            self.develwarn(msg, 2, 'warn-config-default')
 
-            alternates = [name]
-
-        for n in alternates:
-            candidate = self._data(untrusted).get(section, n, None)
+        for s, n in alternates:
+            candidate = self._data(untrusted).get(s, n, None)
             if candidate is not None:
                 value = candidate
+                section = s
                 name = n
                 break
 
         if self.debugflag and not untrusted and self._reportuntrusted:
-            for n in alternates:
-                uvalue = self._ucfg.get(section, n)
+            for s, n in alternates:
+                uvalue = self._ucfg.get(s, n)
                 if uvalue is not None and uvalue != value:
                     self.debug("ignoring untrusted configuration option "
-                               "%s.%s = %s\n" % (section, n, uvalue))
+                               "%s.%s = %s\n" % (s, n, uvalue))
         return value
 
     def configsuboptions(self, section, name, default=_unset, untrusted=False):
@@ -744,7 +745,7 @@ 
         """
         user = encoding.environ.get("HGUSER")
         if user is None:
-            user = self.config("ui", ["username", "user"])
+            user = self.config("ui", "username")
             if user is not None:
                 user = os.path.expandvars(user)
         if user is None:
diff -r 2d7f5d2ab80c -r 160c36de3dd0 tests/test-config-alias.t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-config-alias.t	Mon Jul 03 13:04:35 2017 +0200
@@ -0,0 +1,32 @@ 
+verify that aliases are evaluated as well
+
+  $ hg init aliastest
+  $ cd aliastest
+  $ cat > .hg/hgrc << EOF
+  > [ui]
+  > user = repo user
+  > EOF
+  $ touch index
+  $ unset HGUSER
+  $ hg ci -Am test
+  adding index
+  $ hg log --template '{author}\n'
+  repo user
+  $ cd ..
+
+alias has lower priority
+
+  $ hg init aliaspriority
+  $ cd aliaspriority
+  $ cat > .hg/hgrc << EOF
+  > [ui]
+  > user = alias user
+  > username = repo user
+  > EOF
+  $ touch index
+  $ unset HGUSER
+  $ hg ci -Am test
+  adding index
+  $ hg log --template '{author}\n'
+  repo user
+  $ cd ..