[PATCH 11 of 11 V5] update: allow setting default update check to "noconflict"

Martin von Zweigbergk martinvonz at google.com
Wed Mar 1 15:41:04 EST 2017


On Wed, Mar 1, 2017 at 11:54 AM, Ryan McElroy <rm at fb.com> wrote:
> I'm a very big +1 on this direction -- this is a huge usability improvment.
>
> Facebook currently adds a "--nocheck" flag and turns on "check" by default
> in our "tweakdefaults" extension, but this direction is strictly better than
> that and we will definitely switch over to this "noconflict" functionality
> once it gets into core. I even volunteer to do the work to remove the
> "nocheck" stuff from tweakdefaults and all that.
>
> Thanks a ton for working on this Martin!

Great to hear it will be sufficient to replace that part of tweakdefaults.

>
>
>
>
> On 2/27/17 4:31 PM, Martin von Zweigbergk via Mercurial-devel wrote:
>>
>> # HG changeset patch
>> # User Martin von Zweigbergk <martinvonz at google.com>
>> # Date 1486973155 28800
>> #      Mon Feb 13 00:05:55 2017 -0800
>> # Node ID c88aa4bc36ee81b0837d2949501d6b4fcf825c38
>> # Parent  ae37f4578e3af6fd4cb7c29c9ab06ad0efd726da
>> update: allow setting default update check to "noconflict"
>>
>> The new value allows update (linear or not) as long as they don't
>> result in file merges.
>>
>> I'm hoping that this value can some day become the default.
>>
>> diff -r ae37f4578e3a -r c88aa4bc36ee mercurial/hg.py
>> --- a/mercurial/hg.py   Mon Feb 13 16:03:05 2017 -0800
>> +++ b/mercurial/hg.py   Mon Feb 13 00:05:55 2017 -0800
>> @@ -733,12 +733,13 @@
>>        * none: don't check (merge working directory changes into
>> destination)
>>        * linear: check that update is linear before merging working
>> directory
>>                  changes into destination
>> +     * noconflict: check that the update does not result in file merges
>>         This returns whether conflict is detected at updating or not.
>>       """
>>       if updatecheck is None:
>>           updatecheck = ui.config('experimental', 'updatecheck')
>> -        if updatecheck not in ('abort', 'none', 'linear'):
>> +        if updatecheck not in ('abort', 'none', 'linear', 'noconflict'):
>>               # If not configured, or invalid value configured
>>               updatecheck = 'linear'
>>       with repo.wlock():
>> diff -r ae37f4578e3a -r c88aa4bc36ee mercurial/merge.py
>> --- a/mercurial/merge.py        Mon Feb 13 16:03:05 2017 -0800
>> +++ b/mercurial/merge.py        Mon Feb 13 00:05:55 2017 -0800
>> @@ -1465,21 +1465,27 @@
>>       The table below shows all the behaviors of the update command
>>       given the -c and -C or no options, whether the working directory
>>       is dirty, whether a revision is specified, and the relationship of
>> -    the parent rev to the target rev (linear or not). Match from top
>> first.
>> +    the parent rev to the target rev (linear or not). Match from top
>> first. The
>> +    -n option doesn't exist on the command line, but represents the
>> +    experimental.updatecheck=noconflict option.
>>         This logic is tested by test-update-branches.t.
>>   -    -c  -C  -m  dirty  rev  linear  |  result
>> -     y   y   *    *     *     *     |    (1)
>> -     y   *   y    *     *     *     |    (1)
>> -     *   y   y    *     *     *     |    (1)
>> -     *   *   *    *     n     n     |     x
>> -     *   *   *    n     *     *     |    ok
>> -     n   n   n    y     *     y     |   merge
>> -     n   n   n    y     y     n     |    (2)
>> -     n   n   y    y     *     *     |   merge
>> -     n   y   n    y     *     *     |  discard
>> -     y   n   n    y     *     *     |    (3)
>> +    -c  -C  -n  -m  dirty  rev  linear  |  result
>> +     y   y   *   *    *     *     *     |    (1)
>> +     y   *   y   *    *     *     *     |    (1)
>> +     y   *   *   y    *     *     *     |    (1)
>> +     *   y   y   *    *     *     *     |    (1)
>> +     *   y   *   y    *     *     *     |    (1)
>> +     *   *   y   y    *     *     *     |    (1)
>> +     *   *   *   *    *     n     n     |     x
>> +     *   *   *   *    n     *     *     |    ok
>> +     n   n   n   n    y     *     y     |   merge
>> +     n   n   n   n    y     y     n     |    (2)
>> +     n   n   n   y    y     *     *     |   merge
>> +     n   n   y   n    y     *     *     |  merge if no conflict
>> +     n   y   n   n    y     *     *     |  discard
>> +     y   n   n   n    y     *     *     |    (3)
>>         x = can't happen
>>       * = don't-care
>> @@ -1499,7 +1505,7 @@
>>           # updatecheck='abort' to better suppport some of these callers.
>>           if updatecheck is None:
>>               updatecheck = 'linear'
>> -        assert updatecheck in ('none', 'linear')
>> +        assert updatecheck in ('none', 'linear', 'noconflict')
>>       # If we're doing a partial update, we need to skip updating
>>       # the dirstate, so make a note of any partial-ness to the
>>       # update here.
>> @@ -1593,6 +1599,13 @@
>>               repo, wc, p2, pas, branchmerge, force, mergeancestor,
>>               followcopies, matcher=matcher, mergeforce=mergeforce)
>>   +        if updatecheck == 'noconflict':
>> +            for f, (m, args, msg) in actionbyfile.iteritems():
>> +                if m not in ('g', 'k', 'r'):
>> +                    msg = _("uncommitted changes")
>
>
> I'd make this message more specific/correct -- something like "conflicting
> changes", or perhaps more pedantically, "working copy changes conflict with
> update changes". I bring this up because "uncommitted changes" is true but
> doesn't really explain why we're aborting.

Oh, good point. Looks like I just copied and pasted that without thinking.

To the person queuing this, do you want to queue the first 10 and I
can just send an update of this patch, to avoid spamming the list with
a V6 of all 11 patches?

>
>> +                    hint = _("commit or update --merge to allow merge")
>> +                    raise error.Abort(msg, hint=hint)
>> +
>>           # Prompt and create actions. Most of this is in the resolve
>> phase
>>           # already, but we can't handle .hgsubstate in filemerge or
>>           # subrepo.submerge yet so we have to keep prompting for it.
>> diff -r ae37f4578e3a -r c88aa4bc36ee tests/test-update-branches.t
>> --- a/tests/test-update-branches.t      Mon Feb 13 16:03:05 2017 -0800
>> +++ b/tests/test-update-branches.t      Mon Feb 13 00:05:55 2017 -0800
>> @@ -255,6 +255,65 @@
>>     >>>>>>> destination:  d047485b3896 b1 - test: 4
>>     $ rm a.orig
>>   +  $ echo 'updatecheck = noconflict' >> .hg/hgrc
>> +
>> +  $ revtest 'none dirty cross'  dirty 3 4
>> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>> +  parent=4
>> +  M foo
>> +
>> +  $ revtest 'none dirty linear' dirty 1 2
>> +  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
>> +  parent=2
>> +  M foo
>> +
>> +  $ revtest 'none dirty linear' dirty 1 2 -c
>> +  abort: uncommitted changes
>> +  parent=1
>> +  M foo
>> +
>> +  $ revtest 'none dirty linear' dirty 1 2 -C
>> +  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
>> +  parent=2
>> +
>> +Locally added file is allowed
>> +  $ hg up -qC 3
>> +  $ echo a > bar
>> +  $ hg add bar
>> +  $ hg up -q 4
>> +  $ hg st
>> +  A bar
>> +  $ hg forget bar
>> +  $ rm bar
>> +
>> +Locally removed file is allowed
>> +  $ hg up -qC 3
>> +  $ hg rm a
>> +  $ hg up -q 4
>> +  abort: uncommitted changes
>> +  (commit or update --merge to allow merge)
>> +  [255]
>> +
>> +File conflict is not allowed
>> +  $ hg up -qC 3
>> +  $ echo dirty >> a
>> +  $ hg up -q 4
>> +  abort: uncommitted changes
>> +  (commit or update --merge to allow merge)
>> +  [255]
>> +  $ hg up -m 4
>> +  merging a
>> +  warning: conflicts while merging a! (edit, then use 'hg resolve
>> --mark')
>> +  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
>> +  use 'hg resolve' to retry unresolved file merges
>> +  [1]
>> +  $ rm a.orig
>> +
>> +Change/delete conflict is not allowed
>> +  $ hg up -qC 3
>> +  $ hg rm foo
>> +  $ hg up -q 4
>> +
>>   Uses default value of "linear" when value is misspelled
>>     $ echo 'updatecheck = linyar' >> .hg/hgrc
>>   _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at mercurial-scm.org
>>
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__www.mercurial-2Dscm.org_mailman_listinfo_mercurial-2Ddevel&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=Jw8rundaE7TbmqBYd1txIQ&m=2u9dCw6A0fe99XyZphoSmE3eMMmzpJiKHmWN2Jw59OY&s=w8OK4IdcRn8DN3K02gpGh2Bhm-eW0Up6dtnK75FifPY&e=
>
>


More information about the Mercurial-devel mailing list