[PATCH 11 of 11 V5] update: allow setting default update check to "noconflict"
Augie Fackler
raf at durin42.com
Tue Mar 7 11:33:32 EST 2017
On Wed, Mar 01, 2017 at 11:54:21AM -0800, Ryan McElroy 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.
I feel obligated to point out that 4.1 added a --no-check flag to core
(but 4.2 will let you drop this entirely, hopefully, so probably don't
make your users change muscle memory now.)
>
> Thanks a ton for working on this Martin!
>
>
>
> 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.
>
> > + 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=
>
> _______________________________________________
> 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