# HG changeset patch # User Pierre-Yves David # Date 1555015301 -7200 # Node ID 7a779a28879373ca48bf361f4da311a091ddde55 # Parent 2cbb9914d2270cd9f58731f7a63325df4c4a5761# Parent e4fc3af2d0a9f10fcb3dd5395c11212213f0c314 test-compat: merge mercurial-4.8 into mercurial-4.7 diff -r 2cbb9914d227 -r 7a779a288793 .hgtags --- a/.hgtags Tue Jan 22 12:54:43 2019 -0500 +++ b/.hgtags Thu Apr 11 22:41:41 2019 +0200 @@ -76,3 +76,4 @@ b90422a11a887c6ff756c2a5622ea0a1e260ff4c 8.3.1 7edc5c148df0150087832b861966d658df0b601e 8.3.2 97b18934d6db9e7e7eaa3fb656c0411d7f43af26 8.3.3 +8c4289d0e91e95b3281c378e1ac3f4ff4678b4d3 8.4.0 diff -r 2cbb9914d227 -r 7a779a288793 CHANGELOG --- a/CHANGELOG Tue Jan 22 12:54:43 2019 -0500 +++ b/CHANGELOG Thu Apr 11 22:41:41 2019 +0200 @@ -1,33 +1,55 @@ Changelog ========= -8.4.0 - in progress +8.5.0 - in progress ------------------- - * split: improve and update the user prompt (BC) - * split: make it possible to drop change during a split - * split: no longer accept revision with --rev (BC) - * split: accept file patterns - * split: support for non interactive splits + * evolve: fix an recoverable state (issue6053) + * evolve: share evolve related cache between `shares` + * evolve: improved compatibility with narrow repositories, + * evolve: preserve --[no-]update value over --continue, + * evolve: make sure the extensions are only active on repository that + enables it. Double check your server configuration (issue6057) + * evolve: make sure divergence resolution don't replace the initial author + (issue6113) + * evolve: improved support for content-divergence with public changesets, + * pick: align working dir branch with the one from the pick result (issue6089) + * pick: add the standard `--tool` option, + * prune: fix error message when pruning public changesets + * split: preserve phases (issue6048) + * stack: improved and speed --children flag up, + * stack: mention all divergences too. + * stack: support ranges in revsets indexing, + * touch: fix error message when touching public changesets + * uncommit: abort if an explicitly given file cannot be uncommitted + +8.4.0 -- 2019-12-22 +------------------- + + * compat: add compatibility with Mercurial 4.9 + * compat: drop compatibility with Mercurial 4.3 * evolve: avoid potential crash when stabilizing orphan merges - * evolve: pick right destination in split+prune cases issue5686 (4.9 only) + * evolve: pick right destination in split+prune cases issue5686 (hg-4.9 only) * evolve: prioritize --rev/--any/--all option over obsolete working directory * fold: concatenate commit message in revision order - * push: have `--publish` overrule the `auto-publish` config * next: evolve aspiring children by default (use --no-evolve to skip) * next: pick lower part of a split as destination - * compat: drop compatibility with Mercurial 4.3 - * compat: add compatibility with Mercurial 4.9 - -topic: + * push: have `--publish` overrule the `auto-publish` config + * split: accept file patterns + * split: improve and update the user prompt (BC) + * split: make it possible to drop change during a split + * split: no longer accept revision without --rev (BC) + * split: support for non interactive splits - * topics: improve the message around topic changing +topic 0.13.0 + * stack: introduce a --children flag (see help for details) + * stack: support for '#stack[idx]' absolute indexing in revset (hg-4.9+ only) + * topic: support for '#topic[idx]' relative indexing in revset (hg-4.9+ only) * topic: make --age compatible with the usual other display for `hg topic` - * stack: support for '#stack[idx]' absolute indexing in revset (4.9+ only) - * topic: support for '#topic[idx]' relative indexing in revset (4.9+ only) + * topics: improve the message around topic changes -8.3.3 -- 2017-12-24 +8.3.3 -- 2018-12-24 ------------------- * evolve: properly detect unresolved merge conflict (issue-5966) @@ -35,7 +57,7 @@ * test: avoid leaking `hg serve` process * topic: fix error message for the `ngtip` revset -8.3.2 -- 2017-11-27 +8.3.2 -- 2018-11-27 ------------------- * evolve: not longer attempt to translate revision's descriptions (issue6016) diff -r 2cbb9914d227 -r 7a779a288793 debian/changelog --- a/debian/changelog Tue Jan 22 12:54:43 2019 -0500 +++ b/debian/changelog Thu Apr 11 22:41:41 2019 +0200 @@ -1,3 +1,9 @@ +mercurial-evolve (8.4.0-1) unstable; urgency=medium + + * new upstream release + + -- Pierre-Yves David Tue, 22 Jan 2019 20:24:11 -0500 + mercurial-evolve (8.3.3-1) unstable; urgency=medium * new upstream release diff -r 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/__init__.py --- a/hgext3rd/evolve/__init__.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/__init__.py Thu Apr 11 22:41:41 2019 +0200 @@ -220,24 +220,22 @@ via an extension). Instability -========== +=========== -(note: the vocabulary is in the process of being updated) - -Rewriting changesets might introduce instability (currently 'trouble'). +Rewriting changesets might introduce instability. There are two main kinds of instability: orphaning and diverging. -Orphans are changesets left behind when their ancestors are rewritten, (currently: 'unstable'). +Orphans are changesets left behind when their ancestors are rewritten. Divergence has two variants: * Content-divergence occurs when independent rewrites of the same changesets - lead to different results. (currently: 'divergent') + lead to different results. * Phase-divergence occurs when the old (obsolete) version of a changeset - becomes public. (currently: 'bumped') + becomes public. -If it possible to prevent local creation of orphans by using the following config:: +It is possible to prevent local creation of orphans by using the following config:: [experimental] evolution=createmarkers,allnewcommands,exchange @@ -257,14 +255,6 @@ import struct try: - import StringIO as io - StringIO = io.StringIO -except ImportError: - import io - StringIO = io.StringIO - - -try: from mercurial import registrar registrar.templatekeyword # new in hg-3.8 except ImportError: @@ -276,8 +266,6 @@ from mercurial import util from mercurial import obsolete -if not obsolete._enabled: - obsolete._enabled = True from mercurial import ( bookmarks as bookmarksmod, @@ -844,14 +832,14 @@ created = ret[1] if (opts['obsolete'] and None not in (created, expected['node']) and created != expected['node']): - tr = repo.transaction('import-obs') - try: - metadata = {'user': ui.username()} - repo.obsstore.create(tr, expected['node'], (created,), - metadata=metadata) - tr.close() - finally: - tr.release() + tr = repo.transaction('import-obs') + try: + metadata = {'user': ui.username()} + repo.obsstore.create(tr, expected['node'], (created,), + metadata=metadata) + tr.close() + finally: + tr.release() return ret diff -r 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/cmdrewrite.py --- a/hgext3rd/evolve/cmdrewrite.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/cmdrewrite.py Thu Apr 11 22:41:41 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 @@ -169,18 +168,18 @@ for chunk, label in patch.diffui(repo, p1.node(), old.node(), match=matcher, opts=diffopts): - fp.write(chunk) + fp.write(chunk) newnode = _editandapply(ui, repo, pats, old, p1, fp, diffopts) if newnode == old.node(): raise error.Abort(_("nothing changed")) 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: @@ -205,7 +204,7 @@ for chunk, label in patch.diffui(repo, p1.node(), old.node(), match=restmatcher, opts=diffopts): - afp.write(chunk) + afp.write(chunk) user_patch = afp.getvalue() if not user_patch: @@ -521,18 +520,47 @@ if disallowunstable and not onahead: raise error.Abort(_("cannot uncommit in the middle of a stack")) + match = scmutil.match(old, pats, opts) + + # Check all explicitly given files; abort if there's a problem. + if match.files(): + s = old.status(old.p1(), match, listclean=True) + eligible = set(s.added) | set(s.modified) | set(s.removed) + + badfiles = set(match.files()) - eligible + + # Naming a parent directory of an eligible file is OK, even + # if not everything tracked in that directory can be + # uncommitted. + if badfiles: + badfiles -= set([f for f in util.dirs(eligible)]) + + try: + uipathfn = scmutil.getuipathfn(repo) + except AttributeError: + uipathfn = match.rel # <= 4.9 + + for f in sorted(badfiles): + if f in s.clean: + hint = _(b"file was not changed in working directory " + b"parent") + elif repo.wvfs.exists(f): + hint = _(b"file was untracked in working directory parent") + else: + hint = _(b"file does not exist") + + raise error.Abort(_(b'cannot uncommit "%s"') + % uipathfn(f), hint=hint) + # 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) newid = _interactiveuncommit(ui, repo, old, match) else: newid = None includeorexclude = opts.get('include') or opts.get('exclude') if (pats or includeorexclude or opts.get('all')): - match = scmutil.match(old, pats, opts) if not (opts['message'] or opts['logfile']): opts['message'] = old.description() message = cmdutil.logmessage(ui, opts) @@ -548,8 +576,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 +586,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")) @@ -582,7 +610,7 @@ fp = stringio() for chunk, label in patch.diffui(repo, tempnode, old.node(), None, opts=diffopts): - fp.write(chunk) + fp.write(chunk) fp.seek(0) newnode = _patchtocommit(ui, repo, old, fp) @@ -607,13 +635,18 @@ # uncommit a removed file partially. # TODO: wrap the operations in mercurial/patch.py and mercurial/crecord.py # to add uncommit as an operation taking care of BC. - chunks, opts = cmdutil.recordfilter(repo.ui, originalchunks, - operation='discard') + try: + chunks, opts = cmdutil.recordfilter(repo.ui, originalchunks, match, + operation='discard') + except TypeError: + # hg <= 4.9 (db72f9f6580e) + chunks, opts = cmdutil.recordfilter(repo.ui, originalchunks, + operation='discard') if not chunks: raise error.Abort(_("nothing selected to uncommit")) fp = stringio() for c in chunks: - c.write(fp) + c.write(fp) fp.seek(0) oldnode = node.hex(old.node())[:12] @@ -776,14 +809,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() @@ -1013,7 +1041,7 @@ try: wlock = repo.wlock() lock = repo.lock() - rewriteutil.precheck(repo, revs, 'touch') + rewriteutil.precheck(repo, revs, 'prune') tr = repo.transaction('prune') # defines pruned changesets precs = [] @@ -1044,9 +1072,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 +1134,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 +1146,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: @@ -1181,6 +1206,8 @@ cmdutil.bailifchanged(repo) rewriteutil.precheck(repo, [rev], action='split') tr = repo.transaction('split') + # make sure we respect the phase while splitting + overrides = {('phases', 'new-commit'): ctx.phase()} if len(ctx.parents()) > 1: raise error.Abort(_("cannot split merge commits")) @@ -1219,8 +1246,10 @@ if haschanges(matcher): if iselect: - cmdutil.dorecord(ui, repo, commands.commit, 'commit', False, - cmdutil.recordfilter, *pats, **opts) + with repo.ui.configoverride(overrides, 'split'): + cmdutil.dorecord(ui, repo, commands.commit, 'commit', + False, cmdutil.recordfilter, *pats, + **opts) # TODO: Does no seem like the best way to do this # We should make dorecord return the newly created commit newcommits.append(repo['.']) @@ -1229,7 +1258,8 @@ hint = _("do you want --interactive") raise error.Abort(msg, hint=hint) else: - commands.commit(ui, repo, *pats, **opts) + with repo.ui.configoverride(overrides, 'split'): + commands.commit(ui, repo, *pats, **opts) newcommits.append(repo['.']) if pats: # refresh the wctx used for the matcher @@ -1242,7 +1272,8 @@ while nextaction is None: nextaction = ui.prompt('continue splitting? [Ycdq?]', default='y') if nextaction == 'c': - commands.commit(ui, repo, **opts) + with repo.ui.configoverride(overrides, 'split'): + commands.commit(ui, repo, **opts) newcommits.append(repo['.']) break elif nextaction == 'q': @@ -1280,7 +1311,8 @@ if haschanges(): # XXX: Should we show a message for informing the user # that we create another commit with remaining changes? - commands.commit(ui, repo, **opts) + with repo.ui.configoverride(overrides, 'split'): + commands.commit(ui, repo, **opts) newcommits.append(repo['.']) if newcommits: tip = repo[newcommits[-1]] @@ -1327,7 +1359,7 @@ ui.write_err('no revision to touch\n') return 1 if not duplicate: - rewriteutil.precheck(repo, revs, touch) + rewriteutil.precheck(repo, revs, 'touch') tmpl = utility.shorttemplate displayer = compat.changesetdisplayer(ui, repo, {'template': tmpl}) wlock = lock = tr = None @@ -1397,7 +1429,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.""" @@ -1412,7 +1444,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['.'] @@ -1469,11 +1502,13 @@ newnode = repo.commit(text=origctx.description(), user=origctx.user(), date=origctx.date(), extra=origctx.extra()) + repo.dirstate.setbranch(origctx.branch()) 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 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/compat.py --- a/hgext3rd/evolve/compat.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/compat.py Thu Apr 11 22:41:41 2019 +0200 @@ -16,11 +16,9 @@ obsolete, obsutil, repair, - revset, scmutil, util, ui as uimod, - vfs as vfsmod, ) from mercurial.hgweb import hgweb_mod @@ -54,43 +52,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 +69,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,21 +77,17 @@ 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 - ctxmandatory = varnames[2] == "changectx" - if ctxmandatory: + if "copysource" in varnames: + mctx = context.memfilectx(repo, ctx, fctx.path(), fctx.data(), + islink='l' in flags, + isexec='x' in flags, + copysource=copied.get(path)) + # compat with hg <- 4.9 + elif varnames[2] == "changectx": mctx = context.memfilectx(repo, ctx, fctx.path(), fctx.data(), islink='l' in flags, isexec='x' in flags, @@ -157,13 +99,6 @@ copied=copied.get(path)) return mctx -def getcachevfs(repo): - cachevfs = getattr(repo, 'cachevfs', None) - if cachevfs is None: - cachevfs = vfsmod.vfs(repo.vfs.join('cache')) - cachevfs.createmode = repo.store.createmode - return cachevfs - def strdiff(a, b, fn1, fn2): """ A version of mdiff.unidiff for comparing two strings """ @@ -261,7 +196,11 @@ if graft: tca = _c1.ancestor(_c2) - limit = copies._findlimit(repo, c1.rev(), c2.rev()) + # hg < 4.8 compat (dc50121126ae) + try: + limit = copies._findlimit(repo, c1, c2) + except (AttributeError, TypeError): + limit = copies._findlimit(repo, c1.rev(), c2.rev()) if limit is None: # no common ancestor, no copies return {}, {}, {}, {}, {} @@ -478,7 +417,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 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/depthcache.py --- a/hgext3rd/evolve/depthcache.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/depthcache.py Thu Apr 11 22:41:41 2019 +0200 @@ -178,8 +178,7 @@ """load data from disk""" assert repo.filtername is None - cachevfs = compat.getcachevfs(repo) - data = cachevfs.tryread(self._filepath) + data = repo.cachevfs.tryread(self._filepath) self._data = array.array('l') if not data: self._cachekey = self.emptykey @@ -199,8 +198,7 @@ return try: - cachevfs = compat.getcachevfs(repo) - cachefile = cachevfs(self._filepath, 'w', atomictemp=True) + cachefile = repo.cachevfs(self._filepath, 'w', atomictemp=True) headerdata = self._serializecachekey() cachefile.write(headerdata) cachefile.write(self._data.tostring()) diff -r 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/evolvecmd.py --- a/hgext3rd/evolve/evolvecmd.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/evolvecmd.py Thu Apr 11 22:41:41 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): @@ -172,7 +165,7 @@ repo.ui.write(_('atop:')) displayer.show(target) if confirm and ui.prompt('perform evolve? [Ny]', 'n') != 'y': - raise error.Abort(_('evolve aborted by user')) + raise error.Abort(_('evolve aborted by user')) if progresscb: progresscb() todo = 'hg rebase -r %s -d %s\n' % (orig, target) @@ -236,7 +229,6 @@ return (False, ".") if progresscb: progresscb() - tmpctx = bumped # Checking for whether the phase-divergent changeset has common parents as # it's precursors. Phase-divergent changeset and precursor having different @@ -249,13 +241,14 @@ repo.ui.status( _('rebasing to destination parent: %s\n') % prec.p1()) try: - tmpid = relocate(repo, bumped, prec.p1(), evolvestate, - category='phasedivergent') - if tmpid is not None: - tmpctx = repo[tmpid] - obsolete.createmarkers(repo, [(bumped, (tmpctx,))], + newnode = relocate(repo, bumped, prec.p1(), evolvestate, + category='phasedivergent') + if newnode is not None: + new = repo[newnode] + obsolete.createmarkers(repo, [(bumped, (new,))], operation='evolve') - evolvestate['temprevs'].append(tmpid) + bumped = new + evolvestate['temprevs'].append(newnode) except MergeFailure: evolvestate['current'] = bumped.hex() evolvestate['precursor'] = prec.hex() @@ -263,74 +256,53 @@ raise error.InterventionRequired(_("fix conflicts and see `hg help " "evolve.interrupted`")) - return _resolvephasedivergent(ui, repo, prec, bumped, tmpctx) + return _resolvephasedivergent(ui, repo, prec, bumped) -def _resolvephasedivergent(ui, repo, prec, bumped, tmpctx=None): +def _resolvephasedivergent(ui, repo, prec, bumped): + """final step of a phase divergence resolution + This will create a new changesets (or nothing when applicable), the two + changesets needs to be on the same parents. + """ tr = repo.currenttransaction() assert tr is not None + + cl = repo.changelog + prec_parent = cl.parentrevs(prec.rev()) + bump_parent = cl.parentrevs(bumped.rev()) + assert prec_parent == bump_parent, (prec_parent, bump_parent) + bmupdate = _bookmarksupdater(repo, bumped.node(), tr) newid = None replacementnode = None - # function to update the bookmark from the rebased changeset to new resolved - # changeset - rebasedbmupdate = None - if tmpctx and tmpctx.node() != bumped.node(): - rebasedbmupdate = _bookmarksupdater(repo, tmpctx.node(), tr) - 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() - # 3.3.2 needs a list. - # future 3.4 don't detect the size change during iteration - # this is fishy - for key, val in list(bumped.manifest().iteritems()): - precvalue = precmanifest.get(key, None) - if precvalue is not None: - del precmanifest[key] - if precvalue != val: - files.add(key) - files.update(precmanifest) # add missing files - - # commit it - if files: # something to commit! - def filectxfn(repo, ctx, path): - if path in bumped: - fctx = bumped[path] - flags = fctx.flags() - mctx = compat.memfilectx(repo, ctx, fctx, flags, copied, path) - return mctx - return None + # Create the new commit context. This is done by applying the changes from + # the precursor to the bumped node onto the precursor. This is effectively + # like reverting to the bumped node. + wctx = context.overlayworkingctx(repo) + wctx.setbase(prec) + merge.update(repo, bumped.node(), ancestor=prec, mergeancestor=True, + branchmerge=True, force=False, wc=wctx) + if not wctx.isempty(): text = '%s update to %s:\n\n' % (TROUBLES['PHASEDIVERGENT'], prec) text += bumped.description() - - new = context.memctx(repo, - parents=[prec.node(), nodemod.nullid], - text=text, - files=files, - filectxfn=filectxfn, - user=bumped.user(), - date=bumped.date(), - extra=bumped.extra()) - - newid = repo.commitctx(new) + memctx = wctx.tomemctx(text, + parents=(prec.node(), nodemod.nullid), + date=bumped.date(), + extra=bumped.extra(), + user=bumped.user()) + newid = repo.commitctx(memctx) replacementnode = newid if newid is None: - obsolete.createmarkers(repo, [(tmpctx, ())], operation='evolve') + repo.ui.status(_('no changes to commit\n')) + obsolete.createmarkers(repo, [(bumped, ())], 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],))], + obsolete.createmarkers(repo, [(bumped, (repo[newid],))], flag=obsolete.bumpedfix, operation='evolve') bmupdate(newid) - # 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 +321,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 +355,23 @@ evolvestate['other-divergent'] = other.node() evolvestate['base'] = base.node() + def swapnodes(div, other): + div, other = other, div + evolvestate['divergent'] = div.node() + evolvestate['other-divergent'] = other.node() + return div, other + # 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 = swapnodes(divergent, other) + 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 +401,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 +429,44 @@ # 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 = swapnodes(divergent, other) + 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 = swapnodes(divergent, other) + resolutionparent = divergent.p1().node() else: msg = _("skipping %s: have a different parent than %s " "(not handled yet)\n") % (divergent, other) @@ -499,8 +528,24 @@ _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) def _mergecontentdivergents(repo, progresscb, divergent, other, base, evolvestate): @@ -513,12 +558,13 @@ (TROUBLES['CONTENTDIVERGENT'], other.hex()[:12])) if progresscb: progresscb() + mergeancestor = repo.changelog.isancestor(divergent.node(), other.node()) stats = merge.update(repo, other.node(), branchmerge=True, force=False, ancestor=base.node(), - mergeancestor=True) + mergeancestor=mergeancestor) hg._showstats(repo, stats) # conflicts while merging content-divergent changesets @@ -542,6 +588,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) @@ -560,7 +631,7 @@ mergehook(repo, base, divergent, other) - newnode = repo.commit(text=desc, user=repo.ui.username()) + newnode = repo.commit(text=desc, user=other.user()) if newnode == divergent.node() or newnode is None: # no changes new = divergent @@ -571,10 +642,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,9 +665,53 @@ 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 directory working directory using + oldparent to newparent with a dirty working directory using repo.dirstate.setparents() Lets refer oldparent as Pold @@ -825,6 +947,7 @@ repo.dirstate.write(tr) # fix up dirstate for copies and renames copies.duplicatecopies(repo, repo[None], dest.rev(), orig.p1().rev()) + dirstatedance(repo, dest, orig.node(), None) class LocalMergeFailure(MergeFailure, exc.__class__): pass @@ -896,7 +1019,7 @@ # uurrgs # there no other topic setter yet if not orig.topic() and repo.vfs.exists('topic'): - repo.vfs.unlink('topic') + repo.vfs.unlink('topic') else: with repo.vfs.open('topic', 'w') as f: f.write(orig.topic()) @@ -1297,10 +1420,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): @@ -1455,7 +1580,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'] @@ -1473,12 +1598,13 @@ return targetcat = 'orphan' + has_some_opts = bool(revopt or anyopt or allopt or contopt or stopopt or abortopt) if 1 < len(specifiedcategories): msg = _('cannot specify more than one trouble category to solve (yet)') raise error.Abort(msg) elif len(specifiedcategories) == 1: targetcat = specifiedcategories[0] - elif repo['.'].obsolete() and not(revopt or anyopt or allopt): + elif repo['.'].obsolete() and not has_some_opts: # if no args and parent is obsolete, update to successors return solveobswdp(ui, repo, opts) @@ -1505,6 +1631,8 @@ evolvestate.delete() return startnode = repo.unfiltered()[evolvestate['startnode']] + if 'update' in evolvestate: + shouldupdate = evolvestate['update'] evolvestate.delete() elif stopopt: if not evolvestate: @@ -1552,9 +1680,10 @@ # 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': []} + 'bookmarkchanges': [], 'temprevs': [], 'obsmarkers': [], + 'update': shouldupdate} evolvestate.addopts(stateopts) # lastsolved: keep track of successor of last troubled cset we evolved # to confirm that if atop msg should be suppressed to remove redundancy @@ -1599,8 +1728,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}) @@ -1623,7 +1753,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) @@ -1818,8 +1948,25 @@ 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) tr.close() + return ret finally: tr.release() @@ -1843,7 +1990,7 @@ # now continuing the phase-divergence resolution part prec = repo[evolvestate['precursor']] - retvalue = _resolvephasedivergent(ui, repo, prec, ctx, newctx) + retvalue = _resolvephasedivergent(ui, repo, prec, newctx) evolvestate['replacements'][ctx.node()] = retvalue[1] tr.close() finally: diff -r 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/firstmergecache.py --- a/hgext3rd/evolve/firstmergecache.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/firstmergecache.py Thu Apr 11 22:41:41 2019 +0200 @@ -115,8 +115,7 @@ """load data from disk""" assert repo.filtername is None - cachevfs = compat.getcachevfs(repo) - data = cachevfs.tryread(self._filepath) + data = repo.cachevfs.tryread(self._filepath) self._data = array.array('l') if not data: self._cachekey = self.emptykey @@ -136,8 +135,7 @@ return try: - cachevfs = compat.getcachevfs(repo) - cachefile = cachevfs(self._filepath, 'w', atomictemp=True) + cachefile = repo.cachevfs(self._filepath, 'w', atomictemp=True) headerdata = self._serializecachekey() cachefile.write(headerdata) cachefile.write(self._data.tostring()) diff -r 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/metadata.py --- a/hgext3rd/evolve/metadata.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/metadata.py Thu Apr 11 22:41:41 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.0.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 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/obscache.py --- a/hgext3rd/evolve/obscache.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/obscache.py Thu Apr 11 22:41:41 2019 +0200 @@ -20,7 +20,6 @@ ) from . import ( - compat, exthelper, ) @@ -323,7 +322,6 @@ def __init__(self, repo): super(obscache, self).__init__() self._ondiskkey = None - self._vfs = compat.getcachevfs(repo) @util.propertycache def get(self): @@ -405,7 +403,7 @@ return try: - cachefile = self._vfs(self._filepath, 'w', atomictemp=True) + cachefile = repo.cachevfs(self._filepath, 'w', atomictemp=True) headerdata = struct.pack(self._headerformat, *self._cachekey) cachefile.write(headerdata) cachefile.write(self._data) @@ -419,7 +417,7 @@ """load data from disk""" assert repo.filtername is None - data = self._vfs.tryread(self._filepath) + data = repo.cachevfs.tryread(self._filepath) if not data: self._cachekey = self.emptykey self._setdata(bytearray()) diff -r 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/obsdiscovery.py --- a/hgext3rd/evolve/obsdiscovery.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/obsdiscovery.py Thu Apr 11 22:41:41 2019 +0200 @@ -15,13 +15,6 @@ from __future__ import absolute_import -try: - import StringIO as io - StringIO = io.StringIO -except ImportError: - import io - StringIO = io.StringIO - import hashlib import heapq import inspect @@ -95,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) @@ -111,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), @@ -412,12 +416,12 @@ _schemaversion = 3 _cachename = 'evo-ext-obshashrange' # used for error message - _filename = 'cache/evoext_obshashrange_v2.sqlite' + _filename = 'evoext_obshashrange_v2.sqlite' def __init__(self, repo): super(_obshashcache, self).__init__() self._vfs = repo.vfs - self._path = repo.vfs.join(self._filename) + self._path = repo.cachevfs.join(self._filename) self._new = set() self._valid = True self._repo = weakref.ref(repo.unfiltered()) diff -r 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/obsexchange.py --- a/hgext3rd/evolve/obsexchange.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/obsexchange.py Thu Apr 11 22:41:41 2019 +0200 @@ -8,11 +8,9 @@ from __future__ import absolute_import try: - import StringIO as io - StringIO = io.StringIO + from StringIO import StringIO except ImportError: - import io - StringIO = io.StringIO + from io import StringIO from mercurial import ( bundle2, diff -r 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/obshistory.py --- a/hgext3rd/evolve/obshistory.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/obshistory.py Thu Apr 11 22:41:41 2019 +0200 @@ -601,8 +601,7 @@ matchfn = scmutil.matchall(repo) firstline = True for chunk, label in patch.diffui(repo, node, succ, matchfn, - changes=None, opts=diffopts, - prefix='', relroot=''): + opts=diffopts): if firstline: fm.plain('\n') firstline = False @@ -738,8 +737,7 @@ matchfn = scmutil.matchall(repo) firstline = True for chunk, label in patch.diffui(repo, node, succ, matchfn, - changes=None, opts=diffopts, - prefix='', relroot=''): + opts=diffopts): if firstline: fm.plain('\n') firstline = False @@ -782,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 = [] @@ -840,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 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/stablerangecache.py --- a/hgext3rd/evolve/stablerangecache.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/stablerangecache.py Thu Apr 11 22:41:41 2019 +0200 @@ -176,7 +176,7 @@ def __init__(self, repo, **kwargs): super(stablerangesqlbase, self).__init__(**kwargs) self._vfs = repo.vfs - self._path = repo.vfs.join(self._cachefile) + self._path = repo.cachevfs.join(self._cachefile) self._cl = repo.unfiltered().changelog # (okay to keep an old one) self._ondisktiprev = None self._ondisktipnode = None @@ -390,13 +390,13 @@ class mergepointsql(stablerangesql, stablerange.stablerange_mergepoint): _schemaversion = 3 - _cachefile = 'cache/evoext_stablerange_v2.sqlite' + _cachefile = 'evoext_stablerange_v2.sqlite' _cachename = 'evo-ext-stablerange-mergepoint' class sqlstablerange(stablerangesqlbase, stablerange.stablerange): _schemaversion = 1 - _cachefile = 'cache/evoext_stablerange_v1.sqlite' + _cachefile = 'evoext_stablerange_v1.sqlite' def warmup(self, repo, upto=None): self._con # make sure the data base is loaded diff -r 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/stablesort.py --- a/hgext3rd/evolve/stablesort.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/stablesort.py Thu Apr 11 22:41:41 2019 +0200 @@ -608,8 +608,7 @@ """ assert repo.filtername is None - cachevfs = compat.getcachevfs(repo) - data = cachevfs.tryread(self._filepath) + data = repo.cachevfs.tryread(self._filepath) self._index = array.array('l') self._data = array.array('l') if not data: @@ -635,8 +634,7 @@ if self._cachekey is None or self._cachekey == self._ondiskkey: return try: - cachevfs = compat.getcachevfs(repo) - cachefile = cachevfs(self._filepath, 'w', atomictemp=True) + cachefile = repo.cachevfs(self._filepath, 'w', atomictemp=True) # data to write headerdata = self._serializecachekey() diff -r 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/state.py --- a/hgext3rd/evolve/state.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/state.py Thu Apr 11 22:41:41 2019 +0200 @@ -45,6 +45,9 @@ def __nonzero__(self): return self.exists() + def __contains__(self, key): + return key in self.opts + def __getitem__(self, key): return self.opts[key] diff -r 2cbb9914d227 -r 7a779a288793 hgext3rd/evolve/utility.py --- a/hgext3rd/evolve/utility.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/evolve/utility.py Thu Apr 11 22:41:41 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 2cbb9914d227 -r 7a779a288793 hgext3rd/serverminitopic.py --- a/hgext3rd/serverminitopic.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/serverminitopic.py Thu Apr 11 22:41:41 2019 +0200 @@ -1,5 +1,8 @@ """enable a minimal verison of topic for server +! This extensions is not actively maintained +! We recommand using the main topic extension instead + Non publishing repository will see topic as "branch:topic" in the branch field. In addition to adding the extensions, the feature must be manually enabled in the config: @@ -143,6 +146,10 @@ return hasminitopic(repo) and repo.filtername not in _publiconly class _topiccache(branchmap.branchcache): # combine me with branchmap.branchcache + @classmethod + def fromfile(cls, repo): + orig = super(_topiccache, cls).fromfile + return wrapread(orig, repo) def __init__(self, *args, **kwargs): # super() call may fail otherwise @@ -223,6 +230,12 @@ def uisetup(ui): wrapclass(branchmap, 'branchcache', _topiccache) - extensions.wrapfunction(branchmap, 'read', wrapread) + try: + # Mercurial 4.8 and older + extensions.wrapfunction(branchmap, 'read', wrapread) + except AttributeError: + # Mercurial 4.9; branchcache.fromfile now takes care of this + # which is alredy defined on _topiccache + pass extensions.wrapfunction(wireproto, '_capabilities', wireprotocaps) extensions.wrapfunction(context.changectx, 'branch', topicbranch) diff -r 2cbb9914d227 -r 7a779a288793 hgext3rd/topic/__init__.py --- a/hgext3rd/topic/__init__.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/topic/__init__.py Thu Apr 11 22:41:41 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,9 +179,9 @@ 'topic.active': 'green', } -__version__ = '0.13.0.dev' +__version__ = '0.14.0.dev' -testedwith = '4.4.2 4.5.2 4.6.2 4.7 4.8' +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 2cbb9914d227 -r 7a779a288793 hgext3rd/topic/revset.py --- a/hgext3rd/topic/revset.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/topic/revset.py Thu Apr 11 22:41:41 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 2cbb9914d227 -r 7a779a288793 hgext3rd/topic/stack.py --- a/hgext3rd/topic/stack.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/topic/stack.py Thu Apr 11 22:41:41 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""" @@ -51,16 +42,11 @@ The intend is to build something more efficient than what revsets do in this area. """ - phasecache = repo._phasecache - if not phasecache._phasesets: - return repo.revs('(not public()) - obsolete()') - if any(s is None for s in phasecache._phasesets): + phasesets = repo._phasecache._phasesets + if not phasesets or None in phasesets[phases.draft:]: return repo.revs('(not public()) - obsolete()') - result = set() - for s in phasecache._phasesets[phases.draft:]: - result |= s - + result = set.union(*phasesets[phases.draft:]) result -= obsolete.getrevs(repo, 'obsolete') return result @@ -228,7 +214,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 +279,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 +316,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 +347,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 2cbb9914d227 -r 7a779a288793 hgext3rd/topic/topicmap.py --- a/hgext3rd/topic/topicmap.py Tue Jan 22 12:54:43 2019 -0500 +++ b/hgext3rd/topic/topicmap.py Thu Apr 11 22:41:41 2019 +0200 @@ -9,6 +9,7 @@ cmdutil, extensions, repoview, + util, ) basefilter = set(['base', 'immutable']) @@ -117,7 +118,21 @@ class topiccache(_topiccache, branchmap.branchcache): pass branchmap.branchcache = topiccache - extensions.wrapfunction(branchmap, 'updatecache', _wrapupdatebmcache) + + try: + # Mercurial 4.9 + class remotetopiccache(_topiccache, branchmap.remotebranchcache): + pass + branchmap.remotebranchcache = remotetopiccache + + def _wrapupdatebmcachemethod(orig, self, repo): + # pass in the bound method as the original + return _wrapupdatebmcache(orig.__get__(self), repo) + extensions.wrapfunction(branchmap.BranchMapCache, 'updatecache', _wrapupdatebmcachemethod) + except AttributeError: + # Mercurial 4.8 and before + extensions.wrapfunction(branchmap, 'updatecache', _wrapupdatebmcache) + def _wrapupdatebmcache(orig, repo): previous = getattr(repo, '_autobranchmaptopic', False) @@ -150,8 +165,13 @@ def copy(self): """return an deep copy of the branchcache object""" - new = self.__class__(self, self.tipnode, self.tiprev, self.filteredhash, - self._closednodes) + if util.safehasattr(self, '_entries'): + _entries = self._entries + else: + # hg <= 4.9 (624d6683c705, b137a6793c51) + _entries = self + new = self.__class__(_entries, self.tipnode, self.tiprev, + self.filteredhash, self._closednodes) new.phaseshash = self.phaseshash return new diff -r 2cbb9914d227 -r 7a779a288793 tests/test-discovery-obshashrange.t --- a/tests/test-discovery-obshashrange.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-discovery-obshashrange.t Thu Apr 11 22:41:41 2019 +0200 @@ -1158,3 +1158,64 @@ saved backup bundle to $TESTTMP/client/.hg/strip-backup/c8d03c1b5e94-b257442b-backup.hg $ f -s .hg/cache/evoext* .hg/cache/evoext-obscache-00: size=70 + $ cd .. + +Check capabilities advertisement +================================ + + $ hg init with-evolve + $ cat << EOF >> with-evolve/.hg/hgrc + > [experimental] + > evolution.exchange=yes + > EOF + $ hg init without-evolve + $ cat << EOF >> without-evolve/.hg/hgrc + > [experimental] + > evolution.exchange=no + > EOF + + $ hg debugcapabilities ssh://user@dummy/with-evolve | grep _evoext + _evoext_getbundle_obscommon + _evoext_obshash_0 + _evoext_obshash_1 + _evoext_obshashrange_v1 + $ hg debugcapabilities ssh://user@dummy/without-evolve | grep _evoext + [1] + +Using http: + + $ cat > web.conf << EOF + > [paths] + > / = * + > EOF + +(evolve version first) + + $ hg serve --web-conf web.conf -p $HGPORT -d --pid-file hg.pid + $ cat hg.pid >> $DAEMON_PIDS + + $ hg debugcapabilities http://localhost:$HGPORT/with-evolve| grep _evoext + _evoext_getbundle_obscommon + _evoext_obshash_0 + _evoext_obshash_1 + _evoext_obshashrange_v1 + $ hg debugcapabilities http://localhost:$HGPORT/without-evolve| grep _evoext + [1] + + $ killdaemons.py + + +(evolve version second) + + $ hg serve --web-conf web.conf -p $HGPORT -d --pid-file hg.pid + $ cat hg.pid >> $DAEMON_PIDS + + $ hg debugcapabilities http://localhost:$HGPORT/without-evolve| grep _evoext + [1] + $ hg debugcapabilities http://localhost:$HGPORT/with-evolve| grep _evoext + _evoext_getbundle_obscommon + _evoext_obshash_0 + _evoext_obshash_1 + _evoext_obshashrange_v1 + + $ killdaemons.py diff -r 2cbb9914d227 -r 7a779a288793 tests/test-divergent.t --- a/tests/test-divergent.t Tue Jan 22 12:54:43 2019 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,207 +0,0 @@ -Tests the resolution of divergence - - $ cat >> $HGRCPATH < [defaults] - > amend=-d "0 0" - > fold=-d "0 0" - > [web] - > push_ssl = false - > allow_push = * - > [phases] - > publish = False - > [diff] - > git = 1 - > unified = 0 - > [ui] - > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline} [{troubles}]\n - > [extensions] - > EOF - $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH - $ mkcommit() { - > echo "$1" > "$1" - > hg add "$1" - > hg ci -m "add $1" - > } - - $ mkcommits() { - > for i in $@; do mkcommit $i ; done - > } - -Basic test of divergence: two divergent changesets with the same parents -With --all --any we dedupe the divergent and solve the divergence once - - $ hg init test1 - $ cd test1 - $ echo a > a - $ hg ci -Aqm "added a" - $ echo b > b - $ hg ci -Aqm "added b" - - $ hg up .^ - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ echo bdivergent > bdivergent1 - $ hg ci -Am "divergent" - adding bdivergent1 - created new head - - $ hg up .^ - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ echo bdivergent > bdivergent2 - $ hg ci -Am "divergent" - adding bdivergent2 - created new head - - $ hg prune -s 8374d2ddc3a4 "desc('added b')" - 1 changesets pruned - $ hg prune -s 593c57f2117e "desc('added b')" --hidden - 1 changesets pruned - 2 new content-divergent changesets - - $ hg log -G - @ 3:8374d2ddc3a4@default(draft) divergent [content-divergent] - | - | * 2:593c57f2117e@default(draft) divergent [content-divergent] - |/ - o 0:9092f1db7931@default(draft) added a [] - - - $ hg evolve --all --any --content-divergent - merge:[2] divergent - with: [3] divergent - base: [1] added b - updating to "local" side of the conflict: 593c57f2117e - merging "other" content-divergent changeset '8374d2ddc3a4' - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - working directory is now at 45bf1312f454 - $ hg log -G - @ 4:45bf1312f454@default(draft) divergent [] - | - o 0:9092f1db7931@default(draft) added a [] - -Test divergence resolution when it yields to an empty commit (issue4950) -cdivergent2 contains the same content than cdivergent1 and they are divergent -versions of the revision _c - - $ hg up .^ - 0 files updated, 0 files merged, 2 files removed, 0 files unresolved - $ mkcommit _c - created new head - - $ hg up .^ - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ mkcommit cdivergent1 - created new head - - $ hg up .^ - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ echo "cdivergent1" > cdivergent1 - $ hg add cdivergent1 - $ hg ci -m "add _c" - created new head - - $ hg log -G - @ 7:b2ae71172042@default(draft) add _c [] - | - | o 6:e3ff64ce8d4c@default(draft) add cdivergent1 [] - |/ - | o 5:48819a835615@default(draft) add _c [] - |/ - | o 4:45bf1312f454@default(draft) divergent [] - |/ - o 0:9092f1db7931@default(draft) added a [] - - - $ hg prune -s b2ae71172042 48819a835615 - 1 changesets pruned - $ hg prune -s e3ff64ce8d4c 48819a835615 --hidden - 1 changesets pruned - 2 new content-divergent changesets - - $ hg log -G - @ 7:b2ae71172042@default(draft) add _c [content-divergent] - | - | * 6:e3ff64ce8d4c@default(draft) add cdivergent1 [content-divergent] - |/ - | o 4:45bf1312f454@default(draft) divergent [] - |/ - o 0:9092f1db7931@default(draft) added a [] - - $ hg evolve --all --any --content-divergent - merge:[6] add cdivergent1 - with: [7] add _c - base: [5] add _c - updating to "local" side of the conflict: e3ff64ce8d4c - merging "other" content-divergent changeset 'b2ae71172042' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - nothing changed - working directory is now at e3ff64ce8d4c - - $ cd .. - -Test None docstring issue of evolve divergent, which caused hg crush - - $ hg init test2 - $ cd test2 - $ mkcommits _a _b - - $ hg up .^ - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ echo bdivergent > bdivergent11 - $ hg ci -Am "bdivergent" - adding bdivergent11 - created new head - - $ hg up .^ - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ echo bdivergent > bdivergent22 - $ hg ci -Am "bdivergent" - adding bdivergent22 - created new head - - $ hg log -G - @ 3:6b096fb45070@default(draft) bdivergent [] - | - | o 2:05a6b6a9e633@default(draft) bdivergent [] - |/ - | o 1:37445b16603b@default(draft) add _b [] - |/ - o 0:135f39f4bd78@default(draft) add _a [] - - - $ hg prune -s 6b096fb45070 37445b16603b - 1 changesets pruned - $ hg prune -s 05a6b6a9e633 37445b16603b --hidden - 1 changesets pruned - 2 new content-divergent changesets - $ hg log -G - @ 3:6b096fb45070@default(draft) bdivergent [content-divergent] - | - | * 2:05a6b6a9e633@default(draft) bdivergent [content-divergent] - |/ - o 0:135f39f4bd78@default(draft) add _a [] - - - $ cat >$TESTTMP/test_extension.py << EOF - > from mercurial import merge - > origupdate = merge.update - > def newupdate(*args, **kwargs): - > return origupdate(*args, **kwargs) - > merge.update = newupdate - > EOF - $ cat >> $HGRCPATH << EOF - > [extensions] - > testextension=$TESTTMP/test_extension.py - > EOF - $ hg evolve --all - nothing to evolve on current working copy parent - (do you want to use --content-divergent) - [2] - $ hg evolve --content-divergent - merge:[3] bdivergent - with: [2] bdivergent - base: [1] add _b - merging "other" content-divergent changeset '05a6b6a9e633' - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - working directory is now at 73ff357d3975 - - $ cd .. diff -r 2cbb9914d227 -r 7a779a288793 tests/test-evolve-abort-contentdiv.t --- a/tests/test-evolve-abort-contentdiv.t Tue Jan 22 12:54:43 2019 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,376 +0,0 @@ -Tests for the --abort flag for `hg evolve` command while content-divergence resolution -====================================================================================== - -The `--abort` flag aborts the interuppted evolve by undoing all the work which -was done during resolution i.e. stripping new changesets created, moving -bookmarks back, moving working directory back. - -This test contains cases when `hg evolve` is doing content-divergence resolution. - -Setup -===== - - $ cat >> $HGRCPATH < [phases] - > publish = False - > [alias] - > glog = log -GT "{rev}:{node|short} {desc}\n ({bookmarks}) {phase}" - > [extensions] - > EOF - $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH - - $ hg init abortrepo - $ cd abortrepo - $ 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 - | () draft - o 3:ca1b80f7960a added c - | () draft - o 2:b1661037fa25 added b - | () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - -Creating content divergence, resolution of which will lead to conflicts ------------------------------------------------------------------------ - - $ echo bar > d - $ hg amend - - $ hg up c41c793e0ef1 --hidden - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset c41c793e0ef1 - (hidden revision 'c41c793e0ef1' was rewritten as: e49523854bc8) - working directory parent is obsolete! (c41c793e0ef1) - (use 'hg evolve' to update to its successor: e49523854bc8) - - $ echo foobar > d - $ hg amend - 2 new content-divergent changesets - $ hg glog --hidden - @ 6:9c1631e352d9 added d - | () draft - | * 5:e49523854bc8 added d - |/ () draft - | x 4:c41c793e0ef1 added d - |/ () draft - o 3:ca1b80f7960a added c - | () draft - o 2:b1661037fa25 added b - | () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - - $ hg evolve --content-divergent - merge:[6] added d - with: [5] added d - base: [4] added d - merging "other" content-divergent changeset 'e49523854bc8' - 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] - - $ hg status -v - M d - # The repository is in an unfinished *evolve* state. - - # Unresolved merge conflicts: - # - # d - # - # To mark files as resolved: hg resolve --mark FILE - - # To continue: hg evolve --continue - # To abort: hg evolve --abort - # To stop: hg evolve --stop - # (also see `hg help evolve.interrupted`) - - $ hg parents - changeset: 6:9c1631e352d9 - tag: tip - parent: 3:ca1b80f7960a - user: test - date: Thu Jan 01 00:00:00 1970 +0000 - instability: content-divergent - summary: added d - - changeset: 5:e49523854bc8 - parent: 3:ca1b80f7960a - user: test - date: Thu Jan 01 00:00:00 1970 +0000 - instability: content-divergent - summary: added d - - - $ hg evolve --abort - evolve aborted - working directory is now at 9c1631e352d9 - - $ hg glog --hidden - @ 6:9c1631e352d9 added d - | () draft - | * 5:e49523854bc8 added d - |/ () draft - | x 4:c41c793e0ef1 added d - |/ () draft - o 3:ca1b80f7960a added c - | () draft - o 2:b1661037fa25 added b - | () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - -Creating multiple content-divergence where resolution of last one results in -conflicts and resolution of first one resulted in no new commit ------------------------------------------------------------------------------ - - $ echo watbar > d - $ hg amend - $ hg up .^ - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ echo bar > c - $ hg amend - 2 new orphan changesets - $ hg up ca1b80f7960a --hidden - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - working directory parent is obsolete! (ca1b80f7960a) - (use 'hg evolve' to update to its successor: 2ba73e31f264) - $ echo foobar > c - $ hg amend - 2 new content-divergent changesets - $ echo bar > c - $ hg amend - - $ hg glog --hidden - @ 10:491e10505bae added c - | () draft - | x 9:7398f702a162 added c - |/ () draft - | * 8:2ba73e31f264 added c - |/ () draft - | * 7:f0f1694f123e added d - | | () draft - | | x 6:9c1631e352d9 added d - | |/ () draft - | | * 5:e49523854bc8 added d - | |/ () draft - | | x 4:c41c793e0ef1 added d - | |/ () draft - | x 3:ca1b80f7960a added c - |/ () draft - o 2:b1661037fa25 added b - | () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - - $ hg evolve --all --content-divergent - merge:[8] added c - with: [10] added c - base: [3] added c - updating to "local" side of the conflict: 2ba73e31f264 - merging "other" content-divergent changeset '491e10505bae' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - merge:[5] added d - with: [7] added d - base: [4] added d - updating to "local" side of the conflict: e49523854bc8 - merging "other" content-divergent changeset 'f0f1694f123e' - 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] - - $ hg evolve --abort - 2 new content-divergent changesets - evolve aborted - working directory is now at 491e10505bae - - $ hg glog --hidden - @ 10:491e10505bae added c - | () draft - | x 9:7398f702a162 added c - |/ () draft - | * 8:2ba73e31f264 added c - |/ () draft - | * 7:f0f1694f123e added d - | | () draft - | | x 6:9c1631e352d9 added d - | |/ () draft - | | * 5:e49523854bc8 added d - | |/ () draft - | | x 4:c41c793e0ef1 added d - | |/ () draft - | x 3:ca1b80f7960a added c - |/ () draft - o 2:b1661037fa25 added b - | () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - - $ hg obslog -r . --all - * 2ba73e31f264 (8) added c - | - | @ 491e10505bae (10) added c - | | - | x 7398f702a162 (9) added c - |/ rewritten(content) as 491e10505bae using amend by test (Thu Jan 01 00:00:00 1970 +0000) - | - x ca1b80f7960a (3) added c - rewritten(content) as 2ba73e31f264 using amend by test (Thu Jan 01 00:00:00 1970 +0000) - rewritten(content) as 7398f702a162 using amend by test (Thu Jan 01 00:00:00 1970 +0000) - - $ cd .. - -Creating content-divergence on multiple parents when gca of divergent changesets -is parent of one of the divergents and relocating leads to conflicts ---------------------------------------------------------------------------------- - - $ hg init multiparent - $ cd multiparent - $ 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 - | () draft - o 3:ca1b80f7960a added c - | () draft - o 2:b1661037fa25 added b - | () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - - $ hg rebase -r . -d .^^^ --config extensions.rebase= - rebasing 4:c41c793e0ef1 "added d" (tip) - $ echo bar > c - $ hg add c - $ hg amend - - $ hg up --hidden c41c793e0ef1 - 2 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset c41c793e0ef1 - (hidden revision 'c41c793e0ef1' was rewritten as: 69bdd23a9b0d) - working directory parent is obsolete! (c41c793e0ef1) - (use 'hg evolve' to update to its successor: 69bdd23a9b0d) - $ echo bar > d - $ hg amend - 2 new content-divergent changesets - - $ hg glog - @ 7:e49523854bc8 added d - | () draft - | * 6:69bdd23a9b0d added d - | | () draft - o | 3:ca1b80f7960a added c - | | () draft - o | 2:b1661037fa25 added b - |/ () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - - $ hg evolve --content-divergent - merge:[7] added d - with: [6] added d - base: [4] added d - rebasing "other" content-divergent changeset 69bdd23a9b0d on ca1b80f7960a - merging c - warning: conflicts while merging c! (edit, then use 'hg resolve --mark') - fix conflicts and see `hg help evolve.interrupted` - [1] - - $ hg evolve --abort - evolve aborted - working directory is now at e49523854bc8 - - $ hg glog - @ 7:e49523854bc8 added d - | () draft - | * 6:69bdd23a9b0d added d - | | () draft - o | 3:ca1b80f7960a added c - | | () draft - o | 2:b1661037fa25 added b - |/ () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - -Creating content-divergence on multiple parents when gca of divergent changesets -is parent of one of the divergents and merging divergent leads to conflicts ---------------------------------------------------------------------------------- - - $ hg up 69bdd23a9b0d - 2 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ hg rm c - $ echo wat > d - $ hg amend - - $ hg glog - @ 8:33e4442acf98 added d - | () draft - | * 7:e49523854bc8 added d - | | () draft - | o 3:ca1b80f7960a added c - | | () draft - | o 2:b1661037fa25 added b - |/ () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - - $ hg evolve --content-divergent - merge:[7] added d - with: [8] added d - base: [4] added d - rebasing "other" content-divergent changeset 33e4442acf98 on ca1b80f7960a - updating to "local" side of the conflict: e49523854bc8 - merging "other" content-divergent changeset 'a663d1567f0b' - 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] - - $ hg evolve --abort - evolve aborted - working directory is now at 33e4442acf98 - - $ hg glog - @ 8:33e4442acf98 added d - | () draft - | * 7:e49523854bc8 added d - | | () draft - | o 3:ca1b80f7960a added c - | | () draft - | o 2:b1661037fa25 added b - |/ () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft diff -r 2cbb9914d227 -r 7a779a288793 tests/test-evolve-abort-phasediv.t --- a/tests/test-evolve-abort-phasediv.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-evolve-abort-phasediv.t Thu Apr 11 22:41:41 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 2cbb9914d227 -r 7a779a288793 tests/test-evolve-content-divergence.t --- a/tests/test-evolve-content-divergence.t Tue Jan 22 12:54:43 2019 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,929 +0,0 @@ -** Test for handling of content divergent changesets by `hg evolve` ** -==================================================================== - - $ cat >> $HGRCPATH < [alias] - > glog = log -GT "{rev}:{node|short} {desc|firstline}\n ({bookmarks}) [{branch}] {phase}" - > [phases] - > publish = False - > [extensions] - > rebase = - > EOF - $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH - - $ hg init cdiv - $ cd cdiv - $ 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 - -Creating content-divergence with branch change where base, divergent and other -have different branches -------------------------------------------------------------------------------- - - $ hg branch -r . foobar - changed branch on 1 changesets - - $ hg up c41c793e0ef1 --hidden - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset c41c793e0ef1 - (hidden revision 'c41c793e0ef1' was rewritten as: 9e5dffcb3d48) - working directory parent is obsolete! (c41c793e0ef1) - (use 'hg evolve' to update to its successor: 9e5dffcb3d48) - $ echo bar > d - $ hg branch watwat - marked working directory as branch watwat - $ hg amend - 2 new content-divergent changesets - - $ hg glog - @ 6:264b04f771fb added d - | () [watwat] draft - | * 5:9e5dffcb3d48 added d - |/ () [foobar] 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 evolve --content-divergent --config ui.interactive=True< c - > EOF - merge:[6] added d - with: [5] added d - base: [4] added d - merging "other" content-divergent changeset '9e5dffcb3d48' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - content divergent changesets on different branches. - choose branch for the resolution changeset. (a) default or (b) watwat or (c) foobar? c - working directory is now at 0ac42f1bc15c - - $ hg glog - @ 7:0ac42f1bc15c added d - | () [foobar] 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 - -Testing merging of commit messages ------------------------------------ - -When base and one of the divergent has same commit messages and other divergent -has different one - - $ echo wat > d - $ hg amend - - $ hg up .^ - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - - $ echo bar > d - $ hg ci -Aqm "added a d with bar in it, expect some beers" - - $ hg prune -r 0ac42f1bc15c -s . --hidden - 1 changesets pruned - 2 new content-divergent changesets - - $ hg glog - @ 9:59081c9c425a added a d with bar in it, expect some beers - | () [default] draft - | * 8:f621d00f5f0e added d - |/ () [foobar] 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 evolve --content-divergent - merge:[9] added a d with bar in it, expect some beers - with: [8] added d - base: [7] added d - merging "other" content-divergent changeset 'f621d00f5f0e' - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - working directory is now at a9d6fd6b5e40 - - $ hg glog - @ 10:a9d6fd6b5e40 added a d with bar in it, expect some beers - | () [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 - -When base has different message and both divergents has same one - - $ echo foo > d - $ hg amend -m "foo to d" - - $ hg up a9d6fd6b5e40 --hidden - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset a9d6fd6b5e40 - (hidden revision 'a9d6fd6b5e40' was rewritten as: b10b07a394f1) - working directory parent is obsolete! (a9d6fd6b5e40) - (use 'hg evolve' to update to its successor: b10b07a394f1) - $ echo babar > d - $ hg amend -m "foo to d" - 2 new content-divergent changesets - - $ hg glog - @ 12:0bb497fed24a foo to d - | () [default] draft - | * 11:b10b07a394f1 foo to 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 evolve --content-divergent - merge:[12] foo to d - with: [11] foo to d - base: [10] added a d with bar in it, expect some beers - merging "other" content-divergent changeset 'b10b07a394f1' - 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 foobar > d - $ hg resolve -m - (no more unresolved files) - continue: hg evolve --continue - $ hg evolve --continue - working directory is now at 11175423b5dc - - $ hg glog - @ 13:11175423b5dc foo to 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 - -When all three base, divergent and other has different commit messages creating -conflicts - - $ echo bar > d - $ hg amend -m "bar to d, expect beers" - - $ hg up 11175423b5dc --hidden - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset 11175423b5dc - (hidden revision '11175423b5dc' was rewritten as: 27f0463f169a) - working directory parent is obsolete! (11175423b5dc) - (use 'hg evolve' to update to its successor: 27f0463f169a) - $ echo wat > d - $ hg amend -m "wat to d, wat?" - 2 new content-divergent changesets - - $ hg glog - @ 15:f542037ddf31 wat to d, wat? - | () [default] draft - | * 14:27f0463f169a bar to d, expect beers - |/ () [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 evolve --content-divergent - merge:[15] wat to d, wat? - with: [14] bar to d, expect beers - base: [13] foo to d - merging "other" content-divergent changeset '27f0463f169a' - 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 watbar > d - $ hg resolve -m - (no more unresolved files) - continue: hg evolve --continue - - $ cat > editor.sh < #!/bin/sh - > printf "**showing editors text**\n\n" - > cat \$1 - > printf "\n**done showing editors text**\n\n" - > cat > \$1 < watbar to d - > ENDOF - > EOF - - $ HGEDITOR='sh ./editor.sh' hg evolve --continue - **showing editors text** - - HG: Conflicts while merging changeset description of content-divergent changesets. - HG: Resolve conflicts in commit messages to continue. - - <<<<<<< divergent - wat to d, wat?||||||| base - foo to d======= - bar to d, expect beers>>>>>>> other - - **done showing editors text** - - working directory is now at 89ea3eee2d69 - - $ hg glog - @ 16:89ea3eee2d69 watbar to 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 .. - -Testing resolution of content-divergent changesets when they are on different -parents and resolution and relocation wont result in conflicts ------------------------------------------------------------------------------- - - $ hg init multiparents - $ cd multiparents - $ 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 - - $ hg up .^^ - 0 files updated, 0 files merged, 2 files removed, 0 files unresolved - $ echo bar > b - $ hg amend - 2 new orphan changesets - - $ hg rebase -r b1661037fa25 -d 8fa14d15e168 --hidden --config experimental.evolution.allowdivergence=True - rebasing 2:b1661037fa25 "added b" - 2 new content-divergent changesets - - $ hg glog - * 6:da4b96f4a8d6 added b - | () [default] draft - | @ 5:7ed0642d644b added b - | | () [default] draft - | | * 4:c41c793e0ef1 added d - | | | () [default] draft - | | * 3:ca1b80f7960a added c - | | | () [default] draft - | | x 2:b1661037fa25 added b - | |/ () [default] draft - | o 1:c7586e2a9264 added a - |/ () [default] draft - o 0:8fa14d15e168 added hgignore - () [default] draft - - $ hg evolve --content-divergent - merge:[5] added b - with: [6] added b - base: [2] added b - rebasing "other" content-divergent changeset da4b96f4a8d6 on c7586e2a9264 - updating to "local" side of the conflict: 7ed0642d644b - merging "other" content-divergent changeset '11f849d7159f' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - working directory is now at 171614c9a791 - - $ hg glog - @ 8:171614c9a791 added b - | () [default] draft - | * 4:c41c793e0ef1 added d - | | () [default] draft - | * 3:ca1b80f7960a added c - | | () [default] draft - | x 2:b1661037fa25 added b - |/ () [default] draft - o 1:c7586e2a9264 added a - | () [default] draft - o 0:8fa14d15e168 added hgignore - () [default] draft - - $ hg exp - # HG changeset patch - # User test - # Date 0 0 - # Thu Jan 01 00:00:00 1970 +0000 - # Node ID 171614c9a7914c53f531373b95632323fdbbac8d - # Parent c7586e2a92645e473645847a7b69a6dc52be4276 - added b - - diff -r c7586e2a9264 -r 171614c9a791 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 @@ - +bar - -Resolving orphans to get back to a normal graph - - $ hg evolve --all - move:[3] added c - atop:[8] added b - move:[4] added d - working directory is now at 4ae4427ee9f8 - $ hg glog - @ 10:4ae4427ee9f8 added d - | () [default] draft - o 9:917281f93fcb added c - | () [default] draft - o 8:171614c9a791 added b - | () [default] draft - o 1:c7586e2a9264 added a - | () [default] draft - o 0:8fa14d15e168 added hgignore - () [default] draft - -More testing! - - $ hg up .^^ - 0 files updated, 0 files merged, 2 files removed, 0 files unresolved - $ echo x > x - $ hg ci -Aqm "added x" - $ hg glog -r . - @ 11:71a392c714b5 added x - | () [default] draft - ~ - - $ echo foo > x - $ hg branch bar - marked working directory as branch bar - (branches are permanent and global, did you want a bookmark?) - $ hg amend -m "added foo to x" - - $ hg up 71a392c714b5 --hidden - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset 71a392c714b5 - (hidden revision '71a392c714b5' was rewritten as: 1e1a50385a7d) - working directory parent is obsolete! (71a392c714b5) - (use 'hg evolve' to update to its successor: 1e1a50385a7d) - $ hg rebase -r . -d 4ae4427ee9f8 --config experimental.evolution.allowdivergence=True - rebasing 11:71a392c714b5 "added x" - 2 new content-divergent changesets - - $ hg glog - @ 13:1e4f6b3bb39b added x - | () [default] draft - | * 12:1e1a50385a7d added foo to x - | | () [bar] draft - o | 10:4ae4427ee9f8 added d - | | () [default] draft - o | 9:917281f93fcb added c - |/ () [default] draft - o 8:171614c9a791 added b - | () [default] draft - o 1:c7586e2a9264 added a - | () [default] draft - o 0:8fa14d15e168 added hgignore - () [default] draft - - $ hg evolve --content-divergent - merge:[13] added x - with: [12] added foo to x - base: [11] added x - rebasing "other" content-divergent changeset 1e1a50385a7d on 4ae4427ee9f8 - updating to "local" side of the conflict: 1e4f6b3bb39b - merging "other" content-divergent changeset '80cc9b1ec650' - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - working directory is now at b006cf317e0e - - $ hg exp - # HG changeset patch - # User test - # Date 0 0 - # Thu Jan 01 00:00:00 1970 +0000 - # Branch bar - # Node ID b006cf317e0ed16dbe786c439577475580f645f1 - # Parent 4ae4427ee9f8f0935211fd66360948b77ab5aee9 - added foo to x - - diff -r 4ae4427ee9f8 -r b006cf317e0e x - --- /dev/null Thu Jan 01 00:00:00 1970 +0000 - +++ b/x Thu Jan 01 00:00:00 1970 +0000 - @@ -0,0 +1,1 @@ - +foo - -The above `hg exp` and the following log call demonstrates that message, content -and branch change is preserved in case of relocation - $ hg glog - @ 15:b006cf317e0e added foo to x - | () [bar] draft - o 10:4ae4427ee9f8 added d - | () [default] draft - o 9:917281f93fcb added c - | () [default] draft - o 8:171614c9a791 added b - | () [default] draft - o 1:c7586e2a9264 added a - | () [default] draft - o 0:8fa14d15e168 added hgignore - () [default] draft - -Testing when both the content-divergence are on different parents and resolution -will lead to conflicts ---------------------------------------------------------------------------------- - - $ hg up .^^^ - 0 files updated, 0 files merged, 3 files removed, 0 files unresolved - - $ echo y > y - $ hg ci -Aqm "added y" - $ hg glog -r . - @ 16:fc6ad2bac162 added y - | () [default] draft - ~ - - $ echo bar > y - $ hg amend - - $ hg up fc6ad2bac162 --hidden - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset fc6ad2bac162 - (hidden revision 'fc6ad2bac162' was rewritten as: 2a9f6ccbdeba) - working directory parent is obsolete! (fc6ad2bac162) - (use 'hg evolve' to update to its successor: 2a9f6ccbdeba) - $ hg rebase -r . -d b006cf317e0e --config experimental.evolution.allowdivergence=True - rebasing 16:fc6ad2bac162 "added y" - 2 new content-divergent changesets - $ echo wat > y - $ hg amend - - $ hg glog - @ 19:b4575ed6fcfc added y - | () [bar] draft - | * 17:2a9f6ccbdeba added y - | | () [default] draft - o | 15:b006cf317e0e added foo to x - | | () [bar] draft - o | 10:4ae4427ee9f8 added d - | | () [default] draft - o | 9:917281f93fcb added c - |/ () [default] draft - o 8:171614c9a791 added b - | () [default] draft - o 1:c7586e2a9264 added a - | () [default] draft - o 0:8fa14d15e168 added hgignore - () [default] draft - - $ hg evolve --content-divergent - merge:[19] added y - with: [17] added y - base: [16] added y - rebasing "other" content-divergent changeset 2a9f6ccbdeba on b006cf317e0e - updating to "local" side of the conflict: b4575ed6fcfc - merging "other" content-divergent changeset '48f745db3f53' - merging y - warning: conflicts while merging y! (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 watbar > y - $ hg resolve -m - (no more unresolved files) - continue: hg evolve --continue - $ hg evolve --continue - working directory is now at 7bbcf24ddecf - - $ hg glog - @ 21:7bbcf24ddecf added y - | () [bar] draft - o 15:b006cf317e0e added foo to x - | () [bar] draft - o 10:4ae4427ee9f8 added d - | () [default] draft - o 9:917281f93fcb added c - | () [default] draft - o 8:171614c9a791 added b - | () [default] draft - o 1:c7586e2a9264 added a - | () [default] draft - o 0:8fa14d15e168 added hgignore - () [default] draft - - $ hg obslog -r . --all - @ 7bbcf24ddecf (21) added y - |\ - x | 48f745db3f53 (20) added y - | | rewritten(branch, content) as 7bbcf24ddecf using evolve by test (Thu Jan 01 00:00:00 1970 +0000) - | | - | x b4575ed6fcfc (19) added y - | | rewritten(content) as 7bbcf24ddecf using evolve by test (Thu Jan 01 00:00:00 1970 +0000) - | | - x | 2a9f6ccbdeba (17) added y - | | rewritten(parent) as 48f745db3f53 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) - | | - | x 96b677f01b81 (18) added y - |/ rewritten(content) as b4575ed6fcfc using amend by test (Thu Jan 01 00:00:00 1970 +0000) - | - x fc6ad2bac162 (16) added y - rewritten(content) as 2a9f6ccbdeba using amend by test (Thu Jan 01 00:00:00 1970 +0000) - rewritten(branch, parent) as 96b677f01b81 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) - - -checking that relocated commit is there - $ hg exp 48f745db3f53 --hidden - # HG changeset patch - # User test - # Date 0 0 - # Thu Jan 01 00:00:00 1970 +0000 - # Node ID 48f745db3f5300363ca248b9aeab20ff2a55fbb3 - # Parent b006cf317e0ed16dbe786c439577475580f645f1 - added y - - diff -r b006cf317e0e -r 48f745db3f53 y - --- /dev/null Thu Jan 01 00:00:00 1970 +0000 - +++ b/y Thu Jan 01 00:00:00 1970 +0000 - @@ -0,0 +1,1 @@ - +bar - -Testing when the relocation will result in conflicts and merging wont ----------------------------------------------------------------------- - - $ hg glog - @ 21:7bbcf24ddecf added y - | () [bar] draft - o 15:b006cf317e0e added foo to x - | () [bar] draft - o 10:4ae4427ee9f8 added d - | () [default] draft - o 9:917281f93fcb added c - | () [default] draft - o 8:171614c9a791 added b - | () [default] draft - o 1:c7586e2a9264 added a - | () [default] draft - o 0:8fa14d15e168 added hgignore - () [default] draft - - $ hg up .^^^^ - 0 files updated, 0 files merged, 4 files removed, 0 files unresolved - - $ echo z > z - $ hg ci -Aqm "added z" - $ hg glog -r . - @ 22:daf1de08f3b0 added z - | () [default] draft - ~ - - $ echo foo > y - $ hg add y - $ hg amend - - $ hg up daf1de08f3b0 --hidden - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - updated to hidden changeset daf1de08f3b0 - (hidden revision 'daf1de08f3b0' was rewritten as: 3f7a1f693080) - working directory parent is obsolete! (daf1de08f3b0) - (use 'hg evolve' to update to its successor: 3f7a1f693080) - $ hg rebase -r . -d 7bbcf24ddecf --config experimental.evolution.allowdivergence=True - rebasing 22:daf1de08f3b0 "added z" - 2 new content-divergent changesets - $ echo bar > z - $ hg amend - - $ hg glog - @ 25:53242575ffa9 added z - | () [bar] draft - | * 23:3f7a1f693080 added z - | | () [default] draft - o | 21:7bbcf24ddecf added y - | | () [bar] draft - o | 15:b006cf317e0e added foo to x - | | () [bar] draft - o | 10:4ae4427ee9f8 added d - | | () [default] draft - o | 9:917281f93fcb added c - |/ () [default] draft - o 8:171614c9a791 added b - | () [default] draft - o 1:c7586e2a9264 added a - | () [default] draft - o 0:8fa14d15e168 added hgignore - () [default] draft - - $ hg evolve --content-divergent - merge:[25] added z - with: [23] added z - base: [22] added z - rebasing "other" content-divergent changeset 3f7a1f693080 on 7bbcf24ddecf - merging y - warning: conflicts while merging y! (edit, then use 'hg resolve --mark') - fix conflicts and see `hg help evolve.interrupted` - [1] - - $ hg diff - diff -r 7bbcf24ddecf y - --- a/y Thu Jan 01 00:00:00 1970 +0000 - +++ b/y Thu Jan 01 00:00:00 1970 +0000 - @@ -1,1 +1,5 @@ - +<<<<<<< destination: 7bbcf24ddecf bar - test: added y - watbar - +======= - +foo - +>>>>>>> evolving: 3f7a1f693080 - test: added z - diff -r 7bbcf24ddecf z - --- /dev/null Thu Jan 01 00:00:00 1970 +0000 - +++ b/z Thu Jan 01 00:00:00 1970 +0000 - @@ -0,0 +1,1 @@ - +z - - $ echo foo > y - $ hg resolve -m - (no more unresolved files) - continue: hg evolve --continue - - $ hg evolve --continue - evolving 23:3f7a1f693080 "added z" - updating to "local" side of the conflict: 53242575ffa9 - merging "other" content-divergent changeset 'cdb0643c69fc' - merging y - warning: conflicts while merging y! (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 53242575ffa9 y - --- a/y Thu Jan 01 00:00:00 1970 +0000 - +++ b/y Thu Jan 01 00:00:00 1970 +0000 - @@ -1,1 +1,5 @@ - +<<<<<<< local: 53242575ffa9 bar - test: added z - watbar - +======= - +foo - +>>>>>>> other: cdb0643c69fc - test: added z - - $ echo foo > y - $ hg resolve -m - (no more unresolved files) - continue: hg evolve --continue - $ hg evolve --continue - working directory is now at 6fc7d9682de6 - - $ hg glog - @ 27:6fc7d9682de6 added z - | () [bar] draft - o 21:7bbcf24ddecf added y - | () [bar] draft - o 15:b006cf317e0e added foo to x - | () [bar] draft - o 10:4ae4427ee9f8 added d - | () [default] draft - o 9:917281f93fcb added c - | () [default] draft - o 8:171614c9a791 added b - | () [default] draft - o 1:c7586e2a9264 added a - | () [default] draft - o 0:8fa14d15e168 added hgignore - () [default] draft - - $ hg exp - # HG changeset patch - # User test - # Date 0 0 - # Thu Jan 01 00:00:00 1970 +0000 - # Branch bar - # Node ID 6fc7d9682de6e3bee6c8b1266b756ed7d522b7e4 - # Parent 7bbcf24ddecfe97d7c2ac6fa8c07c155c8fda47b - added z - - diff -r 7bbcf24ddecf -r 6fc7d9682de6 y - --- a/y Thu Jan 01 00:00:00 1970 +0000 - +++ b/y Thu Jan 01 00:00:00 1970 +0000 - @@ -1,1 +1,1 @@ - -watbar - +foo - diff -r 7bbcf24ddecf -r 6fc7d9682de6 z - --- /dev/null Thu Jan 01 00:00:00 1970 +0000 - +++ b/z Thu Jan 01 00:00:00 1970 +0000 - @@ -0,0 +1,1 @@ - +bar - - $ cd .. - -Resolving content-divergence of a stack with same parents ---------------------------------------------------------- - - $ hg init stacktest - $ cd stacktest - $ 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 stack2 - $ cd stack2 - $ hg pull ../stacktest - pulling from ../stacktest - requesting all changes - adding changesets - adding manifests - adding file changes - added 5 changesets with 5 changes to 5 files - new changesets 8fa14d15e168:c41c793e0ef1 - (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 c7586e2a9264 - 2 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ echo bar > a - $ hg amend -m "watbar to a" - 3 new orphan changesets - $ echo wat > a - $ hg amend -m "watbar to a" - $ hg evolve --all - move:[2] added b - atop:[6] watbar to a - move:[3] added c - move:[4] added d - working directory is now at 15c781f93cac - $ hg glog - @ 9:15c781f93cac added d - | () [default] draft - o 8:9e5fb1d5b955 added c - | () [default] draft - o 7:88516dccf68a added b - | () [default] draft - o 6:82b74d5dc678 watbar to a - | () [default] draft - o 0:8fa14d15e168 added hgignore - () [default] draft - - $ cd ../stacktest - $ 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 ../stack2 - pulling from ../stack2 - searching for changes - adding changesets - adding manifests - adding file changes - added 4 changesets with 0 changes to 4 files (+1 heads) - 5 new obsolescence markers - 8 new content-divergent changesets - new changesets 82b74d5dc678:15c781f93cac - (run 'hg heads' to see heads, 'hg merge' to merge) - - $ hg glog - * 12:15c781f93cac added d - | () [default] draft - * 11:9e5fb1d5b955 added c - | () [default] draft - * 10:88516dccf68a added b - | () [default] draft - * 9:82b74d5dc678 watbar to a - | () [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:[5] watbar to a - with: [9] watbar to a - base: [1] added a - updating to "local" side of the conflict: 8e222f257bbf - merging "other" content-divergent changeset '82b74d5dc678' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - 6 new orphan changesets - merge:[6] added b - with: [10] added b - base: [2] added b - updating to "local" side of the conflict: d5f148423c16 - merging "other" content-divergent changeset '88516dccf68a' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - merge:[7] added c - with: [11] added c - base: [3] added c - updating to "local" side of the conflict: 3ce4be6d8e5e - merging "other" content-divergent changeset '9e5fb1d5b955' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - merge:[8] added d - with: [12] added d - base: [4] added d - updating to "local" side of the conflict: c72d2885eb51 - merging "other" content-divergent changeset '15c781f93cac' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - working directory is now at 038fe7db3d88 - - $ hg glog - @ 16:038fe7db3d88 added d - | () [default] draft - o 15:b2cac10f3836 added c - | () [default] draft - o 14:eadfd9d70680 added b - | () [default] draft - o 13:f66f262fff6c watbar to a - | () [default] draft - o 0:8fa14d15e168 added hgignore - () [default] draft diff -r 2cbb9914d227 -r 7a779a288793 tests/test-evolve-content-divergent-basic.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-evolve-content-divergent-basic.t Thu Apr 11 22:41:41 2019 +0200 @@ -0,0 +1,1132 @@ +======================================================= +Tests the resolution of content divergence: basic cases +======================================================= + +This file intend to cover basic case of content divergence. See the other test +file for more advanced cases. + + $ cat >> $HGRCPATH < [alias] + > glog = log -GT "{rev}:{node|short} {desc|firstline}\n ({bookmarks}) [{branch}] {phase}" + > [defaults] + > amend=-d "0 0" + > fold=-d "0 0" + > [web] + > push_ssl = false + > allow_push = * + > [phases] + > publish = False + > [diff] + > git = 1 + > unified = 0 + > [ui] + > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline} [{troubles}]\n + > [extensions] + > EOF + $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH + $ mkcommit() { + > echo "$1" > "$1" + > hg add "$1" + > hg ci -m "add $1" + > } + + $ mkcommits() { + > for i in $@; do mkcommit $i ; done + > } + +Basic test of divergence: two divergent changesets with the same parents +With --all --any we dedupe the divergent and solve the divergence once + + $ hg init test1 + $ cd test1 + $ echo a > a + $ hg ci -Aqm "added a" + $ echo b > b + $ hg ci -Aqm "added b" + $ hg export + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 5f6d8a4bf34ab274ccc9f631c2536964b8a3666d + # Parent 9092f1db7931481f93b37d5c9fbcfc341bcd7318 + added b + + diff --git a/b b/b + new file mode 100644 + --- /dev/null + +++ b/b + @@ -0,0 +1,1 @@ + +b + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo bdivergent > bdivergent1 + $ hg ci -Am "divergent" + adding bdivergent1 + created new head + $ hg export + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 593c57f2117e33dd0884382f02789d948f548557 + # Parent 9092f1db7931481f93b37d5c9fbcfc341bcd7318 + divergent + + diff --git a/bdivergent1 b/bdivergent1 + new file mode 100644 + --- /dev/null + +++ b/bdivergent1 + @@ -0,0 +1,1 @@ + +bdivergent + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo bdivergent > bdivergent2 + $ hg ci -Am "divergent" + adding bdivergent2 + created new head + $ hg export + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 8374d2ddc3a4d48428c3d2f80e4fc86f13736f96 + # Parent 9092f1db7931481f93b37d5c9fbcfc341bcd7318 + divergent + + diff --git a/bdivergent2 b/bdivergent2 + new file mode 100644 + --- /dev/null + +++ b/bdivergent2 + @@ -0,0 +1,1 @@ + +bdivergent + + $ hg prune -s 8374d2ddc3a4 "desc('added b')" + 1 changesets pruned + $ hg prune -s 593c57f2117e "desc('added b')" --hidden + 1 changesets pruned + 2 new content-divergent changesets + + $ hg log -G --patch + @ 3:8374d2ddc3a4@default(draft) divergent [content-divergent] + | diff --git a/bdivergent2 b/bdivergent2 + | new file mode 100644 + | --- /dev/null + | +++ b/bdivergent2 + | @@ -0,0 +1,1 @@ + | +bdivergent + | + | * 2:593c57f2117e@default(draft) divergent [content-divergent] + |/ diff --git a/bdivergent1 b/bdivergent1 + | new file mode 100644 + | --- /dev/null + | +++ b/bdivergent1 + | @@ -0,0 +1,1 @@ + | +bdivergent + | + o 0:9092f1db7931@default(draft) added a [] + diff --git a/a b/a + new file mode 100644 + --- /dev/null + +++ b/a + @@ -0,0 +1,1 @@ + +a + + + $ hg evolve --all --any --content-divergent + merge:[2] divergent + with: [3] divergent + base: [1] added b + updating to "local" side of the conflict: 593c57f2117e + merging "other" content-divergent changeset '8374d2ddc3a4' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 45bf1312f454 + $ hg log -G + @ 4:45bf1312f454@default(draft) divergent [] + | + o 0:9092f1db7931@default(draft) added a [] + + $ hg export + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 45bf1312f45468b76158b33f8426e6530c8b35b1 + # Parent 9092f1db7931481f93b37d5c9fbcfc341bcd7318 + divergent + + diff --git a/bdivergent1 b/bdivergent1 + new file mode 100644 + --- /dev/null + +++ b/bdivergent1 + @@ -0,0 +1,1 @@ + +bdivergent + diff --git a/bdivergent2 b/bdivergent2 + new file mode 100644 + --- /dev/null + +++ b/bdivergent2 + @@ -0,0 +1,1 @@ + +bdivergent + + $ cd .. + +Extra setup +----------- + +(the test below were initially in a different file) + + $ hg init cdiv + $ cd cdiv + $ 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 + +Merging branch difference +------------------------- + +Creating content-divergence with branch change where base, divergent and other +have different branches + + $ hg branch -r . foobar + changed branch on 1 changesets + + $ hg up c41c793e0ef1 --hidden + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + updated to hidden changeset c41c793e0ef1 + (hidden revision 'c41c793e0ef1' was rewritten as: 9e5dffcb3d48) + working directory parent is obsolete! (c41c793e0ef1) + (use 'hg evolve' to update to its successor: 9e5dffcb3d48) + $ echo bar > d + $ hg branch watwat + marked working directory as branch watwat + $ hg amend + 2 new content-divergent changesets + + $ hg glog + @ 6:264b04f771fb added d + | () [watwat] draft + | * 5:9e5dffcb3d48 added d + |/ () [foobar] 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 evolve --content-divergent --config ui.interactive=True< c + > EOF + merge:[6] added d + with: [5] added d + base: [4] added d + merging "other" content-divergent changeset '9e5dffcb3d48' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + content divergent changesets on different branches. + choose branch for the resolution changeset. (a) default or (b) watwat or (c) foobar? c + working directory is now at 0ac42f1bc15c + + $ hg glog + @ 7:0ac42f1bc15c added d + | () [foobar] 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 + +Testing merging of commit messages +----------------------------------- + +When base and one of the divergent has same commit messages and other divergent +has different one + + $ echo wat > d + $ hg amend + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + + $ echo bar > d + $ hg ci -Aqm "added a d with bar in it, expect some beers" + + $ hg prune -r 0ac42f1bc15c -s . --hidden + 1 changesets pruned + 2 new content-divergent changesets + + $ hg glog + @ 9:59081c9c425a added a d with bar in it, expect some beers + | () [default] draft + | * 8:f621d00f5f0e added d + |/ () [foobar] 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 evolve --content-divergent + merge:[9] added a d with bar in it, expect some beers + with: [8] added d + base: [7] added d + merging "other" content-divergent changeset 'f621d00f5f0e' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at a9d6fd6b5e40 + + $ hg glog + @ 10:a9d6fd6b5e40 added a d with bar in it, expect some beers + | () [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 + +When base has different message and both divergents has same one + + $ echo foo > d + $ hg amend -m "foo to d" + + $ hg up a9d6fd6b5e40 --hidden + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + updated to hidden changeset a9d6fd6b5e40 + (hidden revision 'a9d6fd6b5e40' was rewritten as: b10b07a394f1) + working directory parent is obsolete! (a9d6fd6b5e40) + (use 'hg evolve' to update to its successor: b10b07a394f1) + $ echo babar > d + $ hg amend -m "foo to d" + 2 new content-divergent changesets + + $ hg glog + @ 12:0bb497fed24a foo to d + | () [default] draft + | * 11:b10b07a394f1 foo to 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 evolve --content-divergent + merge:[12] foo to d + with: [11] foo to d + base: [10] added a d with bar in it, expect some beers + merging "other" content-divergent changeset 'b10b07a394f1' + 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 foobar > d + $ hg resolve -m + (no more unresolved files) + continue: hg evolve --continue + $ hg evolve --continue + working directory is now at 11175423b5dc + + $ hg glog + @ 13:11175423b5dc foo to 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 + +When all three base, divergent and other has different commit messages creating +conflicts + + $ echo bar > d + $ hg amend -m "bar to d, expect beers" + + $ hg up 11175423b5dc --hidden + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + updated to hidden changeset 11175423b5dc + (hidden revision '11175423b5dc' was rewritten as: 27f0463f169a) + working directory parent is obsolete! (11175423b5dc) + (use 'hg evolve' to update to its successor: 27f0463f169a) + $ echo wat > d + $ hg amend -m "wat to d, wat?" + 2 new content-divergent changesets + + $ hg glog + @ 15:f542037ddf31 wat to d, wat? + | () [default] draft + | * 14:27f0463f169a bar to d, expect beers + |/ () [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 evolve --content-divergent + merge:[15] wat to d, wat? + with: [14] bar to d, expect beers + base: [13] foo to d + merging "other" content-divergent changeset '27f0463f169a' + 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 watbar > d + $ hg resolve -m + (no more unresolved files) + continue: hg evolve --continue + + $ cat > editor.sh < #!/bin/sh + > printf "**showing editors text**\n\n" + > cat \$1 + > printf "\n**done showing editors text**\n\n" + > cat > \$1 < watbar to d + > ENDOF + > EOF + + $ HGEDITOR='sh ./editor.sh' hg evolve --continue + **showing editors text** + + HG: Conflicts while merging changeset description of content-divergent changesets. + HG: Resolve conflicts in commit messages to continue. + + <<<<<<< divergent + wat to d, wat?||||||| base + foo to d======= + bar to d, expect beers>>>>>>> other + + **done showing editors text** + + working directory is now at 89ea3eee2d69 + + $ hg glog + @ 16:89ea3eee2d69 watbar to 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 .. + +Stabilize content-divergent changesets with same parent +======================================================= + + + $ glog() { + > hg log -G --template \ + > '{rev}:{node|short}@{branch}({phase}) bk:[{bookmarks}] {desc|firstline}\n' "$@" + > } + + $ hg init content-divergent-savanna + $ cd content-divergent-savanna + $ echo a > a + $ hg add a + $ hg ci -m 'root' + $ hg phase --public . + $ cat << EOF >> a + > flore + > arthur + > zephir + > some + > less + > conflict + > EOF + $ hg ci -m 'More addition' + $ glog + @ 1:867e43582046@default(draft) bk:[] More addition + | + o 0:6569b5a81c7e@default(public) bk:[] root + + $ echo 'babar' >> a + $ hg amend + $ hg up --hidden 'min(desc("More addition"))' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + updated to hidden changeset 867e43582046 + (hidden revision '867e43582046' was rewritten as: fc6349f931da) + working directory parent is obsolete! (867e43582046) + (use 'hg evolve' to update to its successor: fc6349f931da) + $ mv a a.old + $ echo 'jungle' > a + $ cat a.old >> a + $ rm a.old + $ hg amend + 2 new content-divergent changesets + $ glog + @ 3:051337a45e7c@default(draft) bk:[] More addition + | + | * 2:fc6349f931da@default(draft) bk:[] More addition + |/ + o 0:6569b5a81c7e@default(public) bk:[] root + + +Stabilize it + + $ hg evolve -qn --confirm --content-divergent + merge:[3] More addition + with: [2] More addition + base: [1] More addition + perform evolve? [Ny] n + abort: evolve aborted by user + [255] + $ echo y | hg evolve -qn --confirm --config ui.interactive=True --content-divergent + merge:[3] More addition + with: [2] More addition + base: [1] More addition + perform evolve? [Ny] y + hg update -c 051337a45e7c && + hg merge fc6349f931da && + hg commit -m "auto merge resolving conflict between 051337a45e7c and fc6349f931da"&& + hg up -C 867e43582046 && + hg revert --all --rev tip && + hg commit -m "`hg log -r 051337a45e7c --template={desc}`"; + $ hg evolve -v --content-divergent + merge:[3] More addition + with: [2] More addition + base: [1] More addition + merging "other" content-divergent changeset 'fc6349f931da' + resolving manifests + merging a + 0 files updated, 1 files merged, 0 files removed, 0 files unresolved + committing files: + a + committing manifest + committing changelog + working directory is now at 5bf84d1d71d1 + $ hg st + $ glog + @ 4:5bf84d1d71d1@default(draft) bk:[] More addition + | + o 0:6569b5a81c7e@default(public) bk:[] root + + $ hg summary + parent: 4:5bf84d1d71d1 tip + More addition + branch: default + commit: (clean) + update: (current) + phases: 1 draft + $ hg export . --config diff.unified=3 + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 5bf84d1d71d12f451bfe1e09b93045eb6338cd6c + # Parent 6569b5a81c7e307ddc076550e8c0f6d75b6effcd + More addition + + diff --git a/a b/a + --- a/a + +++ b/a + @@ -1,1 +1,9 @@ + +jungle + a + +flore + +arthur + +zephir + +some + +less + +conflict + +babar + +Check conflict during content-divergence resolution +--------------------------------------------------- + + + $ hg up --hidden 'min(desc("More addition"))' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + updated to hidden changeset 867e43582046 + (hidden revision '867e43582046' was rewritten as: 5bf84d1d71d1) + working directory parent is obsolete! (867e43582046) + (use 'hg evolve' to update to its successor: 5bf84d1d71d1) + $ echo 'gotta break' >> a + $ hg amend + 2 new content-divergent changesets + +# reamend so that the case is not the first precursor. + + $ hg amend -m "More addition (2)" + $ hg phase 'contentdivergent()' + 4: draft + 6: draft + + $ glog + @ 6:13c1b75640a1@default(draft) bk:[] More addition (2) + | + | * 4:5bf84d1d71d1@default(draft) bk:[] More addition + |/ + o 0:6569b5a81c7e@default(public) bk:[] root + + + $ hg evolve -qn --content-divergent + hg update -c 13c1b75640a1 && + hg merge 5bf84d1d71d1 && + hg commit -m "auto merge resolving conflict between 13c1b75640a1 and 5bf84d1d71d1"&& + hg up -C 867e43582046 && + hg revert --all --rev tip && + hg commit -m "`hg log -r 13c1b75640a1 --template={desc}`"; + $ hg evolve --content-divergent + merge:[6] More addition (2) + with: [4] More addition + base: [1] More addition + merging "other" content-divergent changeset '5bf84d1d71d1' + merging a + warning: conflicts while merging a! (edit, then use 'hg resolve --mark') + 0 files updated, 0 files merged, 0 files removed, 1 files unresolved + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ cat > a < jungle + > a + > flore + > arthur + > zephir + > some + > less + > conflict + > babar + > EOF + + $ hg resolve -m + (no more unresolved files) + continue: hg evolve --continue + $ hg evolve --continue + working directory is now at 2346e1147fed + $ glog + @ 7:2346e1147fed@default(draft) bk:[] More addition (2) + | + o 0:6569b5a81c7e@default(public) bk:[] root + + $ hg exp --config diff.unified=3 + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 2346e1147fedc8c9aa17f9ba7870dcd8be52f567 + # Parent 6569b5a81c7e307ddc076550e8c0f6d75b6effcd + More addition (2) + + diff --git a/a b/a + --- a/a + +++ b/a + @@ -1,1 +1,9 @@ + +jungle + a + +flore + +arthur + +zephir + +some + +less + +conflict + +babar + $ cd .. + +Check case where one side undo some of the common predecessors change +--------------------------------------------------------------------- + +The goal is to make sure we merge using the right base. + + $ hg init predecessors-as-merge-base + $ cd predecessors-as-merge-base + $ cat << EOF > numbers + > 1 + > 2 + > 3 + > 4 + > 5 + > 6 + > 7 + > 8 + > 9 + > EOF + $ cat << EOF > letters + > a + > b + > c + > d + > e + > f + > g + > h + > i + > EOF + $ cat << EOF > romans + > I + > II + > III + > IV + > V + > VI + > VII + > VIII + > IX + > EOF + $ hg add numbers letters romans + $ hg commit -m root + $ cat << EOF > numbers + > 1 + > 2 + > 3 + > four + > 5 + > 6 + > 7 + > 8 + > 9 + > EOF + $ cat << EOF > letters + > a + > b + > c + > D + > e + > f + > g + > h + > i + > EOF + $ hg commit -m E1 + $ cat << EOF > numbers + > 1 + > 2 + > 3 + > 4 + > 5 + > 6 + > seven + > 8 + > 9 + > EOF + $ cat << EOF > romans + > I + > II + > III + > IV + > V + > vi + > VII + > VIII + > IX + > EOF + $ hg commit --amend -m E2 + $ hg --hidden update -r 'desc(E1)' + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + updated to hidden changeset 4a250e5bd992 + (hidden revision '4a250e5bd992' was rewritten as: 084ae625fa51) + working directory parent is obsolete! (4a250e5bd992) + (use 'hg evolve' to update to its successor: 084ae625fa51) + $ cat << EOF > numbers + > one + > 2 + > 3 + > four + > 5 + > 6 + > 7 + > 8 + > 9 + > EOF + $ cat << EOF > letters + > a + > b + > c + > d + > e + > f + > g + > h + > i + > EOF + $ cat << EOF > romans + > I + > ii + > III + > IV + > V + > VI + > VII + > VIII + > IX + > EOF + $ hg commit --amend -m E3 + 2 new content-divergent changesets + $ hg log -G --patch --hidden + @ 3:19ed1bf64a2c@default(draft) E3 [content-divergent] + | diff --git a/numbers b/numbers + | --- a/numbers + | +++ b/numbers + | @@ -1,1 +1,1 @@ + | -1 + | +one + | @@ -4,1 +4,1 @@ + | -4 + | +four + | diff --git a/romans b/romans + | --- a/romans + | +++ b/romans + | @@ -2,1 +2,1 @@ + | -II + | +ii + | + | * 2:084ae625fa51@default(draft) E2 [content-divergent] + |/ diff --git a/letters b/letters + | --- a/letters + | +++ b/letters + | @@ -4,1 +4,1 @@ + | -d + | +D + | diff --git a/numbers b/numbers + | --- a/numbers + | +++ b/numbers + | @@ -7,1 +7,1 @@ + | -7 + | +seven + | diff --git a/romans b/romans + | --- a/romans + | +++ b/romans + | @@ -6,1 +6,1 @@ + | -VI + | +vi + | + | x 1:4a250e5bd992@default(draft) E1 [] + |/ diff --git a/letters b/letters + | --- a/letters + | +++ b/letters + | @@ -4,1 +4,1 @@ + | -d + | +D + | diff --git a/numbers b/numbers + | --- a/numbers + | +++ b/numbers + | @@ -4,1 +4,1 @@ + | -4 + | +four + | + o 0:6d1fdf6de7e2@default(draft) root [] + diff --git a/letters b/letters + new file mode 100644 + --- /dev/null + +++ b/letters + @@ -0,0 +1,9 @@ + +a + +b + +c + +d + +e + +f + +g + +h + +i + diff --git a/numbers b/numbers + new file mode 100644 + --- /dev/null + +++ b/numbers + @@ -0,0 +1,9 @@ + +1 + +2 + +3 + +4 + +5 + +6 + +7 + +8 + +9 + diff --git a/romans b/romans + new file mode 100644 + --- /dev/null + +++ b/romans + @@ -0,0 +1,9 @@ + +I + +II + +III + +IV + +V + +VI + +VII + +VIII + +IX + + $ hg evolve --list + 084ae625fa51: E2 + content-divergent: 19ed1bf64a2c (draft) (precursor 4a250e5bd992) + + 19ed1bf64a2c: E3 + content-divergent: 084ae625fa51 (draft) (precursor 4a250e5bd992) + + $ hg obslog --all --patch + * 084ae625fa51 (2) E2 + | + | @ 19ed1bf64a2c (3) E3 + |/ + x 4a250e5bd992 (1) E1 + rewritten(description, content) as 084ae625fa51 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + diff -r 4a250e5bd992 -r 084ae625fa51 changeset-description + --- a/changeset-description + +++ b/changeset-description + @@ -1,1 +1,1 @@ + -E1 + +E2 + + diff --git a/numbers b/numbers + --- a/numbers + +++ b/numbers + @@ -4,1 +4,1 @@ + -four + +4 + @@ -7,1 +7,1 @@ + -7 + +seven + diff --git a/romans b/romans + --- a/romans + +++ b/romans + @@ -6,1 +6,1 @@ + -VI + +vi + + rewritten(description, content) as 19ed1bf64a2c using amend by test (Thu Jan 01 00:00:00 1970 +0000) + diff -r 4a250e5bd992 -r 19ed1bf64a2c changeset-description + --- a/changeset-description + +++ b/changeset-description + @@ -1,1 +1,1 @@ + -E1 + +E3 + + diff --git a/letters b/letters + --- a/letters + +++ b/letters + @@ -4,1 +4,1 @@ + -D + +d + diff --git a/numbers b/numbers + --- a/numbers + +++ b/numbers + @@ -1,1 +1,1 @@ + -1 + +one + diff --git a/romans b/romans + --- a/romans + +++ b/romans + @@ -2,1 +2,1 @@ + -II + +ii + + + + $ hg evolve --content-divergent --rev 'desc("E3")' + merge:[2] E2 + with: [3] E3 + base: [1] E1 + updating to "local" side of the conflict: 084ae625fa51 + merging "other" content-divergent changeset '19ed1bf64a2c' + merging numbers + merging romans + 1 files updated, 2 files merged, 0 files removed, 0 files unresolved + working directory is now at aae293050980 + $ hg status + $ hg amend -m 'E4' + $ hg export + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 8c2a6aae4bc5c1cc00c68276017dcef3d468e895 + # Parent 6d1fdf6de7e2d9fc9b098aa286b60785bbeaab7a + E4 + + diff --git a/numbers b/numbers + --- a/numbers + +++ b/numbers + @@ -1,1 +1,1 @@ + -1 + +one + @@ -7,1 +7,1 @@ + -7 + +seven + diff --git a/romans b/romans + --- a/romans + +++ b/romans + @@ -2,1 +2,1 @@ + -II + +ii + @@ -6,1 +6,1 @@ + -VI + +vi + $ hg log -G + @ 5:8c2a6aae4bc5@default(draft) E4 [] + | + o 0:6d1fdf6de7e2@default(draft) root [] + + $ hg obslog --patch + @ 8c2a6aae4bc5 (5) E4 + | + x aae293050980 (4) <<<<<<< divergent + |\ rewritten(description) as 8c2a6aae4bc5 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | | diff -r aae293050980 -r 8c2a6aae4bc5 changeset-description + | | --- a/changeset-description + | | +++ b/changeset-description + | | @@ -1,4 +1,1 @@ + | | -<<<<<<< divergent + | | -E2||||||| base + | | -E1======= + | | -E3>>>>>>> other + | | +E4 + | | + | | + x | 084ae625fa51 (2) E2 + | | rewritten(description, content) as aae293050980 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | diff -r 084ae625fa51 -r aae293050980 changeset-description + | | --- a/changeset-description + | | +++ b/changeset-description + | | @@ -1,1 +1,4 @@ + | | -E2 + | | +<<<<<<< divergent + | | +E2||||||| base + | | +E1======= + | | +E3>>>>>>> other + | | + | | diff --git a/letters b/letters + | | --- a/letters + | | +++ b/letters + | | @@ -4,1 +4,1 @@ + | | -D + | | +d + | | diff --git a/numbers b/numbers + | | --- a/numbers + | | +++ b/numbers + | | @@ -1,1 +1,1 @@ + | | -1 + | | +one + | | diff --git a/romans b/romans + | | --- a/romans + | | +++ b/romans + | | @@ -2,1 +2,1 @@ + | | -II + | | +ii + | | + | | + | x 19ed1bf64a2c (3) E3 + |/ rewritten(description, content) as aae293050980 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | diff -r 19ed1bf64a2c -r aae293050980 changeset-description + | --- a/changeset-description + | +++ b/changeset-description + | @@ -1,1 +1,4 @@ + | -E3 + | +<<<<<<< divergent + | +E2||||||| base + | +E1======= + | +E3>>>>>>> other + | + | diff --git a/numbers b/numbers + | --- a/numbers + | +++ b/numbers + | @@ -4,1 +4,1 @@ + | -four + | +4 + | @@ -7,1 +7,1 @@ + | -7 + | +seven + | diff --git a/romans b/romans + | --- a/romans + | +++ b/romans + | @@ -6,1 +6,1 @@ + | -VI + | +vi + | + | + x 4a250e5bd992 (1) E1 + rewritten(description, content) as 084ae625fa51 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + diff -r 4a250e5bd992 -r 084ae625fa51 changeset-description + --- a/changeset-description + +++ b/changeset-description + @@ -1,1 +1,1 @@ + -E1 + +E2 + + diff --git a/numbers b/numbers + --- a/numbers + +++ b/numbers + @@ -4,1 +4,1 @@ + -four + +4 + @@ -7,1 +7,1 @@ + -7 + +seven + diff --git a/romans b/romans + --- a/romans + +++ b/romans + @@ -6,1 +6,1 @@ + -VI + +vi + + rewritten(description, content) as 19ed1bf64a2c using amend by test (Thu Jan 01 00:00:00 1970 +0000) + diff -r 4a250e5bd992 -r 19ed1bf64a2c changeset-description + --- a/changeset-description + +++ b/changeset-description + @@ -1,1 +1,1 @@ + -E1 + +E3 + + diff --git a/letters b/letters + --- a/letters + +++ b/letters + @@ -4,1 +4,1 @@ + -D + +d + diff --git a/numbers b/numbers + --- a/numbers + +++ b/numbers + @@ -1,1 +1,1 @@ + -1 + +one + diff --git a/romans b/romans + --- a/romans + +++ b/romans + @@ -2,1 +2,1 @@ + -II + +ii + + diff -r 2cbb9914d227 -r 7a779a288793 tests/test-evolve-content-divergent-corner-cases.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-evolve-content-divergent-corner-cases.t Thu Apr 11 22:41:41 2019 +0200 @@ -0,0 +1,385 @@ +======================================================== +Tests the resolution of content divergence: corner cases +======================================================== + +This file intend to cover cases that are specific enough to not fit in the +other cases. + + $ cat >> $HGRCPATH < [alias] + > glog = log -GT "{rev}:{node|short} {desc|firstline}\n ({bookmarks}) [{branch}] {phase}" + > [defaults] + > amend=-d "0 0" + > fold=-d "0 0" + > [web] + > push_ssl = false + > allow_push = * + > [phases] + > publish = False + > [diff] + > git = 1 + > unified = 0 + > [ui] + > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline} [{troubles}]\n + > [extensions] + > EOF + $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH + $ mkcommit() { + > echo "$1" > "$1" + > hg add "$1" + > hg ci -m "add $1" + > } + + $ mkcommits() { + > for i in $@; do mkcommit $i ; done + > } + +Basic test of divergence: two divergent changesets with the same parents +With --all --any we dedupe the divergent and solve the divergence once + + $ hg init test1 + $ cd test1 + $ echo a > a + $ hg ci -Aqm "added a" + $ echo b > b + $ hg ci -Aqm "added b" + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo bdivergent > bdivergent1 + $ hg ci -Am "divergent" + adding bdivergent1 + created new head + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo bdivergent > bdivergent2 + $ hg ci -Am "divergent" + adding bdivergent2 + created new head + + $ hg prune -s 8374d2ddc3a4 "desc('added b')" + 1 changesets pruned + $ hg prune -s 593c57f2117e "desc('added b')" --hidden + 1 changesets pruned + 2 new content-divergent changesets + + $ hg log -G + @ 3:8374d2ddc3a4@default(draft) divergent [content-divergent] + | + | * 2:593c57f2117e@default(draft) divergent [content-divergent] + |/ + o 0:9092f1db7931@default(draft) added a [] + + + $ hg evolve --all --any --content-divergent + merge:[2] divergent + with: [3] divergent + base: [1] added b + updating to "local" side of the conflict: 593c57f2117e + merging "other" content-divergent changeset '8374d2ddc3a4' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 45bf1312f454 + $ hg log -G + @ 4:45bf1312f454@default(draft) divergent [] + | + o 0:9092f1db7931@default(draft) added a [] + +Test divergence resolution when it yields to an empty commit (issue4950) +cdivergent2 contains the same content than cdivergent1 and they are divergent +versions of the revision _c + + $ hg up .^ + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ mkcommit _c + created new head + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ mkcommit cdivergent1 + created new head + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo "cdivergent1" > cdivergent1 + $ hg add cdivergent1 + $ hg ci -m "add _c" + created new head + + $ hg log -G + @ 7:b2ae71172042@default(draft) add _c [] + | + | o 6:e3ff64ce8d4c@default(draft) add cdivergent1 [] + |/ + | o 5:48819a835615@default(draft) add _c [] + |/ + | o 4:45bf1312f454@default(draft) divergent [] + |/ + o 0:9092f1db7931@default(draft) added a [] + + + $ hg prune -s b2ae71172042 48819a835615 + 1 changesets pruned + $ hg prune -s e3ff64ce8d4c 48819a835615 --hidden + 1 changesets pruned + 2 new content-divergent changesets + + $ hg log -G + @ 7:b2ae71172042@default(draft) add _c [content-divergent] + | + | * 6:e3ff64ce8d4c@default(draft) add cdivergent1 [content-divergent] + |/ + | o 4:45bf1312f454@default(draft) divergent [] + |/ + o 0:9092f1db7931@default(draft) added a [] + + $ hg evolve --all --any --content-divergent + merge:[6] add cdivergent1 + with: [7] add _c + base: [5] add _c + updating to "local" side of the conflict: e3ff64ce8d4c + merging "other" content-divergent changeset 'b2ae71172042' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + nothing changed + working directory is now at e3ff64ce8d4c + + $ cd .. + +Test None docstring issue of evolve divergent, which caused hg crush + + $ hg init test2 + $ cd test2 + $ mkcommits _a _b + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo bdivergent > bdivergent11 + $ hg ci -Am "bdivergent" + adding bdivergent11 + created new head + + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo bdivergent > bdivergent22 + $ hg ci -Am "bdivergent" + adding bdivergent22 + created new head + + $ hg log -G + @ 3:6b096fb45070@default(draft) bdivergent [] + | + | o 2:05a6b6a9e633@default(draft) bdivergent [] + |/ + | o 1:37445b16603b@default(draft) add _b [] + |/ + o 0:135f39f4bd78@default(draft) add _a [] + + + $ hg prune -s 6b096fb45070 37445b16603b + 1 changesets pruned + $ hg prune -s 05a6b6a9e633 37445b16603b --hidden + 1 changesets pruned + 2 new content-divergent changesets + $ hg log -G + @ 3:6b096fb45070@default(draft) bdivergent [content-divergent] + | + | * 2:05a6b6a9e633@default(draft) bdivergent [content-divergent] + |/ + o 0:135f39f4bd78@default(draft) add _a [] + + + $ cat >$TESTTMP/test_extension.py << EOF + > from mercurial import merge + > origupdate = merge.update + > def newupdate(*args, **kwargs): + > return origupdate(*args, **kwargs) + > merge.update = newupdate + > EOF + $ cat >> $HGRCPATH << EOF + > [extensions] + > testextension=$TESTTMP/test_extension.py + > EOF + $ hg evolve --all + nothing to evolve on current working copy parent + (do you want to use --content-divergent) + [2] + $ hg evolve --content-divergent + merge:[3] bdivergent + with: [2] bdivergent + base: [1] add _b + merging "other" content-divergent changeset '05a6b6a9e633' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 73ff357d3975 + + $ cd .. + +Test to make sure that evolve don't fall into unrecoverable state (issue6053) +------------------------------------------------------------------------------ + +It happened when two divergent csets has different parent (need relocation) +and resolution parent is obsolete. So this issue triggered when during +relocation we hit conflicts. So lets make the repo as described. + + $ hg init localside + $ cd localside + $ for ch in a b c d e; do + > echo $ch > $ch; + > hg add $ch; + > hg ci -m "added "$ch; + > done; + + $ hg glog + @ 4:8d71eadcc9df added e + | () [default] draft + o 3:9150fe93bec6 added d + | () [default] draft + o 2:155349b645be added c + | () [default] draft + o 1:5f6d8a4bf34a added b + | () [default] draft + o 0:9092f1db7931 added a + () [default] draft + + $ echo ee > e + $ hg amend -m "updated e" + $ hg up 1 -q + +To make sure we hit conflict while relocating + $ echo dd > d + $ echo ee > e + $ hg add d e + $ hg ci -m "updated e" + created new head + +Lets create divergence + $ hg prune 4 -s . --hidden + 1 changesets pruned + 2 new content-divergent changesets + +Making obsolete resolution parent + $ hg prune 3 + 1 changesets pruned + 1 new orphan changesets + + $ hg glog + @ 6:de4ea3103326 updated e + | () [default] draft + | * 5:ff6f7cd76a7c updated e + | | () [default] draft + | x 3:9150fe93bec6 added d + | | () [default] draft + | o 2:155349b645be added c + |/ () [default] draft + o 1:5f6d8a4bf34a added b + | () [default] draft + o 0:9092f1db7931 added a + () [default] draft + + $ hg evolve --content-divergent --any + merge:[5] updated e + with: [6] updated e + base: [4] added e + rebasing "other" content-divergent changeset de4ea3103326 on 9150fe93bec6 + merging d + warning: conflicts while merging d! (edit, then use 'hg resolve --mark') + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ hg diff --no-git --config diff.unified=3 + diff -r 9150fe93bec6 d + --- a/d Thu Jan 01 00:00:00 1970 +0000 + +++ b/d Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,5 @@ + +<<<<<<< destination: 9150fe93bec6 - test: added d + d + +======= + +dd + +>>>>>>> evolving: de4ea3103326 - test: updated e + diff -r 9150fe93bec6 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 @@ + +ee + + $ echo dresolved > d + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + + $ hg evolve --continue + evolving 6:de4ea3103326 "updated e" + updating to "local" side of the conflict: ff6f7cd76a7c + merging "other" content-divergent changeset 'e504bd82de7e' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 83b1664a580f + + $ hg glog -l1 + @ 8:83b1664a580f updated e + | () [default] draft + ~ + + $ cd .. + +Check that canceling of file deletion are merge correctly +--------------------------------------------------------- + +File addition/deletion tend to have special processing. So we better test them directory + + $ hg init non-public + $ cd non-public + $ echo a > a + $ echo b > b + $ echo c > c + $ echo d > d + $ hg ci -Aqm initial + +oops, we meant to delete just 'a', but we deleted 'b' and 'c' too + + $ hg rm a b c + $ hg ci -m 'delete a' + $ hg revert -r .^ b + $ hg amend + +create some content divergence + + $ hg co dff6e52f5e41 --hidden + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + updated to hidden changeset dff6e52f5e41 + (hidden revision 'dff6e52f5e41' was rewritten as: 0825dcee2670) + working directory parent is obsolete! (dff6e52f5e41) + (use 'hg evolve' to update to its successor: 0825dcee2670) + $ hg revert -r .^ c + $ hg amend + 2 new content-divergent changesets + $ hg glog --hidden + @ 3:92ecd58f9b05 delete a + | () [default] draft + | * 2:0825dcee2670 delete a + |/ () [default] draft + | x 1:dff6e52f5e41 delete a + |/ () [default] draft + o 0:75d2b02c4a5c initial + () [default] draft + +Resolve the divergence, only "a" should be removed + + $ hg evolve --content-divergent + merge:[3] delete a + with: [2] delete a + base: [1] delete a + merging "other" content-divergent changeset '0825dcee2670' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 7ca6a9fafcf6 + $ hg glog + @ 4:7ca6a9fafcf6 delete a + | () [default] draft + o 0:75d2b02c4a5c initial + () [default] draft + + $ hg diff --change . + diff --git a/a b/a + deleted file mode 100644 + --- a/a + +++ /dev/null + @@ -1,1 +0,0 @@ + -a diff -r 2cbb9914d227 -r 7a779a288793 tests/test-evolve-content-divergent-interrupted.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-evolve-content-divergent-interrupted.t Thu Apr 11 22:41:41 2019 +0200 @@ -0,0 +1,598 @@ +======================================================= +Tests the resolution of content divergence: interrupted +======================================================= + +This file intend to cover case where evolve has to be interrupted. + +This test aims at gather test case for --abort, --continue and --stop + + +Tests for the --abort flag for `hg evolve` command while content-divergence resolution +====================================================================================== + +The `--abort` flag aborts the interrupted evolve by undoing all the work which +was done during resolution i.e. stripping new changesets created, moving +bookmarks back, moving working directory back. + +This test contains cases when `hg evolve` is doing content-divergence resolution. + +Setup +===== + + $ cat >> $HGRCPATH < [phases] + > publish = False + > [alias] + > glog = log -GT "{rev}:{node|short} {desc}\n ({bookmarks}) {phase}" + > [extensions] + > EOF + $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH + + $ hg init abortrepo + $ cd abortrepo + $ 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 + | () draft + o 3:ca1b80f7960a added c + | () draft + o 2:b1661037fa25 added b + | () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + +Creating content divergence, resolution of which will lead to conflicts +----------------------------------------------------------------------- + + $ echo bar > d + $ hg amend + + $ hg up c41c793e0ef1 --hidden + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + updated to hidden changeset c41c793e0ef1 + (hidden revision 'c41c793e0ef1' was rewritten as: e49523854bc8) + working directory parent is obsolete! (c41c793e0ef1) + (use 'hg evolve' to update to its successor: e49523854bc8) + + $ echo foobar > d + $ hg amend + 2 new content-divergent changesets + $ hg glog --hidden + @ 6:9c1631e352d9 added d + | () draft + | * 5:e49523854bc8 added d + |/ () draft + | x 4:c41c793e0ef1 added d + |/ () draft + o 3:ca1b80f7960a added c + | () draft + o 2:b1661037fa25 added b + | () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + + $ hg evolve --content-divergent + merge:[6] added d + with: [5] added d + base: [4] added d + merging "other" content-divergent changeset 'e49523854bc8' + 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] + + $ hg status -v + M d + # The repository is in an unfinished *evolve* state. + + # Unresolved merge conflicts: + # + # d + # + # To mark files as resolved: hg resolve --mark FILE + + # To continue: hg evolve --continue + # To abort: hg evolve --abort + # To stop: hg evolve --stop + # (also see `hg help evolve.interrupted`) + + $ hg parents + changeset: 6:9c1631e352d9 + tag: tip + parent: 3:ca1b80f7960a + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + instability: content-divergent + summary: added d + + changeset: 5:e49523854bc8 + parent: 3:ca1b80f7960a + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + instability: content-divergent + summary: added d + + + $ hg evolve --abort + evolve aborted + working directory is now at 9c1631e352d9 + + $ hg glog --hidden + @ 6:9c1631e352d9 added d + | () draft + | * 5:e49523854bc8 added d + |/ () draft + | x 4:c41c793e0ef1 added d + |/ () draft + o 3:ca1b80f7960a added c + | () draft + o 2:b1661037fa25 added b + | () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + +Creating multiple content-divergence where resolution of last one results in +conflicts and resolution of first one resulted in no new commit +----------------------------------------------------------------------------- + + $ echo watbar > d + $ hg amend + $ hg up .^ + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo bar > c + $ hg amend + 2 new orphan changesets + $ hg up ca1b80f7960a --hidden + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory parent is obsolete! (ca1b80f7960a) + (use 'hg evolve' to update to its successor: 2ba73e31f264) + $ echo foobar > c + $ hg amend + 2 new content-divergent changesets + $ echo bar > c + $ hg amend + + $ hg glog --hidden + @ 10:491e10505bae added c + | () draft + | x 9:7398f702a162 added c + |/ () draft + | * 8:2ba73e31f264 added c + |/ () draft + | * 7:f0f1694f123e added d + | | () draft + | | x 6:9c1631e352d9 added d + | |/ () draft + | | * 5:e49523854bc8 added d + | |/ () draft + | | x 4:c41c793e0ef1 added d + | |/ () draft + | x 3:ca1b80f7960a added c + |/ () draft + o 2:b1661037fa25 added b + | () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + + $ hg evolve --all --content-divergent + merge:[8] added c + with: [10] added c + base: [3] added c + updating to "local" side of the conflict: 2ba73e31f264 + merging "other" content-divergent changeset '491e10505bae' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + merge:[5] added d + with: [7] added d + base: [4] added d + updating to "local" side of the conflict: e49523854bc8 + merging "other" content-divergent changeset 'f0f1694f123e' + 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] + + $ hg evolve --abort + 2 new content-divergent changesets + evolve aborted + working directory is now at 491e10505bae + + $ hg glog --hidden + @ 10:491e10505bae added c + | () draft + | x 9:7398f702a162 added c + |/ () draft + | * 8:2ba73e31f264 added c + |/ () draft + | * 7:f0f1694f123e added d + | | () draft + | | x 6:9c1631e352d9 added d + | |/ () draft + | | * 5:e49523854bc8 added d + | |/ () draft + | | x 4:c41c793e0ef1 added d + | |/ () draft + | x 3:ca1b80f7960a added c + |/ () draft + o 2:b1661037fa25 added b + | () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + + $ hg obslog -r . --all + * 2ba73e31f264 (8) added c + | + | @ 491e10505bae (10) added c + | | + | x 7398f702a162 (9) added c + |/ rewritten(content) as 491e10505bae using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | + x ca1b80f7960a (3) added c + rewritten(content) as 2ba73e31f264 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + rewritten(content) as 7398f702a162 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + + $ cd .. + +Creating content-divergence on multiple parents when gca of divergent changesets +is parent of one of the divergents and relocating leads to conflicts +--------------------------------------------------------------------------------- + + $ hg init multiparent + $ cd multiparent + $ 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 + | () draft + o 3:ca1b80f7960a added c + | () draft + o 2:b1661037fa25 added b + | () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + + $ hg rebase -r . -d .^^^ --config extensions.rebase= + rebasing 4:c41c793e0ef1 "added d" (tip) + $ echo bar > c + $ hg add c + $ hg amend + + $ hg up --hidden c41c793e0ef1 + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + updated to hidden changeset c41c793e0ef1 + (hidden revision 'c41c793e0ef1' was rewritten as: 69bdd23a9b0d) + working directory parent is obsolete! (c41c793e0ef1) + (use 'hg evolve' to update to its successor: 69bdd23a9b0d) + $ echo bar > d + $ hg amend + 2 new content-divergent changesets + + $ hg glog + @ 7:e49523854bc8 added d + | () draft + | * 6:69bdd23a9b0d added d + | | () draft + o | 3:ca1b80f7960a added c + | | () draft + o | 2:b1661037fa25 added b + |/ () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + + $ hg evolve --content-divergent + merge:[7] added d + with: [6] added d + base: [4] added d + rebasing "other" content-divergent changeset 69bdd23a9b0d on ca1b80f7960a + merging c + warning: conflicts while merging c! (edit, then use 'hg resolve --mark') + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ hg evolve --abort + evolve aborted + working directory is now at e49523854bc8 + + $ hg glog + @ 7:e49523854bc8 added d + | () draft + | * 6:69bdd23a9b0d added d + | | () draft + o | 3:ca1b80f7960a added c + | | () draft + o | 2:b1661037fa25 added b + |/ () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + +Creating content-divergence on multiple parents when gca of divergent changesets +is parent of one of the divergents and merging divergent leads to conflicts +--------------------------------------------------------------------------------- + + $ hg up 69bdd23a9b0d + 2 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg rm c + $ echo wat > d + $ hg amend + + $ hg glog + @ 8:33e4442acf98 added d + | () draft + | * 7:e49523854bc8 added d + | | () draft + | o 3:ca1b80f7960a added c + | | () draft + | o 2:b1661037fa25 added b + |/ () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + + $ hg evolve --content-divergent + merge:[7] added d + with: [8] added d + base: [4] added d + rebasing "other" content-divergent changeset 33e4442acf98 on ca1b80f7960a + updating to "local" side of the conflict: e49523854bc8 + merging "other" content-divergent changeset 'a663d1567f0b' + 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] + + $ hg evolve --abort + evolve aborted + working directory is now at 33e4442acf98 + + $ hg glog + @ 8:33e4442acf98 added d + | () draft + | * 7:e49523854bc8 added d + | | () draft + | o 3:ca1b80f7960a added c + | | () draft + | o 2:b1661037fa25 added b + |/ () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + $ cd .. + +Tests for the --stop flag for `hg evolve` command while resolving content-divergence +================================================================================== + +The `--stop` flag stops the interrupted evolution and delete the state file so +user can do other things and comeback and do evolution later on + +This is testing cases when `hg evolve` command is doing content-divergence resolution. + +Setup +===== + + $ hg init stoprepo + $ cd stoprepo + $ 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 + | () draft + o 3:ca1b80f7960a added c + | () draft + o 2:b1661037fa25 added b + | () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + +Creating content divergence, resolution of which will lead to conflicts +----------------------------------------------------------------------- + + $ echo bar > d + $ hg amend + + $ hg up c41c793e0ef1 --hidden + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + updated to hidden changeset c41c793e0ef1 + (hidden revision 'c41c793e0ef1' was rewritten as: e49523854bc8) + working directory parent is obsolete! (c41c793e0ef1) + (use 'hg evolve' to update to its successor: e49523854bc8) + + $ echo foobar > d + $ hg amend + 2 new content-divergent changesets + $ hg glog --hidden + @ 6:9c1631e352d9 added d + | () draft + | * 5:e49523854bc8 added d + |/ () draft + | x 4:c41c793e0ef1 added d + |/ () draft + o 3:ca1b80f7960a added c + | () draft + o 2:b1661037fa25 added b + | () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + + $ hg evolve --content-divergent + merge:[6] added d + with: [5] added d + base: [4] added d + merging "other" content-divergent changeset 'e49523854bc8' + 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] + + $ hg evolve --stop + stopped the interrupted evolve + working directory is now at 9c1631e352d9 + + $ hg glog --hidden + @ 6:9c1631e352d9 added d + | () draft + | * 5:e49523854bc8 added d + |/ () draft + | x 4:c41c793e0ef1 added d + |/ () draft + o 3:ca1b80f7960a added c + | () draft + o 2:b1661037fa25 added b + | () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + +Content divergence with parent change which will result in conflicts while +merging +--------------------------------------------------------------------------- + + $ hg rebase -r . -d .^^^ --config extensions.rebase= + rebasing 6:9c1631e352d9 "added d" (tip) + + $ hg glog + @ 7:517d4375cb72 added d + | () draft + | * 5:e49523854bc8 added d + | | () draft + | o 3:ca1b80f7960a added c + | | () draft + | o 2:b1661037fa25 added b + |/ () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + + $ hg evolve --content-divergent + merge:[5] added d + with: [7] added d + base: [4] added d + rebasing "other" content-divergent changeset 517d4375cb72 on ca1b80f7960a + updating to "local" side of the conflict: e49523854bc8 + merging "other" content-divergent changeset '606ad96040fc' + 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] + + $ hg evolve --stop + stopped the interrupted evolve + working directory is now at 517d4375cb72 + + $ hg glog + @ 7:517d4375cb72 added d + | () draft + | * 5:e49523854bc8 added d + | | () draft + | o 3:ca1b80f7960a added c + | | () draft + | o 2:b1661037fa25 added b + |/ () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + +Content-divergence with parent-change which will result in conflicts while +relocation +--------------------------------------------------------------------------- + + $ echo babar > c + $ hg add c + $ hg amend + $ hg glog + @ 8:8fd1c4bd144c added d + | () draft + | * 5:e49523854bc8 added d + | | () draft + | o 3:ca1b80f7960a added c + | | () draft + | o 2:b1661037fa25 added b + |/ () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + + $ hg evolve --content-divergent + merge:[5] added d + with: [8] added d + base: [4] added d + rebasing "other" content-divergent changeset 8fd1c4bd144c on ca1b80f7960a + 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 ca1b80f7960a 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: ca1b80f7960a - test: added c + foo + +======= + +babar + +>>>>>>> evolving: 8fd1c4bd144c - test: added d + diff -r ca1b80f7960a 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 @@ + +foobar + + $ hg evolve --stop + stopped the interrupted evolve + working directory is now at ca1b80f7960a + +XXX: we should have preserved the wdir to be at rev 8 + $ hg glog + * 8:8fd1c4bd144c added d + | () draft + | * 5:e49523854bc8 added d + | | () draft + | @ 3:ca1b80f7960a added c + | | () draft + | o 2:b1661037fa25 added b + |/ () draft + o 1:c7586e2a9264 added a + | () draft + o 0:8fa14d15e168 added hgignore + () draft + $ cd .. diff -r 2cbb9914d227 -r 7a779a288793 tests/test-evolve-content-divergent-meta.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-evolve-content-divergent-meta.t Thu Apr 11 22:41:41 2019 +0200 @@ -0,0 +1,102 @@ ++==================================================== ++Tests the resolution of content divergence: metadata ++==================================================== + +This file intend to cover cases focused around meta data merging. + +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 + +Check we preserve the author properly +------------------------------------- + +Testing issue6113 to make sure that content-divergence resolution don't +replace initial author with the user running the resolution command: + + $ hg init userfoo + $ cd userfoo + $ unset HGUSER + $ echo "[ui]" >> ./.hg/hgrc + $ echo "username = foo " >> ./.hg/hgrc + $ for ch in a b c; do + > echo $ch > $ch; + > hg add $ch; + > hg ci -m "added "$ch; + > done; + + $ cd .. + $ hg init userbar + $ cd userbar + $ unset HGUSER + $ echo "[ui]" >> ./.hg/hgrc + $ echo "username = bar " >> ./.hg/hgrc + $ hg pull ./../userfoo -q + + $ cd ../userfoo + $ hg up -r "desc('added b')" + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo c > c + $ echo e > e + $ hg add c e + $ hg ci -m "added c e" + created new head + + $ hg up -r "desc('added b')" + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo cc > c + $ hg add c + $ hg ci -m "added c" + created new head + + $ hg prune -r "min(desc('added c'))" -s "desc('added c e')" + 1 changesets pruned + $ hg prune -r "min(desc('added c'))" -s "max(desc('added c'))" --hidden + 1 changesets pruned + 2 new content-divergent changesets + + $ hg glog + @ 4:6c06cda6dc99 added c + | draft content-divergent + | + | * 3:0c9267e23c9d added c e + |/ draft content-divergent + | + o 1:1740ad2a1eda added b + | draft + | + o 0:f863f39764c4 added a + draft + + + $ cd ../userbar + $ hg pull ./../userfoo -q + 2 new content-divergent changesets + + $ hg evolve --content-divergent --any + merge:[3] added c e + with: [4] added c + base: [2] added c + updating to "local" side of the conflict: 0c9267e23c9d + merging "other" content-divergent changeset '6c06cda6dc99' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 443bd2972210 + +Make sure resultant cset don't replace the initial user with user running the command: + $ hg log -r tip + changeset: 5:443bd2972210 + tag: tip + parent: 1:1740ad2a1eda + user: foo + date: Thu Jan 01 00:00:00 1970 +0000 + summary: added c e + diff -r 2cbb9914d227 -r 7a779a288793 tests/test-evolve-content-divergent-relocation.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-evolve-content-divergent-relocation.t Thu Apr 11 22:41:41 2019 +0200 @@ -0,0 +1,493 @@ +====================================================== +Tests the resolution of content divergence: relocation +====================================================== + +This file intend to cover case where changesets need to be moved to different parents + + $ cat >> $HGRCPATH < [alias] + > glog = log -GT "{rev}:{node|short} {desc|firstline}\n ({bookmarks}) [{branch}] {phase}" + > [phases] + > publish = False + > [extensions] + > rebase = + > EOF + $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH + + +Testing resolution of content-divergent changesets when they are on different +parents and resolution and relocation wont result in conflicts +------------------------------------------------------------------------------ + + $ hg init multiparents + $ cd multiparents + $ 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 + + $ hg up .^^ + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo bar > b + $ hg amend + 2 new orphan changesets + + $ hg rebase -r b1661037fa25 -d 8fa14d15e168 --hidden --config experimental.evolution.allowdivergence=True + rebasing 2:b1661037fa25 "added b" + 2 new content-divergent changesets + + $ hg glog + * 6:da4b96f4a8d6 added b + | () [default] draft + | @ 5:7ed0642d644b added b + | | () [default] draft + | | * 4:c41c793e0ef1 added d + | | | () [default] draft + | | * 3:ca1b80f7960a added c + | | | () [default] draft + | | x 2:b1661037fa25 added b + | |/ () [default] draft + | o 1:c7586e2a9264 added a + |/ () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ hg evolve --content-divergent + merge:[5] added b + with: [6] added b + base: [2] added b + rebasing "other" content-divergent changeset da4b96f4a8d6 on c7586e2a9264 + updating to "local" side of the conflict: 7ed0642d644b + merging "other" content-divergent changeset '11f849d7159f' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 171614c9a791 + + $ hg glog + @ 8:171614c9a791 added b + | () [default] draft + | * 4:c41c793e0ef1 added d + | | () [default] draft + | * 3:ca1b80f7960a added c + | | () [default] draft + | x 2:b1661037fa25 added b + |/ () [default] draft + o 1:c7586e2a9264 added a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ hg exp + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 171614c9a7914c53f531373b95632323fdbbac8d + # Parent c7586e2a92645e473645847a7b69a6dc52be4276 + added b + + diff -r c7586e2a9264 -r 171614c9a791 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 @@ + +bar + +Resolving orphans to get back to a normal graph + + $ hg evolve --all + move:[3] added c + atop:[8] added b + move:[4] added d + working directory is now at 4ae4427ee9f8 + $ hg glog + @ 10:4ae4427ee9f8 added d + | () [default] draft + o 9:917281f93fcb added c + | () [default] draft + o 8:171614c9a791 added b + | () [default] draft + o 1:c7586e2a9264 added a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + +More testing! + + $ hg up .^^ + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo x > x + $ hg ci -Aqm "added x" + $ hg glog -r . + @ 11:71a392c714b5 added x + | () [default] draft + ~ + + $ echo foo > x + $ hg branch bar + marked working directory as branch bar + (branches are permanent and global, did you want a bookmark?) + $ hg amend -m "added foo to x" + + $ hg up 71a392c714b5 --hidden + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + updated to hidden changeset 71a392c714b5 + (hidden revision '71a392c714b5' was rewritten as: 1e1a50385a7d) + working directory parent is obsolete! (71a392c714b5) + (use 'hg evolve' to update to its successor: 1e1a50385a7d) + $ hg rebase -r . -d 4ae4427ee9f8 --config experimental.evolution.allowdivergence=True + rebasing 11:71a392c714b5 "added x" + 2 new content-divergent changesets + + $ hg glog + @ 13:1e4f6b3bb39b added x + | () [default] draft + | * 12:1e1a50385a7d added foo to x + | | () [bar] draft + o | 10:4ae4427ee9f8 added d + | | () [default] draft + o | 9:917281f93fcb added c + |/ () [default] draft + o 8:171614c9a791 added b + | () [default] draft + o 1:c7586e2a9264 added a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ hg evolve --content-divergent + merge:[13] added x + with: [12] added foo to x + base: [11] added x + rebasing "other" content-divergent changeset 1e1a50385a7d on 4ae4427ee9f8 + updating to "local" side of the conflict: 1e4f6b3bb39b + merging "other" content-divergent changeset '80cc9b1ec650' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at b006cf317e0e + + $ hg exp + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Branch bar + # Node ID b006cf317e0ed16dbe786c439577475580f645f1 + # Parent 4ae4427ee9f8f0935211fd66360948b77ab5aee9 + added foo to x + + diff -r 4ae4427ee9f8 -r b006cf317e0e x + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/x Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +foo + +The above `hg exp` and the following log call demonstrates that message, content +and branch change is preserved in case of relocation + $ hg glog + @ 15:b006cf317e0e added foo to x + | () [bar] draft + o 10:4ae4427ee9f8 added d + | () [default] draft + o 9:917281f93fcb added c + | () [default] draft + o 8:171614c9a791 added b + | () [default] draft + o 1:c7586e2a9264 added a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + +Testing when both the content-divergence are on different parents and resolution +will lead to conflicts +--------------------------------------------------------------------------------- + + $ hg up .^^^ + 0 files updated, 0 files merged, 3 files removed, 0 files unresolved + + $ echo y > y + $ hg ci -Aqm "added y" + $ hg glog -r . + @ 16:fc6ad2bac162 added y + | () [default] draft + ~ + + $ echo bar > y + $ hg amend + + $ hg up fc6ad2bac162 --hidden + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + updated to hidden changeset fc6ad2bac162 + (hidden revision 'fc6ad2bac162' was rewritten as: 2a9f6ccbdeba) + working directory parent is obsolete! (fc6ad2bac162) + (use 'hg evolve' to update to its successor: 2a9f6ccbdeba) + $ hg rebase -r . -d b006cf317e0e --config experimental.evolution.allowdivergence=True + rebasing 16:fc6ad2bac162 "added y" + 2 new content-divergent changesets + $ echo wat > y + $ hg amend + + $ hg glog + @ 19:b4575ed6fcfc added y + | () [bar] draft + | * 17:2a9f6ccbdeba added y + | | () [default] draft + o | 15:b006cf317e0e added foo to x + | | () [bar] draft + o | 10:4ae4427ee9f8 added d + | | () [default] draft + o | 9:917281f93fcb added c + |/ () [default] draft + o 8:171614c9a791 added b + | () [default] draft + o 1:c7586e2a9264 added a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ hg evolve --content-divergent + merge:[19] added y + with: [17] added y + base: [16] added y + rebasing "other" content-divergent changeset 2a9f6ccbdeba on b006cf317e0e + updating to "local" side of the conflict: b4575ed6fcfc + merging "other" content-divergent changeset '48f745db3f53' + merging y + warning: conflicts while merging y! (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 watbar > y + $ hg resolve -m + (no more unresolved files) + continue: hg evolve --continue + $ hg evolve --continue + working directory is now at 7bbcf24ddecf + + $ hg glog + @ 21:7bbcf24ddecf added y + | () [bar] draft + o 15:b006cf317e0e added foo to x + | () [bar] draft + o 10:4ae4427ee9f8 added d + | () [default] draft + o 9:917281f93fcb added c + | () [default] draft + o 8:171614c9a791 added b + | () [default] draft + o 1:c7586e2a9264 added a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ hg obslog -r . --all + @ 7bbcf24ddecf (21) added y + |\ + x | 48f745db3f53 (20) added y + | | rewritten(branch, content) as 7bbcf24ddecf using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | + | x b4575ed6fcfc (19) added y + | | rewritten(content) as 7bbcf24ddecf using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | + x | 2a9f6ccbdeba (17) added y + | | rewritten(parent) as 48f745db3f53 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | + | x 96b677f01b81 (18) added y + |/ rewritten(content) as b4575ed6fcfc using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | + x fc6ad2bac162 (16) added y + rewritten(content) as 2a9f6ccbdeba using amend by test (Thu Jan 01 00:00:00 1970 +0000) + rewritten(branch, parent) as 96b677f01b81 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + + +checking that relocated commit is there + $ hg exp 48f745db3f53 --hidden + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 48f745db3f5300363ca248b9aeab20ff2a55fbb3 + # Parent b006cf317e0ed16dbe786c439577475580f645f1 + added y + + diff -r b006cf317e0e -r 48f745db3f53 y + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/y Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +bar + +Testing when the relocation will result in conflicts and merging also: +---------------------------------------------------------------------- + + $ hg glog + @ 21:7bbcf24ddecf added y + | () [bar] draft + o 15:b006cf317e0e added foo to x + | () [bar] draft + o 10:4ae4427ee9f8 added d + | () [default] draft + o 9:917281f93fcb added c + | () [default] draft + o 8:171614c9a791 added b + | () [default] draft + o 1:c7586e2a9264 added a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ hg up .^^^^ + 0 files updated, 0 files merged, 4 files removed, 0 files unresolved + + $ echo z > z + $ hg ci -Aqm "added z" + $ hg glog -r . + @ 22:daf1de08f3b0 added z + | () [default] draft + ~ + + $ echo foo > y + $ hg add y + $ hg amend + + $ hg up daf1de08f3b0 --hidden + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + updated to hidden changeset daf1de08f3b0 + (hidden revision 'daf1de08f3b0' was rewritten as: 3f7a1f693080) + working directory parent is obsolete! (daf1de08f3b0) + (use 'hg evolve' to update to its successor: 3f7a1f693080) + $ hg rebase -r . -d 7bbcf24ddecf --config experimental.evolution.allowdivergence=True + rebasing 22:daf1de08f3b0 "added z" + 2 new content-divergent changesets + $ echo bar > z + $ hg amend + + $ hg glog + @ 25:53242575ffa9 added z + | () [bar] draft + | * 23:3f7a1f693080 added z + | | () [default] draft + o | 21:7bbcf24ddecf added y + | | () [bar] draft + o | 15:b006cf317e0e added foo to x + | | () [bar] draft + o | 10:4ae4427ee9f8 added d + | | () [default] draft + o | 9:917281f93fcb added c + |/ () [default] draft + o 8:171614c9a791 added b + | () [default] draft + o 1:c7586e2a9264 added a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ hg evolve --content-divergent --any + merge:[25] added z + with: [23] added z + base: [22] added z + rebasing "other" content-divergent changeset 3f7a1f693080 on 7bbcf24ddecf + merging y + warning: conflicts while merging y! (edit, then use 'hg resolve --mark') + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ hg diff + diff -r 7bbcf24ddecf y + --- a/y Thu Jan 01 00:00:00 1970 +0000 + +++ b/y Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,5 @@ + +<<<<<<< destination: 7bbcf24ddecf bar - test: added y + watbar + +======= + +foo + +>>>>>>> evolving: 3f7a1f693080 - test: added z + diff -r 7bbcf24ddecf z + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/z Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +z + + $ echo foo > y + $ hg resolve -m + (no more unresolved files) + continue: hg evolve --continue + + $ hg evolve --continue + evolving 23:3f7a1f693080 "added z" + updating to "local" side of the conflict: 53242575ffa9 + merging "other" content-divergent changeset 'cdb0643c69fc' + merging y + warning: conflicts while merging y! (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 53242575ffa9 y + --- a/y Thu Jan 01 00:00:00 1970 +0000 + +++ b/y Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,5 @@ + +<<<<<<< local: 53242575ffa9 bar - test: added z + watbar + +======= + +foo + +>>>>>>> other: cdb0643c69fc - test: added z + + $ echo foo > y + $ hg resolve -m + (no more unresolved files) + continue: hg evolve --continue + $ hg evolve --continue + working directory is now at 6fc7d9682de6 + + $ hg glog + @ 27:6fc7d9682de6 added z + | () [bar] draft + o 21:7bbcf24ddecf added y + | () [bar] draft + o 15:b006cf317e0e added foo to x + | () [bar] draft + o 10:4ae4427ee9f8 added d + | () [default] draft + o 9:917281f93fcb added c + | () [default] draft + o 8:171614c9a791 added b + | () [default] draft + o 1:c7586e2a9264 added a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ hg exp + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Branch bar + # Node ID 6fc7d9682de6e3bee6c8b1266b756ed7d522b7e4 + # Parent 7bbcf24ddecfe97d7c2ac6fa8c07c155c8fda47b + added z + + diff -r 7bbcf24ddecf -r 6fc7d9682de6 y + --- a/y Thu Jan 01 00:00:00 1970 +0000 + +++ b/y Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,1 @@ + -watbar + +foo + diff -r 7bbcf24ddecf -r 6fc7d9682de6 z + --- /dev/null Thu Jan 01 00:00:00 1970 +0000 + +++ b/z Thu Jan 01 00:00:00 1970 +0000 + @@ -0,0 +1,1 @@ + +bar + + $ cd .. diff -r 2cbb9914d227 -r 7a779a288793 tests/test-evolve-content-divergent-stack.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-evolve-content-divergent-stack.t Thu Apr 11 22:41:41 2019 +0200 @@ -0,0 +1,366 @@ +================================================= +Tests the resolution of content divergence: stack +================================================= + +This file intend to cover case with stacks of divergent changesets + + $ cat >> $HGRCPATH < [alias] + > glog = log -GT "{rev}:{node|short} {desc|firstline}\n ({bookmarks}) [{branch}] {phase}" + > [phases] + > publish = False + > [extensions] + > rebase = + > EOF + $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH + +Resolving content-divergence of a stack with same parents +--------------------------------------------------------- + + $ hg init stacktest + $ cd stacktest + $ 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 stack2 + $ cd stack2 + $ hg pull ../stacktest + pulling from ../stacktest + requesting all changes + adding changesets + adding manifests + adding file changes + added 5 changesets with 5 changes to 5 files + new changesets 8fa14d15e168:c41c793e0ef1 + (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 c7586e2a9264 + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo bar > a + $ hg amend -m "watbar to a" + 3 new orphan changesets + $ echo wat > a + $ hg amend -m "watbar to a" + $ hg evolve --all + move:[2] added b + atop:[6] watbar to a + move:[3] added c + move:[4] added d + working directory is now at 15c781f93cac + $ hg glog + @ 9:15c781f93cac added d + | () [default] draft + o 8:9e5fb1d5b955 added c + | () [default] draft + o 7:88516dccf68a added b + | () [default] draft + o 6:82b74d5dc678 watbar to a + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + + $ cd ../stacktest + $ 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 ../stack2 + pulling from ../stack2 + searching for changes + adding changesets + adding manifests + adding file changes + added 4 changesets with 0 changes to 4 files (+1 heads) + 5 new obsolescence markers + 8 new content-divergent changesets + new changesets 82b74d5dc678:15c781f93cac + (run 'hg heads' to see heads, 'hg merge' to merge) + + $ hg glog + * 12:15c781f93cac added d + | () [default] draft + * 11:9e5fb1d5b955 added c + | () [default] draft + * 10:88516dccf68a added b + | () [default] draft + * 9:82b74d5dc678 watbar to a + | () [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:[5] watbar to a + with: [9] watbar to a + base: [1] added a + updating to "local" side of the conflict: 8e222f257bbf + merging "other" content-divergent changeset '82b74d5dc678' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + 6 new orphan changesets + merge:[6] added b + with: [10] added b + base: [2] added b + updating to "local" side of the conflict: d5f148423c16 + merging "other" content-divergent changeset '88516dccf68a' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + merge:[7] added c + with: [11] added c + base: [3] added c + updating to "local" side of the conflict: 3ce4be6d8e5e + merging "other" content-divergent changeset '9e5fb1d5b955' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + merge:[8] added d + with: [12] added d + base: [4] added d + updating to "local" side of the conflict: c72d2885eb51 + merging "other" content-divergent changeset '15c781f93cac' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 038fe7db3d88 + + $ hg glog + @ 16:038fe7db3d88 added d + | () [default] draft + o 15:b2cac10f3836 added c + | () [default] draft + o 14:eadfd9d70680 added b + | () [default] draft + o 13:f66f262fff6c watbar to a + | () [default] draft + 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 + (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 + (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 + $ cd .. diff -r 2cbb9914d227 -r 7a779a288793 tests/test-evolve-continue.t --- a/tests/test-evolve-continue.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-evolve-continue.t Thu Apr 11 22:41:41 2019 +0200 @@ -31,7 +31,7 @@ o 0:8fa14d15e168 added hgignore () draft -Simple case of evolve --continue +Simple case of evolve --continue (with --[no-]update flag) $ hg up ca1b80f7960a 0 files updated, 0 files merged, 1 files removed, 0 files unresolved @@ -53,7 +53,7 @@ o 0:8fa14d15e168 added hgignore () draft - $ hg evolve --all + $ hg evolve --all --no-update move:[4] added d atop:[5] added c merging d @@ -68,12 +68,12 @@ $ hg evolve --continue evolving 4:c41c793e0ef1 "added d" - working directory is now at 2a4e03d422e2 + working directory is now at cb6a2ab625bb $ hg glog - @ 6:2a4e03d422e2 added d + o 6:2a4e03d422e2 added d | () draft - o 5:cb6a2ab625bb added c + @ 5:cb6a2ab625bb added c | () draft o 2:b1661037fa25 added b | () draft @@ -82,6 +82,9 @@ o 0:8fa14d15e168 added hgignore () draft + $ hg up + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + Case when conflicts resolution lead to empty wdir in evolve --continue $ echo foo > e @@ -127,6 +130,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 @@ -306,8 +310,6 @@ (no more unresolved files) continue: hg evolve --continue -XXX: this should have asked for confirmation - $ hg evolve --continue< y > EOF @@ -356,3 +358,71 @@ continue: hg evolve --continue $ hg evolve --continue evolving 22:d2c94a8f44bd "added g" + +Testing that interrupted evolve don't get confused about copies (issue5930): +---------------------------------------------------------------------------- + + $ cd .. + $ hg init issue5930 + $ cd issue5930 + $ echo a > a + $ hg ci -Am "added a" + adding a + $ hg cp a b + $ hg ci -m "rename a to b" + + $ hg up 0 -q + $ echo c > c + $ hg ci -Am "added c" + adding c + created new head + + $ echo d > c + $ echo d > d + $ hg ci -Am "added d, modified c" + adding d + $ hg up .^ + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + + $ hg log -G -T "{rev} {desc}\n" + o 3 added d, modified c + | + @ 2 added c + | + | o 1 rename a to b + |/ + o 0 added a + + $ hg rebase -r . -d 1 + rebasing 2:29edef26570b "added c" + 1 new orphan changesets + $ echo conflict > c + $ hg amend + + $ hg log -G -T "{rev} {desc}\n" + @ 5 added c + | + | * 3 added d, modified c + | | + | x 2 added c + | | + o | 1 rename a to b + |/ + o 0 added a + + + $ hg evolve + move:[3] added d, modified c + atop:[5] added c + merging c + warning: conflicts while merging c! (edit, then use 'hg resolve --mark') + fix conflicts and see `hg help evolve.interrupted` + [1] + +Status mentions file 'b' (copied from 'a') here, even though it wasn't +affected by the evolved changeset (nor was 'a') + + $ hg st -C + M c + A d + ? c.orig diff -r 2cbb9914d227 -r 7a779a288793 tests/test-evolve-issue5832.t --- a/tests/test-evolve-issue5832.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-evolve-issue5832.t Thu Apr 11 22:41:41 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 2cbb9914d227 -r 7a779a288793 tests/test-evolve-list.t --- a/tests/test-evolve-list.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-evolve-list.t Thu Apr 11 22:41:41 2019 +0200 @@ -5,7 +5,7 @@ > EOF $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH -Test the instability listing +Test listing orphan changesets $ hg init r2 $ cd r2 $ echo a > a && hg ci -Am a @@ -27,7 +27,7 @@ $ cd .. -Test the bumpedness listing +Test listing phase-divergent changesets $ hg init r3 $ cd r3 $ echo a > a && hg ci -Am a @@ -41,7 +41,7 @@ $ cd .. -Test the divergence listing +Test listing content-divergent changesets $ hg init r1 $ cd r1 $ echo a > a && hg ci -Am a diff -r 2cbb9914d227 -r 7a779a288793 tests/test-evolve-obshistory-lots-of-splits.t --- a/tests/test-evolve-obshistory-lots-of-splits.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-evolve-obshistory-lots-of-splits.t Thu Apr 11 22:41:41 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 2cbb9914d227 -r 7a779a288793 tests/test-evolve-obshistory-split.t --- a/tests/test-evolve-obshistory-split.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-evolve-obshistory-split.t Thu Apr 11 22:41:41 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 2cbb9914d227 -r 7a779a288793 tests/test-evolve-order.t --- a/tests/test-evolve-order.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-evolve-order.t Thu Apr 11 22:41:41 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 2cbb9914d227 -r 7a779a288793 tests/test-evolve-orphan-split.t --- a/tests/test-evolve-orphan-split.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-evolve-orphan-split.t Thu Apr 11 22:41:41 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 2cbb9914d227 -r 7a779a288793 tests/test-evolve-phase-divergence.t --- a/tests/test-evolve-phase-divergence.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-evolve-phase-divergence.t Thu Apr 11 22:41:41 2019 +0200 @@ -1,11 +1,15 @@ ** Test for handling of phase divergent changesets by `hg evolve` ** ==================================================================== + $ . $TESTDIR/testlib/common.sh + $ cat >> $HGRCPATH < [alias] > glog = log -GT "{rev}:{node|short} {desc|firstline}\n ({bookmarks}) {phase}" > [extensions] > rebase = + > [extensions] + > evolve = > EOF Setting up a public repo @@ -28,11 +32,11 @@ 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] - > evolve = $evolvepath > [ui] > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline}\n > [phases] @@ -45,6 +49,13 @@ $ 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 + +Simple phase-divergence case +============================ Creating a phase-divergence changeset ------------------------------------- @@ -52,8 +63,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 +95,7 @@ $ hg glog o 1:4d1169d82e47 modify a | () draft - o 0:d3873e73d99e init + @ 0:d3873e73d99e init () public $ hg push ../public @@ -100,7 +109,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 +202,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 @@ -225,9 +233,11 @@ 2 new obsolescence markers [1] +phase-divergence that lead to new commit and bookmark movement +============================================================== + Creating more phase-divergence where a new resolution commit will be formed and also testing bookmark movement --------------------------------------------------------------------------------- Alice created a commit and push to private non-publishing repo @@ -308,7 +318,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 @@ -386,11 +395,14 @@ added 1 changesets with 1 changes to 1 files 2 new obsolescence markers + +phase divergence rebasing back to old changeset - with (unrelated?) conflict +============================================================================ + Creating a phasedivergence changeset where the divergent changeset changed in a way that we rebase that on old public changeset, there will be conflicts, but the `hg evolve` command handles it very well and uses `hg revert` logic to prevent any conflicts -------------------------------------------------------------------------------- Alice creates one more changeset and pushes to private repo @@ -459,7 +471,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 @@ -515,9 +526,11 @@ added 1 changesets with 1 changes to 1 files 2 new obsolescence markers +different parents for successors and predecessors +================================================= + Creating phase-divergence with divergent changeset and precursor having different parents ------------------------------------------------------------------------ Alice creates a changeset and pushes to private repo @@ -596,8 +609,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 @@ -643,9 +655,11 @@ @@ -0,0 +1,1 @@ +x -Creating divergence with parent and content change both but not resulting in +divergence with parent+content change both, no conflict +======================================================= + +Creating divergence with parent cand content change both but not resulting in conflicts ------------------------------------------------------------------------------ Alice is tired of pushing and pulling and will create phase-divergence locally @@ -715,7 +729,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 @@ -757,9 +770,11 @@ o 0:d3873e73d99e init () public +divergence with parent+content change both, with conflict +========================================================= + Creating divergence with parent and content change both which results in conflicts while rebasing on parent ------------------------------------------------------------------------------ $ echo l > l $ hg ci -Aqm "added l to l" @@ -819,7 +834,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 +930,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 +944,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 topological branches +====================================================================== + + $ cd ../split-across-branches $ echo p > p $ echo q > q @@ -1059,177 +1086,870 @@ $ 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 -Testing the evolution of a phase-divergent merge with no conflicts ------------------------------------------------------------------- +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 glog -r 154b0179fb9b:: - @ 36:605c306d4f87 phase-divergent update to 8a70f55b2af3: + $ 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 - | 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 - ~ + | 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 +================================================================== + + $ 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 + +Check we preserve "cancelation" of changes +========================================== + +This tests case where the phase divergence changesets cancelled some of the +change made by the public predecessors. The cancellation of these changes need +to be preserved. + + $ hg init cancelled-changes + $ cd cancelled-changes + $ cat << EOF > numbers + > 1 + > 2 + > 3 + > 4 + > 5 + > 6 + > 7 + > 8 + > 9 + > EOF + $ cat << EOF > letters + > a + > b + > c + > d + > e + > f + > g + > h + > i + > EOF + $ cat << EOF > romans + > I + > II + > III + > IV + > V + > VI + > VII + > VIII + > IX + > EOF + $ hg add numbers letters romans + $ hg commit -m root + $ cat << EOF > numbers + > 1 + > 2 + > 3 + > four + > 5 + > 6 + > 7 + > 8 + > nine + > EOF + $ cat << EOF > letters + > a + > b + > c + > D + > e + > f + > g + > h + > i + > EOF + $ hg commit -m E1 + $ cat << EOF > numbers + > 1 + > 2 + > 3 + > 4 + > 5 + > 6 + > seven + > 8 + > nine + > EOF + $ cat << EOF > letters + > a + > b + > c + > d + > e + > f + > g + > h + > i + > EOF + $ cat << EOF > romans + > I + > ii + > III + > IV + > V + > VI + > VII + > VIII + > IX + > EOF + $ hg commit --amend -m E2 + $ hg --hidden phase --public --rev 'desc(E1)' + 1 new phase-divergent changesets + $ hg log -G --patch --hidden --rev 'not desc("root")' + @ changeset: 2:599454370881 + | tag: tip + ~ parent: 0:6d1fdf6de7e2 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + instability: phase-divergent + summary: E2 + + diff -r 6d1fdf6de7e2 -r 599454370881 numbers + --- a/numbers Thu Jan 01 00:00:00 1970 +0000 + +++ b/numbers Thu Jan 01 00:00:00 1970 +0000 + @@ -4,6 +4,6 @@ + 4 + 5 + 6 + -7 + +seven + 8 + -9 + +nine + diff -r 6d1fdf6de7e2 -r 599454370881 romans + --- a/romans Thu Jan 01 00:00:00 1970 +0000 + +++ b/romans Thu Jan 01 00:00:00 1970 +0000 + @@ -1,5 +1,5 @@ + I + -II + +ii + III + IV + V + + o changeset: 1:3074c7249d20 + | user: test + ~ date: Thu Jan 01 00:00:00 1970 +0000 + summary: E1 + + diff -r 6d1fdf6de7e2 -r 3074c7249d20 letters + --- a/letters Thu Jan 01 00:00:00 1970 +0000 + +++ b/letters Thu Jan 01 00:00:00 1970 +0000 + @@ -1,7 +1,7 @@ + a + b + c + -d + +D + e + f + g + diff -r 6d1fdf6de7e2 -r 3074c7249d20 numbers + --- a/numbers Thu Jan 01 00:00:00 1970 +0000 + +++ b/numbers Thu Jan 01 00:00:00 1970 +0000 + @@ -1,9 +1,9 @@ + 1 + 2 + 3 + -4 + +four + 5 + 6 + 7 + 8 + -9 + +nine + + $ hg evolve --list + 599454370881: E2 + phase-divergent: 3074c7249d20 (immutable precursor) + + $ hg obslog --all --patch + @ 599454370881 (2) E2 + | + o 3074c7249d20 (1) E1 + rewritten(description, content) as 599454370881 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + diff -r 3074c7249d20 -r 599454370881 changeset-description + --- a/changeset-description + +++ b/changeset-description + @@ -1,1 +1,1 @@ + -E1 + +E2 + + diff -r 3074c7249d20 -r 599454370881 letters + --- a/letters Thu Jan 01 00:00:00 1970 +0000 + +++ b/letters Thu Jan 01 00:00:00 1970 +0000 + @@ -1,7 +1,7 @@ + a + b + c + -D + +d + e + f + g + diff -r 3074c7249d20 -r 599454370881 numbers + --- a/numbers Thu Jan 01 00:00:00 1970 +0000 + +++ b/numbers Thu Jan 01 00:00:00 1970 +0000 + @@ -1,9 +1,9 @@ + 1 + 2 + 3 + -four + +4 + 5 + 6 + -7 + +seven + 8 + nine + diff -r 3074c7249d20 -r 599454370881 romans + --- a/romans Thu Jan 01 00:00:00 1970 +0000 + +++ b/romans Thu Jan 01 00:00:00 1970 +0000 + @@ -1,5 +1,5 @@ + I + -II + +ii + III + IV + V + + + + $ hg evolve --phase-divergent --rev 'desc("E2")' + recreate:[2] E2 + atop:[1] E1 + committed as 9eebcb77a7e2 + working directory is now at 9eebcb77a7e2 + $ hg export + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 9eebcb77a7e2b240cb7dce095bbe608b5de91cc8 + # Parent 3074c7249d2023b1fff891591d7e609695cd09c2 + phase-divergent update to 3074c7249d20: + + E2 + + diff -r 3074c7249d20 -r 9eebcb77a7e2 letters + --- a/letters Thu Jan 01 00:00:00 1970 +0000 + +++ b/letters Thu Jan 01 00:00:00 1970 +0000 + @@ -1,7 +1,7 @@ + a + b + c + -D + +d + e + f + g + diff -r 3074c7249d20 -r 9eebcb77a7e2 numbers + --- a/numbers Thu Jan 01 00:00:00 1970 +0000 + +++ b/numbers Thu Jan 01 00:00:00 1970 +0000 + @@ -1,9 +1,9 @@ + 1 + 2 + 3 + -four + +4 + 5 + 6 + -7 + +seven + 8 + nine + diff -r 3074c7249d20 -r 9eebcb77a7e2 romans + --- a/romans Thu Jan 01 00:00:00 1970 +0000 + +++ b/romans Thu Jan 01 00:00:00 1970 +0000 + @@ -1,5 +1,5 @@ + I + -II + +ii + III + IV + V + $ hg log -G --patch --rev 'not desc("root")' + @ changeset: 3:9eebcb77a7e2 + | tag: tip + | parent: 1:3074c7249d20 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: phase-divergent update to 3074c7249d20: + | + | diff -r 3074c7249d20 -r 9eebcb77a7e2 letters + | --- a/letters Thu Jan 01 00:00:00 1970 +0000 + | +++ b/letters Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,7 +1,7 @@ + | a + | b + | c + | -D + | +d + | e + | f + | g + | diff -r 3074c7249d20 -r 9eebcb77a7e2 numbers + | --- a/numbers Thu Jan 01 00:00:00 1970 +0000 + | +++ b/numbers Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,9 +1,9 @@ + | 1 + | 2 + | 3 + | -four + | +4 + | 5 + | 6 + | -7 + | +seven + | 8 + | nine + | diff -r 3074c7249d20 -r 9eebcb77a7e2 romans + | --- a/romans Thu Jan 01 00:00:00 1970 +0000 + | +++ b/romans Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,5 +1,5 @@ + | I + | -II + | +ii + | III + | IV + | V + | + o changeset: 1:3074c7249d20 + | user: test + ~ date: Thu Jan 01 00:00:00 1970 +0000 + summary: E1 + + diff -r 6d1fdf6de7e2 -r 3074c7249d20 letters + --- a/letters Thu Jan 01 00:00:00 1970 +0000 + +++ b/letters Thu Jan 01 00:00:00 1970 +0000 + @@ -1,7 +1,7 @@ + a + b + c + -d + +D + e + f + g + diff -r 6d1fdf6de7e2 -r 3074c7249d20 numbers + --- a/numbers Thu Jan 01 00:00:00 1970 +0000 + +++ b/numbers Thu Jan 01 00:00:00 1970 +0000 + @@ -1,9 +1,9 @@ + 1 + 2 + 3 + -4 + +four + 5 + 6 + 7 + 8 + -9 + +nine + + $ hg obslog --patch + @ 9eebcb77a7e2 (3) phase-divergent update to 3074c7249d20: + | + x 599454370881 (2) E2 + | rewritten(description, parent, content) as 9eebcb77a7e2 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | (No patch available, changesets rebased) + | + o 3074c7249d20 (1) E1 + rewritten(description, content) as 599454370881 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + diff -r 3074c7249d20 -r 599454370881 changeset-description + --- a/changeset-description + +++ b/changeset-description + @@ -1,1 +1,1 @@ + -E1 + +E2 + + diff -r 3074c7249d20 -r 599454370881 letters + --- a/letters Thu Jan 01 00:00:00 1970 +0000 + +++ b/letters Thu Jan 01 00:00:00 1970 +0000 + @@ -1,7 +1,7 @@ + a + b + c + -D + +d + e + f + g + diff -r 3074c7249d20 -r 599454370881 numbers + --- a/numbers Thu Jan 01 00:00:00 1970 +0000 + +++ b/numbers Thu Jan 01 00:00:00 1970 +0000 + @@ -1,9 +1,9 @@ + 1 + 2 + 3 + -four + +4 + 5 + 6 + -7 + +seven + 8 + nine + diff -r 3074c7249d20 -r 599454370881 romans + --- a/romans Thu Jan 01 00:00:00 1970 +0000 + +++ b/romans Thu Jan 01 00:00:00 1970 +0000 + @@ -1,5 +1,5 @@ + I + -II + +ii + III + IV + V + + + $ cd .. + +Phase divergence with file removal cancelation +============================================== + + $ hg init cancel-removal + $ cd cancel-removal + $ echo a > a + $ echo b > b + $ echo c > c + $ echo d > d + $ hg ci -Aqm initial + +Oops, we meant to delete just 'a', but we deleted 'b' and 'c' too + + $ hg rm a b c + $ hg ci -m 'delete a' + $ hg revert -r .^ b + $ hg amend + $ hg glog --hidden --patch + @ 2:0825dcee2670 delete a + | () draftdiff -r 75d2b02c4a5c -r 0825dcee2670 a + | --- a/a Thu Jan 01 00:00:00 1970 +0000 + | +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,1 +0,0 @@ + | -a + | diff -r 75d2b02c4a5c -r 0825dcee2670 c + | --- a/c Thu Jan 01 00:00:00 1970 +0000 + | +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,1 +0,0 @@ + | -c + | + | x 1:dff6e52f5e41 delete a + |/ () draftdiff -r 75d2b02c4a5c -r dff6e52f5e41 a + | --- a/a Thu Jan 01 00:00:00 1970 +0000 + | +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,1 +0,0 @@ + | -a + | diff -r 75d2b02c4a5c -r dff6e52f5e41 b + | --- a/b Thu Jan 01 00:00:00 1970 +0000 + | +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,1 +0,0 @@ + | -b + | diff -r 75d2b02c4a5c -r dff6e52f5e41 c + | --- a/c Thu Jan 01 00:00:00 1970 +0000 + | +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,1 +0,0 @@ + | -c + | + o 0:75d2b02c4a5c initial + () draftdiff -r 000000000000 -r 75d2b02c4a5c 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 + diff -r 000000000000 -r 75d2b02c4a5c 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 + diff -r 000000000000 -r 75d2b02c4a5c 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 + diff -r 000000000000 -r 75d2b02c4a5c 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 + + +The public predecessors deletes'a', 'b' and 'c', +If was amended to only delete 'a', and 'c' +so the fixup should add back 'b'. + + $ hg phase -p -r dff6e52f5e41 --hidden + 1 new phase-divergent changesets + $ hg evolve --phase-divergent + recreate:[2] delete a + atop:[1] delete a + committed as 84aa492b3c37 + working directory is now at 84aa492b3c37 + $ hg glog --patch + @ 3:84aa492b3c37 phase-divergent update to dff6e52f5e41: + | () draftdiff -r dff6e52f5e41 -r 84aa492b3c37 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 1:dff6e52f5e41 delete a + | () publicdiff -r 75d2b02c4a5c -r dff6e52f5e41 a + | --- a/a Thu Jan 01 00:00:00 1970 +0000 + | +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,1 +0,0 @@ + | -a + | diff -r 75d2b02c4a5c -r dff6e52f5e41 b + | --- a/b Thu Jan 01 00:00:00 1970 +0000 + | +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,1 +0,0 @@ + | -b + | diff -r 75d2b02c4a5c -r dff6e52f5e41 c + | --- a/c Thu Jan 01 00:00:00 1970 +0000 + | +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 + | @@ -1,1 +0,0 @@ + | -c + | + o 0:75d2b02c4a5c initial + () publicdiff -r 000000000000 -r 75d2b02c4a5c 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 + diff -r 000000000000 -r 75d2b02c4a5c 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 + diff -r 000000000000 -r 75d2b02c4a5c 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 + diff -r 000000000000 -r 75d2b02c4a5c 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 + + + $ hg diff --change . + diff -r dff6e52f5e41 -r 84aa492b3c37 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 + diff -r 2cbb9914d227 -r 7a779a288793 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 Thu Apr 11 22:41:41 2019 +0200 @@ -0,0 +1,2016 @@ +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 unstable 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 .. + +Different parents, relocation conflict +-------------------------------------- + +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 d > d + $ echo cfoo > c + $ echo e > e + $ hg add d c e + $ hg ci -m "added d c e" + created new head + + $ hg up 'desc("added c")' + 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:f31bcc378766 added d 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 'min(desc("re:added d$"))' -s 'max(desc("re:added d$"))' + 1 changesets pruned + $ hg prune 'min(desc("re:added d$"))' -s 'desc("added d c e")' --hidden + 1 changesets pruned + 2 new content-divergent changesets + +Change phase to public for one head: + $ hg phase --public -r 'max(desc("re:added d$"))' + + $ hg glog + @ 5:93cd84bbdaca added d + | public + | + | * 4:f31bcc378766 added d 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 d c e + base: [3] added d + rebasing "other" content-divergent changeset f31bcc378766 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: f31bcc378766 - test: added d 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 @@ + +d + 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:f31bcc378766 "added d c e" + updating to "local" side of the conflict: 93cd84bbdaca + merging "other" content-divergent changeset 'bd28d3e4a228' + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + committed as 412dde898967 + working directory is now at 412dde898967 + $ hg export + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 412dde898967b50e7d334aefff778a9af46d29d1 + # Parent 93cd84bbdacaeb8f881c29a609dbdd30c38cbc57 + phase-divergent update to 93cd84bbdaca: + + added d c e + + diff -r 93cd84bbdaca -r 412dde898967 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 + + $ 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 .. + +Different parent, simple conflict on relocate, deleted file on actual merge +--------------------------------------------------------------------------- + +Changeset "added c e" is also removing 'd'. This should conflict with the update +to 'd' in the successors of 'adding d' when solving the content divergence. + + $ hg init pubdiv-parent-deleted-file + $ cd pubdiv-parent-deleted-file + $ for ch in a b c d; do + > echo $ch > $ch; + > hg ci -Aqm "added "$ch; + > done; + + $ hg up 'desc("added b")' + 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 'desc("re:added c$")' + 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 --patch --rev 'sort(all(), "topo")' + @ 5:93cd84bbdaca added d + | draft + | + | diff -r 155349b645be -r 93cd84bbdaca 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 @@ + | +dd + | + | o 3:9150fe93bec6 added d + |/ draft + | + | diff -r 155349b645be -r 9150fe93bec6 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 2:155349b645be added c + | draft + | + | diff -r 5f6d8a4bf34a -r 155349b645be 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 4:e568fd1029bb added c e + |/ draft + | + | diff -r 5f6d8a4bf34a -r e568fd1029bb 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 @@ + | +cfoo + | diff -r 5f6d8a4bf34a -r e568fd1029bb 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 + | + o 1:5f6d8a4bf34a added b + | draft + | + | 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 + draft + + 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 prune 'min(desc("added d"))' -s 'max(desc("added d"))' + 1 changesets pruned + $ hg prune 'min(desc("added d"))' -s 'desc("added c e")' --hidden + 1 changesets pruned + 2 new content-divergent changesets + +Change phase to public for one head: + $ hg phase --public -r 'max(desc("added d"))' + + $ 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 glog --patch --rev 'sort(all(), "topo")' --hidden + @ 5:93cd84bbdaca added d + | public + | + | diff -r 155349b645be -r 93cd84bbdaca 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 @@ + | +dd + | + | x 3:9150fe93bec6 added d + |/ draft + | + | diff -r 155349b645be -r 9150fe93bec6 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 2:155349b645be added c + | public + | + | diff -r 5f6d8a4bf34a -r 155349b645be 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 + | + | * 4:e568fd1029bb added c e + |/ draft content-divergent + | + | diff -r 5f6d8a4bf34a -r e568fd1029bb 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 @@ + | +cfoo + | diff -r 5f6d8a4bf34a -r e568fd1029bb 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 + | + 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 + + + $ hg obslog --all --rev tip --patch + @ 93cd84bbdaca (5) added d + | + | * e568fd1029bb (4) added c e + |/ + x 9150fe93bec6 (3) added d + rewritten(content) as 93cd84bbdaca using prune by test (Thu Jan 01 00:00:00 1970 +0000) + diff -r 9150fe93bec6 -r 93cd84bbdaca d + --- a/d Thu Jan 01 00:00:00 1970 +0000 + +++ b/d Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,1 @@ + -d + +dd + + rewritten(description, parent, content) as e568fd1029bb using prune by test (Thu Jan 01 00:00:00 1970 +0000) + (No patch available, changesets rebased) + + + $ 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' + local changed d which other deleted + use (c)hanged version, (d)elete, or leave (u)nresolved? u + 1 files updated, 0 files merged, 0 files removed, 1 files unresolved + fix conflicts and see `hg help evolve.interrupted` + [1] + + $ hg sum + parent: 5:93cd84bbdaca + added d + parent: 6:2af3359250d3 tip (content-divergent) + added c e + branch: default + commit: 1 modified, 1 unknown, 1 unresolved (merge) + update: (current) + phases: 1 draft + content-divergent: 1 changesets + evolve: (evolve --continue) + + $ echo resolved > d + $ hg resolve -m d + (no more unresolved files) + continue: hg evolve --continue + + $ hg evolve --continue + committed as bc1f4610744c + working directory is now at bc1f4610744c + + $ hg export + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID bc1f4610744c6aa0e851d3876a61bfff6243b31c + # Parent 93cd84bbdacaeb8f881c29a609dbdd30c38cbc57 + phase-divergent update to 93cd84bbdaca: + + added c e + + diff -r 93cd84bbdaca -r bc1f4610744c d + --- a/d Thu Jan 01 00:00:00 1970 +0000 + +++ b/d Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,1 @@ + -dd + +resolved + diff -r 93cd84bbdaca -r bc1f4610744c 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 + + $ 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 2cbb9914d227 -r 7a779a288793 tests/test-evolve-stop-contentdiv.t --- a/tests/test-evolve-stop-contentdiv.t Tue Jan 22 12:54:43 2019 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,217 +0,0 @@ -Tests for the --stop flag for `hg evolve` command while resolving content-divergence -================================================================================== - -The `--stop` flag stops the interrupted evolution and delete the state file so -user can do other things and comeback and do evolution later on - -This is testing cases when `hg evolve` command is doing content-divergence resolution. - -Setup -===== - - $ cat >> $HGRCPATH < [alias] - > glog = log -GT "{rev}:{node|short} {desc}\n ({bookmarks}) {phase}" - > [extensions] - > EOF - $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH - - $ hg init stoprepo - $ cd stoprepo - $ 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 - | () draft - o 3:ca1b80f7960a added c - | () draft - o 2:b1661037fa25 added b - | () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - -Creating content divergence, resolution of which will lead to conflicts ------------------------------------------------------------------------ - - $ echo bar > d - $ hg amend - - $ hg up c41c793e0ef1 --hidden - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset c41c793e0ef1 - (hidden revision 'c41c793e0ef1' was rewritten as: e49523854bc8) - working directory parent is obsolete! (c41c793e0ef1) - (use 'hg evolve' to update to its successor: e49523854bc8) - - $ echo foobar > d - $ hg amend - 2 new content-divergent changesets - $ hg glog --hidden - @ 6:9c1631e352d9 added d - | () draft - | * 5:e49523854bc8 added d - |/ () draft - | x 4:c41c793e0ef1 added d - |/ () draft - o 3:ca1b80f7960a added c - | () draft - o 2:b1661037fa25 added b - | () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - - $ hg evolve --content-divergent - merge:[6] added d - with: [5] added d - base: [4] added d - merging "other" content-divergent changeset 'e49523854bc8' - 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] - - $ hg evolve --stop - stopped the interrupted evolve - working directory is now at 9c1631e352d9 - - $ hg glog --hidden - @ 6:9c1631e352d9 added d - | () draft - | * 5:e49523854bc8 added d - |/ () draft - | x 4:c41c793e0ef1 added d - |/ () draft - o 3:ca1b80f7960a added c - | () draft - o 2:b1661037fa25 added b - | () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - -Content divergence with parent change which will result in conflicts while -merging ---------------------------------------------------------------------------- - - $ hg rebase -r . -d .^^^ --config extensions.rebase= - rebasing 6:9c1631e352d9 "added d" (tip) - - $ hg glog - @ 7:517d4375cb72 added d - | () draft - | * 5:e49523854bc8 added d - | | () draft - | o 3:ca1b80f7960a added c - | | () draft - | o 2:b1661037fa25 added b - |/ () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - - $ hg evolve --content-divergent - merge:[5] added d - with: [7] added d - base: [4] added d - rebasing "other" content-divergent changeset 517d4375cb72 on ca1b80f7960a - updating to "local" side of the conflict: e49523854bc8 - merging "other" content-divergent changeset '606ad96040fc' - 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] - - $ hg evolve --stop - stopped the interrupted evolve - working directory is now at 517d4375cb72 - - $ hg glog - @ 7:517d4375cb72 added d - | () draft - | * 5:e49523854bc8 added d - | | () draft - | o 3:ca1b80f7960a added c - | | () draft - | o 2:b1661037fa25 added b - |/ () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - -Content-divergence with parent-change which will result in conflicts while -relocation ---------------------------------------------------------------------------- - - $ echo babar > c - $ hg add c - $ hg amend - $ hg glog - @ 8:8fd1c4bd144c added d - | () draft - | * 5:e49523854bc8 added d - | | () draft - | o 3:ca1b80f7960a added c - | | () draft - | o 2:b1661037fa25 added b - |/ () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft - - $ hg evolve --content-divergent - merge:[5] added d - with: [8] added d - base: [4] added d - rebasing "other" content-divergent changeset 8fd1c4bd144c on ca1b80f7960a - 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 ca1b80f7960a 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: ca1b80f7960a - test: added c - foo - +======= - +babar - +>>>>>>> evolving: 8fd1c4bd144c - test: added d - diff -r ca1b80f7960a 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 @@ - +foobar - - $ hg evolve --stop - stopped the interrupted evolve - working directory is now at ca1b80f7960a - -XXX: we should have preserved the wdir to be at rev 8 - $ hg glog - * 8:8fd1c4bd144c added d - | () draft - | * 5:e49523854bc8 added d - | | () draft - | @ 3:ca1b80f7960a added c - | | () draft - | o 2:b1661037fa25 added b - |/ () draft - o 1:c7586e2a9264 added a - | () draft - o 0:8fa14d15e168 added hgignore - () draft diff -r 2cbb9914d227 -r 7a779a288793 tests/test-evolve-templates.t --- a/tests/test-evolve-templates.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-evolve-templates.t Thu Apr 11 22:41:41 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 2cbb9914d227 -r 7a779a288793 tests/test-evolve-topic.t --- a/tests/test-evolve-topic.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-evolve-topic.t Thu Apr 11 22:41:41 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 2cbb9914d227 -r 7a779a288793 tests/test-evolve.t --- a/tests/test-evolve.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-evolve.t Thu Apr 11 22:41:41 2019 +0200 @@ -81,23 +81,22 @@ explicitly assert support for the obsolescence feature (this can currently only be done via an extension). - Instability ========== + Instability + =========== - (note: the vocabulary is in the process of being updated) - - Rewriting changesets might introduce instability (currently 'trouble'). + Rewriting changesets might introduce instability. There are two main kinds of instability: orphaning and diverging. - Orphans are changesets left behind when their ancestors are rewritten, - (currently: 'unstable'). Divergence has two variants: + Orphans are changesets left behind when their ancestors are rewritten. + Divergence has two variants: * Content-divergence occurs when independent rewrites of the same - changesets lead to different results. (currently: 'divergent') + changesets lead to different results. * Phase-divergence occurs when the old (obsolete) version of a changeset - becomes public. (currently: 'bumped') + becomes public. - If it possible to prevent local creation of orphans by using the following + It is possible to prevent local creation of orphans by using the following config: [experimental] @@ -145,7 +144,7 @@ $ hg log -r 1 --template '{rev} {phase} {obsolete}\n' 1 public $ hg prune 1 - abort: cannot touch public changesets: 7c3bad9141dc + abort: cannot prune public changesets: 7c3bad9141dc (see 'hg help phases' for details) [255] $ hg log -r 1 --template '{rev} {phase} {obsolete}\n' @@ -390,12 +389,12 @@ 4 feature-A: a nifty feature - test 0 : base - test -phase change turning obsolete changeset public issue a bumped warning +phase change turning obsolete changeset public issues a phase divergence warning $ hg phase --hidden --public 99833d22b0c6 1 new phase-divergent changesets -all solving bumped troubled +all solving phase-divergent $ glog @ 6:47d52a103155@default(draft) another feature that rox @@ -409,7 +408,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 @@ -429,7 +427,7 @@ @@ -3,1 +3,1 @@ -Zwei +deux - $ hg log -r 'phasedivergent()' # no more bumped + $ hg log -r 'phasedivergent()' # no more phase-divergent test evolve --all $ sed -i'' -e s/deux/to/ main-file-1 @@ -1000,8 +998,8 @@ o 0:07c1c36d9ef0@default(draft) a0 -Possibility to select what trouble to solve first, asking for bumped before -divergent +Possibility to select what instability to solve first, asking for +phase-divergent before content-divergent $ hg up -r "desc('a1__')" 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg revert -r d952e93add6f --all @@ -1040,8 +1038,8 @@ o 0 : a0 - test -Now we have a bumped and an unstable changeset, we solve the bumped first -normally the unstable changeset would be solve first +Now we have a phase-divergent and an orphan changeset, we solve the +phase-divergent first. Normally the orphan changeset would be solved first $ hg log -G @ 11 : add new file bumped - test @@ -1061,7 +1059,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 @@ -1080,7 +1077,7 @@ o 0:07c1c36d9ef0@default(public) a0 -Check that we can resolve troubles in a revset with more than one commit +Check that we can resolve instabilities in a revset with more than one commit $ hg up b88539ad24d7 -C 0 files updated, 0 files merged, 0 files removed, 0 files unresolved $ mkcommit gg @@ -1377,11 +1374,11 @@ $ mkcommit c5_ created new head $ hg prune '0ef9ff75f8e2 + f1b85956c48c' - abort: touch will orphan 1 descendants + abort: prune will orphan 1 descendants (see 'hg help evolution.instability') [255] $ hg prune '98e171e2f272::0d9203b74542' - abort: touch will orphan 1 descendants + abort: prune will orphan 1 descendants (see 'hg help evolution.instability') [255] $ hg prune '0ef9ff75f8e2::' @@ -1604,7 +1601,7 @@ adding a adding b adding c -Lets create a merge commit so that we can create orhpan merge later: +Let's create a merge commit so that we can create orphan merge later: $ hg up 1 -q $ echo feature > f $ hg ci -Am "added feature f" @@ -1651,7 +1648,7 @@ To check `lastsolved` contain right value after completion of orphan-merge -resolution there should be one more trouble to be evolved; lets create one: +resolution there should be one more instability to be evolved; lets create one: $ hg up 1 -q $ echo d > d $ hg ci -Am "added d" diff -r 2cbb9914d227 -r 7a779a288793 tests/test-extension-isolation.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-extension-isolation.t Thu Apr 11 22:41:41 2019 +0200 @@ -0,0 +1,171 @@ +============================ +Testing extensions isolation +============================ + +In this test case, we check that a repository using the extensions can co-exist +with a repository not using the extension. + + $ . $TESTDIR/testlib/common.sh + +Setup +===== + +Create repo + + $ hg init repo-evo + $ cat > repo-evo/.hg/hgrc << EOF + > [extensions] + > evolve= + > EOF + $ hg init repo-topic + $ cat > repo-topic/.hg/hgrc << EOF + > [extensions] + > topic= + > EOF + $ hg init repo-both + $ cat > repo-both/.hg/hgrc << EOF + > [extensions] + > evolve= + > topic= + > EOF + $ hg init repo-no-ext + +check setup + + $ hg -R repo-evo help -e evolve | head -n 1 + warning: --repository ignored + evolve extension - extends Mercurial feature related to Changeset Evolution + $ hg -R repo-both help -e evolve | head -n 1 + warning: --repository ignored + evolve extension - extends Mercurial feature related to Changeset Evolution + $ hg -R repo-no-ext help -e evolve + warning: --repository ignored + abort: no such help topic: evolve + (try 'hg help --keyword evolve') + [255] + $ hg -R repo-no-ext help -e topic + warning: --repository ignored + abort: no such help topic: topic + (try 'hg help --keyword topic') + [255] + +start hgweb dir for all repo + + $ cat > hgweb.conf << EOF + > [paths] + > / = * + > EOF + + $ hg serve -p $HGPORT -d --pid-file=hg.pid --web-conf hgweb.conf -A access.log -E error.log + $ cat hg.pid >> $DAEMON_PIDS + +Test isolation +-------------- + +As of 4.9 (and previous version). It seems like extensions are displayed as +enabled even for repository where they are not supposed to be. See the output +tagged `no-false`. + +(however, topic and evolve are not supposed to affect other repository as shown +in the rest of this test). + + $ get-with-headers.py $LOCALIP:$HGPORT 'repo-no-ext/help/extensions' | grep 'enabled extensions' -A 7 + [1] + $ get-with-headers.py $LOCALIP:$HGPORT 'repo-evo/help/extensions' | grep 'enabled extensions' -A 7 + enabled extensions: +

