[PATCH] ui: support declaring repositories in [remotes] section
Gregory Szorc
gregory.szorc at gmail.com
Mon Nov 16 13:38:18 CST 2015
> On Nov 14, 2015, at 22:51, Yuya Nishihara <yuya at tcha.org> wrote:
>
>> On Sat, 14 Nov 2015 19:38:55 -0800, Sean Farley wrote:
>>
>> Gregory Szorc <gregory.szorc at gmail.com> writes:
>>
>>>> On Nov 14, 2015, at 19:08, Sean Farley <sean at farley.io> wrote:
>>>>
>>>>
>>>> Gregory Szorc <gregory.szorc at gmail.com> writes:
>>>>
>>>>> # HG changeset patch
>>>>> # User Gregory Szorc <gregory.szorc at gmail.com>
>>>>> # Date 1447395178 28800
>>>>> # Thu Nov 12 22:12:58 2015 -0800
>>>>> # Node ID eeed46507676c60df3febc358b5d301ed4470855
>>>>> # Parent 3309714ded262f1bb3e32dd552b01d6926de06d5
>>>>> ui: support declaring repositories in [remotes] section
>>>>>
>>>>> Power users often want to apply per-path configuration options. For
>>>>> example, they may want to declare an alternate URL for push operations
>>>>> or declare a revset of revisions to push when `hg push` is used
>>>>> (as opposed to attempting to push all revisions by default).
>>>>>
>>>>> This patch establishes the [remotes] section (bikeshedding invited).
>>>>> Unlike the [paths] sections, the [remotes] section reserves options
>>>>> with "." in them for declaring per-path/remote attributes. (The
>>>>> [paths] section interprets options with "." as a valid alias and
>>>>> attempting to shoehorn "." attribute interpretation into [paths]
>>>>> runs the risk of ambiguous behavior when a user defined an alias
>>>>> with "." that happens to conflict with an attribute defining
>>>>> special behavior. So, a dedicated section with different parsing
>>>>> semantics is necessary to avoid ambiguity.)
>>>>>
>>>>> Initially, we only support the "pushurl" per-path attribute. However,
>>>>> additional attributes can be added relatively easily.
>>>>>
>>>>> This patch requires that location values are URLs and that the URLs
>>>>> don't contain #fragment parts. The URL requirement might be
>>>>> controversial. I'm implementing it to see what people say. If people
>>>>> don't like it, I can remove it with little objection. However, I would
>>>>> encourage people to read the location interpretation logic in
>>>>> ui.path.__init__ and commands.push before rushing to judgement. The
>>>>> code and behavior is a bit complicated and requiring URLs does reduce
>>>>> ambiguity over how values should be interpretted. The banning of
>>>>> #fragment from locations should hopefully be less controversial. As
>>>>> a refresher, these declare the default branch to push to. Since
>>>>> branches aren't as popular as they once were, I'm guessing few will
>>>>> miss this feature. Plus, I intend to introduce a "pushrev" or
>>>>> "defaultpushrev" per-path attribute that declares a revset to be used
>>>>> to select what will be pushed when no -r argument is given to
>>>>> `hg push`. This feature will restore the capabilities of #fragment
>>>>> in the URL but will be more powerful and more useful.
>>>>>
>>>>> In the spirit of full disclosure, I believe mpm had signed off on
>>>>> [urls] for the new section name. However, there has since been some
>>>>> discussion on introducing "remote" "refs" into core. I'm not sure
>>>>> what the user-facing nomenclature for that is going to be. But if it
>>>>> is "remotes", then IMO the section for declaring repos should be
>>>>> [remotes], as implemented in this patch.
>>>>>
>>>>> diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt
>>>>> --- a/mercurial/help/config.txt
>>>>> +++ b/mercurial/help/config.txt
>>>>> @@ -1149,8 +1149,9 @@ used from the command line. Example::
>>>>> To push to the path defined in ``my_path`` run the command::
>>>>>
>>>>> hg push my_path
>>>>>
>>>>> +(See ``[remotes]`` for a more advanced method of declaring repositories.)
>>>>>
>>>>> ``phases``
>>>>> ----------
>>>>>
>>>>> @@ -1283,8 +1284,30 @@ have a definite end point.
>>>>>
>>>>> ``assume-tty``
>>>>> If true, ALWAYS show a progress bar, unless disable is given.
>>>>>
>>>>> +``remotes``
>>>>> +-----------
>>>>> +
>>>>> +Declare symbolic names to remote repositories along with additional attributes
>>>>> +defining behavior.
>>>>> +
>>>>> +Options without "." declare the symbolic name of a repository and its location.
>>>>> +Options with "." declare attributes for a repository. For example::
>>>>> +
>>>>> + [remotes]
>>>>> + my_remote = https://example.com/repo
>>>>> + my_remote.pushurl = ssh://example.com/repo
>>>>> +
>>>>> +The followeing per-entry attributes are recognized:
>>>>> +
>>>>> +``pushurl``
>>>>> + The URL to use for push operations. If not defined, the location defined
>>>>> + by the attribute-less config option is used.
>>>>> +
>>>>> +(See ``[paths]`` for a simpler but less powerful method to declare symbolic
>>>>> +names to repositories.)
>>>>
>>>> I really hate another config section for something that is still
>>>> [paths]. The BC complaint seems to be splitting on '.' but we aren't
>>>> going to use any TLDs for our actions (are we?). So, can't we just split
>>>> on '.pushurl'?
>>>>
>>>> For example,
>>>>
>>>> [paths]
>>>> smf.io = URL1
>>>> smf.io.pushurl = URL2
>>>> smf.io.pushrev = '.'
>>>>
>>>> In this case, we can easily split on '.pushurl' and 'pushrev' without
>>>> any ambiguity.
>>>
>>> I can't predict the future and can't guarantee we won't introduce per-path
>>> attributes that have sub-attributes. E.g. smf.bookmarkmap.@ = upstream
>>>
>>> (Probably not a good example because of remotenames. But hopefully it gets
>>> my point across that splitting on "." can be ambiguous.)
>>>
>>> Also, this isn't about domains /TLDs having the naming conflict: it's about
>>> the aliases people choose.
>>
>> I still don't see how splitting from the left wouldn't be safe enough. I
>> guess you're saying that someone could have '.pushurl' alias. I don't
>> agree that that's enough to warrant a new section and would rather
>> improve what we have.
>
> I didn't read everything, but there were long discussion. It isn't safe if
> you have "smf" and "smf.io" in paths, and if we introduce ".io" attribute
> in future version. Every single new attribute could be a BC.
>
> http://thread.gmane.org/gmane.comp.version-control.mercurial.devel/76859
>
> Anyway, if we want to put everything in "[paths]", can we use a different
> separator such as ":" ? It didn't work until 3.6, so nobody would use "foo:bar"
> aliases.
>
> [paths]
> smf.io = URL1
> smf.io:pushurl = URL2
Ooh - that's tempting.
I'll wait for mpm or another committer to weigh in before changing anything.
More information about the Mercurial-devel
mailing list