# HG changeset patch # User Anton Shestakov # Date 1582906248 -25200 # Node ID 8d20c0af010adf1777f71d3f6b0fd8e0ac58ff41 # Parent f4f2cc332bb7ec2ae5a051e4c3b3c49f08361d76# Parent dd9037486a907cb89648f5f02ffdcfd127ab8239 test-compat: merge mercurial-5.2 into mercurial-5.1 diff -r dd9037486a90 -r 8d20c0af010a .gitlab-ci.yml --- a/.gitlab-ci.yml Thu Jan 30 14:32:04 2020 +0700 +++ b/.gitlab-ci.yml Fri Feb 28 23:10:48 2020 +0700 @@ -3,6 +3,16 @@ script: - hg files -0 'set:(**.py or grep("^#!.*python")) - removed()' -X hgext3rd/evolve/thirdparty | xargs -0 flake8 +pytype: + image: octobus/ci-py3-hgext3rd + script: + - hg pull -R /ci/repos/mercurial/ + - hg_rev=$(tests/testlib/map-hg-rev.sh "$(hg log -r . -T '{branch}')") + - hg -R /ci/repos/mercurial/ update "$hg_rev" + - jobs=$(python -c 'import multiprocessing; print multiprocessing.cpu_count()') + - pytype -P /ci/repos/mercurial/:hgext3rd -k hgext3rd -x hgext3rd/evolve/thirdparty -j $jobs || true + when: manual + tests-py2-cext: image: octobus/ci-py2-hgext3rd script: @@ -34,3 +44,14 @@ - hg_rev=$(tests/testlib/map-hg-rev.sh "$(hg log -r . -T '{branch}')") - hg -R /ci/repos/mercurial/ update "$hg_rev" - (cd tests; python3 /ci/repos/mercurial/tests/run-tests.py --color=always --pure) + +doc: + image: octobus/ci-py2-evolve-doc + script: + - cd docs/ + - make + variables: + LANG: en_us.UTF-8 + artifacts: + paths: + - html/* diff -r dd9037486a90 -r 8d20c0af010a .gitlab/issue_templates/new-version.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.gitlab/issue_templates/new-version.md Fri Feb 28 23:10:48 2020 +0700 @@ -0,0 +1,29 @@ +This is the actual check list for releasing evolve version X.Y.Z + +More details in the [README file](README#L179). + +Preparation + +* [ ] merges with compatibility branches +* [ ] compatibility tests are happy +* [ ] update `testedwith` field +* [ ] make sure the changelog is up to data +* [ ] [prepare an announcement for the list/website](https://mypads.framapad.org/mypads/?/mypads/group/octobus-public-5d3rw470w/pad/view/evolution-announce-iswcp7qx) +* [ ] sanity check install and sdist targets of setup.py + +Releasing + +* [ ] add the current date to the changelog +* [ ] update the `__version__` field of all relevant extensions +* [ ] create a new Debian entry +* [ ] tag the version +* [ ] move the `@` bookmark on the new tag +* [ ] push/publish the tag to the main repository +* [ ] upload the tarball to PyPI +* [ ] add `.dev` to the `__version__` field +* [ ] merge stable into default +* [ ] push the result on the main repo +* [ ] send the announcement by email to evolve-testers@mercurial-scm.org +* [ ] send the announcement by email to mercurial@mercurial-scm.org +* [ ] publish the announcement as a blog on https://octobus.net/blog/ +* [ ] tweet about it diff -r dd9037486a90 -r 8d20c0af010a .hgtags --- a/.hgtags Thu Jan 30 14:32:04 2020 +0700 +++ b/.hgtags Fri Feb 28 23:10:48 2020 +0700 @@ -83,3 +83,5 @@ 6f37fdad7ac123ca0a76872ac4639bd1f3c248f7 9.1.0 40795751be1c329ec23202ecd79ba45623e1df66 9.2.0 d989bab720e5f7638a9e58fda76cf3f4b40d0611 9.2.1 +ef41094c34e162eb32ef24bf66d9776d1112751a 9.2.2 +583dc6ef3eb21fbf6574021136f32b8a1163506c 9.3.0 diff -r dd9037486a90 -r 8d20c0af010a CHANGELOG --- a/CHANGELOG Thu Jan 30 14:32:04 2020 +0700 +++ b/CHANGELOG Fri Feb 28 23:10:48 2020 +0700 @@ -1,25 +1,48 @@ Changelog ========= -9.2.2 - in progress +9.3.0 -- 2020-03-04 ------------------- - * pick: don't create any successors when there were no changes (issue6093), - * metaedit: don't change commit date by default (issue5994), - * rewind: preserve date - * py3: fix setup.py --version - * py3: fix documentation generation - * py3: fix some exception formatting + * compat: compatibility with Mercurial 5.3 + * compat: drop compatibility with Mercurial 4.5 + * compat: cleanup old compatibility code for Mercurial < 4.5 + + * evolve: extensive cleanup of functions, template keywords and compatibility + code related to obsfate and successorssets + * evolve: add content divergence checking to the standard pre-rewrite check + * evolve: improve the message associated with content divergence + * evolve: correctly handle --continue and --stop when relocating + content-divergent changesets + + * exchange: dropped more bundle-1 related dead code + + * help: categorizing evolve and topic commands + + * obslog: make templatable + * obslog: show folds and use more specific verbs when possible + + * topic: add a `experimental.topic.server-gate-topic-changesets` config + +9.2.2 -- 2020-01-31 +------------------- + + * amend: cleany abort when both `--patch` and `--extract` are passed + * compatibility for changes in upcoming Mercurial 5.3 * debian: allow to build with python 3 - * topic: add more options to command synopsis string - * evolve: use more often seen metavariables in command synopsis strings * documentation: update text and add missing figures - * amend: cleany abort when both `--patch` and `--extract` are passed * evolve: also merge the date field when solving content-divergence - * compatibility for changes in upcoming Mercurial 5.3 * evolve: fix content-divergence resolution when p1 is null (issue6201) * evolve: make sure divergence resolution doesn't undo changes (issue6203) * evolve: preserve date when resolving content-divergence (issue6202) + * evolve: use more often seen metavariables in command synopsis strings + * metaedit: don't change commit date by default (issue5994), + * pick: don't create any successors when there were no changes (issue6093), + * py3: fix documentation generation + * py3: fix setup.py --version + * py3: fix some exception formatting + * rewind: preserve date + * topic: add more options to command synopsis string * topic: fix a bug in logic of choosing destination for hg update * topic: fix a bug in logic to choose destination when no active topic diff -r dd9037486a90 -r 8d20c0af010a MANIFEST.in --- a/MANIFEST.in Thu Jan 30 14:32:04 2020 +0700 +++ b/MANIFEST.in Fri Feb 28 23:10:48 2020 +0700 @@ -1,23 +1,17 @@ -exclude contrib +prune contrib +prune debian +prune .gitlab +prune hgext3rd/evolve/hack + exclude .hg-format-source -recursive-exclude contrib * -exclude hgext3rd/evolve/hack exclude .gitlab-ci.yml -recursive-exclude hgext3rd/evolve/hack * exclude hgext3rd/evolve/legacy.py exclude Makefile exclude tests/test-drop.t exclude tests/test-inhibit.t exclude tests/test-oldconvert.t -exclude docs/tutorial/.netlify +include CHANGELOG include COPYING -include docs/figures/hgview-example.png -include docs/makefile -include docs/*.py -include docs/README -include docs/*.rst -include docs/static/*.svg -include docs/tutorials/*.t include hgext3rd/__init__.py include hgext3rd/evolve/*.py include hgext3rd/evolve/thirdparty/*.py @@ -25,19 +19,19 @@ include hgext3rd/topic/README include MANIFEST.in include README -include CHANGELOG include setup.py include tests/*.py include tests/*.sh include tests/testlib/*.sh include tests/*.t -recursive-include docs/tutorial *.rst -recursive-include docs/tutorial *.css + +exclude docs/tutorial/.netlify +include docs/makefile +include docs/*.py +include docs/README +include docs/*.rst +include docs/static/*.svg +include docs/tutorials/*.t include docs/tutorial/standalone.html -recursive-include docs/tutorial *.js -recursive-include docs/tutorial *.md -recursive-include docs/tutorial *.py -recursive-include docs/tutorial *.sh -recursive-include docs/tutorial *.t -prune debian -recursive-include docs/figures *.svg +recursive-include docs/figures *.svg *.png +recursive-include docs/tutorial *.css *.js *.md *.py *.rst *.sh *.t diff -r dd9037486a90 -r 8d20c0af010a README --- a/README Thu Jan 30 14:32:04 2020 +0700 +++ b/README Fri Feb 28 23:10:48 2020 +0700 @@ -117,7 +117,7 @@ .. _evolution: https://bz.mercurial-scm.org/buglist.cgi?component=evolution&query_format=advanced&resolution=--- The recommended way is to create Merge Request on -https://dev.heptapod.net/mercurial/evolve. To do so, create an account and +https://foss.heptapod.net/mercurial/evolve. To do so, create an account and request access. You'll then be able to create topic based merge request. Alternatively, you can use the patchbomb extension to send email to `mercurial @@ -175,3 +175,61 @@ byteify-strings = python3 ~/workspace/octobus/mercurial-devel/contrib/byteify-strings.py --dictiter --treat-as-kwargs kwargs opts commitopts TROUBLES --allow-attr-methods byteify-strings:mode.input = file byteify-strings:mode.output = pipe + +Release Checklist +================= + +* make sure the tests are happy on all supported versions, + + You can use the `contrib/merge-test-compat.sh` to merge with the test + compatibility branches. + +* make sure there is no code difference between the compat branches and stable + (no diff within `hgext3rd/`), + +* update the `testedwith` variable for all extensions (remove '.dev'): + + - hgext3rd/evolve/metadata.py + - hgext3rd/topic/__init__.py + - hgext3rd/pullbundle.py + +* make sure the changelog is up to date, + +* add a date to the changelog entry for the target version, + +* update the `__version__` field of all relevant extensions: + + - hgext3rd/evolve/metadata.py + - hgext3rd/topic/__init__.py + - hgext3rd/pullbundle.py (if touched) + +* create a new Debian entry: + + - debchange --newversion x.y.z-1 "new upstream release" + - debchange --release + +* sanity check install and sdist targets of setup.py: + + - python setup.py install --home=$(mktemp -d) + - python setup.py sdist + +* tag the commit, + +* push and publish the tag, + +* upload the tarball to PyPI, + +* make an announcement on evolve-testers@mercurial-scm.org (possibly on + mercurial@mercurial-scm.org too), + +* bump versions of all extensions and add '.dev' (see existing commits as an + example): + + - hgext3rd/evolve/metadata.py + - hgext3rd/topic/__init__.py + - hgext3rd/pullbundle.py + + The version we use on the stable branch during development should be + `x.y.z+1.dev`. The version of the default branch should be `x.y+1.0.dev`. + +* merge stable into default. diff -r dd9037486a90 -r 8d20c0af010a debian/changelog --- a/debian/changelog Thu Jan 30 14:32:04 2020 +0700 +++ b/debian/changelog Fri Feb 28 23:10:48 2020 +0700 @@ -1,4 +1,16 @@ -mercurial-evolve (9.2.1-1.1) UNRELEASED; urgency=medium +mercurial-evolve (9.3.0-1) unstable; urgency=medium + + * new upstream release + + -- Pierre-Yves David Wed, 04 Mar 2020 16:47:58 +0100 + +mercurial-evolve (9.2.2-1) unstable; urgency=medium + + * new upstream release + + -- Anton Shestakov Fri, 31 Jan 2020 14:10:11 +0700 + +mercurial-evolve (9.2.1-1.1) unstable; urgency=medium * build with pybuild and sphinxdoc * update debhelper compat to 10 diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/__init__.py --- a/hgext3rd/evolve/__init__.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/__init__.py Fri Feb 28 23:10:48 2020 +0700 @@ -251,7 +251,6 @@ """.strip() import sys -import struct try: from mercurial import registrar @@ -326,9 +325,6 @@ b'evolve.operation': b'bold' } -_pack = struct.pack -_unpack = struct.unpack - aliases, entry = cmdutil.findcmd(b'commit', commands.table) # This extension contains the following code @@ -465,7 +461,8 @@ _alias, statuscmd = cmdutil.findcmd(b'status', commands.table) pstatusopts = [o for o in statuscmd[1] if o[1] != b'rev'] - @eh.command(b'pstatus', pstatusopts) + @eh.command(b'pstatus', pstatusopts, + **compat.helpcategorykwargs('CATEGORY_WORKING_DIRECTORY')) def pstatus(ui, repo, *args, **kwargs): """show status combining committed and uncommited changes @@ -480,7 +477,8 @@ _alias, diffcmd = cmdutil.findcmd(b'diff', commands.table) pdiffopts = [o for o in diffcmd[1] if o[1] != b'rev'] - @eh.command(b'pdiff', pdiffopts) + @eh.command(b'pdiff', pdiffopts, + **compat.helpcategorykwargs('CATEGORY_WORKING_DIRECTORY')) def pdiff(ui, repo, *args, **kwargs): """show diff combining committed and uncommited changes @@ -705,10 +703,10 @@ debugcommand = b"hg evolve --list --content-divergent" basemsg = _(b"%s has diverged, use '%s' to resolve the issue") solvemsg = basemsg % (shortnode, debugcommand) - elif reason == b'superseed': + elif reason == b'superseded': msg = _(b"use 'hg evolve' to update to its successor: %s") solvemsg = msg % successors[0] - elif reason == b'superseed_split': + elif reason == b'superseded_split': msg = _(b"use 'hg evolve' to update to its tipmost successor: %s") if len(successors) <= 2: @@ -736,10 +734,10 @@ rev = repo[scmutil.revsingle(unfilteredrepo, changeid)] reason, successors = obshistory._getobsfateandsuccs(unfilteredrepo, rev.node()) - # Be more precise in case the revision is superseed - if reason == b'superseed': + # Be more precise in case the revision is superseded + if reason == b'superseded': reason = _(b"successor: %s") % successors[0] - elif reason == b'superseed_split': + elif reason == b'superseded_split': if len(successors) <= 2: reason = _(b"successors: %s") % b", ".join(successors) else: @@ -947,7 +945,7 @@ def _findprevtarget(repo, displayer, movebookmark=False, topic=True): target = bookmark = None wkctx = repo[None] - p1 = wkctx.parents()[0] + p1 = wkctx.p1() parents = p1.parents() currenttopic = _getcurrenttopic(repo) @@ -989,7 +987,8 @@ (b'n', b'dry-run', False, _(b'do not perform actions, just print what would be done'))], b'[OPTION]...', - helpbasic=True) + helpbasic=True, + **compat.helpcategorykwargs('CATEGORY_WORKING_DIRECTORY')) def cmdprevious(ui, repo, **opts): """update to parent revision @@ -1023,15 +1022,14 @@ target, bookmark = _findprevtarget(repo, displayer, opts.get('move_bookmark'), topic) if target is not None: - backup = repo.ui.backupconfig(b'_internal', b'keep-topic') - try: - if topic and _getcurrenttopic(repo) != _gettopic(target): - repo.ui.setconfig(b'_internal', b'keep-topic', b'yes', - source=b'topic-extension') + configoverride = util.nullcontextmanager() + if topic and _getcurrenttopic(repo) != _gettopic(target): + configoverride = repo.ui.configoverride({ + (b'_internal', b'keep-topic'): b'yes' + }, source=b'topic-extension') + with configoverride: _prevupdate(repo, displayer, target, bookmark, dryrunopt, mergeopt) - finally: - repo.ui.restoreconfig(backup) return 0 else: return 1 @@ -1048,7 +1046,8 @@ (b'n', b'dry-run', False, _(b'do not perform actions, just print what would be done'))], b'[OPTION]...', - helpbasic=True) + helpbasic=True, + **compat.helpcategorykwargs('CATEGORY_WORKING_DIRECTORY')) def cmdnext(ui, repo, **opts): """update to next child revision @@ -1339,8 +1338,16 @@ if entry[0] == b"evolution": break else: - help.helptable.append(([b"evolution"], _(b"Safely Rewriting History"), - _helploader)) + if util.safehasattr(help, 'TOPIC_CATEGORY_CONCEPTS'): + help.helptable.append(([b"evolution"], + _(b"Safely Rewriting History"), + _helploader, + help.TOPIC_CATEGORY_CONCEPTS)) + else: + # hg <= 4.7 (c303d65d2e34) + help.helptable.append(([b"evolution"], + _(b"Safely Rewriting History"), + _helploader)) help.helptable.sort() evolvestateversion = 0 diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/cmdrewrite.py --- a/hgext3rd/evolve/cmdrewrite.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/cmdrewrite.py Fri Feb 28 23:10:48 2020 +0700 @@ -26,7 +26,6 @@ merge, node, obsolete, - obsutil, patch, phases, pycompat, @@ -36,11 +35,6 @@ from mercurial.i18n import _ -try: - from mercurial.utils.dateutil import datestr -except ImportError: # hg <= 4.5 - from mercurial.util import datestr - from . import ( compat, state, @@ -56,6 +50,7 @@ commitopts2 = commands.commitopts2 mergetoolopts = commands.mergetoolopts stringio = util.stringio +precheck_contentdiv = rewriteutil.precheck_contentdiv # option added by evolve @@ -66,9 +61,6 @@ if not note: return - if not compat.isobsnotesupported(): - ui.warn(_(b"current hg version does not support storing" - b" note in obsmarker\n")) if len(note) > 255: raise error.Abort(_(b"cannot store a note of more than 255 bytes")) if b'\n' in note: @@ -109,7 +101,8 @@ (b'n', b'note', b'', _(b'store a note on amend'), _(b'TEXT')), ] + walkopts + commitopts + commitopts2 + commitopts3 + interactiveopt, _(b'[OPTION]... [FILE]...'), - helpbasic=True) + helpbasic=True, + **compat.helpcategorykwargs('CATEGORY_COMMITTING')) def amend(ui, repo, *pats, **opts): """combine a changeset with updates and replace it with a new one @@ -274,7 +267,7 @@ fp.write(b"# HG changeset patch\n") fp.write(b"# User %s\n" % ctx.user()) fp.write(b"# Date %d %d\n" % ctx.date()) - fp.write(b"# %s\n" % datestr(ctx.date())) + fp.write(b"# %s\n" % compat.datestr(ctx.date())) if branch and branch != b'default': fp.write(b"# Branch %s\n" % branch) fp.write(b"# Node ID %s\n" % node.hex(nodeval)) @@ -458,7 +451,8 @@ (b'', b'revert', False, _(b'discard working directory changes after uncommit')), (b'n', b'note', b'', _(b'store a note on uncommit'), _(b'TEXT')), ] + commands.walkopts + commitopts + commitopts2 + commitopts3, - _(b'[OPTION]... [FILE]...')) + _(b'[OPTION]... [FILE]...'), + **compat.helpcategorykwargs('CATEGORY_CHANGE_MANAGEMENT')) def uncommit(ui, repo, *pats, **opts): """move changes from parent revision to working directory @@ -694,7 +688,8 @@ (b'n', b'note', b'', _(b'store a note on fold'), _(b'TEXT')), ] + commitopts + commitopts2 + commitopts3, _(b'hg fold [OPTION]... [-r] REV...'), - helpbasic=True) + helpbasic=True, + **compat.helpcategorykwargs('CATEGORY_CHANGE_MANAGEMENT')) def fold(ui, repo, *revs, **opts): """fold multiple revisions into a single one @@ -806,9 +801,17 @@ p2.node()], commitopts=commitopts) phases.retractboundary(repo, tr, targetphase, [newid]) - replacements = {ctx.node(): [newid] for ctx in allctx} - scmutil.cleanupnodes(repo, replacements, operation=b"fold", - metadata=metadata) + # Use this condition as a proxy since the commit we care about + # (b99903534e06) didn't change any signatures. + if util.safehasattr(scmutil, 'nullrev'): + replacements = {tuple(ctx.node() for ctx in allctx): [newid]} + scmutil.cleanupnodes(repo, replacements, operation=b"fold", + metadata=metadata) + else: + # hg <= 4.7 (b99903534e06) + replacements = {ctx.node(): [newid] for ctx in allctx} + scmutil.cleanupnodes(repo, replacements, operation=b"fold", + metadata=metadata) tr.close() finally: tr.release() @@ -824,7 +827,8 @@ (b'', b'fold', None, _(b"also fold specified revisions into one")), (b'n', b'note', b'', _(b'store a note on metaedit'), _(b'TEXT')), ] + commitopts + commitopts2 + commitopts3, - _(b'hg metaedit [OPTION]... [[-r] REV]...')) + _(b'hg metaedit [OPTION]... [[-r] REV]...'), + **compat.helpcategorykwargs('CATEGORY_CHANGE_MANAGEMENT')) def metaedit(ui, repo, *revs, **opts): """edit commit information @@ -934,9 +938,15 @@ metadata[b'note'] = opts['note'] phases.retractboundary(repo, tr, targetphase, [newid]) - obsolete.createmarkers(repo, [(ctx, (repo[newid],)) - for ctx in allctx], - metadata=metadata, operation=b"metaedit") + # Use this condition as a proxy since the commit we care about + # (6335c0de80fa) didn't change any signatures. + if not util.safehasattr(context, 'bin'): + obsolete.createmarkers(repo, [(tuple(allctx), (repo[newid],))], + metadata=metadata, operation=b"metaedit") + else: + # hg <= 4.7 (6335c0de80fa) + obsolete.createmarkers(repo, [(ctx, (repo[newid],)) for ctx in allctx], + metadata=metadata, operation=b"metaedit") else: ui.status(_(b"nothing changed\n")) tr.close() @@ -982,7 +992,8 @@ (b'B', b'bookmark', [], _(b"remove revs only reachable from given" b" bookmark"), _(b'BOOKMARK'))] + metadataopts, _(b'[OPTION]... [-r] REV...'), - helpbasic=True) + helpbasic=True, + **compat.helpcategorykwargs('CATEGORY_CHANGE_MANAGEMENT')) # XXX -U --noupdate option to prevent wc update and or bookmarks update ? def cmdprune(ui, repo, *revs, **opts): """mark changesets as obsolete or succeeded by another changeset @@ -1092,7 +1103,7 @@ newnode = wdp while newnode in precs or newnode.obsolete(): - newnode = newnode.parents()[0] + newnode = newnode.p1() else: # no need to update anywhere as wdp is not related to revs # being pruned @@ -1159,6 +1170,11 @@ if not dest.obsolete() and dest.node() not in replacements: moves[ctx.node()] = dest.node() break + if len(sucs) == 1 and len(precs) > 1 and fold: + # hg <= 4.7 (b99903534e06) + # Using a proxy condition to let people wrap cleanupnodes() + if util.safehasattr(scmutil, 'nullrev'): + replacements = {tuple(p.node() for p in precs): [s.node() for s in sucs]} scmutil.cleanupnodes(repo, replacements, operation=b"prune", moves=moves, metadata=metadata) @@ -1176,7 +1192,8 @@ (b'n', b'note', b'', _(b"store a note on split"), _(b'TEXT')), ] + commitopts + commitopts2 + commitopts3, _(b'hg split [OPTION]... [-r REV] [FILE]...'), - helpbasic=True) + helpbasic=True, + **compat.helpcategorykwargs('CATEGORY_CHANGE_MANAGEMENT')) def cmdsplit(ui, repo, *pats, **opts): """split a changeset into smaller changesets @@ -1353,7 +1370,8 @@ b'mark the new revision as successor of the old one potentially creating ' b'divergence')], # allow to choose the seed ? - _(b'[OPTION]... [-r] REV...')) + _(b'[OPTION]... [-r] REV...'), + **compat.helpcategorykwargs('CATEGORY_CHANGE_MANAGEMENT')) def touch(ui, repo, *revs, **opts): """create successors identical to their predecessors but the changeset ID @@ -1371,7 +1389,11 @@ duplicate = opts['duplicate'] if not duplicate: - rewriteutil.precheck(repo, revs, b'touch') + # Override allowdivergence=true because we'll do our own checking later + # instead + overrides = {(b'experimental', b'evolution.allowdivergence'): b"true"} + with ui.configoverride(overrides, b'touch'): + rewriteutil.precheck(repo, revs, b'touch') tmpl = utility.shorttemplate displayer = compat.changesetdisplayer(ui, repo, {b'template': tmpl}) with repo.wlock(), repo.lock(), repo.transaction(b'touch'): @@ -1393,27 +1415,7 @@ p2 = newmapping.get(p2, p2) if not (duplicate or allowdivergence): - # If reviving this cset creates divergence, let's ask user - # what to do: create divergence or duplicate - - # We need to check two cases that can cause divergence: - # case 1: the rev being revived has a non-obsolete successor (easily - # detected by successorssets) - sset = obsutil.successorssets(repo, ctx.node()) - nodivergencerisk = (len(sset) == 0 - or (len(sset) == 1 - and len(sset[0]) == 1 - and repo[sset[0][0]].rev() == ctx.rev() - )) - if nodivergencerisk: - # case 2: one of the precursors of the rev being revived has a - # non-obsolete successor (we need divergentsets for this) - from . import evolvecmd - if evolvecmd.divergentsets(repo, ctx): - nodivergencerisk = False - if nodivergencerisk: - duplicate = False - else: + if precheck_contentdiv(repo, ctx): displayer.show(ctx) index = ui.promptchoice( _(b"reviving this changeset will create divergence" @@ -1421,9 +1423,7 @@ b" (d)uplicate the changeset? $$ &Allowdivergence $$ " b"&Duplicate"), 0) choice = [b'allowdivergence', b'duplicate'][index] - if choice == b'allowdivergence': - duplicate = False - else: + if choice == b'duplicate': duplicate = True updates = [] @@ -1454,7 +1454,8 @@ (b'c', b'continue', False, b'continue interrupted pick'), (b'a', b'abort', False, b'abort interrupted pick'), ] + mergetoolopts, - _(b'[OPTION]... [-r] REV')) + _(b'[OPTION]... [-r] REV'), + **compat.helpcategorykwargs('CATEGORY_CHANGE_MANAGEMENT')) def cmdpick(ui, repo, *revs, **opts): """move a commit on the top of working directory parent and updates to it.""" diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/compat.py --- a/hgext3rd/evolve/compat.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/compat.py Fri Feb 28 23:10:48 2020 +0700 @@ -13,11 +13,10 @@ from mercurial import ( context, copies, - encoding, mdiff, obsolete, - obsutil, pycompat, + registrar, repair, scmutil, util, @@ -41,9 +40,9 @@ changesetdiffer = logcmdutil.changesetdiffer except (AttributeError, ImportError): from mercurial import cmdutil - changesetdisplayer = cmdutil.show_changeset - changesetprinter = cmdutil.changeset_printer - displaygraph = cmdutil.displaygraph + changesetdisplayer = cmdutil.show_changeset # pytype: disable=module-attr + changesetprinter = cmdutil.changeset_printer # pytype: disable=module-attr + displaygraph = cmdutil.displaygraph # pytype: disable=module-attr changesetdiffer = None # hg <= 5.3 (c21aca51b392) @@ -51,7 +50,7 @@ from mercurial import pathutil dirs = pathutil.dirs except (AttributeError, ImportError): - dirs = util.dirs + dirs = util.dirs # pytype: disable=module-attr from . import ( exthelper, @@ -59,14 +58,6 @@ eh = exthelper.exthelper() -def isobsnotesupported(): - # hack to know obsnote is supported. The patches for obsnote support was - # pushed before the obsfateprinter patches, so this will serve as a good - # check - if not obsutil: - return False - return util.safehasattr(obsutil, 'obsfateprinter') - # Evolution renaming compat TROUBLES = { @@ -75,6 +66,7 @@ r'PHASEDIVERGENT': b'phase-divergent', } +# hg <= 4.6 (bec1212eceaa) if util.safehasattr(uimod.ui, 'makeprogress'): def progress(ui, topic, pos, item=b"", unit=b"", total=None): progress = ui.makeprogress(topic, unit, total) @@ -96,7 +88,7 @@ def memfilectx(repo, ctx, fctx, flags, copied, path): # XXX Would it be better at the module level? - varnames = context.memfilectx.__init__.__code__.co_varnames + varnames = context.memfilectx.__init__.__code__.co_varnames # pytype: disable=attribute-error if r"copysource" in varnames: mctx = context.memfilectx(repo, ctx, fctx.path(), fctx.data(), @@ -108,12 +100,12 @@ mctx = context.memfilectx(repo, ctx, fctx.path(), fctx.data(), islink=b'l' in flags, isexec=b'x' in flags, - copied=copied.get(path)) + copied=copied.get(path)) # pytype: disable=wrong-keyword-args else: mctx = context.memfilectx(repo, fctx.path(), fctx.data(), islink=b'l' in flags, isexec=b'x' in flags, - copied=copied.get(path)) + copied=copied.get(path)) # pytype: disable=wrong-keyword-args return mctx def strdiff(a, b, fn1, fn2): @@ -136,14 +128,17 @@ # date related +# hg <= 4.5 (c6061cadb400) try: import mercurial.utils.dateutil + datestr = mercurial.utils.dateutil.datestr makedate = mercurial.utils.dateutil.makedate parsedate = mercurial.utils.dateutil.parsedate except ImportError: import mercurial.util - makedate = mercurial.util.makedate - parsedate = mercurial.util.parsedate + datestr = mercurial.util.datestr # pytype: disable=module-attr + makedate = mercurial.util.makedate # pytype: disable=module-attr + parsedate = mercurial.util.parsedate # pytype: disable=module-attr def wireprotocommand(exthelper, name, args=b'', permission=b'pull'): try: @@ -174,7 +169,7 @@ # scmutil.bookmarkrevs # This change is a part of 4.7 cycle, so drop this when we drop support for 4.6 try: - bmrevset = repair.stripbmrevset + bmrevset = repair.stripbmrevset # pytype: disable=module-attr except AttributeError: bmrevset = scmutil.bookmarkrevs @@ -220,9 +215,9 @@ # hg < 4.8 compat (dc50121126ae) try: - limit = copies._findlimit(repo, c1, c2) + limit = copies._findlimit(repo, c1, c2) # pytype: disable=module-attr except (AttributeError, TypeError): - limit = copies._findlimit(repo, c1.rev(), c2.rev()) + limit = copies._findlimit(repo, c1.rev(), c2.rev()) # pytype: disable=module-attr if limit is None: # no common ancestor, no copies return {}, {}, {}, {}, {} @@ -263,11 +258,11 @@ bothnew = sorted(addedinm1 & addedinm2) if tca == base: # unmatched file from base - u1r, u2r = copies._computenonoverlap(repo, c1, c2, addedinm1, addedinm2) + u1r, u2r = copies._computenonoverlap(repo, c1, c2, addedinm1, addedinm2) # pytype: disable=module-attr u1u, u2u = u1r, u2r else: # unmatched file from base (DAG rotation in the graft case) - u1r, u2r = copies._computenonoverlap(repo, c1, c2, addedinm1, addedinm2, + u1r, u2r = copies._computenonoverlap(repo, c1, c2, addedinm1, addedinm2, # pytype: disable=module-attr baselabel=b'base') # unmatched file from topological common ancestors (no DAG rotation) # need to recompute this for directory move handling when grafting @@ -276,18 +271,18 @@ m1f = m1.filesnotin(mta, repo.narrowmatch()) m2f = m2.filesnotin(mta, repo.narrowmatch()) baselabel = b'topological common ancestor' - u1u, u2u = copies._computenonoverlap(repo, c1, c2, m1f, m2f, + u1u, u2u = copies._computenonoverlap(repo, c1, c2, m1f, m2f, # pytype: disable=module-attr baselabel=baselabel) else: - u1u, u2u = copies._computenonoverlap(repo, c1, c2, m1.filesnotin(mta), + u1u, u2u = copies._computenonoverlap(repo, c1, c2, m1.filesnotin(mta), # pytype: disable=module-attr m2.filesnotin(mta), baselabel=b'topological common ancestor') for f in u1u: - copies._checkcopies(c1, c2, f, base, tca, dirtyc1, limit, data1) + copies._checkcopies(c1, c2, f, base, tca, dirtyc1, limit, data1) # pytype: disable=module-attr for f in u2u: - copies._checkcopies(c2, c1, f, base, tca, dirtyc2, limit, data2) + copies._checkcopies(c2, c1, f, base, tca, dirtyc2, limit, data2) # pytype: disable=module-attr copy = dict(data1[b'copy']) copy.update(data2[b'copy']) @@ -295,10 +290,10 @@ fullcopy.update(data2[b'fullcopy']) if dirtyc1: - copies._combinecopies(data2[b'incomplete'], data1[b'incomplete'], copy, diverge, + copies._combinecopies(data2[b'incomplete'], data1[b'incomplete'], copy, diverge, # pytype: disable=module-attr incompletediverge) else: - copies._combinecopies(data1[b'incomplete'], data2[b'incomplete'], copy, diverge, + copies._combinecopies(data1[b'incomplete'], data2[b'incomplete'], copy, diverge, # pytype: disable=module-attr incompletediverge) renamedelete = {} @@ -334,19 +329,19 @@ b'incompletediverge': bothincompletediverge } for f in bothnew: - copies._checkcopies(c1, c2, f, base, tca, dirtyc1, limit, both1) - copies._checkcopies(c2, c1, f, base, tca, dirtyc2, limit, both2) + copies._checkcopies(c1, c2, f, base, tca, dirtyc1, limit, both1) # pytype: disable=module-attr + copies._checkcopies(c2, c1, f, base, tca, dirtyc2, limit, both2) # pytype: disable=module-attr if dirtyc1 and dirtyc2: pass elif dirtyc1: # incomplete copies may only be found on the "dirty" side for bothnew assert not both2[b'incomplete'] - remainder = copies._combinecopies({}, both1[b'incomplete'], copy, bothdiverge, + remainder = copies._combinecopies({}, both1[b'incomplete'], copy, bothdiverge, # pytype: disable=module-attr bothincompletediverge) elif dirtyc2: assert not both1[b'incomplete'] - remainder = copies._combinecopies({}, both2[b'incomplete'], copy, bothdiverge, + remainder = copies._combinecopies({}, both2[b'incomplete'], copy, bothdiverge, # pytype: disable=module-attr bothincompletediverge) else: # incomplete copies and divergences can't happen outside grafts @@ -444,85 +439,14 @@ if not fixupstreamed: copies._fullcopytracing = fixedcopytracing -if not util.safehasattr(obsutil, "_succs"): - class _succs(list): - """small class to represent a successors with some metadata about it""" - - def __init__(self, *args, **kwargs): - super(_succs, self).__init__(*args, **kwargs) - self.markers = set() - - def copy(self): - new = _succs(self) - new.markers = self.markers.copy() - return new - - @util.propertycache - def _set(self): - # immutable - return set(self) - - def canmerge(self, other): - return self._set.issubset(other._set) -else: - from mercurial.obsutil import _succs - -def wrap_succs(succs): - """ Wrap old data format of successorsets (tuple) only if if's not yet a - _succs instance - """ - - if not util.safehasattr(succs, "markers"): - return _succs(succs) - else: - return succs - -if not util.safehasattr(obsutil, "markersdates"): - MARKERS_DATE_COMPAT = True -else: - MARKERS_DATE_COMPAT = False - -def markersdates(markers): - """returns the list of dates for a list of markers - """ - if MARKERS_DATE_COMPAT is False: - return obsutil.markersdates(markers) - - return [m[4] for m in markers] - -if not util.safehasattr(obsutil, "markersusers"): - MARKERS_USERS_COMPAT = True -else: - MARKERS_USERS_COMPAT = False - -def markersusers(markers): - """ Returns a sorted list of markers users without duplicates - """ - if MARKERS_USERS_COMPAT is False: - return obsutil.markersusers(markers) - - markersmeta = [dict(m[3]) for m in markers] - users = set(encoding.tolocal(meta[b'user']) for meta in markersmeta - if meta.get(b'user')) - - return sorted(users) - -if not util.safehasattr(obsutil, "markersoperations"): - MARKERS_OPERATIONS_COMPAT = True -else: - MARKERS_OPERATIONS_COMPAT = False - -def markersoperations(markers): - """ Returns a sorted list of markers operations without duplicates - """ - if MARKERS_OPERATIONS_COMPAT is False: - return obsutil.markersoperations(markers) - - markersmeta = [dict(m[3]) for m in markers] - operations = set(meta.get(b'operation') for meta in markersmeta - if meta.get(b'operation')) - - return sorted(operations) +# help category compatibility +# hg <= 4.7 (c303d65d2e34) +def helpcategorykwargs(categoryname): + """Backwards-compatible specification of the helpategory argument.""" + category = getattr(registrar.command, categoryname, None) + if not category: + return {} + return {'helpcategory': category} # nodemap.get and index.[has_node|rev|get_rev] # hg <= 5.3 (02802fa87b74) diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/depthcache.py --- a/hgext3rd/evolve/depthcache.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/depthcache.py Fri Feb 28 23:10:48 2020 +0700 @@ -16,6 +16,12 @@ scmutil, ) +try: + from mercurial.utils.stringutil import forcebytestr +except ImportError: + # hg <= 4.5 (f99d64e8a4e4) + from mercurial.util import forcebytestr + from . import ( compat, error, @@ -206,5 +212,5 @@ cachefile.close() self._ondiskkey = self._cachekey except (IOError, OSError) as exc: - repo.ui.log(b'depthcache', b'could not write update %s\n' % exc) - repo.ui.debug(b'depthcache: could not write update %s\n' % exc) + repo.ui.log(b'depthcache', b'could not write update %s\n' % forcebytestr(exc)) + repo.ui.debug(b'depthcache: could not write update %s\n' % forcebytestr(exc)) diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/evolvecmd.py --- a/hgext3rd/evolve/evolvecmd.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/evolvecmd.py Fri Feb 28 23:10:48 2020 +0700 @@ -16,7 +16,6 @@ cmdutil, commands, context, - copies, error, encoding, hg, @@ -62,7 +61,7 @@ returns a tuple (bool, newnode) where, bool: a boolean value indicating whether the instability was solved newnode: if bool is True, then the newnode of the resultant commit - formed. newnode can be node, when resolution led to no new + formed. newnode can be None, when resolution led to no new commit. If bool is False, this is ".". """ tr = repo.currenttransaction() @@ -123,43 +122,28 @@ ui.warn(_(b"cannot solve instability of %s, skipping\n") % orig) return (False, b".") obs = pctx - newer = obsutil.successorssets(repo, obs.node()) - # search of a parent which is not killed, but also isn't the orig - while not newer or newer == [()] or newer[0][0] == orig.node(): - ui.debug(b"stabilize target %s is plain dead," - b" trying to stabilize on its parent\n" % - obs) - obs = obs.parents()[0] - newer = obsutil.successorssets(repo, obs.node()) - if len(newer) > 1: - msg = _(b"skipping %s: divergent rewriting. can't choose " - b"destination\n") % obs - ui.write_err(msg) - return (False, b".") - targets = newer[0] - assert targets - if len(targets) > 1: - # split target, figure out which one to pick, are they all in line? - targetrevs = [repo[r].rev() for r in targets] - roots = repo.revs(b'roots(%ld)', targetrevs) - heads = repo.revs(b'heads(%ld)', targetrevs) - if len(roots) > 1 or len(heads) > 1: - cheader = _(b"ancestor '%s' split over multiple topological" - b" branches.\nchoose an evolve destination:") % orig - selectedrev = utility.revselectionprompt(ui, repo, list(heads), - cheader) - if selectedrev is None: + try: + newer = utility._singlesuccessor(repo, obs) + # search of a parent which isn't the orig + while repo[newer].node() == orig.node(): + obs = obs.parents()[0] + newer = utility._singlesuccessor(repo, obs) + except utility.MultipleSuccessorsError as exc: + if exc.divergenceflag: + msg = _(b"skipping %s: divergent rewriting. can't choose " + b"destination\n") % obs + ui.write_err(msg) + return (False, b".") + if exc.splitflag: + splitsucc = utility.picksplitsuccessor(ui, repo, obs, orig) + if not splitsucc[0]: msg = _(b"could not solve instability, " b"ambiguous destination: " b"parent split across two branches\n") ui.write_err(msg) return (False, b".") - target = repo[selectedrev] - else: - target = repo[heads.first()] - else: - target = targets[0] - target = repo[target] + newer = splitsucc[1] + target = repo[newer] if not ui.quiet or confirm: repo.ui.write(_(b'move:'), label=b'evolve.operation') displayer.show(orig) @@ -179,8 +163,8 @@ if progresscb: progresscb() with state.saver(evolvestate, {b'current': orig.node()}): - newid = relocate(repo, orig, target, evolvestate, pctx, - keepbranch, b'orphan') + newid = _relocate(repo, orig, target, evolvestate, pctx, + keepbranch, b'orphan') return (True, newid) def _solvephasedivergence(ui, repo, bumped, evolvestate, displayer, @@ -238,8 +222,8 @@ _(b'rebasing to destination parent: %s\n') % prec.p1()) with state.saver(evolvestate, {b'current': bumped.hex(), b'precursor': prec.hex()}): - newnode = relocate(repo, bumped, prec.p1(), evolvestate, - category=b'phasedivergent') + newnode = _relocate(repo, bumped, prec.p1(), evolvestate, + category=b'phasedivergent') if newnode is not None: new = repo[newnode] obsolete.createmarkers(repo, [(bumped, (new,))], @@ -300,17 +284,9 @@ repo.dirstate.setparents(newid, nodemod.nullid) return (True, replacementnode) -def _solvedivergent(ui, repo, divergent, evolvestate, displayer, dryrun=False, - confirm=False, progresscb=None): - """tries to solve content-divergence of a changeset - - returns a tuple (bool, newnode) where, - bool: a boolean value indicating whether the instability was solved - newnode: if bool is True, then the newnode of the resultant commit - formed. newnode can be node, when resolution led to no new - commit. If bool is False, this is ".". - """ - repo = repo.unfiltered() +def _prepcontentdivresolution(ui, repo, divergent, other, evolvestate): + """ if relocation required, decide which divergent cset will be relocated + to the other side""" divergent = repo[divergent.rev()] evolvestate[b'divergent'] = divergent.node() evolvestate[b'orig-divergent'] = divergent.node() @@ -320,32 +296,15 @@ # strip that relocated commit. However if `--all` is passed, we need to # reset this value for each content-divergence resolution which we are doing # below. - evolvestate[b'relocated'] = None - evolvestate[b'relocating'] = False + evolvestate[b'relocated-other'] = None + evolvestate[b'relocating-other'] = False + evolvestate[b'relocated-div'] = None + evolvestate[b'relocating-div'] = False + evolvestate[b'relocation-req'] = False # in case or relocation we get a new other node, we need to store the old # other for purposes like `--abort` or `--stop` evolvestate[b'old-other'] = None - base, others = divergentdata(divergent) - - # we don't handle split in content-divergence yet - if len(others) > 1: - othersstr = b"[%s]" % (b','.join([bytes(i) for i in others])) - msg = _(b"skipping %s: %s with a changeset that got split" - b" into multiple ones:\n" - b"|[%s]\n" - b"| This is not handled by automatic evolution yet\n" - b"| You have to fallback to manual handling with commands " - b"such as:\n" - b"| - hg touch -D\n" - b"| - hg prune\n" - b"| \n" - b"| You should contact your local evolution Guru for help.\n" - ) % (divergent, TROUBLES['CONTENTDIVERGENT'], othersstr) - ui.write_err(msg) - return (False, b".") - other = others[0] - evolvestate[b'other-divergent'] = other.node() - evolvestate[b'base'] = base.node() + evolvestate[b'old-divergent'] = None def swapnodes(div, other): div, other = other, div @@ -364,6 +323,7 @@ else: publicdiv = divergent evolvestate[b'public-divergent'] = publicdiv.node() + # we don't handle merge content-divergent changesets yet if len(other.parents()) > 1: msg = _(b"skipping %s: %s changeset can't be " @@ -375,32 +335,32 @@ ui.write_err(hint) return (False, b".") - otherp1 = other.p1().rev() - divp1 = divergent.p1().rev() + otherp1 = succsotherp1 = other.p1().rev() + divp1 = succsdivp1 = divergent.p1().rev() # finding single successors of otherp1 and divp1 try: - otherp1 = utility._singlesuccessor(repo, other.p1()) + succsotherp1 = utility._singlesuccessor(repo, other.p1()) except utility.MultipleSuccessorsError: pass try: - divp1 = utility._singlesuccessor(repo, divergent.p1()) + succsdivp1 = utility._singlesuccessor(repo, divergent.p1()) except utility.MultipleSuccessorsError: pass # the changeset on which resolution changeset will be based on - resolutionparent = repo[divp1].node() + resolutionparent = repo[succsdivp1].node() # the nullrev has to be handled specially because -1 is overloaded to both # mean nullrev (this meaning is used for the result of changectx.rev(), as # called above) and the tipmost revision (this meaning is used for the %d # format specifier, as used below) - if nodemod.nullrev in (otherp1, divp1): - # nullrev is the only possible ancestor if otherp1 or divp1 is nullrev + if nodemod.nullrev in (succsotherp1, succsdivp1): + # nullrev is the only possible ancestor if succsotherp1 or succsdivp1 is nullrev gca = [nodemod.nullrev] else: - gca = repo.revs(b"ancestor(%d, %d)" % (otherp1, divp1)) + gca = repo.revs(b"ancestor(%d, %d)" % (succsotherp1, succsdivp1)) # divonly: non-obsolete csets which are topological ancestor of "divergent" # but not "other" divonly = repo.revs(b"only(%d, %d) - obsolete()" % (divergent.rev(), @@ -428,32 +388,31 @@ # for 2) we will relocate one which is behind to the parent of ahead one and # 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: - if otherp1 == other.p1().rev() and divp1 == divergent.p1().rev(): - # both are on the same parents + if otherp1 == divp1: + # both are on the same parents + pass + elif succsotherp1 in gca and succsdivp1 in gca: + # 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[succsotherp1].node() + elif divonly: + relocatereq = True 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: + # no extra cset on either side; so not considering relocation + pass + elif succsotherp1 in gca and succsdivp1 not in gca: relocatereq = True pass - elif divp1 in gca and otherp1 not in gca: + elif succsdivp1 in gca and succsotherp1 not in gca: relocatereq = True # When public branch is behind to the mutable branch, for now we @@ -482,6 +441,52 @@ ui.write_err(hint) return (False, b".") + return (True, divergent, other, resolutionparent, relocatereq) + +def _solvedivergent(ui, repo, divergent, evolvestate, displayer, dryrun=False, + confirm=False, progresscb=None): + """tries to solve content-divergence of a changeset + + returns a tuple (bool, newnode) where, + bool: a boolean value indicating whether the instability was solved + newnode: if bool is True, then the newnode of the resultant commit + formed. newnode can be node, when resolution led to no new + commit. If bool is False, this is ".". + """ + repo = repo.unfiltered() + base, others = divergentdata(divergent) + + # we don't handle split in content-divergence yet + if len(others) > 1: + othersstr = b"[%s]" % (b','.join([bytes(i) for i in others])) + msg = _(b"skipping %s: %s with a changeset that got split" + b" into multiple ones:\n" + b"|[%s]\n" + b"| This is not handled by automatic evolution yet\n" + b"| You have to fallback to manual handling with commands " + b"such as:\n" + b"| - hg touch -D\n" + b"| - hg prune\n" + b"| \n" + b"| You should contact your local evolution Guru for help.\n" + ) % (divergent, TROUBLES['CONTENTDIVERGENT'], othersstr) + ui.write_err(msg) + return (False, b".") + other = others[0] + evolvestate[b'other-divergent'] = other.node() + evolvestate[b'base'] = base.node() + + # setup everything before merging two content-divergent csets + datatoproceed = _prepcontentdivresolution(ui, repo, divergent, other, + evolvestate) + if not datatoproceed[0]: + return (False, b".") + divergent, other, resolutionparent, relocatereq = datatoproceed[1:] + + if relocatereq: + evolvestate['relocation-req'] = True + evolvestate[b'resolutionparent'] = resolutionparent + if not ui.quiet or confirm: ui.write(_(b'merge:'), label=b'evolve.operation') displayer.show(divergent) @@ -502,19 +507,26 @@ % divergent)) return (False, b".") + if relocatereq: + evolvestate[b'relocation-req'] = True + evolvestate[b'resolutionparent'] = resolutionparent try: succsdivp1 = utility._singlesuccessor(repo, divergent.p1()) except utility.MultipleSuccessorsError: - msg = _(b"ambiguous orphan resolution parent for %b") + msg = _(b"ambiguous orphan resolution parent for %s") raise error.Abort(msg % divergent.hex()[:12]) # relocate divergent cset to its obsolete parent's successsor if succsdivp1 != divergent.p1().rev(): + evolvestate[b'relocating-div'] = True ui.status(_(b'rebasing "divergent" content-divergent changeset %s on' b' %s\n' % (divergent, repo[succsdivp1]))) with state.saver(evolvestate, {b'current': divergent.node()}): - newdivergent = relocate(repo, divergent, repo[succsdivp1], - evolvestate, keepbranch=True) + newdivergent = _relocate(repo, divergent, repo[succsdivp1], + evolvestate, keepbranch=True) + evolvestate[b'old-divergent'] = divergent.node() divergent = repo[newdivergent] + evolvestate[b'relocating-div'] = False + evolvestate[b'relocated-div'] = divergent.node() evolvestate[b'temprevs'].append(divergent.node()) evolvestate[b'divergent'] = divergent.node() @@ -522,22 +534,21 @@ if relocatereq and other == divergent.p1(): relocatereq = False - evolvestate[b'resolutionparent'] = resolutionparent # relocate the other divergent if required if relocatereq: # relocating will help us understand during the time of conflicts that # whether conflicts occur at reloacting or they occured at merging # content divergent changesets - evolvestate[b'relocating'] = True + evolvestate[b'relocating-other'] = True ui.status(_(b'rebasing "other" content-divergent changeset %s on' b' %s\n' % (other, divergent.p1()))) with state.saver(evolvestate, {b'current': other.node()}): - newother = relocate(repo, other, divergent.p1(), evolvestate, - keepbranch=True) + newother = _relocate(repo, other, divergent.p1(), evolvestate, + keepbranch=True) evolvestate[b'old-other'] = other.node() other = repo[newother] - evolvestate[b'relocating'] = False - evolvestate[b'relocated'] = other.node() + evolvestate[b'relocating-other'] = False + evolvestate[b'relocated-other'] = other.node() evolvestate[b'temprevs'].append(other.node()) evolvestate[b'other-divergent'] = other.node() @@ -545,9 +556,11 @@ evolvestate) res, newnode = _completecontentdivergent(ui, repo, progresscb, divergent, other, base, evolvestate) + haspubdiv = not (divergent.mutable() and other.mutable()) if not haspubdiv: return (res, newnode) else: + publicdiv = repo[evolvestate[b'public-divergent']] # we have content-divergence with a public cset: # after performing content divergence resolution steps, possbile cases: # 1) merging results in a new node: @@ -607,7 +620,6 @@ # resume resolution if progresscb: progresscb() - emtpycommitallowed = repo.ui.backupconfig(b'ui', b'allowemptycommit') tr = repo.currenttransaction() assert tr is not None # whether to store the obsmarker in the evolvestate @@ -635,68 +647,64 @@ obsolete.createmarkers(repo, [(otherdiv, (publicdiv,))], operation=b'evolve') return (True, publicnode) - try: - with repo.dirstate.parentchange(), compat.parentchange(repo): - repo.dirstate.setparents(resparent, nodemod.nullid) - - dirstatedance(repo, divergent, resparent, None) - # merge the branches - mergebranches(repo, divergent, other, base) - # merge the commit messages - desc = mergecommitmessages(ui, base.description(), - divergent.description(), - other.description()) - user = utility.mergeusers(ui, base, divergent, other) + with repo.dirstate.parentchange(), compat.parentchange(repo): + repo.dirstate.setparents(resparent, nodemod.nullid) + + dirstatedance(repo, divergent, resparent, None) - # new node if any formed as the replacement - newnode = None + # merge the branches + mergebranches(repo, divergent, other, base) + # merge the commit messages + desc = mergecommitmessages(ui, base.description(), + divergent.description(), + other.description()) + user = utility.mergeusers(ui, base, divergent, other) - mergehook(repo, base, divergent, other) + mergehook(repo, base, divergent, other) - date = divergent.date() - if other.date() != divergent.date(): - basedate = base.date() - if other.date() == basedate: - date = divergent.date() - elif divergent.date() == basedate: - date = other.date() - else: - date = max(divergent.date(), other.date()) + date = divergent.date() + if other.date() != divergent.date(): + basedate = base.date() + if other.date() == basedate: + date = divergent.date() + elif divergent.date() == basedate: + date = other.date() + else: + date = max(divergent.date(), other.date()) - newnode = repo.commit(text=desc, user=user, date=date) - if newnode == divergent.node() or newnode is None: - # no changes - new = divergent - storemarker = True - repo.ui.status(_(b"nothing changed\n")) - hg.updaterepo(repo, divergent.rev(), False) + # new node if any formed as the replacement + newnode = repo.commit(text=desc, user=user, date=date) + if newnode == divergent.node() or newnode is None: + # no changes + new = divergent + storemarker = True + repo.ui.status(_(b"nothing changed\n")) + hg.updaterepo(repo, divergent.rev(), False) + else: + new = repo[newnode] + newnode = new.node() + hg.updaterepo(repo, new.rev(), False) + if haspubdiv and publicdiv == divergent: + bypassphase(repo, (divergent, new), operation=b'evolve') else: - new = repo[newnode] - newnode = new.node() - hg.updaterepo(repo, new.rev(), False) - if haspubdiv and publicdiv == divergent: - bypassphase(repo, (divergent, new), operation=b'evolve') - else: - obsolete.createmarkers(repo, [(divergent, (new,))], - operation=b'evolve') + obsolete.createmarkers(repo, [(divergent, (new,))], + operation=b'evolve') - # creating markers and moving phases post-resolution - if haspubdiv and publicdiv == other: - bypassphase(repo, (other, new), operation=b'evolve') - else: - obsolete.createmarkers(repo, [(other, (new,))], operation=b'evolve') - if storemarker: - # storing the marker in the evolvestate - # we just store the precursors and successor pair for now, we might - # want to store more data and serialize obsmarker in a better way in - # future - evolvestate[b'obsmarkers'].append((other.node(), new.node())) + # creating markers and moving phases post-resolution + if haspubdiv and publicdiv == other: + bypassphase(repo, (other, new), operation=b'evolve') + else: + obsolete.createmarkers(repo, [(other, (new,))], operation=b'evolve') + if storemarker: + # storing the marker in the evolvestate + # we just store the precursors and successor pair for now, we might + # want to store more data and serialize obsmarker in a better way in + # future + evolvestate[b'obsmarkers'].append((other.node(), new.node())) - phases.retractboundary(repo, tr, other.phase(), [new.node()]) - return (True, newnode) - finally: - repo.ui.restoreconfig(emtpycommitallowed) + phases.retractboundary(repo, tr, other.phase(), [new.node()]) + return (True, newnode) def warnmetadataloss(repo, local, other): """warn the user for the metadata being lost while resolving @@ -954,8 +962,8 @@ ordering.extend(sorted(dependencies)) return ordering -def relocate(repo, orig, dest, evolvestate, pctx=None, keepbranch=False, - category=None): +def _relocate(repo, orig, dest, evolvestate, pctx=None, keepbranch=False, + category=None): """rewrites the orig rev on dest rev returns the node of new commit which is formed @@ -1009,14 +1017,6 @@ with repo.dirstate.parentchange(), compat.parentchange(repo): repo.setparents(dest.node(), orig.node()) repo.dirstate.write(tr) - # fix up dirstate for copies and renames - if util.safehasattr(copies, 'graftcopies'): - copies.graftcopies(repo[None], dest, orig.p1()) - else: - # hg <= 5.2 (2f0a44c69e07) - copies.duplicatecopies(repo, repo[None], dest.rev(), - orig.p1().rev()) - dirstatedance(repo, dest, orig.node(), None) hint = _(b"see 'hg help evolve.interrupted'") raise error.InterventionRequired(_(b"unresolved merge conflicts"), hint=hint) @@ -1032,16 +1032,14 @@ del extra[b'branch'] extra[b'rebase_source'] = orig.hex() - backup = repo.ui.backupconfig(b'phases', b'new-commit') - try: - targetphase = max(orig.phase(), phases.draft) - repo.ui.setconfig(b'phases', b'new-commit', targetphase, b'evolve') + targetphase = max(orig.phase(), phases.draft) + configoverride = repo.ui.configoverride({ + (b'phases', b'new-commit'): targetphase + }, source=b'evolve') + with configoverride: # Commit might fail if unresolved files exist - nodenew = repo.commit(text=commitmsg, user=orig.user(), - date=orig.date(), extra=extra) - finally: - repo.ui.restoreconfig(backup) - return nodenew + return repo.commit(text=commitmsg, user=orig.user(), + date=orig.date(), extra=extra) def _finalizerelocate(repo, orig, dest, nodenew, tr, category, evolvestate): destbookmarks = repo.nodebookmarks(dest.node()) @@ -1050,7 +1048,7 @@ bmchanges = [] if nodenew is not None: - obsolete.createmarkers(repo, [(repo[nodesrc], (repo[nodenew],))], + obsolete.createmarkers(repo, [(orig, (repo[nodenew],))], operation=b'evolve') for book in oldbookmarks: bmchanges.append((book, nodenew)) @@ -1059,7 +1057,7 @@ if category == b'orphan': repo.ui.status(_(b"evolution of %d:%s created no changes " b"to commit\n") % (orig.rev(), orig)) - obsolete.createmarkers(repo, [(repo[nodesrc], ())], operation=b'evolve') + obsolete.createmarkers(repo, [(orig, ())], operation=b'evolve') # Behave like rebase, move bookmarks to dest for book in oldbookmarks: evolvestate[b'bookmarkchanges'].append((book, nodesrc)) @@ -1544,7 +1542,8 @@ b' in the repo')), ] + mergetoolopts, _(b'[OPTIONS]...'), - helpbasic=True + helpbasic=True, + **compat.helpcategorykwargs('CATEGORY_CHANGE_MANAGEMENT') ) def evolve(ui, repo, **opts): """solve troubled changesets in your repository @@ -1847,15 +1846,29 @@ """logic for handling of `hg evolve --stop`""" updated = False pctx = None + divrelocated = evolvestate.get(b'relocated-div') + otherrelocated = evolvestate.get(b'relocated-other') + strips = [] + if divrelocated: + strips.append(divrelocated) + if otherrelocated: + strips.append(otherrelocated) if (evolvestate[b'command'] == b'evolve' and evolvestate[b'category'] == b'contentdivergent' - and evolvestate[b'relocated']): + and strips): oldother = evolvestate[b'old-other'] - if oldother: + olddiv = evolvestate[b'old-divergent'] + if olddiv: + with repo.wlock(), repo.lock(): + repo = repo.unfiltered() + hg.updaterepo(repo, olddiv, True) + repair.strip(ui, repo, strips, False) + updated = True + pctx = repo[olddiv] + elif oldother: with repo.wlock(), repo.lock(): repo = repo.unfiltered() hg.updaterepo(repo, oldother, True) - strips = [evolvestate[b'relocated']] repair.strip(ui, repo, strips, False) updated = True pctx = repo[oldother] @@ -2029,13 +2042,47 @@ divergent = evolvestate[b'divergent'] base = evolvestate[b'base'] repo = repo.unfiltered() - if evolvestate[b'relocating']: + if evolvestate[b'relocating-div']: + newdiv = _completerelocation(ui, repo, evolvestate) + current = repo[evolvestate[b'current']] + obsolete.createmarkers(repo, [(current, (repo[newdiv],))], + operation=b'evolve') + evolvestate[b'old-divergent'] = repo[divergent].node() + evolvestate[b'relocating-div'] = False + evolvestate[b'relocated-div'] = newdiv + evolvestate[b'temprevs'].append(newdiv) + evolvestate[b'divergent'] = newdiv + + relocatereq = evolvestate[b'relocation-req'] + if relocatereq: + divergent = repo[evolvestate[b'divergent']] + other = repo[evolvestate[b'other-divergent']] + evolvestate[b'relocating-other'] = True + ui.status(_(b'rebasing "other" content-divergent changeset %s on' + b' %s\n' % (other, divergent.p1()))) + with state.saver(evolvestate, {b'current': other.node()}): + newother = _relocate(repo, other, divergent.p1(), + evolvestate, keepbranch=True) + evolvestate[b'old-other'] = other.node() + other = repo[newother] + evolvestate[b'relocating-other'] = False + evolvestate[b'relocated-other'] = other.node() + evolvestate[b'temprevs'].append(other.node()) + evolvestate[b'other-divergent'] = other.node() + # continue the resolution by merging the content-divergence + _mergecontentdivergents(repo, progresscb, + divergent, + repo[newother], + repo[base], + evolvestate) + + if evolvestate[b'relocating-other']: newother = _completerelocation(ui, repo, evolvestate) current = repo[evolvestate[b'current']] obsolete.createmarkers(repo, [(current, (repo[newother],))], operation=b'evolve') - evolvestate[b'relocating'] = False - evolvestate[b'relocated'] = newother + evolvestate[b'relocating-other'] = False + evolvestate[b'relocated-other'] = newother evolvestate[b'temprevs'].append(newother) evolvestate[b'other-divergent'] = newother # continue the resolution by merging the content-divergence @@ -2045,18 +2092,19 @@ repo[base], evolvestate) + divergent = evolvestate[b'divergent'] other = evolvestate[b'other-divergent'] - ret = _completecontentdivergent(ui, repo, progresscb, - repo[divergent], - repo[other], - repo[base], - evolvestate) + res, newnode = _completecontentdivergent(ui, repo, progresscb, + repo[divergent], + repo[other], + repo[base], + evolvestate) origdivergent = evolvestate[b'orig-divergent'] - evolvestate[b'replacements'][origdivergent] = ret[1] + evolvestate[b'replacements'][origdivergent] = newnode + ret = (res, newnode) # logic to continue the public content-divergent publicnode = evolvestate.get(b'public-divergent') if publicnode: - res, newnode = ret if not res: # no need to proceed for phase divergence resolution step pass @@ -2141,7 +2189,7 @@ ctxparents = orig.parents() if len(ctxparents) == 2: - currentp1 = repo.dirstate.parents()[0] + currentp1 = repo.dirstate.p1() p1obs = ctxparents[0].obsolete() p2obs = ctxparents[1].obsolete() # asumming that the parent of current wdir is successor of one @@ -2171,7 +2219,7 @@ pass else: with repo.dirstate.parentchange(), compat.parentchange(repo): - repo.dirstate.setparents(repo.dirstate.parents()[0], nodemod.nullid) + repo.dirstate.setparents(repo.dirstate.p1(), nodemod.nullid) with repo.ui.configoverride(overrides, b'evolve-continue'): node = repo.commit(text=message, user=user, diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/exthelper.py --- a/hgext3rd/evolve/exthelper.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/exthelper.py Fri Feb 28 23:10:48 2020 +0700 @@ -50,7 +50,7 @@ @eh.command('mynewcommand', [('r', 'rev', [], _('operate on these revisions'))], _('-r REV...'), - helpcategory=command.CATEGORY_XXX) + **compat.helpcategorykwargs('CATEGORY_XXX')) def newcommand(ui, repo, *revs, **opts): # implementation goes here diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/firstmergecache.py --- a/hgext3rd/evolve/firstmergecache.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/firstmergecache.py Fri Feb 28 23:10:48 2020 +0700 @@ -16,6 +16,12 @@ node as nodemod, ) +try: + from mercurial.utils.stringutil import forcebytestr +except ImportError: + # hg <= 4.5 (f99d64e8a4e4) + from mercurial.util import forcebytestr + from . import ( compat, error, @@ -143,5 +149,5 @@ cachefile.close() self._ondiskkey = self._cachekey except (IOError, OSError) as exc: - repo.ui.log(b'firstmergecache', b'could not write update %s\n' % exc) - repo.ui.debug(b'firstmergecache: could not write update %s\n' % exc) + repo.ui.log(b'firstmergecache', b'could not write update %s\n' % forcebytestr(exc)) + repo.ui.debug(b'firstmergecache: could not write update %s\n' % forcebytestr(exc)) diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/genericcaches.py --- a/hgext3rd/evolve/genericcaches.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/genericcaches.py Fri Feb 28 23:10:48 2020 +0700 @@ -14,7 +14,7 @@ util, ) -class incrementalcachebase(object): +class incrementalcachebase(object): # pytype: disable=ignored-metaclass """base class for incremental cache from append only source There are multiple append only data source we might want to cache @@ -133,7 +133,7 @@ """read the cachekey from bytes""" return self._cachekeystruct.unpack(data) -class changelogsourcebase(incrementalcachebase): +class changelogsourcebase(incrementalcachebase): # pytype: disable=ignored-metaclass """an abstract class for cache sourcing data from the changelog For this purpose it use a cache key covering changelog content. diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/metadata.py --- a/hgext3rd/evolve/metadata.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/metadata.py Fri Feb 28 23:10:48 2020 +0700 @@ -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__ = b'9.2.2.dev' -testedwith = b'4.5.2 4.6.2 4.7 4.8 4.9 5.0 5.1' -minimumhgversion = b'4.5' +__version__ = b'9.3.1.dev' +testedwith = b'4.6.2 4.7 4.8 4.9 5.0 5.1 5.2 5.3' +minimumhgversion = b'4.6' buglink = b'https://bz.mercurial-scm.org/' diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/obscache.py --- a/hgext3rd/evolve/obscache.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/obscache.py Fri Feb 28 23:10:48 2020 +0700 @@ -19,6 +19,12 @@ util, ) +try: + from mercurial.utils.stringutil import forcebytestr +except ImportError: + # hg <= 4.5 (f99d64e8a4e4) + from mercurial.util import forcebytestr + from . import ( compat, exthelper, @@ -411,8 +417,8 @@ cachefile.close() self._ondiskkey = self._cachekey except (IOError, OSError) as exc: - repo.ui.log(b'obscache', b'could not write update %s\n' % exc) - repo.ui.debug(b'obscache: could not write update %s\n' % exc) + repo.ui.log(b'obscache', b'could not write update %s\n' % forcebytestr(exc)) + repo.ui.debug(b'obscache: could not write update %s\n' % forcebytestr(exc)) def load(self, repo): """load data from disk""" diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/obsexchange.py --- a/hgext3rd/evolve/obsexchange.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/obsexchange.py Fri Feb 28 23:10:48 2020 +0700 @@ -7,17 +7,11 @@ from __future__ import absolute_import -try: - from StringIO import StringIO -except ImportError: - from io import StringIO - from mercurial import ( bundle2, error, exchange, extensions, - lock as lockmod, node, obsolete, pushkey, @@ -35,7 +29,6 @@ eh = exthelper.exthelper() eh.merge(obsdiscovery.eh) obsexcmsg = utility.obsexcmsg -obsexcprg = utility.obsexcprg eh.configitem(b'experimental', b'verbose-obsolescence-exchange', False) @@ -156,82 +149,6 @@ return _obscommon_capabilities(oldcap, repo, proto) wireprotov1server.commands[b'capabilities'] = (newcap, args) -def _pushobsmarkers(repo, data): - tr = lock = None - try: - lock = repo.lock() - tr = repo.transaction(b'pushkey: obsolete markers') - new = repo.obsstore.mergemarkers(tr, data) - if new is not None: - obsexcmsg(repo.ui, b"%i obsolescence markers added\n" % new, True) - tr.close() - finally: - lockmod.release(tr, lock) - repo.hook(b'evolve_pushobsmarkers') - -def srv_pushobsmarkers(repo, proto): - """wireprotocol command""" - fp = StringIO() - proto.redirect() - proto.getfile(fp) - data = fp.getvalue() - fp.close() - _pushobsmarkers(repo, data) - try: - from mercurial import wireprototypes - wireprototypes.pushres # force demandimport - except (ImportError, AttributeError): - from mercurial import wireproto as wireprototypes - return wireprototypes.pushres(0) - -def _getobsmarkersstream(repo, heads=None, common=None): - """Get a binary stream for all markers relevant to `:: - ::` - """ - revset = b'' - args = [] - repo = repo.unfiltered() - if heads is None: - revset = b'all()' - elif heads: - revset += b"(::%ln)" - args.append(heads) - else: - assert False, b'pulling no heads?' - if common: - revset += b' - (::%ln)' - args.append(common) - nodes = [c.node() for c in repo.set(revset, *args)] - markers = repo.obsstore.relevantmarkers(nodes) - obsdata = StringIO() - for chunk in obsolete.encodemarkers(markers, True): - obsdata.write(chunk) - obsdata.seek(0) - return obsdata - -def srv_pullobsmarkers(repo, proto, others): - """serves a binary stream of markers. - - Serves relevant to changeset between heads and common. The stream is prefix - by a -string- representation of an integer. This integer is the size of the - stream.""" - try: - from mercurial import wireprototypes, wireprotov1server - wireprototypes.pushres # force demandimport - except (ImportError, AttributeError): - from mercurial import wireproto as wireprototypes - wireprotov1server = wireprototypes - opts = wireprotov1server.options(b'', [b'heads', b'common'], others) - for k, v in opts.items(): - if k in (b'heads', b'common'): - opts[k] = wireprototypes.decodelist(v) - obsdata = _getobsmarkersstream(repo, **opts) - finaldata = StringIO() - obsdata = obsdata.getvalue() - finaldata.write(b'%20i' % len(obsdata)) - finaldata.write(obsdata) - finaldata.seek(0) - return wireprototypes.streamres(reader=finaldata, v1compressible=True) - abortmsg = b"won't exchange obsmarkers through pushkey" hint = b"upgrade your client or server to use the bundle2 protocol" diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/obshistory.py --- a/hgext3rd/evolve/obshistory.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/obshistory.py Fri Feb 28 23:10:48 2020 +0700 @@ -42,6 +42,10 @@ item.default = True efd.clear() +@eh.extsetup +def addtouchnoise(ui): + obsutil.METABLACKLIST.append(re.compile(br'^__touch-noise__$')) + @eh.command( b'obslog|olog', [(b'G', b'graph', True, _(b"show the revision DAG")), @@ -50,7 +54,8 @@ (b'p', b'patch', False, _(b'show the patch between two obs versions')), (b'f', b'filternonlocal', False, _(b'filter out non local commits')), ] + commands.formatteropts, - _(b'hg olog [OPTION]... [[-r] REV]...')) + _(b'hg olog [OPTION]... [[-r] REV]...'), + **compat.helpcategorykwargs('CATEGORY_CHANGE_NAVIGATION')) def cmdobshistory(ui, repo, *revs, **opts): """show the obsolescence history of the specified revisions @@ -85,55 +90,47 @@ revs = [b'.'] revs = scmutil.revrange(repo, revs) + # Use the default template unless the user provided one, but not if + # -f was given, because that doesn't work with templates yet. Note + # that --no-graph doesn't support -f (it ignores it), so we also + # don't use templating with --no-graph. + if not opts['template'] and not (opts['filternonlocal'] and opts['graph']): + opts['template'] = DEFAULT_TEMPLATE + if opts['graph']: return _debugobshistorygraph(ui, repo, revs, opts) revs.reverse() _debugobshistoryrevs(ui, repo, revs, opts) -def _successorsandmarkers(repo, ctx): - """compute the raw data needed for computing obsfate - Returns a list of dict, one dict per successors set - """ - ssets = obsutil.successorssets(repo, ctx.node(), closest=True) - - # closestsuccessors returns an empty list for pruned revisions, remap it - # into a list containing an empty list for future processing - if ssets == []: - ssets = [[]] - - # Try to recover pruned markers - succsmap = repo.obsstore.successors - fullsuccessorsets = [] # successor set + markers - for sset in ssets: - if sset: - fullsuccessorsets.append(compat.wrap_succs(sset)) - else: - # successorsset return an empty set() when ctx or one of its - # successors is pruned. - # In this case, walk the obs-markers tree again starting with ctx - # and find the relevant pruning obs-makers, the ones without - # successors. - # Having these markers allow us to compute some information about - # its fate, like who pruned this changeset and when. - - # XXX we do not catch all prune markers (eg rewritten then pruned) - # (fix me later) - foundany = False - for mark in succsmap.get(ctx.node(), ()): - if not mark[1]: - foundany = True - sset = compat._succs() - sset.markers.add(mark) - fullsuccessorsets.append(sset) - if not foundany: - fullsuccessorsets.append(compat._succs()) - - values = [] - for sset in fullsuccessorsets: - values.append({b'successors': sset, b'markers': sset.markers}) - - return values +TEMPLATE_MISSING_NODE = b"""{label("evolve.node evolve.missing_change_ctx", node|short)}""" +TEMPLATE_PRESENT_NODE = b"""{label("evolve.node", node|short)} {label("evolve.rev", "({rev})")} {label("evolve.short_description", desc|firstline)}""" +TEMPLATE_FIRST_LINE = b"""{if(rev, "%(presentnode)s", "%(missingnode)s")}""" % { + b"presentnode": TEMPLATE_PRESENT_NODE, + b"missingnode": TEMPLATE_MISSING_NODE +} +TEMPLATE_VERB = b"""{label("evolve.verb", verb)}""" +TEMPLATE_SUCCNODES = b"""{label("evolve.node", join(succnodes % "{succnode|short}", ", "))}""" +TEMPLATE_REWRITE = b"""{if(succnodes, "%(verb)s{if(effects, "({join(effects, ", ")})")} as %(succnodes)s", "pruned")}""" % { + b"verb": TEMPLATE_VERB, + b"succnodes": TEMPLATE_SUCCNODES +} +TEMPLATE_OPERATION = b"""{if(operation, "using {label("evolve.operation", operation)}")}""" +TEMPLATE_USER = b"""by {label("evolve.user", user)}""" +TEMPLATE_DATE = b"""{label("evolve.date", "({date(date, "%a %b %d %H:%M:%S %Y %1%2")})")}""" +TEMPLATE_NOTE = b"""{if(note, "\n note: {label("evolve.note", note)}")}""" +TEMPLATE_PATCH = b"""{if(patch, "{patch}")}{if(nopatchreason, "\n(No patch available, {nopatchreason})")}""" +DEFAULT_TEMPLATE = (b"""%(firstline)s +{markers %% " {separate(" ", "%(rewrite)s", "%(operation)s", "%(user)s", "%(date)s")}%(note)s{indent(descdiff, " ")}{indent("%(patch)s", " ")}\n"} +""") % { + b"firstline": TEMPLATE_FIRST_LINE, + b"rewrite": TEMPLATE_REWRITE, + b"operation": TEMPLATE_OPERATION, + b"user": TEMPLATE_USER, + b"date": TEMPLATE_DATE, + b"note": TEMPLATE_NOTE, + b"patch": TEMPLATE_PATCH, +} class obsmarker_printer(compat.changesetprinter): """show (available) information about a node @@ -178,23 +175,25 @@ succs = sorted(succs) for successor in succs: - _debugobshistorydisplaymarker(markerfm, successor, + _debugobshistorydisplaymarker(self.ui, markerfm, successor, ctx.node(), self.repo, self._includediff) else: - r = _successorsandmarkers(self.repo, ctx) + r = obsutil.successorsandmarkers(self.repo, ctx) + if r is None: + r = [] for succset in sorted(r): markers = succset[b"markers"] if not markers: continue successors = succset[b"successors"] - _debugobshistorydisplaysuccsandmarkers(markerfm, successors, markers, ctx.node(), self.repo, self._includediff) + _debugobshistorydisplaysuccsandmarkers(self.ui, markerfm, successors, markers, ctx.node(), self.repo, self._includediff) markerfm.end() - markerfm.plain(b'\n') + fm.plain(b'\n') fm.end() self.hunk[ctx.node()] = self.ui.popbuffer() @@ -454,8 +453,9 @@ markerfm = fm.nested(b"markers") for successor in sorted(succs): includediff = opts and opts.get("patch") - _debugobshistorydisplaymarker(markerfm, successor, ctxnode, unfi, includediff) + _debugobshistorydisplaymarker(ui, markerfm, successor, ctxnode, unfi, includediff) markerfm.end() + fm.plain(b'\n') precs = precursors.get(ctxnode, ()) for p in sorted(precs): @@ -477,12 +477,12 @@ shortdescription = shortdescription.splitlines()[0] fm.startitem() - fm.write(b'node', b'%s', bytes(ctx), - label=b"evolve.node") + fm.context(ctx=ctx) + fm.data(node=ctx.hex()) + fm.plain(b'%s' % bytes(ctx), label=b"evolve.node") fm.plain(b' ') - fm.write(b'rev', b'(%d)', ctx.rev(), - label=b"evolve.rev") + fm.plain(b'(%d)' % ctx.rev(), label=b"evolve.rev") fm.plain(b' ') fm.write(b'shortdescription', b'%s', shortdescription, @@ -490,84 +490,44 @@ fm.plain(b'\n') def _debugobshistorydisplaymissingctx(fm, nodewithoutctx): - hexnode = nodemod.short(nodewithoutctx) fm.startitem() - fm.write(b'node', b'%s', hexnode, + fm.data(node=nodemod.hex(nodewithoutctx)) + fm.plain(nodemod.short(nodewithoutctx), label=b"evolve.node evolve.missing_change_ctx") fm.plain(b'\n') -def _debugobshistorydisplaymarker(fm, marker, node, repo, includediff=False): +def _debugobshistorydisplaymarker(ui, fm, marker, node, repo, includediff=False): succnodes = marker[1] date = marker[4] metadata = dict(marker[3]) fm.startitem() - fm.plain(b' ') - - # Detect pruned revisions - if len(succnodes) == 0: - verb = b'pruned' - else: - verb = b'rewritten' - fm.write(b'verb', b'%s', verb, - label=b"evolve.verb") + verb = _successorsetverb(succnodes, [marker])[b"verb"] - effectflag = metadata.get(b'ef1') - if effectflag is not None: - try: - effectflag = int(effectflag) - except ValueError: - effectflag = None - if effectflag: - effect = [] + fm.data(verb=verb) - # XXX should be a dict - if effectflag & DESCCHANGED: - effect.append(b'description') - if effectflag & METACHANGED: - effect.append(b'meta') - if effectflag & USERCHANGED: - effect.append(b'user') - if effectflag & DATECHANGED: - effect.append(b'date') - if effectflag & BRANCHCHANGED: - effect.append(b'branch') - if effectflag & PARENTCHANGED: - effect.append(b'parent') - if effectflag & DIFFCHANGED: - effect.append(b'content') - - if effect: - fmteffect = fm.formatlist(effect, b'effect', sep=b', ') - fm.write(b'effect', b'(%s)', fmteffect) + effects = _markerseffects([marker]) + if effects: + fmteffect = fm.formatlist(effects, b'effect', sep=b', ') + fm.write(b'effects', b'(%s)', fmteffect) if len(succnodes) > 0: - fm.plain(b' as ') - - shortsnodes = (nodemod.short(succnode) for succnode in sorted(succnodes)) - nodes = fm.formatlist(shortsnodes, b'succnodes', sep=b', ') - fm.write(b'succnodes', b'%s', nodes, - label=b"evolve.node") + hexnodes = (nodemod.hex(succnode) for succnode in sorted(succnodes)) + nodes = fm.formatlist(hexnodes, b'succnode') + fm.write(b'succnodes', b'%s', nodes) operation = metadata.get(b'operation') if operation: - fm.plain(b' using ') - fm.write(b'operation', b'%s', operation, label=b"evolve.operation") - - fm.plain(b' by ') + fm.data(operation=operation) - fm.write(b'user', b'%s', metadata[b'user'], - label=b"evolve.user") - fm.plain(b' ') + fm.data(user=metadata[b'user']) - fm.write(b'date', b'(%s)', fm.formatdate(date), - label=b"evolve.date") + fm.data(date=date) # initial support for showing note if metadata.get(b'note'): - fm.plain(b'\n note: ') - fm.write(b'note', b"%s", metadata[b'note'], label=b"evolve.note") + fm.data(note=metadata[b'note']) # Patch display if includediff is True: @@ -592,15 +552,16 @@ def tolist(text): return [text] - fm.plain(b"\n") + ui.pushbuffer(labeled=True) + ui.write(b"\n") for chunk, label in patch.difflabel(tolist, descriptionpatch): chunk = chunk.strip(b'\t') - if chunk and chunk != b'\n': - fm.plain(b' ') - fm.write(b'desc-diff', b'%s', chunk, label=label) + ui.write(chunk, label=label) + fm.write(b'descdiff', b'%s', ui.popbuffer()) # Content patch + ui.pushbuffer(labeled=True) diffopts = patch.diffallopts(repo.ui, {}) matchfn = scmutil.matchall(repo) firstline = True @@ -608,23 +569,18 @@ for chunk, label in patch.diffui(repo, node, succ, matchfn, opts=diffopts): if firstline: - fm.plain(b'\n') + ui.write(b'\n') firstline = False if linestart: - fm.plain(b' ') linestart = False if chunk == b'\n': linestart = True - fm.write(b'patch', b'%s', chunk, label=label) + ui.write(chunk, label=label) + fm.data(patch=ui.popbuffer()) else: - nopatch = b" (No patch available, %s)" % _patchavailable[1] - fm.plain(b"\n") - # TODO: should be in json too - fm.plain(nopatch) + fm.data(nopatchreason=_patchavailable[1]) - fm.plain(b"\n") - -def _debugobshistorydisplaysuccsandmarkers(fm, succnodes, markers, node, repo, includediff=False): +def _debugobshistorydisplaysuccsandmarkers(ui, fm, succnodes, markers, node, repo, includediff=False): """ This function is a duplication of _debugobshistorydisplaymarker modified to accept multiple markers as input. @@ -632,54 +588,26 @@ fm.startitem() fm.plain(b' ') - # Detect pruned revisions verb = _successorsetverb(succnodes, markers)[b"verb"] fm.write(b'verb', b'%s', verb, label=b"evolve.verb") - # Effect flag - metadata = [dict(marker[3]) for marker in markers] - ef1 = [data.get(b'ef1') for data in metadata] - - effectflag = 0 - for ef in ef1: - if ef: - effectflag |= int(ef) - - if effectflag: - effect = [] - - # XXX should be a dict - if effectflag & DESCCHANGED: - effect.append(b'description') - if effectflag & METACHANGED: - effect.append(b'meta') - if effectflag & USERCHANGED: - effect.append(b'user') - if effectflag & DATECHANGED: - effect.append(b'date') - if effectflag & BRANCHCHANGED: - effect.append(b'branch') - if effectflag & PARENTCHANGED: - effect.append(b'parent') - if effectflag & DIFFCHANGED: - effect.append(b'content') - - if effect: - fmteffect = fm.formatlist(effect, b'effect', sep=b', ') - fm.write(b'effect', b'(%s)', fmteffect) + effects = _markerseffects(markers) + if effects: + fmteffect = fm.formatlist(effects, b'effect', sep=b', ') + fm.write(b'effects', b'(%s)', fmteffect) if len(succnodes) > 0: fm.plain(b' as ') shortsnodes = (nodemod.short(succnode) for succnode in sorted(succnodes)) - nodes = fm.formatlist(shortsnodes, b'succnodes', sep=b', ') + nodes = fm.formatlist(shortsnodes, b'succnode', sep=b', ') fm.write(b'succnodes', b'%s', nodes, label=b"evolve.node") # Operations - operations = compat.markersoperations(markers) + operations = obsutil.markersoperations(markers) if operations: fm.plain(b' using ') fm.write(b'operation', b'%s', b", ".join(operations), label=b"evolve.operation") @@ -687,13 +615,13 @@ fm.plain(b' by ') # Users - users = compat.markersusers(markers) + users = obsutil.markersusers(markers) fm.write(b'user', b'%s', b", ".join(users), label=b"evolve.user") fm.plain(b' ') # Dates - dates = compat.markersdates(markers) + dates = obsutil.markersdates(markers) if dates: min_date = min(dates) max_date = max(dates) @@ -732,15 +660,18 @@ def tolist(text): return [text] - fm.plain(b"\n") + ui.pushbuffer(labeled=True) + ui.write(b"\n") for chunk, label in patch.difflabel(tolist, descriptionpatch): chunk = chunk.strip(b'\t') if chunk and chunk != b'\n': - fm.plain(b' ') - fm.write(b'desc-diff', b'%s', chunk, label=label) + ui.write(b' ') + ui.write(chunk, label=label) + fm.write(b'descdiff', b'%s', ui.popbuffer()) # Content patch + ui.pushbuffer(labeled=True) diffopts = patch.diffallopts(repo.ui, {}) matchfn = scmutil.matchall(repo) firstline = True @@ -748,50 +679,21 @@ for chunk, label in patch.diffui(repo, node, succ, matchfn, opts=diffopts): if firstline: - fm.plain(b'\n') + ui.write(b'\n') firstline = False if linestart: - fm.plain(b' ') + ui.write(b' ') linestart = False if chunk == b'\n': linestart = True - fm.write(b'patch', b'%s', chunk, label=label) + ui.write(chunk, label=label) + fm.write(b'patch', b'%s', ui.popbuffer()) else: - nopatch = b" (No patch available, %s)" % _patchavailable[1] - fm.plain(b"\n") - # TODO: should be in json too - fm.plain(nopatch) + fm.write(b'nopatchreason', b"\n (No patch available, %s)", + _patchavailable[1]) fm.plain(b"\n") -# logic around storing and using effect flags -DESCCHANGED = 1 << 0 # action changed the description -METACHANGED = 1 << 1 # action change the meta -PARENTCHANGED = 1 << 2 # action change the parent -DIFFCHANGED = 1 << 3 # action change diff introduced by the changeset -USERCHANGED = 1 << 4 # the user changed -DATECHANGED = 1 << 5 # the date changed -BRANCHCHANGED = 1 << 6 # the branch changed - -METABLACKLIST = [ - re.compile(br'^__touch-noise__$'), - re.compile(br'^branch$'), - re.compile(br'^.*-source$'), - re.compile(br'^.*_source$'), - re.compile(br'^source$'), -] - -def ismetablacklisted(metaitem): - """ Check that the key of a meta item (extrakey, extravalue) does not - match at least one of the blacklist pattern - """ - metakey = metaitem[0] - for pattern in METABLACKLIST: - if pattern.match(metakey): - return False - - return True - def _prepare_hunk(hunk): """Drop all information but the username and patch""" cleanunk = [] @@ -810,40 +712,14 @@ return None return _prepare_hunk(lines) -def _getobsfate(successorssets): - """ Compute a changeset obsolescence fate based on his successorssets. - Successors can be the tipmost ones or the immediate ones. - Returns one fate in the following list: - - pruned - - diverged - - superseed - - superseed_split - """ - - if len(successorssets) == 0: - # The commit has been pruned - return b'pruned' - elif len(successorssets) > 1: - return b'diverged' - else: - # No divergence, only one set of successors - successors = successorssets[0] - - if len(successors) == 1: - return b'superseed' - else: - return b'superseed_split' - -def _getobsfateandsuccs(repo, revnode, successorssets=None): +def _getobsfateandsuccs(repo, revnode): """ Return a tuple containing: - - the reason a revision is obsolete (diverged, pruned or superseed) + - the reason a revision is obsolete (diverged, pruned or superseded) - the list of successors short node if the revision is neither pruned or has diverged """ - if successorssets is None: - successorssets = obsutil.successorssets(repo, revnode) - - fate = _getobsfate(successorssets) + successorssets = obsutil.successorssets(repo, revnode) + fate = obsutil._getobsfate(successorssets) # Apply node.short if we have no divergence if len(successorssets) == 1: @@ -855,42 +731,69 @@ return (fate, successors) -def _successorsetdates(successorset, markers): - """returns the max date and the min date of the markers list - """ +EFFECTMAPPING = util.sortdict([ + (obsutil.DESCCHANGED, b'description'), + (obsutil.METACHANGED, b'meta'), + (obsutil.USERCHANGED, b'user'), + (obsutil.DATECHANGED, b'date'), + (obsutil.BRANCHCHANGED, b'branch'), + (obsutil.PARENTCHANGED, b'parent'), + (obsutil.DIFFCHANGED, b'content'), +]) - if not markers: - return {} - - dates = [m[4] for m in markers] +def _markerseffects(markers): + """ Return a list of effects as strings based on effect flags in markers - return { - b'min_date': min(dates), - b'max_date': max(dates) - } - -def _successorsetusers(successorset, markers): - """ Returns a sorted list of markers users without duplicates + Return None if verb cannot be more precise than just "rewritten", i.e. when + markers collectively have more than one effect in the flags. """ - if not markers: - return {} + metadata = [dict(marker[3]) for marker in markers] + ef1 = [data.get(b'ef1') for data in metadata] + effects = [] - # Check that user is present in meta - markersmeta = [dict(m[3]) for m in markers] - users = set(meta.get(b'user') for meta in markersmeta if meta.get(b'user')) + combined = 0 + for ef in ef1: + if ef: + combined |= int(ef) - return {b'users': sorted(users)} + if combined: + for key, value in EFFECTMAPPING.items(): + if combined & key: + effects.append(value) + + return effects VERBMAPPING = { - DESCCHANGED: b"reworded", - METACHANGED: b"meta-changed", - USERCHANGED: b"reauthored", - DATECHANGED: b"date-changed", - BRANCHCHANGED: b"branch-changed", - PARENTCHANGED: b"rebased", - DIFFCHANGED: b"amended" + obsutil.DESCCHANGED: b"reworded", + obsutil.METACHANGED: b"meta-changed", + obsutil.USERCHANGED: b"reauthored", + obsutil.DATECHANGED: b"date-changed", + obsutil.BRANCHCHANGED: b"branch-changed", + obsutil.PARENTCHANGED: b"rebased", + obsutil.DIFFCHANGED: b"amended" } +def _markerspreciseverb(markers): + """ Return a more precise verb based on effect flags in markers + + Return None if verb cannot be more precise than just "rewritten", i.e. when + markers collectively have more than one effect in the flags. + """ + metadata = [dict(marker[3]) for marker in markers] + + if len(metadata) == 1 and metadata[0].get(b'fold-id') is not None: + return b'folded' + + ef1 = [data.get(b'ef1') for data in metadata] + if all(ef1): + combined = 0 + for ef in ef1: + combined |= int(ef) + + # Combined will be in VERBMAPPING only if one bit is set + if combined in VERBMAPPING: + return VERBMAPPING[combined] + def _successorsetverb(successorset, markers): """ Return the verb summarizing the successorset """ @@ -898,19 +801,7 @@ if not successorset: verb = b'pruned' elif len(successorset) == 1: - # Check for effect flag - - metadata = [dict(marker[3]) for marker in markers] - ef1 = [data.get(b'ef1') for data in metadata] - - if all(ef1): - combined = 0 - for ef in ef1: - combined |= int(ef) - - # Combined will be in VERBMAPPING only of one bit is set - if combined in VERBMAPPING: - verb = VERBMAPPING[combined] + verb = _markerspreciseverb(markers) if verb is None: verb = b'rewritten' @@ -919,101 +810,6 @@ return {b'verb': verb} # Use a more advanced version of obsfateverb that uses effect-flag -if util.safehasattr(obsutil, 'obsfateverb'): - - @eh.wrapfunction(obsutil, 'obsfateverb') - def obsfateverb(orig, *args, **kwargs): - return _successorsetverb(*args, **kwargs)[b'verb'] - -# Hijack callers of successorsetverb -elif util.safehasattr(obsutil, 'obsfateprinter'): - - @eh.wrapfunction(obsutil, 'obsfateprinter') - def obsfateprinter(orig, successors, markers, ui): - - def closure(successors): - return _successorsetverb(successors, markers)[b'verb'] - - if not util.safehasattr(obsutil, 'successorsetverb'): - return orig(successors, markers, ui) - - # Save the old value - old = obsutil.successorsetverb - - try: - # Replace by own - obsutil.successorsetverb = closure - - # Call the orig - result = orig(successors, markers, ui) - - # And return result - return result - finally: - # Replace the old one - obsutil.successorsetverb = old - -FORMATSSETSFUNCTIONS = [ - _successorsetdates, - _successorsetusers, - _successorsetverb -] - -def successorsetallmarkers(successorset, pathscache): - """compute all successors of a successorset. - - pathscache must contains all successors starting from selected nodes - or revision. This way, iterating on each successor, we can take all - precursors and have the subgraph of all obsmarkers between roots to - successors. - """ - - markers = set() - seen = set() - - for successor in successorset: - stack = [successor] - - while stack: - element = stack.pop() - seen.add(element) - for prec, mark in pathscache.get(element, []): - if prec not in seen: - # Process element precursors - stack.append(prec) - - if mark not in markers: - markers.add(mark) - - return markers - -def preparesuccessorset(successorset, rawmarkers): - """ For a successor set, get all related markers, compute the set of user, - the min date and the max date - """ - hex = nodemod.hex - - successorset = [hex(n) for n in successorset] - - # hex the binary nodes in the markers - markers = [] - for m in rawmarkers: - hexprec = hex(m[0]) - hexsucs = tuple(hex(n) for n in m[1]) - hexparents = None - if m[5] is not None: - hexparents = tuple(hex(n) for n in m[5]) - newmarker = (hexprec, hexsucs) + m[2:5] + (hexparents,) + m[6:] - markers.append(newmarker) - - # Format basic data - data = { - b"successors": sorted(successorset), - b"markers": sorted(markers) - } - - # Call an extensible list of functions to override or add new data - for function in FORMATSSETSFUNCTIONS: - data.update(function(successorset, markers)) - - return data +@eh.wrapfunction(obsutil, 'obsfateverb') +def obsfateverb(orig, *args, **kwargs): + return _successorsetverb(*args, **kwargs)[b'verb'] diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/rewind.py --- a/hgext3rd/evolve/rewind.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/rewind.py Fri Feb 28 23:10:48 2020 +0700 @@ -36,7 +36,8 @@ _(b"do not modify working directory during rewind")), ], _(b'[--as-divergence] [--exact] [--keep] [--to REV]... [--from REV]...'), - helpbasic=True) + helpbasic=True, + **compat.helpcategorykwargs('CATEGORY_CHANGE_MANAGEMENT')) def rewind(ui, repo, **opts): """rewind a stack of changesets to a previous state diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/rewriteutil.py --- a/hgext3rd/evolve/rewriteutil.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/rewriteutil.py Fri Feb 28 23:10:48 2020 +0700 @@ -21,7 +21,7 @@ lock as lockmod, node, obsolete, - phases, + obsutil, revset, util, ) @@ -76,6 +76,31 @@ msg %= (action, len(newunstable)) hint = _(b"see 'hg help evolution.instability'") raise error.Abort(msg, hint=hint) + divrisk = revs_hascontentdivrisk(repo, revs) + allowdivergence = repo.ui.configbool(b'experimental', + b'evolution.allowdivergence') + if divrisk and not allowdivergence: + localdiv = repo[divrisk[0]] + otherdiv, base = repo[divrisk[1][0]], repo[divrisk[1][1]] + msg = _(b"%s of %s creates content-divergence " + b"with %s") % (action, localdiv, otherdiv) + if localdiv.rev() != base.rev(): + msg += _(b', from %s') % base + hint = _(b"add --verbose for details or see " + b"'hg help evolution.instability'") + if repo.ui.verbose: + if localdiv.rev() != base.rev(): + msg += _(b'\n changeset %s is an evolution of ' + b'changeset %s') % (localdiv, base) + msg += _(b'\n changeset %s already have a successors as ' + b'changeset %s\n' + b' rewriting changeset %s would create ' + b'"content-divergence"\n' + b' set experimental.evolution.allowdivergence=True to ' + b'overwrite this check') % (base, otherdiv, localdiv) + hint = _(b"see 'hg help evolution.instability' for details " + b"on content-divergence") + raise error.Abort(msg, hint=hint) def bookmarksupdater(repo, oldid, tr): """Return a callable update(newid) updating the current bookmark @@ -88,6 +113,14 @@ repo._bookmarks.applychanges(repo, tr, bmchanges) return updatebookmarks +def revs_hascontentdivrisk(repo, revs): + obsrevs = repo.revs(b'%ld and obsolete()', revs) + for r in obsrevs: + div = precheck_contentdiv(repo, repo[r]) + if div: + return [r, div] + return [] + def disallowednewunstable(repo, revs): """Check that editing will not create disallowed unstable @@ -105,9 +138,6 @@ if len(roots) > 1: raise error.Abort(_(b"cannot fold non-linear revisions " b"(multiple roots given)")) - root = repo[roots.first()] - if root.phase() <= phases.public: - raise error.Abort(_(b"cannot fold public revisions")) heads = repo.revs(b'heads(%ld)', revs) if len(heads) > 1: raise error.Abort(_(b"cannot fold non-linear revisions " @@ -124,6 +154,7 @@ hint = _(b'set experimental.evolution.allowdivergence=yes' b' to allow folding them') raise error.Abort(msg, hint=hint) + root = repo[roots.first()] # root's p1 is already used as the target ctx p1 baseparents -= {root.p1().rev()} p2 = repo[baseparents.first()] @@ -254,3 +285,31 @@ return newid, created finally: lockmod.release(tr, lock, wlock) + +def precheck_contentdiv(repo, ctx): + """return divergent revision if rewriting an obsolete cset (ctx) will + create divergence""" + # We need to check two cases that can cause divergence: + # case 1: the rev being rewritten has a non-obsolete successor (easily + # detected by successorssets) + divergent = [] # contains [divergent_cset, common_precursor] + sset = obsutil.successorssets(repo, ctx.node()) + nodivergencerisk = (len(sset) == 0 + or (len(sset) == 1 + and len(sset[0]) == 1 + and repo[sset[0][0]].rev() == ctx.rev() + )) + if nodivergencerisk: + # case 2: one of the precursors of the rev being revived has a + # non-obsolete successor (we need divergentsets for this) + from . import evolvecmd + divsets = evolvecmd.divergentsets(repo, ctx) + if divsets: + nsuccset = divsets[0][b'divergentnodes'] + divergent.append(nsuccset[0]) + prec = divsets[0][b'commonprecursor'] + divergent.append(prec) + else: + divergent.append(sset[0][0]) + divergent.append(ctx.node()) + return divergent diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/stablerangecache.py --- a/hgext3rd/evolve/stablerangecache.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/stablerangecache.py Fri Feb 28 23:10:48 2020 +0700 @@ -22,6 +22,12 @@ util, ) +try: + from mercurial.utils.stringutil import forcebytestr +except ImportError: + # hg <= 4.5 (f99d64e8a4e4) + from mercurial.util import forcebytestr + from . import ( compat, exthelper, @@ -282,8 +288,8 @@ if r'_con' in vars(self): del self._con self._unsavedsubranges.clear() - repo.ui.log(b'evoext-cache', b'error while saving new data: %s' % exc) - repo.ui.debug(b'evoext-cache: error while saving new data: %s' % exc) + repo.ui.log(b'evoext-cache', b'error while saving new data: %s' % forcebytestr(exc)) + repo.ui.debug(b'evoext-cache: error while saving new data: %s' % forcebytestr(exc)) def _trysave(self, repo): repo = repo.unfiltered() diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/stablesort.py --- a/hgext3rd/evolve/stablesort.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/stablesort.py Fri Feb 28 23:10:48 2020 +0700 @@ -259,6 +259,12 @@ scmutil, ) +try: + from mercurial.utils.stringutil import forcebytestr +except ImportError: + # hg <= 4.5 (f99d64e8a4e4) + from mercurial.util import forcebytestr + from mercurial.i18n import _ from . import ( @@ -932,8 +938,8 @@ cachefile.close() self._ondiskkey = self._cachekey except (IOError, OSError) as exc: - repo.ui.log(b'stablesortcache', b'could not write update %s\n' % exc) - repo.ui.debug(b'stablesortcache: could not write update %s\n' % exc) + repo.ui.log(b'stablesortcache', b'could not write update %s\n' % forcebytestr(exc)) + repo.ui.debug(b'stablesortcache: could not write update %s\n' % forcebytestr(exc)) @eh.reposetup def setupcache(ui, repo): diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/templatekw.py --- a/hgext3rd/evolve/templatekw.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/templatekw.py Fri Feb 28 23:10:48 2020 +0700 @@ -11,7 +11,6 @@ from . import ( error, exthelper, - obshistory ) from mercurial import ( @@ -24,7 +23,7 @@ ### template keywords if util.safehasattr(templatekw, 'compatlist'): - @eh.templatekeyword(b'instabilities', requires=set([b'ctx', b'templ'])) + @eh.templatekeyword(b'instabilities', requires={b'ctx', b'templ'}) def showinstabilities(context, mapping): """List of strings. Evolution instabilities affecting the changeset (zero or more of "orphan", "content-divergent" or "phase-divergent").""" @@ -33,7 +32,7 @@ ctx.instabilities(), plural=b'instabilities') - @eh.templatekeyword(b'troubles', requires=set([b'ctx', b'templ'])) + @eh.templatekeyword(b'troubles', requires={b'ctx', b'templ'}) def showtroubles(context, mapping): # legacy name for instabilities ctx = context.resource(mapping, b'ctx') return templatekw.compatlist(context, mapping, b'trouble', @@ -87,192 +86,6 @@ except error.Abort: # no easy way to avoid ui raising Abort here :-/ return None -def obsfatedefaulttempl(ui): - """ Returns a dict with the default templates for obs fate - """ - # Prepare templates - verbtempl = b'{verb}' - usertempl = b'{if(users, " by {join(users, ", ")}")}' - succtempl = b'{if(successors, " as ")}{successors}' # Bypass if limitation - datetempleq = b' (at {min_date|isodate})' - datetemplnoteq = b' (between {min_date|isodate} and {max_date|isodate})' - datetempl = b'{if(max_date, "{ifeq(min_date, max_date, "%s", "%s")}")}' % (datetempleq, datetemplnoteq) - - optionalusertempl = usertempl - username = _getusername(ui) - if username is not None: - optionalusertempl = (b'{ifeq(join(users, "\0"), "%s", "", "%s")}' - % (username, usertempl)) - - # Assemble them - return { - b'obsfate_quiet': verbtempl + succtempl, - b'obsfate': verbtempl + succtempl + optionalusertempl, - b'obsfate_verbose': verbtempl + succtempl + usertempl + datetempl, - } - -def obsfatedata(repo, ctx): - """compute the raw data needed for computing obsfate - Returns a list of dict - """ - if not ctx.obsolete(): - return None - - successorssets, pathcache = closestsuccessors(repo, ctx.node()) - - # closestsuccessors returns an empty list for pruned revisions, remap it - # into a list containing en empty list for future processing - if successorssets == []: - successorssets = [[]] - - succsmap = repo.obsstore.successors - fullsuccessorsets = [] # successor set + markers - for sset in successorssets: - if sset: - markers = obshistory.successorsetallmarkers(sset, pathcache) - fullsuccessorsets.append((sset, markers)) - else: - # XXX we do not catch all prune markers (eg rewritten then pruned) - # (fix me later) - foundany = False - for mark in succsmap.get(ctx.node(), ()): - if not mark[1]: - foundany = True - fullsuccessorsets.append((sset, [mark])) - if not foundany: - fullsuccessorsets.append(([], [])) - - values = [] - for sset, rawmarkers in fullsuccessorsets: - raw = obshistory.preparesuccessorset(sset, rawmarkers) - values.append(raw) - - return values - -def obsfatelineprinter(obsfateline, ui): - quiet = ui.quiet - verbose = ui.verbose - normal = not verbose and not quiet - - # Build the line step by step - line = [] - - # Verb - line.append(obsfateline[b'verb']) - - # Successors - successors = obsfateline[b"successors"] - - if successors: - fmtsuccessors = map(lambda s: s[:12], successors) - line.append(b" as %s" % b", ".join(fmtsuccessors)) - - # Users - if (verbose or normal) and b'users' in obsfateline: - users = obsfateline[b'users'] - - if not verbose: - # If current user is the only user, do not show anything if not in - # verbose mode - username = _getusername(ui) - if len(users) == 1 and users[0] == username: - users = None - - if users: - line.append(b" by %s" % b", ".join(users)) - - # Date - if verbose: - min_date = obsfateline[b'min_date'] - max_date = obsfateline[b'max_date'] - - if min_date == max_date: - fmtmin_date = util.datestr(min_date, b'%Y-%m-%d %H:%M %1%2') - line.append(b" (at %s)" % fmtmin_date) - else: - fmtmin_date = util.datestr(min_date, b'%Y-%m-%d %H:%M %1%2') - fmtmax_date = util.datestr(max_date, b'%Y-%m-%d %H:%M %1%2') - line.append(b" (between %s and %s)" % (fmtmin_date, fmtmax_date)) - - return b"".join(line) - -def obsfateprinter(obsfate, ui, prefix=b""): - lines = [] - for raw in obsfate: - lines.append(obsfatelineprinter(raw, ui)) - - if prefix: - lines = [prefix + line for line in lines] - - return b"\n".join(lines) - -if not util.safehasattr(templatekw, 'obsfateverb'): # <= hg-4.5 - @eh.templatekeyword(b"obsfatedata") - def showobsfatedata(repo, ctx, **args): - # Get the needed obsfate data - values = obsfatedata(repo, ctx) - - if values is None: - return templatekw.showlist(b"obsfatedata", [], args) - - return _showobsfatedata(repo, ctx, values, **args) - -def _showobsfatedata(repo, ctx, values, **args): - - # Format each successorset successors list - for raw in values: - # As we can't do something like - # "{join(map(nodeshort, successors), ', '}" in template, manually - # create a correct textual representation - gen = b', '.join(n[:12] for n in raw[b'successors']) - - makemap = lambda x: {b'successor': x} - joinfmt = lambda d: b"%s" % d[b'successor'] - raw[b'successors'] = templatekw._hybrid(gen, raw[b'successors'], makemap, - joinfmt) - - # And then format them - # Insert default obsfate templates - args[b'templ'].cache.update(obsfatedefaulttempl(repo.ui)) - - if repo.ui.quiet: - name = b"obsfate_quiet" - elif repo.ui.verbose: - name = b"obsfate_verbose" - elif repo.ui.debugflag: - name = b"obsfate_debug" - else: - name = b"obsfate" - - # Format a single value - def fmt(d): - nargs = args.copy() - nargs.update(d[name]) - templ = args[b'templ'] - # HG 4.6 - if hasattr(templ, "generate"): - return templ.generate(name, nargs) - else: - return args[b'templ'](name, **nargs) - - # Generate a good enough string representation using templater - gen = [] - for d in values: - chunk = fmt({name: d}) - chunkstr = [] - - # Empty the generator - try: - while True: - chunkstr.append(next(chunk)) - except StopIteration: - pass - - gen.append(b"".join(chunkstr)) - gen = b"; ".join(gen) - - return templatekw._hybrid(gen, values, lambda x: {name: x}, fmt) - # copy from mercurial.obsolete with a small change to stop at first known changeset. def directsuccessorssets(repo, initialnode, cache=None): diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/evolve/utility.py --- a/hgext3rd/evolve/utility.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/evolve/utility.py Fri Feb 28 23:10:48 2020 +0700 @@ -13,10 +13,6 @@ from mercurial.node import nullrev -from . import ( - compat, -) - shorttemplate = b"[{label('evolve.rev', rev)}] {desc|firstline}\n" stacktemplate = b"""[{label('evolve.rev', if(topicidx, "s{topicidx}", rev))}] {desc|firstline}\n""" @@ -27,12 +23,6 @@ if important or verbose: ui.status(message) -def obsexcprg(ui, *args, **kwargs): - topic = b'obsmarkers exchange' - if ui.configbool(b'experimental', b'verbose-obsolescence-exchange'): - topic = b'OBSEXC' - compat.progress(ui, topic, *args, **kwargs) - def filterparents(parents): """filter nullrev parents @@ -85,6 +75,8 @@ def __init__(self, successorssets): self.successorssets = successorssets + self.divergenceflag = len(successorssets) > 1 + self.splitflag = len(successorssets[0]) > 1 def builddependencies(repo, revs): """returns dependency graphs giving an order to solve instability of revs @@ -126,13 +118,41 @@ ui.debug(b"stabilize target %s is plain dead," b" trying to stabilize on its parent\n" % obs) - obs = obs.parents()[0] + obs = obs.p1() newer = obsutil.successorssets(repo, obs.node()) if len(newer) > 1 or len(newer[0]) > 1: raise MultipleSuccessorsError(newer) return repo[newer[0][0]].rev() +def picksplitsuccessor(ui, repo, ctx, evolvecand): + """choose a successor of ctx from split targets + + Choose highest one if all successors are in a topological branch. And if + they are split over multiple topological branches, we ask user to choose + an evolve destination. + + Return (True, succ) unless split targets are split over multiple + topological branches and user didn't choose any evolve destination, + in which case return (False, '.') + """ + targets = obsutil.successorssets(repo, ctx.node())[0] + assert targets + targetrevs = [repo[r].rev() for r in targets] + roots = repo.revs(b'roots(%ld)', targetrevs) + heads = repo.revs(b'heads(%ld)', targetrevs) + if len(roots) > 1 or len(heads) > 1: + cheader = (_(b"ancestor '%s' split over multiple topological" + b" branches.\nchoose an evolve destination:") % + evolvecand) + selectedrev = revselectionprompt(ui, repo, list(heads), cheader) + if selectedrev is None: + return (False, '.') + succ = repo[selectedrev] + else: + succ = repo[heads.first()] + return (True, repo[succ].rev()) + def _successorrevs(repo, ctx): try: return {_singlesuccessor(repo, ctx)} diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/pullbundle.py --- a/hgext3rd/pullbundle.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/pullbundle.py Fri Feb 28 23:10:48 2020 +0700 @@ -87,6 +87,7 @@ node as nodemod, registrar, scmutil, + ui as uimod, util, ) @@ -508,7 +509,7 @@ if 1 < min_cache: repo.ui.write(b" not caching ranges smaller than %d changesets\n" % min_cache) for i in range(count): - repo.ui.progress(b'gathering data', i, total=count) + progress(repo.ui, b'gathering data', i, total=count) outgoing = takeonesample(repo, actionrevs) ranges = sliceoutgoing(repo, outgoing) hitranges = 0 @@ -532,7 +533,7 @@ hitranges, ) pullstats.append(stats) - repo.ui.progress(b'gathering data', None) + progress(repo.ui, b'gathering data', None) sizes = [] changesmissing = [] @@ -591,6 +592,7 @@ def takeonesample(repo, revs): node = repo.changelog.node + revs = list(revs) pulled = random.sample(revs, max(4, len(revs) // 1000)) pulled = repo.revs(b'%ld::%ld', pulled, pulled) nodes = [node(r) for r in pulled] @@ -610,19 +612,32 @@ b'max': data[-1], } -STATSFORMAT = b"""{name}: - min: {min} - 10%: {10%} - 25%: {25%} - 50%: {50%} - 75%: {75%} - 90%: {90%} - 95%: {95%} - max: {max} +STATSFORMAT = b"""%(name)s: + min: %(min)r + 10%%: %(10%)r + 25%%: %(25%)r + 50%%: %(50%)r + 75%%: %(75%)r + 90%%: %(90%)r + 95%%: %(95%)r + max: %(max)r """ def fmtdist(name, data): - return STATSFORMAT.format(name=name, **data) + data[b'name'] = name + return STATSFORMAT % data + +# hg <= 4.6 (bec1212eceaa) +if util.safehasattr(uimod.ui, 'makeprogress'): + def progress(ui, topic, pos, item=b"", unit=b"", total=None): + progress = ui.makeprogress(topic, unit, total) + if pos is not None: + progress.update(pos, item=item) + else: + progress.complete() +else: + def progress(ui, topic, pos, item=b"", unit=b"", total=None): + ui.progress(topic, pos, item, unit, total) # nodemap.get and index.[has_node|rev|get_rev] # hg <= 5.3 (02802fa87b74) diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/serverminitopic.py --- a/hgext3rd/serverminitopic.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/serverminitopic.py Fri Feb 28 23:10:48 2020 +0700 @@ -23,10 +23,11 @@ util, ) +# hg <= 4.5 (b4d85bc122bd) try: - from mercurial import wireproto + from mercurial import wireproto # pytype: disable=import-error wireproto.branchmap -except ImportError: # <= hg-4.5 +except ImportError: from mercurial import wireprotov1server as wireproto if util.safehasattr(registrar, 'configitem'): diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/topic/__init__.py --- a/hgext3rd/topic/__init__.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/topic/__init__.py Fri Feb 28 23:10:48 2020 +0700 @@ -110,6 +110,19 @@ [experimental] topic.allow-publish = no +Server side visibility +====================== + +Serving changesets with topics to clients without topic extension can get +confusing. Such clients will have multiple anonymous heads without a clear way +to distinguish them. They will also "lose" the canonical heads of the branch. + +To avoid this confusion, server can be configured to only serve changesets with +topics to clients with the topic extension (version 9.3+). This might become +the default in future:: + + [experimental] + topic.server-gate-topic-changesets = yes """ from __future__ import absolute_import @@ -135,6 +148,7 @@ namespaces, node, obsolete, + obsutil, patch, phases, pycompat, @@ -154,6 +168,7 @@ flow, randomname, revset as topicrevset, + server, stack, topicmap, ) @@ -187,10 +202,10 @@ b'topic.active': b'green', } -__version__ = b'0.17.2.dev' +__version__ = b'0.18.1.dev' -testedwith = b'4.5.2 4.6.2 4.7 4.8 4.9 5.0 5.1' -minimumhgversion = b'4.5' +testedwith = b'4.6.2 4.7 4.8 4.9 5.0 5.1 5.2 5.3' +minimumhgversion = b'4.6' buglink = b'https://bz.mercurial-scm.org/' if util.safehasattr(registrar, 'configitem'): @@ -221,6 +236,9 @@ configitem(b'experimental', b'topic-mode.server', default=configitems.dynamicdefault, ) + configitem(b'experimental', b'topic.server-gate-topic-changesets', + default=False, + ) def extsetup(ui): # register config that strictly belong to other code (thg, core, etc) @@ -363,6 +381,8 @@ # Wrap changelog.add to drop empty topic extensions.wrapfunction(changelog.changelog, 'add', wrapadd) + server.setupserver(ui) + def reposetup(ui, repo): if not isinstance(repo, localrepo.localrepository): return # this can be a peer in the ssh case (puzzling) @@ -384,14 +404,14 @@ return caps def commit(self, *args, **kwargs): - backup = self.ui.backupconfig(b'ui', b'allowemptycommit') - try: - if self.currenttopic != self[b'.'].topic(): - # bypass the core "nothing changed" logic - self.ui.setconfig(b'ui', b'allowemptycommit', True) + configoverride = util.nullcontextmanager() + if self.currenttopic != self[b'.'].topic(): + # bypass the core "nothing changed" logic + configoverride = self.ui.configoverride({ + (b'ui', b'allowemptycommit'): True + }) + with configoverride: return super(topicrepo, self).commit(*args, **kwargs) - finally: - self.ui.restoreconfig(backup) def commitctx(self, ctx, *args, **kwargs): topicfilter = topicmap.topicfilter(self.filtername) @@ -559,7 +579,7 @@ msg = _(b"active topic '%s' grew its first changeset\n%s") ui.status(msg % (ct, hint)) else: - msg = _(b"active topic '%s' grew its %s first changesets\n%s") + msg = _(b"active topic '%s' grew its %d first changesets\n%s") ui.status(msg % (ct, csetcount, hint)) tr.addpostclose(b'signalcurrenttopicempty', currenttopicempty) @@ -634,7 +654,8 @@ (b'', b'age', False, b'show when you last touched the topics'), (b'', b'current', None, b'display the current topic only'), ] + commands.formatteropts, - _(b'hg topics [OPTION]... [-r REV]... [TOPIC]')) + _(b'hg topics [OPTION]... [-r REV]... [TOPIC]'), + **compat.helpcategorykwargs('CATEGORY_CHANGE_ORGANIZATION')) def topics(ui, repo, topic=None, **opts): """View current topic, set current topic, change topic for a set of revisions, or see all topics. @@ -777,7 +798,8 @@ (b'c', b'children', None, _(b'display data about children outside of the stack')) ] + commands.formatteropts, - _(b'hg stack [TOPIC]')) + _(b'hg stack [TOPIC]'), + **compat.helpcategorykwargs('CATEGORY_CHANGE_NAVIGATION')) def cmdstack(ui, repo, topic=b'', **opts): """list all changesets in a topic and other information @@ -1115,7 +1137,7 @@ user = repo[revs].user() # looking on the markers also to get more information and accurate # last touch time. - obsmarkers = compat.getmarkers(repo, [repo[revs].node()]) + obsmarkers = obsutil.getmarkers(repo, [repo[revs].node()]) for marker in obsmarkers: rt = marker.date() if rt[0] > maxtime[0]: @@ -1258,14 +1280,13 @@ def checkt0(orig, ui, repo, node=None, rev=None, *args, **kwargs): thezeros = set([b't0', b'b0', b's0']) - backup = repo.ui.backupconfig(b'_internal', b'keep-topic') - try: - if node in thezeros or rev in thezeros: - repo.ui.setconfig(b'_internal', b'keep-topic', b'yes', - source=b'topic-extension') + configoverride = util.nullcontextmanager() + if node in thezeros or rev in thezeros: + configoverride = repo.ui.configoverride({ + (b'_internal', b'keep-topic'): b'yes' + }, source=b'topic-extension') + with configoverride: return orig(ui, repo, node=node, rev=rev, *args, **kwargs) - finally: - repo.ui.restoreconfig(backup) def _fixrebase(loaded): if not loaded: diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/topic/compat.py --- a/hgext3rd/topic/compat.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/topic/compat.py Fri Feb 28 23:10:48 2020 +0700 @@ -8,25 +8,11 @@ from __future__ import absolute_import from mercurial import ( - obsolete, pycompat, + registrar, util, ) -getmarkers = None -successorssets = None -try: - from mercurial import obsutil - getmarkers = getattr(obsutil, 'getmarkers', None) - successorssets = getattr(obsutil, 'successorssets', None) -except ImportError: - pass - -if getmarkers is None: - getmarkers = obsolete.getmarkers -if successorssets is None: - successorssets = obsolete.successorssets - if pycompat.ispy3: def branchmapitems(branchmap): return branchmap.items() @@ -36,6 +22,15 @@ return branchmap.iteritems() # py3-transform: on +# help category compatibility +# hg <= 4.7 (c303d65d2e34) +def helpcategorykwargs(categoryname): + """Backwards-compatible specification of the helpategory argument.""" + category = getattr(registrar.command, categoryname, None) + if not category: + return {} + return {'helpcategory': category} + # nodemap.get and index.[has_node|rev|get_rev] # hg <= 5.3 (02802fa87b74) def getgetrev(cl): diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/topic/discovery.py --- a/hgext3rd/topic/discovery.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/topic/discovery.py Fri Feb 28 23:10:48 2020 +0700 @@ -17,10 +17,11 @@ compat, ) +# hg <= 4.5 (b4d85bc122bd) try: - from mercurial import wireproto + from mercurial import wireproto # pytype: disable=import-error wireproto.branchmap -except (AttributeError, ImportError): # <= hg-4.5 +except (AttributeError, ImportError): from mercurial import wireprotov1server as wireproto def _headssummary(orig, pushop, *args, **kwargs): diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/topic/evolvebits.py --- a/hgext3rd/topic/evolvebits.py Thu Jan 30 14:32:04 2020 +0700 +++ b/hgext3rd/topic/evolvebits.py Fri Feb 28 23:10:48 2020 +0700 @@ -81,7 +81,7 @@ ui.debug(b"stabilize target %s is plain dead," b" trying to stabilize on its parent\n" % obs) - obs = obs.parents()[0] + obs = obs.p1() newer = obsutil.successorssets(repo, obs.node()) if 1 < len(newer): # divergence case diff -r dd9037486a90 -r 8d20c0af010a hgext3rd/topic/server.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgext3rd/topic/server.py Fri Feb 28 23:10:48 2020 +0700 @@ -0,0 +1,108 @@ +# topic/server.py - server specific behavior with topic +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2 or any later version. +from mercurial import ( + extensions, + repoview, + wireprototypes, + wireprotov1peer, + wireprotov1server, +) + + +try: + from mercurial.utils import ( + repoviewutil, + ) + repoviewutil.subsettable +except (AttributeError, ImportError): + # hg <= 4.8 + from mercurial import branchmap as repoviewutil + +from . import ( + common, + constants, +) + +### Visibility restriction +# +# Serving draft changesets with topics to clients without topic extension can +# confuse them, because they won't see the topic label and will consider them +# normal anonymous heads. Instead we have the option to not serve changesets +# with topics to clients without topic support. +# +# To achieve this, we alter the behavior of the standard `heads` commands and +# introduce a new `heads` command that only clients with topic will know about. + +# compat version of the wireprotocommand decorator, taken from evolve compat + +FILTERNAME = b'served-no-topic' + +def computeunservedtopic(repo, visibilityexceptions=None): + assert not repo.changelog.filteredrevs + filteredrevs = repoview.filtertable[b'served'](repo, visibilityexceptions).copy() + mutable = repoview.filtertable[b'immutable'](repo, visibilityexceptions) + consider = mutable - filteredrevs + cl = repo.changelog + extrafiltered = set() + for r in consider: + if cl.changelogrevision(r).extra.get(constants.extrakey, b''): + extrafiltered.add(r) + if extrafiltered: + extrafiltered = set(repo.revs('%ld::%ld', extrafiltered, consider)) + filteredrevs = frozenset(filteredrevs | extrafiltered) + return filteredrevs + +def wireprotocommand(name, args=b'', permission=b'pull'): + try: + from mercurial.wireprotov1server import wireprotocommand + except (ImportError, AttributeError): + # hg <= 4.6 (b4d85bc122bd) + from mercurial.wireproto import wireprotocommand + return wireprotocommand(name, args, permission=permission) + +def wrapheads(orig, repo, proto): + """wrap head to hide topic^W draft changeset to old client""" + hidetopics = repo.ui.configbool(b'experimental', b'topic.server-gate-topic-changesets') + if common.hastopicext(repo) and hidetopics: + h = repo.filtered(FILTERNAME).heads() + return wireprototypes.bytesresponse(wireprototypes.encodelist(h) + b'\n') + return orig(repo, proto) + +def topicheads(repo, proto): + """Same as the normal wireprotocol command, but accessing with a different end point.""" + h = repo.heads() + return wireprototypes.bytesresponse(wireprototypes.encodelist(h) + b'\n') + +def wireprotocaps(orig, repo, proto): + """advertise the new topic specific `head` command for client with topic""" + caps = orig(repo, proto) + if common.hastopicext(repo) and repo.peer().capable(b'topics'): + caps.append(b'_exttopics_heads') + return caps + +def setupserver(ui): + extensions.wrapfunction(wireprotov1server, 'heads', wrapheads) + wireprotov1server.commands.pop(b'heads') + wireprotocommand(b'heads', permission=b'pull')(wireprotov1server.heads) + wireprotocommand(b'_exttopics_heads', permission=b'pull')(topicheads) + extensions.wrapfunction(wireprotov1server, '_capabilities', wireprotocaps) + + class topicpeerexecutor(wireprotov1peer.peerexecutor): + + def callcommand(self, command, args): + if command == b'heads': + if self._peer.capable(b'_exttopics_heads'): + command = b'_exttopics_heads' + if getattr(self._peer, '_exttopics_heads', None) is None: + self._peer._exttopics_heads = self._peer.heads + s = super(topicpeerexecutor, self) + return s.callcommand(command, args) + + wireprotov1peer.peerexecutor = topicpeerexecutor + + if FILTERNAME not in repoview.filtertable: + repoview.filtertable[FILTERNAME] = computeunservedtopic + repoviewutil.subsettable[FILTERNAME] = b'immutable' + repoviewutil.subsettable[b'served'] = FILTERNAME diff -r dd9037486a90 -r 8d20c0af010a tests/test-amend-patch.t --- a/tests/test-amend-patch.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-amend-patch.t Fri Feb 28 23:10:48 2020 +0700 @@ -88,7 +88,7 @@ @ af624b221c0c (1) added a | x f7ad41964313 (0) added a - rewritten(content) as af624b221c0c using amend by test (Thu Jan 01 00:00:00 1970 +0000) + amended(content) as af624b221c0c using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff --git a/a b/a --- a/a +++ b/a diff -r dd9037486a90 -r 8d20c0af010a tests/test-amend.t --- a/tests/test-amend.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-amend.t Fri Feb 28 23:10:48 2020 +0700 @@ -25,7 +25,7 @@ @ 6a022cbb61d5 (1) adda | x 07f494440405 (0) adda - rewritten(branch) as 6a022cbb61d5 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + branch-changed(branch) as 6a022cbb61d5 using amend by test (Thu Jan 01 00:00:00 1970 +0000) note: this a note on the obsmarker and supported for hg>=4.4 $ hg branch @@ -121,6 +121,9 @@ update: (current) phases: 3 draft +setting the user after we have performed the test with no username + $ HGUSER=test + Check the help $ hg amend -h hg amend [OPTION]... [FILE]... @@ -170,3 +173,61 @@ $ hg amend --patch --extract abort: cannot use both --patch and --extract [255] + + $ cd .. + +Check the pre-check logic for content-divergence + $ hg init precheckrepo + $ cd precheckrepo + $ echo a > a + $ hg ci -Am "added a" + adding a + $ echo newchanges > a + $ hg amend + $ hg up 0 --hidden -q + updated to hidden changeset 9092f1db7931 + (hidden revision '9092f1db7931' was rewritten as: aafaf407b00d) + working directory parent is obsolete! (9092f1db7931) + +when rewritting an already rewritten changeset (i.e cset being rewritten will +be the base of divergence) + $ hg amend -m "i am gonna create divergence" + abort: amend of 9092f1db7931 creates content-divergence with aafaf407b00d + (add --verbose for details or see 'hg help evolution.instability') + [255] + $ hg amend -m "i am gonna create divergence" --verbose + abort: amend of 9092f1db7931 creates content-divergence with aafaf407b00d + changeset 9092f1db7931 already have a successors as changeset aafaf407b00d + rewriting changeset 9092f1db7931 would create "content-divergence" + set experimental.evolution.allowdivergence=True to overwrite this check + (see 'hg help evolution.instability' for details on content-divergence) + [255] + +when rewritting a cset which has a predecessor with non-obsolete successor + +to prepare the repo +1) create content-divergence +2) remove divergence by pruning one of the divergent cset + $ echo edited_a > a + $ hg ci -m "edited a" + 1 new orphan changesets + $ hg debugobsolete $(hg id -ir 0 --debug) $(hg id -ir 2 --debug) + 2 new content-divergent changesets + +remove divergence by pruning one side of divergenence + $ hg debugobsolete $(hg id -ir 2 --debug) + obsoleted 1 changesets + + $ hg evolve -l + $ hg amend -m "i am gonna create divergence" + abort: amend of f8c05838af90 creates content-divergence with aafaf407b00d, from 9092f1db7931 + (add --verbose for details or see 'hg help evolution.instability') + [255] + $ hg amend -m "i am gonna create divergence" --verbose + abort: amend of f8c05838af90 creates content-divergence with aafaf407b00d, from 9092f1db7931 + changeset f8c05838af90 is an evolution of changeset 9092f1db7931 + changeset 9092f1db7931 already have a successors as changeset aafaf407b00d + rewriting changeset f8c05838af90 would create "content-divergence" + set experimental.evolution.allowdivergence=True to overwrite this check + (see 'hg help evolution.instability' for details on content-divergence) + [255] diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-content-divergent-basic.t --- a/tests/test-evolve-content-divergent-basic.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-content-divergent-basic.t Fri Feb 28 23:10:48 2020 +0700 @@ -21,6 +21,8 @@ > unified = 0 > [ui] > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline} [{instabilities}]\n + > [experimental] + > evolution.allowdivergence = True > [extensions] > EOF $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH @@ -998,7 +1000,7 @@ @ 8c2a6aae4bc5 (5) E4 | x aae293050980 (4) <<<<<<< divergent - |\ rewritten(description) as 8c2a6aae4bc5 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + |\ reworded(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 diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-content-divergent-corner-cases.t --- a/tests/test-evolve-content-divergent-corner-cases.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-content-divergent-corner-cases.t Fri Feb 28 23:10:48 2020 +0700 @@ -21,6 +21,8 @@ > unified = 0 > [ui] > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline} [{instabilities}]\n + > [experimental] + > evolution.allowdivergence = True > [extensions] > EOF $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-content-divergent-first-changeset.t --- a/tests/test-evolve-content-divergent-first-changeset.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-content-divergent-first-changeset.t Fri Feb 28 23:10:48 2020 +0700 @@ -1,6 +1,10 @@ $ . $TESTDIR/testlib/pythonpath.sh - $ echo "[extensions]" >> $HGRCPATH - $ echo "evolve=" >> $HGRCPATH + $ cat >> $HGRCPATH << EOF + > [extensions] + > evolve= + > [experimental] + > evolution.allowdivergence = True + > EOF This test file tests the case of content-divergence resolution of changesets that have the null revision as the parent. diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-content-divergent-interrupted.t --- a/tests/test-evolve-content-divergent-interrupted.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-content-divergent-interrupted.t Fri Feb 28 23:10:48 2020 +0700 @@ -24,6 +24,8 @@ > publish = False > [alias] > glog = log -GT "{rev}:{node|short} {desc}\n ({bookmarks}) {phase}" + > [experimental] + > evolution.allowdivergence = True > [extensions] > EOF $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH @@ -239,11 +241,11 @@ | @ 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) + |/ amended(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) + amended(content) as 2ba73e31f264 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + amended(content) as 7398f702a162 using amend by test (Thu Jan 01 00:00:00 1970 +0000) $ cd .. diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-content-divergent-meta.t --- a/tests/test-evolve-content-divergent-meta.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-content-divergent-meta.t Fri Feb 28 23:10:48 2020 +0700 @@ -12,8 +12,11 @@ > glog = log -GT "{rev}:{node|short} {desc|firstline}\n {phase} {instabilities}\n\n" > [phases] > publish = False + > [experimental] + > evolution.allowdivergence = True > [extensions] > rebase = + > strip = > EOF $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH @@ -157,3 +160,213 @@ user: baruser, foouser $ cd .. + +Test the content-divergence resolution involving date update +------------------------------------------------------------ + + $ hg init divergingdate + $ cd divergingdate + $ unset HGUSER + $ echo "[ui]" >> ./.hg/hgrc + $ echo "username = test" >> ./.hg/hgrc + + $ echo hi > r0 + $ hg ci -qAm 'add r0' + $ echo hi > foo.txt + $ hg ci -qAm 'add foo.txt' + $ hg metaedit -r . -d '0 2' + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + +date: updated on both side to the same value + + $ echo hi > bar.txt + $ hg add -q bar.txt + $ hg amend -q + $ hg metaedit -r 1 -d '0 1' --hidden + 2 new content-divergent changesets + $ hg log -G + * changeset: 4:c17bf400a278 + | tag: tip + | parent: 0:a24ed8ad918c + | user: test + | date: Wed Dec 31 23:59:59 1969 -0000 + | instability: content-divergent + | summary: add foo.txt + | + | @ changeset: 3:a25dd7af6cf6 + |/ parent: 0:a24ed8ad918c + | user: test + | date: Wed Dec 31 23:59:58 1969 -0000 + | instability: content-divergent + | summary: add foo.txt + | + o changeset: 0:a24ed8ad918c + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: add r0 + + $ hg evolve --list --rev . + a25dd7af6cf6: add foo.txt + content-divergent: c17bf400a278 (draft) (precursor cc71ffbc7c00) + + $ hg log --hidden -r cc71ffbc7c00 -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' + 1 cc71ffbc7c00 1970-01-01 00:00 +0000: date-changed using metaedit as 4:c17bf400a278; date-changed using metaedit as 2:0065551bd38f + $ hg log -r 'desc("add foo.txt")' -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' + 3 a25dd7af6cf6 1969-12-31 23:59 -0000: + 4 c17bf400a278 1969-12-31 23:59 -0000: + $ hg evolve --content-divergent + merge:[3] add foo.txt + with: [4] add foo.txt + base: [1] add foo.txt + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 6c144bb30333 + $ hg log -r 'desc("add foo.txt")' -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' + 5 6c144bb30333 1969-12-31 23:59 -0000: + +date: updated one one side to an older value + + $ hg strip . + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + saved backup bundle to $TESTTMP/divergingdate/.hg/strip-backup/6c144bb30333-72e26b88-backup.hg + 2 new content-divergent changesets + $ hg up tip + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg amend --date "0 3" + $ hg log -G + @ changeset: 5:6189a9adfff0 + | tag: tip + | parent: 0:a24ed8ad918c + | user: test + | date: Wed Dec 31 23:59:57 1969 -0000 + | instability: content-divergent + | summary: add foo.txt + | + | * changeset: 3:a25dd7af6cf6 + |/ parent: 0:a24ed8ad918c + | user: test + | date: Wed Dec 31 23:59:58 1969 -0000 + | instability: content-divergent + | summary: add foo.txt + | + o changeset: 0:a24ed8ad918c + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: add r0 + + $ hg evolve --list -r . + 6189a9adfff0: add foo.txt + content-divergent: a25dd7af6cf6 (draft) (precursor cc71ffbc7c00) + + $ hg log -r cc71ffbc7c00+6189a9adfff0+a25dd7af6cf6 --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' + 1 cc71ffbc7c00 1970-01-01 00:00 +0000: date-changed using metaedit as 4:c17bf400a278; date-changed using metaedit as 2:0065551bd38f + 5 6189a9adfff0 1969-12-31 23:59 -0000: + 3 a25dd7af6cf6 1969-12-31 23:59 -0000: + $ hg evolve --content-divergent + merge:[3] add foo.txt + with: [5] add foo.txt + base: [1] add foo.txt + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 806d0024c04d + $ hg log -r . --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' + 6 806d0024c04d 1969-12-31 23:59 -0000: + +date: updated one side to an newer value + + $ hg strip . + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + saved backup bundle to $TESTTMP/divergingdate/.hg/strip-backup/806d0024c04d-24cb28ad-backup.hg + 2 new content-divergent changesets + $ hg update a25dd7af6cf6 --hidden + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg amend --date "120 0" + $ hg log -G + @ changeset: 6:5199d0bc13d4 + | tag: tip + | parent: 0:a24ed8ad918c + | user: test + | date: Thu Jan 01 00:02:00 1970 +0000 + | instability: content-divergent + | summary: add foo.txt + | + | * changeset: 5:6189a9adfff0 + |/ parent: 0:a24ed8ad918c + | user: test + | date: Wed Dec 31 23:59:57 1969 -0000 + | instability: content-divergent + | summary: add foo.txt + | + o changeset: 0:a24ed8ad918c + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: add r0 + + $ hg evolve --list -r . + 5199d0bc13d4: add foo.txt + content-divergent: 6189a9adfff0 (draft) (precursor cc71ffbc7c00) + + $ hg up 6189a9adfff0 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg log -r cc71ffbc7c00+6189a9adfff0+5199d0bc13d4 --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' + 1 cc71ffbc7c00 1970-01-01 00:00 +0000: date-changed using metaedit as 4:c17bf400a278; date-changed using metaedit as 2:0065551bd38f + 5 6189a9adfff0 1969-12-31 23:59 -0000: + 6 5199d0bc13d4 1970-01-01 00:02 +0000: + $ hg evolve --content-divergent + merge:[5] add foo.txt + with: [6] add foo.txt + base: [1] add foo.txt + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 51e08ac59670 + $ hg log -r . --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' + 7 51e08ac59670 1970-01-01 00:02 +0000: + +date: updated each side to a different value, newer should win + + $ hg strip . + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + saved backup bundle to $TESTTMP/divergingdate/.hg/strip-backup/51e08ac59670-d8a3c2ca-backup.hg + 2 new content-divergent changesets + $ hg up tip + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg amend --date "235 0" + $ hg update 6189a9adfff0 --hidden + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg amend --date "784 0" + $ hg log -G + @ changeset: 8:75254fb3164b + | tag: tip + | parent: 0:a24ed8ad918c + | user: test + | date: Thu Jan 01 00:13:04 1970 +0000 + | instability: content-divergent + | summary: add foo.txt + | + | * changeset: 7:5421a7efcc6e + |/ parent: 0:a24ed8ad918c + | user: test + | date: Thu Jan 01 00:03:55 1970 +0000 + | instability: content-divergent + | summary: add foo.txt + | + o changeset: 0:a24ed8ad918c + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: add r0 + + $ hg evolve --list -r . + 75254fb3164b: add foo.txt + content-divergent: 5421a7efcc6e (draft) (precursor cc71ffbc7c00) + + $ hg log -r 6189a9adfff0+5421a7efcc6e+75254fb3164b --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' + 5 6189a9adfff0 1969-12-31 23:59 -0000: date-changed using amend as 8:75254fb3164b + 7 5421a7efcc6e 1970-01-01 00:03 +0000: + 8 75254fb3164b 1970-01-01 00:13 +0000: + $ hg evolve --content-divergent + merge:[7] add foo.txt + with: [8] add foo.txt + base: [1] add foo.txt + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at ab7c0a425dc9 + $ hg log -r . --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' + 9 ab7c0a425dc9 1970-01-01 00:13 +0000: + + $ cd .. diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-content-divergent-relocation.t --- a/tests/test-evolve-content-divergent-relocation.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-content-divergent-relocation.t Fri Feb 28 23:10:48 2020 +0700 @@ -289,16 +289,16 @@ | | 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) + | | amended(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) + | | rebased(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) + |/ amended(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) + amended(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) diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-content-divergent-stack.t --- a/tests/test-evolve-content-divergent-stack.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-content-divergent-stack.t Fri Feb 28 23:10:48 2020 +0700 @@ -10,6 +10,7 @@ > [phases] > publish = False > [extensions] + > strip = > rebase = > EOF $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH @@ -348,6 +349,386 @@ | () [default] draft o 0:8fa14d15e168 added hgignore () [default] draft + +when "divergent" and "other" both hit merge conflict in relocating +------------------------------------------------------------------ + + $ hg strip 14: --hidden + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + saved backup bundle to $TESTTMP/stackrepo1/.hg/strip-backup/74fbf3e6a0b6-f3612603-backup.hg + 8 new content-divergent changesets + +Prepare repo to have merge conflicts + $ hg up -r "max(desc('added a'))" + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg evolve -r . --content-divergent + merge:[10] added a + with: [5] watbar to a + base: [1] added a + rebasing "other" content-divergent changeset 8e222f257bbf on 2228e3b74514 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + 6 new orphan changesets + working directory is now at 74fbf3e6a0b6 + $ echo b_conflict > b + $ hg amend -A + adding b + +Let's try to evolve stack + $ hg evolve --content-divergent + merge:[11] added b + with: [6] added b + base: [2] added b + rebasing "divergent" content-divergent changeset 6eb54b5af3fb on 119989a4317e + merging b + warning: conflicts while merging b! (edit, then use 'hg resolve --mark') + unresolved merge conflicts + (see 'hg help evolve.interrupted') + [1] + + $ echo b > b + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + $ hg evolve --continue + evolving 11:6eb54b5af3fb "added b" + rebasing "other" content-divergent changeset d5f148423c16 on 119989a4317e + merging b + warning: conflicts while merging b! (edit, then use 'hg resolve --mark') + unresolved merge conflicts + (see 'hg help evolve.interrupted') + [1] + + $ echo b > b + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + $ hg evolve --continue + evolving 6:d5f148423c16 "added b" + 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 "divergent" content-divergent changeset 8ed612937375 on 646bd3372ee7 + rebasing "other" content-divergent changeset 3ce4be6d8e5e on 646bd3372ee7 + 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 "divergent" content-divergent changeset d45f050514c2 on 67abc597e636 + rebasing "other" content-divergent changeset c72d2885eb51 on 67abc597e636 + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 119989a4317e + $ hg glog + o 25:5e2572194f59 added d + | () [default] draft + o 22:67abc597e636 added c + | () [default] draft + o 19:646bd3372ee7 added b + | () [default] draft + @ 16:119989a4317e watbar to a + | () [default] draft + o 9:2228e3b74514 add newfile + | () [default] draft + o 0:8fa14d15e168 added hgignore + () [default] draft + +when relocating "other" hit merge conflict but not "divergent" +-------------------------------------------------------------- + $ hg strip 14: --hidden + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + saved backup bundle to $TESTTMP/stackrepo1/.hg/strip-backup/74fbf3e6a0b6-15474722-backup.hg + 8 new content-divergent changesets + +Insert conflicting changes in between the stack of content-div csets + $ hg up -r "max(desc('added b'))" + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo b_diverging_local > b + $ hg amend + 2 new orphan changesets + $ hg evolve + move:[12] added c + atop:[14] added b + move:[13] added d + $ hg up -r d5f148423c16 + 2 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo b_diverging_other > b + $ hg amend + 2 new orphan changesets + $ hg evolve + move:[7] added c + atop:[17] added b + move:[8] added d + + $ hg log -r tip + changeset: 19:c351be27f199 + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + instability: content-divergent + summary: added d + +Now let's try to evolve stack + $ hg evolve --content-divergent + merge:[10] added a + with: [5] watbar to a + base: [1] added a + rebasing "other" content-divergent changeset 8e222f257bbf on 2228e3b74514 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + merge:[14] added b + with: [17] added b + base: [2] added b + rebasing "divergent" content-divergent changeset 2a955e808c53 on 74fbf3e6a0b6 + rebasing "other" content-divergent changeset 509103439e5e on 74fbf3e6a0b6 + 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 + 4 new orphan changesets + unresolved merge conflicts + (see 'hg help evolve.interrupted') + [1] + +As now we have interrupted evolution of stack of content-divergent cset (when +relocation of "divergent" also included) let's test --abort and --stop +test --abort: + $ hg evolve --abort + 2 new content-divergent changesets + evolve aborted + working directory is now at 509103439e5e + +confirm that tip is same as it was before we started --content-div resolution + $ hg log -r tip + changeset: 19:c351be27f199 + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + instability: content-divergent + summary: added d + +test --stop: + $ hg log -G + * changeset: 19:c351be27f199 + | tag: tip + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | instability: content-divergent + | summary: added d + | + * changeset: 18:eaf34afe4df3 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | instability: content-divergent + | summary: added c + | + @ changeset: 17:509103439e5e + | parent: 5:8e222f257bbf + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | instability: content-divergent + | summary: added b + | + | * changeset: 16:91c8ccb9c241 + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | instability: content-divergent + | | summary: added d + | | + | * changeset: 15:48b0f803817a + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | instability: content-divergent + | | summary: added c + | | + | * changeset: 14:2a955e808c53 + | | parent: 10:c04ff147ef79 + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | instability: content-divergent + | | summary: added b + | | + | * changeset: 10:c04ff147ef79 + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | instability: content-divergent + | | summary: added a + | | + | o changeset: 9:2228e3b74514 + | | parent: 0:8fa14d15e168 + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: add newfile + | | + * | changeset: 5:8e222f257bbf + |/ parent: 0:8fa14d15e168 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | instability: content-divergent + | summary: watbar to a + | + o changeset: 0:8fa14d15e168 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: added hgignore + + $ hg evolve --content-divergent + merge:[10] added a + with: [5] watbar to a + base: [1] added a + rebasing "other" content-divergent changeset 8e222f257bbf on 2228e3b74514 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + merge:[14] added b + with: [17] added b + base: [2] added b + rebasing "divergent" content-divergent changeset 2a955e808c53 on 74fbf3e6a0b6 + rebasing "other" content-divergent changeset 509103439e5e on 74fbf3e6a0b6 + 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 + 4 new orphan changesets + unresolved merge conflicts + (see 'hg help evolve.interrupted') + [1] + + $ hg evolve --stop + 2 new orphan changesets + stopped the interrupted evolve + working directory is now at 2a955e808c53 + $ hg log -G + o changeset: 21:74fbf3e6a0b6 + | tag: tip + | parent: 9:2228e3b74514 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: watbar to a + | + | * changeset: 19:c351be27f199 + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | instability: orphan, content-divergent + | | summary: added d + | | + | * changeset: 18:eaf34afe4df3 + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | instability: orphan, content-divergent + | | summary: added c + | | + | * changeset: 17:509103439e5e + | | parent: 5:8e222f257bbf + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | instability: orphan, content-divergent + | | summary: added b + | | + | | * changeset: 16:91c8ccb9c241 + | | | user: test + | | | date: Thu Jan 01 00:00:00 1970 +0000 + | | | instability: orphan, content-divergent + | | | summary: added d + | | | + | | * changeset: 15:48b0f803817a + | | | user: test + | | | date: Thu Jan 01 00:00:00 1970 +0000 + | | | instability: orphan, content-divergent + | | | summary: added c + | | | + | | @ changeset: 14:2a955e808c53 + | | | parent: 10:c04ff147ef79 + | | | user: test + | | | date: Thu Jan 01 00:00:00 1970 +0000 + | | | instability: orphan, content-divergent + | | | summary: added b + | | | + +---x changeset: 10:c04ff147ef79 + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | obsolete: rewritten using evolve as 21:74fbf3e6a0b6 + | | summary: added a + | | + o | changeset: 9:2228e3b74514 + | | parent: 0:8fa14d15e168 + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: add newfile + | | + | x changeset: 5:8e222f257bbf + |/ parent: 0:8fa14d15e168 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | obsolete: rebased using evolve as 21:74fbf3e6a0b6 + | summary: watbar to a + | + o changeset: 0:8fa14d15e168 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: added hgignore + + $ hg obslog -r 'desc("watbar to a")' --all + o 74fbf3e6a0b6 (21) watbar to a + |\ + x | 186bdc2cdfa2 (20) watbar to a + | | rewritten as 74fbf3e6a0b6 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | + | x c04ff147ef79 (10) added a + | | rewritten(description, content) as 74fbf3e6a0b6 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | | + x | 8e222f257bbf (5) watbar to a + |/ rebased(parent) as 186bdc2cdfa2 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | + x c7586e2a9264 (1) added a + rewritten(description, content) as 8e222f257bbf using amend by test (Thu Jan 01 00:00:00 1970 +0000) + rebased(parent) as c04ff147ef79 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + + $ hg obslog -r 'desc("added b")' --all + @ 2a955e808c53 (14) added b + | + | * 509103439e5e (17) added b + | | + x | 6eb54b5af3fb (11) added b + | | amended(content) as 2a955e808c53 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | | + | x d5f148423c16 (6) added b + |/ amended(content) as 509103439e5e using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | + x b1661037fa25 (2) added b + rebased(parent) as 6eb54b5af3fb using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + rebased(parent) as d5f148423c16 using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + + +Again, let's evolve the stack + $ hg evolve --content-divergent + merge:[14] added b + with: [17] added b + base: [2] added b + rebasing "divergent" content-divergent changeset 2a955e808c53 on 74fbf3e6a0b6 + rebasing "other" content-divergent changeset 509103439e5e on 74fbf3e6a0b6 + 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 + unresolved merge conflicts + (see 'hg help evolve.interrupted') + [1] + + $ echo foo > b + $ hg res -m + (no more unresolved files) + continue: hg evolve --continue + $ hg evolve --continue + merge:[15] added c + with: [18] added c + base: [3] added c + rebasing "divergent" content-divergent changeset 48b0f803817a on 4e29776e83a5 + rebasing "other" content-divergent changeset eaf34afe4df3 on 4e29776e83a5 + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + merge:[16] added d + with: [19] added d + base: [4] added d + rebasing "divergent" content-divergent changeset 91c8ccb9c241 on 77126af93a25 + rebasing "other" content-divergent changeset c351be27f199 on 77126af93a25 + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at 4e29776e83a5 + + $ hg evolve -l + $ cd .. Make sure that content-divergent resolution doesn't undo a change (issue6203) diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-continue.t --- a/tests/test-evolve-continue.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-continue.t Fri Feb 28 23:10:48 2020 +0700 @@ -434,3 +434,31 @@ M c A d ? c.orig + + $ cd .. + $ hg init transitive-renames + $ cd transitive-renames + $ echo 1 > a + $ echo 1 > b + $ hg ci -Aqm initial + $ echo 2 > a + $ hg mv b c + $ hg ci -m 'rename b to c' + $ echo 3 > a + $ hg mv c d + $ hg ci -m 'rename c to d' + $ hg prev -q + $ echo 2b > a + $ hg amend -q + 1 new orphan changesets + $ hg ev -q + warning: conflicts while merging a! (edit, then use 'hg resolve --mark') + unresolved merge conflicts + (see 'hg help evolve.interrupted') + [1] + $ hg st -C + M a + A d + c + R c + ? a.orig diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-cycles.t --- a/tests/test-evolve-cycles.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-cycles.t Fri Feb 28 23:10:48 2020 +0700 @@ -264,7 +264,7 @@ | | rewritten(description, parent, content) as c473644ee0e9 using prune by test (Thu Jan 01 00:00:00 1970 +0000) | | x | a8df460dbbfe (3) C - | | rewritten(description, parent, content) as 2a34000d3544, 868d2e0eb19c using prune by test (Thu Jan 01 00:00:00 1970 +0000) + | | split(description, parent, content) as 2a34000d3544, 868d2e0eb19c using prune by test (Thu Jan 01 00:00:00 1970 +0000) | | x | c473644ee0e9 (2) B | | rewritten(description, parent, content) as a8df460dbbfe using prune by test (Thu Jan 01 00:00:00 1970 +0000) @@ -284,7 +284,7 @@ | | rewritten(description, parent, content) as c473644ee0e9 using prune by test (Thu Jan 01 00:00:00 1970 +0000) | | x | a8df460dbbfe (3) C - | | rewritten(description, parent, content) as 2a34000d3544, 868d2e0eb19c using prune by test (Thu Jan 01 00:00:00 1970 +0000) + | | split(description, parent, content) as 2a34000d3544, 868d2e0eb19c using prune by test (Thu Jan 01 00:00:00 1970 +0000) | | x | c473644ee0e9 (2) B | | rewritten(description, parent, content) as a8df460dbbfe using prune by test (Thu Jan 01 00:00:00 1970 +0000) @@ -300,21 +300,20 @@ *, (glob) 0 ], - "effect": [ + "effects": [ "description", "parent", "content" ], "operation": "prune", "succnodes": [ - "0da815c333f6" + "0da815c333f6364b46c86b0a897c00eb617397b6" ], "user": "test", "verb": "rewritten" } ], - "node": "868d2e0eb19c", - "rev": 4, + "node": "868d2e0eb19c2b55a2894d37e1c435c221384d48", "shortdescription": "D" }, { @@ -324,21 +323,20 @@ *, (glob) 0 ], - "effect": [ + "effects": [ "description", "parent", "content" ], "operation": "prune", "succnodes": [ - "868d2e0eb19c" + "868d2e0eb19c2b55a2894d37e1c435c221384d48" ], "user": "test", "verb": "rewritten" } ], - "node": "d9f908fde1a1", - "rev": 6, + "node": "d9f908fde1a10ad198a462a3ec8b440bb397fc9c", "shortdescription": "F" }, { @@ -348,21 +346,20 @@ *, (glob) 0 ], - "effect": [ + "effects": [ "description", "parent", "content" ], "operation": "prune", "succnodes": [ - "d9f908fde1a1" + "d9f908fde1a10ad198a462a3ec8b440bb397fc9c" ], "user": "test", "verb": "rewritten" } ], - "node": "0da815c333f6", - "rev": 5, + "node": "0da815c333f6364b46c86b0a897c00eb617397b6", "shortdescription": "E" }, { @@ -372,22 +369,21 @@ *, (glob) 0 ], - "effect": [ + "effects": [ "description", "parent", "content" ], "operation": "prune", "succnodes": [ - "2a34000d3544", - "868d2e0eb19c" + "2a34000d35446022104f7a091c06fe21ff2b5912", + "868d2e0eb19c2b55a2894d37e1c435c221384d48" ], "user": "test", - "verb": "rewritten" + "verb": "split" } ], - "node": "a8df460dbbfe", - "rev": 3, + "node": "a8df460dbbfe9ef0c1e5ab4fff02e9514672e379", "shortdescription": "C" }, { @@ -397,21 +393,20 @@ *, (glob) 0 ], - "effect": [ + "effects": [ "description", "parent", "content" ], "operation": "prune", "succnodes": [ - "a8df460dbbfe" + "a8df460dbbfe9ef0c1e5ab4fff02e9514672e379" ], "user": "test", "verb": "rewritten" } ], - "node": "c473644ee0e9", - "rev": 2, + "node": "c473644ee0e988d7f537e31423831bbc409f12f7", "shortdescription": "B" }, { @@ -421,21 +416,20 @@ *, (glob) 0 ], - "effect": [ + "effects": [ "description", "parent", "content" ], "operation": "prune", "succnodes": [ - "c473644ee0e9" + "c473644ee0e988d7f537e31423831bbc409f12f7" ], "user": "test", "verb": "rewritten" } ], - "node": "2a34000d3544", - "rev": 1, + "node": "2a34000d35446022104f7a091c06fe21ff2b5912", "shortdescription": "A" } ] diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-effectflags.t --- a/tests/test-evolve-effectflags.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-effectflags.t Fri Feb 28 23:10:48 2020 +0700 @@ -34,7 +34,7 @@ @ fdf9bde5129a (2) A1 | x 471f378eab4c (1) A0 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) $ hg log --hidden -r "desc(A0)" changeset: 1:471f378eab4c @@ -58,7 +58,7 @@ @ 5485c92d3433 (4) B0 | x ef4a313b1e0a (3) B0 - rewritten(user) as 5485c92d3433 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reauthored(user) as 5485c92d3433 using amend by test (Thu Jan 01 00:00:00 1970 +0000) $ hg log --hidden -r "ef4a313b1e0a" changeset: 3:ef4a313b1e0a @@ -82,7 +82,7 @@ @ 4dd84345082e (6) B1 | x 2ef0680ff450 (5) B1 - rewritten(date) as 4dd84345082e using amend by test (Thu Jan 01 00:00:00 1970 +0000) + date-changed(date) as 4dd84345082e using amend by test (Thu Jan 01 00:00:00 1970 +0000) $ hg log --hidden -r "2ef0680ff450" changeset: 5:2ef0680ff450 @@ -109,7 +109,7 @@ @ 14a01456e057 (8) B2 | x bd3db8264cee (7) B2 - rewritten(branch) as 14a01456e057 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + branch-changed(branch) as 14a01456e057 using amend by test (Thu Jan 01 00:00:00 1970 +0000) $ hg log --hidden -r "bd3db8264cee" changeset: 7:bd3db8264cee @@ -138,7 +138,7 @@ @ da86aa2f19a3 (11) D0 | x c85eff83a034 (10) D0 - rewritten(parent) as da86aa2f19a3 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + rebased(parent) as da86aa2f19a3 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) $ hg log --hidden -r "c85eff83a034" changeset: 10:c85eff83a034 @@ -163,7 +163,7 @@ @ 75781fdbdbf5 (13) E0 | x ebfe0333e0d9 (12) E0 - rewritten(content) as 75781fdbdbf5 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + amended(content) as 75781fdbdbf5 using amend by test (Thu Jan 01 00:00:00 1970 +0000) $ hg log --hidden -r "ebfe0333e0d9" changeset: 12:ebfe0333e0d9 @@ -244,7 +244,7 @@ o e509e2eb3df5 (19) H1 | x b57fed8d8322 (17) H1 - rewritten(parent) as e509e2eb3df5 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + rebased(parent) as e509e2eb3df5 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) $ hg log --hidden -r "b57fed8d8322" changeset: 17:b57fed8d8322 @@ -269,7 +269,7 @@ @ 12c6238b5e37 (22) I0 | x 2f599e54c1c6 (21) I0 - rewritten(meta) as 12c6238b5e37 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + meta-changed(meta) as 12c6238b5e37 using amend by test (Thu Jan 01 00:00:00 1970 +0000) $ hg log --hidden -r "2f599e54c1c6" changeset: 21:2f599e54c1c6 diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-interrupted.t diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-issue5958.t --- a/tests/test-evolve-issue5958.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-issue5958.t Fri Feb 28 23:10:48 2020 +0700 @@ -22,8 +22,6 @@ (Make changes in unrelated files so that we don't have any merge conflicts during the rebase, but the two touched revisions aren't identical) -date: updated on both side to the same value - $ echo hi > bar.txt $ hg add -q bar.txt $ hg amend -q @@ -72,24 +70,15 @@ | | rewritten(parent, content) as 08bc7ba82799 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) | | x | a25dd7af6cf6 (3) add foo.txt - | | rewritten(content) as 1d1fc409af98 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | | amended(content) as 1d1fc409af98 using amend by test (Thu Jan 01 00:00:00 1970 +0000) | | x | 0065551bd38f (2) add foo.txt - |/ rewritten(content) as a25dd7af6cf6 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + |/ amended(content) as a25dd7af6cf6 using amend by test (Thu Jan 01 00:00:00 1970 +0000) | x cc71ffbc7c00 (1) add foo.txt - rewritten(date) as 0065551bd38f using metaedit by test (Thu Jan 01 00:00:00 1970 +0000) - rewritten(date) as c17bf400a278 using metaedit by test (Thu Jan 01 00:00:00 1970 +0000) + date-changed(date) as 0065551bd38f using metaedit by test (Thu Jan 01 00:00:00 1970 +0000) + date-changed(date) as c17bf400a278 using metaedit by test (Thu Jan 01 00:00:00 1970 +0000) - $ hg evolve --list --rev . - 08bc7ba82799: add foo.txt - content-divergent: c17bf400a278 (draft) (precursor cc71ffbc7c00) - - $ hg log --hidden -r cc71ffbc7c00 -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' - 1 cc71ffbc7c00 1970-01-01 00:00 +0000: date-changed using metaedit as 4:c17bf400a278; date-changed using metaedit as 2:0065551bd38f - $ hg log -r 'desc("add foo.txt")' -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' - 4 c17bf400a278 1969-12-31 23:59 -0000: - 6 08bc7ba82799 1969-12-31 23:59 -0000: $ hg evolve --content-divergent merge:[6] add foo.txt with: [4] add foo.txt @@ -97,160 +86,3 @@ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved 1 new orphan changesets working directory is now at 459c64f7eaad - $ hg log -r 'desc("add foo.txt")' -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' - 4 c17bf400a278 1969-12-31 23:59 -0000: rewritten using evolve as 7:459c64f7eaad - 7 459c64f7eaad 1969-12-31 23:59 -0000: - -date: updated one one side to an older value - - $ hg evolve -r . - move:[7] add foo.txt - atop:[0] add r0 - working directory is now at 545776b4e79f - $ hg update --hidden --rev 'predecessors(.)' - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset 459c64f7eaad - (hidden revision '459c64f7eaad' was rewritten as: 545776b4e79f) - working directory parent is obsolete! (459c64f7eaad) - (use 'hg evolve' to update to its successor: 545776b4e79f) - $ hg amend --date "0 3" - 1 new orphan changesets - 2 new content-divergent changesets - $ hg rebase -r . -d 0 - rebasing 9:c117f15338e6 "add foo.txt" (tip) - $ hg log -G - @ changeset: 10:7a09c7a39546 - | tag: tip - | parent: 0:a24ed8ad918c - | user: test - | date: Wed Dec 31 23:59:57 1969 -0000 - | instability: content-divergent - | summary: add foo.txt - | - | * changeset: 8:545776b4e79f - |/ parent: 0:a24ed8ad918c - | user: test - | date: Wed Dec 31 23:59:58 1969 -0000 - | instability: content-divergent - | summary: add foo.txt - | - o changeset: 0:a24ed8ad918c - user: test - date: Thu Jan 01 00:00:00 1970 +0000 - summary: add r0 - - $ hg evolve --list -r . - 7a09c7a39546: add foo.txt - content-divergent: 545776b4e79f (draft) (precursor 459c64f7eaad) - - $ hg log -r 459c64f7eaad+7a09c7a39546+545776b4e79f --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' - 7 459c64f7eaad 1969-12-31 23:59 -0000: date-changed using amend as 9:c117f15338e6; rebased using evolve as 8:545776b4e79f - 10 7a09c7a39546 1969-12-31 23:59 -0000: - 8 545776b4e79f 1969-12-31 23:59 -0000: - $ hg evolve --content-divergent - merge:[8] add foo.txt - with: [10] add foo.txt - base: [7] add foo.txt - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - working directory is now at 39c4200c0d94 - $ hg log -r . --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' - 11 39c4200c0d94 1969-12-31 23:59 -0000: - -date: updated one side to an newer value - - $ hg update --hidden --rev 'predecessors(.)' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset 7a09c7a39546 - (hidden revision '7a09c7a39546' was rewritten as: 39c4200c0d94) - working directory parent is obsolete! (7a09c7a39546) - (use 'hg evolve' to update to its successor: 39c4200c0d94) - $ hg amend --date "120 0" - 2 new content-divergent changesets - $ hg log -G - @ changeset: 12:da3be3d72fe2 - | tag: tip - | parent: 0:a24ed8ad918c - | user: test - | date: Thu Jan 01 00:02:00 1970 +0000 - | instability: content-divergent - | summary: add foo.txt - | - | * changeset: 11:39c4200c0d94 - |/ parent: 0:a24ed8ad918c - | user: test - | date: Wed Dec 31 23:59:57 1969 -0000 - | instability: content-divergent - | summary: add foo.txt - | - o changeset: 0:a24ed8ad918c - user: test - date: Thu Jan 01 00:00:00 1970 +0000 - summary: add r0 - - $ hg evolve --list -r . - da3be3d72fe2: add foo.txt - content-divergent: 39c4200c0d94 (draft) (precursor 7a09c7a39546) - - $ hg up 39c4200c0d94 - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ hg log -r 7a09c7a39546+39c4200c0d94+da3be3d72fe2 --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' - 10 7a09c7a39546 1969-12-31 23:59 -0000: date-changed using amend as 12:da3be3d72fe2; rewritten using evolve as 11:39c4200c0d94 - 11 39c4200c0d94 1969-12-31 23:59 -0000: - 12 da3be3d72fe2 1970-01-01 00:02 +0000: - $ hg evolve --content-divergent - merge:[11] add foo.txt - with: [12] add foo.txt - base: [10] add foo.txt - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - working directory is now at 06cde6010a51 - $ hg log -r . --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' - 13 06cde6010a51 1970-01-01 00:02 +0000: - -date: updated each side to a different value, newer should win - - $ hg amend --date "235 0" - $ hg update --hidden --rev 'predecessors(.)' - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to hidden changeset 06cde6010a51 - (hidden revision '06cde6010a51' was rewritten as: a7412ff9bfb3) - working directory parent is obsolete! (06cde6010a51) - (use 'hg evolve' to update to its successor: a7412ff9bfb3) - $ hg amend --date "784 0" - 2 new content-divergent changesets - $ hg log -G - @ changeset: 15:e3077936ec52 - | tag: tip - | parent: 0:a24ed8ad918c - | user: test - | date: Thu Jan 01 00:13:04 1970 +0000 - | instability: content-divergent - | summary: add foo.txt - | - | * changeset: 14:a7412ff9bfb3 - |/ parent: 0:a24ed8ad918c - | user: test - | date: Thu Jan 01 00:03:55 1970 +0000 - | instability: content-divergent - | summary: add foo.txt - | - o changeset: 0:a24ed8ad918c - user: test - date: Thu Jan 01 00:00:00 1970 +0000 - summary: add r0 - - $ hg evolve --list -r . - e3077936ec52: add foo.txt - content-divergent: a7412ff9bfb3 (draft) (precursor 06cde6010a51) - - $ hg log -r 39c4200c0d94+a7412ff9bfb3+e3077936ec52 --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' - 11 39c4200c0d94 1969-12-31 23:59 -0000: date-changed using evolve as 13:06cde6010a51 - 14 a7412ff9bfb3 1970-01-01 00:03 +0000: - 15 e3077936ec52 1970-01-01 00:13 +0000: - $ hg evolve --content-divergent - merge:[14] add foo.txt - with: [15] add foo.txt - base: [13] add foo.txt - 0 files updated, 0 files merged, 0 files removed, 0 files unresolved - working directory is now at 1a39f3901288 - $ hg log -r . --hidden -T '{rev} {node|short} {date|isodate}: {join(obsfate, "; ")}\n' - 16 1a39f3901288 1970-01-01 00:13 +0000: diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-issue5967.t diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-issue6097.t --- a/tests/test-evolve-issue6097.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-issue6097.t Fri Feb 28 23:10:48 2020 +0700 @@ -89,7 +89,7 @@ @ bb847d1d3a5f (4) apricot and coconut | x 2868fe6df617 (3) apricot and coconut - | rewritten(parent) as bb847d1d3a5f using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | rebased(parent) as bb847d1d3a5f using evolve by test (Thu Jan 01 00:00:00 1970 +0000) | x 32acf8fb1b23 (2) apricot and coconut | rewritten(parent, content) as 2868fe6df617 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-obshistory-amend-then-fold.t --- a/tests/test-evolve-obshistory-amend-then-fold.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-obshistory-amend-then-fold.t Fri Feb 28 23:10:48 2020 +0700 @@ -57,7 +57,7 @@ | | parent: 1:471f378eab4c | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 - | | obsolete: rewritten using fold as 4:eb5a0daa2192 + | | obsolete: folded using fold as 4:eb5a0daa2192 | | summary: B1 | | | | x changeset: 2:0dec01379d3b @@ -69,7 +69,7 @@ | x changeset: 1:471f378eab4c |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | obsolete: rewritten using fold as 4:eb5a0daa2192 + | obsolete: folded using fold as 4:eb5a0daa2192 | summary: A0 | o changeset: 0:ea207398892e @@ -85,7 +85,7 @@ @ eb5a0daa2192 (4) C0 |\ x | 471f378eab4c (1) A0 - / rewritten(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / folded(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | diff -r 471f378eab4c -r eb5a0daa2192 changeset-description | --- a/changeset-description | +++ b/changeset-description @@ -101,11 +101,11 @@ | | x b7ea6d14e664 (3) B1 - | rewritten(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + | folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | (No patch available, changesets rebased) | x 0dec01379d3b (2) B0 - rewritten(description) as b7ea6d14e664 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as b7ea6d14e664 using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 0dec01379d3b -r b7ea6d14e664 changeset-description --- a/changeset-description +++ b/changeset-description @@ -119,7 +119,7 @@ @ eb5a0daa2192 (4) C0 |\ x | 471f378eab4c (1) A0 - / rewritten(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / folded(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | diff -r 471f378eab4c -r eb5a0daa2192 changeset-description | --- a/changeset-description | +++ b/changeset-description @@ -135,11 +135,11 @@ | | x b7ea6d14e664 (3) B1 - | rewritten(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + | folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | (No patch available, changesets rebased) | x 0dec01379d3b (2) B0 - rewritten(description) as b7ea6d14e664 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as b7ea6d14e664 using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 0dec01379d3b -r b7ea6d14e664 changeset-description --- a/changeset-description +++ b/changeset-description @@ -152,8 +152,7 @@ [ { "markers": [], - "node": "eb5a0daa2192", - "rev": 4, + "node": "eb5a0daa21923bbf8caeb2c42085b9e463861fd0", "shortdescription": "C0" }, { @@ -161,23 +160,22 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ *, (glob) *, (glob) "content" ], "operation": "fold", "succnodes": [ - "eb5a0daa2192" + "eb5a0daa21923bbf8caeb2c42085b9e463861fd0" ], "user": "test", - "verb": "rewritten" + "verb": "folded" } ], - "node": "b7ea6d14e664", - "rev": 3, + "node": "b7ea6d14e664bdc8922221f7992631b50da3fb07", "shortdescription": "B1" }, { @@ -185,21 +183,20 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "description" ], "operation": "amend", "succnodes": [ - "b7ea6d14e664" + "b7ea6d14e664bdc8922221f7992631b50da3fb07" ], "user": "test", - "verb": "rewritten" + "verb": "reworded" } ], - "node": "0dec01379d3b", - "rev": 2, + "node": "0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "shortdescription": "B0" }, { @@ -207,22 +204,21 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "description", "content" ], "operation": "fold", "succnodes": [ - "eb5a0daa2192" + "eb5a0daa21923bbf8caeb2c42085b9e463861fd0" ], "user": "test", - "verb": "rewritten" + "verb": "folded" } ], - "node": "471f378eab4c", - "rev": 1, + "node": "471f378eab4c5e25f6c77f785b27c936efb22874", "shortdescription": "A0" } ] diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-obshistory-amend.t --- a/tests/test-evolve-obshistory-amend.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-obshistory-amend.t Fri Feb 28 23:10:48 2020 +0700 @@ -92,8 +92,9 @@ $ hg obslog --no-graph --patch 4ae3a4151de9 4ae3a4151de9 (2) A1 + 471f378eab4c (1) A0 - rewritten(description, content) as 4ae3a4151de9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + rewritten(description, content) as 4ae3a4151de9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r 4ae3a4151de9 changeset-description --- a/changeset-description +++ b/changeset-description @@ -102,15 +103,39 @@ +A1 + +Better commit message - + diff -r 471f378eab4c -r 4ae3a4151de9 A0 --- a/A0 Thu Jan 01 00:00:00 1970 +0000 +++ b/A0 Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +1,2 @@ A0 +42 - + + +Test that content diff works with templating + $ hg obslog --color=debug --patch 4ae3a4151de9 \ + > -T '{node|short} {desc|firstline}\n{markers % "patch:\n```{patch}```\n"}' + @ 4ae3a4151de9 A1 + | + x 471f378eab4c A0 + patch: + ``` + [diff.diffline|diff -r 471f378eab4c -r 4ae3a4151de9 A0] + [diff.file_a|--- a/A0 Thu Jan 01 00:00:00 1970 +0000] + [diff.file_b|+++ b/A0 Thu Jan 01 00:00:00 1970 +0000] + [diff.hunk|@@ -1,1 +1,2 @@] + A0 + [diff.inserted|+42] + ``` + + $ hg obslog 4ae3a4151de9 --graph -T'{label("log.summary", desc|firstline)} {if(markers, join(markers % "at {date|hgdate} by {user|person} ", " also "))}' + @ A1 + | + x A0 at 0 0 by test + + +Check that the same thing works with the old {shortdescription} form $ hg obslog 4ae3a4151de9 --graph -T'{label("log.summary", shortdescription)} {if(markers, join(markers % "at {date|hgdate} by {user|person} ", " also "))}' @ A1 | @@ -120,8 +145,7 @@ [ { "markers": [], - "node": "4ae3a4151de9", - "rev": 2, + "node": "4ae3a4151de9aa872113f0b196e28323308981e8", "shortdescription": "A1" }, { @@ -129,22 +153,21 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "description", "content" ], "operation": "amend", "succnodes": [ - "4ae3a4151de9" + "4ae3a4151de9aa872113f0b196e28323308981e8" ], "user": "test", "verb": "rewritten" } ], - "node": "471f378eab4c", - "rev": 1, + "node": "471f378eab4c5e25f6c77f785b27c936efb22874", "shortdescription": "A0" } ] @@ -175,22 +198,21 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ *, (glob) "content" ], "operation": "amend", "succnodes": [ - "4ae3a4151de9" + "4ae3a4151de9aa872113f0b196e28323308981e8" ], "user": "test", "verb": "rewritten" } ], - "node": "471f378eab4c", - "rev": 1, + "node": "471f378eab4c5e25f6c77f785b27c936efb22874", "shortdescription": "A0" } ] @@ -220,15 +242,19 @@ $ hg obslog -R $TESTTMP/server --no-graph --patch 4ae3a4151de9 4ae3a4151de9 (1) A1 + 471f378eab4c - rewritten(description, content) as 4ae3a4151de9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + rewritten(description, content) as 4ae3a4151de9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, context is not local) + $ hg obslog -R $TESTTMP/server --no-graph -f --patch 4ae3a4151de9 4ae3a4151de9 (1) A1 + 471f378eab4c - rewritten(description, content) as 4ae3a4151de9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + rewritten(description, content) as 4ae3a4151de9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, context is not local) + Amend two more times ==================== @@ -303,7 +329,7 @@ @ 92210308515b (4) A3 | x 4f1685185907 (3) A2 - | rewritten(description) as 92210308515b using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | reworded(description) as 92210308515b using amend by test (Thu Jan 01 00:00:00 1970 +0000) | diff -r 4f1685185907 -r 92210308515b changeset-description | --- a/changeset-description | +++ b/changeset-description @@ -316,7 +342,7 @@ | | x 4ae3a4151de9 (2) A1 - | rewritten(description) as 4f1685185907 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | reworded(description) as 4f1685185907 using amend by test (Thu Jan 01 00:00:00 1970 +0000) | diff -r 4ae3a4151de9 -r 4f1685185907 changeset-description | --- a/changeset-description | +++ b/changeset-description @@ -347,6 +373,50 @@ +42 +Test that description diff works with templating + $ hg obslog --color=debug --patch 92210308515b \ + > -T '{node|short} {desc|firstline}\n{markers % "description diff:\n```{descdiff}```\n"}' + @ 92210308515b A3 + | + x 4f1685185907 A2 + | description diff: + | ``` + | [diff.diffline|diff -r 4f1685185907 -r 92210308515b changeset-description] + | [diff.file_a|--- a/changeset-description] + | [diff.file_b|+++ b/changeset-description] + | [diff.hunk|@@ -1,3 +1,3 @@] + | [diff.deleted|-A2] + | [diff.inserted|+A3] + | + | [diff.deleted|-Better better commit message] + | [diff.inserted|+Better better better commit message] + | ``` + x 4ae3a4151de9 A1 + | description diff: + | ``` + | [diff.diffline|diff -r 4ae3a4151de9 -r 4f1685185907 changeset-description] + | [diff.file_a|--- a/changeset-description] + | [diff.file_b|+++ b/changeset-description] + | [diff.hunk|@@ -1,3 +1,3 @@] + | [diff.deleted|-A1] + | [diff.inserted|+A2] + | + | [diff.deleted|-Better commit message] + | [diff.inserted|+Better better commit message] + | ``` + x 471f378eab4c A0 + description diff: + ``` + [diff.diffline|diff -r 471f378eab4c -r 4ae3a4151de9 changeset-description] + [diff.file_a|--- a/changeset-description] + [diff.file_b|+++ b/changeset-description] + [diff.hunk|@@ -1,1 +1,3 @@] + [diff.deleted|-A0] + [diff.inserted|+A1] + [diff.inserted|+] + [diff.inserted|+Better commit message] + ``` + Check the output on the server ------------------------------ @@ -354,11 +424,11 @@ o 92210308515b (2) A3 | x 4f1685185907 - | rewritten(description) as 92210308515b using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | reworded(description) as 92210308515b using amend by test (Thu Jan 01 00:00:00 1970 +0000) | (No patch available, context is not local) | x 4ae3a4151de9 (1) A1 - | rewritten(description) as 4f1685185907 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | reworded(description) as 4f1685185907 using amend by test (Thu Jan 01 00:00:00 1970 +0000) | (No patch available, successor is unknown locally) | x 471f378eab4c @@ -383,24 +453,32 @@ $ hg obslog -R $TESTTMP/server --no-graph --patch 92210308515b 92210308515b (2) A3 + 4f1685185907 - rewritten(description) as 92210308515b using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as 92210308515b using amend by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, context is not local) + 4ae3a4151de9 (1) A1 - rewritten(description) as 4f1685185907 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as 4f1685185907 using amend by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, successor is unknown locally) + 471f378eab4c - rewritten(description, content) as 4ae3a4151de9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + rewritten(description, content) as 4ae3a4151de9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, context is not local) + $ hg obslog -R $TESTTMP/server --no-graph -f --patch 92210308515b 92210308515b (2) A3 + 4f1685185907 - rewritten(description) as 92210308515b using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as 92210308515b using amend by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, context is not local) + 4ae3a4151de9 (1) A1 - rewritten(description) as 4f1685185907 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as 4f1685185907 using amend by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, successor is unknown locally) + 471f378eab4c - rewritten(description, content) as 4ae3a4151de9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + rewritten(description, content) as 4ae3a4151de9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, context is not local) + diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-obshistory-complex.t --- a/tests/test-evolve-obshistory-complex.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-obshistory-complex.t Fri Feb 28 23:10:48 2020 +0700 @@ -78,11 +78,11 @@ @ 100cc25b765f (9) fold2 |\ x | 0da815c333f6 (5) E - / rewritten(description, content) as 100cc25b765f using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / folded(description, content) as 100cc25b765f using fold by test (Thu Jan 01 00:00:00 1970 +0000) | note: folding changesets to test | x d9f908fde1a1 (6) F - rewritten(description, parent, content) as 100cc25b765f using fold by test (Thu Jan 01 00:00:00 1970 +0000) + folded(description, parent, content) as 100cc25b765f using fold by test (Thu Jan 01 00:00:00 1970 +0000) note: folding changesets to test $ hg log -G @@ -110,25 +110,25 @@ x | | changeset: 4:868d2e0eb19c | | | user: test | | | date: Thu Jan 01 00:00:00 1970 +0000 - | | | obsolete: rewritten using fold as 8:d15d0ffc75f6 + | | | obsolete: folded using fold as 8:d15d0ffc75f6 | | | summary: D | | | x | | changeset: 3:a8df460dbbfe |/ / user: test | | date: Thu Jan 01 00:00:00 1970 +0000 - | | obsolete: rewritten using fold as 8:d15d0ffc75f6 + | | obsolete: folded using fold as 8:d15d0ffc75f6 | | summary: C | | x | changeset: 2:c473644ee0e9 | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 - | | obsolete: rewritten using fold as 7:b868bc49b0a4 + | | obsolete: folded using fold as 7:b868bc49b0a4 | | summary: B | | x | changeset: 1:2a34000d3544 |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | obsolete: rewritten using fold as 7:b868bc49b0a4 + | obsolete: folded using fold as 7:b868bc49b0a4 | summary: A | o changeset: 0:ea207398892e @@ -402,25 +402,25 @@ * 7b3290f6e0a0 (12) fold1 |\ x | d15d0ffc75f6 (8) fold1 - |\ \ rewritten(parent, content) as 7b3290f6e0a0, d0f33db50670 using split by test (Thu Jan 01 00:00:00 1970 +0000) + |\ \ split(parent, content) as 7b3290f6e0a0, d0f33db50670 using split by test (Thu Jan 01 00:00:00 1970 +0000) | | | | | x e036916b63ea (11) fold0 | | | rewritten(description, parent, content) as 7b3290f6e0a0 using prune by test (Thu Jan 01 00:00:00 1970 +0000) | | | x | | 868d2e0eb19c (4) D - / / rewritten(description, parent, content) as d15d0ffc75f6 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / / folded(description, parent, content) as d15d0ffc75f6 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | | x | a8df460dbbfe (3) C - / rewritten(description, content) as d15d0ffc75f6 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / folded(description, content) as d15d0ffc75f6 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | x b868bc49b0a4 (7) fold0 - |\ rewritten(parent, content) as 19e14c8397fc, e036916b63ea using split by test (Thu Jan 01 00:00:00 1970 +0000) + |\ split(parent, content) as 19e14c8397fc, e036916b63ea using split by test (Thu Jan 01 00:00:00 1970 +0000) | | x | 2a34000d3544 (1) A - / rewritten(description, content) as b868bc49b0a4 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / folded(description, content) as b868bc49b0a4 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | x c473644ee0e9 (2) B - rewritten(description, parent, content) as b868bc49b0a4 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + folded(description, parent, content) as b868bc49b0a4 using fold by test (Thu Jan 01 00:00:00 1970 +0000) While with all option, we should see 15 changesets @@ -434,7 +434,7 @@ | | | | * ec31316faa9d (14) fold2 | | | |/| | | | x | 100cc25b765f (9) fold2 - | | | |\ \ rewritten(parent, content) as d4a000f63ee9, ec31316faa9d using split by test (Thu Jan 01 00:00:00 1970 +0000) + | | | |\ \ split(parent, content) as d4a000f63ee9, ec31316faa9d using split by test (Thu Jan 01 00:00:00 1970 +0000) | | | | | | | +-------x d0f33db50670 (13) fold1 | | | | | rewritten(description, parent, content) as ec31316faa9d using prune by test (Thu Jan 01 00:00:00 1970 +0000) @@ -444,28 +444,28 @@ | | / / rewritten(description, parent, content) as 7b3290f6e0a0 using prune by test (Thu Jan 01 00:00:00 1970 +0000) | | | | | | x | 0da815c333f6 (5) E - | | / rewritten(description, content) as 100cc25b765f using fold by test (Thu Jan 01 00:00:00 1970 +0000) + | | / folded(description, content) as 100cc25b765f using fold by test (Thu Jan 01 00:00:00 1970 +0000) | | | note: folding changesets to test | | | x | | b868bc49b0a4 (7) fold0 - |\ \ \ rewritten(parent, content) as 19e14c8397fc, e036916b63ea using split by test (Thu Jan 01 00:00:00 1970 +0000) + |\ \ \ split(parent, content) as 19e14c8397fc, e036916b63ea using split by test (Thu Jan 01 00:00:00 1970 +0000) | | | | | | x | d15d0ffc75f6 (8) fold1 - | | |\ \ rewritten(parent, content) as 7b3290f6e0a0, d0f33db50670 using split by test (Thu Jan 01 00:00:00 1970 +0000) + | | |\ \ split(parent, content) as 7b3290f6e0a0, d0f33db50670 using split by test (Thu Jan 01 00:00:00 1970 +0000) | | | | | | | | | x d9f908fde1a1 (6) F - | | | | rewritten(description, parent, content) as 100cc25b765f using fold by test (Thu Jan 01 00:00:00 1970 +0000) + | | | | folded(description, parent, content) as 100cc25b765f using fold by test (Thu Jan 01 00:00:00 1970 +0000) | | | | note: folding changesets to test | | | | x | | | 2a34000d3544 (1) A - / / / rewritten(description, content) as b868bc49b0a4 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / / / folded(description, content) as b868bc49b0a4 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | | | | x | 868d2e0eb19c (4) D - | / rewritten(description, parent, content) as d15d0ffc75f6 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + | / folded(description, parent, content) as d15d0ffc75f6 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | | | x a8df460dbbfe (3) C - | rewritten(description, content) as d15d0ffc75f6 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + | folded(description, content) as d15d0ffc75f6 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | x c473644ee0e9 (2) B - rewritten(description, parent, content) as b868bc49b0a4 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + folded(description, parent, content) as b868bc49b0a4 using fold by test (Thu Jan 01 00:00:00 1970 +0000) diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-obshistory-content-divergent.t --- a/tests/test-evolve-obshistory-content-divergent.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-obshistory-content-divergent.t Fri Feb 28 23:10:48 2020 +0700 @@ -5,6 +5,10 @@ ============ $ . $TESTDIR/testlib/obshistory_setup.sh + $ cat >> $HGRCPATH << EOF + > [experimental] + > evolution.allowdivergence = True + > EOF Test output with content-divergence =================================== @@ -78,7 +82,7 @@ Check that debugobshistory on the divergent revision show both destinations $ hg obslog --hidden 471f378eab4c --patch x 471f378eab4c (1) A0 - rewritten(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r 65b757b745b9 changeset-description --- a/changeset-description +++ b/changeset-description @@ -86,7 +90,7 @@ -A0 +A2 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -103,7 +107,7 @@ | * fdf9bde5129a (2) A1 |/ x 471f378eab4c (1) A0 - rewritten(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r 65b757b745b9 changeset-description --- a/changeset-description +++ b/changeset-description @@ -111,7 +115,7 @@ -A0 +A2 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -127,36 +131,35 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "description" ], "operation": "amend", "succnodes": [ - "65b757b745b9" + "65b757b745b935093c87a2bccd877521cccffcbd" ], "user": "test", - "verb": "rewritten" + "verb": "reworded" }, { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "description" ], "operation": "amend", "succnodes": [ - "fdf9bde5129a" + "fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e" ], "user": "test", - "verb": "rewritten" + "verb": "reworded" } ], - "node": "471f378eab4c", - "rev": 1, + "node": "471f378eab4c5e25f6c77f785b27c936efb22874", "shortdescription": "A0" } ] @@ -166,7 +169,7 @@ * fdf9bde5129a (2) A1 | x 471f378eab4c (1) A0 - rewritten(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r 65b757b745b9 changeset-description --- a/changeset-description +++ b/changeset-description @@ -174,7 +177,7 @@ -A0 +A2 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -191,7 +194,7 @@ | * fdf9bde5129a (2) A1 |/ x 471f378eab4c (1) A0 - rewritten(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r 65b757b745b9 changeset-description --- a/changeset-description +++ b/changeset-description @@ -199,7 +202,7 @@ -A0 +A2 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -214,7 +217,7 @@ @ 65b757b745b9 (3) A2 | x 471f378eab4c (1) A0 - rewritten(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r 65b757b745b9 changeset-description --- a/changeset-description +++ b/changeset-description @@ -222,7 +225,7 @@ -A0 +A2 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -238,7 +241,7 @@ | * fdf9bde5129a (2) A1 |/ x 471f378eab4c (1) A0 - rewritten(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r 65b757b745b9 changeset-description --- a/changeset-description +++ b/changeset-description @@ -246,7 +249,7 @@ -A0 +A2 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -263,7 +266,7 @@ | * fdf9bde5129a (2) A1 |/ x 471f378eab4c (1) A0 - rewritten(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as 65b757b745b9 using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r 65b757b745b9 changeset-description --- a/changeset-description +++ b/changeset-description @@ -271,7 +274,7 @@ -A0 +A2 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -284,8 +287,7 @@ [ { "markers": [], - "node": "65b757b745b9", - "rev": 3, + "node": "65b757b745b935093c87a2bccd877521cccffcbd", "shortdescription": "A2" }, { @@ -293,42 +295,40 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "description" ], "operation": "amend", "succnodes": [ - "65b757b745b9" + "65b757b745b935093c87a2bccd877521cccffcbd" ], "user": "test", - "verb": "rewritten" + "verb": "reworded" }, { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "description" ], "operation": "amend", "succnodes": [ - "fdf9bde5129a" + "fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e" ], "user": "test", - "verb": "rewritten" + "verb": "reworded" } ], - "node": "471f378eab4c", - "rev": 1, + "node": "471f378eab4c5e25f6c77f785b27c936efb22874", "shortdescription": "A0" }, { "markers": [], - "node": "fdf9bde5129a", - "rev": 2, + "node": "fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e", "shortdescription": "A1" } ] diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-obshistory-fold.t --- a/tests/test-evolve-obshistory-fold.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-obshistory-fold.t Fri Feb 28 23:10:48 2020 +0700 @@ -50,13 +50,13 @@ | x changeset: 2:0dec01379d3b | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 - | | obsolete: rewritten using fold as 3:eb5a0daa2192 + | | obsolete: folded using fold as 3:eb5a0daa2192 | | summary: B0 | | | x changeset: 1:471f378eab4c |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | obsolete: rewritten using fold as 3:eb5a0daa2192 + | obsolete: folded using fold as 3:eb5a0daa2192 | summary: A0 | o changeset: 0:ea207398892e @@ -73,7 +73,7 @@ the revision with the target $ hg obslog --hidden 471f378eab4c --patch x 471f378eab4c (1) A0 - rewritten(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + folded(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r eb5a0daa2192 changeset-description --- a/changeset-description +++ b/changeset-description @@ -93,11 +93,11 @@ @ eb5a0daa2192 (3) C0 |\ x | 0dec01379d3b (2) B0 - / rewritten(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | (No patch available, changesets rebased) | x 471f378eab4c (1) A0 - rewritten(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + folded(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r eb5a0daa2192 changeset-description --- a/changeset-description +++ b/changeset-description @@ -116,7 +116,7 @@ the revision with the target $ hg obslog --hidden 0dec01379d3b --patch x 0dec01379d3b (2) B0 - rewritten(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, changesets rebased) Check that with all option, all changesets are shown @@ -124,11 +124,11 @@ @ eb5a0daa2192 (3) C0 |\ x | 0dec01379d3b (2) B0 - / rewritten(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | (No patch available, changesets rebased) | x 471f378eab4c (1) A0 - rewritten(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + folded(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r eb5a0daa2192 changeset-description --- a/changeset-description +++ b/changeset-description @@ -149,11 +149,11 @@ @ eb5a0daa2192 (3) C0 |\ x | 0dec01379d3b (2) B0 - / rewritten(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | (No patch available, changesets rebased) | x 471f378eab4c (1) A0 - rewritten(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + folded(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r eb5a0daa2192 changeset-description --- a/changeset-description +++ b/changeset-description @@ -172,8 +172,7 @@ [ { "markers": [], - "node": "eb5a0daa2192", - "rev": 3, + "node": "eb5a0daa21923bbf8caeb2c42085b9e463861fd0", "shortdescription": "C0" }, { @@ -181,22 +180,21 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "description", "content" ], "operation": "fold", "succnodes": [ - "eb5a0daa2192" + "eb5a0daa21923bbf8caeb2c42085b9e463861fd0" ], "user": "test", - "verb": "rewritten" + "verb": "folded" } ], - "node": "471f378eab4c", - "rev": 1, + "node": "471f378eab4c5e25f6c77f785b27c936efb22874", "shortdescription": "A0" }, { @@ -204,23 +202,22 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "description", "parent", "content" ], "operation": "fold", "succnodes": [ - "eb5a0daa2192" + "eb5a0daa21923bbf8caeb2c42085b9e463861fd0" ], "user": "test", - "verb": "rewritten" + "verb": "folded" } ], - "node": "0dec01379d3b", - "rev": 2, + "node": "0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "shortdescription": "B0" } ] @@ -252,11 +249,11 @@ o eb5a0daa2192 (2) C0 |\ x | 0dec01379d3b - / rewritten(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | (No patch available, context is not local) | x 471f378eab4c (1) A0 - rewritten(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + folded(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r eb5a0daa2192 changeset-description --- a/changeset-description +++ b/changeset-description @@ -275,7 +272,7 @@ o eb5a0daa2192 (2) C0 | x 471f378eab4c (1) A0 - rewritten(description, content) as eb5a0daa2192 using fold by test (at Thu Jan 01 00:00:00 1970 +0000) + folded(description, content) as eb5a0daa2192 using fold by test (at Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r eb5a0daa2192 changeset-description --- a/changeset-description +++ b/changeset-description @@ -295,11 +292,11 @@ o eb5a0daa2192 (2) C0 |\ x | 0dec01379d3b - / rewritten(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / folded(description, parent, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) | (No patch available, context is not local) | x 471f378eab4c (1) A0 - rewritten(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) + folded(description, content) as eb5a0daa2192 using fold by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r eb5a0daa2192 changeset-description --- a/changeset-description +++ b/changeset-description @@ -318,7 +315,7 @@ o eb5a0daa2192 (2) C0 | x 471f378eab4c (1) A0 - rewritten(description, content) as eb5a0daa2192 using fold by test (at Thu Jan 01 00:00:00 1970 +0000) + folded(description, content) as eb5a0daa2192 using fold by test (at Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r eb5a0daa2192 changeset-description --- a/changeset-description +++ b/changeset-description diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-obshistory-lots-of-splits.t --- a/tests/test-evolve-obshistory-lots-of-splits.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-obshistory-lots-of-splits.t Fri Feb 28 23:10:48 2020 +0700 @@ -176,7 +176,7 @@ $ hg obslog de7290d8b885 --hidden --patch x de7290d8b885 (1) A0 - rewritten(parent, content) as 1ae8bc733a14, 337fec4d2edc, c7f044602e9b, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 1ae8bc733a14, 337fec4d2edc, c7f044602e9b, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, too many successors (4)) $ hg obslog de7290d8b885 --hidden --all --patch @@ -189,7 +189,7 @@ | o f257fde29c7a (3) A0 |/ x de7290d8b885 (1) A0 - rewritten(parent, content) as 1ae8bc733a14, 337fec4d2edc, c7f044602e9b, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 1ae8bc733a14, 337fec4d2edc, c7f044602e9b, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, too many successors (4)) $ hg obslog de7290d8b885 --hidden --no-graph -Tjson | python -m json.tool @@ -199,25 +199,24 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "parent", "content" ], "operation": "split", "succnodes": [ - "1ae8bc733a14", - "337fec4d2edc", - "c7f044602e9b", - "f257fde29c7a" + "1ae8bc733a14e374f11767d2ad128d4c891dc43f", + "337fec4d2edcf0e7a467e35f818234bc620068b5", + "c7f044602e9bd5dec6528b33114df3d0221e6359", + "f257fde29c7a847c9b607f6e958656d0df0fb15c" ], "user": "test", - "verb": "rewritten" + "verb": "split" } ], - "node": "de7290d8b885", - "rev": 1, + "node": "de7290d8b885925115bb9e88887252dfc20ef2a8", "shortdescription": "A0" } ] @@ -225,15 +224,14 @@ @ c7f044602e9b (5) A0 | x de7290d8b885 (1) A0 - rewritten(parent, content) as 1ae8bc733a14, 337fec4d2edc, c7f044602e9b, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 1ae8bc733a14, 337fec4d2edc, c7f044602e9b, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, too many successors (4)) $ hg obslog c7f044602e9b --no-graph -Tjson | python -m json.tool [ { "markers": [], - "node": "c7f044602e9b", - "rev": 5, + "node": "c7f044602e9bd5dec6528b33114df3d0221e6359", "shortdescription": "A0" }, { @@ -241,25 +239,24 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "parent", "content" ], "operation": "split", "succnodes": [ - "1ae8bc733a14", - "337fec4d2edc", - "c7f044602e9b", - "f257fde29c7a" + "1ae8bc733a14e374f11767d2ad128d4c891dc43f", + "337fec4d2edcf0e7a467e35f818234bc620068b5", + "c7f044602e9bd5dec6528b33114df3d0221e6359", + "f257fde29c7a847c9b607f6e958656d0df0fb15c" ], "user": "test", - "verb": "rewritten" + "verb": "split" } ], - "node": "de7290d8b885", - "rev": 1, + "node": "de7290d8b885925115bb9e88887252dfc20ef2a8", "shortdescription": "A0" } ] @@ -274,7 +271,7 @@ | o f257fde29c7a (3) A0 |/ x de7290d8b885 (1) A0 - rewritten(parent, content) as 1ae8bc733a14, 337fec4d2edc, c7f044602e9b, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 1ae8bc733a14, 337fec4d2edc, c7f044602e9b, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, too many successors (4)) $ hg obslog 5 --all --patch @@ -287,7 +284,7 @@ | o f257fde29c7a (3) A0 |/ x de7290d8b885 (1) A0 - rewritten(parent, content) as 1ae8bc733a14, 337fec4d2edc, c7f044602e9b, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 1ae8bc733a14, 337fec4d2edc, c7f044602e9b, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, too many successors (4)) $ hg update de7290d8b885 diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-obshistory-phase-divergent.t --- a/tests/test-evolve-obshistory-phase-divergent.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-obshistory-phase-divergent.t Fri Feb 28 23:10:48 2020 +0700 @@ -69,7 +69,7 @@ Check that debugobshistory on the divergent revision show both destinations $ hg obslog --hidden 471f378eab4c --patch @ 471f378eab4c (1) A0 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -84,7 +84,7 @@ * fdf9bde5129a (2) A1 | @ 471f378eab4c (1) A0 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -100,21 +100,20 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "description" ], "operation": "amend", "succnodes": [ - "fdf9bde5129a" + "fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e" ], "user": "test", - "verb": "rewritten" + "verb": "reworded" } ], - "node": "471f378eab4c", - "rev": 1, + "node": "471f378eab4c5e25f6c77f785b27c936efb22874", "shortdescription": "A0" } ] @@ -124,7 +123,7 @@ * fdf9bde5129a (2) A1 | @ 471f378eab4c (1) A0 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -139,7 +138,7 @@ * fdf9bde5129a (2) A1 | @ 471f378eab4c (1) A0 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -154,7 +153,7 @@ * fdf9bde5129a (2) A1 | @ 471f378eab4c (1) A0 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -168,7 +167,7 @@ * fdf9bde5129a (2) A1 | @ 471f378eab4c (1) A0 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -183,7 +182,7 @@ * fdf9bde5129a (2) A1 | @ 471f378eab4c (1) A0 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -196,30 +195,28 @@ [ { "markers": [], - "node": "fdf9bde5129a", - "rev": 2, + "node": "fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e", "shortdescription": "A1" }, { "markers": [ { "date": [ - 0, + 0.0, 0 ], - "effect": [ + "effects": [ "description" ], "operation": "amend", "succnodes": [ - "fdf9bde5129a" + "fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e" ], "user": "test", - "verb": "rewritten" + "verb": "reworded" } ], - "node": "471f378eab4c", - "rev": 1, + "node": "471f378eab4c5e25f6c77f785b27c936efb22874", "shortdescription": "A0" } ] diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-obshistory-prune.t --- a/tests/test-evolve-obshistory-prune.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-obshistory-prune.t Fri Feb 28 23:10:48 2020 +0700 @@ -75,15 +75,14 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], "operation": "prune", "user": "test", "verb": "pruned" } ], - "node": "0dec01379d3b", - "rev": 2, + "node": "0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "shortdescription": "B0" } ] @@ -94,8 +93,7 @@ [ { "markers": [], - "node": "471f378eab4c", - "rev": 1, + "node": "471f378eab4c5e25f6c77f785b27c936efb22874", "shortdescription": "A0" } ] diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-obshistory-split.t --- a/tests/test-evolve-obshistory-split.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-obshistory-split.t Fri Feb 28 23:10:48 2020 +0700 @@ -106,7 +106,7 @@ 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) + split(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) note: testing split (No patch available, too many successors (2)) @@ -117,24 +117,23 @@ { "date": [ *, (glob) - 0 (glob) + 0 ], - "effect": [ + "effects": [ "parent", "content" ], "note": "testing split", "operation": "split", "succnodes": [ - "337fec4d2edc", - "f257fde29c7a" + "337fec4d2edcf0e7a467e35f818234bc620068b5", + "f257fde29c7a847c9b607f6e958656d0df0fb15c" ], "user": "test", - "verb": "rewritten" + "verb": "split" } ], - "node": "471597cad322", - "rev": 1, + "node": "471597cad322d1f659bb169751be9133dad92ef3", "shortdescription": "A0" } ] @@ -144,7 +143,7 @@ o 337fec4d2edc (2) A0 | x 471597cad322 (1) A0 - rewritten(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) note: testing split (No patch available, too many successors (2)) @@ -155,7 +154,7 @@ | @ f257fde29c7a (3) A0 |/ x 471597cad322 (1) A0 - rewritten(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) note: testing split (No patch available, too many successors (2)) @@ -165,7 +164,7 @@ @ f257fde29c7a (3) A0 | x 471597cad322 (1) A0 - rewritten(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) note: testing split (No patch available, too many successors (2)) @@ -176,7 +175,7 @@ | @ f257fde29c7a (3) A0 |/ x 471597cad322 (1) A0 - rewritten(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) note: testing split (No patch available, too many successors (2)) @@ -187,7 +186,7 @@ | @ f257fde29c7a (3) A0 |/ x 471597cad322 (1) A0 - rewritten(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) note: testing split (No patch available, too many successors (2)) @@ -199,7 +198,7 @@ | @ f257fde29c7a (3) A0 |/ x 471597cad322 (1) A0 - rewritten(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) note: testing split (No patch available, too many successors (2)) @@ -221,7 +220,7 @@ o f257fde29c7a (2) A0 | x 471597cad322 - rewritten(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) note: testing split (No patch available, context is not local) @@ -234,7 +233,7 @@ | o f257fde29c7a (2) A0 |/ x 471597cad322 - rewritten(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + split(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) note: testing split (No patch available, context is not local) @@ -245,14 +244,18 @@ $ hg obslog -R $TESTTMP/server --no-graph -f --all --patch tip f257fde29c7a (2) A0 + 471597cad322 - rewritten(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) - note: testing split + split(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + note: testing split (No patch available, context is not local) + $ hg obslog -R $TESTTMP/server --no-graph -f --all --patch tip f257fde29c7a (2) A0 + 471597cad322 - rewritten(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) - note: testing split + split(parent, content) as 337fec4d2edc, f257fde29c7a using split by test (Thu Jan 01 00:00:00 1970 +0000) + note: testing split (No patch available, context is not local) + diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-obshistory.t --- a/tests/test-evolve-obshistory.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-obshistory.t Fri Feb 28 23:10:48 2020 +0700 @@ -97,7 +97,7 @@ @ 7a230b46bf61 (3) A2 | x fdf9bde5129a (2) A1 - | rewritten(description) as 7a230b46bf61 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | reworded(description) as 7a230b46bf61 using amend by test (Thu Jan 01 00:00:00 1970 +0000) | diff -r fdf9bde5129a -r 7a230b46bf61 changeset-description | --- a/changeset-description | +++ b/changeset-description @@ -107,7 +107,7 @@ | | x 471f378eab4c (1) A0 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) diff -r 471f378eab4c -r fdf9bde5129a changeset-description --- a/changeset-description +++ b/changeset-description @@ -136,11 +136,11 @@ o 7a230b46bf61 (2) A2 | x fdf9bde5129a - | rewritten(description) as 7a230b46bf61 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | reworded(description) as 7a230b46bf61 using amend by test (Thu Jan 01 00:00:00 1970 +0000) | (No patch available, context is not local) | @ 471f378eab4c (1) A0 - rewritten(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as fdf9bde5129a using amend by test (Thu Jan 01 00:00:00 1970 +0000) (No patch available, successor is unknown locally) @@ -161,10 +161,19 @@ o [evolve.node|7a230b46bf61] [evolve.rev|(2)] [evolve.short_description|A2] | x [evolve.node evolve.missing_change_ctx|fdf9bde5129a] - | [evolve.verb|rewritten](description) as [evolve.node|7a230b46bf61] using [evolve.operation|amend] by [evolve.user|test] [evolve.date|(Thu Jan 01 00:00:00 1970 +0000)] + | [evolve.verb|reworded](description) as [evolve.node|7a230b46bf61] using [evolve.operation|amend] by [evolve.user|test] [evolve.date|(Thu Jan 01 00:00:00 1970 +0000)] | (No patch available, context is not local) | @ [evolve.node|471f378eab4c] [evolve.rev|(1)] [evolve.short_description|A0] - [evolve.verb|rewritten](description) as [evolve.node|fdf9bde5129a] using [evolve.operation|amend] by [evolve.user|test] [evolve.date|(Thu Jan 01 00:00:00 1970 +0000)] + [evolve.verb|reworded](description) as [evolve.node|fdf9bde5129a] using [evolve.operation|amend] by [evolve.user|test] [evolve.date|(Thu Jan 01 00:00:00 1970 +0000)] (No patch available, successor is unknown locally) + + $ hg obslog 7a230b46bf61 --graph \ + > -T '{node|short} {rev} {desc|firstline}\n{markers % "rewritten using {operation}"}\n' + o 7a230b46bf61 2 A2 + | + x fdf9bde5129a + | rewritten using amend + @ 471f378eab4c 1 A0 + rewritten using amend diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-order.t --- a/tests/test-evolve-order.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-order.t Fri Feb 28 23:10:48 2020 +0700 @@ -15,6 +15,8 @@ > unified = 0 > [ui] > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline}\n + > [experimental] + > evolution.allowdivergence = True > [extensions] > EOF $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-orphan-merge.t --- a/tests/test-evolve-orphan-merge.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-orphan-merge.t Fri Feb 28 23:10:48 2020 +0700 @@ -134,11 +134,18 @@ date: Thu Jan 01 00:00:00 1970 +0000 summary: merging a and b + +Clean up to prepare for next test case + $ hg prune -r 64370c9805e7 -r 3d41537b44ca -r 968d205ba4d8 + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + working directory is now at 8fa14d15e168 + 3 changesets pruned + 2) When merging both the parents resulted in conflicts ------------------------------------------------------ $ hg up 8fa14d15e168 - 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved $ echo foo > c $ hg ci -Aqm "foo to c" $ hg prev @@ -152,24 +159,6 @@ | () draft | o 8:1c165c673853 foo to c |/ () draft - | o 7:968d205ba4d8 merging a and b - | |\ () draft - +---o 6:3d41537b44ca added a - | | () draft - | o 4:64370c9805e7 added b - |/ () draft - o 0:8fa14d15e168 added hgignore - () draft - -Prune old test changesets to have clear graph view - $ hg prune -r 64370c9805e7 -r 3d41537b44ca -r 968d205ba4d8 - 3 changesets pruned - - $ hg glog - @ 9:d0f84b25d4e3 bar to c - | () draft - | o 8:1c165c673853 foo to c - |/ () draft o 0:8fa14d15e168 added hgignore () draft @@ -529,17 +518,13 @@ case where merge commit becomes orphan with its ancestors pruned up until a point where the other parent of merge is the first non-pruned ancestor. -Note: allowing an empty commit here to have the same output on all hg versions. -In newer versions or Mercurial this command would not create a new commit. -hg <= 5.2 (32d11a23c9cf) - - $ hg evolve -r . --config ui.allowemptycommit=true + $ hg evolve -r . move:[28] merged l and x atop:[0] added hgignore - working directory is now at * (glob) + working directory is now at b61ba77b924a $ hg glog - @ 29:* merged l and x (glob) + @ 29:b61ba77b924a merged l and x | () draft o 0:8fa14d15e168 added hgignore () draft diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-phase-divergence.t --- a/tests/test-evolve-phase-divergence.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-phase-divergence.t Fri Feb 28 23:10:48 2020 +0700 @@ -162,7 +162,7 @@ @ 98bb3a6cfe1a (2) tweak a | o 4d1169d82e47 (1) modify a - rewritten(description) as 98bb3a6cfe1a using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reworded(description) as 98bb3a6cfe1a using amend by test (Thu Jan 01 00:00:00 1970 +0000) Solving the phase divergence using evolve command -------------------------------------------------- @@ -586,7 +586,7 @@ @ 334e300d6db5 (10) added x to x | o 2352021b3785 (9) added x to x - rewritten(parent) as 334e300d6db5 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + rebased(parent) as 334e300d6db5 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) $ hg glog -r .^:: @ 10:334e300d6db5 added x to x @@ -634,10 +634,10 @@ | pruned using evolve by test (Thu Jan 01 00:00:00 1970 +0000) | x 334e300d6db5 (10) added x to x - | rewritten(parent) as b1a0e143e32b using evolve by test (Thu Jan 01 00:00:00 1970 +0000) + | rebased(parent) as b1a0e143e32b using evolve by test (Thu Jan 01 00:00:00 1970 +0000) | @ 2352021b3785 (9) added x to x - rewritten(parent) as 334e300d6db5 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + rebased(parent) as 334e300d6db5 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) $ hg exp @@ -717,10 +717,10 @@ @ 13015a180eee (14) y to y and foobar to foo | x 211ab84d1689 (13) y to y and foobar to foo - | rewritten(content) as 13015a180eee using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | amended(content) as 13015a180eee using amend by test (Thu Jan 01 00:00:00 1970 +0000) | o dc88f5aa9bc9 (12) y to y and foobar to foo - rewritten(parent) as 211ab84d1689 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + rebased(parent) as 211ab84d1689 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) Resolving divergence using `hg evolve` ------------------------------------- @@ -789,10 +789,10 @@ @ 5fd38c0de46e (19) added l to l | x 2bfd56949cf0 (18) added l to l - | rewritten(content) as 5fd38c0de46e using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | amended(content) as 5fd38c0de46e using amend by test (Thu Jan 01 00:00:00 1970 +0000) | x f3794e5a91dc (17) added l to l - rewritten(parent) as 2bfd56949cf0 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + rebased(parent) as 2bfd56949cf0 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) $ hg phase -r f3794e5a91dc --public --hidden @@ -1033,10 +1033,10 @@ | | 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) + |/ rebased(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) + split(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 @@ -1163,7 +1163,7 @@ |/ 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) + split(description, content) as a47263294745, bb87595f9a77 using prune by test (Thu Jan 01 00:00:00 1970 +0000) XXX: not sure this is correct @@ -1294,13 +1294,13 @@ | | 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) + | | rebased(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) + |/ amended(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) + split(description, parent, content) as 4f25cd9cd2bf, e1154ec0206a using prune by test (Thu Jan 01 00:00:00 1970 +0000) XXX: not sure this is correct diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-progress.t diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-public-content-divergent-corner-cases.t --- a/tests/test-evolve-public-content-divergent-corner-cases.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-public-content-divergent-corner-cases.t Fri Feb 28 23:10:48 2020 +0700 @@ -12,6 +12,8 @@ > glog = log -GT "{rev}:{node|short} {desc|firstline}\n {phase} {instabilities}\n\n" > [phases] > publish = False + > [experimental] + > evolution.allowdivergence = True > [extensions] > rebase = > EOF @@ -370,7 +372,7 @@ | * 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) + amended(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 @@ -757,9 +759,9 @@ | | 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) + |/ rebased(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) + rebased(parent) as 8ae8db670b4a using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + rebased(parent) as a52ac76b45f5 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-public-content-divergent-discard.t --- a/tests/test-evolve-public-content-divergent-discard.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-public-content-divergent-discard.t Fri Feb 28 23:10:48 2020 +0700 @@ -17,6 +17,8 @@ > glog = log -GT "{rev}:{node|short} {desc|firstline}\n {phase} {instabilities}\n\n" > [phases] > publish = False + > [experimental] + > evolution.allowdivergence = True > [extensions] > rebase = > EOF diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-public-content-divergent-main.t --- a/tests/test-evolve-public-content-divergent-main.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-public-content-divergent-main.t Fri Feb 28 23:10:48 2020 +0700 @@ -15,6 +15,8 @@ > glog = log -GT "{rev}:{node|short} {desc|firstline}\n {phase} {instabilities}\n\n" > [phases] > publish = False + > [experimental] + > evolution.allowdivergence = True > [extensions] > rebase = > EOF diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve-templates.t --- a/tests/test-evolve-templates.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve-templates.t Fri Feb 28 23:10:48 2020 +0700 @@ -1,4 +1,4 @@ -This test file test the various templates for precursors and successors. +This test file test the various templates for predecessors and successors. Global setup ============ @@ -9,12 +9,14 @@ > interactive = true > [phases] > publish=False + > [experimental] + > evolution.allowdivergence = True > [extensions] > evolve = > [alias] > tlog = log -G -T '{node|short}\ - > {if(precursors, "\n Precursors: {precursors}")}\ - > {if(precursors, "\n semi-colon: {join(precursors, "; ")}")}\ + > {if(predecessors, "\n Predecessors: {predecessors}")}\ + > {if(predecessors, "\n semi-colon: {join(predecessors, "; ")}")}\ > {if(successors, "\n Successors: {successors}")}\ > {if(successors, "\n semi-colon: {join(successors, "; ")}")}\ > {if(obsfate, "\n Fate: {join(obsfate, "\n Fate: ")}\n")}\n' @@ -69,19 +71,19 @@ working directory parent is obsolete! (471f378eab4c) (use 'hg evolve' to update to its successor: d004c8f274b9) -Precursors template should show current revision as it is the working copy +Predecessors template should show current revision as it is the working copy $ hg olog tip o d004c8f274b9 (3) A2 | x a468dc9b3633 (2) A1 - | rewritten(description) as d004c8f274b9 using amend by test2 (Thu Apr 19 04:25:21 2001 +0000) + | reworded(description) as d004c8f274b9 using amend by test2 (Thu Apr 19 04:25:21 2001 +0000) | @ 471f378eab4c (1) A0 rewritten(description, content) as a468dc9b3633 using amend by test (Fri Feb 13 23:31:30 2009 +0000) $ hg tlog o d004c8f274b9 - | Precursors: 1:471f378eab4c + | Predecessors: 1:471f378eab4c | semi-colon: 1:471f378eab4c | @ 471f378eab4c |/ Successors: 3:d004c8f274b9 @@ -139,7 +141,7 @@ (check json) - $ hg log -GT '{precursors|json}\n' + $ hg log -GT '{predecessors|json}\n' o ["471f378eab4c5e25f6c77f785b27c936efb22874"] | | @ [] @@ -162,10 +164,10 @@ working directory parent is obsolete! (a468dc9b3633) (use 'hg evolve' to update to its successor: d004c8f274b9) -Precursors template should show current revision as it is the working copy +Predecessors template should show current revision as it is the working copy $ hg tlog o d004c8f274b9 - | Precursors: 2:a468dc9b3633 + | Predecessors: 2:a468dc9b3633 | semi-colon: 2:a468dc9b3633 | @ a468dc9b3633 |/ Successors: 3:d004c8f274b9 @@ -174,14 +176,14 @@ | o ea207398892e -Precursors template should show the precursor as we force its display with +Predecessors template should show the precursor as we force its display with --hidden $ hg tlog --hidden o d004c8f274b9 - | Precursors: 2:a468dc9b3633 + | Predecessors: 2:a468dc9b3633 | semi-colon: 2:a468dc9b3633 | @ a468dc9b3633 - |/ Precursors: 1:471f378eab4c + |/ Predecessors: 1:471f378eab4c | semi-colon: 1:471f378eab4c | Successors: 3:d004c8f274b9 | semi-colon: 3:d004c8f274b9 @@ -211,10 +213,10 @@ $ hg tlog --hidden @ d004c8f274b9 - | Precursors: 2:a468dc9b3633 + | Predecessors: 2:a468dc9b3633 | semi-colon: 2:a468dc9b3633 | x a468dc9b3633 - |/ Precursors: 1:471f378eab4c + |/ Predecessors: 1:471f378eab4c | semi-colon: 1:471f378eab4c | Successors: 3:d004c8f274b9 | semi-colon: 3:d004c8f274b9 @@ -343,13 +345,13 @@ working directory parent is obsolete! (471597cad322) (use 'hg evolve' to update to its tipmost successor: 337fec4d2edc, f257fde29c7a) -Precursors template should show current revision as it is the working copy +Predecessors template should show current revision as it is the working copy $ hg tlog o f257fde29c7a - | Precursors: 1:471597cad322 + | Predecessors: 1:471597cad322 | semi-colon: 1:471597cad322 o 337fec4d2edc - | Precursors: 1:471597cad322 + | Predecessors: 1:471597cad322 | semi-colon: 1:471597cad322 | @ 471597cad322 |/ Successors: 2:337fec4d2edc 3:f257fde29c7a @@ -372,7 +374,7 @@ $ hg up f257fde29c7a 0 files updated, 0 files merged, 0 files removed, 0 files unresolved -Precursors template should not show a precursor as it's not displayed in the +Predecessors template should not show a precursor as it's not displayed in the log $ hg tlog @ f257fde29c7a @@ -381,14 +383,14 @@ | o ea207398892e -Precursors template should show the precursor as we force its display with +Predecessors template should show the precursor as we force its display with --hidden $ hg tlog --hidden @ f257fde29c7a - | Precursors: 1:471597cad322 + | Predecessors: 1:471597cad322 | semi-colon: 1:471597cad322 o 337fec4d2edc - | Precursors: 1:471597cad322 + | Predecessors: 1:471597cad322 | semi-colon: 1:471597cad322 | x 471597cad322 |/ Successors: 2:337fec4d2edc 3:f257fde29c7a @@ -450,13 +452,13 @@ | x changeset: 2:0dec01379d3b | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 - | | obsolete: rewritten using fold as 3:eb5a0daa2192 + | | obsolete: folded using fold as 3:eb5a0daa2192 | | summary: B0 | | | x changeset: 1:471f378eab4c |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | obsolete: rewritten using fold as 3:eb5a0daa2192 + | obsolete: folded using fold as 3:eb5a0daa2192 | summary: A0 | o changeset: 0:ea207398892e @@ -474,15 +476,15 @@ working directory parent is obsolete! (471f378eab4c) (use 'hg evolve' to update to its successor: eb5a0daa2192) -Precursors template should show current revision as it is the working copy +Predecessors template should show current revision as it is the working copy $ hg tlog o eb5a0daa2192 - | Precursors: 1:471f378eab4c + | Predecessors: 1:471f378eab4c | semi-colon: 1:471f378eab4c | @ 471f378eab4c |/ Successors: 3:eb5a0daa2192 | semi-colon: 3:eb5a0daa2192 - | Fate: rewritten using fold as 3:eb5a0daa2192 + | Fate: folded using fold as 3:eb5a0daa2192 | o ea207398892e @@ -490,7 +492,7 @@ o eb5a0daa2192 | | @ 471f378eab4c - |/ Obsfate: rewritten using fold as 3:eb5a0daa2192 + |/ Obsfate: folded using fold as 3:eb5a0daa2192 | o ea207398892e @@ -501,21 +503,21 @@ working directory parent is obsolete! (0dec01379d3b) (use 'hg evolve' to update to its successor: eb5a0daa2192) -Precursors template should show both precursors as they should be both +Predecessors template should show both predecessors as they should be both displayed $ hg tlog o eb5a0daa2192 - | Precursors: 2:0dec01379d3b 1:471f378eab4c + | Predecessors: 2:0dec01379d3b 1:471f378eab4c | semi-colon: 2:0dec01379d3b; 1:471f378eab4c | @ 0dec01379d3b | | Successors: 3:eb5a0daa2192 | | semi-colon: 3:eb5a0daa2192 - | | Fate: rewritten using fold as 3:eb5a0daa2192 + | | Fate: folded using fold as 3:eb5a0daa2192 | | | x 471f378eab4c |/ Successors: 3:eb5a0daa2192 | semi-colon: 3:eb5a0daa2192 - | Fate: rewritten using fold as 3:eb5a0daa2192 + | Fate: folded using fold as 3:eb5a0daa2192 | o ea207398892e @@ -523,10 +525,10 @@ o eb5a0daa2192 | | @ 0dec01379d3b - | | Obsfate: rewritten using fold as 3:eb5a0daa2192 + | | Obsfate: folded using fold as 3:eb5a0daa2192 | | | x 471f378eab4c - |/ Obsfate: rewritten using fold as 3:eb5a0daa2192 + |/ Obsfate: folded using fold as 3:eb5a0daa2192 | o ea207398892e @@ -534,28 +536,28 @@ $ hg up 'desc(C0)' 0 files updated, 0 files merged, 0 files removed, 0 files unresolved -Precursors template should not show precursors as it's not displayed in the +Predecessors template should not show predecessors as it's not displayed in the log $ hg tlog @ eb5a0daa2192 | o ea207398892e -Precursors template should show both precursors as we force its display with +Predecessors template should show both predecessors as we force its display with --hidden $ hg tlog --hidden @ eb5a0daa2192 - | Precursors: 2:0dec01379d3b 1:471f378eab4c + | Predecessors: 2:0dec01379d3b 1:471f378eab4c | semi-colon: 2:0dec01379d3b; 1:471f378eab4c | x 0dec01379d3b | | Successors: 3:eb5a0daa2192 | | semi-colon: 3:eb5a0daa2192 - | | Fate: rewritten using fold as 3:eb5a0daa2192 + | | Fate: folded using fold as 3:eb5a0daa2192 | | | x 471f378eab4c |/ Successors: 3:eb5a0daa2192 | semi-colon: 3:eb5a0daa2192 - | Fate: rewritten using fold as 3:eb5a0daa2192 + | Fate: folded using fold as 3:eb5a0daa2192 | o ea207398892e @@ -563,10 +565,10 @@ @ eb5a0daa2192 | | x 0dec01379d3b - | | Obsfate: rewritten using fold as 3:eb5a0daa2192 + | | Obsfate: folded using fold as 3:eb5a0daa2192 | | | x 471f378eab4c - |/ Obsfate: rewritten using fold as 3:eb5a0daa2192 + |/ Obsfate: folded using fold as 3:eb5a0daa2192 | o ea207398892e @@ -649,13 +651,13 @@ working directory parent is obsolete! (471f378eab4c) (471f378eab4c has diverged, use 'hg evolve --list --content-divergent' to resolve the issue) -Precursors template should show current revision as it is the working copy +Predecessors template should show current revision as it is the working copy $ hg tlog * 019fadeab383 - | Precursors: 1:471f378eab4c + | Predecessors: 1:471f378eab4c | semi-colon: 1:471f378eab4c | * fdf9bde5129a - |/ Precursors: 1:471f378eab4c + |/ Predecessors: 1:471f378eab4c | semi-colon: 1:471f378eab4c | @ 471f378eab4c |/ Successors: 2:fdf9bde5129a; 4:019fadeab383 @@ -678,7 +680,7 @@ $ hg up 'desc(A1)' 0 files updated, 0 files merged, 0 files removed, 0 files unresolved -Precursors template should not show precursors as it's not displayed in the +Predecessors template should not show predecessors as it's not displayed in the log $ hg tlog * 019fadeab383 @@ -695,20 +697,20 @@ |/ o ea207398892e -Precursors template should a precursor as we force its display with --hidden +Predecessors template should a precursor as we force its display with --hidden $ hg tlog --hidden * 019fadeab383 - | Precursors: 3:65b757b745b9 + | Predecessors: 3:65b757b745b9 | semi-colon: 3:65b757b745b9 | x 65b757b745b9 - |/ Precursors: 1:471f378eab4c + |/ Predecessors: 1:471f378eab4c | semi-colon: 1:471f378eab4c | Successors: 4:019fadeab383 | semi-colon: 4:019fadeab383 | Fate: reworded using amend as 4:019fadeab383 | | @ fdf9bde5129a - |/ Precursors: 1:471f378eab4c + |/ Predecessors: 1:471f378eab4c | semi-colon: 1:471f378eab4c | x 471f378eab4c |/ Successors: 2:fdf9bde5129a; 3:65b757b745b9 @@ -783,7 +785,7 @@ | | parent: 1:471f378eab4c | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 - | | obsolete: rewritten using fold as 4:eb5a0daa2192 + | | obsolete: folded using fold as 4:eb5a0daa2192 | | summary: B1 | | | | x changeset: 2:0dec01379d3b @@ -795,7 +797,7 @@ | x changeset: 1:471f378eab4c |/ user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | obsolete: rewritten using fold as 4:eb5a0daa2192 + | obsolete: folded using fold as 4:eb5a0daa2192 | summary: A0 | o changeset: 0:ea207398892e @@ -814,12 +816,12 @@ (use 'hg evolve' to update to its successor: eb5a0daa2192) $ hg tlog o eb5a0daa2192 - | Precursors: 1:471f378eab4c + | Predecessors: 1:471f378eab4c | semi-colon: 1:471f378eab4c | @ 471f378eab4c |/ Successors: 4:eb5a0daa2192 | semi-colon: 4:eb5a0daa2192 - | Fate: rewritten using fold as 4:eb5a0daa2192 + | Fate: folded using fold as 4:eb5a0daa2192 | o ea207398892e @@ -827,7 +829,7 @@ o eb5a0daa2192 | | @ 471f378eab4c - |/ Obsfate: rewritten using fold as 4:eb5a0daa2192 + |/ Obsfate: folded using fold as 4:eb5a0daa2192 | o ea207398892e @@ -839,7 +841,7 @@ (use 'hg evolve' to update to its successor: eb5a0daa2192) $ hg tlog o eb5a0daa2192 - | Precursors: 2:0dec01379d3b 1:471f378eab4c + | Predecessors: 2:0dec01379d3b 1:471f378eab4c | semi-colon: 2:0dec01379d3b; 1:471f378eab4c | @ 0dec01379d3b | | Successors: 4:eb5a0daa2192 @@ -849,7 +851,7 @@ | x 471f378eab4c |/ Successors: 4:eb5a0daa2192 | semi-colon: 4:eb5a0daa2192 - | Fate: rewritten using fold as 4:eb5a0daa2192 + | Fate: folded using fold as 4:eb5a0daa2192 | o ea207398892e @@ -860,7 +862,7 @@ | | Obsfate: rewritten using amend, fold as 4:eb5a0daa2192 | | | x 471f378eab4c - |/ Obsfate: rewritten using fold as 4:eb5a0daa2192 + |/ Obsfate: folded using fold as 4:eb5a0daa2192 | o ea207398892e @@ -873,17 +875,17 @@ (use 'hg evolve' to update to its successor: eb5a0daa2192) $ hg tlog o eb5a0daa2192 - | Precursors: 1:471f378eab4c 3:b7ea6d14e664 + | Predecessors: 1:471f378eab4c 3:b7ea6d14e664 | semi-colon: 1:471f378eab4c; 3:b7ea6d14e664 | @ b7ea6d14e664 | | Successors: 4:eb5a0daa2192 | | semi-colon: 4:eb5a0daa2192 - | | Fate: rewritten using fold as 4:eb5a0daa2192 + | | Fate: folded using fold as 4:eb5a0daa2192 | | | x 471f378eab4c |/ Successors: 4:eb5a0daa2192 | semi-colon: 4:eb5a0daa2192 - | Fate: rewritten using fold as 4:eb5a0daa2192 + | Fate: folded using fold as 4:eb5a0daa2192 | o ea207398892e @@ -891,10 +893,10 @@ o eb5a0daa2192 | | @ b7ea6d14e664 - | | Obsfate: rewritten using fold as 4:eb5a0daa2192 + | | Obsfate: folded using fold as 4:eb5a0daa2192 | | | x 471f378eab4c - |/ Obsfate: rewritten using fold as 4:eb5a0daa2192 + |/ Obsfate: folded using fold as 4:eb5a0daa2192 | o ea207398892e @@ -908,14 +910,14 @@ $ hg tlog --hidden @ eb5a0daa2192 - | Precursors: 1:471f378eab4c 3:b7ea6d14e664 + | Predecessors: 1:471f378eab4c 3:b7ea6d14e664 | semi-colon: 1:471f378eab4c; 3:b7ea6d14e664 | x b7ea6d14e664 - | | Precursors: 2:0dec01379d3b + | | Predecessors: 2:0dec01379d3b | | semi-colon: 2:0dec01379d3b | | Successors: 4:eb5a0daa2192 | | semi-colon: 4:eb5a0daa2192 - | | Fate: rewritten using fold as 4:eb5a0daa2192 + | | Fate: folded using fold as 4:eb5a0daa2192 | | | | x 0dec01379d3b | |/ Successors: 3:b7ea6d14e664 @@ -925,7 +927,7 @@ | x 471f378eab4c |/ Successors: 4:eb5a0daa2192 | semi-colon: 4:eb5a0daa2192 - | Fate: rewritten using fold as 4:eb5a0daa2192 + | Fate: folded using fold as 4:eb5a0daa2192 | o ea207398892e @@ -933,13 +935,13 @@ @ eb5a0daa2192 | | x b7ea6d14e664 - | | Obsfate: rewritten using fold as 4:eb5a0daa2192 + | | Obsfate: folded using fold as 4:eb5a0daa2192 | | | | x 0dec01379d3b | |/ Obsfate: reworded using amend as 3:b7ea6d14e664 | | | x 471f378eab4c - |/ Obsfate: rewritten using fold as 4:eb5a0daa2192 + |/ Obsfate: folded using fold as 4:eb5a0daa2192 | o ea207398892e @@ -1037,7 +1039,7 @@ $ hg tlog o 7a230b46bf61 - | Precursors: 1:471f378eab4c + | Predecessors: 1:471f378eab4c | semi-colon: 1:471f378eab4c | @ 471f378eab4c |/ Successors: 2:7a230b46bf61 @@ -1068,7 +1070,7 @@ $ hg tlog --hidden @ 7a230b46bf61 - | Precursors: 1:471f378eab4c + | Predecessors: 1:471f378eab4c | semi-colon: 1:471f378eab4c | x 471f378eab4c |/ Successors: 2:7a230b46bf61 @@ -1132,10 +1134,10 @@ (use 'hg evolve' to update to its parent successor) $ hg tlog o f897c6137566 - | Precursors: 2:0dec01379d3b + | Predecessors: 2:0dec01379d3b | semi-colon: 2:0dec01379d3b | @ 0dec01379d3b - | | Precursors: 1:471f378eab4c + | | Predecessors: 1:471f378eab4c | | semi-colon: 1:471f378eab4c | | Successors: 3:f897c6137566; 1:471f378eab4c | | semi-colon: 3:f897c6137566; 1:471f378eab4c @@ -1143,7 +1145,7 @@ | | Fate: rewritten as 1:471f378eab4c | | | x 471f378eab4c - |/ Precursors: 2:0dec01379d3b + |/ Predecessors: 2:0dec01379d3b | semi-colon: 2:0dec01379d3b | Successors: 2:0dec01379d3b | semi-colon: 2:0dec01379d3b @@ -1168,7 +1170,7 @@ (use 'hg evolve' to update to its parent successor) $ hg tlog o f897c6137566 - | Precursors: 1:471f378eab4c + | Predecessors: 1:471f378eab4c | semi-colon: 1:471f378eab4c | @ 471f378eab4c |/ Fate: pruned @@ -1198,10 +1200,10 @@ $ hg tlog --hidden o f897c6137566 - | Precursors: 2:0dec01379d3b + | Predecessors: 2:0dec01379d3b | semi-colon: 2:0dec01379d3b | x 0dec01379d3b - | | Precursors: 1:471f378eab4c + | | Predecessors: 1:471f378eab4c | | semi-colon: 1:471f378eab4c | | Successors: 3:f897c6137566; 1:471f378eab4c | | semi-colon: 3:f897c6137566; 1:471f378eab4c @@ -1209,7 +1211,7 @@ | | Fate: rewritten as 1:471f378eab4c | | | x 471f378eab4c - |/ Precursors: 2:0dec01379d3b + |/ Predecessors: 2:0dec01379d3b | semi-colon: 2:0dec01379d3b | Successors: 2:0dec01379d3b | semi-colon: 2:0dec01379d3b @@ -1384,10 +1386,10 @@ $ hg tlog @ 0b997eb7ceee - | Precursors: 6:4a004186e638 + | Predecessors: 6:4a004186e638 | semi-colon: 6:4a004186e638 | * b18bc8331526 - |/ Precursors: 6:4a004186e638 + |/ Predecessors: 6:4a004186e638 | semi-colon: 6:4a004186e638 | * ba2ed02b0c9a | | @@ -1421,16 +1423,16 @@ $ hg tlog --hidden @ 0b997eb7ceee - | Precursors: 6:4a004186e638 + | Predecessors: 6:4a004186e638 | semi-colon: 6:4a004186e638 | * b18bc8331526 - |/ Precursors: 6:4a004186e638 + |/ Predecessors: 6:4a004186e638 | semi-colon: 6:4a004186e638 | * ba2ed02b0c9a - | | Precursors: 4:9bd10a0775e4 + | | Predecessors: 4:9bd10a0775e4 | | semi-colon: 4:9bd10a0775e4 | x 4a004186e638 - |/ Precursors: 4:9bd10a0775e4 + |/ Predecessors: 4:9bd10a0775e4 | semi-colon: 4:9bd10a0775e4 | Successors: 8:b18bc8331526; 9:0b997eb7ceee | semi-colon: 8:b18bc8331526; 9:0b997eb7ceee @@ -1438,7 +1440,7 @@ | Fate: reworded using amend as 9:0b997eb7ceee | * dd800401bd8c - | Precursors: 4:9bd10a0775e4 + | Predecessors: 4:9bd10a0775e4 | semi-colon: 4:9bd10a0775e4 | x 9bd10a0775e4 |/ Successors: 5:dd800401bd8c 6:4a004186e638 7:ba2ed02b0c9a @@ -1446,10 +1448,10 @@ | Fate: split as 5:dd800401bd8c, 6:4a004186e638, 7:ba2ed02b0c9a | o f897c6137566 - | Precursors: 2:0dec01379d3b + | Predecessors: 2:0dec01379d3b | semi-colon: 2:0dec01379d3b | x 0dec01379d3b - | | Precursors: 1:471f378eab4c + | | Predecessors: 1:471f378eab4c | | semi-colon: 1:471f378eab4c | | Successors: 3:f897c6137566; 1:471f378eab4c | | semi-colon: 3:f897c6137566; 1:471f378eab4c @@ -1457,7 +1459,7 @@ | | Fate: rewritten as 1:471f378eab4c | | | x 471f378eab4c - |/ Precursors: 2:0dec01379d3b + |/ Predecessors: 2:0dec01379d3b | semi-colon: 2:0dec01379d3b | Successors: 2:0dec01379d3b | semi-colon: 2:0dec01379d3b @@ -1500,16 +1502,16 @@ rebasing 7:ba2ed02b0c9a "Add A,B,C" $ hg tlog * eceed8f98ffc - | Precursors: 4:9bd10a0775e4 + | Predecessors: 4:9bd10a0775e4 | semi-colon: 4:9bd10a0775e4 | * 0b997eb7ceee - | | Precursors: 4:9bd10a0775e4 + | | Predecessors: 4:9bd10a0775e4 | | semi-colon: 4:9bd10a0775e4 * | b18bc8331526 - |/ Precursors: 4:9bd10a0775e4 + |/ Predecessors: 4:9bd10a0775e4 | semi-colon: 4:9bd10a0775e4 * dd800401bd8c - | Precursors: 4:9bd10a0775e4 + | Predecessors: 4:9bd10a0775e4 | semi-colon: 4:9bd10a0775e4 | @ 9bd10a0775e4 |/ Successors: 5:dd800401bd8c 9:0b997eb7ceee 10:eceed8f98ffc; 5:dd800401bd8c 8:b18bc8331526 10:eceed8f98ffc diff -r dd9037486a90 -r 8d20c0af010a tests/test-evolve.t --- a/tests/test-evolve.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-evolve.t Fri Feb 28 23:10:48 2020 +0700 @@ -761,10 +761,10 @@ @ d26d339c513f (12) add 4 |\ x | ce341209337f (4) add 4 - / rewritten(description, user, content) as d26d339c513f using fold by test (Thu Jan 01 00:00:00 1970 +0000) + / folded(description, user, content) as d26d339c513f using fold by test (Thu Jan 01 00:00:00 1970 +0000) | x cf0c3904643c (11) add 3 - |\ rewritten(description, user, parent, content) as d26d339c513f using fold by test (Thu Jan 01 00:00:00 1970 +0000) + |\ folded(description, user, parent, content) as d26d339c513f using fold by test (Thu Jan 01 00:00:00 1970 +0000) | | | \ | |\ @@ -781,19 +781,22 @@ more than 2 successors: 0 available keys: ef1: 10 + fold-id: 5 + fold-idx: 5 + fold-size: 5 operation: 10 user: 10 marker size: format v1: smallest length: 90 - longer length: 92 - median length: 91 - mean length: 90 + longer length: 131 + median length: 130 + mean length: 110 format v0: - smallest length: * (glob) - longer length: * (glob) - median length: * (glob) - mean length: * (glob) + smallest length: * (glob) + longer length: * (glob) + median length: * (glob) + mean length: * (glob) disconnected clusters: 1 any known node: 1 smallest length: 10 diff -r dd9037486a90 -r 8d20c0af010a tests/test-extension-isolation.t --- a/tests/test-extension-isolation.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-extension-isolation.t Fri Feb 28 23:10:48 2020 +0700 @@ -131,6 +131,7 @@ $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-no-ext | egrep 'topics|evoext' [1] $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-topic | egrep 'topics|evoext' + _exttopics_heads topics $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-no-ext | egrep 'topics|evoext' [1] @@ -143,11 +144,13 @@ $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-both | egrep 'topics|evoext' _evoext_getbundle_obscommon _evoext_obshashrange_v1 + _exttopics_heads topics $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-evo | egrep 'topics|evoext' _evoext_getbundle_obscommon _evoext_obshashrange_v1 $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-topic | egrep 'topics|evoext' + _exttopics_heads topics $ hg debugcapabilities http://$LOCALIP:$HGPORT/repo-evo | egrep 'topics|evoext' _evoext_getbundle_obscommon diff -r dd9037486a90 -r 8d20c0af010a tests/test-fold.t --- a/tests/test-fold.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-fold.t Fri Feb 28 23:10:48 2020 +0700 @@ -95,6 +95,10 @@ $ hg fold --from -r 'desc("r5")' 3 changesets folded 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg debugobsolete -r 'desc("r5")' --exclusive + 4de32a90b66cd083ebf3c00b41277aa7abca51dd 198b5c405d01a50c41a81a00fc61677b81981a5f 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '37', 'fold-id': '25cb328e', 'fold-idx': '3', 'fold-size': '3', 'operation': 'fold', 'user': 'test'} + c8d03c1b5e94af74b772900c58259d2e08917735 198b5c405d01a50c41a81a00fc61677b81981a5f 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '33', 'fold-id': '25cb328e', 'fold-idx': '1', 'fold-size': '3', 'operation': 'fold', 'user': 'test'} + f69452c5b1af6cbaaa56ef50cf94fff5bcc6ca23 198b5c405d01a50c41a81a00fc61677b81981a5f 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '37', 'fold-id': '25cb328e', 'fold-idx': '2', 'fold-size': '3', 'operation': 'fold', 'user': 'test'} Checking whether the bookmarks are moved or not @@ -405,8 +409,8 @@ $ hg fold --exact -r 'desc("A")::desc("B")' -m 'second fold' \ > --config experimental.evolution.allowdivergence=no - abort: folding obsolete revisions may cause divergence - (set experimental.evolution.allowdivergence=yes to allow folding them) + abort: fold of 4b34ecfb0d56 creates content-divergence with fcfd42a7fa46 + (add --verbose for details or see 'hg help evolution.instability') [255] but if we allow divergence, this should work and should create new content-divergent changesets diff -r dd9037486a90 -r 8d20c0af010a tests/test-metaedit.t --- a/tests/test-metaedit.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-metaedit.t Fri Feb 28 23:10:48 2020 +0700 @@ -136,16 +136,19 @@ @ a08d35fd7d9d (9) E |\ x | 212b2a2b87cd (8) F - | | rewritten(description, user, parent, content) as a08d35fd7d9d using metaedit by test (Thu Jan 01 00:00:00 1970 +0000) + | | folded(description, user, parent, content) as a08d35fd7d9d using metaedit by test (Thu Jan 01 00:00:00 1970 +0000) | | note: folding changesets using metaedit | | | x c2bd843aa246 (6) E - | rewritten(description, content) as a08d35fd7d9d using metaedit by test (Thu Jan 01 00:00:00 1970 +0000) + | folded(description, content) as a08d35fd7d9d using metaedit by test (Thu Jan 01 00:00:00 1970 +0000) | note: folding changesets using metaedit | x 587528abfffe (7) F - rewritten(user) as 212b2a2b87cd using metaedit by test (Thu Jan 01 00:00:00 1970 +0000) + reauthored(user) as 212b2a2b87cd using metaedit by test (Thu Jan 01 00:00:00 1970 +0000) + $ hg debugobsolete --rev . --exclusive + 212b2a2b87cdbae992f001e9baba64db389fbce7 a08d35fd7d9d0f8cb33d5bd2074e9bafb5cbc70f 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '29', 'fold-id': 'c5832a81', 'fold-idx': '2', 'fold-size': '2', 'note': 'folding changesets using metaedit', 'operation': 'metaedit', 'user': 'test'} + c2bd843aa2468b30bb56d69d4f5fef95b85986f2 a08d35fd7d9d0f8cb33d5bd2074e9bafb5cbc70f 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'fold-id': 'c5832a81', 'fold-idx': '1', 'fold-size': '2', 'note': 'folding changesets using metaedit', 'operation': 'metaedit', 'user': 'test'} no new commit is created here because the date is the same $ HGEDITOR=cat hg metaedit @@ -205,6 +208,8 @@ 1 changesets folded $ hg log -r "tip" --template '{rev}: {author}\n' 12: foobar3 + $ hg debugobsolete --rev 'tip' --exclusive + f3d001339afd30d27fcd91e713274a78233528c8 07a6525ddaf5de1ab33352806abb5724a0954f3f 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '16', 'operation': 'metaedit', 'user': 'foobar3'} working on merge commits too diff -r dd9037486a90 -r 8d20c0af010a tests/test-obsolete.t --- a/tests/test-obsolete.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-obsolete.t Fri Feb 28 23:10:48 2020 +0700 @@ -717,7 +717,7 @@ [2] $ hg olog @ 0d3f46688ccc (3) add obsol_c - | rewritten(parent) as 2033b4e49474 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + | rebased(parent) as 2033b4e49474 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) | rewritten as 725c380fe99b by test (Thu Jan 01 00:00:00 1970 +0000) | x 4538525df7e2 (2) add c diff -r dd9037486a90 -r 8d20c0af010a tests/test-prune.t --- a/tests/test-prune.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-prune.t Fri Feb 28 23:10:48 2020 +0700 @@ -226,8 +226,8 @@ 47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {4538525df7e2b9f09423636c61ef63a4cb872a2d} (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '0', 'operation': 'prune', 'user': 'test'} bb5e90a7ea1f3b4b38b23150a4a597b6146d70ef 6e8148413dd541855b72a920a90c06fca127c7e7 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'prune', 'user': 'test'} 00ded550b1e28bba454bd34cec1269d22cf3ef25 aa96dc3f04c2c2341fe6880aeb6dc9fbffff9ef9 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'prune', 'user': 'test'} - 814c38b95e72dfe2cbf675b1649ea9d780c89a80 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'operation': 'prune', 'user': 'test'} - 354011cd103f58bbbd9091a3cee6d6a6bd0dddf7 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'prune', 'user': 'test'} + 814c38b95e72dfe2cbf675b1649ea9d780c89a80 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'fold-id': '691ebcba', 'fold-idx': '1', 'fold-size': '2', 'operation': 'prune', 'user': 'test'} + 354011cd103f58bbbd9091a3cee6d6a6bd0dddf7 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'fold-id': '691ebcba', 'fold-idx': '2', 'fold-size': '2', 'operation': 'prune', 'user': 'test'} two old, two new with --pair (also test bookmark move) @@ -249,8 +249,8 @@ 47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {4538525df7e2b9f09423636c61ef63a4cb872a2d} (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '0', 'operation': 'prune', 'user': 'test'} bb5e90a7ea1f3b4b38b23150a4a597b6146d70ef 6e8148413dd541855b72a920a90c06fca127c7e7 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'prune', 'user': 'test'} 00ded550b1e28bba454bd34cec1269d22cf3ef25 aa96dc3f04c2c2341fe6880aeb6dc9fbffff9ef9 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'prune', 'user': 'test'} - 814c38b95e72dfe2cbf675b1649ea9d780c89a80 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'operation': 'prune', 'user': 'test'} - 354011cd103f58bbbd9091a3cee6d6a6bd0dddf7 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'prune', 'user': 'test'} + 814c38b95e72dfe2cbf675b1649ea9d780c89a80 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'fold-id': '691ebcba', 'fold-idx': '1', 'fold-size': '2', 'operation': 'prune', 'user': 'test'} + 354011cd103f58bbbd9091a3cee6d6a6bd0dddf7 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'fold-id': '691ebcba', 'fold-idx': '2', 'fold-size': '2', 'operation': 'prune', 'user': 'test'} cb7f8f706a6532967b98cf8583a81baab79a0fa7 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'prune', 'user': 'test'} 21b6f2f1cece8c10326e575dd38239189d467190 6e8148413dd541855b72a920a90c06fca127c7e7 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'prune', 'user': 'test'} $ hg log --hidden -r 'desc("add n2") + desc("add nE") + bookmark("prune-pair-book")' diff -r dd9037486a90 -r 8d20c0af010a tests/test-pullbundle.t --- a/tests/test-pullbundle.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-pullbundle.t Fri Feb 28 23:10:48 2020 +0700 @@ -1277,3 +1277,14 @@ 02-e469a7aa5cce57653b6b02ff46c80b2d94d62629-0000000912skip-0000000016size.hg 02-e74670ea99533967c5d90da3ddbc0318cc1fd502-0000001280skip-0000000256size.hg 02-fb6c210a224903e81e5a8d2ee099cb0c9526ba8c-0000001512skip-0000000004size.hg + + $ hg debugpullbundlecacheoverlap -R server 'all()' | grep -v '^ ' + gathering 100 sample pulls within 2131 revisions + pull size: + non-cached changesets: + ratio of cached changesets: + bundle count: + ratio of cached bundles: + changesets served: + size of cached bundles: + hit on cached bundles: diff -r dd9037486a90 -r 8d20c0af010a tests/test-push-checkheads-pruned-B6.t --- a/tests/test-push-checkheads-pruned-B6.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-push-checkheads-pruned-B6.t Fri Feb 28 23:10:48 2020 +0700 @@ -9,7 +9,7 @@ This case is part of a series of tests checking this behavior. Category B: simple case involving pruned changesets -TestCase 6: single changesets, pruned then superseeded (on a new changeset) +TestCase 6: single changesets, pruned then superseded (on a new changeset) .. old-state: .. diff -r dd9037486a90 -r 8d20c0af010a tests/test-push-checkheads-pruned-B7.t --- a/tests/test-push-checkheads-pruned-B7.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-push-checkheads-pruned-B7.t Fri Feb 28 23:10:48 2020 +0700 @@ -9,7 +9,7 @@ This case is part of a series of tests checking this behavior. Category B: simple case involving pruned changesets -TestCase 7: single changesets, pruned then superseeded (on an existing changeset) +TestCase 7: single changesets, pruned then superseded (on an existing changeset) .. old-state: .. diff -r dd9037486a90 -r 8d20c0af010a tests/test-push-checkheads-unpushed-D6.t --- a/tests/test-push-checkheads-unpushed-D6.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-push-checkheads-unpushed-D6.t Fri Feb 28 23:10:48 2020 +0700 @@ -9,7 +9,7 @@ This case is part of a series of tests checking this behavior. Category D: remote head is "obs-affected" locally, but result is not part of the push -TestCase 6: single changeset, superseeded then pruned (on a new changeset unpushed) changeset +TestCase 6: single changeset, superseded then pruned (on a new changeset unpushed) changeset This is a partial push variation of case B-6 diff -r dd9037486a90 -r 8d20c0af010a tests/test-push-checkheads-unpushed-D7.t --- a/tests/test-push-checkheads-unpushed-D7.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-push-checkheads-unpushed-D7.t Fri Feb 28 23:10:48 2020 +0700 @@ -9,7 +9,7 @@ This case is part of a series of tests checking this behavior. Category D: remote head is "obs-affected" locally, but result is not part of the push -TestCase 7: single changesets, superseeded multiple time then pruned (on a new changeset unpushed) changeset +TestCase 7: single changesets, superseded multiple time then pruned (on a new changeset unpushed) changeset This is a partial push variation of B6 diff -r dd9037486a90 -r 8d20c0af010a tests/test-rewind.t --- a/tests/test-rewind.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-rewind.t Fri Feb 28 23:10:48 2020 +0700 @@ -95,7 +95,7 @@ | x 7e594302a05d (2) c_B0 pruned using prune by test (Thu Jan 01 00:00:00 1970 +0000) - rewritten(meta) as 073989a581cf using rewind by test (Thu Jan 01 00:00:00 1970 +0000) + meta-changed(meta) as 073989a581cf using rewind by test (Thu Jan 01 00:00:00 1970 +0000) $ hg log -G o changeset: 3:073989a581cf @@ -173,8 +173,8 @@ |/ x 7e594302a05d (2) c_B0 pruned using prune by test (Thu Jan 01 00:00:00 1970 +0000) - rewritten(meta) as 073989a581cf using rewind by test (Thu Jan 01 00:00:00 1970 +0000) - rewritten(meta) as b13b032065ef using rewind by test (Thu Jan 01 00:00:01 1970 +0000) + meta-changed(meta) as 073989a581cf using rewind by test (Thu Jan 01 00:00:00 1970 +0000) + meta-changed(meta) as b13b032065ef using rewind by test (Thu Jan 01 00:00:01 1970 +0000) $ hg log -G o changeset: 4:b13b032065ef @@ -273,7 +273,7 @@ | x 7e594302a05d (2) c_B0 rewritten(description, content) as 25c8f5ab0c3b using amend by test (Thu Jan 01 00:00:01 1970 +0000) - rewritten(meta) as b13b032065ef using rewind by test (Thu Jan 01 00:00:01 1970 +0000) + meta-changed(meta) as b13b032065ef using rewind by test (Thu Jan 01 00:00:01 1970 +0000) $ hg log -G * changeset: 4:b13b032065ef @@ -380,8 +380,8 @@ | x 7e594302a05d (2) c_B0 rewritten(description, content) as 25c8f5ab0c3b using amend by test (Thu Jan 01 00:00:01 1970 +0000) - rewritten(meta) as 837cd997bb05 using rewind by test (Thu Jan 01 00:00:02 1970 +0000) - rewritten(meta) as b13b032065ef using rewind by test (Thu Jan 01 00:00:01 1970 +0000) + meta-changed(meta) as 837cd997bb05 using rewind by test (Thu Jan 01 00:00:02 1970 +0000) + meta-changed(meta) as b13b032065ef using rewind by test (Thu Jan 01 00:00:01 1970 +0000) $ hg log -G @ changeset: 5:837cd997bb05 @@ -520,7 +520,7 @@ | o a0316c4c5417 (4) c_CD0 |/ x 49fb7d900906 (3) c_CD0 - rewritten(parent, content) as 9576e80d6851, a0316c4c5417 using split by test (Thu Jan 01 00:00:02 1970 +0000) + split(parent, content) as 9576e80d6851, a0316c4c5417 using split by test (Thu Jan 01 00:00:02 1970 +0000) Actual rewind @@ -547,8 +547,8 @@ |/ rewritten(meta, content) as 4535d0af405c using rewind by test (Thu Jan 01 00:00:02 1970 +0000) | x 49fb7d900906 (3) c_CD0 - rewritten(meta) as 4535d0af405c using rewind by test (Thu Jan 01 00:00:02 1970 +0000) - rewritten(parent, content) as 9576e80d6851, a0316c4c5417 using split by test (Thu Jan 01 00:00:02 1970 +0000) + meta-changed(meta) as 4535d0af405c using rewind by test (Thu Jan 01 00:00:02 1970 +0000) + split(parent, content) as 9576e80d6851, a0316c4c5417 using split by test (Thu Jan 01 00:00:02 1970 +0000) $ hg log -G @ changeset: 6:4535d0af405c @@ -603,7 +603,7 @@ +---o e76375de0bfc (7) c_CD0 | | | x---+ 4535d0af405c (6) c_CD0 - |\| | rewritten(meta, parent, content) as 95d72d892df7, e76375de0bfc using rewind by test (Thu Jan 01 00:00:03 1970 +0000) + |\| | split(meta, parent, content) as 95d72d892df7, e76375de0bfc using rewind by test (Thu Jan 01 00:00:03 1970 +0000) | | | | x | 9576e80d6851 (5) c_CD0 |/ / rewritten(meta, parent, content) as 4535d0af405c using rewind by test (Thu Jan 01 00:00:02 1970 +0000) @@ -611,11 +611,11 @@ | | | x a0316c4c5417 (4) c_CD0 |/ rewritten(meta, content) as 4535d0af405c using rewind by test (Thu Jan 01 00:00:02 1970 +0000) - | rewritten(meta) as e76375de0bfc using rewind by test (Thu Jan 01 00:00:03 1970 +0000) + | meta-changed(meta) as e76375de0bfc using rewind by test (Thu Jan 01 00:00:03 1970 +0000) | x 49fb7d900906 (3) c_CD0 - rewritten(meta) as 4535d0af405c using rewind by test (Thu Jan 01 00:00:02 1970 +0000) - rewritten(parent, content) as 9576e80d6851, a0316c4c5417 using split by test (Thu Jan 01 00:00:02 1970 +0000) + meta-changed(meta) as 4535d0af405c using rewind by test (Thu Jan 01 00:00:02 1970 +0000) + split(parent, content) as 9576e80d6851, a0316c4c5417 using split by test (Thu Jan 01 00:00:02 1970 +0000) $ hg log -G @ changeset: 8:95d72d892df7 @@ -682,7 +682,7 @@ | rewritten(description, content) as d952d1794ff6 using amend by test (Thu Jan 01 00:00:03 1970 +0000) | x 7e594302a05d (2) c_B0 - rewritten(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000) + rebased(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000) $ hg log -G @ changeset: 4:a65fceb2324a @@ -723,8 +723,8 @@ |/ rewritten(meta, parent) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000) | x 7e594302a05d (2) c_B0 - rewritten(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000) - rewritten(meta) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000) + rebased(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000) + meta-changed(meta) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000) $ hg log -G @ changeset: 5:ac979e0aac4e @@ -797,12 +797,12 @@ |/| rewritten(meta, parent) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000) | | x | a65fceb2324a (4) c_B0 - |/ rewritten(meta) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000) + |/ meta-changed(meta) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000) | rewritten(meta, parent) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000) | x 7e594302a05d (2) c_B0 - rewritten(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000) - rewritten(meta) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000) + rebased(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000) + meta-changed(meta) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000) Automatically rewinding the full stack (with --to) -------------------------------------------------- @@ -833,12 +833,12 @@ | | rewritten(meta, parent) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000) | | x | a65fceb2324a (4) c_B0 - |/ rewritten(meta) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000) + |/ meta-changed(meta) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000) | rewritten(meta, parent) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000) | x 7e594302a05d (2) c_B0 - rewritten(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000) - rewritten(meta) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000) + rebased(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000) + meta-changed(meta) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000) $ hg log -G @ changeset: 8:3f2d8862657d @@ -897,12 +897,12 @@ | | rewritten(meta, parent) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000) | | | x a65fceb2324a (4) c_B0 - |/ rewritten(meta) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000) + |/ meta-changed(meta) as a5dd64adbb2a using rewind by test (Thu Jan 01 00:00:04 1970 +0000) | rewritten(meta, parent) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000) | x 7e594302a05d (2) c_B0 - rewritten(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000) - rewritten(meta) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000) + rebased(parent) as a65fceb2324a using evolve by test (Thu Jan 01 00:00:03 1970 +0000) + meta-changed(meta) as ac979e0aac4e using rewind by test (Thu Jan 01 00:00:03 1970 +0000) $ hg log -G @ changeset: 10:d36d6d267714 @@ -1013,7 +1013,7 @@ | x 30704102d912 (1) initial rewritten(description, content) as 2ea5be2f8751 using amend by test (Thu Jan 01 00:00:06 1970 +0000) - rewritten(meta) as b4c97fddc16a using rewind by test (Thu Jan 01 00:00:06 1970 +0000) + meta-changed(meta) as b4c97fddc16a using rewind by test (Thu Jan 01 00:00:06 1970 +0000) $ hg glf --hidden @ 3: initial (a b) diff -r dd9037486a90 -r 8d20c0af010a tests/test-topic-server.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-topic-server.t Fri Feb 28 23:10:48 2020 +0700 @@ -0,0 +1,200 @@ + $ . "$TESTDIR/testlib/topic_setup.sh" + + $ cat << EOF >> $HGRCPATH + > [experimental] + > evolution = all + > topic.publish-bare-branch = yes + > topic.server-gate-topic-changesets = yes + > + > [extensions] + > evolve = + > + > [phases] + > publish = no + > + > [ui] + > ssh = "$PYTHON" "$RUNTESTDIR/dummyssh" + > EOF + + $ hg init server + $ cd server + + $ echo a > a + $ hg commit -qAm root + $ hg phase --public -r 'all()' + + $ cd .. + + $ hg clone ssh://user@dummy/server client-topic1 + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + new changesets 6569b5a81c7e + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg clone ssh://user@dummy/server client-topic2 + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + new changesets 6569b5a81c7e + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg version -v -R client-topic1 + warning: --repository ignored + Mercurial Distributed SCM (*) (glob) + (see https://mercurial-scm.org for more information) + + Copyright (C) 2005-* Matt Mackall and others (glob) + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + Enabled extensions: + + rebase internal + topic external * (glob) + evolve external * (glob) + $ hg clone ssh://user@dummy/server client-plain + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + new changesets 6569b5a81c7e + updating to branch default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cat << EOF >> client-plain/.hg/hgrc + > [extensions] + > topic = ! + > EOF + $ hg version -v -R client-plain + warning: --repository ignored + Mercurial Distributed SCM (*) (glob) + (see https://mercurial-scm.org for more information) + + Copyright (C) 2005-* Matt Mackall and others (glob) + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + Enabled extensions: + + rebase internal + evolve external * (glob) + +Make two commits, with and without a topic, and push them to the server + + $ cd client-topic1 + $ echo b > b + $ hg topic some-work + marked working directory as topic: some-work + $ hg commit -Am 'adding b (topic)' + adding b + active topic 'some-work' grew its first changeset + (see 'hg help topics' for more information) + $ hg up 0 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ echo c > c + $ hg commit -Am 'adding c (no topic)' + adding c + $ hg up some-work + switching to topic some-work + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg topic --clear + $ echo d > d + $ hg commit -Am 'adding d (no topic)' + adding d + created new head + (consider using topic for lightweight branches. See 'hg help topic') + $ hg log -r 'all() - 0' + changeset: 1:2a2e8b3520f2 + topic: some-work + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: adding b (topic) + + changeset: 2:b46feb4d24f9 + parent: 0:6569b5a81c7e + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: adding c (no topic) + + changeset: 3:be22ca6e89ea + tag: tip + parent: 1:2a2e8b3520f2 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: adding d (no topic) + + +(disable the bare publishing to put a bare draft on the server) + + $ cat << EOF >> ../server/.hg/hgrc + > [experimental] + > topic.publish-bare-branch = no + > EOF + $ hg push --force + pushing to ssh://user@dummy/server + searching for changes + remote: adding changesets + remote: adding manifests + remote: adding file changes + remote: added 3 changesets with 3 changes to 3 files (+1 heads) + $ cd .. + $ hg --cwd server phase -r 'tip' + 3: draft + +Clients with topic can exchange draft changesets both with and without a topic through the server + + $ hg --cwd client-topic2 pull + pulling from ssh://user@dummy/server + searching for changes + adding changesets + adding manifests + adding file changes + added 3 changesets with 3 changes to 3 files (+1 heads) + new changesets 2a2e8b3520f2:be22ca6e89ea (3 drafts) + (run 'hg heads' to see heads, 'hg merge' to merge) + $ hg --cwd client-topic2 log -r 'all() - 0' + changeset: 1:2a2e8b3520f2 + topic: some-work + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: adding b (topic) + + changeset: 2:b46feb4d24f9 + parent: 0:6569b5a81c7e + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: adding c (no topic) + + changeset: 3:be22ca6e89ea + tag: tip + parent: 1:2a2e8b3520f2 + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: adding d (no topic) + + +Client without topic only sees draft changesets if they don't have a topic + + $ hg --cwd client-plain pull + pulling from ssh://user@dummy/server + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + new changesets b46feb4d24f9 (1 drafts) + (run 'hg update' to get a working copy) + $ hg --cwd client-plain phase -r 'all() - 0' + 1: draft + $ hg --cwd client-plain log -r 'all() - 0' + changeset: 1:b46feb4d24f9 + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: adding c (no topic) + diff -r dd9037486a90 -r 8d20c0af010a tests/test-topic-stack-complex.t --- a/tests/test-topic-stack-complex.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-topic-stack-complex.t Fri Feb 28 23:10:48 2020 +0700 @@ -7,6 +7,7 @@ $ cat << EOF >> $HGRCPATH > [experimental] > evolution = all + > evolution.allowdivergence = True > [ui] > interactive = True > [extensions] diff -r dd9037486a90 -r 8d20c0af010a tests/test-topic-stack.t --- a/tests/test-topic-stack.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-topic-stack.t Fri Feb 28 23:10:48 2020 +0700 @@ -961,16 +961,16 @@ | @ e7ea874afbd5 (22) c_G |/ x b24bab30ac12 (20) c_G - | rewritten(parent, content) as dde94df880e9, e7ea874afbd5 using split by test (Thu Jan 01 00:00:00 1970 +0000) + | split(parent, content) as dde94df880e9, e7ea874afbd5 using split by test (Thu Jan 01 00:00:00 1970 +0000) | x 907f7d3c2333 (18) c_G - | rewritten(content) as b24bab30ac12 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + | amended(content) as b24bab30ac12 using amend by test (Thu Jan 01 00:00:00 1970 +0000) | x 3ab2eedae500 (13) c_G - | rewritten(parent) as 907f7d3c2333 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) + | rebased(parent) as 907f7d3c2333 using rebase by test (Thu Jan 01 00:00:00 1970 +0000) | x c7d60a180d05 (6) c_G - rewritten(user) as 3ab2eedae500 using amend by test (Thu Jan 01 00:00:00 1970 +0000) + reauthored(user) as 3ab2eedae500 using amend by test (Thu Jan 01 00:00:00 1970 +0000) $ hg export . # HG changeset patch diff -r dd9037486a90 -r 8d20c0af010a tests/test-topic.t --- a/tests/test-topic.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-topic.t Fri Feb 28 23:10:48 2020 +0700 @@ -120,11 +120,30 @@ [experimental] topic.allow-publish = no + Server side visibility + ====================== + + Serving changesets with topics to clients without topic extension can get + confusing. Such clients will have multiple anonymous heads without a clear way + to distinguish them. They will also "lose" the canonical heads of the branch. + + To avoid this confusion, server can be configured to only serve changesets + with topics to clients with the topic extension (version 9.3+). This might + become the default in future: + + [experimental] + topic.server-gate-topic-changesets = yes + list of commands: + Change organization: + + topics View current topic, set current topic, change topic for a set + of revisions, or see all topics. + + Change navigation: + stack list all changesets in a topic and other information - topics View current topic, set current topic, change topic for a set - of revisions, or see all topics. (use 'hg help -v topic' to show built-in aliases and global options) $ hg help topics diff -r dd9037486a90 -r 8d20c0af010a tests/test-touch.t --- a/tests/test-touch.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-touch.t Fri Feb 28 23:10:48 2020 +0700 @@ -221,4 +221,9 @@ (a)llow divergence or (d)uplicate the changeset? a 2 new content-divergent changesets +But -A allows divergence + + $ hg touch -r "desc('modified c')" --hidden -A + 1 new content-divergent changesets + $ cd .. diff -r dd9037486a90 -r 8d20c0af010a tests/test-uncommit-interactive.t --- a/tests/test-uncommit-interactive.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-uncommit-interactive.t Fri Feb 28 23:10:48 2020 +0700 @@ -177,7 +177,7 @@ @ 678a59e5ff90 (3) another one | x f70fb463d5bf (1) another one - rewritten(content) as 678a59e5ff90 using uncommit by test (Thu Jan 01 00:00:00 1970 +0000) + amended(content) as 678a59e5ff90 using uncommit by test (Thu Jan 01 00:00:00 1970 +0000) note: note on amend --extract The unselected part should be in the diff @@ -312,11 +312,11 @@ @ 46e35360be47 (5) another one | x 678a59e5ff90 (3) another one - | rewritten(content) as 46e35360be47 using uncommit by test (Thu Jan 01 00:00:00 1970 +0000) + | amended(content) as 46e35360be47 using uncommit by test (Thu Jan 01 00:00:00 1970 +0000) | note: testing uncommit on dirty wdir | x f70fb463d5bf (1) another one - rewritten(content) as 678a59e5ff90 using uncommit by test (Thu Jan 01 00:00:00 1970 +0000) + amended(content) as 678a59e5ff90 using uncommit by test (Thu Jan 01 00:00:00 1970 +0000) note: note on amend --extract diff -r dd9037486a90 -r 8d20c0af010a tests/test-uncommit.t --- a/tests/test-uncommit.t Thu Jan 30 14:32:04 2020 +0700 +++ b/tests/test-uncommit.t Fri Feb 28 23:10:48 2020 +0700 @@ -1,4 +1,6 @@ $ cat >> $HGRCPATH < [experimental] + > evolution.allowdivergence = True > [extensions] > EOF $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH