[PATCH v3] hg: allow usage of XDG_CONFIG_HOME and $HOME/.config/hg/hgrc

David Demelier demelier.david at gmail.com
Fri Feb 10 03:19:14 EST 2017


Le 09/02/2017 à 17:22, Jun Wu a écrit :
> The XDG specification says:
>
>   All paths set in these environment variables must be absolute. If an
>   implementation encounters a relative path in any of these variables it
>   should consider the path invalid and ignore it.
>
> So it needs to be checked before use.

Yes, I forgot that detail, thanks!

>
>> +        path = os.path.join(home, 'hg/hgrc')
>> +        if os.path.isfile(path):
>> +            return [path]
>> +        else:
>> +            return [os.path.expanduser('~/.hgrc')]
>
> This introduces a race condition:
>
>   - hg: userrcpath() returns ~/.hgrc, but not $XDG_CONFIG_HOME/hg/hgrc
>   - outside: somebody renames ~/.hgrc to $XDG_CONFIG_HOME/hg/hgrc
>   - hg: user config file will be missed when actually reading the files
>

A bit paranoia but real.

Is the following applicable for a v4?

I've updated the code so that hg config --edit still create a ~/.hgrc 
file first if no file is found.

Using XDG_CONFIG_HOME as first choice would require creating the 
directories before the file.

I've updated the test to specify an absolute path as XDG_CONFIG_HOME as 
well.

# HG changeset patch
# User David Demelier <demelier.david at gmail.com>
# Date 1486485215 -3600
#      Tue Feb 07 17:33:35 2017 +0100
# Node ID 438873a0f0b7b7871ae1fb950ec9924f52871878
# Parent  1f51b4658f21bbb797e922d155c1046eddccf91d
hg: allow usage of XDG_CONFIG_HOME/hg/hgrc

Modern applications must use the following paths to store configuration 
files:

   - $XDG_CONFIG_HOME/hg/hgrc

For backward compatibility, ~/.hgrc is still tested first.

See https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html

diff -r 1f51b4658f21 -r 438873a0f0b7 mercurial/help/config.txt
--- a/mercurial/help/config.txt Thu Feb 02 14:19:48 2017 +0100
+++ b/mercurial/help/config.txt Tue Feb 07 17:33:35 2017 +0100
@@ -56,6 +56,7 @@

    - ``<repo>/.hg/hgrc`` (per-repository)
    - ``$HOME/.hgrc`` (per-user)
+  - ``${XDG_CONFIG_HOME:-$HOME/.config}/hg/hgrc`` (per-user)
    - ``<install-root>/etc/mercurial/hgrc`` (per-installation)
    - ``<install-root>/etc/mercurial/hgrc.d/*.rc`` (per-installation)
    - ``/etc/mercurial/hgrc`` (per-system)
diff -r 1f51b4658f21 -r 438873a0f0b7 mercurial/scmposix.py
--- a/mercurial/scmposix.py     Thu Feb 02 14:19:48 2017 +0100
+++ b/mercurial/scmposix.py     Tue Feb 07 17:33:35 2017 +0100
@@ -40,8 +40,15 @@
  def userrcpath():
      if pycompat.sysplatform == 'plan9':
          return [encoding.environ['home'] + '/lib/hgrc']
+    elif pycompat.sysplatform == 'darwin':
+        return [os.path.expanduser('~/.hgrc')]
      else:
-        return [os.path.expanduser('~/.hgrc')]
+        confighome = encoding.environ.get('XDG_CONFIG_HOME')
+        if confighome is None or not os.path.isabs(confighome):
+            confighome = os.path.expanduser('~/.config')
+
+        return [os.path.expanduser('~/.hgrc'),
+                os.path.join(confighome, 'hg', 'hgrc')]

  def termsize(ui):
      try:
diff -r 1f51b4658f21 -r 438873a0f0b7 tests/test-xdg.t
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-xdg.t  Tue Feb 07 17:33:35 2017 +0100
@@ -0,0 +1,11 @@
+#if no-windows no-osx
+
+  $ mkdir -p xdgconf/hg
+  $ echo '[ui]' > xdgconf/hg/hgrc
+  $ echo 'username = foobar' >> xdgconf/hg/hgrc
+  $ XDG_CONFIG_HOME=$PWD/xdgconf; export XDG_CONFIG_HOME
+  $ unset HGRCPATH
+  $ hg config ui.username
+  foobar
+
+#endif


More information about the Mercurial-devel mailing list