RE: [PATCH 10 of 11] graft: enable rotated-DAG copy tracing (issue4028)
> -- This message, including its attachments, is confidential. For more information please read NNG's email policy here: http://www.nng.com/emailpolicy/ By responding to this email you accept the email policy. -Original Message- > From: Pierre-Yves David [mailto:pierre-yves.da...@ens-lyon.org] > Sent: Tuesday, October 4, 2016 11:42 PM > To: Gábor STEFANIK ; mercurial- > de...@mercurial-scm.org > Subject: Re: [PATCH 10 of 11] graft: enable rotated-DAG copy tracing > (issue4028) > > > > On 10/04/2016 04:48 PM, Gábor STEFANIK wrote: > > -Original Message- > >> From: Mercurial-devel > >> [mailto:mercurial-devel-boun...@mercurial-scm.org] > >> On Behalf Of Gábor Stefanik > >> Sent: Tuesday, October 4, 2016 4:40 PM > >> To: mercurial-devel@mercurial-scm.org > >> Subject: [PATCH 10 of 11] graft: enable rotated-DAG copy tracing > >> (issue4028) > >> > >> # HG changeset patch > >> # User G?bor Stefanik # Date 1475512693 > >> -7200 > > > > Alright, that didn't work either, sorry for the spam... > > I did not looked in details, but this seems to work fine for me. So started to > take some of your series. I meant the patchbomb setup didn't work properly, as it mangled my name. Problem is it sends the mail as Latin-2 (or UTF-8 if I specify HGENCODING), but hardcodedly says "encoding=us-ascii" in the headers. So strictly-conforming mail readers will reject all 8-bit characters in the mail. > > -- > Pierre-Yves David ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
Re: [PATCH 10 of 11] graft: enable rotated-DAG copy tracing (issue4028)
On 10/04/2016 04:48 PM, Gábor STEFANIK wrote: -Original Message- From: Mercurial-devel [mailto:mercurial-devel-boun...@mercurial-scm.org] On Behalf Of Gábor Stefanik Sent: Tuesday, October 4, 2016 4:40 PM To: mercurial-devel@mercurial-scm.org Subject: [PATCH 10 of 11] graft: enable rotated-DAG copy tracing (issue4028) # HG changeset patch # User G?bor Stefanik # Date 1475512693 -7200 Alright, that didn't work either, sorry for the spam... I did not looked in details, but this seems to work fine for me. So started to take some of your series. -- Pierre-Yves David ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
RE: [PATCH 10 of 11] graft: enable rotated-DAG copy tracing (issue4028)
> -- This message, including its attachments, is confidential. For more information please read NNG's email policy here: http://www.nng.com/emailpolicy/ By responding to this email you accept the email policy. -Original Message- > From: Gábor STEFANIK > Sent: Tuesday, October 4, 2016 4:49 PM > To: Gábor STEFANIK ; mercurial- > de...@mercurial-scm.org > Subject: RE: [PATCH 10 of 11] graft: enable rotated-DAG copy tracing > (issue4028) > > > -Original Message- > > From: Mercurial-devel > > [mailto:mercurial-devel-boun...@mercurial-scm.org] > > On Behalf Of Gábor Stefanik > > Sent: Tuesday, October 4, 2016 4:40 PM > > To: mercurial-devel@mercurial-scm.org > > Subject: [PATCH 10 of 11] graft: enable rotated-DAG copy tracing > > (issue4028) > > > > # HG changeset patch > > # User G?bor Stefanik # Date 1475512693 -7200 > > Alright, that didn't work either, sorry for the spam... Looks like it is rendered correctly in the archives. In Outlook, it reads "G?bor". > > > # Mon Oct 03 18:38:13 2016 +0200 > > # Node ID 9e59cd55604c5e30b38c66c502c8c982c01a4a01 > > # Parent 5977d6569b2e22487134af7be281e5d60cc987f5 > > graft: enable rotated-DAG copy tracing (issue4028) > > > > Graft performs a merge in a rotated DAG (with a false common > > ancestor), which must be taken into account when tracking copies. Find > > the real common ancestor in this case, and track copies between the > > real and false common ancestors in reverse. > > > > Using this change, when grafting a commit with a change to a file > > moved earlier on the graft's source branch, the change is merged as > > expected into the original > > (unmoved) file, rather than recreating it under its new name. > > It should also eventually make it possible to support cross-branch > > updates that preserve changes in a dirty working copy. > > > > diff -r 5977d6569b2e -r 9e59cd55604c mercurial/copies.py > > --- a/mercurial/copies.pyTue Oct 04 12:51:54 2016 +0200 > > +++ b/mercurial/copies.pyMon Oct 03 18:38:13 2016 +0200 > > @@ -321,7 +321,23 @@ > > if repo.ui.configbool('experimental', 'disablecopytrace'): > > return {}, {}, {}, {} > > > > -dirtyc1 = False # dummy bool for later use > > +# In certain scenarios (e.g. graft, update or rebase), ca can be > overridden > > +# We still need to know a real common ancestor in this case > > +# We can't just compute _c1.ancestor(_c2) and compare it to ca, > because > > +# there can be multiple common ancestors, e.g. in case of bidmerge. > > +# Because our caller may not know if the revision passed in lieu of the > CA > > +# is a genuine common ancestor or not without explicitly checking it, > > it's > > +# better to determine that here. > > +tca = ca > > +# ca.descendant(wc) and ca.descendant(ca) are False, work around that > > +_c1 = c1.p1() if c1.rev() is None else c1 > > +_c2 = c2.p1() if c2.rev() is None else c2 > > +dirtyc1 = not (ca == _c1 or ca.descendant(_c1)) > > +dirtyc2 = not (ca == _c2 or ca.descendant(_c2)) > > +graft = dirtyc1 or dirtyc2 > > +if graft: > > +tca = _c1.ancestor(_c2) > > + > > limit = _findlimit(repo, c1.rev(), c2.rev()) > > if limit is None: > > # no common ancestor, no copies @@ -331,6 +347,7 @@ > > m1 = c1.manifest() > > m2 = c2.manifest() > > ma = ca.manifest() > > +mta = tca.manifest() > > > > # see _checkcopies documentation below for these dicts > > copy1, copy2 = {}, {} > > @@ -340,18 +357,26 @@ > > diverge, incompletediverge = {}, {} > > > > # find interesting file sets from manifests > > +if graft: > > +repo.ui.debug(" computing unmatched files in rotated DAG\n") > > addedinm1 = m1.filesnotin(ma) > > addedinm2 = m2.filesnotin(ma) > > u1r, u2r = _computenonoverlap(repo, c1, c2, addedinm1, addedinm2) > > -u1u, u2u = u1r, u2r > > +if not graft: > > +u1u, u2u = u1r, u2r > > +else: # need to recompute this for directory move handling when > grafting > > +repo.ui.debug(" computing unmatched files in unrotated DAG\n") > > +u1u, u2u = _computenonoverlap(repo, c1, c2, m1.filesnotin(mta), > > + m2.filesnotin(mta)) > > + > > bothne
RE: [PATCH 10 of 11] graft: enable rotated-DAG copy tracing (issue4028)
> -- This message, including its attachments, is confidential. For more information please read NNG's email policy here: http://www.nng.com/emailpolicy/ By responding to this email you accept the email policy. -Original Message- > From: Mercurial-devel [mailto:mercurial-devel-boun...@mercurial-scm.org] > On Behalf Of Gábor Stefanik > Sent: Tuesday, October 4, 2016 4:40 PM > To: mercurial-devel@mercurial-scm.org > Subject: [PATCH 10 of 11] graft: enable rotated-DAG copy tracing (issue4028) > > # HG changeset patch > # User G?bor Stefanik # Date 1475512693 -7200 Alright, that didn't work either, sorry for the spam... > # Mon Oct 03 18:38:13 2016 +0200 > # Node ID 9e59cd55604c5e30b38c66c502c8c982c01a4a01 > # Parent 5977d6569b2e22487134af7be281e5d60cc987f5 > graft: enable rotated-DAG copy tracing (issue4028) > > Graft performs a merge in a rotated DAG (with a false common ancestor), > which must be taken into account when tracking copies. Find the real > common ancestor in this case, and track copies between the real and false > common ancestors in reverse. > > Using this change, when grafting a commit with a change to a file moved > earlier on the graft's source branch, the change is merged as expected into > the original > (unmoved) file, rather than recreating it under its new name. > It should also eventually make it possible to support cross-branch updates > that preserve changes in a dirty working copy. > > diff -r 5977d6569b2e -r 9e59cd55604c mercurial/copies.py > --- a/mercurial/copies.pyTue Oct 04 12:51:54 2016 +0200 > +++ b/mercurial/copies.pyMon Oct 03 18:38:13 2016 +0200 > @@ -321,7 +321,23 @@ > if repo.ui.configbool('experimental', 'disablecopytrace'): > return {}, {}, {}, {} > > -dirtyc1 = False # dummy bool for later use > +# In certain scenarios (e.g. graft, update or rebase), ca can be > overridden > +# We still need to know a real common ancestor in this case > +# We can't just compute _c1.ancestor(_c2) and compare it to ca, because > +# there can be multiple common ancestors, e.g. in case of bidmerge. > +# Because our caller may not know if the revision passed in lieu of the > CA > +# is a genuine common ancestor or not without explicitly checking it, > it's > +# better to determine that here. > +tca = ca > +# ca.descendant(wc) and ca.descendant(ca) are False, work around that > +_c1 = c1.p1() if c1.rev() is None else c1 > +_c2 = c2.p1() if c2.rev() is None else c2 > +dirtyc1 = not (ca == _c1 or ca.descendant(_c1)) > +dirtyc2 = not (ca == _c2 or ca.descendant(_c2)) > +graft = dirtyc1 or dirtyc2 > +if graft: > +tca = _c1.ancestor(_c2) > + > limit = _findlimit(repo, c1.rev(), c2.rev()) > if limit is None: > # no common ancestor, no copies @@ -331,6 +347,7 @@ > m1 = c1.manifest() > m2 = c2.manifest() > ma = ca.manifest() > +mta = tca.manifest() > > # see _checkcopies documentation below for these dicts > copy1, copy2 = {}, {} > @@ -340,18 +357,26 @@ > diverge, incompletediverge = {}, {} > > # find interesting file sets from manifests > +if graft: > +repo.ui.debug(" computing unmatched files in rotated DAG\n") > addedinm1 = m1.filesnotin(ma) > addedinm2 = m2.filesnotin(ma) > u1r, u2r = _computenonoverlap(repo, c1, c2, addedinm1, addedinm2) > -u1u, u2u = u1r, u2r > +if not graft: > +u1u, u2u = u1r, u2r > +else: # need to recompute this for directory move handling when grafting > +repo.ui.debug(" computing unmatched files in unrotated DAG\n") > +u1u, u2u = _computenonoverlap(repo, c1, c2, m1.filesnotin(mta), > + m2.filesnotin(mta)) > + > bothnew = sorted(addedinm1 & addedinm2) > > for f in u1u: > -_checkcopies(c1, f, m1, m2, ca, ca, False, limit, diverge, copy1, > +_checkcopies(c1, f, m1, m2, ca, tca, dirtyc1, limit, diverge, > + copy1, > fullcopy1, incomplete1, incompletediverge) > > for f in u2u: > -_checkcopies(c2, f, m2, m1, ca, ca, False, limit, diverge, copy2, > +_checkcopies(c2, f, m2, m1, ca, tca, dirtyc2, limit, diverge, > + copy2, > fullcopy2, incomplete2, incompletediverge) > > copy = dict(copy1.items() + copy2.items()) @@ -401,9 +426,9 @@ > # reset incomplete dicts for bothdiverge generation > incomplete1, incomplete2, incompletediverge = {}, {}, {} > for f in bothnew: > -_checkcopies(c1, f, m1, m2, ca, ca, False, limit, bothdiverge, _copy, > +_checkcopies(c1, f, m1, m2, ca, tca, dirtyc1, limit, > + bothdiverge, _copy, > _fullcopy, incomplete1, incompletediverge) > -_checkcopies(c2, f, m2, m1, ca, ca, False, limit, bothdiverge, _copy, > +_checkcopies(c2, f, m2, m1, ca, tca, d