diff --git a/CHANGELOG b/CHANGELOG index 31a72d43d20fa0c6c79c65e8d96ab0c73ad2b717_Q0hBTkdFTE9H..64c9248f2c3dc39f8ba8e33383ebfc60f7db0b7a_Q0hBTkdFTE9H 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -8,6 +8,9 @@ * evolve: update the template keywords section in `hg help -e evolve` + * fold: don't create merge commits with pX being an ancestor of pY + (issue6332) + * obslog: make obslog --no-origin -f work with multiple successor sets topic (0.19.1) diff --git a/hgext3rd/evolve/cmdrewrite.py b/hgext3rd/evolve/cmdrewrite.py index 31a72d43d20fa0c6c79c65e8d96ab0c73ad2b717_aGdleHQzcmQvZXZvbHZlL2NtZHJld3JpdGUucHk=..64c9248f2c3dc39f8ba8e33383ebfc60f7db0b7a_aGdleHQzcmQvZXZvbHZlL2NtZHJld3JpdGUucHk= 100644 --- a/hgext3rd/evolve/cmdrewrite.py +++ b/hgext3rd/evolve/cmdrewrite.py @@ -766,7 +766,7 @@ wlock = repo.wlock() lock = repo.lock() - root, head, p2 = rewriteutil.foldcheck(repo, revs) + root, head, p1, p2 = rewriteutil.foldcheck(repo, revs) tr = repo.transaction(b'fold') try: @@ -788,8 +788,10 @@ metadata[b'note'] = opts['note'] updates = allctx[:] + if root.p1() != p1: + updates.append(p1) if p2 is not None and root.p2() != p2: updates.append(p2) commitopts = pycompat.byteskwargs(commitopts) newid, unusedvariable = rewriteutil.rewrite(repo, root, updates, head, @@ -791,9 +793,9 @@ if p2 is not None and root.p2() != p2: updates.append(p2) commitopts = pycompat.byteskwargs(commitopts) newid, unusedvariable = rewriteutil.rewrite(repo, root, updates, head, - [root.p1().node(), + [p1.node(), p2.node()], commitopts=commitopts) phases.retractboundary(repo, tr, targetphase, [newid]) @@ -878,7 +880,7 @@ b'not currently supported')) if opts['fold']: - root, head, p2 = rewriteutil.foldcheck(repo, revs) + root, head, p1, p2 = rewriteutil.foldcheck(repo, revs) else: if repo.revs(b"%ld and public()", revs): raise error.Abort(_(b'cannot edit commit information for public ' @@ -892,6 +894,7 @@ hint %= repo[newunstable.first()] raise error.Abort(msg, hint=hint) root = head = repo[revs.first()] + p1 = root.p1() p2 = root.p2() wctx = repo[None] @@ -895,7 +898,6 @@ p2 = root.p2() wctx = repo[None] - p1 = wctx.p1() tr = repo.transaction(b'metaedit') newp1 = None try: @@ -916,9 +918,11 @@ commitopts['edit'] = True updates = allctx[:] + if root.p1() != p1: + updates.append(p1) if p2 is not None and (root.p2() != p2 or not opts['fold']): updates.append(p2) if not commitopts['fold'] and not commitopts['date']: commitopts['date'] = root.date() commitopts = pycompat.byteskwargs(commitopts) newid, created = rewriteutil.rewrite(repo, root, updates, head, @@ -919,10 +923,10 @@ if p2 is not None and (root.p2() != p2 or not opts['fold']): updates.append(p2) if not commitopts['fold'] and not commitopts['date']: commitopts['date'] = root.date() commitopts = pycompat.byteskwargs(commitopts) newid, created = rewriteutil.rewrite(repo, root, updates, head, - [root.p1().node(), + [p1.node(), p2.node()], commitopts=commitopts) if created: @@ -926,7 +930,7 @@ p2.node()], commitopts=commitopts) if created: - if p1.rev() in revs: + if wctx.p1().rev() in revs: newp1 = newid # metadata to be stored on obsmarker metadata = {} diff --git a/hgext3rd/evolve/rewriteutil.py b/hgext3rd/evolve/rewriteutil.py index 31a72d43d20fa0c6c79c65e8d96ab0c73ad2b717_aGdleHQzcmQvZXZvbHZlL3Jld3JpdGV1dGlsLnB5..64c9248f2c3dc39f8ba8e33383ebfc60f7db0b7a_aGdleHQzcmQvZXZvbHZlL3Jld3JpdGV1dGlsLnB5 100644 --- a/hgext3rd/evolve/rewriteutil.py +++ b/hgext3rd/evolve/rewriteutil.py @@ -155,6 +155,6 @@ b' to allow folding them') raise error.Abort(msg, hint=hint) root = repo[roots.first()] - # root's p1 is already used as the target ctx p1 - baseparents -= {root.p1().rev()} + p1 = root.p1() + baseparents -= {p1.rev()} p2 = repo[baseparents.first()] @@ -160,5 +160,10 @@ p2 = repo[baseparents.first()] - return root, head, p2 + if p2.rev() is not None: + cahs = repo.changelog.commonancestorsheads(p1.node(), p2.node()) + if len(cahs) == 1 and cahs[0] in {p1.node(), p2.node()}: + p1 = p2 if p1.node() == cahs[0] else p1 + p2 = repo[None] + return root, head, p1, p2 def deletebookmark(repo, repomarks, bookmarks): wlock = lock = tr = None diff --git a/tests/test-fold.t b/tests/test-fold.t index 31a72d43d20fa0c6c79c65e8d96ab0c73ad2b717_dGVzdHMvdGVzdC1mb2xkLnQ=..64c9248f2c3dc39f8ba8e33383ebfc60f7db0b7a_dGVzdHMvdGVzdC1mb2xkLnQ= 100644 --- a/tests/test-fold.t +++ b/tests/test-fold.t @@ -378,5 +378,5 @@ $ hg init fold-many-merges $ cd fold-many-merges - $ hg debugbuilddag '+3 *3 /3 /4 /4' + $ hg debugbuilddag '+4 *4 /3 /4 /4' $ hg glog @@ -382,3 +382,3 @@ $ hg glog - o 6: r6 + o 7: r7 |\ @@ -384,3 +384,3 @@ |\ - | o 5: r5 + | o 6: r6 | |\ @@ -386,2 +386,4 @@ | |\ + | | o 5: r5 + | |/| | | o 4: r4 @@ -387,4 +389,2 @@ | | o 4: r4 - | |/| - | | o 3: r3 | | | @@ -390,3 +390,3 @@ | | | - o | | 2: r2 + o | | 3: r3 |/ / @@ -392,6 +392,8 @@ |/ / - o / 1: r1 + o | 2: r2 + | | + o | 1: r1 |/ o 0: r0 @@ -394,6 +396,6 @@ |/ o 0: r0 -cannot fold 5 and 6 because they have 3 external parents in total: 1, 2, 4 +cannot fold 6 and 7 because they have 3 external parents in total: 2, 3, 5 @@ -399,5 +401,5 @@ - $ hg fold --exact -r 5:6 -m r5+r6 + $ hg fold --exact -r 6:7 -m r6+r7 abort: cannot fold revisions that merge with more than one external changeset (not in revisions) [255] @@ -401,5 +403,5 @@ abort: cannot fold revisions that merge with more than one external changeset (not in revisions) [255] -now many of the parents are included in the revisions to fold, only 0 and 3 are external +now many of the parents are included in the revisions to fold, only 1 and 4 are external @@ -405,5 +407,5 @@ - $ hg fold --exact -r 1+2+4+5+6 -m r1+r2+r4+r5+r6 + $ hg fold --exact -r 2+3+5+6+7 -m r2+r3+r5+r6+r7 5 changesets folded $ hg glog @@ -407,5 +409,5 @@ 5 changesets folded $ hg glog - o 7: r1+r2+r4+r5+r6 + o 8: r2+r3+r5+r6+r7 |\ @@ -411,5 +413,7 @@ |\ - | o 3: r3 + | o 4: r4 + | | + o | 1: r1 |/ o 0: r0 @@ -413,6 +417,20 @@ |/ o 0: r0 + +cannot fold 8 and 4 because 0 is the parent of 1, and a merge of 0 with 1 shouldn't be allowed + + $ hg fold --exact -r 8+4 -m r8+r4 + 2 changesets folded + + $ hg glog + o 9: r8+r4 + | + o 1: r1 + | + o 0: r0 + + $ cd .. Fold should respect experimental.evolution.allowdivergence option diff --git a/tests/test-metaedit.t b/tests/test-metaedit.t index 31a72d43d20fa0c6c79c65e8d96ab0c73ad2b717_dGVzdHMvdGVzdC1tZXRhZWRpdC50..64c9248f2c3dc39f8ba8e33383ebfc60f7db0b7a_dGVzdHMvdGVzdC1tZXRhZWRpdC50 100644 --- a/tests/test-metaedit.t +++ b/tests/test-metaedit.t @@ -278,3 +278,31 @@ E F ROOT + +fold shouldn't result in a merge with ancestor (issue6332) + + $ hg init $TESTTMP/metaedit-issue6332 + $ cd $TESTTMP/metaedit-issue6332 + + $ hg debugbuilddag -n '+2 *2 /2' + + $ hg gluf + o 3: r3 - debugbuilddag (nf3) + |\ + | o 2: r2 - debugbuilddag (nf2) + | | + o | 1: r1 - debugbuilddag (nf1) + |/ + o 0: r0 - debugbuilddag (nf0) + + + $ hg metaedit --user mr-squasher -r 1+3 --fold --message squashed + 2 changesets folded + + $ hg gluf + o 4: squashed - mr-squasher (nf1 nf3) + | + o 2: r2 - debugbuilddag (nf2) + | + o 0: r0 - debugbuilddag (nf0) +