+
+
evolve +
extends Mercurial feature related to Changeset Evolution +
+

+ disabled extensions: + $ get-with-headers.py $LOCALIP:$HGPORT 'repo-topic/help/extensions' | grep 'enabled extensions' -A 7 + enabled extensions: +

+
+
evolve (no-false !) +
extends Mercurial feature related to Changeset Evolution (no-false !) +
topic +
support for topic branches +
+ $ get-with-headers.py $LOCALIP:$HGPORT 'repo-both/help/extensions' | grep 'enabled extensions' -A 9 + enabled extensions: +

+
+
evolve +
extends Mercurial feature related to Changeset Evolution +
topic +
support for topic branches +
+

+ disabled extensions: + $ get-with-headers.py $LOCALIP:$HGPORT 'repo-no-ext/help/extensions' | grep 'enabled extensions' -A 9 + enabled extensions: (no-false !) +

(no-false !) +
(no-false !) +
evolve (no-false !) +
extends Mercurial feature related to Changeset Evolution (no-false !) +
topic (no-false !) +
support for topic branches (no-false !) +
(no-false !) +

(no-false !) + disabled extensions: (no-false !) + +make sure repos don't affect each other (and check both ways) + +Check evolve isolation +----------------------- + + $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-no-ext | egrep 'topics|evoext' + [1] + $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-evo | egrep 'topics|evoext' + _evoext_getbundle_obscommon + _evoext_obshash_0 + _evoext_obshash_1 + _evoext_obshashrange_v1 + $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-no-ext | egrep 'topics|evoext' + [1] + +Check topic isolation +--------------------- + + $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-no-ext | egrep 'topics|evoext' + [1] + $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-topic | egrep 'topics|evoext' + topics + $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-no-ext | egrep 'topics|evoext' + [1] + +Check coupled isolation +----------------------- + + $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-no-ext | egrep 'topics|evoext' + [1] + $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-both | egrep 'topics|evoext' + _evoext_getbundle_obscommon + _evoext_obshash_0 + _evoext_obshash_1 + _evoext_obshashrange_v1 + topics + $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-evo | egrep 'topics|evoext' + _evoext_getbundle_obscommon + _evoext_obshash_0 + _evoext_obshash_1 + _evoext_obshashrange_v1 + $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-topic | egrep 'topics|evoext' + topics + $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-evo | egrep 'topics|evoext' + _evoext_getbundle_obscommon + _evoext_obshash_0 + _evoext_obshash_1 + _evoext_obshashrange_v1 + $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-no-ext | egrep 'topics|evoext' + [1] + +Final cleanup +------------- + + $ cat error.log + + $ $RUNTESTDIR/killdaemons.py $DAEMON_PIDS diff -r 2cbb9914d227 -r 7a779a288793 tests/test-grab.t --- a/tests/test-grab.t Tue Jan 22 12:54:43 2019 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,336 +0,0 @@ -Test for the grab command - - $ cat >> $HGRCPATH < [alias] - > glog = log -G -T "{rev}:{node|short} {desc}\n" - > [extensions] - > EOF - $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH - - $ mkcommit() { - > echo "$1" > "$1" - > hg add "$1" - > hg ci -m "add $1" - > } - - $ hg init repo - $ cd repo - $ hg help grab - hg pick [-r] rev - - aliases: grab - - move a commit on the top of working directory parent and updates to it. - - options: - - -r --rev REV revision to pick - -c --continue continue interrupted pick - -a --abort abort interrupted pick - - (some details hidden, use --verbose to show complete help) - - $ mkcommit a - $ mkcommit b - $ mkcommit c - - $ hg glog - @ 2:4538525df7e2 add c - | - o 1:7c3bad9141dc add b - | - o 0:1f0dee641bb7 add a - - -Grabbing an ancestor - - $ hg pick -r 7c3bad9141dc - abort: cannot pick an ancestor revision - [255] - -Grabbing the working directory parent - - $ hg pick -r . - abort: cannot pick an ancestor revision - [255] - -Specifying multiple revisions to grab - - $ hg pick 1f0dee641bb7 -r 7c3bad9141dc - abort: specify just one revision - [255] - -Specifying no revisions to grab - - $ hg pick - abort: empty revision set - [255] - -Continuing without interrupted grab - - $ hg pick --continue - abort: no interrupted pick state exists - [255] - -Aborting without interrupted grab - - $ hg pick --abort - abort: no interrupted pick state exists - [255] - -Specifying both continue and revs - - $ hg up 1f0dee641bb7 - 0 files updated, 0 files merged, 2 files removed, 0 files unresolved - $ hg pick -r 4538525df7e2 --continue - abort: cannot specify both --continue and revision - [255] - -Making new branch heads - - $ mkcommit x - created new head - $ mkcommit y - - $ hg glog - @ 4:d46dc301d92f add y - | - o 3:8e224524cd09 add x - | - | o 2:4538525df7e2 add c - | | - | o 1:7c3bad9141dc add b - |/ - o 0:1f0dee641bb7 add a - -Grabbing a revision - - $ hg pick 7c3bad9141dc - picking 1:7c3bad9141dc "add b" - 1 new orphan changesets - $ hg glog - @ 5:7c15c05db6fa add b - | - o 4:d46dc301d92f add y - | - o 3:8e224524cd09 add x - | - | * 2:4538525df7e2 add c - | | - | x 1:7c3bad9141dc add b - |/ - o 0:1f0dee641bb7 add a - - -When grab does not create any changes - - $ hg graft -r 4538525df7e2 - grafting 2:4538525df7e2 "add c" - - $ hg glog - @ 6:c4636a81ebeb add c - | - o 5:7c15c05db6fa add b - | - o 4:d46dc301d92f add y - | - o 3:8e224524cd09 add x - | - | * 2:4538525df7e2 add c - | | - | x 1:7c3bad9141dc add b - |/ - o 0:1f0dee641bb7 add a - - $ hg pick -r 4538525df7e2 - picking 2:4538525df7e2 "add c" - note: picking 2:4538525df7e2 created no changes to commit - - $ hg glog - @ 6:c4636a81ebeb add c - | - o 5:7c15c05db6fa add b - | - o 4:d46dc301d92f add y - | - o 3:8e224524cd09 add x - | - o 0:1f0dee641bb7 add a - -interrupted grab - - $ hg up d46dc301d92f - 0 files updated, 0 files merged, 2 files removed, 0 files unresolved - $ echo foo > c - $ hg ci -Aqm "foo to c" - $ hg pick -r c4636a81ebeb - picking 6:c4636a81ebeb "add c" - merging c - warning: conflicts while merging c! (edit, then use 'hg resolve --mark') - unresolved merge conflicts (see hg help resolve) - [1] - - $ echo foobar > c - $ hg resolve --all --mark - (no more unresolved files) - continue: hg pick --continue - $ hg pick --continue - $ hg glog - @ 8:44e155eb95c7 add c - | - o 7:2ccc03d1d096 foo to c - | - | o 5:7c15c05db6fa add b - |/ - o 4:d46dc301d92f add y - | - o 3:8e224524cd09 add x - | - o 0:1f0dee641bb7 add a - - -When interrupted grab results in no changes to commit - - $ hg up d46dc301d92f - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ echo bar > c - $ hg add c - $ hg ci -m "foo to c" - created new head - - $ hg up 44e155eb95c7 - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - - $ hg pick 4e04628911f6 - picking 9:4e04628911f6 "foo to c" - merging c - warning: conflicts while merging c! (edit, then use 'hg resolve --mark') - unresolved merge conflicts (see hg help resolve) - [1] - $ echo foobar > c - $ hg resolve -m - (no more unresolved files) - continue: hg pick --continue - - $ hg pick --continue - note: picking 9:4e04628911f6 created no changes to commit - -Testing the abort functionality of hg pick - - $ echo foo > b - $ hg ci -Aqm "foo to b" - $ hg glog -r .^:: - @ 10:c437988de89f foo to b - | - o 8:44e155eb95c7 add c - | - ~ - - $ hg pick -r 7c15c05db6fa - picking 5:7c15c05db6fa "add b" - merging b - warning: conflicts while merging b! (edit, then use 'hg resolve --mark') - unresolved merge conflicts (see hg help resolve) - [1] - - $ hg pick --abort - aborting pick, updating to c437988de89f - - $ hg glog - @ 10:c437988de89f foo to b - | - o 8:44e155eb95c7 add c - | - o 7:2ccc03d1d096 foo to c - | - | o 5:7c15c05db6fa add b - |/ - o 4:d46dc301d92f add y - | - o 3:8e224524cd09 add x - | - o 0:1f0dee641bb7 add a - - -Trying to grab a public changeset - - $ hg phase -r 7c15c05db6fa -p - - $ hg pick -r 7c15c05db6fa - abort: cannot pick public changesets: 7c15c05db6fa - (see 'hg help phases' for details) - [255] - - $ hg glog - @ 10:c437988de89f foo to b - | - o 8:44e155eb95c7 add c - | - o 7:2ccc03d1d096 foo to c - | - | o 5:7c15c05db6fa add b - |/ - o 4:d46dc301d92f add y - | - o 3:8e224524cd09 add x - | - o 0:1f0dee641bb7 add a - -Checking phase preservation while grabbing secret changeset - -In case of merge conflicts - - $ hg phase -r 7c15c05db6fa -s -f - - $ hg pick -r 7c15c05db6fa - picking 5:7c15c05db6fa "add b" - merging b - warning: conflicts while merging b! (edit, then use 'hg resolve --mark') - unresolved merge conflicts (see hg help resolve) - [1] - - $ echo bar > b - $ hg resolve -m - (no more unresolved files) - continue: hg pick --continue - - $ hg pick --continue - $ hg phase -r . - 11: secret - -No merge conflicts - - $ hg up d46dc301d92f - 0 files updated, 0 files merged, 3 files removed, 0 files unresolved - $ echo foo > l - $ hg add l - $ hg ci -qm "added l" --secret - - $ hg phase -r . - 12: secret - - $ hg glog - @ 12:508d572e7053 added l - | - | o 11:10427de9e26e add b - | | - | o 10:c437988de89f foo to b - | | - | o 8:44e155eb95c7 add c - | | - | o 7:2ccc03d1d096 foo to c - |/ - o 4:d46dc301d92f add y - | - o 3:8e224524cd09 add x - | - o 0:1f0dee641bb7 add a - - $ hg up 10427de9e26e - 3 files updated, 0 files merged, 1 files removed, 0 files unresolved - - $ hg pick -r 508d572e7053 - picking 12:508d572e7053 "added l" - - $ hg phase -r . - 13: secret diff -r 2cbb9914d227 -r 7a779a288793 tests/test-obsolete.t --- a/tests/test-obsolete.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-obsolete.t Thu Apr 11 22:41:41 2019 +0200 @@ -236,7 +236,7 @@ abort: push includes orphan changeset: 95de7fc6918d! (use 'hg evolve' to get a stable history or --force to ignore warnings) [255] - $ hg push ../other-new -f # use f because there is unstability + $ hg push ../other-new -f # use f because there is an orphan pushing to ../other-new searching for changes adding changesets @@ -431,7 +431,7 @@ 1 new phase-divergent changesets 83b5778897ad try to obsolete immutable changeset 1f0dee641bb7 # at core level the warning is not issued -# this is now a big issue now that we have bumped warning +# this is now a big issue now that we have phase divergence warning $ qlog -r 'obsolete()' 3 - 0d3f46688ccc @@ -574,7 +574,7 @@ obsoleted 1 changesets $ cd .. -check bumped detection +check phase divergence detection (make an obsolete changeset public) $ cd local diff -r 2cbb9914d227 -r 7a779a288793 tests/test-pick.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-pick.t Thu Apr 11 22:41:41 2019 +0200 @@ -0,0 +1,388 @@ +Test for the pick command + + $ cat >> $HGRCPATH < [alias] + > glog = log -G -T "{rev}:{node|short} {desc}\n" + > [extensions] + > EOF + $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH + + $ mkcommit() { + > echo "$1" > "$1" + > hg add "$1" + > hg ci -m "add $1" + > } + + $ hg init repo + $ cd repo + $ hg help pick + hg pick [-r] rev + + aliases: grab + + move a commit on the top of working directory parent and updates to it. + + options: + + -r --rev REV revision to pick + -c --continue continue interrupted pick + -a --abort abort interrupted pick + -t --tool VALUE specify merge tool + + (some details hidden, use --verbose to show complete help) + + $ mkcommit a + $ mkcommit b + $ mkcommit c + + $ hg glog + @ 2:4538525df7e2 add c + | + o 1:7c3bad9141dc add b + | + o 0:1f0dee641bb7 add a + + +Grabbing an ancestor + + $ hg pick -r 7c3bad9141dc + abort: cannot pick an ancestor revision + [255] + +Grabbing the working directory parent + + $ hg pick -r . + abort: cannot pick an ancestor revision + [255] + +Specifying multiple revisions to pick + + $ hg pick 1f0dee641bb7 -r 7c3bad9141dc + abort: specify just one revision + [255] + +Specifying no revisions to pick + + $ hg pick + abort: empty revision set + [255] + +Continuing without interrupted pick + + $ hg pick --continue + abort: no interrupted pick state exists + [255] + +Aborting without interrupted pick + + $ hg pick --abort + abort: no interrupted pick state exists + [255] + +Specifying both continue and revs + + $ hg up 1f0dee641bb7 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ hg pick -r 4538525df7e2 --continue + abort: cannot specify both --continue and revision + [255] + +Making new branch heads + + $ mkcommit x + created new head + $ mkcommit y + + $ hg glog + @ 4:d46dc301d92f add y + | + o 3:8e224524cd09 add x + | + | o 2:4538525df7e2 add c + | | + | o 1:7c3bad9141dc add b + |/ + o 0:1f0dee641bb7 add a + +Grabbing a revision + + $ hg pick 7c3bad9141dc + picking 1:7c3bad9141dc "add b" + 1 new orphan changesets + $ hg glog + @ 5:7c15c05db6fa add b + | + o 4:d46dc301d92f add y + | + o 3:8e224524cd09 add x + | + | * 2:4538525df7e2 add c + | | + | x 1:7c3bad9141dc add b + |/ + o 0:1f0dee641bb7 add a + + +When pick does not create any changes + + $ hg graft -r 4538525df7e2 + grafting 2:4538525df7e2 "add c" + + $ hg glog + @ 6:c4636a81ebeb add c + | + o 5:7c15c05db6fa add b + | + o 4:d46dc301d92f add y + | + o 3:8e224524cd09 add x + | + | * 2:4538525df7e2 add c + | | + | x 1:7c3bad9141dc add b + |/ + o 0:1f0dee641bb7 add a + + $ hg pick -r 4538525df7e2 + picking 2:4538525df7e2 "add c" + note: picking 2:4538525df7e2 created no changes to commit + + $ hg glog + @ 6:c4636a81ebeb add c + | + o 5:7c15c05db6fa add b + | + o 4:d46dc301d92f add y + | + o 3:8e224524cd09 add x + | + o 0:1f0dee641bb7 add a + +interrupted pick + + $ hg up d46dc301d92f + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo foo > c + $ hg ci -Aqm "foo to c" + $ hg pick -r c4636a81ebeb + picking 6:c4636a81ebeb "add c" + merging c + warning: conflicts while merging c! (edit, then use 'hg resolve --mark') + unresolved merge conflicts (see hg help resolve) + [1] + + $ echo foobar > c + $ hg resolve --all --mark + (no more unresolved files) + continue: hg pick --continue + $ hg pick --continue + $ hg glog + @ 8:44e155eb95c7 add c + | + o 7:2ccc03d1d096 foo to c + | + | o 5:7c15c05db6fa add b + |/ + o 4:d46dc301d92f add y + | + o 3:8e224524cd09 add x + | + o 0:1f0dee641bb7 add a + + +When interrupted pick results in no changes to commit + + $ hg up d46dc301d92f + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo bar > c + $ hg add c + $ hg ci -m "foo to c" + created new head + + $ hg up 44e155eb95c7 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + + $ hg pick 4e04628911f6 + picking 9:4e04628911f6 "foo to c" + merging c + warning: conflicts while merging c! (edit, then use 'hg resolve --mark') + unresolved merge conflicts (see hg help resolve) + [1] + $ echo foobar > c + $ hg resolve -m + (no more unresolved files) + continue: hg pick --continue + + $ hg pick --continue + note: picking 9:4e04628911f6 created no changes to commit + +Testing the abort functionality of hg pick + + $ echo foo > b + $ hg ci -Aqm "foo to b" + $ hg glog -r .^:: + @ 10:c437988de89f foo to b + | + o 8:44e155eb95c7 add c + | + ~ + + $ hg pick -r 7c15c05db6fa + picking 5:7c15c05db6fa "add b" + merging b + warning: conflicts while merging b! (edit, then use 'hg resolve --mark') + unresolved merge conflicts (see hg help resolve) + [1] + + $ hg pick --abort + aborting pick, updating to c437988de89f + + $ hg glog + @ 10:c437988de89f foo to b + | + o 8:44e155eb95c7 add c + | + o 7:2ccc03d1d096 foo to c + | + | o 5:7c15c05db6fa add b + |/ + o 4:d46dc301d92f add y + | + o 3:8e224524cd09 add x + | + o 0:1f0dee641bb7 add a + + +Trying to pick a public changeset + + $ hg phase -r 7c15c05db6fa -p + + $ hg pick -r 7c15c05db6fa + abort: cannot pick public changesets: 7c15c05db6fa + (see 'hg help phases' for details) + [255] + + $ hg glog + @ 10:c437988de89f foo to b + | + o 8:44e155eb95c7 add c + | + o 7:2ccc03d1d096 foo to c + | + | o 5:7c15c05db6fa add b + |/ + o 4:d46dc301d92f add y + | + o 3:8e224524cd09 add x + | + o 0:1f0dee641bb7 add a + +Checking phase preservation while picking secret changeset + +In case of merge conflicts + + $ hg phase -r 7c15c05db6fa -s -f + + $ hg pick -r 7c15c05db6fa + picking 5:7c15c05db6fa "add b" + merging b + warning: conflicts while merging b! (edit, then use 'hg resolve --mark') + unresolved merge conflicts (see hg help resolve) + [1] + + $ echo bar > b + $ hg resolve -m + (no more unresolved files) + continue: hg pick --continue + + $ hg pick --continue + $ hg phase -r . + 11: secret + +No merge conflicts + + $ hg up d46dc301d92f + 0 files updated, 0 files merged, 3 files removed, 0 files unresolved + $ echo foo > l + $ hg add l + $ hg ci -qm "added l" --secret + + $ hg phase -r . + 12: secret + + $ hg glog + @ 12:508d572e7053 added l + | + | o 11:10427de9e26e add b + | | + | o 10:c437988de89f foo to b + | | + | o 8:44e155eb95c7 add c + | | + | o 7:2ccc03d1d096 foo to c + |/ + o 4:d46dc301d92f add y + | + o 3:8e224524cd09 add x + | + o 0:1f0dee641bb7 add a + + $ hg up 10427de9e26e + 3 files updated, 0 files merged, 1 files removed, 0 files unresolved + + $ hg pick -r 508d572e7053 + picking 12:508d572e7053 "added l" + + $ hg phase -r . + 13: secret + $ cd .. + +Check pick behavior regarding working copy branch (issue6089) +------------------------------------------------------------- + +The branch of the picked changeset should be preserved, and the working copy updated + + $ hg init issue6089 + $ cd issue6089 + + $ touch a + $ hg add a + $ hg ci -m 'first commit on default' + + $ hg branch foo + marked working directory as branch foo + (branches are permanent and global, did you want a bookmark?) + $ touch b + $ hg add b + $ hg ci -m 'first commit on foo' + + $ hg up default + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo test > a + $ hg ci -m 'second commit on default' + $ hg log -G --template '{node|short}: {branch}\n' --rev 'all()+wdir()' + o ffffffffffff: default + | + @ 5f07cbf7d111: default + | + | o 96bb2057779e: foo + |/ + o d03a6bcc83cd: default + + + $ hg pick 1 + picking 1:96bb2057779e "first commit on foo" + $ hg log --template '{branch}\n' -r tip + foo + $ hg branch + foo + $ hg log -G --template '{node|short}: {branch}\n' --rev 'all()+wdir()' + o ffffffffffff: foo + | + @ 5344a77549bd: foo + | + o 5f07cbf7d111: default + | + o d03a6bcc83cd: default + + $ cd .. diff -r 2cbb9914d227 -r 7a779a288793 tests/test-prev-next.t --- a/tests/test-prev-next.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-prev-next.t Thu Apr 11 22:41:41 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 @@ -339,7 +339,7 @@ $ sleep 1 $ hg prev waiting for lock on working directory of $TESTTMP/repo held by process '*' on host '*' (glob) - got lock after [4-6] seconds (re) + got lock after (\d+) seconds (re) 1 files updated, 0 files merged, 0 files removed, 0 files unresolved [0] one $ wait @@ -349,7 +349,7 @@ $ hg next --evolve waiting for lock on working directory of $TESTTMP/repo held by process '*' on host '*' (glob) 1 new orphan changesets - got lock after [4-6] seconds (re) + got lock after (\d+) seconds (re) move:[2] two atop:[3] one working directory now at a7d885c75614 @@ -443,9 +443,14 @@ Test that --merge still works fine with commands.update.check set -XXX: yes we want --merge and we passed that! + $ hg config commands.update.check + noconflict $ echo hi > bar $ echo bar >> bar + $ hg next + abort: conflicting changes + (do you want --merge?) + [255] $ hg next --merge merging bar warning: conflicts while merging bar! (edit, then use 'hg resolve --mark') @@ -459,7 +464,10 @@ Testing --merge works with other values of commands.update.check also -XXX: things are broken! + $ hg prev --config commands.update.check=abort + abort: uncommitted changes + (do you want --merge?) + [255] $ hg prev --merge --config commands.update.check=abort local [working copy] changed bar which other [destination] deleted use (c)hanged version, (d)elete, or leave (u)nresolved? @@ -476,6 +484,10 @@ $ echo bar > bar $ hg add bar + $ hg next --config commands.update.check=abort + abort: uncommitted changes + (do you want --merge?) + [255] $ hg next --merge --config commands.update.check=abort merging bar warning: conflicts while merging bar! (edit, then use 'hg resolve --mark') diff -r 2cbb9914d227 -r 7a779a288793 tests/test-prune.t --- a/tests/test-prune.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-prune.t Thu Apr 11 22:41:41 2019 +0200 @@ -92,7 +92,7 @@ cannot prune public changesets $ hg prune 0 - abort: cannot touch public changesets: 1f0dee641bb7 + abort: cannot prune public changesets: 1f0dee641bb7 (see 'hg help phases' for details) [255] $ hg debugobsolete diff -r 2cbb9914d227 -r 7a779a288793 tests/test-push-checkheads-unpushed-D5.t --- a/tests/test-push-checkheads-unpushed-D5.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-push-checkheads-unpushed-D5.t Thu Apr 11 22:41:41 2019 +0200 @@ -24,7 +24,7 @@ .. .. * push the new branch only -> push denied .. * push the existing branch only -> push allowed -.. /!\ This push create unstability/orphaning on the other hand and we should +.. /!\ This push create instability/orphaning on the other hand and we should .. probably detect/warn agains that. .. .. graph-summary: diff -r 2cbb9914d227 -r 7a779a288793 tests/test-share.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-share.t Thu Apr 11 22:41:41 2019 +0200 @@ -0,0 +1,20 @@ +Test that share-clones use the cache in the original repository. + + $ . $TESTDIR/testlib/common.sh + + $ hg init share-base + $ cd share-base/ + $ cat >> .hg/hgrc < [extensions] + > evolve= + > share= + > EOF + $ hg debugbuilddag .+3:branchpoint+4*branchpoint+2 + $ cd .. + $ hg --config extensions.share= share -U share-base share-client + $ cd share-client + $ hg debugupdatecache + $ test -d .hg/cache + [1] + $ test -d ../share-base/.hg/cache + diff -r 2cbb9914d227 -r 7a779a288793 tests/test-sharing.t --- a/tests/test-sharing.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-sharing.t Thu Apr 11 22:41:41 2019 +0200 @@ -423,8 +423,9 @@ ~ $ cd .. -Setup for "cowboy mode" shared mutable history (to illustrate divergent -and bumped changesets). +Setup for shared mutable history (to illustrate content-divergence and +phase-divergent changesets). + $ rm -rf review alice bob $ hg clone public alice updating to branch default @@ -446,8 +447,7 @@ $ hg shortlog -r . 4:2fe6c4bd32d0 draft fix bug 24 (v1) -Since Alice and Bob are now in cowboy mode, Alice pulls Bob's draft -changeset and amends it herself. :: +Alice pulls Bob's draft changeset and amends it herself. :: $ cd ../alice $ hg pull -u ../bob @@ -518,12 +518,12 @@ base: [4] fix bug 24 (v1) merging "other" content-divergent changeset 'e3f99ce9d9cd' 0 files updated, 1 files merged, 0 files removed, 0 files unresolved - working directory is now at 711ede2d7a26 + working directory is now at b1499b0f03ca $ hg log -q -r 'contentdivergent()' Figure SG10: Bob's repository after fixing divergence. $ hg --hidden shortlog -G -r 3:: - @ 7:711ede2d7a26 draft fix bug 24 (v2 by bob) + @ 7:b1499b0f03ca draft fix bug 24 (v2 by bob) | | x 6:e3f99ce9d9cd draft fix bug 24 (v2 by alice) |/ @@ -534,7 +534,7 @@ o 3:a06ec1bf97bd public fix bug 15 (v2) | ~ - $ hg --hidden shortlog -r 'precursors(711ede2d7a26)' + $ hg --hidden shortlog -r 'precursors(b1499b0f03ca)' 5:a360947f6faf draft fix bug 24 (v2 by bob) 6:e3f99ce9d9cd draft fix bug 24 (v2 by alice) $ cat file1 diff -r 2cbb9914d227 -r 7a779a288793 tests/test-split.t --- a/tests/test-split.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-split.t Thu Apr 11 22:41:41 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 @@ -1119,3 +1121,96 @@ | o 0:a5a1faba8d26 p (draft) + $ cd .. + +Testing that `hg split` preserve the phase of splitting cset(issue6048) +----------------------------------------------------------------------- + +Prepare the repository: + $ hg init issue6048 + $ cd issue6048 + $ echo a > a + $ hg ci -Am "added a" + adding a + + $ echo b > b + $ echo c > c + $ hg add b c + $ hg ci -m "added b c" --secret + + $ hg glog -l1 -p --git + @ 1:12e9cc39ba19 added b c (secret) + | diff --git a/b b/b + ~ new file mode 100644 + --- /dev/null + +++ b/b + @@ -0,0 +1,1 @@ + +b + diff --git a/c b/c + new file mode 100644 + --- /dev/null + +++ b/c + @@ -0,0 +1,1 @@ + +c + +To create commits with the number of split + $ echo 0 > num + $ cat > editor.sh << '__EOF__' + > NUM=$(cat num) + > NUM=`expr "$NUM" + 1` + > echo "$NUM" > num + > echo "split$NUM" > "$1" + > __EOF__ + $ export HGEDITOR="\"sh\" \"editor.sh\"" + +Splitting + $ hg split -r . << EOF + > y + > y + > n + > c + > EOF + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + adding b + adding c + diff --git a/b b/b + new file mode 100644 + examine changes to 'b'? [Ynesfdaq?] y + + @@ -0,0 +1,1 @@ + +b + record change 1/2 to 'b'? [Ynesfdaq?] y + + diff --git a/c b/c + new file mode 100644 + examine changes to 'c'? [Ynesfdaq?] n + + created new head + (consider using topic for lightweight branches. See 'hg help topic') + continue splitting? [Ycdq?] c + + $ hg glog --git -p + @ 3:1f8c09b13fa2 split2 (secret) + | diff --git a/c b/c + | new file mode 100644 + | --- /dev/null + | +++ b/c + | @@ -0,0 +1,1 @@ + | +c + | + o 2:bcba06966846 split1 (secret) + | diff --git a/b b/b + | new file mode 100644 + | --- /dev/null + | +++ b/b + | @@ -0,0 +1,1 @@ + | +b + | + o 0:9092f1db7931 added a (draft) + diff --git a/a b/a + new file mode 100644 + --- /dev/null + +++ b/a + @@ -0,0 +1,1 @@ + +a + diff -r 2cbb9914d227 -r 7a779a288793 tests/test-stabilize-result.t --- a/tests/test-stabilize-result.t Tue Jan 22 12:54:43 2019 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,446 +0,0 @@ - $ cat >> $HGRCPATH < [defaults] - > amend=-d "0 0" - > [extensions] - > hgext.rebase= - > EOF - $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH - - $ glog() { - > hg log -G --template \ - > '{rev}:{node|short}@{branch}({phase}) bk:[{bookmarks}] {desc|firstline}\n' "$@" - > } - -Test evolve removing the changeset being evolved - - $ hg init empty - $ cd empty - $ echo a > a - $ hg ci -Am adda a - $ echo b > b - $ hg ci -Am addb b - $ echo a >> a - $ hg ci -m changea - $ hg bookmark changea - $ hg up 1 - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - (leaving bookmark changea) - $ echo a >> a - $ hg amend -m changea - 1 new orphan changesets - $ hg evolve -v --confirm - move:[2] changea - atop:[3] changea - perform evolve? [Ny] n - abort: evolve aborted by user - [255] - $ echo y | hg evolve -v --confirm --config ui.interactive=True - move:[2] changea - atop:[3] changea - perform evolve? [Ny] y - hg rebase -r cce2c55b8965 -d fb9d051ec0a4 - resolving manifests - evolution of 2:cce2c55b8965 created no changes to commit - - $ glog --hidden - @ 3:fb9d051ec0a4@default(draft) bk:[changea] changea - | - | x 2:cce2c55b8965@default(draft) bk:[] changea - | | - | x 1:102a90ea7b4a@default(draft) bk:[] addb - |/ - o 0:07f494440405@default(draft) bk:[] adda - - $ hg debugobsolete - 102a90ea7b4a3361e4082ed620918c261189a36a fb9d051ec0a450a4aa2ffc8c324979832ef88065 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'operation': 'amend', 'user': 'test'} - cce2c55b896511e0b6e04173c9450ba822ebc740 0 {102a90ea7b4a3361e4082ed620918c261189a36a} (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '0', 'operation': 'evolve', 'user': 'test'} - -Test evolve with conflict - - $ ls - a - b - $ hg pdiff a - diff -r 07f494440405 a - --- a/a Thu Jan 01 00:00:00 1970 +0000 - +++ b/a Thu Jan 01 00:00:00 1970 +0000 - @@ -1,1 +1,2 @@ - a - +a - $ echo 'newer a' >> a - $ hg ci -m 'newer a' - $ hg gdown - gdown have been deprecated in favor of previous - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - [3] changea - $ echo 'a' > a - $ hg amend - 1 new orphan changesets - $ hg evolve - move:[4] newer a - atop:[5] changea - merging a - warning: conflicts while merging a! (edit, then use 'hg resolve --mark') - fix conflicts and see `hg help evolve.interrupted` - [1] - $ hg revert -r "orphan()" a - $ hg diff - diff -r 66719795a494 a - --- a/a Thu Jan 01 00:00:00 1970 +0000 - +++ b/a Thu Jan 01 00:00:00 1970 +0000 - @@ -1,1 +1,3 @@ - a - +a - +newer a - $ hg evolve --continue - abort: unresolved merge conflicts (see 'hg help resolve') - [255] - $ hg resolve -m a - (no more unresolved files) - continue: hg evolve --continue - $ hg evolve --continue - evolving 4:3655f0f50885 "newer a" - working directory is now at 1cf0aacfd363 - -Stabilize latecomer with different parent -========================================= - -(the same-parent case is handled in test-evolve.t) - - $ glog - @ 6:1cf0aacfd363@default(draft) bk:[] newer a - | - o 5:66719795a494@default(draft) bk:[changea] changea - | - o 0:07f494440405@default(draft) bk:[] adda - -Add another commit - - $ hg gdown - gdown have been deprecated in favor of previous - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - [5] changea - $ echo 'c' > c - $ hg add c - $ hg commit -m 'add c' - created new head - -Get a successors of 8 on it - - $ hg pick 1cf0aacfd363 - picking 6:1cf0aacfd363 "newer a" - -Add real change to the successors - - $ echo 'babar' >> a - $ hg amend - -Make precursors public - - $ hg phase --hidden --public 1cf0aacfd363 - 1 new phase-divergent changesets - $ glog - @ 9:99c21c89bcef@default(draft) bk:[] newer a - | - o 7:7bc2f5967f5e@default(draft) bk:[] add c - | - | o 6:1cf0aacfd363@default(public) bk:[] newer a - |/ - o 5:66719795a494@default(public) bk:[changea] changea - | - o 0:07f494440405@default(public) bk:[] adda - - -Stabilize! - - $ hg evolve --any --dry-run --phase-divergent - recreate:[9] newer a - atop:[6] newer a - hg rebase --rev 99c21c89bcef --dest 66719795a494; - hg update 1cf0aacfd363; - hg revert --all --rev 99c21c89bcef; - hg commit --msg "phase-divergent update to 99c21c89bcef" - $ hg evolve --any --confirm --phase-divergent - recreate:[9] newer a - atop:[6] newer a - perform evolve? [Ny] n - abort: evolve aborted by user - [255] - $ echo y | hg evolve --any --confirm --config ui.interactive=True --phase-divergent - recreate:[9] newer a - 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 - @ 11:8fc63fe1f297@default(draft) bk:[] phase-divergent update to 1cf0aacfd363: - | - | o 7:7bc2f5967f5e@default(draft) bk:[] add c - | | - o | 6:1cf0aacfd363@default(public) bk:[] newer a - |/ - o 5:66719795a494@default(public) bk:[changea] changea - | - o 0:07f494440405@default(public) bk:[] adda - - $ hg exp - # HG changeset patch - # User test - # Date 0 0 - # Thu Jan 01 00:00:00 1970 +0000 - # Node ID 8fc63fe1f297f356d1156bbbbe865b9911efad74 - # Parent 1cf0aacfd36310b18e403e1594871187e0364a82 - phase-divergent update to 1cf0aacfd363: - - newer a - - diff -r 1cf0aacfd363 -r 8fc63fe1f297 a - --- a/a Thu Jan 01 00:00:00 1970 +0000 - +++ b/a Thu Jan 01 00:00:00 1970 +0000 - @@ -1,3 +1,4 @@ - a - a - newer a - +babar - -Stabilize divergent changesets with same parent -=============================================== - - $ rm a.orig - $ hg up 7bc2f5967f5e - 2 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ cat << EOF >> a - > flore - > arthur - > zephir - > some - > less - > conflict - > EOF - $ hg ci -m 'More addition' - $ glog - @ 12:3932c176bbaa@default(draft) bk:[] More addition - | - | o 11:8fc63fe1f297@default(draft) bk:[] phase-divergent update to 1cf0aacfd363: - | | - o | 7:7bc2f5967f5e@default(draft) bk:[] add c - | | - | o 6:1cf0aacfd363@default(public) bk:[] newer a - |/ - o 5:66719795a494@default(public) bk:[changea] changea - | - o 0:07f494440405@default(public) bk:[] adda - - $ echo 'babar' >> a - $ hg amend - $ hg up --hidden 3932c176bbaa - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset 3932c176bbaa - (hidden revision '3932c176bbaa' was rewritten as: d2f173e25686) - working directory parent is obsolete! (3932c176bbaa) - (use 'hg evolve' to update to its successor: d2f173e25686) - $ mv a a.old - $ echo 'jungle' > a - $ cat a.old >> a - $ rm a.old - $ hg amend - 2 new content-divergent changesets - $ glog - @ 14:eacc9c8240fe@default(draft) bk:[] More addition - | - | * 13:d2f173e25686@default(draft) bk:[] More addition - |/ - | o 11:8fc63fe1f297@default(draft) bk:[] phase-divergent update to 1cf0aacfd363: - | | - o | 7:7bc2f5967f5e@default(draft) bk:[] add c - | | - | o 6:1cf0aacfd363@default(public) bk:[] newer a - |/ - o 5:66719795a494@default(public) bk:[changea] changea - | - o 0:07f494440405@default(public) bk:[] adda - - -Stabilize it - - $ hg evolve -qn --confirm --content-divergent - merge:[14] More addition - with: [13] More addition - base: [12] More addition - perform evolve? [Ny] n - abort: evolve aborted by user - [255] - $ echo y | hg evolve -qn --confirm --config ui.interactive=True --content-divergent - merge:[14] More addition - with: [13] More addition - base: [12] More addition - perform evolve? [Ny] y - hg update -c eacc9c8240fe && - hg merge d2f173e25686 && - hg commit -m "auto merge resolving conflict between eacc9c8240fe and d2f173e25686"&& - hg up -C 3932c176bbaa && - hg revert --all --rev tip && - hg commit -m "`hg log -r eacc9c8240fe --template={desc}`"; - $ hg evolve -v --content-divergent - merge:[14] More addition - with: [13] More addition - base: [12] More addition - merging "other" content-divergent changeset 'd2f173e25686' - resolving manifests - merging a - 0 files updated, 1 files merged, 0 files removed, 0 files unresolved - committing files: - a - committing manifest - committing changelog - working directory is now at 4d6ed26797bc - $ hg st - $ glog - @ 15:4d6ed26797bc@default(draft) bk:[] More addition - | - | o 11:8fc63fe1f297@default(draft) bk:[] phase-divergent update to 1cf0aacfd363: - | | - o | 7:7bc2f5967f5e@default(draft) bk:[] add c - | | - | o 6:1cf0aacfd363@default(public) bk:[] newer a - |/ - o 5:66719795a494@default(public) bk:[changea] changea - | - o 0:07f494440405@default(public) bk:[] adda - - $ hg summary - parent: 15:4d6ed26797bc tip - More addition - branch: default - commit: (clean) - update: 2 new changesets, 2 branch heads (merge) - phases: 3 draft - $ hg export . - # HG changeset patch - # User test - # Date 0 0 - # Thu Jan 01 00:00:00 1970 +0000 - # Node ID 4d6ed26797bc392c0099e48402a5134e669f1a60 - # Parent 7bc2f5967f5e4ed277f60a89b7b04cc5d6407ced - More addition - - diff -r 7bc2f5967f5e -r 4d6ed26797bc a - --- a/a Thu Jan 01 00:00:00 1970 +0000 - +++ b/a Thu Jan 01 00:00:00 1970 +0000 - @@ -1,1 +1,9 @@ - +jungle - a - +flore - +arthur - +zephir - +some - +less - +conflict - +babar - -Check conflict during divergence resolution -------------------------------------------------- - - $ hg up --hidden 3932c176bbaa - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset 3932c176bbaa - (hidden revision '3932c176bbaa' was rewritten as: 4d6ed26797bc) - working directory parent is obsolete! (3932c176bbaa) - (use 'hg evolve' to update to its successor: 4d6ed26797bc) - $ echo 'gotta break' >> a - $ hg amend - 2 new content-divergent changesets -# reamend so that the case is not the first precursor. - $ hg amend -m "More addition (2)" - $ hg phase 'contentdivergent()' - 15: draft - 17: draft - - $ glog - @ 17:0b336205a5d0@default(draft) bk:[] More addition (2) - | - | * 15:4d6ed26797bc@default(draft) bk:[] More addition - |/ - | o 11:8fc63fe1f297@default(draft) bk:[] phase-divergent update to 1cf0aacfd363: - | | - o | 7:7bc2f5967f5e@default(draft) bk:[] add c - | | - | o 6:1cf0aacfd363@default(public) bk:[] newer a - |/ - o 5:66719795a494@default(public) bk:[changea] changea - | - o 0:07f494440405@default(public) bk:[] adda - - - $ hg evolve -qn --content-divergent - hg update -c 0b336205a5d0 && - hg merge 4d6ed26797bc && - hg commit -m "auto merge resolving conflict between 0b336205a5d0 and 4d6ed26797bc"&& - hg up -C 3932c176bbaa && - hg revert --all --rev tip && - hg commit -m "`hg log -r 0b336205a5d0 --template={desc}`"; - $ hg evolve --content-divergent - merge:[17] More addition (2) - with: [15] More addition - base: [12] More addition - merging "other" content-divergent changeset '4d6ed26797bc' - merging a - warning: conflicts while merging a! (edit, then use 'hg resolve --mark') - 0 files updated, 0 files merged, 0 files removed, 1 files unresolved - fix conflicts and see `hg help evolve.interrupted` - [1] - - $ cat > a < jungle - > a - > flore - > arthur - > zephir - > some - > less - > conflict - > babar - > EOF - - $ hg resolve -m - (no more unresolved files) - continue: hg evolve --continue - $ hg evolve --continue - working directory is now at e8746835a2a1 - $ glog - @ 18:e8746835a2a1@default(draft) bk:[] More addition (2) - | - | o 11:8fc63fe1f297@default(draft) bk:[] phase-divergent update to 1cf0aacfd363: - | | - o | 7:7bc2f5967f5e@default(draft) bk:[] add c - | | - | o 6:1cf0aacfd363@default(public) bk:[] newer a - |/ - o 5:66719795a494@default(public) bk:[changea] changea - | - o 0:07f494440405@default(public) bk:[] adda - - $ hg exp - # HG changeset patch - # User test - # Date 0 0 - # Thu Jan 01 00:00:00 1970 +0000 - # Node ID e8746835a2a13122bc8c0ed84fe4ee35649af25d - # Parent 7bc2f5967f5e4ed277f60a89b7b04cc5d6407ced - More addition (2) - - diff -r 7bc2f5967f5e -r e8746835a2a1 a - --- a/a Thu Jan 01 00:00:00 1970 +0000 - +++ b/a Thu Jan 01 00:00:00 1970 +0000 - @@ -1,1 +1,9 @@ - +jungle - a - +flore - +arthur - +zephir - +some - +less - +conflict - +babar diff -r 2cbb9914d227 -r 7a779a288793 tests/test-stack-branch.t --- a/tests/test-stack-branch.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-stack-branch.t Thu Apr 11 22:41:41 2019 +0200 @@ -105,7 +105,7 @@ phases: 4 draft Case with some of the branch unstable ------------------------------------- +------------------------------------- $ echo bbb > ddd $ hg commit --amend @@ -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) @@ -217,7 +217,7 @@ s1: c_c s0^ c_b (base) -Case with multiple heads on the topic with unstability involved +Case with multiple heads on the topic with instability involved --------------------------------------------------------------- We amend the message to make sure the display base pick the right changeset @@ -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 2cbb9914d227 -r 7a779a288793 tests/test-topic-stack-complex.t --- a/tests/test-topic-stack-complex.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-topic-stack-complex.t Thu Apr 11 22:41:41 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 2cbb9914d227 -r 7a779a288793 tests/test-topic-stack-data.t --- a/tests/test-topic-stack-data.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-topic-stack-data.t Thu Apr 11 22:41:41 2019 +0200 @@ -61,7 +61,7 @@ (see 'hg help topics' for more information) $ mkcommit baz_b -A simple topic with unstability +A simple topic with instability $ hg up 'desc(base_d)' 1 files updated, 0 files merged, 2 files removed, 0 files unresolved @@ -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 2cbb9914d227 -r 7a779a288793 tests/test-topic-stack.t --- a/tests/test-topic-stack.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-topic-stack.t Thu Apr 11 22:41:41 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)] @@ -477,8 +477,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) @@ -756,24 +756,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 @@ -830,24 +830,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 -------------------------------- @@ -886,7 +886,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) @@ -966,7 +966,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 2cbb9914d227 -r 7a779a288793 tests/test-topic-tutorial.t --- a/tests/test-topic-tutorial.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-topic-tutorial.t Thu Apr 11 22:41:41 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 2cbb9914d227 -r 7a779a288793 tests/test-touch.t --- a/tests/test-touch.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-touch.t Thu Apr 11 22:41:41 2019 +0200 @@ -161,3 +161,12 @@ rewritten(.*) as [0-9a-f]{12} using touch by test (.*) (re) note: testing with no successor + +Public phase + + $ hg phase --public -r 2 + $ hg touch 2 + abort: cannot touch public changesets: * (glob) + (see 'hg help phases' for details) + [255] + $ hg touch --duplicate 2 diff -r 2cbb9914d227 -r 7a779a288793 tests/test-uncommit.t --- a/tests/test-uncommit.t Tue Jan 22 12:54:43 2019 -0500 +++ b/tests/test-uncommit.t Thu Apr 11 22:41:41 2019 +0200 @@ -514,3 +514,22 @@ (use 'hg prune .' to remove it) $ hg status ? foo + +Bad explicit paths abort, like the bundled commit extension + + $ hg uncommit foo + abort: cannot uncommit "foo" + (file was untracked in working directory parent) + [255] + + $ hg ci -Aqm 'add foo' + $ hg uncommit bar + abort: cannot uncommit "bar" + (file does not exist) + [255] + $ hg uncommit d + abort: cannot uncommit "d" + (file was not changed in working directory parent) + [255] + + $ hg status diff -r 2cbb9914d227 -r 7a779a288793 tests/test-unstability-resolution-result.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-unstability-resolution-result.t Thu Apr 11 22:41:41 2019 +0200 @@ -0,0 +1,215 @@ +================================================================= +Test automatic unstability resolution for multiple advanced cases +================================================================= + +There are dedicated test case for each instability, but this file check some +basic case for each type. + +XXX dispatching each these test case in appropriate file would make sense. + + $ cat >> $HGRCPATH < [defaults] + > amend=-d "0 0" + > [extensions] + > hgext.rebase= + > EOF + $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH + + $ glog() { + > hg log -G --template \ + > '{rev}:{node|short}@{branch}({phase}) bk:[{bookmarks}] {desc|firstline}\n' "$@" + > } + +Test evolve removing the orphan changeset being evolved + + $ hg init empty + $ cd empty + $ echo a > a + $ hg ci -Am adda a + $ echo b > b + $ hg ci -Am addb b + $ echo a >> a + $ hg ci -m changea + $ hg bookmark changea + $ hg up 1 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (leaving bookmark changea) + $ echo a >> a + $ hg amend -m changea + 1 new orphan changesets + $ hg evolve -v --confirm + move:[2] changea + atop:[3] changea + perform evolve? [Ny] n + abort: evolve aborted by user + [255] + $ echo y | hg evolve -v --confirm --config ui.interactive=True + move:[2] changea + atop:[3] changea + perform evolve? [Ny] y + hg rebase -r cce2c55b8965 -d fb9d051ec0a4 + resolving manifests + evolution of 2:cce2c55b8965 created no changes to commit + + $ glog --hidden + @ 3:fb9d051ec0a4@default(draft) bk:[changea] changea + | + | x 2:cce2c55b8965@default(draft) bk:[] changea + | | + | x 1:102a90ea7b4a@default(draft) bk:[] addb + |/ + o 0:07f494440405@default(draft) bk:[] adda + + $ hg debugobsolete + 102a90ea7b4a3361e4082ed620918c261189a36a fb9d051ec0a450a4aa2ffc8c324979832ef88065 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'operation': 'amend', 'user': 'test'} + cce2c55b896511e0b6e04173c9450ba822ebc740 0 {102a90ea7b4a3361e4082ed620918c261189a36a} (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '0', 'operation': 'evolve', 'user': 'test'} + +Test evolve of orphan that run into conflict + + $ ls + a + b + $ hg pdiff a + diff -r 07f494440405 a + --- a/a Thu Jan 01 00:00:00 1970 +0000 + +++ b/a Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,2 @@ + a + +a + $ echo 'newer a' >> a + $ hg ci -m 'newer a' + $ hg gdown + gdown have been deprecated in favor of previous + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + [3] changea + $ echo 'a' > a + $ hg amend + 1 new orphan changesets + $ hg evolve + move:[4] newer a + atop:[5] changea + merging a + warning: conflicts while merging a! (edit, then use 'hg resolve --mark') + fix conflicts and see `hg help evolve.interrupted` + [1] + $ hg revert -r "orphan()" a + $ hg diff + diff -r 66719795a494 a + --- a/a Thu Jan 01 00:00:00 1970 +0000 + +++ b/a Thu Jan 01 00:00:00 1970 +0000 + @@ -1,1 +1,3 @@ + a + +a + +newer a + $ hg evolve --continue + abort: unresolved merge conflicts (see 'hg help resolve') + [255] + $ hg resolve -m a + (no more unresolved files) + continue: hg evolve --continue + $ hg evolve --continue + evolving 4:3655f0f50885 "newer a" + working directory is now at 1cf0aacfd363 + +Stabilize phase-divergent changesets with a different parent +============================================================ + +(the same-parent case is handled in test-evolve.t) + + $ glog + @ 6:1cf0aacfd363@default(draft) bk:[] newer a + | + o 5:66719795a494@default(draft) bk:[changea] changea + | + o 0:07f494440405@default(draft) bk:[] adda + + +Add another commit + + $ hg gdown + gdown have been deprecated in favor of previous + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + [5] changea + $ echo 'c' > c + $ hg add c + $ hg commit -m 'add c' + created new head + +Get a successors of 8 on it + + $ hg pick 1cf0aacfd363 + picking 6:1cf0aacfd363 "newer a" + +Add real change to the successors + + $ echo 'babar' >> a + $ hg amend + +Make precursors public + + $ hg phase --hidden --public 1cf0aacfd363 + 1 new phase-divergent changesets + $ glog + @ 9:99c21c89bcef@default(draft) bk:[] newer a + | + o 7:7bc2f5967f5e@default(draft) bk:[] add c + | + | o 6:1cf0aacfd363@default(public) bk:[] newer a + |/ + o 5:66719795a494@default(public) bk:[changea] changea + | + o 0:07f494440405@default(public) bk:[] adda + + +Stabilize! + + $ hg evolve --any --dry-run --phase-divergent + recreate:[9] newer a + atop:[6] newer a + hg rebase --rev 99c21c89bcef --dest 66719795a494; + hg update 1cf0aacfd363; + hg revert --all --rev 99c21c89bcef; + hg commit --msg "phase-divergent update to 99c21c89bcef" + $ hg evolve --any --confirm --phase-divergent + recreate:[9] newer a + atop:[6] newer a + perform evolve? [Ny] n + abort: evolve aborted by user + [255] + $ echo y | hg evolve --any --confirm --config ui.interactive=True --phase-divergent + recreate:[9] newer a + atop:[6] newer a + perform evolve? [Ny] y + rebasing to destination parent: 66719795a494 + committed as 8fc63fe1f297 + working directory is now at 8fc63fe1f297 + $ glog + @ 11:8fc63fe1f297@default(draft) bk:[] phase-divergent update to 1cf0aacfd363: + | + | o 7:7bc2f5967f5e@default(draft) bk:[] add c + | | + o | 6:1cf0aacfd363@default(public) bk:[] newer a + |/ + o 5:66719795a494@default(public) bk:[changea] changea + | + o 0:07f494440405@default(public) bk:[] adda + + $ hg exp + # HG changeset patch + # User test + # Date 0 0 + # Thu Jan 01 00:00:00 1970 +0000 + # Node ID 8fc63fe1f297f356d1156bbbbe865b9911efad74 + # Parent 1cf0aacfd36310b18e403e1594871187e0364a82 + phase-divergent update to 1cf0aacfd363: + + newer a + + diff -r 1cf0aacfd363 -r 8fc63fe1f297 a + --- a/a Thu Jan 01 00:00:00 1970 +0000 + +++ b/a Thu Jan 01 00:00:00 1970 +0000 + @@ -1,3 +1,4 @@ + a + a + newer a + +babar diff -r 2cbb9914d227 -r 7a779a288793 tests/test-unstable-orphan.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-unstable-orphan.t Thu Apr 11 22:41:41 2019 +0200 @@ -0,0 +1,131 @@ +================================== +Test for "orphan" type instability +================================== + +This file gather test case around the "orphan" changeset instability. This +instability happens when a changesets has obsolete ancestors. + + $ cat >> $HGRCPATH < [defaults] + > amend=-d "0 0" + > fold=-d "0 0" + > [web] + > push_ssl = false + > allow_push = * + > [phases] + > publish = False + > [diff] + > git = 1 + > unified = 0 + > [ui] + > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline}\n + > [extensions] + > EOF + $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH + $ mkcommit() { + > echo "$1" > "$1" + > hg add "$1" + > hg ci -m "add $1" + > } + + $ mkstack() { + > # Creates a stack of commit based on $1 with messages from $2, $3 .. + > hg update "$1" -C + > shift + > mkcommits $* + > } + + $ mkcommits() { + > for i in $@; do mkcommit $i ; done + > } + +orphan parent is obsolete with a single successor +================================================= + +Test orphan resolution for a changeset orphan because its parent is obsolete +with one successor. + + $ hg init test1 + $ cd test1 + $ mkcommits _a _b _c + $ hg up "desc(_b)" + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg amend -m "bprime" + 1 new orphan changesets + $ hg log -G + @ 3:36050226a9b9@default(draft) bprime + | + | * 2:102002290587@default(draft) add _c + | | + | x 1:37445b16603b@default(draft) add _b + |/ + o 0:135f39f4bd78@default(draft) add _a + + + $ hg evo --all --any --orphan + move:[2] add _c + atop:[3] bprime + working directory is now at fdcf3523a74d + $ hg log -G + @ 4:fdcf3523a74d@default(draft) add _c + | + o 3:36050226a9b9@default(draft) bprime + | + o 0:135f39f4bd78@default(draft) add _a + + + $ cd .. + + +orphan parent is obsolete with a multiple successors (reversed order) +===================================================================== + +Test orphan resolution for a changeset orphan because its parent is obsolete +with multiple successors on the same branch but in reverse order (cross-split). + + $ hg init test5 + $ cd test5 + $ mkcommits _a _b _c + $ hg up "desc(_a)" + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ mkcommits bprimesplit1 bprimesplit2 + created new head + $ hg prune "desc(_b)" -s "desc(bprimesplit1) + desc(bprimesplit2)" --split + 1 changesets pruned + 1 new orphan changesets + $ hg up "desc(_a)" + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ mkcommits bsecondsplit1 bsecondsplit2 + created new head + $ hg prune "desc(bprimesplit1)" -s "desc(bsecondsplit2)" + 1 changesets pruned + 1 new orphan changesets + $ hg prune "desc(bprimesplit2)" -s "desc(bsecondsplit1)" + 1 changesets pruned + $ hg log -G + @ 6:59b942dbda14@default(draft) add bsecondsplit2 + | + o 5:8ffdae67d696@default(draft) add bsecondsplit1 + | + | * 2:102002290587@default(draft) add _c + | | + | x 1:37445b16603b@default(draft) add _b + |/ + o 0:135f39f4bd78@default(draft) add _a + + + $ hg evo --all --any --orphan + move:[2] add _c + atop:[6] add bsecondsplit2 + working directory is now at 98e3f21461ff + $ hg log -G + @ 7:98e3f21461ff@default(draft) add _c + | + o 6:59b942dbda14@default(draft) add bsecondsplit2 + | + o 5:8ffdae67d696@default(draft) add bsecondsplit1 + | + o 0:135f39f4bd78@default(draft) add _a + + + $ cd .. diff -r 2cbb9914d227 -r 7a779a288793 tests/test-unstable.t --- a/tests/test-unstable.t Tue Jan 22 12:54:43 2019 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,121 +0,0 @@ - $ cat >> $HGRCPATH < [defaults] - > amend=-d "0 0" - > fold=-d "0 0" - > [web] - > push_ssl = false - > allow_push = * - > [phases] - > publish = False - > [diff] - > git = 1 - > unified = 0 - > [ui] - > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline}\n - > [extensions] - > EOF - $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH - $ mkcommit() { - > echo "$1" > "$1" - > hg add "$1" - > hg ci -m "add $1" - > } - - $ mkstack() { - > # Creates a stack of commit based on $1 with messages from $2, $3 .. - > hg update "$1" -C - > shift - > mkcommits $* - > } - - $ mkcommits() { - > for i in $@; do mkcommit $i ; done - > } - -============================================================================== -Test instability resolution for a changeset unstable because its parent -is obsolete with one successor -============================================================================== - $ hg init test1 - $ cd test1 - $ mkcommits _a _b _c - $ hg up "desc(_b)" - 0 files updated, 0 files merged, 1 files removed, 0 files unresolved - $ hg amend -m "bprime" - 1 new orphan changesets - $ hg log -G - @ 3:36050226a9b9@default(draft) bprime - | - | * 2:102002290587@default(draft) add _c - | | - | x 1:37445b16603b@default(draft) add _b - |/ - o 0:135f39f4bd78@default(draft) add _a - - - $ hg evo --all --any --orphan - move:[2] add _c - atop:[3] bprime - working directory is now at fdcf3523a74d - $ hg log -G - @ 4:fdcf3523a74d@default(draft) add _c - | - o 3:36050226a9b9@default(draft) bprime - | - o 0:135f39f4bd78@default(draft) add _a - - - $ cd .. - -=============================================================================== -Test instability resolution for a changeset unstable because its parent -is obsolete with multiple successors on one branches but in reverse -order (cross-split). -============================================================================== - - $ hg init test5 - $ cd test5 - $ mkcommits _a _b _c - $ hg up "desc(_a)" - 0 files updated, 0 files merged, 2 files removed, 0 files unresolved - $ mkcommits bprimesplit1 bprimesplit2 - created new head - $ hg prune "desc(_b)" -s "desc(bprimesplit1) + desc(bprimesplit2)" --split - 1 changesets pruned - 1 new orphan changesets - $ hg up "desc(_a)" - 0 files updated, 0 files merged, 2 files removed, 0 files unresolved - $ mkcommits bsecondsplit1 bsecondsplit2 - created new head - $ hg prune "desc(bprimesplit1)" -s "desc(bsecondsplit2)" - 1 changesets pruned - 1 new orphan changesets - $ hg prune "desc(bprimesplit2)" -s "desc(bsecondsplit1)" - 1 changesets pruned - $ hg log -G - @ 6:59b942dbda14@default(draft) add bsecondsplit2 - | - o 5:8ffdae67d696@default(draft) add bsecondsplit1 - | - | * 2:102002290587@default(draft) add _c - | | - | x 1:37445b16603b@default(draft) add _b - |/ - o 0:135f39f4bd78@default(draft) add _a - - - $ hg evo --all --any --orphan - move:[2] add _c - atop:[6] add bsecondsplit2 - working directory is now at 98e3f21461ff - $ hg log -G - @ 7:98e3f21461ff@default(draft) add _c - | - o 6:59b942dbda14@default(draft) add bsecondsplit2 - | - o 5:8ffdae67d696@default(draft) add bsecondsplit1 - | - o 0:135f39f4bd78@default(draft) add _a - - - $ cd ..