[PATCH 2 of 2 RFC] config: introduce platform specific sections

Gregory Szorc gregory.szorc at gmail.com
Tue Mar 31 00:12:24 CDT 2015


On Sat, Mar 28, 2015 at 6:12 PM, Matt Harbison <mharbison72 at gmail.com>
wrote:

> On Sat, 28 Mar 2015 15:19:50 -0400, Gregory Szorc <gregory.szorc at gmail.com>
> wrote:
>
>  On Thu, Mar 26, 2015 at 7:35 AM, Yuya Nishihara <yuya at tcha.org> wrote:
>>
>>  On Wed, 25 Mar 2015 21:15:27 -0400, Matt Harbison wrote:
>>> > On Mon, 23 Mar 2015 16:02:16 -0400, Matt Mackall <mpm at selenic.com>
>>> wrote:
>>> > > On Fri, 2015-03-20 at 18:36 -0400, Matt Harbison wrote:
>>> > >> # HG changeset patch
>>> > >> # User Matt Harbison <matt_harbison at yahoo.com>
>>> > >> # Date 1426888879 14400
>>> > >> #      Fri Mar 20 18:01:19 2015 -0400
>>> > >> # Node ID 636f51ff2cfc9bbd665f1b3bf198d780a2afffe8
>>> > >> # Parent  6b3aff8a06f1cf7057a9bdcdc5e301dde0801828
>>> > >> config: introduce platform specific sections
>>> > >
>>> > > Please take a peek at Greg's patches where he's proposing using
>>> > > [foo.bar] for something else. I can't say I'm excited by either
>>> > > proposal.
>>> > >
>>> >
>>> > Yep, I saw he hadn't ruled that out yet and pinged him on Monday.
>>> >
>>> > In the meantime, do you have any alternate ideas for this?  I wasn't
>>> sure
>>> > how your
>>> >
>>> >    new.style =
>>> >    old.style.path =
>>> >
>>> > suggestion would apply to this, since that probably requires knowledge
>>> of
>>> > what is possible in each section.  ([extensions] for example allows a
>>> > leading 'hgext.', so it isn't a general split on '.' and compare
>>> > algorithm.)
>>>
>>> As the magic is done at config.parse() layer, how about %if like a C
>>> preprocessor?
>>>
>>>   [systest]
>>>   %if $platform == 'win32'  # or %ifeq(...,...) ?
>>>   key = windowsvalue
>>>   %elif $platform == 'linux'
>>>   key = linuxvalue
>>>   %endif
>>>
>>> (I don't know if mpm likes it. ;)
>>>
>>>
>>>  I'm also not a huge fan of adopting [X.platform] for platform-specific
>> bits. That prevents us from using [X.Y] sections for anything else, which
>> I
>> think is a bit short-sighted.
>>
>
> Yeah, I was concerned about that too.  I only ignored it because I
> couldn't think of something else that needed to apply at a section level.
> And without a concrete second example, I tend to over-engineer the future
> compatibility aspects.  But it's a fair point.
>
>  I kinda like the preprocessor idea. Although, the more I interact with
>> preprocessors, the more I learn that it is often best to avoid them. Once
>> you introduce a preprocessing step, any tool that parses the file needs to
>> know about preprocessing. And since Mercurial doesn't have a built-in
>> config editor, this would further limit the ability for 3rd party tools to
>> rewrite Mercurial's mostly-ini config files. (The "mercurial-setup" tool I
>> wrote for Mozilla is one such tool.)
>>
>
> That was also a concern, even with the syntax I introduced.  Would an
> editing tool be smart enough to skip over the regular [systest] section to
> edit the platform specific section, and fall back if not present?  I
> suppose overwriting both isn't horrible, just undesirable.
>
>  I'm a much bigger fan of sticking to defined data formats as much as
>> possible. i.e. "use ini."
>>
>> Here are some alternatives.
>>
>> Introduce special options within sections to denote properties. e.g. all
>> UPPERCASE options could be reserved for metadata:
>>
>> [systest]
>> PLATFORM = win32
>> key = windowsvalue
>>
>> [systest]
>> PLATFORM = linux
>> key = linuxvalue
>>
>> [systest]
>> PLATFORM = linux, osx
>> key = posixvalue
>>
>
> I assume the metadata is controlling for the entire section, not just the
> next line?  Given that config.py reads a line and updates the dictionary
> immediately, I wonder if 3rd party editors can screw this up when they
> don't recognize the metadata, and put other variables in the section
> first.  (A 3rd party editor reordering keys seems like a bad idea, but it
> hasn't really mattered to this point, other than maybe comments.)
>

I would think this metadata would apply to the whole section and order
wouldn't be matter. Mercurial's config parser would essentially do a
post-processing step to apply special metadata options.


>  Or, put special syntax in the section title after a space.
>>
>> [systest platform=win32]
>> key = windowsvalue
>>
>> [systest platform=linux,osx]
>> key = posixvalue
>>
>> Not as powerful as preprocessing, yes. But it preserves ini compatibility,
>> which I don't think should be under-estimated.
>>
>
> I like this.  It isn't far off from what I originally proposed (split on '
> ' instead of '.', then split again on '='), so it should be fairly simple.
> I think I'll try this, and use Yuya's idea as a backup.
>
> Thinking toward the future, should we disallow a second space, so that
> multiple properties can be specified in the future?  e.g.
>
> [systest platform=win32 arch=amd64]
>

I don't know!


>
> Is there any reason to care about quoting values on the right side of '=',
> maybe to allow for spaces in the value?  Are there existing string parsing
> methods that can be reused for consistency?
>

I also don't know!


>
> The only other thing I can think of that might be useful here is to be
> able to match a string based on regex or something, like the OS version.
> (There are a couple of things that work differently in 10.10 vs 10.6 that
> I've noticed with thg.)  Obviously '=' won't work for that, so are there
> characters that we should reserve after the first space for future uses?


Now you are starting to design a a custom config format. I would suggest
avoiding this if at all possible and to work around platform differences in
the core code or extension.

Just my $0.02.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://selenic.com/pipermail/mercurial-devel/attachments/20150330/8e40ac64/attachment.html>


More information about the Mercurial-devel mailing list