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

Augie Fackler raf at durin42.com
Fri Feb 10 16:03:47 EST 2017


On Fri, Feb 10, 2017 at 09:19:14AM +0100, David Demelier wrote:
> 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)

The only issue I see offhand is that this doesn't address Kevin's
(righteous, IMO) concern around having people parse shell variable
expansion. It's worth more prose to make it clear.

>   - ``<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
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list