# HG changeset patch # User Pierre-Yves David # Date 1554229935 -7200 # Node ID 05f8908df4ce158779aba6571f220fa28d0de556 # Parent e8515ee7a7cc0281d905f762e26e8956ccfd7f74# Parent 7d54a538dd1eefb7ac20d68b95cd5285057c0f21 branching: merge with stable diff -r 7d54a538dd1e -r 05f8908df4ce CHANGELOG --- a/CHANGELOG Wed Feb 13 21:39:10 2019 +0800 +++ b/CHANGELOG Tue Apr 02 20:32:15 2019 +0200 @@ -1,6 +1,15 @@ Changelog ========= +8.5.0 - in progress +------------------- + + * evolve: improved support for content-divergence with public changesets, + * stack: support ranges in revsets indexing, + * pick: add the standard `--tool` option, + * stack: improved and speed --children flag up, + * stack: mention all divergences too. + 8.4.1 - in progress ------------------- diff -r 7d54a538dd1e -r 05f8908df4ce hgext3rd/evolve/__init__.py diff -r 7d54a538dd1e -r 05f8908df4ce hgext3rd/evolve/cmdrewrite.py --- a/hgext3rd/evolve/cmdrewrite.py Wed Feb 13 21:39:10 2019 +0800 +++ b/hgext3rd/evolve/cmdrewrite.py Tue Apr 02 20:32:15 2019 +0200 @@ -159,7 +159,6 @@ old = repo['.'] p1 = old.p1() rewriteutil.precheck(repo, [old.rev()], 'amend') - bookmarkupdater = rewriteutil.bookmarksupdater(repo, old.node(), tr) diffopts = patch.difffeatureopts(repo.ui, whitespace=True) diffopts.nodates = True diffopts.git = True @@ -176,11 +175,11 @@ metadata = {} if opts.get('note'): metadata['note'] = opts['note'] - obsolete.createmarkers(repo, [(old, (repo[newnode],))], - metadata=metadata, operation='amend') + replacements = {old.node(): [newnode]} + scmutil.cleanupnodes(repo, replacements, operation='amend', + metadata=metadata) phases.retractboundary(repo, tr, old.phase(), [newnode]) hg.updaterepo(repo, newnode, True) - bookmarkupdater(newnode) tr.close() finally: if tr is not None: @@ -523,7 +522,6 @@ # Recommit the filtered changeset tr = repo.transaction('uncommit') - updatebookmarks = rewriteutil.bookmarksupdater(repo, old.node(), tr) if interactive: opts['all'] = True match = scmutil.match(old, pats, opts) @@ -548,8 +546,9 @@ if opts.get('note'): metadata['note'] = opts['note'] - obsolete.createmarkers(repo, [(old, (repo[newid],))], metadata=metadata, - operation="uncommit") + replacements = {old.node(): [newid]} + scmutil.cleanupnodes(repo, replacements, operation="uncommit", + metadata=metadata) phases.retractboundary(repo, tr, oldphase, [newid]) if opts.get('revert'): hg.updaterepo(repo, newid, True) @@ -557,7 +556,6 @@ with repo.dirstate.parentchange(): repo.dirstate.setparents(newid, node.nullid) _uncommitdirstate(repo, old, match, interactive) - updatebookmarks(newid) if not repo[newid].files(): ui.warn(_("new changeset is empty\n")) ui.status(_("(use 'hg prune .' to remove it)\n")) @@ -776,14 +774,9 @@ root.p2().node()], commitopts=commitopts) phases.retractboundary(repo, tr, targetphase, [newid]) - obsolete.createmarkers(repo, [(ctx, (repo[newid],)) - for ctx in allctx], metadata=metadata, - operation="fold") - # move bookmarks from old nodes to the new one - # XXX: we should make rewriteutil.rewrite() handle such cases - for ctx in allctx: - bmupdater = rewriteutil.bookmarksupdater(repo, ctx.node(), tr) - bmupdater(newid) + replacements = {ctx.node(): [newid] for ctx in allctx} + scmutil.cleanupnodes(repo, replacements, operation="fold", + metadata=metadata) tr.close() finally: tr.release() @@ -1044,9 +1037,9 @@ msg = "please add --fold if you want to do a fold" raise error.Abort(msg) elif biject: - relations = [(p, (s,)) for p, s in zip(precs, sucs)] + replacements = {p.node(): [s.node()] for p, s in zip(precs, sucs)} else: - relations = [(p, sucs) for p in precs] + replacements = {p.node(): [s.node() for s in sucs] for p in precs} wdp = repo['.'] @@ -1106,14 +1099,8 @@ if opts.get('note'): metadata['note'] = opts['note'] - # create markers - obsolete.createmarkers(repo, relations, metadata=metadata, - operation="prune") - - # informs that changeset have been pruned - ui.status(_('%i changesets pruned\n') % len(precs)) - precrevs = (precursor.rev() for precursor in precs) + moves = {} for ctx in repo.unfiltered().set('bookmark() and %ld', precrevs): # used to be: # @@ -1124,11 +1111,14 @@ # but then revset took a lazy arrow in the knee and became much # slower. The new forms makes as much sense and a much faster. for dest in ctx.ancestors(): - if not dest.obsolete(): - bookmarksupdater = rewriteutil.bookmarksupdater - updatebookmarks = bookmarksupdater(repo, ctx.node(), tr) - updatebookmarks(dest.node()) + if not dest.obsolete() and dest.node() not in replacements: + moves[ctx.node()] = dest.node() break + scmutil.cleanupnodes(repo, replacements, operation="prune", moves=moves, + metadata=metadata) + + # informs that changeset have been pruned + ui.status(_('%i changesets pruned\n') % len(precs)) tr.close() finally: @@ -1404,7 +1394,7 @@ [('r', 'rev', '', _('revision to pick'), _('REV')), ('c', 'continue', False, 'continue interrupted pick'), ('a', 'abort', False, 'abort interrupted pick'), - ], + ] + mergetoolopts, _('[-r] rev')) def cmdpick(ui, repo, *revs, **opts): """move a commit on the top of working directory parent and updates to it.""" @@ -1419,7 +1409,8 @@ if opts.get('rev'): revs.append(opts['rev']) - with repo.wlock(), repo.lock(), repo.transaction('pick'): + overrides = {('ui', 'forcemerge'): opts.get('tool', '')} + with repo.wlock(), repo.lock(), repo.transaction('pick'), ui.configoverride(overrides, 'pick'): pickstate = state.cmdstate(repo, path='pickstate') pctx = repo['.'] @@ -1480,7 +1471,8 @@ if pickstate: pickstate.delete() newctx = repo[newnode] if newnode else pctx - obsolete.createmarkers(repo, [(origctx, (newctx,))], operation="pick") + replacements = {origctx.node(): [newctx.node()]} + scmutil.cleanupnodes(repo, replacements, operation="pick") if newnode is None: ui.warn(_("note: picking %d:%s created no changes to commit\n") % diff -r 7d54a538dd1e -r 05f8908df4ce hgext3rd/evolve/compat.py --- a/hgext3rd/evolve/compat.py Wed Feb 13 21:39:10 2019 +0800 +++ b/hgext3rd/evolve/compat.py Tue Apr 02 20:32:15 2019 +0200 @@ -16,7 +16,6 @@ obsolete, obsutil, repair, - revset, scmutil, util, ui as uimod, @@ -54,43 +53,11 @@ # Evolution renaming compat -TROUBLES = {} - -if not util.safehasattr(context.basectx, 'orphan'): - TROUBLES['ORPHAN'] = 'unstable' - context.basectx.orphan = context.basectx.unstable -else: - TROUBLES['ORPHAN'] = 'orphan' - -if not util.safehasattr(context.basectx, 'contentdivergent'): - TROUBLES['CONTENTDIVERGENT'] = 'divergent' - context.basectx.contentdivergent = context.basectx.divergent -else: - TROUBLES['CONTENTDIVERGENT'] = 'content-divergent' - -if not util.safehasattr(context.basectx, 'phasedivergent'): - TROUBLES['PHASEDIVERGENT'] = 'bumped' - context.basectx.phasedivergent = context.basectx.bumped -else: - TROUBLES['PHASEDIVERGENT'] = 'phase-divergent' - -if not util.safehasattr(context.basectx, 'isunstable'): - context.basectx.isunstable = context.basectx.troubled - -if not util.safehasattr(revset, 'orphan'): - @eh.revsetpredicate('orphan') - def oprhanrevset(*args, **kwargs): - return revset.unstable(*args, **kwargs) - -if not util.safehasattr(revset, 'contentdivergent'): - @eh.revsetpredicate('contentdivergent') - def contentdivergentrevset(*args, **kwargs): - return revset.divergent(*args, **kwargs) - -if not util.safehasattr(revset, 'phasedivergent'): - @eh.revsetpredicate('phasedivergent') - def phasedivergentrevset(*args, **kwargs): - return revset.bumped(*args, **kwargs) +TROUBLES = { + 'ORPHAN': 'orphan', + 'CONTENTDIVERGENT': 'content-divergent', + 'PHASEDIVERGENT': 'phase-divergent', +} if util.safehasattr(uimod.ui, 'makeprogress'): def progress(ui, topic, pos, item="", unit="", total=None): @@ -103,26 +70,6 @@ def progress(ui, topic, pos, item="", unit="", total=None): ui.progress(topic, pos, item="", unit="", total=None) -if not util.safehasattr(context.basectx, 'instabilities'): - def instabilities(self): - """return the list of instabilities affecting this changeset. - - Instabilities are returned as strings. possible values are: - - orphan, - - phase-divergent, - - content-divergent. - """ - instabilities = [] - if self.orphan(): - instabilities.append('orphan') - if self.phasedivergent(): - instabilities.append('phase-divergent') - if self.contentdivergent(): - instabilities.append('content-divergent') - return instabilities - - context.basectx.instabilities = instabilities - # XXX: Better detection of property cache if 'predecessors' not in dir(obsolete.obsstore): @property @@ -131,15 +78,6 @@ obsolete.obsstore.predecessors = predecessors -if not util.safehasattr(obsolete, '_computeorphanset'): - obsolete._computeorphanset = obsolete.cachefor('orphan')(obsolete._computeunstableset) - -if not util.safehasattr(obsolete, '_computecontentdivergentset'): - obsolete._computecontentdivergentset = obsolete.cachefor('contentdivergent')(obsolete._computedivergentset) - -if not util.safehasattr(obsolete, '_computephasedivergentset'): - obsolete._computephasedivergentset = obsolete.cachefor('phasedivergent')(obsolete._computebumpedset) - def memfilectx(repo, ctx, fctx, flags, copied, path): # XXX Would it be better at the module level? varnames = context.memfilectx.__init__.__code__.co_varnames @@ -487,7 +425,9 @@ return copy, movewithdir, diverge, renamedelete, dirmove -if util.safehasattr(copies, '_fullcopytracing'): +# hg <= 4.9 compat (7694b685bb10) +fixupstreamed = util.safehasattr(scmutil, '_movedirstate') +if not fixupstreamed: copies._fullcopytracing = fixedcopytracing if not util.safehasattr(obsutil, "_succs"): diff -r 7d54a538dd1e -r 05f8908df4ce hgext3rd/evolve/evolvecmd.py --- a/hgext3rd/evolve/evolvecmd.py Wed Feb 13 21:39:10 2019 +0800 +++ b/hgext3rd/evolve/evolvecmd.py Tue Apr 02 20:32:15 2019 +0200 @@ -18,8 +18,8 @@ context, copies, error, + encoding, hg, - lock as lockmod, merge, mergeutil, node as nodemod, @@ -71,11 +71,7 @@ else: displayer = compat.changesetdisplayer(ui, repo, {'template': shorttemplate}) - wlock = lock = tr = None - try: - wlock = repo.wlock() - lock = repo.lock() - tr = repo.transaction("evolve") + with repo.wlock(), repo.lock(), repo.transaction("evolve"): if 'orphan' == category: result = _solveunstable(ui, repo, ctx, evolvestate, displayer, dryrun, confirm, progresscb, @@ -89,10 +85,7 @@ dryrun, confirm, progresscb) else: assert False, "unknown trouble category: %s" % (category) - tr.close() return result - finally: - lockmod.release(tr, lock, wlock) def _solveunstable(ui, repo, orig, evolvestate, displayer, dryrun=False, confirm=False, progresscb=None, lastsolved=None): @@ -281,7 +274,6 @@ bumped = tmpctx # Create the new commit context - repo.ui.status(_('computing new diff\n')) files = set() copied = copies.pathcopies(prec, bumped) precmanifest = prec.manifest().copy() @@ -320,9 +312,11 @@ newid = repo.commitctx(new) replacementnode = newid if newid is None: + repo.ui.status(_('no changes to commit\n')) obsolete.createmarkers(repo, [(tmpctx, ())], operation='evolve') newid = prec.node() else: + repo.ui.status(_('committed as %s\n') % nodemod.short(newid)) phases.retractboundary(repo, tr, bumped.phase(), [newid]) obsolete.createmarkers(repo, [(tmpctx, (repo[newid],))], flag=obsolete.bumpedfix, operation='evolve') @@ -330,7 +324,6 @@ # if rebased happened, update bookmarks from there too if rebasedbmupdate: rebasedbmupdate(newid) - repo.ui.status(_('committed as %s\n') % nodemod.short(newid)) # reroute the working copy parent to the new changeset with repo.dirstate.parentchange(): repo.dirstate.setparents(newid, nodemod.nullid) @@ -349,6 +342,7 @@ repo = repo.unfiltered() divergent = repo[divergent.rev()] evolvestate['divergent'] = divergent.node() + evolvestate['orig-divergent'] = divergent.node() # sometimes we will relocate a node in case of different parents and we can # encounter conflicts after relocation is done while solving # content-divergence and if the user calls `hg evolve --stop`, we need to @@ -382,6 +376,20 @@ evolvestate['other-divergent'] = other.node() evolvestate['base'] = base.node() + # haspubdiv: to keep track if we are solving public content-divergence + haspubdiv = False + if not (divergent.mutable() and other.mutable()): + haspubdiv = True + # for simplicity, we keep public one to local side while merging + # (as divergent is kept at local side, pinning public -> divergent) + if divergent.mutable(): + publicdiv = other + divergent, other = other, divergent + evolvestate['divergent'] = divergent.node() + evolvestate['other-divergent'] = other.node() + else: + publicdiv = divergent + evolvestate['public-divergent'] = publicdiv.node() # we don't handle merge content-divergent changesets yet if len(other.parents()) > 1: msg = _("skipping %s: %s changeset can't be " @@ -411,7 +419,17 @@ resolutionparent = repo[divp1].node() gca = repo.revs("ancestor(%d, %d)" % (otherp1, divp1)) - + # divonly: non-obsolete csets which are topological ancestor of "divergent" + # but not "other" + divonly = repo.revs("only(%d, %d) - obsolete()" % (divergent.rev(), + other.rev())) + # otheronly: non-obsolete csets which are topological ancestor of "other" + # but not "div" + otheronly = repo.revs("only(%d, %d) - obsolete()" % (other.rev(), + divergent.rev())) + # make it exclusive set + divonly = set(divonly) - {divergent.rev()} + otheronly = set(otheronly) - {other.rev()} # is relocation of one of the changeset required relocatereq = False @@ -429,15 +447,48 @@ # then solve the content-divergence the way we solve 1) # for 3) and 4), we still have to decide if otherp1 in gca and divp1 in gca: - # both are on the same parents - pass + if otherp1 == other.p1().rev() and divp1 == divergent.p1().rev(): + # both are on the same parents + pass + else: + # both are not on the same parent but have same parents's succs. + if otheronly and divonly: + # case: we have visible csets on both side diverging from + # tca of "divergent" and "other". We still need to decide what + # to do in this case + pass + if otheronly: + relocatereq = True + if not haspubdiv: + # can't swap when public divergence, as public can't move + divergent, other = other, divergent + evolvestate['divergent'] = divergent.node() + evolvestate['other-divergent'] = other.node() + resolutionparent = repo[otherp1].node() + elif divonly: + relocatereq = True + else: + # no extra cset on either side; so not considering relocation + pass elif otherp1 in gca and divp1 not in gca: relocatereq = True pass elif divp1 in gca and otherp1 not in gca: relocatereq = True - divergent, other = other, divergent - resolutionparent = divergent.p1().node() + + # When public branch is behind to the mutable branch, for now we + # relocate mutable cset to public one's side in every case. + # + # This behaviour might be sub optimal when ancestors of mutable + # cset has changes its relocated descendant rely on. + # + # Otherwise, we are going to rebase the "behind" branch up to the new + # brancmap level. + if not haspubdiv: + divergent, other = other, divergent + evolvestate['divergent'] = divergent.node() + evolvestate['other-divergent'] = other.node() + resolutionparent = divergent.p1().node() else: msg = _("skipping %s: have a different parent than %s " "(not handled yet)\n") % (divergent, other) @@ -499,8 +550,25 @@ _mergecontentdivergents(repo, progresscb, divergent, other, base, evolvestate) - return _completecontentdivergent(ui, repo, progresscb, divergent, other, - base, evolvestate) + res, newnode = _completecontentdivergent(ui, repo, progresscb, divergent, + other, base, evolvestate) + if not haspubdiv: + return (res, newnode) + else: + # when we have content-divergence with a public cset: after completing + # content divergence resolution the resulting node will be phase + # divergent with that same public cset. + # here newnode is phase divergent, lets resolve this divergence. + if not res: + # resolution was not successful, return + return (res, newnode) + if newnode == publicdiv.node(): + # no changes were found that are different from public cset + return (res, newnode) + prec = publicdiv + bumped = repo[newnode] + return _resolvephasedivergent(ui, repo, prec=prec, bumped=bumped, + tmpctx=bumped) def _mergecontentdivergents(repo, progresscb, divergent, other, base, evolvestate): @@ -542,6 +610,31 @@ # whether to store the obsmarker in the evolvestate storemarker = False resparent = evolvestate['resolutionparent'] + + # whether we are solving public divergence + haspubdiv = False + if evolvestate.get('public-divergent'): + haspubdiv = True + publicnode = evolvestate['public-divergent'] + publicdiv = repo[publicnode] + othernode = evolvestate['other-divergent'] + otherdiv = repo[othernode] + + with repo.dirstate.parentchange(): + repo.dirstate.setparents(publicnode, nodemod.nullid) + dirstatedance(repo, divergent, publicnode, None) + # check if node to be committed has changes same as public one + s = publicdiv.status() + if not (s.added or s.removed or s.deleted or s.modified): + # warn user if metadata is being lost + if otherdiv.description() != publicdiv.description(): + msg = _('content-divergent changesets differ by descriptions ' + 'only, discarding %s\n') % str(otherdiv) + repo.ui.warn(msg) + # no changes, create markers to resolve divergence + obsolete.createmarkers(repo, [(otherdiv, (publicdiv,))], + operation='evolve') + return (True, publicnode) try: with repo.dirstate.parentchange(): repo.dirstate.setparents(resparent, nodemod.nullid) @@ -571,10 +664,17 @@ new = repo[newnode] newnode = new.node() hg.updaterepo(repo, new.rev(), False) - obsolete.createmarkers(repo, [(divergent, (new,))], operation='evolve') + if haspubdiv and publicdiv == divergent: + bypassphase(repo, (divergent, new), operation='evolve') + else: + obsolete.createmarkers(repo, [(divergent, (new,))], + operation='evolve') # creating markers and moving phases post-resolution - obsolete.createmarkers(repo, [(other, (new,))], operation='evolve') + if haspubdiv and publicdiv == other: + bypassphase(repo, (other, new), operation='evolve') + else: + obsolete.createmarkers(repo, [(other, (new,))], operation='evolve') if storemarker: # storing the marker in the evolvestate # we just store the precursors and successor pair for now, we might @@ -587,6 +687,50 @@ finally: repo.ui.restoreconfig(emtpycommitallowed) +def bypassphase(repo, relation, flag=0, metadata=None, operation='evolve'): + """function to create a single obsmarker relation even for public csets + where relation should be a single pair (prec, succ)""" + + # prepare metadata + if metadata is None: + metadata = {} + if 'user' not in metadata: + luser = repo.ui.config('devel', 'user.obsmarker') or repo.ui.username() + metadata['user'] = encoding.fromlocal(luser) + # Operation metadata handling + useoperation = repo.ui.configbool('experimental', + 'evolution.track-operation') + if useoperation and operation: + metadata['operation'] = operation + + # Effect flag metadata handling + saveeffectflag = repo.ui.configbool('experimental', + 'evolution.effect-flags') + with repo.transaction('add-obsolescence-marker') as tr: + prec, succ = relation + nprec = prec.node() + npare = None + nsucs = [succ.node()] + if not nsucs: + npare = tuple(p.node() for p in prec.parents()) + if nprec in nsucs: + raise error.Abort(_("changeset %s cannot obsolete itself") % prec) + + if saveeffectflag: + # The effect flag is saved in a versioned field name for + # future evolution + try: + effectflag = obsutil.geteffectflag(prec, (succ,)) + except TypeError: + # hg <= 4.7 + effectflag = obsutil.geteffectflag((prec, (succ,))) + metadata[obsutil.EFFECTFLAGFIELD] = "%d" % effectflag + + # create markers + repo.obsstore.create(tr, nprec, nsucs, flag, parents=npare, + metadata=metadata, ui=repo.ui) + repo.filteredrevcache.clear() + def dirstatedance(repo, oldparent, newparent, match): """utility function to fix the dirstate when we change parents from oldparent to newparent with a dirty working directory using @@ -1298,10 +1442,12 @@ compat.progress(ui, _('evolve'), None) if not shouldupdate: + # Move back to startnode, or to its successor if the start node is + # obsolete (perhaps made obsolete by the current `hg evolve`) unfi = repo.unfiltered() succ = utility._singlesuccessor(repo, unfi[startnode]) hg.updaterepo(repo, repo[succ].node(), False) - if repo['.'] != startnode: + if repo['.'].node() != startnode: ui.status(_('working directory is now at %s\n') % repo['.']) def divergentsets(repo, ctx): @@ -1456,7 +1602,7 @@ contopt = opts['continue'] anyopt = opts['any'] allopt = opts['all'] - startnode = repo['.'] + startnode = repo['.'].node() dryrunopt = opts['dry_run'] confirmopt = opts['confirm'] revopt = opts['rev'] @@ -1554,7 +1700,7 @@ # cbor does not know how to serialize sets, using list for skippedrevs stateopts = {'category': targetcat, 'replacements': {}, 'revs': list(revs), 'confirm': confirmopt, - 'startnode': startnode.node(), 'skippedrevs': [], + 'startnode': startnode, 'skippedrevs': [], 'command': 'evolve', 'orphanmerge': False, 'bookmarkchanges': [], 'temprevs': [], 'obsmarkers': []} evolvestate.addopts(stateopts) @@ -1601,8 +1747,9 @@ _cleanup(ui, repo, startnode, showprogress, shouldupdate) def solveobswdp(ui, repo, opts): + """this function updates to the successor of obsolete wdir parent""" oldid = repo['.'].node() - startnode = repo['.'] + startctx = repo['.'] dryrunopt = opts.get('dry_run', False) displayer = compat.changesetdisplayer(ui, repo, {'template': shorttemplate}) @@ -1625,7 +1772,7 @@ res = hg.update(repo, ctx.rev()) newid = ctx.node() - if ctx != startnode: + if ctx != startctx: with repo.wlock(), repo.lock(), repo.transaction('evolve') as tr: bmupdater = rewriteutil.bookmarksupdater(repo, oldid, tr) bmupdater(newid) @@ -1820,8 +1967,26 @@ repo[other], repo[base], evolvestate) - evolvestate['replacements'][divergent] = ret[1] + origdivergent = evolvestate['orig-divergent'] + evolvestate['replacements'][origdivergent] = ret[1] + # logic to continue the public content-divergent + publicnode = evolvestate.get('public-divergent') + if publicnode: + res, newnode = ret + if not res: + # no need to proceed for phase divergence resolution step + pass + elif newnode == publicnode: + # merging had the same changes as public changeset and + # divergence has been resolved by creating markers + pass + else: + prec = repo[publicnode] + bumped = repo[newnode] + ret = _resolvephasedivergent(ui, repo, prec=prec, + bumped=bumped, tmpctx=bumped) tr.close() + return ret finally: tr.release() diff -r 7d54a538dd1e -r 05f8908df4ce hgext3rd/evolve/metadata.py --- a/hgext3rd/evolve/metadata.py Wed Feb 13 21:39:10 2019 +0800 +++ b/hgext3rd/evolve/metadata.py Tue Apr 02 20:32:15 2019 +0200 @@ -5,7 +5,7 @@ # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. -__version__ = '8.4.1.dev' +__version__ = '8.5.0.dev' testedwith = '4.4.2 4.5.2 4.6.2 4.7 4.8 4.9' minimumhgversion = '4.4' buglink = 'https://bz.mercurial-scm.org/' diff -r 7d54a538dd1e -r 05f8908df4ce hgext3rd/evolve/obsdiscovery.py --- a/hgext3rd/evolve/obsdiscovery.py Wed Feb 13 21:39:10 2019 +0800 +++ b/hgext3rd/evolve/obsdiscovery.py Tue Apr 02 20:32:15 2019 +0200 @@ -88,9 +88,15 @@ common = set() undecided = set(probeset) totalnb = len(undecided) + heads = [rev for rev in cl.headrevs() if rev != node.nullrev] compat.progress(ui, _("comparing with other"), 0, total=totalnb, unit=_("changesets")) - _takefullsample = setdiscovery._takefullsample + if util.safehasattr(setdiscovery, '_takefullsample'): + # hg compat <= hg-4.9 (e5ece0f46b40) + _takefullsample = setdiscovery._takefullsample + else: + obsdiscov = setdiscovery.partialdiscovery(local, heads) + _takefullsample = obsdiscov.takefullsample if remote.capable('_evoext_obshash_1'): getremotehash = remote.evoext_obshash1 localhash = _obsrelsethashtreefm1(local) @@ -104,13 +110,18 @@ if len(undecided) < fullsamplesize: sample = set(undecided) else: - # Mercurial 4.8 changed calling convention. - if len(inspect.getargspec(_takefullsample)[0]) == 4: - sample = _takefullsample(local, None, undecided, - size=fullsamplesize) + if util.safehasattr(setdiscovery, '_takefullsample'): + # compat <= hg-4.9 (e5ece0f46b40) + if len(inspect.getargspec(_takefullsample)[0]) == 4: + # Mercurial 4.8 changed calling convention. + sample = _takefullsample(local, None, undecided, + size=fullsamplesize) + else: + # hg <= 4.7 version + sample = _takefullsample(dag, undecided, + size=fullsamplesize) else: - # hg <= 4.7 version - sample = _takefullsample(dag, undecided, size=fullsamplesize) + sample = _takefullsample(None, size=fullsamplesize) roundtrips += 1 compat.progress(ui, _("comparing with other"), totalnb - len(undecided), diff -r 7d54a538dd1e -r 05f8908df4ce hgext3rd/evolve/obshistory.py --- a/hgext3rd/evolve/obshistory.py Wed Feb 13 21:39:10 2019 +0800 +++ b/hgext3rd/evolve/obshistory.py Tue Apr 02 20:32:15 2019 +0200 @@ -780,46 +780,6 @@ return True -def geteffectflag(relation): - """compute the effect flag by comparing the source and destination""" - effects = 0 - - source = relation[0] - - for changectx in relation[1]: - # Check if description has changed - if changectx.description() != source.description(): - effects |= DESCCHANGED - - # Check if known meta has changed - if changectx.user() != source.user(): - effects |= USERCHANGED - - if changectx.date() != source.date(): - effects |= DATECHANGED - - if changectx.branch() != source.branch(): - effects |= BRANCHCHANGED - - # Check if other meta has changed - changeextra = changectx.extra().items() - ctxmeta = filter(ismetablacklisted, changeextra) - - sourceextra = source.extra().items() - srcmeta = filter(ismetablacklisted, sourceextra) - - if ctxmeta != srcmeta: - effects |= METACHANGED - - # Check if at least one of the parent has changes - if changectx.parents() != source.parents(): - effects |= PARENTCHANGED - - if not _cmpdiff(source, changectx): - effects |= DIFFCHANGED - - return effects - def _prepare_hunk(hunk): """Drop all information but the username and patch""" cleanunk = [] @@ -838,28 +798,6 @@ return None return _prepare_hunk(lines) -def _cmpdiff(leftctx, rightctx): - """return True if both ctx introduce the "same diff" - - This is a first and basic implementation, with many shortcoming. - """ - - # Leftctx or right ctx might be filtered, so we need to use the contexts - # with an unfiltered repository to safely compute the diff - leftunfi = leftctx._repo.unfiltered()[leftctx.rev()] - leftdiff = leftunfi.diff(git=1) - rightunfi = rightctx._repo.unfiltered()[rightctx.rev()] - rightdiff = rightunfi.diff(git=1) - - left, right = (0, 0) - while None not in (left, right): - left = _getdifflines(leftdiff) - right = _getdifflines(rightdiff) - - if left != right: - return False - return True - def _getobsfate(successorssets): """ Compute a changeset obsolescence fate based on his successorssets. Successors can be the tipmost ones or the immediate ones. diff -r 7d54a538dd1e -r 05f8908df4ce hgext3rd/evolve/utility.py --- a/hgext3rd/evolve/utility.py Wed Feb 13 21:39:10 2019 +0800 +++ b/hgext3rd/evolve/utility.py Tue Apr 02 20:32:15 2019 +0200 @@ -164,7 +164,7 @@ promptmsg = customheader + "\n" for idx, rev in enumerate(revs): curctx = repo[rev] - revmsg = "%d: [%s] %s\n" % (idx, curctx, + revmsg = "%d: [%s] %s\n" % (idx + 1, curctx, curctx.description().split("\n")[0]) promptmsg += revmsg @@ -181,9 +181,9 @@ ui.write_err(_("invalid value '%s' entered for index\n") % idxselected) return None - if intidx >= len(revs) or intidx < 0: + if intidx > len(revs) or intidx <= 0: # we can make this error message better ui.write_err(_("invalid value '%d' entered for index\n") % intidx) return None - return revs[intidx] + return revs[intidx - 1] diff -r 7d54a538dd1e -r 05f8908df4ce hgext3rd/topic/__init__.py --- a/hgext3rd/topic/__init__.py Wed Feb 13 21:39:10 2019 +0800 +++ b/hgext3rd/topic/__init__.py Tue Apr 02 20:32:15 2019 +0200 @@ -167,7 +167,9 @@ 'topic.stack.state.current': 'cyan bold', # random pick 'topic.stack.desc.current': 'cyan', # random pick 'topic.stack.shortnode.current': 'cyan', # random pick - 'topic.stack.state.unstable': 'red', + 'topic.stack.state.orphan': 'red', + 'topic.stack.state.content-divergent': 'red', + 'topic.stack.state.phase-divergent': 'red', 'topic.stack.summary.behindcount': 'cyan', 'topic.stack.summary.behinderror': 'red', 'topic.stack.summary.headcount.multiple': 'yellow', @@ -177,7 +179,7 @@ 'topic.active': 'green', } -__version__ = '0.13.1.dev' +__version__ = '0.14.0.dev' testedwith = '4.4.2 4.5.2 4.6.2 4.7 4.8 4.9' minimumhgversion = '4.4' diff -r 7d54a538dd1e -r 05f8908df4ce hgext3rd/topic/revset.py --- a/hgext3rd/topic/revset.py Wed Feb 13 21:39:10 2019 +0800 +++ b/hgext3rd/topic/revset.py Tue Apr 02 20:32:15 2019 +0200 @@ -108,7 +108,7 @@ return revset.baseset(stack.stack(repo, branch=branch, topic=topic)[1:]) & subset if util.safehasattr(revset, 'subscriptrelations'): - def stackrel(repo, subset, x, rel, n, order): + def stackrel(repo, subset, x, rel, z, order): """This is a revset-flavored implementation of stack aliases. The syntax is: rev#stack[n] or rev#s[n]. Plenty of logic is borrowed @@ -116,9 +116,25 @@ (e.g. when stack index is too high), this returns empty set to be more revset-friendly. """ + # hg 4.9 provides a number or None, hg 5.0 provides a tuple of tokens + if isinstance(z, tuple): + a, b = revset.getintrange( + z, + 'relation subscript must be an integer or a range', + 'relation subscript bounds must be integers', + None, None) + else: + a = b = z + s = revset.getset(repo, revset.fullreposet(repo), x) if not s: return revset.baseset() + + def getrange(st, a, b): + start = 1 if a is None else a + end = len(st.revs) if b is None else b + 1 + return range(start, end) + revs = [] for r in s: topic = repo[r].topic() @@ -126,32 +142,29 @@ st = stack.stack(repo, topic=topic) else: st = stack.stack(repo, branch=repo[r].branch()) - if n < 0: - st = list(st)[1:] - else: - st = list(st) - try: - rev = st[n] - except IndexError: - continue - if rev == -1 and n == 0: - continue - if rev not in revs: - revs.append(rev) + for n in getrange(st, a, b): + if abs(n) >= len(st.revs): + # also means stack base is not accessible with n < 0, which + # is by design + continue + if n == 0 and b != 0 and a != 0: + # quirk: we don't want stack base unless specifically asked + # for it (at least one of the indices is 0) + continue + rev = st.revs[n] + if rev == -1 and n == 0: + continue + if rev not in revs: + revs.append(rev) + return subset & revset.baseset(revs) revset.subscriptrelations['stack'] = stackrel revset.subscriptrelations['s'] = stackrel - def topicrel(repo, subset, x, rel, n, order): - ancestors = revset._ancestors - descendants = revset._descendants - subset = topicset(repo, subset, x) - if n <= 0: - n = -n - return ancestors(repo, subset, x, startdepth=n, stopdepth=n + 1) - else: - return descendants(repo, subset, x, startdepth=n, stopdepth=n + 1) + def topicrel(repo, subset, x, *args): + subset &= topicset(repo, subset, x) + return revset.generationsrel(repo, subset, x, *args) revset.subscriptrelations['topic'] = topicrel revset.subscriptrelations['t'] = topicrel diff -r 7d54a538dd1e -r 05f8908df4ce hgext3rd/topic/stack.py --- a/hgext3rd/topic/stack.py Wed Feb 13 21:39:10 2019 +0800 +++ b/hgext3rd/topic/stack.py Tue Apr 02 20:32:15 2019 +0200 @@ -5,7 +5,6 @@ from mercurial.i18n import _ from mercurial import ( destutil, - context, error, node, phases, @@ -20,14 +19,6 @@ short = node.short -# TODO: compat - -if not util.safehasattr(context.basectx, 'orphan'): - context.basectx.orphan = context.basectx.unstable - -if not util.safehasattr(context.basectx, 'isunstable'): - context.basectx.isunstable = context.basectx.troubled - def parseusername(user): """parses the ctx user and returns the username without email ID if possible, otherwise returns the mail address from that""" @@ -228,7 +219,7 @@ """ Takes a label prefix and a list of suffixes. Returns a string of the prefix formatted with each suffix separated with a space. """ - return ' '.join(prefix % suffix for suffix in labelssuffix) + return ' '.join(prefix % suffix.replace(' ', '-') for suffix in labelssuffix) def showstack(ui, repo, branch=None, topic=None, opts=None): if opts is None: @@ -293,7 +284,8 @@ if empty: fm.plain(_("(stack is empty)\n")) - for idx, r in enumerate(stack(repo, branch=branch, topic=topic), 0): + st = stack(repo, branch=branch, topic=topic) + for idx, r in enumerate(st, 0): ctx = repo[r] # special case for t0, b0 as it's hard to plugin into rest of the logic if idx == 0: @@ -329,32 +321,28 @@ symbol = None states = [] - msg = '' - iscurrentrevision = repo.revs('%d and parents()', ctx.rev()) if opts.get('children'): - if branch: - t_msg = '-branch("%s")' % branch - if topic: - t_msg = '-topic("%s")' % topic - rev_msg = 'children(%s) and merge() %s' - revisions = repo.revs(rev_msg % (ctx.rev(), t_msg)) - len_rev = len(revisions) - if len_rev > 0: - msg = 'external-children' - - if iscurrentrevision: - symbol = '@' - if msg: - states.append('current - ' + msg) - else: - states.append('current') + expr = 'children(%d) and merge() - %ld' + revisions = repo.revs(expr, ctx.rev(), st.revs[1:]) + if len(revisions) > 0: + states.append('external-children') if ctx.orphan(): symbol = '$' - if msg: - states.append('unstable - ' + msg) - else: - states.append('unstable') + states.append('orphan') + + if ctx.contentdivergent(): + symbol = '$' + states.append('content divergent') + + if ctx.phasedivergent(): + symbol = '$' + states.append('phase divergent') + + iscurrentrevision = repo.revs('%d and parents()', ctx.rev()) + if iscurrentrevision: + symbol = '@' + states.append('current') if not isentry: symbol = '^' @@ -364,10 +352,9 @@ # none of the above if statments get executed if not symbol: symbol = ':' - if msg: - states.append(msg) - else: - states.append('clean') + + if not states: + states.append('clean') states.sort() diff -r 7d54a538dd1e -r 05f8908df4ce hgext3rd/topic/topicmap.py diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve-abort-phasediv.t --- a/tests/test-evolve-abort-phasediv.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-evolve-abort-phasediv.t Tue Apr 02 20:32:15 2019 +0200 @@ -207,8 +207,7 @@ recreate:[7] added d atop:[4] added d rebasing to destination parent: ca1b80f7960a - computing new diff - committed as c41c793e0ef1 + no changes to commit recreate:[9] added c atop:[3] added c rebasing to destination parent: b1661037fa25 @@ -292,7 +291,6 @@ continue: hg evolve --continue $ hg evolve --continue evolving 9:28cd06b3f801 "added c" - computing new diff committed as 95d746965290 recreate:[10] added d atop:[4] added d diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve-content-divergence.t --- a/tests/test-evolve-content-divergence.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-evolve-content-divergence.t Tue Apr 02 20:32:15 2019 +0200 @@ -595,7 +595,7 @@ @@ -0,0 +1,1 @@ +bar -Testing when the relocation will result in conflicts and merging wont +Testing when the relocation will result in conflicts and merging also: ---------------------------------------------------------------------- $ hg glog @@ -660,7 +660,7 @@ o 0:8fa14d15e168 added hgignore () [default] draft - $ hg evolve --content-divergent + $ hg evolve --content-divergent --any merge:[25] added z with: [23] added z base: [22] added z @@ -928,6 +928,189 @@ o 0:8fa14d15e168 added hgignore () [default] draft +Resolving content-divergence of a stack with different parents +--------------------------------------------------------- + + $ cd .. + $ hg init stackrepo1 + $ cd stackrepo1 + $ echo ".*\.orig" > .hgignore + $ hg add .hgignore + $ hg ci -m "added hgignore" + + $ for ch in a b c d; + > do echo foo > $ch; + > hg add $ch; + > hg ci -qm "added "$ch; + > done; + + $ hg glog + @ 4:c41c793e0ef1 added d + | () [default] draft + o 3:ca1b80f7960a added c + | () [default] draft + o 2:b1661037fa25 added b + | () [default] draft + o 1:c7586e2a9264 added a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ cd .. + $ hg init stackrepo2 + $ cd stackrepo2 + $ hg pull ../stackrepo1 + pulling from ../stackrepo1 + requesting all changes + adding changesets + adding manifests + adding file changes + added 5 changesets with 5 changes to 5 files + new changesets 8fa14d15e168:c41c793e0ef1 (5 drafts) + (run 'hg update' to get a working copy) + + $ hg glog + o 4:c41c793e0ef1 added d + | () [default] draft + o 3:ca1b80f7960a added c + | () [default] draft + o 2:b1661037fa25 added b + | () [default] draft + o 1:c7586e2a9264 added a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ hg up 8fa14d15e168 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo newfile > newfile + $ hg ci -Am "add newfile" + adding newfile + created new head + $ hg rebase -s c7586e2a9264 -d . + rebasing 1:c7586e2a9264 "added a" + rebasing 2:b1661037fa25 "added b" + rebasing 3:ca1b80f7960a "added c" + rebasing 4:c41c793e0ef1 "added d" + + $ hg glog + o 9:d45f050514c2 added d + | () [default] draft + o 8:8ed612937375 added c + | () [default] draft + o 7:6eb54b5af3fb added b + | () [default] draft + o 6:c04ff147ef79 added a + | () [default] draft + @ 5:2228e3b74514 add newfile + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ cd ../stackrepo1 + $ hg up .^^^ + 0 files updated, 0 files merged, 3 files removed, 0 files unresolved + $ echo wat > a + $ hg amend -m "watbar to a" + 3 new orphan changesets + $ hg evolve --all + move:[2] added b + atop:[5] watbar to a + move:[3] added c + move:[4] added d + working directory is now at c72d2885eb51 + + $ hg glog + @ 8:c72d2885eb51 added d + | () [default] draft + o 7:3ce4be6d8e5e added c + | () [default] draft + o 6:d5f148423c16 added b + | () [default] draft + o 5:8e222f257bbf watbar to a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ hg pull ../stackrepo2 + pulling from ../stackrepo2 + searching for changes + adding changesets + adding manifests + adding file changes + added 5 changesets with 1 changes to 5 files (+1 heads) + 4 new obsolescence markers + 8 new content-divergent changesets + new changesets 2228e3b74514:d45f050514c2 (5 drafts) + (run 'hg heads' to see heads, 'hg merge' to merge) + + $ hg glog + * 13:d45f050514c2 added d + | () [default] draft + * 12:8ed612937375 added c + | () [default] draft + * 11:6eb54b5af3fb added b + | () [default] draft + * 10:c04ff147ef79 added a + | () [default] draft + o 9:2228e3b74514 add newfile + | () [default] draft + | @ 8:c72d2885eb51 added d + | | () [default] draft + | * 7:3ce4be6d8e5e added c + | | () [default] draft + | * 6:d5f148423c16 added b + | | () [default] draft + | * 5:8e222f257bbf watbar to a + |/ () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ hg evolve --all --content-divergent + merge:[10] added a + with: [5] watbar to a + base: [1] added a + rebasing "other" content-divergent changeset 8e222f257bbf on 2228e3b74514 + updating to "local" side of the conflict: c04ff147ef79 + merging "other" content-divergent changeset '186bdc2cdfa2' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + 6 new orphan changesets + merge:[11] added b + with: [6] added b + base: [2] added b + rebasing "other" content-divergent changeset d5f148423c16 on c04ff147ef79 + updating to "local" side of the conflict: 6eb54b5af3fb + merging "other" content-divergent changeset '8542f15656e7' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + merge:[12] added c + with: [7] added c + base: [3] added c + rebasing "other" content-divergent changeset 3ce4be6d8e5e on 6eb54b5af3fb + updating to "local" side of the conflict: 8ed612937375 + merging "other" content-divergent changeset 'a690ce53104a' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + merge:[13] added d + with: [8] added d + base: [4] added d + rebasing "other" content-divergent changeset c72d2885eb51 on 8ed612937375 + updating to "local" side of the conflict: d45f050514c2 + merging "other" content-divergent changeset '1d1772990a3b' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 5f7a38bdb75c + + $ hg glog + @ 21:5f7a38bdb75c added d + | () [default] draft + o 19:9865d598f0e0 added c + | () [default] draft + o 17:ac70b8c8eb63 added b + | () [default] draft + o 15:74fbf3e6a0b6 watbar to a + | () [default] draft + o 9:2228e3b74514 add newfile + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft Test to make sure that evolve don't fall into unrecoverable state (issue6053) ------------------------------------------------------------------------------ diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve-continue.t --- a/tests/test-evolve-continue.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-evolve-continue.t Tue Apr 02 20:32:15 2019 +0200 @@ -127,6 +127,7 @@ $ hg evolve --continue evolving 7:ad0a59d83efe "added e" evolution of 7:ad0a59d83efe created no changes to commit + working directory is now at 00a5c774cc37 $ hg glog @ 8:00a5c774cc37 added d diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve-issue5832.t --- a/tests/test-evolve-issue5832.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-evolve-issue5832.t Tue Apr 02 20:32:15 2019 +0200 @@ -112,17 +112,17 @@ Resolving instability using `hg evolve` $ hg evolve --any --all --config ui.interactive=True < 0 + > 1 > EOF move:[2] added b atop:[5] added a move:[4] merge commit ancestor '7235ef625ea3' split over multiple topological branches. choose an evolve destination: - 0: [62fb70414f99] added c - 1: [5841d7cf9893] added d + 1: [62fb70414f99] added c + 2: [5841d7cf9893] added d q: quit the prompt - enter the index of the revision you want to select: 0 + enter the index of the revision you want to select: 1 move:[9] merge commit atop:[6] added c working directory is now at 28a0775ac832 @@ -253,17 +253,17 @@ could not solve instability, ambiguous destination: parent split across two branches $ hg evolve --any --all --config ui.interactive=True < 1 + > 2 > EOF move:[2] added b atop:[6] added a move:[4] merge commit ancestor 'cdf2ea1b9312' split over multiple topological branches. choose an evolve destination: - 0: [62fb70414f99] added c - 1: [5841d7cf9893] added d + 1: [62fb70414f99] added c + 2: [5841d7cf9893] added d q: quit the prompt - enter the index of the revision you want to select: 1 + enter the index of the revision you want to select: 2 move:[10] merge commit atop:[8] added d working directory is now at 460e6e72b7f9 @@ -398,16 +398,16 @@ could not solve instability, ambiguous destination: parent split across two branches $ hg evolve --any --all --config ui.interactive=True < 1 + > 2 > EOF move:[2] added b atop:[6] added a ancestor 'b9b387427a53' split over multiple topological branches. choose an evolve destination: - 0: [62fb70414f99] added c - 1: [5841d7cf9893] added d + 1: [62fb70414f99] added c + 2: [5841d7cf9893] added d q: quit the prompt - enter the index of the revision you want to select: 1 + enter the index of the revision you want to select: 2 move:[4] merge commit atop:[8] added d move:[10] merge commit diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve-obshistory-lots-of-splits.t --- a/tests/test-evolve-obshistory-lots-of-splits.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-evolve-obshistory-lots-of-splits.t Tue Apr 02 20:32:15 2019 +0200 @@ -6,8 +6,8 @@ $ . $TESTDIR/testlib/obshistory_setup.sh -Test output with lots of splitted commit -======================================== +Test output with lots of split commit +===================================== Test setup ---------- diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve-obshistory-split.t --- a/tests/test-evolve-obshistory-split.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-evolve-obshistory-split.t Tue Apr 02 20:32:15 2019 +0200 @@ -6,8 +6,8 @@ $ . $TESTDIR/testlib/obshistory_setup.sh -Test output with splitted commit -================================ +Test output with split commit +============================= Test setup ---------- @@ -98,7 +98,7 @@ Check output on the client side ------------------------------- -Check that debugobshistory on splitted commit show both targets +Check that debugobshistory on split commit show both targets $ hg obslog 471597cad322 --hidden --patch x 471597cad322 (1) A0 rewritten(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) @@ -134,7 +134,7 @@ } ] Check that debugobshistory on the first successor after split show -the revision plus the splitted one +the revision plus the split one $ hg obslog 337fec4d2edc --patch o 337fec4d2edc (2) A0 | @@ -155,7 +155,7 @@ (No patch available, too many successors (2)) Check that debugobshistory on the second successor after split show -the revision plus the splitted one +the revision plus the split one $ hg obslog f257fde29c7a --patch @ f257fde29c7a (3) A0 | @@ -175,7 +175,7 @@ note: testing split (No patch available, too many successors (2)) -Obslog with all option all should also works on the splitted commit +Obslog with all option all should also works on the split commit $ hg obslog -a 471597cad322 --hidden --patch o 337fec4d2edc (2) A0 | diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve-order.t --- a/tests/test-evolve-order.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-evolve-order.t Tue Apr 02 20:32:15 2019 +0200 @@ -231,8 +231,8 @@ | ~ -Test multiple revision with some un-evolvable because parent is splitted ------------------------------------------------------------------------- +Test multiple revision with some un-evolvable because parent is split +--------------------------------------------------------------------- $ hg up 'desc(c2prime)' 0 files updated, 0 files merged, 2 files removed, 0 files unresolved diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve-orphan-split.t --- a/tests/test-evolve-orphan-split.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-evolve-orphan-split.t Tue Apr 02 20:32:15 2019 +0200 @@ -19,8 +19,8 @@ $ hg add .hgignore $ hg ci -m "added hgignore" -An orphan changeset with parent got splitted --------------------------------------------- +An orphan changeset with parent got split +----------------------------------------- $ for ch in a b c; do echo foo > $ch; done; @@ -182,27 +182,27 @@ () draft $ hg evolve --dry-run < 0 + > 1 > EOF ancestor 'd48a30875f01' split over multiple topological branches. choose an evolve destination: - 0: [f2632392aefe] added a b c - 1: [7f87764e5b64] added a b c + 1: [f2632392aefe] added a b c + 2: [7f87764e5b64] added a b c q: quit the prompt - enter the index of the revision you want to select: 0 + enter the index of the revision you want to select: 1 move:[7] added d atop:[8] added a b c hg rebase -r d48a30875f01 -d f2632392aefe $ hg evolve --dry-run < 1 + > 2 > EOF ancestor 'd48a30875f01' split over multiple topological branches. choose an evolve destination: - 0: [f2632392aefe] added a b c - 1: [7f87764e5b64] added a b c + 1: [f2632392aefe] added a b c + 2: [7f87764e5b64] added a b c q: quit the prompt - enter the index of the revision you want to select: 1 + enter the index of the revision you want to select: 2 move:[7] added d atop:[10] added a b c hg rebase -r d48a30875f01 -d 7f87764e5b64 @@ -215,8 +215,8 @@ > EOF ancestor 'd48a30875f01' split over multiple topological branches. choose an evolve destination: - 0: [f2632392aefe] added a b c - 1: [7f87764e5b64] added a b c + 1: [f2632392aefe] added a b c + 2: [7f87764e5b64] added a b c q: quit the prompt enter the index of the revision you want to select: foo invalid value 'foo' entered for index @@ -227,8 +227,8 @@ > EOF ancestor 'd48a30875f01' split over multiple topological branches. choose an evolve destination: - 0: [f2632392aefe] added a b c - 1: [7f87764e5b64] added a b c + 1: [f2632392aefe] added a b c + 2: [7f87764e5b64] added a b c q: quit the prompt enter the index of the revision you want to select: 4 invalid value '4' entered for index @@ -239,8 +239,8 @@ > EOF ancestor 'd48a30875f01' split over multiple topological branches. choose an evolve destination: - 0: [f2632392aefe] added a b c - 1: [7f87764e5b64] added a b c + 1: [f2632392aefe] added a b c + 2: [7f87764e5b64] added a b c q: quit the prompt enter the index of the revision you want to select: -1 invalid value '-1' entered for index @@ -251,8 +251,8 @@ > EOF ancestor 'd48a30875f01' split over multiple topological branches. choose an evolve destination: - 0: [f2632392aefe] added a b c - 1: [7f87764e5b64] added a b c + 1: [f2632392aefe] added a b c + 2: [7f87764e5b64] added a b c q: quit the prompt enter the index of the revision you want to select: q could not solve instability, ambiguous destination: parent split across two branches @@ -264,10 +264,10 @@ > EOF ancestor 'd48a30875f01' split over multiple topological branches. choose an evolve destination: - 0: [f2632392aefe] added a b c - 1: [7f87764e5b64] added a b c + 1: [f2632392aefe] added a b c + 2: [7f87764e5b64] added a b c q: quit the prompt enter the index of the revision you want to select: 1 move:[7] added d - atop:[10] added a b c - working directory is now at 1c6caa7c902a + atop:[8] added a b c + working directory is now at 71e4d45a7aaa diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve-phase-divergence.t --- a/tests/test-evolve-phase-divergence.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-evolve-phase-divergence.t Tue Apr 02 20:32:15 2019 +0200 @@ -28,7 +28,9 @@ Setting up a private non-publishing repo ---------------------------------------- - $ hg clone -U public private + $ hg clone public private + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd private $ cat >> .hg/hgrc < [extensions] @@ -45,6 +47,10 @@ $ cp -a private alice $ cp -a private bob + $ cp -a private split + $ cp -a private split-across-branches + $ cp -a private split-and-amend + $ cp -a private merge-no-conflict Creating a phase-divergence changeset ------------------------------------- @@ -52,8 +58,6 @@ Alice creating a draft changeset and pushing to main private repo $ cd alice - $ hg update - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ echo a >> a $ hg commit -u alice -m 'modify a' $ hg push ../private @@ -86,7 +90,7 @@ $ hg glog o 1:4d1169d82e47 modify a | () draft - o 0:d3873e73d99e init + @ 0:d3873e73d99e init () public $ hg push ../public @@ -100,7 +104,7 @@ $ hg glog o 1:4d1169d82e47 modify a | () public - o 0:d3873e73d99e init + @ 0:d3873e73d99e init () public *But* Alice decided to amend the changeset she had and then pulling from public @@ -193,8 +197,7 @@ $ hg evolve --phase-divergent recreate:[2] tweak a atop:[1] modify a - computing new diff - committed as 4d1169d82e47 + no changes to commit working directory is now at 4d1169d82e47 $ hg glog @@ -308,7 +311,6 @@ $ hg evolve --phase-divergent recreate:[4] added bar to foo atop:[3] added foo to foo - computing new diff committed as 3d62500c673d working directory is now at 3d62500c673d @@ -459,7 +461,6 @@ $ hg evolve --phase-divergent recreate:[7] foo to bar atop:[6] added bar to bar - computing new diff committed as 502e73736632 working directory is now at 502e73736632 @@ -596,8 +597,7 @@ atop:[9] added x to x rebasing to destination parent: 502e73736632 (leaving bookmark bm) - computing new diff - committed as 2352021b3785 + no changes to commit working directory is now at 2352021b3785 XXX: we should move bookmark here @@ -715,7 +715,6 @@ recreate:[14] y to y and foobar to foo atop:[12] y to y and foobar to foo rebasing to destination parent: 2352021b3785 - computing new diff committed as 8c2bb6fb44e9 working directory is now at 8c2bb6fb44e9 @@ -819,7 +818,6 @@ $ hg evolve --continue evolving 19:5fd38c0de46e "added l to l" - computing new diff committed as e3090241a10c working directory is now at e3090241a10c @@ -916,8 +914,7 @@ recreate:[24] added f atop:[23] added g rebasing to destination parent: 21ae52e414e6 - computing new diff - committed as 428f7900a969 + no changes to commit working directory is now at 428f7900a969 $ hg glog -r f3794e5a91dc:: @@ -931,127 +928,141 @@ | () public ~ -When the public changesets is splitted causing phase-divergence ---------------------------------------------------------------- +When the public changesets is split causing phase-divergence +------------------------------------------------------------ + + $ cd ../split $ echo m > m $ echo n > n $ hg ci -Aqm "added m and n" - $ hg glog -r 21ae52e414e6:: - @ 26:849cee0a874b added m and n + $ hg glog + @ 1:a51bce62c219 added m and n | () draft - o 23:428f7900a969 added g - | () public - o 22:21ae52e414e6 added f - | () public - ~ + o 0:d3873e73d99e init + () public $ hg prev 0 files updated, 0 files merged, 2 files removed, 0 files unresolved - [23] added g + [0] init $ echo m > m $ hg ci -Aqm "added m" $ echo n > n $ hg ci -Aqm "added n" - $ hg glog -r 428f7900a969:: - @ 28:63ccb8ea7cae added n + $ hg glog + @ 3:e1154ec0206a added n | () draft - o 27:f313e2b90e70 added m + o 2:4f25cd9cd2bf added m | () draft - | o 26:849cee0a874b added m and n + | o 1:a51bce62c219 added m and n |/ () draft - o 23:428f7900a969 added g - | () public - ~ + o 0:d3873e73d99e init + () public - $ hg prune -r 849cee0a874b --succ f313e2b90e70 --succ 63ccb8ea7cae --split + $ hg prune -r a51bce62c219 --succ 4f25cd9cd2bf --succ e1154ec0206a --split 1 changesets pruned - $ hg phase -r 849cee0a874b --hidden --public + $ hg phase -r a51bce62c219 --hidden --public 2 new phase-divergent changesets - $ hg glog -r 428f7900a969:: - @ 28:63ccb8ea7cae added n + $ hg glog + @ 3:e1154ec0206a added n | () draft - * 27:f313e2b90e70 added m + * 2:4f25cd9cd2bf added m | () draft - | o 26:849cee0a874b added m and n + | o 1:a51bce62c219 added m and n |/ () public - o 23:428f7900a969 added g - | () public - ~ + o 0:d3873e73d99e init + () public $ hg evolve --all --phase-divergent - recreate:[27] added m - atop:[26] added m and n - computing new diff - committed as 870e1c3eddc3 + recreate:[2] added m + atop:[1] added m and n + committed as 86419909e017 1 new orphan changesets - recreate:[28] added n - atop:[26] added m and n - rebasing to destination parent: 428f7900a969 - computing new diff - committed as 154b0179fb9b - working directory is now at 154b0179fb9b + recreate:[3] added n + atop:[1] added m and n + rebasing to destination parent: d3873e73d99e + committed as 89ba615ea1ec + working directory is now at 89ba615ea1ec XXX: this is messy, we should solve things in better way - $ hg glog -r 428f7900a969:: --hidden - @ 31:154b0179fb9b phase-divergent update to 849cee0a874b: + $ hg glog --hidden + @ 6:89ba615ea1ec phase-divergent update to a51bce62c219: | () draft - | x 30:1ebf33547a82 added n + | x 5:ee4af146c5cf added n | | () draft - +---o 29:870e1c3eddc3 phase-divergent update to 849cee0a874b: + +---o 4:86419909e017 phase-divergent update to a51bce62c219: | | () draft - | | x 28:63ccb8ea7cae added n + | | x 3:e1154ec0206a added n | | | () draft - | | x 27:f313e2b90e70 added m + | | x 2:4f25cd9cd2bf added m | |/ () draft - o | 26:849cee0a874b added m and n + o | 1:a51bce62c219 added m and n |/ () public - o 23:428f7900a969 added g - | () public - ~ + o 0:d3873e73d99e init + () public + + $ hg obslog -r a51bce62c219 --all + o 86419909e017 (4) phase-divergent update to a51bce62c219: + | + | @ 89ba615ea1ec (6) phase-divergent update to a51bce62c219: + | | + x | 4f25cd9cd2bf (2) added m + | | rewritten(description, parent, content) as 86419909e017 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | + | x ee4af146c5cf (5) added n + | | rewritten(description, parent, content) as 89ba615ea1ec using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | + | x e1154ec0206a (3) added n + |/ rewritten(parent) as ee4af146c5cf using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | + o a51bce62c219 (1) added m and n + rewritten(description, parent, content) as 4f25cd9cd2bf, e1154ec0206a using prune by test (Thu Jan 01 00:00:00 1970 +0000) + XXX: not sure this is the correct - $ hg exp 154b0179fb9b + $ hg exp 89ba615ea1ec # HG changeset patch # User test # Date 0 0 # Thu Jan 01 00:00:00 1970 +0000 - # Node ID 154b0179fb9b53d2f853d6ba04740bb3d7a5cabe - # Parent 849cee0a874be7c4e75dfacb5ad72aa5696951ba - phase-divergent update to 849cee0a874b: + # Node ID 89ba615ea1ec3ba5b25db9f7897eb29712d7e5d6 + # Parent a51bce62c219f024bc0ae0cc0e3957ee77d7cb46 + phase-divergent update to a51bce62c219: added n - diff -r 849cee0a874b -r 154b0179fb9b m + diff -r a51bce62c219 -r 89ba615ea1ec m --- a/m Thu Jan 01 00:00:00 1970 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -m XXX: not sure this is correct - $ hg exp 870e1c3eddc3 + $ hg exp 86419909e017 # HG changeset patch # User test # Date 0 0 # Thu Jan 01 00:00:00 1970 +0000 - # Node ID 870e1c3eddc34cc475e8e13d2fe1934210c1937e - # Parent 849cee0a874be7c4e75dfacb5ad72aa5696951ba - phase-divergent update to 849cee0a874b: + # Node ID 86419909e01787959aa6471aee605c6d604a3e0d + # Parent a51bce62c219f024bc0ae0cc0e3957ee77d7cb46 + phase-divergent update to a51bce62c219: added m - diff -r 849cee0a874b -r 870e1c3eddc3 n + diff -r a51bce62c219 -r 86419909e017 n --- a/n Thu Jan 01 00:00:00 1970 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -n -When the public changeset is splitted across various branches --------------------------------------------------------------- +When the public changeset is split across various branches +---------------------------------------------------------- + + $ cd ../split-across-branches $ echo p > p $ echo q > q @@ -1059,177 +1070,320 @@ $ hg prev 0 files updated, 0 files merged, 2 files removed, 0 files unresolved - [31] phase-divergent update to 849cee0a874b: + [0] init $ echo p > p $ hg ci -Aqm "added p" $ hg prev 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - [31] phase-divergent update to 849cee0a874b: + [0] init $ echo q > q $ hg ci -Aqm "added q" - $ hg glog -r 154b0179fb9b:: - @ 34:e046341aa97c added q + $ hg glog + @ 3:bb87595f9a77 added q | () draft - | o 33:6f8c250eecff added p + | o 2:a47263294745 added p |/ () draft - | o 32:8a70f55b2af3 added p and q + | o 1:90859808ece6 added p and q |/ () draft - o 31:154b0179fb9b phase-divergent update to 849cee0a874b: - | () draft - ~ + o 0:d3873e73d99e init + () public - $ hg prune -r 8a70f55b2af3 --succ 6f8c250eecff --succ e046341aa97c --split + $ hg prune -r 90859808ece6 --succ a47263294745 --succ bb87595f9a77 --split 1 changesets pruned - $ hg phase -r 8a70f55b2af3 --public --hidden + $ hg phase -r 90859808ece6 --public --hidden 2 new phase-divergent changesets - $ hg glog -r 154b0179fb9b:: - @ 34:e046341aa97c added q + $ hg glog + @ 3:bb87595f9a77 added q | () draft - | * 33:6f8c250eecff added p + | * 2:a47263294745 added p |/ () draft - | o 32:8a70f55b2af3 added p and q + | o 1:90859808ece6 added p and q |/ () public - o 31:154b0179fb9b phase-divergent update to 849cee0a874b: - | () public - ~ + o 0:d3873e73d99e init + () public $ hg evolve --list - 6f8c250eecff: added p - phase-divergent: 8a70f55b2af3 (immutable precursor) + a47263294745: added p + phase-divergent: 90859808ece6 (immutable precursor) - e046341aa97c: added q - phase-divergent: 8a70f55b2af3 (immutable precursor) + bb87595f9a77: added q + phase-divergent: 90859808ece6 (immutable precursor) $ hg evolve --all --phase-divergent - recreate:[33] added p - atop:[32] added p and q - computing new diff - committed as f3e41d89b3c5 - recreate:[34] added q - atop:[32] added p and q - computing new diff - committed as 605c306d4f87 - working directory is now at 605c306d4f87 + recreate:[2] added p + atop:[1] added p and q + committed as 25875a9cb640 + recreate:[3] added q + atop:[1] added p and q + committed as 26f564f94bcc + working directory is now at 26f564f94bcc - $ hg glog -r 154b0179fb9b:: --hidden - @ 36:605c306d4f87 phase-divergent update to 8a70f55b2af3: + $ hg glog --hidden + @ 5:26f564f94bcc phase-divergent update to 90859808ece6: | () draft - | o 35:f3e41d89b3c5 phase-divergent update to 8a70f55b2af3: + | o 4:25875a9cb640 phase-divergent update to 90859808ece6: |/ () draft - | x 34:e046341aa97c added q + | x 3:bb87595f9a77 added q | | () draft - | | x 33:6f8c250eecff added p + | | x 2:a47263294745 added p | |/ () draft - o | 32:8a70f55b2af3 added p and q + o | 1:90859808ece6 added p and q |/ () public - o 31:154b0179fb9b phase-divergent update to 849cee0a874b: - | () public - ~ + o 0:d3873e73d99e init + () public + + $ hg obslog -r 90859808ece6 --all + o 25875a9cb640 (4) phase-divergent update to 90859808ece6: + | + | @ 26f564f94bcc (5) phase-divergent update to 90859808ece6: + | | + x | a47263294745 (2) added p + | | rewritten(description, parent, content) as 25875a9cb640 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | + | x bb87595f9a77 (3) added q + |/ rewritten(description, parent, content) as 26f564f94bcc using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | + o 90859808ece6 (1) added p and q + rewritten(description, content) as a47263294745, bb87595f9a77 using prune by test (Thu Jan 01 00:00:00 1970 +0000) + XXX: not sure this is correct - $ hg exp 605c306d4f87 + $ hg exp 26f564f94bcc # HG changeset patch # User test # Date 0 0 # Thu Jan 01 00:00:00 1970 +0000 - # Node ID 605c306d4f87fccfdb5e7dd1c750b6d4f813defb - # Parent 8a70f55b2af35452916dc89401a5ecf6553646a5 - phase-divergent update to 8a70f55b2af3: + # Node ID 26f564f94bcc34e049eb112fd14ab1e5286f2325 + # Parent 90859808ece64c9ca64dd29992db42353c70f164 + phase-divergent update to 90859808ece6: added q - diff -r 8a70f55b2af3 -r 605c306d4f87 p + diff -r 90859808ece6 -r 26f564f94bcc p --- a/p Thu Jan 01 00:00:00 1970 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -p XXX: not sure this is correct - $ hg exp f3e41d89b3c5 + $ hg exp 25875a9cb640 # HG changeset patch # User test # Date 0 0 # Thu Jan 01 00:00:00 1970 +0000 - # Node ID f3e41d89b3c5f6ee49ccc734045856d7b025f048 - # Parent 8a70f55b2af35452916dc89401a5ecf6553646a5 - phase-divergent update to 8a70f55b2af3: + # Node ID 25875a9cb6400973b846c94f6a80410067c2cb1f + # Parent 90859808ece64c9ca64dd29992db42353c70f164 + phase-divergent update to 90859808ece6: added p - diff -r 8a70f55b2af3 -r f3e41d89b3c5 q + diff -r 90859808ece6 -r 25875a9cb640 q --- a/q Thu Jan 01 00:00:00 1970 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -q +When the public changeset is split and amended +-------------------------------------------------------------- + + $ cd ../split-and-amend + + $ echo m > m + $ echo n > n + $ hg ci -Aqm "added m and n" + $ hg prev + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + [0] init + $ echo m > m + $ hg ci -Aqm "added m" + $ echo n > n + $ hg ci -Aqm "added n" + + $ hg glog + @ 3:e1154ec0206a added n + | () draft + o 2:4f25cd9cd2bf added m + | () draft + | o 1:a51bce62c219 added m and n + |/ () draft + o 0:d3873e73d99e init + () public + + $ hg prune -r a51bce62c219 --succ 4f25cd9cd2bf --succ e1154ec0206a --split + 1 changesets pruned + + $ echo n2 > n + $ hg amend + + $ hg phase -r a51bce62c219 --public --hidden + 2 new phase-divergent changesets + + $ hg glog + @ 4:52ca78bb98c7 added n + | () draft + * 2:4f25cd9cd2bf added m + | () draft + | o 1:a51bce62c219 added m and n + |/ () public + o 0:d3873e73d99e init + () public + + $ hg evolve --list + 4f25cd9cd2bf: added m + phase-divergent: a51bce62c219 (immutable precursor) + + 52ca78bb98c7: added n + phase-divergent: a51bce62c219 (immutable precursor) + + $ hg evolve --all --phase-divergent + recreate:[2] added m + atop:[1] added m and n + committed as 86419909e017 + 1 new orphan changesets + recreate:[4] added n + atop:[1] added m and n + rebasing to destination parent: d3873e73d99e + committed as 88b0dae5369a + working directory is now at 88b0dae5369a + + $ hg glog --hidden + @ 7:88b0dae5369a phase-divergent update to a51bce62c219: + | () draft + | x 6:98dad8812511 added n + | | () draft + +---o 5:86419909e017 phase-divergent update to a51bce62c219: + | | () draft + | | x 4:52ca78bb98c7 added n + | | | () draft + | | | x 3:e1154ec0206a added n + | | |/ () draft + | | x 2:4f25cd9cd2bf added m + | |/ () draft + o | 1:a51bce62c219 added m and n + |/ () public + o 0:d3873e73d99e init + () public + + $ hg obslog -r a51bce62c219 --all + o 86419909e017 (5) phase-divergent update to a51bce62c219: + | + | @ 88b0dae5369a (7) phase-divergent update to a51bce62c219: + | | + x | 4f25cd9cd2bf (2) added m + | | rewritten(description, parent, content) as 86419909e017 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | + | x 98dad8812511 (6) added n + | | rewritten(description, parent, content) as 88b0dae5369a using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | + | x 52ca78bb98c7 (4) added n + | | rewritten(parent) as 98dad8812511 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | + | x e1154ec0206a (3) added n + |/ rewritten(content) as 52ca78bb98c7 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | + o a51bce62c219 (1) added m and n + rewritten(description, parent, content) as 4f25cd9cd2bf, e1154ec0206a using prune by test (Thu Jan 01 00:00:00 1970 +0000) + + +XXX: not sure this is correct + $ hg exp 86419909e017 + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 86419909e01787959aa6471aee605c6d604a3e0d + # Parent a51bce62c219f024bc0ae0cc0e3957ee77d7cb46 + phase-divergent update to a51bce62c219: + + added m + + diff -r a51bce62c219 -r 86419909e017 n + --- a/n Thu Jan 01 00:00:00 1970 +0000 + +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +0,0 @@ + -n + +XXX: not sure this is correct + $ hg exp 88b0dae5369a + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 88b0dae5369aaa3bceb6c0b647542594e2c72fb7 + # Parent a51bce62c219f024bc0ae0cc0e3957ee77d7cb46 + phase-divergent update to a51bce62c219: + + added n + + diff -r a51bce62c219 -r 88b0dae5369a m + --- a/m Thu Jan 01 00:00:00 1970 +0000 + +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +0,0 @@ + -m + diff -r a51bce62c219 -r 88b0dae5369a n + --- a/n Thu Jan 01 00:00:00 1970 +0000 + +++ b/n Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,1 @@ + -n + +n2 + Testing the evolution of a phase-divergent merge with no conflicts ------------------------------------------------------------------ - $ hg glog -r 154b0179fb9b:: - @ 36:605c306d4f87 phase-divergent update to 8a70f55b2af3: - | () draft - | o 35:f3e41d89b3c5 phase-divergent update to 8a70f55b2af3: - |/ () draft - o 32:8a70f55b2af3 added p and q - | () public - o 31:154b0179fb9b phase-divergent update to 849cee0a874b: - | () public - ~ + $ cd ../merge-no-conflict $ echo h > h $ hg ci -Aqm "added h" $ hg prev 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - [36] phase-divergent update to 8a70f55b2af3: + [0] init $ echo i > i $ hg ci -Aqm "added i" - $ hg merge -r ef8c23f37b55 + $ hg merge -r a53d182199c1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hg ci -m "merge h and i" - $ hg glog -r 605c306d4f87:: - @ 39:12ebe0d625d7 merge h and i + $ hg glog + @ 3:205b2f5ecb7b merge h and i |\ () draft - | o 38:9bb561db4230 added i + | o 2:f0be5e638ecf added i | | () draft - o | 37:ef8c23f37b55 added h + o | 1:a53d182199c1 added h |/ () draft - o 36:605c306d4f87 phase-divergent update to 8a70f55b2af3: - | () draft - ~ + o 0:d3873e73d99e init + () public - $ hg up ef8c23f37b55 + $ hg up a53d182199c1 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ hg merge -r 9bb561db4230 + $ hg merge -r f0be5e638ecf 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hg ci -m "merge h and i successor" created new head - $ hg glog -r 605c306d4f87:: - @ 40:d2aeda868461 merge h and i successor + $ hg glog + @ 4:8d4acf488ab5 merge h and i successor |\ () draft - +---o 39:12ebe0d625d7 merge h and i + +---o 3:205b2f5ecb7b merge h and i | |/ () draft - | o 38:9bb561db4230 added i + | o 2:f0be5e638ecf added i | | () draft - o | 37:ef8c23f37b55 added h + o | 1:a53d182199c1 added h |/ () draft - o 36:605c306d4f87 phase-divergent update to 8a70f55b2af3: - | () draft - ~ + o 0:d3873e73d99e init + () public - $ hg prune -r 12ebe0d625d7 --succ . + $ hg prune -r 205b2f5ecb7b --succ . 1 changesets pruned - $ hg phase 12ebe0d625d7 --hidden --public + $ hg phase 205b2f5ecb7b --hidden --public 1 new phase-divergent changesets Resolution of phase-divergent merge commit using `hg evolve` XXX: we should handle phase-divergent merges $ hg evolve --phase-divergent - skipping d2aeda868461 : we do not handle merge yet + skipping 8d4acf488ab5 : we do not handle merge yet diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve-public-content-divergent.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-evolve-public-content-divergent.t Tue Apr 02 20:32:15 2019 +0200 @@ -0,0 +1,1711 @@ +Test for handling of content divergence with public cset using `hg evolve` +========================================================================== + +Setup +===== + $ cat >> $HGRCPATH < [alias] + > glog = log -GT "{rev}:{node|short} {desc|firstline}\n {phase} {troubles}\n\n" + > [phases] + > publish = False + > [extensions] + > rebase = + > EOF + $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH + +Testing the case when both divergent cset are on the same parent and no-conflict in merging: +------------------------------------------------------------------------------------- + +Prepare the repository: + + $ hg init pubdiv + $ cd pubdiv + $ for ch in a b; do + > echo $ch > $ch; + > hg ci -Aqm "added "$ch; + > done; + $ hg glog + @ 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + +Make an amend and change phase to public: + + $ sed -i "1 i I am first" b + $ hg amend + $ hg phase --public + +Amend again to create a cset divergent to public one: + + $ hg up 1 --hidden -q + updated to hidden changeset 5f6d8a4bf34a + (hidden revision '5f6d8a4bf34a' was rewritten as: 44f360db368f) + working directory parent is obsolete! (5f6d8a4bf34a) + + $ echo "I am second" >> b + $ hg ci --amend -m "updated b" + 1 new content-divergent changesets + + $ hg glog + @ 3:dcdaf152280a updated b + | draft content-divergent + | + | o 2:44f360db368f added b + |/ public + | + o 0:9092f1db7931 added a + public + + +Lets resolve the public content-divergence: + + $ hg evolve --content-divergent + merge:[2] added b + with: [3] updated b + base: [1] added b + updating to "local" side of the conflict: 44f360db368f + merging "other" content-divergent changeset 'dcdaf152280a' + merging b + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + committed as c1aa9cfb6cf8 + working directory is now at c1aa9cfb6cf8 + +Following graph log shows that it correctly merged the two divergent csets: + + $ hg glog -p + @ 5:c1aa9cfb6cf8 phase-divergent update to 44f360db368f: + | draft + | + | diff -r 44f360db368f -r c1aa9cfb6cf8 b + | --- a/b Thu Jan 01 00:00:00 1970 +0000 + | +++ b/b Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,2 +1,3 @@ + | I am first + | b + | +I am second + | + o 2:44f360db368f added b + | public + | + | diff -r 9092f1db7931 -r 44f360db368f b + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/b Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,2 @@ + | +I am first + | +b + | + o 0:9092f1db7931 added a + public + + diff -r 000000000000 -r 9092f1db7931 a + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/a Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +a + + $ hg evolve -l + + $ cd .. + +Testing the case when both divergent cset has same parent and has conflict in merging: +------------------------------------------------------------------------------ + +Prepare the repository: + + $ hg init pubdiv1 + $ cd pubdiv1 + $ for ch in a b; do + > echo $ch > $ch; + > hg ci -Aqm "added "$ch; + > done; + $ hg glog + @ 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + +Make an amend and change phase to public: + + $ echo "I am foo" > b + $ hg amend + $ hg phase --public + +Amend again to create a cset divergent to public one: + + $ hg up 1 --hidden -q + updated to hidden changeset 5f6d8a4bf34a + (hidden revision '5f6d8a4bf34a' was rewritten as: 580f2d01e52c) + working directory parent is obsolete! (5f6d8a4bf34a) + + $ echo "I am bar" > b + $ hg ci --amend -m "updated b" + 1 new content-divergent changesets + + $ hg glog + @ 3:0e805383168e updated b + | draft content-divergent + | + | o 2:580f2d01e52c added b + |/ public + | + o 0:9092f1db7931 added a + public + + +Lets resolve the divergence: + + $ hg evolve --content-divergent + merge:[2] added b + with: [3] updated b + base: [1] added b + updating to "local" side of the conflict: 580f2d01e52c + merging "other" content-divergent changeset '0e805383168e' + merging b + warning: conflicts while merging b! (edit, then use 'hg resolve --mark') + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ echo "I am foobar" > b + $ hg resolve -m --tool union + (no more unresolved files) + continue: hg evolve --continue + $ hg evolve --continue + committed as 1a739394e9d4 + working directory is now at 1a739394e9d4 + + $ hg glog + @ 5:1a739394e9d4 phase-divergent update to 580f2d01e52c: + | draft + | + o 2:580f2d01e52c added b + | public + | + o 0:9092f1db7931 added a + public + +Testing the case when divergence is not created by actual diff change, but because of rebasing: +------------------------------------------------------------------------------------------------ + +Prepare the repo: + + $ cd .. + $ hg init rebasediv + $ cd rebasediv + $ for ch in a b c; do + > echo $ch > $ch; + > hg ci -Am "added "$ch; + > done; + adding a + adding b + adding c + + $ hg glog + @ 2:155349b645be added c + | draft + | + o 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + +On server side: a new cset is added based on rev 1 and rev 2 is rebased on newly added cset: + + $ hg up .^ -q + $ echo d > d + $ hg ci -Am "added d" + adding d + created new head + + $ hg rebase -r 2 -d . + rebasing 2:155349b645be "added c" + + $ hg glog + o 4:c0d7ee6604ea added c + | draft + | + @ 3:c9241b0f2d5b added d + | draft + | + o 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + +On user side: user has not pulled yet and amended the rev 2 which created the divergence after pull: + $ hg up 2 --hidden -q + updated to hidden changeset 155349b645be + (hidden revision '155349b645be' was rewritten as: c0d7ee6604ea) + working directory parent is obsolete! (155349b645be) + + $ echo cc >> c + $ hg ci --amend -m "updated c" + 2 new content-divergent changesets + +Lets change the phase to --public of branch which is pulled from server: + $ hg phase --public -r 4 + $ hg glog -p + @ 5:f5f9b4fc8b77 updated c + | draft content-divergent + | + | diff -r 5f6d8a4bf34a -r f5f9b4fc8b77 c + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,2 @@ + | +c + | +cc + | + | o 4:c0d7ee6604ea added c + | | public + | | + | | diff -r c9241b0f2d5b -r c0d7ee6604ea c + | | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | | +++ b/c Thu Jan 01 00:00:00 1970 +0000 + | | @@ -0,0 +1,1 @@ + | | +c + | | + | o 3:c9241b0f2d5b added d + |/ public + | + | diff -r 5f6d8a4bf34a -r c9241b0f2d5b d + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/d Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +d + | + o 1:5f6d8a4bf34a added b + | public + | + | diff -r 9092f1db7931 -r 5f6d8a4bf34a b + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/b Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +b + | + o 0:9092f1db7931 added a + public + + diff -r 000000000000 -r 9092f1db7931 a + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/a Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +a + + +Evolve: + $ hg evolve --content-divergent + merge:[4] added c + with: [5] updated c + base: [2] added c + rebasing "other" content-divergent changeset f5f9b4fc8b77 on c9241b0f2d5b + updating to "local" side of the conflict: c0d7ee6604ea + merging "other" content-divergent changeset 'c3d442d80993' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + committed as 3b336cbee992 + working directory is now at 3b336cbee992 + + $ hg glog -p + @ 8:3b336cbee992 phase-divergent update to c0d7ee6604ea: + | draft + | + | diff -r c0d7ee6604ea -r 3b336cbee992 c + | --- a/c Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,1 +1,2 @@ + | c + | +cc + | + o 4:c0d7ee6604ea added c + | public + | + | diff -r c9241b0f2d5b -r c0d7ee6604ea c + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +c + | + o 3:c9241b0f2d5b added d + | public + | + | diff -r 5f6d8a4bf34a -r c9241b0f2d5b d + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/d Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +d + | + o 1:5f6d8a4bf34a added b + | public + | + | diff -r 9092f1db7931 -r 5f6d8a4bf34a b + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/b Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +b + | + o 0:9092f1db7931 added a + public + + diff -r 000000000000 -r 9092f1db7931 a + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/a Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +a + +Check that we don't have any troubled cset now: + $ hg evolve -l + $ cd .. + +Testing the case when csets are on different parent and no conflict in relocation and merging: +---------------------------------------------------------------------------------------------- + + $ hg init pubdiv2 + $ cd pubdiv2 + $ for ch in a b c d; do + > echo $ch > $ch; + > hg ci -Aqm "added "$ch; + > done; + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo dd > d + $ hg add d + $ hg ci -m "added d" + created new head + + $ hg up 1 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo dd > d + $ echo e > e + $ hg add d e + $ hg ci -m "added d e" + created new head + + $ hg glog + @ 5:4291d72ee19a added d e + | draft + | + | o 4:93cd84bbdaca added d + | | draft + | | + | | o 3:9150fe93bec6 added d + | |/ draft + | | + | o 2:155349b645be added c + |/ draft + | + o 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + + $ hg prune 3 -s 5 + 1 changesets pruned + $ hg prune 3 -s 4 --hidden + 1 changesets pruned + 2 new content-divergent changesets + +Change phase to public for one head: + $ hg phase -r 4 --public + + $ hg glog + @ 5:4291d72ee19a added d e + | draft content-divergent + | + | o 4:93cd84bbdaca added d + | | public + | | + | o 2:155349b645be added c + |/ public + | + o 1:5f6d8a4bf34a added b + | public + | + o 0:9092f1db7931 added a + public + + + $ hg evolve --content-divergent --any + merge:[4] added d + with: [5] added d e + base: [3] added d + rebasing "other" content-divergent changeset 4291d72ee19a on 155349b645be + updating to "local" side of the conflict: 93cd84bbdaca + merging "other" content-divergent changeset 'f88581407163' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + committed as 4cbe48a0c3d9 + working directory is now at 4cbe48a0c3d9 + + $ hg glog -l 1 + @ 8:4cbe48a0c3d9 phase-divergent update to 93cd84bbdaca: + | draft + ~ + + $ hg evolve -l + $ cd .. + +Testing the case when csets are on different parent and conflict in relocation but not in merging: +-------------------------------------------------------------------------------------------------- + + $ hg init pubdiv3 + $ cd pubdiv3 + $ for ch in a b c d; do + > echo $ch > $ch; + > hg ci -Aqm "added "$ch; + > done; + + $ hg up .^^ + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo cfoo > c + $ echo e > e + $ hg add c e + $ hg ci -m "added c e" + created new head + + $ hg up 2 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo dd > d + $ hg add d + $ hg ci -m "added d" + created new head + + $ hg glog + @ 5:93cd84bbdaca added d + | draft + | + | o 4:e568fd1029bb added c e + | | draft + | | + +---o 3:9150fe93bec6 added d + | | draft + | | + o | 2:155349b645be added c + |/ draft + | + o 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + $ hg prune 3 -s 5 + 1 changesets pruned + $ hg prune 3 -s 4 --hidden + 1 changesets pruned + 2 new content-divergent changesets + +Change phase to public for one head: + $ hg phase --public -r 5 + + $ hg glog + @ 5:93cd84bbdaca added d + | public + | + | * 4:e568fd1029bb added c e + | | draft content-divergent + | | + o | 2:155349b645be added c + |/ public + | + o 1:5f6d8a4bf34a added b + | public + | + o 0:9092f1db7931 added a + public + + $ hg evolve --content-divergent --any + merge:[5] added d + with: [4] added c e + base: [3] added d + rebasing "other" content-divergent changeset e568fd1029bb on 155349b645be + merging c + warning: conflicts while merging c! (edit, then use 'hg resolve --mark') + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ hg diff + diff -r 155349b645be c + --- a/c Thu Jan 01 00:00:00 1970 +0000 + +++ b/c Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,5 @@ + +<<<<<<< destination: 155349b645be - test: added c + c + +======= + +cfoo + +>>>>>>> evolving: e568fd1029bb - test: added c e + diff -r 155349b645be e + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/e Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +e + + $ echo c > c + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + + $ hg evolve --continue + evolving 4:e568fd1029bb "added c e" + updating to "local" side of the conflict: 93cd84bbdaca + merging "other" content-divergent changeset '2af3359250d3' + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + committed as 06e4564a3897 + working directory is now at 06e4564a3897 + + $ hg evolve -l + $ cd .. + +Testing the case when merging leads to conflicts but relocation won't: +--------------------------------------------------------------------- + + $ hg init pubdiv3.5 + $ cd pubdiv3.5 + $ for ch in a b c d; do + > echo $ch > $ch; + > hg ci -Aqm "added "$ch; + > done; + + $ hg up .^^ + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo dconflict > d + $ hg add d + $ hg ci -m "added d" + created new head + + $ hg up 2 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo dd > d + $ hg add d + $ hg ci -m "added d" + created new head + + $ hg glog + @ 5:93cd84bbdaca added d + | draft + | + | o 4:9411ad1fe615 added d + | | draft + | | + +---o 3:9150fe93bec6 added d + | | draft + | | + o | 2:155349b645be added c + |/ draft + | + o 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + $ hg prune 3 -s 5 + 1 changesets pruned + $ hg prune 3 -s 4 --hidden + 1 changesets pruned + 2 new content-divergent changesets + +Change phase to public for one head: + $ hg phase --public -r 5 + + $ hg glog + @ 5:93cd84bbdaca added d + | public + | + | * 4:9411ad1fe615 added d + | | draft content-divergent + | | + o | 2:155349b645be added c + |/ public + | + o 1:5f6d8a4bf34a added b + | public + | + o 0:9092f1db7931 added a + public + + $ hg evolve --content-divergent --any + merge:[5] added d + with: [4] added d + base: [3] added d + rebasing "other" content-divergent changeset 9411ad1fe615 on 155349b645be + updating to "local" side of the conflict: 93cd84bbdaca + merging "other" content-divergent changeset 'b5c690cdf1d5' + merging d + warning: conflicts while merging d! (edit, then use 'hg resolve --mark') + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ echo d > d + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + + $ hg evolve --continue + committed as 2a0f44767904 + working directory is now at 2a0f44767904 + + $ hg evolve -l + $ cd .. + +Testing the case when relocation and merging both leads to conflicts: +-------------------------------------------------------------------- + + $ hg init pubdiv4 + $ cd pubdiv4 + $ for ch in a b c d; do + > echo $ch > $ch; + > hg ci -Aqm "added "$ch; + > done; + + $ hg up .^^ + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo cfoo > c + $ echo e > e + $ echo dconflict > d + $ hg add c e d + $ hg ci -m "added c e" + created new head + + $ hg up 2 + 1 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo dd > d + $ hg add d + $ hg ci -m "added d" + created new head + + $ hg glog + @ 5:93cd84bbdaca added d + | draft + | + | o 4:3c17c7afaf6e added c e + | | draft + | | + +---o 3:9150fe93bec6 added d + | | draft + | | + o | 2:155349b645be added c + |/ draft + | + o 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + $ hg prune 3 -s 5 + 1 changesets pruned + $ hg prune 3 -s 4 --hidden + 1 changesets pruned + 2 new content-divergent changesets + +Change phase to public for one head: + $ hg phase --public -r 5 + + $ hg glog + @ 5:93cd84bbdaca added d + | public + | + | * 4:3c17c7afaf6e added c e + | | draft content-divergent + | | + o | 2:155349b645be added c + |/ public + | + o 1:5f6d8a4bf34a added b + | public + | + o 0:9092f1db7931 added a + public + + $ hg evolve --content-divergent --any + merge:[5] added d + with: [4] added c e + base: [3] added d + rebasing "other" content-divergent changeset 3c17c7afaf6e on 155349b645be + merging c + warning: conflicts while merging c! (edit, then use 'hg resolve --mark') + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ hg diff + diff -r 155349b645be c + --- a/c Thu Jan 01 00:00:00 1970 +0000 + +++ b/c Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,5 @@ + +<<<<<<< destination: 155349b645be - test: added c + c + +======= + +cfoo + +>>>>>>> evolving: 3c17c7afaf6e - test: added c e + diff -r 155349b645be d + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/d Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +dconflict + diff -r 155349b645be e + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/e Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +e + + $ echo cfoo > c + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + + $ hg evolve --continue + evolving 4:3c17c7afaf6e "added c e" + updating to "local" side of the conflict: 93cd84bbdaca + merging "other" content-divergent changeset 'c4ce3d34e784' + merging d + warning: conflicts while merging d! (edit, then use 'hg resolve --mark') + 2 files updated, 0 files merged, 0 files removed, 1 files unresolved + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ echo d > d + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + + $ hg evolve --continue + committed as b9082a9e66ce + working directory is now at b9082a9e66ce + + $ hg evolve -l + $ cd .. + + +Testing the case when "merging results in same as public cset" where: +both the csets are on same parent and no conflict in merging. +--------------------------------------------------------------------- + +Prepare the repo: + + $ hg init pubdiv5 + $ cd pubdiv5 + $ for ch in a b c; do + > echo $ch > $ch; + > hg ci -Am "added "$ch; + > done; + adding a + adding b + adding c + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo ch > ch + $ hg add ch + $ hg ci -m "added ch" + created new head + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo ch > ch + $ hg add ch + $ hg ci -m "added c" + created new head + + $ hg glog + @ 4:f7c1071f1e7c added c + | draft + | + | o 3:90522bccf499 added ch + |/ draft + | + | o 2:155349b645be added c + |/ draft + | + o 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + + $ hg prune 2 -s 3 + 1 changesets pruned + $ hg prune 2 -s 4 --hidden + 1 changesets pruned + 2 new content-divergent changesets + $ hg phase --public -r 4 + + $ hg glog + @ 4:f7c1071f1e7c added c + | public + | + | * 3:90522bccf499 added ch + |/ draft content-divergent + | + o 1:5f6d8a4bf34a added b + | public + | + o 0:9092f1db7931 added a + public + + $ hg evolve --content-divergent --any + merge:[4] added c + with: [3] added ch + base: [2] added c + merging "other" content-divergent changeset '90522bccf499' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + content-divergent changesets differ by descriptions only, discarding 90522bccf499 + + $ hg evolve -l + + $ hg par + changeset: 4:f7c1071f1e7c + tag: tip + parent: 1:5f6d8a4bf34a + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: added c + + +Testing the case when "merging results in same as public cset" where: +both the csets are on different parent and no conflict in merging and relocation. +--------------------------------------------------------------------------------- + +Prepare the repo: + + $ cd .. + $ hg init pubdiv6 + $ cd pubdiv6 + $ for ch in a b c d; do + > echo $ch > $ch; + > hg ci -Am "added "$ch; + > done; + adding a + adding b + adding c + adding d + + $ hg up 1 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo dh > dh + $ hg add dh + $ hg ci -m "added dh" + created new head + + $ hg up 2 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo dh > dh + $ hg add dh + $ hg ci -m "added d" + created new head + + $ hg glog + @ 5:e800202333a4 added d + | draft + | + | o 4:5acd58ef5066 added dh + | | draft + | | + +---o 3:9150fe93bec6 added d + | | draft + | | + o | 2:155349b645be added c + |/ draft + | + o 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + + $ hg prune 3 -s 4 + 1 changesets pruned + $ hg prune 3 -s 5 --hidden + 1 changesets pruned + 2 new content-divergent changesets + $ hg phase --public -r 5 + + $ hg glog + @ 5:e800202333a4 added d + | public + | + | * 4:5acd58ef5066 added dh + | | draft content-divergent + | | + o | 2:155349b645be added c + |/ public + | + o 1:5f6d8a4bf34a added b + | public + | + o 0:9092f1db7931 added a + public + + $ hg evolve --content-divergent --any + merge:[5] added d + with: [4] added dh + base: [3] added d + rebasing "other" content-divergent changeset 5acd58ef5066 on 155349b645be + updating to "local" side of the conflict: e800202333a4 + merging "other" content-divergent changeset 'ae3429430ef1' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + content-divergent changesets differ by descriptions only, discarding ae3429430ef1 + + $ hg evolve -l + + $ hg par + changeset: 5:e800202333a4 + tag: tip + parent: 2:155349b645be + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: added d + +Testing the case when "merging results in same as public cset" where: +both the csets are on same parent and merging leads to conflict. +--------------------------------------------------------------------- + +Prepare the repo: + + $ cd .. + $ hg init pubdiv7 + $ cd pubdiv7 + $ for ch in a b c; do + > echo $ch > $ch; + > hg ci -Am "added "$ch; + > done; + adding a + adding b + adding c + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo chconflict > ch + $ hg add ch + $ hg ci -m "added ch" + created new head + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo ch > ch + $ hg add ch + $ hg ci -m "added c" + created new head + + $ hg glog + @ 4:f7c1071f1e7c added c + | draft + | + | o 3:229da2719b19 added ch + |/ draft + | + | o 2:155349b645be added c + |/ draft + | + o 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + + $ hg prune 2 -s 3 + 1 changesets pruned + $ hg prune 2 -s 4 --hidden + 1 changesets pruned + 2 new content-divergent changesets + $ hg phase --public -r 4 + + $ hg glog + @ 4:f7c1071f1e7c added c + | public + | + | * 3:229da2719b19 added ch + |/ draft content-divergent + | + o 1:5f6d8a4bf34a added b + | public + | + o 0:9092f1db7931 added a + public + + $ hg evolve --content-divergent --any + merge:[4] added c + with: [3] added ch + base: [2] added c + merging "other" content-divergent changeset '229da2719b19' + merging ch + warning: conflicts while merging ch! (edit, then use 'hg resolve --mark') + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ hg diff + diff -r f7c1071f1e7c ch + --- a/ch Thu Jan 01 00:00:00 1970 +0000 + +++ b/ch Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,5 @@ + +<<<<<<< local: f7c1071f1e7c - test: added c + ch + +======= + +chconflict + +>>>>>>> other: 229da2719b19 - test: added ch + + $ echo ch > ch + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + + $ hg evolve --continue + content-divergent changesets differ by descriptions only, discarding 229da2719b19 + working directory is now at f7c1071f1e7c + + $ hg evolve -l + + $ hg par + changeset: 4:f7c1071f1e7c + tag: tip + parent: 1:5f6d8a4bf34a + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: added c + +Testing the case when "merging results in same as public cset" where: +both the csets are on different parent and relocation leads to conflict but merging won't. +------------------------------------------------------------------------------------------ +Prepare the repo: + + $ cd .. + $ hg init pubdiv8 + $ cd pubdiv8 + $ for ch in a b c d; do + > echo $ch > $ch; + > hg ci -Am "added "$ch; + > done; + adding a + adding b + adding c + adding d + + $ hg up 1 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo dh > dh + $ echo cc > c + $ hg add dh c + $ hg ci -m "added dh" + created new head + + $ hg up 2 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo dh > dh + $ hg add dh + $ hg ci -m "added d" + created new head + + $ hg glog + @ 5:e800202333a4 added d + | draft + | + | o 4:f89a8e2f86ac added dh + | | draft + | | + +---o 3:9150fe93bec6 added d + | | draft + | | + o | 2:155349b645be added c + |/ draft + | + o 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + + $ hg prune 3 -s 4 + 1 changesets pruned + $ hg prune 3 -s 5 --hidden + 1 changesets pruned + 2 new content-divergent changesets + $ hg phase --public -r 5 + + $ hg glog + @ 5:e800202333a4 added d + | public + | + | * 4:f89a8e2f86ac added dh + | | draft content-divergent + | | + o | 2:155349b645be added c + |/ public + | + o 1:5f6d8a4bf34a added b + | public + | + o 0:9092f1db7931 added a + public + + $ hg evolve --content-divergent --any + merge:[5] added d + with: [4] added dh + base: [3] added d + rebasing "other" content-divergent changeset f89a8e2f86ac on 155349b645be + merging c + warning: conflicts while merging c! (edit, then use 'hg resolve --mark') + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ echo c > c + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + + $ hg evolve --continue + evolving 4:f89a8e2f86ac "added dh" + updating to "local" side of the conflict: e800202333a4 + merging "other" content-divergent changeset 'bc309da55b88' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + content-divergent changesets differ by descriptions only, discarding bc309da55b88 + working directory is now at e800202333a4 + + $ hg evolve -l + + $ hg par + changeset: 5:e800202333a4 + tag: tip + parent: 2:155349b645be + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: added d + +Testing the case when "merging results in same as public cset" where: +both the csets are on different parent and merging leads to conflict but relocation won't. +------------------------------------------------------------------------------------------ +Prepare the repo: + + $ cd .. + $ hg init pubdiv9 + $ cd pubdiv9 + $ for ch in a b c d; do + > echo $ch > $ch; + > hg ci -Am "added "$ch; + > done; + adding a + adding b + adding c + adding d + + $ hg up 1 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo dhconflict > dh + $ hg add dh + $ hg ci -m "added dh" + created new head + + $ hg up 2 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo dh > dh + $ hg add dh + $ hg ci -m "added d" + created new head + + $ hg glog + @ 5:e800202333a4 added d + | draft + | + | o 4:db0b7bba0aae added dh + | | draft + | | + +---o 3:9150fe93bec6 added d + | | draft + | | + o | 2:155349b645be added c + |/ draft + | + o 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + + $ hg prune 3 -s 4 + 1 changesets pruned + $ hg prune 3 -s 5 --hidden + 1 changesets pruned + 2 new content-divergent changesets + $ hg phase --public -r 5 + + $ hg glog + @ 5:e800202333a4 added d + | public + | + | * 4:db0b7bba0aae added dh + | | draft content-divergent + | | + o | 2:155349b645be added c + |/ public + | + o 1:5f6d8a4bf34a added b + | public + | + o 0:9092f1db7931 added a + public + + $ hg evolve --content-divergent --any + merge:[5] added d + with: [4] added dh + base: [3] added d + rebasing "other" content-divergent changeset db0b7bba0aae on 155349b645be + updating to "local" side of the conflict: e800202333a4 + merging "other" content-divergent changeset 'a5bbf2042450' + merging dh + warning: conflicts while merging dh! (edit, then use 'hg resolve --mark') + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ echo dh > dh + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + + $ hg evolve --continue + content-divergent changesets differ by descriptions only, discarding a5bbf2042450 + working directory is now at e800202333a4 + + $ hg evolve -l + + $ hg par + changeset: 5:e800202333a4 + tag: tip + parent: 2:155349b645be + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: added d + + +Testing the case when "merging results in same as public cset" where: +both the csets are on different parent and relocation and merging both leads to conflict: +----------------------------------------------------------------------------------------- +Prepare the repo: + + $ cd .. + $ hg init pubdiv10 + $ cd pubdiv10 + $ for ch in a b c d; do + > echo $ch > $ch; + > hg ci -Am "added "$ch; + > done; + adding a + adding b + adding c + adding d + + $ hg up 1 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo dhconflict > dh + $ echo cc > c + $ hg add dh c + $ hg ci -m "added dh" + created new head + + $ hg up 2 + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo dh > dh + $ hg add dh + $ hg ci -m "added d" + created new head + + $ hg glog + @ 5:e800202333a4 added d + | draft + | + | o 4:67b19bbd770f added dh + | | draft + | | + +---o 3:9150fe93bec6 added d + | | draft + | | + o | 2:155349b645be added c + |/ draft + | + o 1:5f6d8a4bf34a added b + | draft + | + o 0:9092f1db7931 added a + draft + + + $ hg prune 3 -s 4 + 1 changesets pruned + $ hg prune 3 -s 5 --hidden + 1 changesets pruned + 2 new content-divergent changesets + $ hg phase --public -r 5 + + $ hg glog + @ 5:e800202333a4 added d + | public + | + | * 4:67b19bbd770f added dh + | | draft content-divergent + | | + o | 2:155349b645be added c + |/ public + | + o 1:5f6d8a4bf34a added b + | public + | + o 0:9092f1db7931 added a + public + + $ hg evolve --content-divergent --any + merge:[5] added d + with: [4] added dh + base: [3] added d + rebasing "other" content-divergent changeset 67b19bbd770f on 155349b645be + merging c + warning: conflicts while merging c! (edit, then use 'hg resolve --mark') + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ echo c > c + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + + $ hg evolve --continue + evolving 4:67b19bbd770f "added dh" + updating to "local" side of the conflict: e800202333a4 + merging "other" content-divergent changeset '09054d1f3c97' + merging dh + warning: conflicts while merging dh! (edit, then use 'hg resolve --mark') + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ echo dh > dh + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + + $ hg evolve --continue + content-divergent changesets differ by descriptions only, discarding 09054d1f3c97 + working directory is now at e800202333a4 + + $ hg evolve -l + + $ hg par + changeset: 5:e800202333a4 + tag: tip + parent: 2:155349b645be + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: added d + + + $ cd .. + +Test a pratical "rebase" case +============================= + +Initial setup + + $ hg init rebase-divergence + $ cd rebase-divergence + $ echo root >> root + $ hg add root + $ hg commit -m root + $ for x in c_A c_B c_C c_D; do + > echo $x >> $x + > hg add $x + > hg commit -m $x + > done + + $ hg up 'desc("c_A")' + 0 files updated, 0 files merged, 3 files removed, 0 files unresolved + + $ for x in c_E c_F; do + > echo $x >> $x + > hg add $x + > hg commit -m $x + > done + created new head + +(creating divergence locally for simplicity) + + $ node=`hg log --rev 'desc("c_E")' -T '{node}'` + $ hg rebase -s $node -d 'desc("c_B")' + rebasing 5:4ab2719bbab9 "c_E" + rebasing 6:77ccbf8d837e "c_F" (tip) + $ hg phase --public tip + $ hg rebase --hidden -s $node -d 'desc("c_C")' --config experimental.evolution.allowdivergence=yes + rebasing 5:4ab2719bbab9 "c_E" + rebasing 6:77ccbf8d837e "c_F" + 2 new content-divergent changesets + + $ hg sum + parent: 8:a52ac76b45f5 + c_F + branch: default + commit: (clean) + update: 4 new changesets, 3 branch heads (merge) + phases: 4 draft + content-divergent: 2 changesets + $ hg evolve --list + b4a584aea4bd: c_E + content-divergent: c7d2d47c7240 (public) (precursor 4ab2719bbab9) + + 8ae8db670b4a: c_F + content-divergent: a52ac76b45f5 (public) (precursor 77ccbf8d837e) + + $ hg log -G --patch + * changeset: 10:8ae8db670b4a + | tag: tip + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | instability: content-divergent + | summary: c_F + | + | diff -r b4a584aea4bd -r 8ae8db670b4a c_F + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c_F Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +c_F + | + * changeset: 9:b4a584aea4bd + | parent: 3:abb77b893f28 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | instability: content-divergent + | summary: c_E + | + | diff -r abb77b893f28 -r b4a584aea4bd c_E + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c_E Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +c_E + | + | @ changeset: 8:a52ac76b45f5 + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: c_F + | | + | | diff -r c7d2d47c7240 -r a52ac76b45f5 c_F + | | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | | +++ b/c_F Thu Jan 01 00:00:00 1970 +0000 + | | @@ -0,0 +1,1 @@ + | | +c_F + | | + | o changeset: 7:c7d2d47c7240 + | | parent: 2:eb1b4e1205b8 + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: c_E + | | + | | diff -r eb1b4e1205b8 -r c7d2d47c7240 c_E + | | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | | +++ b/c_E Thu Jan 01 00:00:00 1970 +0000 + | | @@ -0,0 +1,1 @@ + | | +c_E + | | + +---o changeset: 4:dbb960d6c97c + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: c_D + | | + | | diff -r abb77b893f28 -r dbb960d6c97c c_D + | | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | | +++ b/c_D Thu Jan 01 00:00:00 1970 +0000 + | | @@ -0,0 +1,1 @@ + | | +c_D + | | + o | changeset: 3:abb77b893f28 + |/ user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: c_C + | + | diff -r eb1b4e1205b8 -r abb77b893f28 c_C + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c_C Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +c_C + | + o changeset: 2:eb1b4e1205b8 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: c_B + | + | diff -r e31751786014 -r eb1b4e1205b8 c_B + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c_B Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +c_B + | + o changeset: 1:e31751786014 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: c_A + | + | diff -r 1e4be0697311 -r e31751786014 c_A + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c_A Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +c_A + | + o changeset: 0:1e4be0697311 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: root + + diff -r 000000000000 -r 1e4be0697311 root + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/root Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +root + + +Run automatic evolution + + $ hg evolve --content-divergent --rev 'not public() and desc("c_E")::' + merge:[7] c_E + with: [9] c_E + base: [5] c_E + rebasing "other" content-divergent changeset b4a584aea4bd on eb1b4e1205b8 + updating to "local" side of the conflict: c7d2d47c7240 + merging "other" content-divergent changeset '0773642cfa95' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + 1 new orphan changesets + merge:[8] c_F + with: [10] c_F + base: [6] c_F + rebasing "other" content-divergent changeset 8ae8db670b4a on c7d2d47c7240 + updating to "local" side of the conflict: a52ac76b45f5 + merging "other" content-divergent changeset '6a87ed4aa317' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg sum + parent: 8:a52ac76b45f5 tip + c_F + branch: default + commit: (clean) + update: 2 new changesets, 2 branch heads (merge) + phases: 2 draft + + $ hg evolve --list + + $ hg log -G --patch + @ changeset: 8:a52ac76b45f5 + | tag: tip + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: c_F + | + | diff -r c7d2d47c7240 -r a52ac76b45f5 c_F + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c_F Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +c_F + | + o changeset: 7:c7d2d47c7240 + | parent: 2:eb1b4e1205b8 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: c_E + | + | diff -r eb1b4e1205b8 -r c7d2d47c7240 c_E + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c_E Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +c_E + | + | o changeset: 4:dbb960d6c97c + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: c_D + | | + | | diff -r abb77b893f28 -r dbb960d6c97c c_D + | | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | | +++ b/c_D Thu Jan 01 00:00:00 1970 +0000 + | | @@ -0,0 +1,1 @@ + | | +c_D + | | + | o changeset: 3:abb77b893f28 + |/ user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: c_C + | + | diff -r eb1b4e1205b8 -r abb77b893f28 c_C + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c_C Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +c_C + | + o changeset: 2:eb1b4e1205b8 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: c_B + | + | diff -r e31751786014 -r eb1b4e1205b8 c_B + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c_B Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +c_B + | + o changeset: 1:e31751786014 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: c_A + | + | diff -r 1e4be0697311 -r e31751786014 c_A + | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + | +++ b/c_A Thu Jan 01 00:00:00 1970 +0000 + | @@ -0,0 +1,1 @@ + | +c_A + | + o changeset: 0:1e4be0697311 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: root + + diff -r 000000000000 -r 1e4be0697311 root + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/root Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +root + + $ hg export tip + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID a52ac76b45f523a039fc4a938d79874f4bdb1a85 + # Parent c7d2d47c7240562be5cbd1a24080dd0396178709 + c_F + + diff -r c7d2d47c7240 -r a52ac76b45f5 c_F + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/c_F Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +c_F + + $ hg obslog --rev a52ac76b45f5 + @ a52ac76b45f5 (8) c_F + |\ + x | 6a87ed4aa317 (12) c_F + | | rewritten as a52ac76b45f5 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | + x | 8ae8db670b4a (10) c_F + |/ rewritten(parent) as 6a87ed4aa317 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | + x 77ccbf8d837e (6) c_F + rewritten(parent) as 8ae8db670b4a using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + rewritten(parent) as a52ac76b45f5 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve-templates.t --- a/tests/test-evolve-templates.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-evolve-templates.t Tue Apr 02 20:32:15 2019 +0200 @@ -245,8 +245,8 @@ o ea207398892e -Test templates with splitted commit -=================================== +Test templates with split commit +================================ $ hg init $TESTTMP/templates-local-split $ cd $TESTTMP/templates-local-split @@ -1313,7 +1313,7 @@ date: Thu Jan 01 00:00:00 1970 +0000 summary: ROOT -Diverge one of the splitted commit +Diverge one of the split commit $ hg up 6 0 files updated, 0 files merged, 1 files removed, 0 files unresolved diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve-topic.t --- a/tests/test-evolve-topic.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-evolve-topic.t Tue Apr 02 20:32:15 2019 +0200 @@ -126,8 +126,8 @@ $ hg stack ### topic: foo ### target: default (branch) - s4$ add fff (current unstable) - s3$ add eee (unstable) + s4@ add fff (current orphan) + s3$ add eee (orphan) s2: add ddd s1: add ccc s0^ add bbb (base) @@ -265,10 +265,10 @@ $ hg stack ### topic: bar ### target: default (branch) - s5$ add jjj (unstable) - s4$ add iii (unstable) - s3$ add hhh (unstable) - s2$ add ggg (current unstable) + s5$ add jjj (orphan) + s4$ add iii (orphan) + s3$ add hhh (orphan) + s2@ add ggg (current orphan) s1: add fff s0^ add eee (base) diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-evolve.t --- a/tests/test-evolve.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-evolve.t Tue Apr 02 20:32:15 2019 +0200 @@ -409,7 +409,6 @@ $ hg evolve --any --traceback --phase-divergent recreate:[6] another feature that rox atop:[5] another feature (child of ba0ec09b1bab) - computing new diff committed as aca219761afb working directory is now at aca219761afb $ glog @@ -1061,7 +1060,6 @@ $ hg evolve -r "desc('add new file bumped')" --phase-divergent recreate:[11] add new file bumped atop:[10] a2 - computing new diff committed as a8bb31d4b7f2 working directory is now at a8bb31d4b7f2 $ hg evolve --any diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-grab.t --- a/tests/test-grab.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-grab.t Tue Apr 02 20:32:15 2019 +0200 @@ -24,9 +24,10 @@ options: - -r --rev REV revision to pick - -c --continue continue interrupted pick - -a --abort abort interrupted pick + -r --rev REV revision to pick + -c --continue continue interrupted pick + -a --abort abort interrupted pick + -t --tool TOOL specify merge tool (some details hidden, use --verbose to show complete help) diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-prev-next.t --- a/tests/test-prev-next.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-prev-next.t Tue Apr 02 20:32:15 2019 +0200 @@ -213,13 +213,13 @@ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved [3] added b (2) $ hg next < 1 + > 2 > EOF ambiguous next changeset, choose one to update: - 0: [e3b6d5df389b] added c - 1: [9df671ccd2c7] added d + 1: [e3b6d5df389b] added c + 2: [9df671ccd2c7] added d q: quit the prompt - enter the index of the revision you want to select: 1 + enter the index of the revision you want to select: 2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved [5] added d @@ -236,13 +236,13 @@ (2 unstable changesets to be evolved here, do you want --evolve?) [1] $ hg next --evolve < 0 + > 1 > EOF ambiguous next (unstable) changeset, choose one to evolve and update: - 0: [e3b6d5df389b] added c - 1: [9df671ccd2c7] added d + 1: [e3b6d5df389b] added c + 2: [9df671ccd2c7] added d q: quit the prompt - enter the index of the revision you want to select: 0 + enter the index of the revision you want to select: 1 move:[4] added c atop:[6] added b (3) working directory now at 5ce67c2407b0 @@ -284,8 +284,8 @@ > q > EOF multiple parents, choose one to update: - 0: [47ea25be8aea] added d - 1: [5ce67c2407b0] added c + 1: [47ea25be8aea] added d + 2: [5ce67c2407b0] added c q: quit the prompt enter the index of the revision you want to select: q [8] added d @@ -300,13 +300,13 @@ [1] $ hg prev < 1 + > 2 > EOF multiple parents, choose one to update: - 0: [47ea25be8aea] added d - 1: [5ce67c2407b0] added c + 1: [47ea25be8aea] added d + 2: [5ce67c2407b0] added c q: quit the prompt - enter the index of the revision you want to select: 1 + enter the index of the revision you want to select: 2 0 files updated, 0 files merged, 1 files removed, 0 files unresolved [7] added c diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-split.t --- a/tests/test-split.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-split.t Tue Apr 02 20:32:15 2019 +0200 @@ -19,6 +19,8 @@ > [diff] > git = 1 > unified = 0 + > [commands] + > commit.interactive.unified = 0 > [ui] > interactive = true > [extensions] @@ -485,15 +487,15 @@ $ hg add SPLIT1 SPLIT2 $ hg branch another-branch marked working directory as branch another-branch - $ hg commit -m "To be splitted" + $ hg commit -m "To be split" $ hg log -G -l 3 - @ changeset: 21:8dad923bdb9b + @ changeset: 21:b6bf93dd314b | branch: another-branch | tag: tip | topic: mytopic | user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | summary: To be splitted + | summary: To be split | o changeset: 20:2532b288af61 | branch: new-branch @@ -516,10 +518,10 @@ # Date 0 0 # Thu Jan 01 00:00:00 1970 +0000 # Branch another-branch - # Node ID 8dad923bdb9bb3b99291caa5baeb03bbc30dfd33 + # Node ID b6bf93dd314ba47b838befc7488b2223981684ea # Parent 2532b288af61bd19239a95ae2a3ecb9b0ad4b8e1 # EXP-Topic mytopic - To be splitted + To be split diff --git a/SPLIT1 b/SPLIT1 new file mode 100644 @@ -550,7 +552,7 @@ no more change to split -The splitted changesets should be on the 'another-branch' +The split changesets should be on the 'another-branch' $ hg log -G -l 3 @ changeset: 23:56a59faa8af7 | branch: another-branch @@ -582,19 +584,19 @@ marked working directory as branch yet-another-branch $ touch SPLIT3 SPLIT4 $ hg add SPLIT3 SPLIT4 - $ hg commit -m "To be splitted again" + $ hg commit -m "To be split again" $ hg up "tip~1" 0 files updated, 0 files merged, 2 files removed, 0 files unresolved $ hg log -G -l 2 - o changeset: 24:b1020d17c364 + o changeset: 24:9f56497dbac1 | branch: yet-another-branch | tag: tip | topic: mytopic | user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | summary: To be splitted again + | summary: To be split again | @ changeset: 23:56a59faa8af7 | branch: another-branch @@ -628,13 +630,13 @@ another-branch $ hg log -G -l 2 - o changeset: 24:b1020d17c364 + o changeset: 24:9f56497dbac1 | branch: yet-another-branch | tag: tip | topic: mytopic | user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | summary: To be splitted again + | summary: To be split again | @ changeset: 23:56a59faa8af7 | branch: another-branch diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-stabilize-result.t --- a/tests/test-stabilize-result.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-stabilize-result.t Tue Apr 02 20:32:15 2019 +0200 @@ -171,7 +171,6 @@ atop:[6] newer a perform evolve? [Ny] y rebasing to destination parent: 66719795a494 - computing new diff committed as 8fc63fe1f297 working directory is now at 8fc63fe1f297 $ glog diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-stack-branch.t --- a/tests/test-stack-branch.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-stack-branch.t Tue Apr 02 20:32:15 2019 +0200 @@ -127,8 +127,8 @@ $ hg stack ### target: foo (branch) - s4$ c_f (unstable) - s3$ c_e (unstable) + s4$ c_f (orphan) + s3$ c_e (orphan) s2@ c_d (current) s1: c_c s0^ c_b (base) @@ -136,8 +136,8 @@ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg stack ### target: foo (branch) - s4$ c_f (unstable) - s3$ c_e (current unstable) + s4$ c_f (orphan) + s3@ c_e (current orphan) s2: c_d s1: c_c s0^ c_b (base) @@ -255,8 +255,8 @@ s6: c_h s5: c_g s2^ c_D (base current) - s4$ c_f (unstable) - s3$ c_e (unstable) + s4$ c_f (orphan) + s3$ c_e (orphan) s2@ c_D (current) s1: c_c s0^ c_b (base) @@ -289,8 +289,8 @@ s6: c_h s5: c_g s2^ c_D (base current) - s4$ c_f (unstable) - s3$ c_e (unstable) + s4$ c_f (orphan) + s3$ c_e (orphan) s2@ c_D (current) s1: c_c s0^ c_b (base) @@ -300,8 +300,8 @@ s5: c_h s4: c_g s1^ c_D (base current) - s3$ c_f (unstable) - s2$ c_e (unstable) + s3$ c_f (orphan) + s2$ c_e (orphan) s1@ c_D (current) s0^ c_c (base) @@ -312,7 +312,7 @@ changed topic on 2 changesets to "sometopic" $ hg stack ### target: foo (branch) - s3$ c_f (unstable) - s2$ c_e (unstable) + s3$ c_f (orphan) + s2$ c_e (orphan) s1@ c_D (current) s0^ c_c (base) diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-topic-stack-complex.t --- a/tests/test-topic-stack-complex.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-topic-stack-complex.t Tue Apr 02 20:32:15 2019 +0200 @@ -86,7 +86,7 @@ $ hg stack ### topic: foo ### target: default (branch) - s4$ Added e and f (unstable) + s4$ Added e and f (orphan) s3@ split2 (current) s2: split1 s1: Added a and b @@ -129,8 +129,8 @@ $ hg stack ### topic: foo (2 heads) ### target: default (branch), 2 behind - s4$ Added e and f (unstable) - s3$ split2 (unstable) + s4$ Added e and f (orphan) + s3$ split2 (orphan) s2@ split1 (current) s1: Added a and b s0^ Added foo (base) @@ -161,9 +161,9 @@ $ hg stack ### topic: foo (2 heads) ### target: default (branch) - s5: Added e and f + s5$ Added e and f (content divergent) s3^ split2 (base) - s4@ Added e and f (current) + s4@ Added e and f (content divergent current) s3: split2 s2: split1 s1: Added a and b diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-topic-stack-data.t --- a/tests/test-topic-stack-data.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-topic-stack-data.t Tue Apr 02 20:32:15 2019 +0200 @@ -266,7 +266,7 @@ ### target: default (branch) s5: add bar_c s2^ add bar_b (base) - s4$ add bar_e (unstable) + s4$ add bar_e (orphan) s3: bar1_d s2: add bar_b s1: add bar_a @@ -276,7 +276,7 @@ ### target: default (branch) s5(9cbadf11b44d): add bar_c s2(e555c7e8c767)^ add bar_b (base) - s4(a920412b5a05)$ add bar_e (unstable) + s4(a920412b5a05)$ add bar_e (orphan) s3(6915989374b1): bar1_d s2(e555c7e8c767): add bar_b s1(a5c2b4e00bbf): add bar_a @@ -296,7 +296,7 @@ $ hg stack fuz ### topic: fuz ### target: default (branch), 1 behind - s3$ add fuz_c (unstable) - s2$ add fuz_b (unstable) + s3$ add fuz_c (orphan) + s2$ add fuz_b (orphan) s1: fuz1_a s0^ add base_d (base) diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-topic-stack.t --- a/tests/test-topic-stack.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-topic-stack.t Tue Apr 02 20:32:15 2019 +0200 @@ -331,8 +331,8 @@ $ hg topic --list ### topic: foo ### target: default (branch) - s4$ c_f (unstable) - s3$ c_e (unstable) + s4$ c_f (orphan) + s3$ c_e (orphan) s2@ c_d (current) s1: c_c s0^ c_b (base) @@ -341,16 +341,16 @@ $ hg topic --list ### topic: foo ### target: default (branch) - s4$ c_f (unstable) - s3$ c_e (current unstable) + s4$ c_f (orphan) + s3@ c_e (current orphan) s2: c_d s1: c_c s0^ c_b (base) $ hg topic --list --color=debug [topic.stack.summary.topic|### topic: [topic.active|foo]] [topic.stack.summary.branches|### target: default (branch)] - [topic.stack.index topic.stack.index.unstable|s4][topic.stack.state topic.stack.state.unstable|$] [topic.stack.desc topic.stack.desc.unstable|c_f][topic.stack.state topic.stack.state.unstable| (unstable)] - [topic.stack.index topic.stack.index.current topic.stack.index.unstable|s3][topic.stack.state topic.stack.state.current topic.stack.state.unstable|$] [topic.stack.desc topic.stack.desc.current topic.stack.desc.unstable|c_e][topic.stack.state topic.stack.state.current topic.stack.state.unstable| (current unstable)] + [topic.stack.index topic.stack.index.orphan|s4][topic.stack.state topic.stack.state.orphan|$] [topic.stack.desc topic.stack.desc.orphan|c_f][topic.stack.state topic.stack.state.orphan| (orphan)] + [topic.stack.index topic.stack.index.current topic.stack.index.orphan|s3][topic.stack.state topic.stack.state.current topic.stack.state.orphan|@] [topic.stack.desc topic.stack.desc.current topic.stack.desc.orphan|c_e][topic.stack.state topic.stack.state.current topic.stack.state.orphan| (current orphan)] [topic.stack.index topic.stack.index.clean|s2][topic.stack.state topic.stack.state.clean|:] [topic.stack.desc topic.stack.desc.clean|c_d] [topic.stack.index topic.stack.index.clean|s1][topic.stack.state topic.stack.state.clean|:] [topic.stack.desc topic.stack.desc.clean|c_c] [topic.stack.index topic.stack.index.base|s0][topic.stack.state topic.stack.state.base|^] [topic.stack.desc topic.stack.desc.base|c_b][topic.stack.state topic.stack.state.base| (base)] @@ -488,8 +488,8 @@ s6: c_h s5: c_g s2^ c_D (base current) - s4$ c_f (unstable) - s3$ c_e (unstable) + s4$ c_f (orphan) + s3$ c_e (orphan) s2@ c_D (current) s1: c_c s0^ c_b (base) @@ -767,24 +767,24 @@ $ hg stack red ### topic: red ### target: default (branch), ambiguous rebase destination - topic 'red' has 3 heads - s5$ c_H (unstable) + s5$ c_H (orphan) ^ c_G ^ c_D - s4$ c_C (unstable) + s4$ c_C (orphan) s1^ c_B (base) - s3$ c_F (unstable) - s2$ c_E (unstable) + s3$ c_F (orphan) + s2$ c_E (orphan) s1: c_B s0^ c_A (base) $ hg stack blue ### topic: blue ### target: default (branch), ambiguous rebase destination - topic 'blue' has 3 heads - s3$ c_I (unstable) + s3$ c_I (orphan) ^ c_H - s2$ c_G (unstable) + s2$ c_G (orphan) ^ c_F - s1$ c_D (current unstable) - s0^ c_C (base unstable) + s1@ c_D (current orphan) + s0^ c_C (base orphan) more obsolescence @@ -841,24 +841,24 @@ $ hg stack red ### topic: red ### target: default (branch), ambiguous rebase destination - topic 'red' has 3 heads - s5$ c_H (unstable) + s5$ c_H (orphan) ^ c_G ^ c_D - s4$ c_F (unstable) - s3$ c_E (unstable) + s4$ c_F (orphan) + s3$ c_E (orphan) s1^ c_B (base) - s2$ c_C (unstable) + s2$ c_C (orphan) s1: c_B s0^ c_A (base) $ hg stack blue ### topic: blue ### target: default (branch), ambiguous rebase destination - topic 'blue' has 3 heads - s3$ c_I (unstable) + s3$ c_I (orphan) ^ c_H - s2$ c_G (unstable) + s2$ c_G (orphan) ^ c_F - s1$ c_D (current unstable) - s0^ c_C (base unstable) + s1@ c_D (current orphan) + s0^ c_C (base orphan) Test stack behavior with a split -------------------------------- @@ -897,7 +897,7 @@ $ hg stack ### topic: blue ### target: default (branch) - s3$ c_I (unstable) + s3$ c_I (orphan) s2@ c_G (current) s1: c_D s0^ c_A (base) @@ -977,7 +977,7 @@ $ hg stack ### topic: blue ### target: default (branch) - s4$ c_I (unstable) + s4$ c_I (orphan) s3@ c_G (current) s2: c_G s1: c_D diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-topic-tutorial.t --- a/tests/test-topic-tutorial.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-topic-tutorial.t Tue Apr 02 20:32:15 2019 +0200 @@ -1358,8 +1358,8 @@ $ hg stack ### topic: tools ### target: default (branch), 2 behind - s3$ Adding drill (unstable) - s2$ Adding saw (unstable) + s3$ Adding drill (orphan) + s2$ Adding saw (orphan) s1@ Adding hammer to the shopping list (current) s0^ add a pair of shoes (base) @@ -1375,7 +1375,7 @@ $ hg stack ### topic: tools ### target: default (branch), 2 behind - s3$ Adding drill (unstable) + s3$ Adding drill (orphan) s2@ Adding saw (current) s1: Adding hammer to the shopping list s0^ add a pair of shoes (base) diff -r 7d54a538dd1e -r 05f8908df4ce tests/test-topic.t --- a/tests/test-topic.t Wed Feb 13 21:39:10 2019 +0800 +++ b/tests/test-topic.t Tue Apr 02 20:32:15 2019 +0200 @@ -860,6 +860,10 @@ 3: featureA $ tlog 'featureA#topic[0]' 3: featureA + $ tlog 'featureA#topic[:]' + 1: featureA + 2: featureA + 3: featureA $ tlog '2#t[-2]' $ tlog '2#t[-1]' @@ -869,6 +873,10 @@ $ tlog '2#t[1]' 3: featureA $ tlog '2#t[2]' + $ tlog '2#t[-1:1]' + 1: featureA + 2: featureA + 3: featureA stack subscript relation @@ -898,6 +906,28 @@ $ tlog 'featureA#s[0]' 0: + $ tlog 'featureA#s[0:0]' + 0: + $ tlog 'featureA#s[:]' + 1: featureA + 2: featureA + 3: featureA + $ tlog 'featureA#s[2:]' + 2: featureA + 3: featureA + $ tlog 'featureA#s[:2]' + 1: featureA + 2: featureA + $ tlog 'featureA#s[0:1]' + 0: + 1: featureA + $ tlog 'featureA#s[-1:0]' + 0: + 3: featureA + $ tlog 'featureA#s[-3:3]' + 1: featureA + 2: featureA + 3: featureA $ tlog 'featureA#s[1] and featureA#s[-3]' 1: featureA $ tlog 'featureA#s[2] and featureA#s[-2]'