From patchwork Sat Sep 5 07:09:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D8983: merge: move initial handling of mergeactions near to later one From: phabricator X-Patchwork-Id: 47093 Message-Id: To: Phabricator Cc: mercurial-devel@mercurial-scm.org Date: Sat, 5 Sep 2020 07:09:49 +0000 pulkit created this revision. Herald added a reviewer: hg-reviewers. Herald added a subscriber: mercurial-patches. REVISION SUMMARY We build `mergeactions` in the beginning and use it in end. Let's build it just before where it will be used. Helps making code much easier to understand. REPOSITORY rHG Mercurial BRANCH default REVISION DETAIL https://phab.mercurial-scm.org/D8983 AFFECTED FILES mercurial/merge.py tests/test-graft.t tests/test-merge-criss-cross.t tests/test-rename-merge1.t tests/test-rename-merge2.t tests/test-up-local-change.t CHANGE DETAILS To: pulkit, #hg-reviewers Cc: mercurial-patches, mercurial-devel diff --git a/tests/test-up-local-change.t b/tests/test-up-local-change.t --- a/tests/test-up-local-change.t +++ b/tests/test-up-local-change.t @@ -43,9 +43,9 @@ resolving manifests branchmerge: False, force: False, partial: False ancestor: c19d34741b0a, local: c19d34741b0a+, remote: 1e71731e6fbb - preserving a for resolve of a b: remote created -> g getting b + preserving a for resolve of a a: versions differ -> m (premerge) picked tool 'true' for a (binary False symlink False changedelete False) merging a @@ -68,9 +68,9 @@ resolving manifests branchmerge: False, force: False, partial: False ancestor: 1e71731e6fbb, local: 1e71731e6fbb+, remote: c19d34741b0a - preserving a for resolve of a b: other deleted -> r removing b + preserving a for resolve of a starting 4 threads for background file closing (?) a: versions differ -> m (premerge) picked tool 'true' for a (binary False symlink False changedelete False) @@ -92,9 +92,9 @@ resolving manifests branchmerge: False, force: False, partial: False ancestor: c19d34741b0a, local: c19d34741b0a+, remote: 1e71731e6fbb - preserving a for resolve of a b: remote created -> g getting b + preserving a for resolve of a a: versions differ -> m (premerge) picked tool 'true' for a (binary False symlink False changedelete False) merging a diff --git a/tests/test-rename-merge2.t b/tests/test-rename-merge2.t --- a/tests/test-rename-merge2.t +++ b/tests/test-rename-merge2.t @@ -85,10 +85,10 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 924404dff337, local: e300d1c794ec+, remote: 4ce40f5aca24 + a: remote unchanged -> k preserving a for resolve of b + starting 4 threads for background file closing (?) preserving rev for resolve of rev - starting 4 threads for background file closing (?) - a: remote unchanged -> k b: remote copied from a -> m (premerge) picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob) merging a and b to b @@ -125,10 +125,10 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 924404dff337, local: 86a2aa42fc76+, remote: f4db7e329e71 + a: remote is newer -> g + getting a preserving b for resolve of b preserving rev for resolve of rev - a: remote is newer -> g - getting a b: local copied/moved from a -> m (premerge) picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob) merging b and a to b @@ -242,9 +242,9 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: 4ce40f5aca24 - preserving rev for resolve of rev b: remote created -> g getting b + preserving rev for resolve of rev rev: versions differ -> m (premerge) picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob) merging rev @@ -275,9 +275,9 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 97c705ade336 - preserving rev for resolve of rev + b: ancestor missing, remote missing -> k starting 4 threads for background file closing (?) - b: ancestor missing, remote missing -> k + preserving rev for resolve of rev rev: versions differ -> m (premerge) picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob) merging rev @@ -308,11 +308,11 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: bdb19105162a - preserving rev for resolve of rev a: other deleted -> r removing a b: remote created -> g getting b + preserving rev for resolve of rev rev: versions differ -> m (premerge) picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob) merging rev @@ -342,10 +342,10 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 924404dff337, local: 02963e448370+, remote: 97c705ade336 - preserving rev for resolve of rev + b: ancestor missing, remote missing -> k starting 4 threads for background file closing (?) - b: ancestor missing, remote missing -> k a: local not present, remote unchanged -> ka + preserving rev for resolve of rev rev: versions differ -> m (premerge) picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob) merging rev @@ -426,10 +426,10 @@ note: possible conflict - a was renamed multiple times to: b c - preserving rev for resolve of rev c: remote created -> g getting c b: ancestor missing, remote missing -> k + preserving rev for resolve of rev rev: versions differ -> m (premerge) picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob) merging rev @@ -498,10 +498,10 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a + a: other deleted -> r + removing a preserving b for resolve of b preserving rev for resolve of rev - a: other deleted -> r - removing a starting 4 threads for background file closing (?) b: both created -> m (premerge) picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob) @@ -539,10 +539,10 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a + a: remote is newer -> g + getting a preserving b for resolve of b preserving rev for resolve of rev - a: remote is newer -> g - getting a b: both renamed from a -> m (premerge) picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob) merging b @@ -576,10 +576,10 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a + a: other deleted -> r + removing a preserving b for resolve of b preserving rev for resolve of rev - a: other deleted -> r - removing a starting 4 threads for background file closing (?) b: both created -> m (premerge) picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob) @@ -617,10 +617,10 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a + a: remote is newer -> g + getting a preserving b for resolve of b preserving rev for resolve of rev - a: remote is newer -> g - getting a b: both renamed from a -> m (premerge) picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob) merging b @@ -654,10 +654,10 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 924404dff337, local: 0b76e65c8289+, remote: 4ce40f5aca24 + a: remote unchanged -> k preserving b for resolve of b + starting 4 threads for background file closing (?) preserving rev for resolve of rev - starting 4 threads for background file closing (?) - a: remote unchanged -> k b: both renamed from a -> m (premerge) picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob) merging b @@ -854,10 +854,10 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 924404dff337, local: 02963e448370+, remote: 2b958612230f + c: remote created -> g + getting c preserving b for resolve of b preserving rev for resolve of rev - c: remote created -> g - getting c b: local copied/moved from a -> m (premerge) picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob) merging b and a to b diff --git a/tests/test-rename-merge1.t b/tests/test-rename-merge1.t --- a/tests/test-rename-merge1.t +++ b/tests/test-rename-merge1.t @@ -40,11 +40,11 @@ note: possible conflict - a2 was renamed multiple times to: b2 c2 - preserving a for resolve of b - removing a b2: remote created -> g getting b2 c2: ancestor missing, remote missing -> k + preserving a for resolve of b + removing a b: remote moved from a -> m (premerge) picked tool ':merge' for b (binary False symlink False changedelete False) merging a and b to b diff --git a/tests/test-merge-criss-cross.t b/tests/test-merge-criss-cross.t --- a/tests/test-merge-criss-cross.t +++ b/tests/test-merge-criss-cross.t @@ -78,9 +78,9 @@ resolving manifests branchmerge: True, force: False, partial: False ancestor: 0f6b37dbe527, local: 3b08d01b0ab5+, remote: adfe50279922 - preserving f2 for resolve of f2 f1: remote is newer -> g getting f1 + preserving f2 for resolve of f2 f2: versions differ -> m (premerge) picked tool ':dump' for f2 (binary False symlink False changedelete False) merging f2 diff --git a/tests/test-graft.t b/tests/test-graft.t --- a/tests/test-graft.t +++ b/tests/test-graft.t @@ -249,11 +249,11 @@ resolving manifests branchmerge: True, force: True, partial: False ancestor: 4c60f11aa304, local: 1905859650ec+, remote: 9c233e8e184d - preserving e for resolve of e d: remote is newer -> g getting d b: remote unchanged -> k c: local not present, remote unchanged -> ka + preserving e for resolve of e e: versions differ -> m (premerge) picked tool ':merge' for e (binary False symlink False changedelete False) merging e diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -1449,49 +1449,6 @@ # mergestate so that it can be reused on commit ms.addcommitinfo(f, op) - moves = [] - - # 'cd' and 'dc' actions are treated like other merge conflicts - mergeactions = list( - mresult.getactions( - [ - mergestatemod.ACTION_CHANGED_DELETED, - mergestatemod.ACTION_DELETED_CHANGED, - mergestatemod.ACTION_MERGE, - ], - sort=True, - ) - ) - for f, args, msg in mergeactions: - f1, f2, fa, move, anc = args - if f == b'.hgsubstate': # merged internally - continue - if f1 is None: - fcl = filemerge.absentfilectx(wctx, fa) - else: - repo.ui.debug(b" preserving %s for resolve of %s\n" % (f1, f)) - fcl = wctx[f1] - if f2 is None: - fco = filemerge.absentfilectx(mctx, fa) - else: - fco = mctx[f2] - actx = repo[anc] - if fa in actx: - fca = actx[fa] - else: - # TODO: move to absentfilectx - fca = repo.filectx(f1, fileid=nullrev) - ms.add(fcl, fco, fca, f) - if f1 != f and move: - moves.append(f1) - - # remove renamed files after safely stored - for f in moves: - if wctx[f].lexists(): - repo.ui.debug(b"removing %s\n" % f) - wctx[f].audit() - wctx[f].remove() - numupdates = mresult.len() - mresult.len(mergeresult.NO_OP_ACTIONS) progress = repo.ui.makeprogress( _(b'updating'), unit=_(b'files'), total=numupdates @@ -1639,6 +1596,49 @@ wctx[f].audit() wctx[f].setflags(b'l' in flags, b'x' in flags) + moves = [] + + # 'cd' and 'dc' actions are treated like other merge conflicts + mergeactions = list( + mresult.getactions( + [ + mergestatemod.ACTION_CHANGED_DELETED, + mergestatemod.ACTION_DELETED_CHANGED, + mergestatemod.ACTION_MERGE, + ], + sort=True, + ) + ) + for f, args, msg in mergeactions: + f1, f2, fa, move, anc = args + if f == b'.hgsubstate': # merged internally + continue + if f1 is None: + fcl = filemerge.absentfilectx(wctx, fa) + else: + repo.ui.debug(b" preserving %s for resolve of %s\n" % (f1, f)) + fcl = wctx[f1] + if f2 is None: + fco = filemerge.absentfilectx(mctx, fa) + else: + fco = mctx[f2] + actx = repo[anc] + if fa in actx: + fca = actx[fa] + else: + # TODO: move to absentfilectx + fca = repo.filectx(f1, fileid=nullrev) + ms.add(fcl, fco, fca, f) + if f1 != f and move: + moves.append(f1) + + # remove renamed files after safely stored + for f in moves: + if wctx[f].lexists(): + repo.ui.debug(b"removing %s\n" % f) + wctx[f].audit() + wctx[f].remove() + # these actions updates the file updated = mresult.len( (