[PATCH evolve-ext] fold: disallow multiple revisions without --exact
Martin von Zweigbergk
martinvonz at google.com
Wed Jan 4 11:45:53 EST 2017
On Wed, Jan 4, 2017 at 8:38 AM, Martin von Zweigbergk
<martinvonz at google.com> wrote:
> On Wed, Jan 4, 2017 at 4:53 AM, Pierre-Yves David
> <pierre-yves.david at ens-lyon.org> wrote:
>>
>>
>> On 12/18/2016 06:36 PM, Martin von Zweigbergk via Mercurial-devel wrote:
>>>
>>>
>>>
>>> On Fri, Dec 16, 2016, 23:53 Pierre-Yves David
>>> <pierre-yves.david at ens-lyon.org <mailto:pierre-yves.david at ens-lyon.org>>
>>> wrote:
>>>
>>>
>>>
>>> On 11/05/2016 12:58 AM, Martin von Zweigbergk via Mercurial-devel
>>> wrote:
>>> > # HG changeset patch
>>> > # User Martin von Zweigbergk <martinvonz at google.com
>>> <mailto:martinvonz at google.com>>
>>> > # Date 1478303512 25200
>>> > # Fri Nov 04 16:51:52 2016 -0700
>>> > # Node ID bb80851fe9a6e14263f0076074108556377141f9
>>> > # Parent cb2bac3253fbd52894ffcb4719a148fe6a3da38b
>>> > fold: disallow multiple revisions without --exact
>>> >
>>> > It's very easy to think that "hg fold 4::6" will fold exactly those
>>> > revisions. In reality, it will fold those *and* any revisions
>>> between
>>> > them and the working copy. It seems very likely that users who pass
>>> > more than one revision wants to fold exactly those revisions, so
>>> let's
>>> > abort and hint that they may be looking for --exact.
>>>
>>> That seems a good first step to take in all cases. Unfortunately, the
>>> patch fails to apply for an unclear reason. Can you send me a new
>>> version?
>>>
>>> In addition, I suggest the following changes:
>>>
>>> - we should allow multiple revision if '.' is one of them. They will
>>> be
>>> no surprise in this case.
>>>
>>>
>>> Even if there is a gap between the revisions and '.'?
>>
>>> I wonder if we should fail only if the given commits form a
>>> contiguous range (I assume that's required for --exact).
>>
>> Non-continuous set are currently disallowed, I'm not suggesting we change
>> that. The current behavior without --exact create continuous range
>> "automatically" from the way it compute the fold-set.
>>
>> (note that supporting non-contiguous range is something we might do in the
>> future, but that's another topic)
>>
>> [reworked the quoted part a bit for clarity]
>>>
>>> So
>>
>>> "hg fold .^^" would work because it is a single revision.
>>> "hg fold .^^ .^" would fail because it's multiple revisions.
>>> "hg fold .^ ." would work because it includes '.'.
>>
>> So far, this is what I was suggesting in my previous email.
>> Following your "contiguous" point I would say that
>>
>> "hg fold .+.~1+.~3" would fail because the set is non contiguous
>>
>>> "hg fold .^ .^2" works because it's not a contiguous range (without the
>>> implicit
>>> '.'). It does feel like a little too much logic too the degree that it
>>> may surprise users, but I think the behavior without it may surprise
>>> users even more.
>>
>>
>> I do not understand what you mean with your last example. According to my
>> previous proposal. That would fail because it is multiple revision without
>> ".".
>>
>> So I'm a bit confused about what you tried to says here. That help making a
>> point about user confusion. We might need to take a step back and think a
>> bit more about what we building here.
>>
>>> - update to the commit message,
>>>
>>> abort: multiple revisions specified
>>> (do you want --exact?, see "hg help fold" for details)
>>>
>>>
>>> (I'll tell more about possible changes to the default in the rest of
>>> the
>>> thread)
>>>
>>> Having said the above, I'm more in favor of making --exact the default
>>> and not needing the protection mentioned above, so I'm looking forward
>>> to hearing what you have to say here.
>>
>>
>> There are two extra important points that lead to the current UI choice:
>>
>> (1) revset is an advanced feature, its knowledge should not be required for
>> using a command.
>> Revset are a very cool feature and all developers on this list are
>> pretty familiar with its power. However, many Mercurial users in the real
>> world have never needed revset and survive pretty well without it. We have
>> to build a simple UI for simple people first, and then make it able to fit
>> the more advance usecase of more advance people.
>>
>> (2) Many Mercurial command are working copy (or working copy parent) centric
>> by default (eg: diff). Especially when it comes to history editing (eg:
>> rebase, histedit, amend, split).The common case is usually to do something
>> with the current working context of the user. That's why it is usually used
>> for the default action. It would be nice to keep 'hg fold' consistent with
>> these other commands.
>> (note: there is also commands with full repo approach, like `hg push` and
>> `hg log`… and complains about them not being more working copy centric)
>>
>>
>>
>> There is a couple of other things to take in account:
>>
>> (3) I stay convinced that the common use-case will we working copy centric
>> (with ancestors or with descendant). Evolution help stack centric workflow
>> and improve our ability to works within that stack. In that context, fold
>> working from the working copy, take advantage of that "in-stack" workflow
>> and also helps reinforce it in a consistent way.
>>
>> (4) On the other hand I understand that their have also been people
>> surprised and bitten by the current behavior and I agree we must fix that.
>>
>> ---
>>
>> Currently I would weight "constraint" that way
>> (more important to least important):
>>
>> (1) no revset knowledge required:
>> simplicity is very important,
>
> That makes sense, but note that "hg fold -r foo -r bar" is already
> supported and does not require the user to know about revsets (and one
> can also drop the "-r"s in that command). I feel like you're assuming
> that defaulting to --exact requires the user to know about revsets. I
> don't see it that way.
Oh, I should clarify that my point here is only what I said: that I
don't think that using --exact requires revset knowledge.
Specifically, I'm not implying that that means we have to make --exact
the default. I'm still debating that in my mind.
>
>> (4) stop bitting users:
>> people loosing trust in their tool is -bad-,
>> (2) consistency with other command:
>> consistency is important in the great scheme of things,
>> (3) common case is "." related:
>> having good default is great, but should not get in the way of
>> more important things.
>>
>> The current behavior is too bad in regard with (2), there is regular report
>> of people being bitten by that. So we need changes it.
>>
>> In my opinion, the proposal of using --exact as the default is incompatible
>> with (1) because defining the exact set requires people to learn some of
>> revset (and with that, some will end up using the cursed "x:y" that will
>> pretend to do what they want until it won't).
>>
>> My proposal to move forward was to keep the current behavior, but be more
>> strick regarding the input it accept to mitigate the risk of (2).
>>
>> Here is a table is a basic summary table:
>>
>> | (1) | (2) | (3) | (4) |
>> current | x | x | x | |
>> exact as default | | | | x |
>> current restricted | x | x | x | x |
>>
>>
>> As you pointed out the weak point of "current restricted" is probably the
>> "magic" or "confusing logic" of what is allowed or not. (This is not covered
>> in the summary table).
>>
>> If someone want to work within the constraint space and come up with a
>> better proposal I would be very happy to discuss it (reminder: direct use of
>> "--exact" as the current default seems off table because of the (1)
>> restriction (should not requires revset knowledge)).
>>
>> Cheers,
>>
>> --
>> Pierre-Yves David
More information about the Mercurial-devel
mailing list