changeset 3112:706402d70b3f mercurial-3.9

test-compat: merge with mercurial-4.0 branch
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 20 Oct 2017 18:44:52 +0200
parents 7518ff7f26da (diff) a456f55b3a6b (current diff)
children 27305068c5c9 add76a5eb1ae
files tests/test-discovery-obshashrange.t tests/test-evolve-cycles.t tests/test-evolve-effectflags.t tests/test-evolve-obshistory-complex.t tests/test-evolve-obshistory.t tests/test-evolve-serveronly.t tests/test-evolve-templates.t tests/test-evolve-topic.t tests/test-evolve.t tests/test-obsolete.t tests/test-prev-next.t tests/test-split.t tests/test-stabilize-result.t tests/test-stack-branch.t tests/test-topic-dest.t tests/test-topic-fold.t tests/test-topic-push-concurrent-on.t tests/test-topic-push.t tests/test-topic-rebase.t tests/test-topic-shelve.t tests/test-topic-stack-data.t tests/test-topic-stack.t tests/test-topic-tutorial.t tests/test-topic.t
diffstat 41 files changed, 2309 insertions(+), 1951 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Wed Sep 27 01:22:58 2017 +0200
+++ b/.hgtags	Fri Oct 20 18:44:52 2017 +0200
@@ -56,3 +56,5 @@
 e60248f26f923f4460682252f7863ff86f7b86b0 6.4.0
 734c0bc066cdc0121a20a9cb44c8cc30c653be94 6.5.0
 cc3e09e033a3c632c9ac35badbf8b5d53f584049 6.6.0
+3a4f75c6619c7ef7d78ee0912efd6cb01d55b521 6.7.0
+430ad68292d76b9387d1eeadf289951f51fd88d3 6.7.1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CHANGELOG	Fri Oct 20 18:44:52 2017 +0200
@@ -0,0 +1,627 @@
+Changelog
+=========
+
+6.8.0 -- in progress
+----------------
+
+topic(0.4.0)
+
+  * topic: fix handling of bookmarks and phases while changing topics.
+
+6.7.2 -- in progress
+----------------
+
+  * pager: pager support to `obslog` and `evolve --list`
+
+topic(0.3.2)
+
+  * pager: pager support to `topics` and `stack`
+
+6.7.1 -- 2017-10-10
+-------------------
+
+  * obsfate: fix case were current user would disapear from the user list
+
+topic (0.3.1)
+
+  * topic: introduce a documented 'experimental.topic-mode' config
+  * topic: add support for 'random' topic mode (see documentation for details)
+  * stack: fix evolution preview for simple split.
+  * fix a performance regression affecting all transactions.
+    (the more non public changeset (hidden included), the slower)
+
+6.7.0 -- 2017-09-27
+-------------------
+
+  * compatibility with change in future 4.4 at this release date,
+  * documentation: improvement to content, wording and graphs,
+  * obslog: improved templatability,
+  * obslog/log: improve verb used to describe and evolution,
+  * pstatus/pdiff: update to full command. They now appears in the help,
+  * uncommit: add a --interactive option (4.3+ only).
+
+topic (0.3.0)
+
+  * push: add a --topic option to mirror --bookmark and --branch,
+  * stack: improve display of interleaved topic,
+  * stack: improve display of merge commit,
+  * topic: add a new 'debugconvertbookmark' commands (4.3+ only),
+    It helps migrating from bookmark feature branch to topic feature branch,
+  * topic: --age flag also shows the user who last touched the topic,
+  * topic: be more informative about topic activation and deactivation,
+  * topic: gain a --current flag,
+  * topic: small clarification and cleanup on various output.
+
+6.6.0 -- 2017-07-25
+-------------------
+
+  - amend: add a --extract flag to move change back to the working copy,
+    (same as uncommit, but accessible through the amend commit)
+  - split: now properly refuse to split public changeset,
+  - commands: unify and improve the pre-rewrite validation and error message,
+  - uncommit: add support for --current-date and --current-user option,
+  - fold: add support for --current-date and --current-user option,
+  - metaedit: add support for --current-date and --current-user option,
+  - split: add support for --current-date and --current-user option,
+  - compat: use various new API instead of the one deprecated in 4.3,
+    (when available)
+  - documentation: various minor documentation update.
+
+topic (0.2.0):
+
+  - topic: add --age option to sort topic by the most recently touched,
+  - topic: add a 't0' to access the root of a topic while keeping it active,
+  - topic: allow 'hg prev' to me move to 't0',
+  - topic: add a config option to enforce topic on new commit,
+    (experimental.enforce-topic)
+  - topic: make command names valid as expected, even if ui.strict=true.
+
+6.5.0 -- 2017-07-02
+-------------------
+
+features:
+
+ - obslog: gain a --patch flag to display changes introduced by the evolution
+  (Currently limited to in simple case only)
+ - log: display obsolescence fate by default, (future 4.3 only)
+ - doc: various minor improvement.
+
+bugfixes:
+
+ - evolve: fix branch preservation for merge,
+ - obsfate: improve support for advanced template reformating,
+ - split: preserve author of the splitted changeset.
+ - grab: properly fix hg executable on windows.
+
+topic (0.1.0):
+
+ - stack: also show the unstable status for the current changeset, (issue5553)
+ - stack: properly abort when and unknown topic is requested,
+ - stack: add basic and raw support for named branches,
+ - topic: changing topic on revs no longer adds extra instability, (issue5441)
+ - topic: topics: rename '--change' flag to '--rev' flag,
+ - topic: multiple large performance improvements,
+ - topic: various small output improvement,
+ - topic: improved topic preservation for various commands.
+
+
+6.4.0 -- 2017-06-16
+-------------------
+
+ - template: signifiant improvement to the '{obsfate}' template (now 4.2+ only)
+ - template: fix 'successors' and 'precursors' template to expose hex-node
+ - effect flag: the experiment is now active by default,
+   (see 'hg help -e evolve' to opt out)
+ - effect flag: fix a small bug related to hidden changeset,
+ - obscache: reduce impact on large repository
+ - obshashrange: install a '.max-revs' option see extension help for details
+
+6.3.1 -- 2017-06-01
+-------------------
+
+ - also backport the "revelant-markers" fix when using "evolve.serveronly"
+
+6.3.0 -- 2017-05-31
+-------------------
+
+ - olog: add an 'obslog' alias
+ - olog: add an '--all' option to show the whole obsolescence history tree.
+ - evolution: add an experiment to track the effect of rewrites.
+   (See hg help - evolve for details)
+ - exchange: fix the "relevant-markers" algorithm to include inline prune.
+   This will impact discovery of obsmarkers between server and client if one
+   still uses the old algorithm. Please upgrade both clients and servers as
+   soon as possible.
+   (See changeset 176d1a0ce385 in core Mercurial for details)
+ - obsdiscovery: add a config flag to disable all obsmarkers discovery
+   (See hg help - evolve for details)
+ - template: add a 'precursors' template that display the closests precursors of changesets
+ - template: add a 'successors' template that display the closests successors of changesets
+ - template: add a 'obsfate' template that display how a changeset has evolved
+ - new discovery experiment: add options to restrict memory consumption on
+   large repository (see "hg help -e evolve" for details).
+ - evolve: fix --rev handling in --list mode
+
+6.2.1 -- 2017-05-23
+-------------------
+
+ - prune: fix a crash related to color handling,
+ - next: fix a crash related to color handling,
+ - discovery: document the 'obshashrange' experiment,
+ - cache: reduce the warming load in case of reset,
+ - cache: add a 'experimental.obshashcache.warm-cache' option to allow
+   disabling post transaction cache warming.
+
+6.2.0 -- 2017-05-18
+-------------------
+
+ - olog: a new command to inspect the obs-history of a changeset (hg-4.0 + only),
+ - topic: have thg display topic name if possible,
+ - blackbox: log more information about discovery and cache computation,
+ - obscache: more efficient update in the (rare) case of a transaction adding
+   markers without changesets,
+ - obscache: fix more cache invalidation propagation,
+ - obscache: also enable the new cache (from 6.1.0) for 'evolve.server-only',
+ - obshashrange-cache: update incrementally in the (common) case of a
+   transaction not affecting existing range,
+ - obshashrange-cache: keep the cache warm after each transaction,
+ - topic: now requires Mercurial 4.0 or above,
+ - stack: now display if current revision is in bad state (issue5533),
+ - stack: fix json output to be valid json.
+
+6.1.0 -- 2017-05-03
+-------------------
+
+ - improve message about obsolete working copy parent,
+ - improve message issued  when accessing hidden nodes (4.2 only),
+ - introduce a new caches to reduce the impact of evolution on read-only commands,
+ - add a 'experimental.auto-publish' config. See `hg help -e evolve` for details.
+ - fix the propagation of some some cache invalidation,
+
+6.0.1 -- 2017-04-20
+-------------------
+
+ - template: adapt to change in 4.2,
+ - fix 'debugrecordpruneparents' (outdated API usage)
+ - checkheads: give priority to updated 4.2 code,
+ - serveronly: fix repository initialization.
+
+6.0.0 -- 2017-03-31
+-------------------
+
+- push: improved detection of obsoleted remote branch (issue4354),
+- drop compatibility for Mercurial < 3.8,
+- removed old (unpackaged) pushexperiment extension,
+- move all extensions in the official 'hgext3rd' namespace package,
+- add the "topic" experimental extensions. See the README.topic file for details
+- officially ship 'evolve.serveronly' extensions. That extensions contains
+  only the part related to exchange and is intended to be used by server.
+
+  Using the extension will enable evolution, use 'experimental.evolution=!'
+  to disable obsmarkers echange.  The old '__temporary__.advertiseobsolete'
+  option is no longer supported.
+
+- a new prototype of obsmarker discovery is available. The prototype is still
+  at early stage and not recommended for production.
+  Examples of current limitations:
+
+  - write access to the repo is highly recommanded for all operation,
+  - large memory footprint,
+  - initial caching is slow,
+  - unusable on large repo (because of various issue pointed earlier),
+  - likely to constains various bugs.
+
+  It can be tested by setting `experimental.obshashrange=1` on both client and
+  server. It is recommanded to get in touch with the evolve maintainer if you
+  decide to test it.
+
+- the 'debugrecordpruneparents' have been moved into the 'evolve.legacy'
+  separate extension. enable that extentions if you need to convert/update
+  markers in an old repository.
+
+5.6.1 -- 2017-02-28
+-------------------
+
+- fix a crash that sometime happened when evolving merges.
+
+5.6.0 -- 2017-02-01
+-------------------
+
+- compatibility with Mercurial 4.1.
+- improvement of prune error message.
+- fold: require --from flag for folding revisions to working copy
+- fix crash when trying to fold an empty revision set (issue5453)
+- uncommit: preserve copy information of remaining files (issue5403)
+
+5.5.0 -- 2016-10-30
+-------------------
+
+- The {obsolete} template now yield "obsolete" or "".
+- compatibility with Mercurial 4.0
+- Fix erroneous manifest computation when solving 'bumped' changeset.
+- split: avoid crash on empty commit (issue5191),
+- next: improve locking to avoid issue with working copy parent (issue5244)
+- prev: improve locking to avoid issue with working copy parent (issue5244)
+- evolve: fix abort suggestion to include '.' in 'hg update -C .'
+
+5.4.1 -- 2016-08-01
+-------------------
+
+ - compat with Mercurial 3.9
+
+5.4.0 -- 2016-05-06
+-------------------
+
+- Some collaboration with the topic experimental extensions,
+  - hg evolve --all with consider all troubles in your current topic,
+  - preserve 'topic' during evolve,
+  - 'next' and 'prev' restrict themself to the current topic by default,
+- remove the dangerous 'kill' alias for 'prune' (because 'hg kill -1' without
+  the leading 'hg' will give you an hardtime)
+- during 'hg evolve' skip unsupported merge instead of aborting
+- various documentation fix and update
+- hg summary now suggest 'hg evolve --continue when appropriate`
+- compatibility with Mercurial 3.8 'hgext' namespace package.
+- small improvement to the `hg split` instruction
+- add a 'metaedit' command to rewrite changeset meta data.
+
+5.3.0 -- 2016-02-11
+-------------------
+
+- split: add a new command to split changesets,
+- tests: drop our copy of 'run-tests.py' use core one instead,
+- bookmark: do all bookmark movement within a transaction.
+- evolve: compatibility with Mercurial 3.7
+- evolve: support merge with a single obsolete parent (hg-3.7+ only)
+- evolve: prevent added file to be marked as unknown if evolve fails (issue4966)
+- evolve: stop relying on graftstate file for save evolve state
+          (for `hg evolve --continue`)
+- evolve: fix divergence resolution when it result in an empty commit
+          (issue4950) (hg-3.5+ only)
+- no longer lock the repository for `hg parents` (issue4895)
+- updated help for the `evolve` command
+
+5.2.1 -- 2015-11-02
+-------------------
+
+- add compatibility with Mercurial 3.6
+- prune: fixed possible issue with lock and bookmark
+- next/prev: fixed possible issue with lock and bookmark
+- add some progress data during changesets discovery
+- take advantage of dirstate/transaction collaboration
+
+5.2.0 -- 2015-06-25
+-------------------
+
+- evolve: gain a --rev option to control what revisions to evolve (issue4391)
+- evolve: revision are processed in the order they stack on destination
+- evolve: properly skip unstable revision with non-evolved unstable parent
+- evolve: gain --unstable --divergent --bumped flag to select the trouble
+- evolve: issue more useful error message and hint when evolve has nothing to
+          do as invocated.
+- evolve: bare `hg evolve` commands now abort when multiple changesets could be
+          a target.
+- evolve: `hg evolve --all` only evolve changeset that will end up as
+          descendant of the current working copy. The old behavior of `--all`
+          in now in `--all --any`.
+- evolve: add a 'experimental.evolutioncommands' for fine grained commands
+          enabling
+- next/prev: requires `--merge` to move with uncommitted changes
+- next: significantly reword error messages
+- next: add a --evolve flag to evolve aspiring children when on a head
+
+5.1.5 -- 2015-06-23
+-------------------
+
+- minor documentation cleanup
+- support -i option for `hg amend` if commit supports it (3.4)
+- fix the `debugrecordpruneparents` utility
+- fix some possible crash during command abort (release nonexistent transaction)
+- fix simple4server bug tracker URL
+- compatibility with bookmark API change in future Mercurial 3.5
+- prune no longer move the active bookmark for no reason (issue4559)
+- evolve: stop reporting divergence base as missing when we actually have it
+- significant performance improvement for all revsets.
+- provide a hint of how to update to the successor of an obsolete working copy
+  parent.
+
+5.1.4 -- 2015-04-23
+-------------------
+
+- significant documentation update
+- fix issue4616: pulling with bundle2 would crash if common marker when
+  discovered on non-served changesets.
+- fix the debugobsrelsethashtree command
+
+5.1.3 -- 2015-04-20
+-------------------
+
+- discovery: fix misbehaving discovery across python version
+- pull: properly install the bundle2 par generator
+  (avoid sending all markers for each pull)
+- commit: avoid potential deadlock (acquires wlock before lock)
+- graft: avoid potential deadlock (acquires wlock before lock)
+
+5.1.2 -- 2015-04-01
+-------------------
+
+- evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
+
+5.1.1 -- 2015-03-05
+-------------------
+
+- debugobsconvert: fix invalid markers during conversion
+- discovery: cache some of the obs hash computation to improve performance (issue4518)
+- revset: fix some crash with (issue4515)
+
+5.1 -- 2015-01-30
+-------------------
+
+- evolve: explicitly disable bookmark on evolve (issue4432)
+- evolve: don't abort Mercurial on version mismatch
+- compatibility with mercurial 3.3
+
+5.0.2 -- 2014-12-14
+-------------------
+
+- evolve: remove dependency to the rebase extension
+
+5.0.1 -- 2014-11-25
+-------------------
+
+- amend: fix --logfile argument
+- evolve: preserve branch change when evolving
+- evolve: fix potential crash while solving `bumped` changesets.
+- uncommit: abort when rev specifies the current changeset
+- evolve: various message improvement
+- evolve: fix selection of changeset to evolve from the middle of a stack (issue4434)
+- evolve: make next/prev only move bookmarks optionally
+- evolve: tell user which "base of divergent changeset" is not found
+
+5.0.0 -- 2014-10-22
+-------------------
+
+- drop compat with Mercurial pre 3.2
+- uncommit: add a --rev argument
+- evolve: add a `working directory now at xxxxxxxxxx` message
+- evolve: automatically translate obsolete hashes when evolving
+- properly skip marker creating if patch apply cleanly
+- prune: work around a massive slowdown from lazy revset
+- grab: "fix" the grab alias on window
+
+- fix an issue where prune performance were quadratic with the number of
+  changesets pruned.
+- pull: use discovery to pull less obsmarkers through bundle2
+
+
+4.1.0 -- 2014-08-08
+-------------------
+
+- amend: add -D/--current-date option
+- amend: add -U/--current-user option
+- evolve: add a --tool option
+- evolve: add a --confirm option
+- mark "commit -o", "graft -o" and "graft -O" as deprecated since they are
+  unlikely to eventually make it into core.
+- push obsmarkers and phases in the same transaction than changesets
+  (when using hg >= 3.1 and bundle2-exp is enabled)
+- hide message about the obsolescence marker exchange behind a
+  `experimental.verbose-obsolescence-exchange` variable (default to False).
+
+4.0.1 -- 2014-08-08
+-------------------
+
+- createmarkers() accept an iterable (for compat with other extension)
+
+4.0.0 -- 2014-06-03
+-------------------
+
+- require Mercurial version 3.0.1 or above
+- some compatibility fixes with future 3.1.0
+- deprecated `gup` and `gdown` in favor of prev and next
+- record parent of pruned parent at prune time
+- added a `debugobsstorestat` command to gather data on obsmarker content.
+- added a `debugrecordpruneparents` command to upgrade existing prune marker
+  with parent information. Please run it once per repo after upgrading.
+- improvement to obsolescence marker exchange:
+  - added progress when pushing obsmarkers
+  - added multiple output during obsolescence markers exchange
+  - only push markers relevant to pushed subset
+  - add a new experimental way to exchange marker (when server support):
+
+    - added progress when pulling obsmarkers
+    - only pull markers relevant to pulled subset
+    - avoid exchanging common markers in some case
+    - use bundle2 as transport when available.
+
+ - add a hook related to the new commands
+
+3.3.2 -- 2014-05-14
+-------------------
+
+- fix a bug where evolve were creating changeset with 2 parents on windows
+  (fix issues #16, #35 and #42)
+- adds a --obsolete flag to import (requires Mercurial 3.0)
+- prune: update to successor rather than parent when pruning '.' with -s
+- fold: add missing --message and --logfile option
+- fold: add squash as an alias
+
+3.3.1 -- 2014-04-23
+-------------------
+
+- various language fix
+- active bookmark now move when using prev/next (#37)
+- fix some preservation of rename information on evolve (#33)
+- abort when evolve tries to move a node on top of itself (will helps on the #35 front)
+- fold: enable --date and --user options
+
+3.3.0 -- 2014-03-04
+-------------------
+
+- raise Mercurial's minimal requirement to 2.7
+- drop `latercomer` and `conflicting` compatibility. Those old alias are
+  deprecated for a long time now.
+- add verbose hint about how to handle corner case by hand.
+  This should help people until evolve is able to to it itself.
+- removed the qsync extension. The only user I knew about (logilab) is not
+  using it anymore. It not compatible with coming Mercurial version 2.9.
+- add progress indicator for long evolve command
+- report troubles creation from `hg import`
+
+3.2.0 -- 2013-11-15
+-------------------
+
+- conform to the Mercurial custom of lowercase messages
+- added a small extension to experiment with obsolescence marker push
+- amend: drop the deprecated note option
+- amend: use core mechanism for amend (fix multiple bugs)
+- parents command: add "working directory parent is obsolete" message
+- evolve command: allow updating to the successor if the parent is
+  obsolete
+- gdown and gup commands: add next and previous alias, respectively
+- make grab aliases compatible with Mercurial 2.8
+- Tested with 2.6, 2.7 and 2.8
+
+3.1.0 -- 2013-02-11
+-------------------
+
+- amend: drop deprecated --change option for amend
+- alias: add a grab alias to be used instead of graft -O
+- touch: add a --duplicate option to *not* obsolete the old version
+- touch: fix touching multiple revision at the same time
+- evolve: add a --all option
+- prune: various minor improvements
+- prune: add option to prune a specific bookmark
+- prune: add -u and -d option to control metadata
+
+3.0.0 -- 2013-02-02
+-------------------
+
+- compatibility with 2.5
+
+2.2.0 --
+-------------------
+
+- make evolve smarter at picking next troubled to solved without --any
+
+2.1.0 -- 2012-12-03
+-------------------
+
+- qsync fixes
+- have qfold ask for commit message
+
+2.0.0 -- 2012-10-26
+-------------------
+
+- compat with mercurial 2.4
+
+1.1.0 -- 2012-10-26
+-------------------
+
+- fix troubles creation reporting from rebase
+- rename latecomer to bumped
+- renamed conflicting to divergent
+- smarter divergent handling
+
+1.0.2 -- 2012-09-19
+-------------------
+
+- fix hg fold bug
+- fix hg pull --rebase
+- fix detection of conflict with external tools
+- adapt to core movement (caches and --amend)
+
+1.0.1 -- 2012-08-31
+-------------------
+
+- documentation improvement
+- fix a performance bug with hgweb
+
+1.0 -- 2012-08-29
+-------------------
+
+- Align with Mercurial version 2.3 (drop 2.2 support).
+- stabilize handle killed parent
+- stabilize handle late comer
+- stabilize handle conflicting
+- stabilize get a --continue switch
+- merge and update ignore extinct changeset in most case.
+- new "troubled()" revset
+- summary now reports troubles changesets
+- new touch command
+- new fold command
+- new basic olog alias
+
+- rebase refuse to work on public changeset again
+- rebase explicitly state that there is nothing to rebase because everything is
+  extinct() when that happen.
+- amend now cleanly abort when --change switch is misused
+
+
+0.7 -- 2012-08-06
+-------------------
+
+- hook: work around insanely huge value in obsolete pushkey call
+- pushkey: properly handle abort during obsolete markers push
+- amend: wrap the whole process in a single transaction.
+- evolve: tweak and add EOL to kill warning
+- obsolete: fix doc, rebase no longer aborts with --keep
+- obsolete/evolve: fix grammar in prerequisite messages
+- evolve: avoid duplication in graft wrapper
+- evolve: graft --continue is optional, test
+
+0.6 -- 2012-07-31
+-------------------
+
+- obsolete: change warning output to match mercurial core on
+- qsync: ignore nonexistent nodes
+- make compat server both compatible with "dump" and "dump%i" version
+
+0.5 -- 2012-07-16
+-------------------
+
+- obsolete: Detect conflicting changeset!
+- obsolete: adapt to core: marker are written in transaction now
+- evolve: add the solve alias to obsolete
+- doc: big update of terms and summary of the concept
+- evolve: switch the official name for "kill" to prune
+
+
+0.4.1 -- 2012-07-10
+-------------------
+
+- [convert] properly exclude null successors from conversion
+- Ignore buggy marker in newerversion
+
+
+0.4.0 -- 2012-07-06
+-------------------
+
+- obsolete: public changeset are no longer latecomer.
+- obsolete: move to official binary format
+- adapt for new mercurial
+- obsolete: we are not compatible with 2.1 any more
+
+0.3.0 -- 2012-06-27
+-------------------
+
+- obsolete:  Add "latecomer" error detection (stabilize does not handle resolution yet)
+- evolve:    Introduce a new `uncommit` command to remove change from a changeset
+- rebase:    allow the use of --keep again
+- commit:    --amend option create obsolete marker (but still strip)
+- obsolete:  fewer marker are created when collapsing revision.
+- revset:    add, successors(), allsuccessors(), precursors(), allprecursors(),
+             latecomer() and hidden()
+- evolve:    add `prune` alias to `kill`.
+- stabilize: clearly state that stabilize does not handle conflict
+- template:  add an {obsolete} keyword
+
+0.2.0 -- 2012-06-20
+-------------------
+
+- stabilize: improve choice of the next changeset to stabilize
+- stabilize: improve resolution of several corner case
+- rebase:    handle removing empty changesets
+- rebase:    handle --collapse
+- evolve:   add `obsolete` alias to `kill`
+- evolve:   add `evolve` alias to `stabilize`
--- a/MANIFEST.in	Wed Sep 27 01:22:58 2017 +0200
+++ b/MANIFEST.in	Fri Oct 20 18:44:52 2017 +0200
@@ -18,9 +18,10 @@
 include hgext3rd/__init__.py
 include hgext3rd/evolve/*.py
 include hgext3rd/topic/*.py
+include hgext3rd/topic/README
 include MANIFEST.in
 include README
-include README-topic
+include CHANGELOG
 include setup.py
 include tests/*.py
 include tests/*.sh
--- a/README	Wed Sep 27 01:22:58 2017 +0200
+++ b/README	Fri Oct 20 18:44:52 2017 +0200
@@ -117,600 +117,3 @@
 In addition, we have compatibility branches to check tests on older version of
 Mercurial. They are the "mercurial-x.y" branches. They are used to apply
 expected test change only, no code change should happen there.
-
-Changelog
-=========
-
-6.7.0 - in progress
--------------------
-
-  * documentation: improvement to content, wording and graphs,
-  * compatibility with change in future 4.4 at this release date,
-  * obslog/log: improve verb used to describe and evolution,
-  * obslog: improved templatability
-  * pstatus/pdiff: update to full command. They now appears in the help.
-  * uncommit: add a --interactive option.
-
-  * stack: improve display of interleaved topic
-  * stack: improve display of merge commit
-  * topic: gain a --current flag
-  * topic: add a new 'debugconvertbookmark' commands.
-    It helps migrating from bookmark feature branch to topic feature branch.
-  * topic: small clarification and cleanup on various output
-  * push: add a --topic option to mirror --bookmark and --branch.
-  * topic: be more informative about topic activation and deactivation
-  * topic: --age flag also shows the user who last touched the topic
-
-6.6.0 -- 2017-07-25
--------------------
-
-  - amend: add a --extract flag to move change back to the working copy,
-    (same as uncommit, but accessible through the amend commit)
-  - split: now properly refuse to split public changeset,
-  - commands: unify and improve the pre-rewrite validation and error message,
-  - uncommit: add support for --current-date and --current-user option,
-  - fold: add support for --current-date and --current-user option,
-  - metaedit: add support for --current-date and --current-user option,
-  - split: add support for --current-date and --current-user option,
-  - compat: use various new API instead of the one deprecated in 4.3,
-    (when available)
-  - documentation: various minor documentation update.
-
-topic (0.2.0):
-
-  - topic: add --age option to sort topic by the most recently touched,
-  - topic: add a 't0' to access the root of a topic while keeping it active,
-  - topic: allow 'hg prev' to me move to 't0',
-  - topic: add a config option to enforce topic on new commit,
-    (experimental.enforce-topic)
-  - topic: make command names valid as expected, even if ui.strict=true.
-
-6.5.0 -- 2017-07-02
--------------------
-
-features:
-
- - obslog: gain a --patch flag to display changes introduced by the evolution
-  (Currently limited to in simple case only)
- - log: display obsolescence fate by default, (future 4.3 only)
- - doc: various minor improvement.
-
-bugfixes:
-
- - evolve: fix branch preservation for merge,
- - obsfate: improve support for advanced template reformating,
- - split: preserve author of the splitted changeset.
- - grab: properly fix hg executable on windows.
-
-topic (0.1.0):
-
- - stack: also show the unstable status for the current changeset, (issue5553)
- - stack: properly abort when and unknown topic is requested,
- - stack: add basic and raw support for named branches,
- - topic: changing topic on revs no longer adds extra instability, (issue5441)
- - topic: topics: rename '--change' flag to '--rev' flag,
- - topic: multiple large performance improvements,
- - topic: various small output improvement,
- - topic: improved topic preservation for various commands.
-
-
-6.4.0 -- 2017-06-16
--------------------
-
- - template: signifiant improvement to the '{obsfate}' template (now 4.2+ only)
- - template: fix 'successors' and 'precursors' template to expose hex-node
- - effect flag: the experiment is now active by default,
-   (see 'hg help -e evolve' to opt out)
- - effect flag: fix a small bug related to hidden changeset,
- - obscache: reduce impact on large repository
- - obshashrange: install a '.max-revs' option see extension help for details
-
-6.3.1 -- 2017-06-01
--------------------
-
- - also backport the "revelant-markers" fix when using "evolve.serveronly"
-
-6.3.0 -- 2017-05-31
--------------------
-
- - olog: add an 'obslog' alias
- - olog: add an '--all' option to show the whole obsolescence history tree.
- - evolution: add an experiment to track the effect of rewrites.
-   (See hg help - evolve for details)
- - exchange: fix the "relevant-markers" algorithm to include inline prune.
-   This will impact discovery of obsmarkers between server and client if one
-   still uses the old algorithm. Please upgrade both clients and servers as
-   soon as possible.
-   (See changeset 176d1a0ce385 in core Mercurial for details)
- - obsdiscovery: add a config flag to disable all obsmarkers discovery
-   (See hg help - evolve for details)
- - template: add a 'precursors' template that display the closests precursors of changesets
- - template: add a 'successors' template that display the closests successors of changesets
- - template: add a 'obsfate' template that display how a changeset has evolved
- - new discovery experiment: add options to restrict memory consumption on
-   large repository (see "hg help -e evolve" for details).
- - evolve: fix --rev handling in --list mode
-
-6.2.1 -- 2017-05-23
--------------------
-
- - prune: fix a crash related to color handling,
- - next: fix a crash related to color handling,
- - discovery: document the 'obshashrange' experiment,
- - cache: reduce the warming load in case of reset,
- - cache: add a 'experimental.obshashcache.warm-cache' option to allow
-   disabling post transaction cache warming.
-
-6.2.0 -- 2017-05-18
--------------------
-
- - olog: a new command to inspect the obs-history of a changeset (hg-4.0 + only),
- - topic: have thg display topic name if possible,
- - blackbox: log more information about discovery and cache computation,
- - obscache: more efficient update in the (rare) case of a transaction adding
-   markers without changesets,
- - obscache: fix more cache invalidation propagation,
- - obscache: also enable the new cache (from 6.1.0) for 'evolve.server-only',
- - obshashrange-cache: update incrementally in the (common) case of a
-   transaction not affecting existing range,
- - obshashrange-cache: keep the cache warm after each transaction,
- - topic: now requires Mercurial 4.0 or above,
- - stack: now display if current revision is in bad state (issue5533),
- - stack: fix json output to be valid json.
-
-6.1.0 -- 2017-05-03
--------------------
-
- - improve message about obsolete working copy parent,
- - improve message issued  when accessing hidden nodes (4.2 only),
- - introduce a new caches to reduce the impact of evolution on read-only commands,
- - add a 'experimental.auto-publish' config. See `hg help -e evolve` for details.
- - fix the propagation of some some cache invalidation,
-
-6.0.1 -- 2017-04-20
--------------------
-
- - template: adapt to change in 4.2,
- - fix 'debugrecordpruneparents' (outdated API usage)
- - checkheads: give priority to updated 4.2 code,
- - serveronly: fix repository initialization.
-
-6.0.0 -- 2017-03-31
--------------------
-
-- push: improved detection of obsoleted remote branch (issue4354),
-- drop compatibility for Mercurial < 3.8,
-- removed old (unpackaged) pushexperiment extension,
-- move all extensions in the official 'hgext3rd' namespace package,
-- add the "topic" experimental extensions. See the README.topic file for details
-- officially ship 'evolve.serveronly' extensions. That extensions contains
-  only the part related to exchange and is intended to be used by server.
-
-  Using the extension will enable evolution, use 'experimental.evolution=!'
-  to disable obsmarkers echange.  The old '__temporary__.advertiseobsolete'
-  option is no longer supported.
-
-- a new prototype of obsmarker discovery is available. The prototype is still
-  at early stage and not recommended for production.
-  Examples of current limitations:
-
-  - write access to the repo is highly recommanded for all operation,
-  - large memory footprint,
-  - initial caching is slow,
-  - unusable on large repo (because of various issue pointed earlier),
-  - likely to constains various bugs.
-
-  It can be tested by setting `experimental.obshashrange=1` on both client and
-  server. It is recommanded to get in touch with the evolve maintainer if you
-  decide to test it.
-
-- the 'debugrecordpruneparents' have been moved into the 'evolve.legacy'
-  separate extension. enable that extentions if you need to convert/update
-  markers in an old repository.
-
-5.6.1 -- 2017-02-28
--------------------
-
-- fix a crash that sometime happened when evolving merges.
-
-5.6.0 -- 2017-02-01
--------------------
-
-- compatibility with Mercurial 4.1.
-- improvement of prune error message.
-- fold: require --from flag for folding revisions to working copy
-- fix crash when trying to fold an empty revision set (issue5453)
-- uncommit: preserve copy information of remaining files (issue5403)
-
-5.5.0 -- 2016-10-30
--------------------
-
-- The {obsolete} template now yield "obsolete" or "".
-- compatibility with Mercurial 4.0
-- Fix erroneous manifest computation when solving 'bumped' changeset.
-- split: avoid crash on empty commit (issue5191),
-- next: improve locking to avoid issue with working copy parent (issue5244)
-- prev: improve locking to avoid issue with working copy parent (issue5244)
-- evolve: fix abort suggestion to include '.' in 'hg update -C .'
-
-5.4.1 -- 2016-08-01
--------------------
-
- - compat with Mercurial 3.9
-
-5.4.0 -- 2016-05-06
--------------------
-
-- Some collaboration with the topic experimental extensions,
-  - hg evolve --all with consider all troubles in your current topic,
-  - preserve 'topic' during evolve,
-  - 'next' and 'prev' restrict themself to the current topic by default,
-- remove the dangerous 'kill' alias for 'prune' (because 'hg kill -1' without
-  the leading 'hg' will give you an hardtime)
-- during 'hg evolve' skip unsupported merge instead of aborting
-- various documentation fix and update
-- hg summary now suggest 'hg evolve --continue when appropriate`
-- compatibility with Mercurial 3.8 'hgext' namespace package.
-- small improvement to the `hg split` instruction
-- add a 'metaedit' command to rewrite changeset meta data.
-
-5.3.0 -- 2016-02-11
--------------------
-
-- split: add a new command to split changesets,
-- tests: drop our copy of 'run-tests.py' use core one instead,
-- bookmark: do all bookmark movement within a transaction.
-- evolve: compatibility with Mercurial 3.7
-- evolve: support merge with a single obsolete parent (hg-3.7+ only)
-- evolve: prevent added file to be marked as unknown if evolve fails (issue4966)
-- evolve: stop relying on graftstate file for save evolve state
-          (for `hg evolve --continue`)
-- evolve: fix divergence resolution when it result in an empty commit
-          (issue4950) (hg-3.5+ only)
-- no longer lock the repository for `hg parents` (issue4895)
-- updated help for the `evolve` command
-
-5.2.1 -- 2015-11-02
--------------------
-
-- add compatibility with Mercurial 3.6
-- prune: fixed possible issue with lock and bookmark
-- next/prev: fixed possible issue with lock and bookmark
-- add some progress data during changesets discovery
-- take advantage of dirstate/transaction collaboration
-
-5.2.0 -- 2015-06-25
--------------------
-
-- evolve: gain a --rev option to control what revisions to evolve (issue4391)
-- evolve: revision are processed in the order they stack on destination
-- evolve: properly skip unstable revision with non-evolved unstable parent
-- evolve: gain --unstable --divergent --bumped flag to select the trouble
-- evolve: issue more useful error message and hint when evolve has nothing to
-          do as invocated.
-- evolve: bare `hg evolve` commands now abort when multiple changesets could be
-          a target.
-- evolve: `hg evolve --all` only evolve changeset that will end up as
-          descendant of the current working copy. The old behavior of `--all`
-          in now in `--all --any`.
-- evolve: add a 'experimental.evolutioncommands' for fine grained commands
-          enabling
-- next/prev: requires `--merge` to move with uncommitted changes
-- next: significantly reword error messages
-- next: add a --evolve flag to evolve aspiring children when on a head
-
-5.1.5 -- 2015-06-23
--------------------
-
-- minor documentation cleanup
-- support -i option for `hg amend` if commit supports it (3.4)
-- fix the `debugrecordpruneparents` utility
-- fix some possible crash during command abort (release nonexistent transaction)
-- fix simple4server bug tracker URL
-- compatibility with bookmark API change in future Mercurial 3.5
-- prune no longer move the active bookmark for no reason (issue4559)
-- evolve: stop reporting divergence base as missing when we actually have it
-- significant performance improvement for all revsets.
-- provide a hint of how to update to the successor of an obsolete working copy
-  parent.
-
-5.1.4 -- 2015-04-23
--------------------
-
-- significant documentation update
-- fix issue4616: pulling with bundle2 would crash if common marker when
-  discovered on non-served changesets.
-- fix the debugobsrelsethashtree command
-
-5.1.3 -- 2015-04-20
--------------------
-
-- discovery: fix misbehaving discovery across python version
-- pull: properly install the bundle2 par generator
-  (avoid sending all markers for each pull)
-- commit: avoid potential deadlock (acquires wlock before lock)
-- graft: avoid potential deadlock (acquires wlock before lock)
-
-5.1.2 -- 2015-04-01
--------------------
-
-- evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
-
-5.1.1 -- 2015-03-05
--------------------
-
-- debugobsconvert: fix invalid markers during conversion
-- discovery: cache some of the obs hash computation to improve performance (issue4518)
-- revset: fix some crash with (issue4515)
-
-5.1 -- 2015-01-30
--------------------
-
-- evolve: explicitly disable bookmark on evolve (issue4432)
-- evolve: don't abort Mercurial on version mismatch
-- compatibility with mercurial 3.3
-
-5.0.2 -- 2014-12-14
--------------------
-
-- evolve: remove dependency to the rebase extension
-
-5.0.1 -- 2014-11-25
--------------------
-
-- amend: fix --logfile argument
-- evolve: preserve branch change when evolving
-- evolve: fix potential crash while solving `bumped` changesets.
-- uncommit: abort when rev specifies the current changeset
-- evolve: various message improvement
-- evolve: fix selection of changeset to evolve from the middle of a stack (issue4434)
-- evolve: make next/prev only move bookmarks optionally
-- evolve: tell user which "base of divergent changeset" is not found
-
-5.0.0 -- 2014-10-22
--------------------
-
-- drop compat with Mercurial pre 3.2
-- uncommit: add a --rev argument
-- evolve: add a `working directory now at xxxxxxxxxx` message
-- evolve: automatically translate obsolete hashes when evolving
-- properly skip marker creating if patch apply cleanly
-- prune: work around a massive slowdown from lazy revset
-- grab: "fix" the grab alias on window
-
-- fix an issue where prune performance were quadratic with the number of
-  changesets pruned.
-- pull: use discovery to pull less obsmarkers through bundle2
-
-
-4.1.0 -- 2014-08-08
--------------------
-
-- amend: add -D/--current-date option
-- amend: add -U/--current-user option
-- evolve: add a --tool option
-- evolve: add a --confirm option
-- mark "commit -o", "graft -o" and "graft -O" as deprecated since they are
-  unlikely to eventually make it into core.
-- push obsmarkers and phases in the same transaction than changesets
-  (when using hg >= 3.1 and bundle2-exp is enabled)
-- hide message about the obsolescence marker exchange behind a
-  `experimental.verbose-obsolescence-exchange` variable (default to False).
-
-4.0.1 -- 2014-08-08
--------------------
-
-- createmarkers() accept an iterable (for compat with other extension)
-
-4.0.0 -- 2014-06-03
--------------------
-
-- require Mercurial version 3.0.1 or above
-- some compatibility fixes with future 3.1.0
-- deprecated `gup` and `gdown` in favor of prev and next
-- record parent of pruned parent at prune time
-- added a `debugobsstorestat` command to gather data on obsmarker content.
-- added a `debugrecordpruneparents` command to upgrade existing prune marker
-  with parent information. Please run it once per repo after upgrading.
-- improvement to obsolescence marker exchange:
-  - added progress when pushing obsmarkers
-  - added multiple output during obsolescence markers exchange
-  - only push markers relevant to pushed subset
-  - add a new experimental way to exchange marker (when server support):
-
-    - added progress when pulling obsmarkers
-    - only pull markers relevant to pulled subset
-    - avoid exchanging common markers in some case
-    - use bundle2 as transport when available.
-
- - add a hook related to the new commands
-
-3.3.2 -- 2014-05-14
--------------------
-
-- fix a bug where evolve were creating changeset with 2 parents on windows
-  (fix issues #16, #35 and #42)
-- adds a --obsolete flag to import (requires Mercurial 3.0)
-- prune: update to successor rather than parent when pruning '.' with -s
-- fold: add missing --message and --logfile option
-- fold: add squash as an alias
-
-3.3.1 -- 2014-04-23
--------------------
-
-- various language fix
-- active bookmark now move when using prev/next (#37)
-- fix some preservation of rename information on evolve (#33)
-- abort when evolve tries to move a node on top of itself (will helps on the #35 front)
-- fold: enable --date and --user options
-
-3.3.0 -- 2014-03-04
--------------------
-
-- raise Mercurial's minimal requirement to 2.7
-- drop `latercomer` and `conflicting` compatibility. Those old alias are
-  deprecated for a long time now.
-- add verbose hint about how to handle corner case by hand.
-  This should help people until evolve is able to to it itself.
-- removed the qsync extension. The only user I knew about (logilab) is not
-  using it anymore. It not compatible with coming Mercurial version 2.9.
-- add progress indicator for long evolve command
-- report troubles creation from `hg import`
-
-3.2.0 -- 2013-11-15
--------------------
-
-- conform to the Mercurial custom of lowercase messages
-- added a small extension to experiment with obsolescence marker push
-- amend: drop the deprecated note option
-- amend: use core mechanism for amend (fix multiple bugs)
-- parents command: add "working directory parent is obsolete" message
-- evolve command: allow updating to the successor if the parent is
-  obsolete
-- gdown and gup commands: add next and previous alias, respectively
-- make grab aliases compatible with Mercurial 2.8
-- Tested with 2.6, 2.7 and 2.8
-
-3.1.0 -- 2013-02-11
--------------------
-
-- amend: drop deprecated --change option for amend
-- alias: add a grab alias to be used instead of graft -O
-- touch: add a --duplicate option to *not* obsolete the old version
-- touch: fix touching multiple revision at the same time
-- evolve: add a --all option
-- prune: various minor improvements
-- prune: add option to prune a specific bookmark
-- prune: add -u and -d option to control metadata
-
-3.0.0 -- 2013-02-02
--------------------
-
-- compatibility with 2.5
-
-2.2.0 --
--------------------
-
-- make evolve smarter at picking next troubled to solved without --any
-
-2.1.0 -- 2012-12-03
--------------------
-
-- qsync fixes
-- have qfold ask for commit message
-
-2.0.0 -- 2012-10-26
--------------------
-
-- compat with mercurial 2.4
-
-1.1.0 -- 2012-10-26
--------------------
-
-- fix troubles creation reporting from rebase
-- rename latecomer to bumped
-- renamed conflicting to divergent
-- smarter divergent handling
-
-1.0.2 -- 2012-09-19
--------------------
-
-- fix hg fold bug
-- fix hg pull --rebase
-- fix detection of conflict with external tools
-- adapt to core movement (caches and --amend)
-
-1.0.1 -- 2012-08-31
--------------------
-
-- documentation improvement
-- fix a performance bug with hgweb
-
-1.0 -- 2012-08-29
--------------------
-
-- Align with Mercurial version 2.3 (drop 2.2 support).
-- stabilize handle killed parent
-- stabilize handle late comer
-- stabilize handle conflicting
-- stabilize get a --continue switch
-- merge and update ignore extinct changeset in most case.
-- new "troubled()" revset
-- summary now reports troubles changesets
-- new touch command
-- new fold command
-- new basic olog alias
-
-- rebase refuse to work on public changeset again
-- rebase explicitly state that there is nothing to rebase because everything is
-  extinct() when that happen.
-- amend now cleanly abort when --change switch is misused
-
-
-0.7 -- 2012-08-06
--------------------
-
-- hook: work around insanely huge value in obsolete pushkey call
-- pushkey: properly handle abort during obsolete markers push
-- amend: wrap the whole process in a single transaction.
-- evolve: tweak and add EOL to kill warning
-- obsolete: fix doc, rebase no longer aborts with --keep
-- obsolete/evolve: fix grammar in prerequisite messages
-- evolve: avoid duplication in graft wrapper
-- evolve: graft --continue is optional, test
-
-0.6 -- 2012-07-31
--------------------
-
-- obsolete: change warning output to match mercurial core on
-- qsync: ignore nonexistent nodes
-- make compat server both compatible with "dump" and "dump%i" version
-
-0.5 -- 2012-07-16
--------------------
-
-- obsolete: Detect conflicting changeset!
-- obsolete: adapt to core: marker are written in transaction now
-- evolve: add the solve alias to obsolete
-- doc: big update of terms and summary of the concept
-- evolve: switch the official name for "kill" to prune
-
-
-0.4.1 -- 2012-07-10
--------------------
-
-- [convert] properly exclude null successors from conversion
-- Ignore buggy marker in newerversion
-
-
-0.4.0 -- 2012-07-06
--------------------
-
-- obsolete: public changeset are no longer latecomer.
-- obsolete: move to official binary format
-- adapt for new mercurial
-- obsolete: we are not compatible with 2.1 any more
-
-0.3.0 -- 2012-06-27
--------------------
-
-- obsolete:  Add "latecomer" error detection (stabilize does not handle resolution yet)
-- evolve:    Introduce a new `uncommit` command to remove change from a changeset
-- rebase:    allow the use of --keep again
-- commit:    --amend option create obsolete marker (but still strip)
-- obsolete:  fewer marker are created when collapsing revision.
-- revset:    add, successors(), allsuccessors(), precursors(), allprecursors(),
-             latecomer() and hidden()
-- evolve:    add `prune` alias to `kill`.
-- stabilize: clearly state that stabilize does not handle conflict
-- template:  add an {obsolete} keyword
-
-0.2.0 -- 2012-06-20
--------------------
-
-- stabilize: improve choice of the next changeset to stabilize
-- stabilize: improve resolution of several corner case
-- rebase:    handle removing empty changesets
-- rebase:    handle --collapse
-- evolve:   add `obsolete` alias to `kill`
-- evolve:   add `evolve` alias to `stabilize`
--- a/README-topic	Wed Sep 27 01:22:58 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-Topic Extension
-================
-
-This packages also provides the ``topic`` experiment in an independent
-extension. It implements a new experimental concept to provide lightweight
-feature branches for the mutable parts of the history. The experiments is still
-at an early stage and have significant usability and performance issues when
-enabled.
-
-How to Install
-==============
-
-The ``topic`` extension is included into the ``evolve` package, so the same instruction apply.
-
-Using Pip
----------
-
-You can install the latest version using pip::
-
-    $ pip install --user hg-evolve
-
-Then just enable it in you hgrc::
-
-    $ hg config --edit # adds the two line below:
-    [extensions]
-    topic =
-
-From Source
------------
-
-To install a local version from source::
-
-    $ hg clone https://www.mercurial-scm.org/repo/evolve/
-    $ cd evolve
-    $ make install-home
-
-Enable
-------
-
-The topic extensions is included in the evolve package. See the install instruction for evolve.
-
-Then enable it in you configuration::
-
-    $ hg config --edit # adds the two line below:
-    [extensions]
-    topic =
-
-Documentation
--------------
-
-* See 'hg help -e topic' for a generic help.
-* See 'hg help topics' and 'hg help stack' for help on specific commands.
-* See the 'tests/test-topic-tutorial.t' file for a quick tutorial.
--- a/debian/changelog	Wed Sep 27 01:22:58 2017 +0200
+++ b/debian/changelog	Fri Oct 20 18:44:52 2017 +0200
@@ -1,3 +1,15 @@
+mercurial-evolve (6.7.1-1) unstable; urgency=medium
+ 
+   * new upstream release
+ 
+ -- Pierre-Yves David <pierre-yves.david@ens-lyon.org>  Tue, 10 Oct 2017 16:03:23 +0200
+
+mercurial-evolve (6.7.0-1) unstable; urgency=medium
+
+  * new upstream release
+
+ -- Pierre-Yves David <pierre-yves.david@ens-lyon.org>  Wed, 27 Sep 2017 16:17:40 +0200
+
 mercurial-evolve (6.6.0-1) unstable; urgency=medium
 
   * new upstream release
--- a/hgext3rd/evolve/__init__.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/__init__.py	Fri Oct 20 18:44:52 2017 +0200
@@ -374,6 +374,16 @@
 extsetup = eh.final_extsetup
 reposetup = eh.final_reposetup
 cmdtable = eh.cmdtable
+configtable = eh.configtable
+
+# Configuration
+eh.configitem('experimental', 'evolutioncommands')
+eh.configitem('experimental', 'evolution.allnewcommands')
+eh.configitem('experimental', 'prunestrip')
+
+# hack around because we need an actual default there
+if configtable:
+    configtable['experimental']['evolution.allnewcommands'].default = None
 
 # pre hg 4.0 compat
 
@@ -418,7 +428,7 @@
     # This must be in the same function as the option configuration above to
     # guarantee it happens after the above configuration, but before the
     # extsetup functions.
-    evolvecommands = ui.configlist('experimental', 'evolutioncommands')
+    evolvecommands = ui.configlist('experimental', 'evolutioncommands', [])
     evolveopts = ui.configlist('experimental', 'evolution')
     if evolveopts and (commandopt not in evolveopts and
                        'all' not in evolveopts):
@@ -492,11 +502,11 @@
 
 @eh.uisetup
 def _installalias(ui):
-    if ui.config('alias', 'odiff', None) is None:
+    if ui.config('alias', 'odiff') is None:
         ui.setconfig('alias', 'odiff',
                      "diff --hidden --rev 'limit(precursors(.),1)' --rev .",
                      'evolve')
-    if ui.config('alias', 'grab', None) is None:
+    if ui.config('alias', 'grab') is None:
         if os.name == 'nt':
             hgexe = ('"%s"' % util.hgexecutable())
             ui.setconfig('alias', 'grab', "! " + hgexe
@@ -924,7 +934,7 @@
             repo.setparents(repo['.'].node(), nullid)
             repo.dirstate.write(tr)
             # fix up dirstate for copies and renames
-            copies.duplicatecopies(repo, dest.rev(), orig.p1().rev())
+            compat.duplicatecopies(repo, repo[None], dest.rev(), orig.p1().rev())
 
         class LocalMergeFailure(MergeFailure, exc.__class__):
             pass
@@ -1523,6 +1533,7 @@
     troublecategories = ['phasedivergent', 'contentdivergent', 'orphan']
     specifiedcategories = [t for t in troublecategories if opts[t]]
     if listopt:
+        compat.startpager(ui, 'evolve')
         listtroubles(ui, repo, specifiedcategories, **opts)
         return
 
@@ -2246,7 +2257,7 @@
                            "backup bundle")),
     ])
 def stripwrapper(orig, ui, repo, *revs, **kwargs):
-    if (not ui.configbool('experimental', 'prunestrip') or
+    if (not ui.configbool('experimental', 'prunestrip', False) or
         kwargs.get('bundle', False)):
         return orig(ui, repo, *revs, **kwargs)
 
--- a/hgext3rd/evolve/compat.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/compat.py	Fri Oct 20 18:44:52 2017 +0200
@@ -7,6 +7,7 @@
 """
 
 from mercurial import (
+    copies,
     context,
     hg,
     obsolete,
@@ -172,3 +173,17 @@
 
 if not util.safehasattr(obsolete, '_computephasedivergentset'):
     obsolete._computephasedivergentset = obsolete.cachefor('phasedivergent')(obsolete._computebumpedset)
+
+def startpager(ui, cmd):
+    """function to start a pager in case ui.pager() exists"""
+    if util.safehasattr(ui, 'pager'):
+        ui.pager(cmd)
+
+def duplicatecopies(repo, wctx, rev, fromrev, skiprev=None):
+    # cannot use anything else until 4.3 support is dropped.
+    assert wctx.rev() is None
+    if copies.duplicatecopies.__code__.co_argcount < 5:
+        # pre 4.4 duplicatecopies compat
+        copies.duplicatecopies(repo, rev, fromrev, skiprev=skiprev)
+    else:
+        copies.duplicatecopies(repo, wctx, rev, fromrev, skiprev=skiprev)
--- a/hgext3rd/evolve/exthelper.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/exthelper.py	Fri Oct 20 18:44:52 2017 +0200
@@ -17,6 +17,13 @@
     from mercurial import cmdutil
     command = cmdutil.command
 
+configitem = None
+dynamicdefault = None
+if util.safehasattr(registrar, 'configitem'):
+    configitem = registrar.configitem
+    from mercurial import configitems
+    dynamicdefault = configitems.dynamicdefault
+
 class exthelper(object):
     """Helper for modular extension setup
 
@@ -39,6 +46,22 @@
         self.cmdtable = {}
         self.command = command(self.cmdtable)
 
+        self.configtable = {}
+        self._configitem = None
+        if configitem is not None:
+            self._configitem = configitem(self.configtable)
+
+    def configitem(self, section, config):
+        """For Mercurial 4.4 and above, register a config item
+
+        For now constraint to 'dynamicdefault' until we only support version with the feature.
+        Older version would otherwise not use the declare default.
+
+        For older version no-op fallback for old Mercurial versions
+        """
+        if self._configitem is not None:
+            self._configitem(section, config, default=dynamicdefault)
+
     def merge(self, other):
         self._uicallables.extend(other._uicallables)
         self._extcallables.extend(other._extcallables)
@@ -50,6 +73,11 @@
         self._functionwrappers.extend(other._functionwrappers)
         self._duckpunchers.extend(other._duckpunchers)
         self.cmdtable.update(other.cmdtable)
+        for section, items in other.configtable.iteritems():
+            if section in self.configtable:
+                self.configtable[section].update(items)
+            else:
+                self.configtable[section] = items
 
     def final_uisetup(self, ui):
         """Method to be used as the extension uisetup
--- a/hgext3rd/evolve/hack/directaccess.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/hack/directaccess.py	Fri Oct 20 18:44:52 2017 +0200
@@ -24,6 +24,14 @@
     from mercurial import cmdutil
     command = cmdutil.command(cmdtable)
 
+if util.safehasattr(registrar, 'configitem'):
+    configtable = {}
+    configitem = registrar.configitem(configtable)
+
+    configitem('directaccess', 'loadsafter',
+               default=[],
+    )
+
 # By default, all the commands have directaccess with warnings
 # List of commands that have no directaccess and directaccess with no warning
 directaccesslevel = [
--- a/hgext3rd/evolve/hack/inhibit.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/hack/inhibit.py	Fri Oct 20 18:44:52 2017 +0200
@@ -236,8 +236,11 @@
     repo._obsoletenotrebased = r.keys()
     return r
 
-def _clearrebased(orig, ui, repo, *args, **kwargs):
-    r = orig(ui, repo, *args, **kwargs)
+def _clearrebased(orig, ui, repo, dest, state, skipped, collapsedas=None,
+                  keepf=False, **kwargs):
+    r = orig(ui, repo, dest, state, skipped, collapsedas, keepf, **kwargs)
+    if keepf:
+        return r
     tonode = repo.changelog.node
     if util.safehasattr(repo, '_obsoletenotrebased'):
         _deinhibitmarkers(repo, [tonode(k) for k in repo._obsoletenotrebased])
--- a/hgext3rd/evolve/legacy.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/legacy.py	Fri Oct 20 18:44:52 2017 +0200
@@ -129,16 +129,16 @@
                     del oldmark['reason']  # unused until then
                     oldobject = str(oldmark.pop('object'))
                     oldsubjects = [str(s) for s in oldmark.pop('subjects', [])]
-                    LOOKUP_ERRORS = (error.RepoLookupError, error.LookupError)
+                    lookup_errors = (error.RepoLookupError, error.LookupError)
                     if len(oldobject) != 40:
                         try:
                             oldobject = repo[oldobject].node()
-                        except LOOKUP_ERRORS:
+                        except lookup_errors:
                             pass
                     if any(len(s) != 40 for s in oldsubjects):
                         try:
                             oldsubjects = [repo[s].node() for s in oldsubjects]
-                        except LOOKUP_ERRORS:
+                        except lookup_errors:
                             pass
 
                     oldmark['date'] = '%i %i' % tuple(oldmark['date'])
--- a/hgext3rd/evolve/metadata.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/metadata.py	Fri Oct 20 18:44:52 2017 +0200
@@ -5,7 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
-__version__ = '6.7.0.dev'
-testedwith = '3.8.4 3.9.2 4.0.2 4.1.3 4.2.2'
+__version__ = '6.8.0.dev'
+testedwith = '3.8.4 3.9.2 4.0.2 4.1.3 4.2.3 4.3.2'
 minimumhgversion = '3.8'
 buglink = 'https://bz.mercurial-scm.org/'
--- a/hgext3rd/evolve/obscache.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/obscache.py	Fri Oct 20 18:44:52 2017 +0200
@@ -111,9 +111,12 @@
 
     return obsstore
 
-if obsolete._readmarkers.__code__.co_argcount > 1:
+if obsolete._fm0readmarkers.__code__.co_argcount > 1:
     # hg-4.3+ has the "offset" parameter, and _fm?readmarkers also have an
     # extra "stop" parameter
+    # Note that _readmarkers is wrapped by @util.nogc, so its co_argcount is
+    # misleadingly 0. So we check _fm0readmarkers instead, which increased its
+    # argument count in the same changeset (5d3ba439).
     _readmarkers = obsolete._readmarkers
 else:
     # XXX copied as is from Mercurial 4.2 and added the "offset" parameters
--- a/hgext3rd/evolve/obsdiscovery.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/obsdiscovery.py	Fri Oct 20 18:44:52 2017 +0200
@@ -72,6 +72,13 @@
 eh.merge(stablerange.eh)
 obsexcmsg = utility.obsexcmsg
 
+# Config
+eh.configitem('experimental', 'evolution.obsdiscovery')
+eh.configitem('experimental', 'obshashrange')
+eh.configitem('experimental', 'obshashrange.warm-cache')
+eh.configitem('experimental', 'obshashrange.max-revs')
+eh.configitem('experimental', 'obshashrange.lru-size')
+
 ##################################
 ###  Code performing discovery ###
 ##################################
--- a/hgext3rd/evolve/obsexchange.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/obsexchange.py	Fri Oct 20 18:44:52 2017 +0200
@@ -44,6 +44,7 @@
 obsexcmsg = utility.obsexcmsg
 obsexcprg = utility.obsexcprg
 
+eh.configitem('experimental', 'verbose-obsolescence-exchange')
 
 _bestformat = max(obsolete.formats.keys())
 
--- a/hgext3rd/evolve/obshistory.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/obshistory.py	Fri Oct 20 18:44:52 2017 +0200
@@ -19,8 +19,15 @@
     obsolete,
     node as nodemod,
     scmutil,
+    util,
 )
 
+try:
+    from mercurial import obsutil
+    obsutil.marker
+except ImportError:
+    obsutil = None
+
 from mercurial.i18n import _
 
 from . import (
@@ -30,6 +37,18 @@
 
 eh = exthelper.exthelper()
 
+# Config
+efd = {'default': True} # pass a default value unless the config is registered
+
+@eh.extsetup
+def enableeffectflags(ui):
+    item = (getattr(ui, '_knownconfig', {})
+            .get('experimental', {})
+            .get('evolution.effect-flags'))
+    if item is not None:
+        item.default = True
+        efd.clear()
+
 @eh.command(
     'obslog|olog',
     [('G', 'graph', True, _("show the revision DAG")),
@@ -66,6 +85,7 @@
 
     Returns 0 on success.
     """
+    compat.startpager(ui, 'obslog')
     revs = list(revs) + opts['rev']
     if not revs:
         revs = ['.']
@@ -132,7 +152,7 @@
     succ = successors[0]
 
     if succ not in repo:
-        return False, "succ is unknown locally"
+        return False, "successor is unknown locally"
 
     # Check that both node and succ have the same parents
     nodep1, nodep2 = repo[node].p1(), repo[node].p2()
@@ -498,7 +518,7 @@
                 fm.plain("\n")
                 fm.plain(contentpatch)
         else:
-            patch = "    (No patch available yet, %s)" % _patchavailable[1]
+            patch = "    (No patch available, %s)" % _patchavailable[1]
             fm.plain("\n")
             # TODO: should be in json too
             fm.plain(patch)
@@ -616,46 +636,48 @@
             return False
     return True
 
-@eh.wrapfunction(obsolete, 'createmarkers')
-def createmarkerswithbits(orig, repo, relations, flag=0, date=None,
-                          metadata=None, **kwargs):
-    """compute 'effect-flag' and augment the created markers
+# Wrap pre Mercurial 4.4 createmarkers that didn't included effect-flag
+if not util.safehasattr(obsutil, 'geteffectflag'):
+    @eh.wrapfunction(obsolete, 'createmarkers')
+    def createmarkerswithbits(orig, repo, relations, flag=0, date=None,
+                              metadata=None, **kwargs):
+        """compute 'effect-flag' and augment the created markers
 
-    Wrap obsolete.createmarker in order to compute the effect of each
-    relationship and store them as flag in the metadata.
+        Wrap obsolete.createmarker in order to compute the effect of each
+        relationship and store them as flag in the metadata.
 
-    While we experiment, we store flag in a metadata field. This field is
-    "versionned" to easilly allow moving to other meaning for flags.
+        While we experiment, we store flag in a metadata field. This field is
+        "versionned" to easilly allow moving to other meaning for flags.
 
-    The comparison of description or other infos just before creating the obs
-    marker might induce overhead in some cases. However it is a good place to
-    start since it automatically makes all markers creation recording more
-    meaningful data. In the future, we can introduce way for commands to
-    provide precomputed effect to avoid the overhead.
-    """
-    if not repo.ui.configbool('experimental', 'evolution.effect-flags', True):
-        return orig(repo, relations, flag, date, metadata, **kwargs)
-    if metadata is None:
-        metadata = {}
-    tr = repo.transaction('add-obsolescence-marker')
-    try:
-        for r in relations:
-            # Compute the effect flag for each obsmarker
-            effect = geteffectflag(r)
+        The comparison of description or other infos just before creating the obs
+        marker might induce overhead in some cases. However it is a good place to
+        start since it automatically makes all markers creation recording more
+        meaningful data. In the future, we can introduce way for commands to
+        provide precomputed effect to avoid the overhead.
+        """
+        if not repo.ui.configbool('experimental', 'evolution.effect-flags', **efd):
+            return orig(repo, relations, flag, date, metadata, **kwargs)
+        if metadata is None:
+            metadata = {}
+        tr = repo.transaction('add-obsolescence-marker')
+        try:
+            for r in relations:
+                # Compute the effect flag for each obsmarker
+                effect = geteffectflag(r)
 
-            # Copy the metadata in order to add them, we copy because the
-            # effect flag might be different per relation
-            m = metadata.copy()
-            # we store the effect even if "0". This disctinct markers created
-            # without the feature with markers recording a no-op.
-            m['ef1'] = "%d" % effect
+                # Copy the metadata in order to add them, we copy because the
+                # effect flag might be different per relation
+                m = metadata.copy()
+                # we store the effect even if "0". This disctinct markers created
+                # without the feature with markers recording a no-op.
+                m['ef1'] = "%d" % effect
 
-            # And call obsolete.createmarkers for creating the obsmarker for real
-            orig(repo, [r], flag, date, m, **kwargs)
+                # And call obsolete.createmarkers for creating the obsmarker for real
+                orig(repo, [r], flag, date, m, **kwargs)
 
-        tr.close()
-    finally:
-        tr.release()
+            tr.close()
+        finally:
+            tr.release()
 
 def _getobsfate(successorssets):
     """ Compute a changeset obsolescence fate based on his successorssets.
@@ -765,6 +787,41 @@
         verb = 'split'
     return {'verb': verb}
 
+# Hijack callers of successorsetverb
+if util.safehasattr(obsutil, 'obsfateprinter'):
+
+    @eh.wrapfunction(obsutil, 'obsfateprinter')
+    def obsfateprinter(orig, successors, markers, ui):
+
+        def closure(successors):
+            return _successorsetverb(successors, markers)['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
+
+# XXX temporary disable operation to clarify tests changes
+if util.safehasattr(obsutil, 'markersoperations'):
+
+    @eh.wrapfunction(obsutil, 'markersoperations')
+    def markersoperations(orig, *args, **kwargs):
+        return []
+
 FORMATSSETSFUNCTIONS = [
     _successorsetdates,
     _successorsetusers,
--- a/hgext3rd/evolve/safeguard.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/safeguard.py	Fri Oct 20 18:44:52 2017 +0200
@@ -16,6 +16,8 @@
 
 eh = exthelper.exthelper()
 
+eh.configitem('experimental', 'auto-publish')
+
 @eh.reposetup
 def setuppublishprevention(ui, repo):
 
--- a/hgext3rd/evolve/serveronly.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/serveronly.py	Fri Oct 20 18:44:52 2017 +0200
@@ -47,6 +47,7 @@
 extsetup = eh.final_extsetup
 reposetup = eh.final_reposetup
 cmdtable = eh.cmdtable
+configtable = eh.configtable
 
 @eh.reposetup
 def default2evolution(ui, repo):
--- a/hgext3rd/evolve/templatekw.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/evolve/templatekw.py	Fri Oct 20 18:44:52 2017 +0200
@@ -47,69 +47,78 @@
         return templatekw.showlist('trouble', ctx.instabilities(), plural='troubles',
                                    **args)
 
-def closestprecursors(repo, nodeid):
-    """ Yield the list of next precursors pointing on visible changectx nodes
-    """
-
-    precursors = repo.obsstore.predecessors
-    stack = [nodeid]
+if util.safehasattr(templatekw, 'showpredecessors'):
+    eh.templatekw("precursors")(templatekw.showpredecessors)
+else:
+    # for version <= hg4.3
+    def closestprecursors(repo, nodeid):
+        """ Yield the list of next precursors pointing on visible changectx nodes
+        """
 
-    while stack:
-        current = stack.pop()
-        currentpreccs = precursors.get(current, ())
+        precursors = repo.obsstore.predecessors
+        stack = [nodeid]
 
-        for prec in currentpreccs:
-            precnodeid = prec[0]
+        while stack:
+            current = stack.pop()
+            currentpreccs = precursors.get(current, ())
+
+            for prec in currentpreccs:
+                precnodeid = prec[0]
 
-            if precnodeid in repo:
-                yield precnodeid
-            else:
-                stack.append(precnodeid)
+                if precnodeid in repo:
+                    yield precnodeid
+                else:
+                    stack.append(precnodeid)
 
-@eh.templatekw("precursors")
-def shownextvisibleprecursors(repo, ctx, **args):
-    """Returns a string containing the list of the closest precursors
-    """
-    precursors = sorted(closestprecursors(repo, ctx.node()))
-    precursors = [node.hex(p) for p in precursors]
+    @eh.templatekw("precursors")
+    def shownextvisibleprecursors(repo, ctx, **args):
+        """Returns a string containing the list of the closest precursors
+        """
+        precursors = sorted(closestprecursors(repo, ctx.node()))
+        precursors = [node.hex(p) for p in precursors]
 
-    # <= hg-4.1 requires an explicite gen.
-    # we can use None once the support is dropped
-    #
-    # They also requires an iterator instead of an iterable.
-    gen = iter(" ".join(p[:12] for p in precursors))
-    return templatekw._hybrid(gen.__iter__(), precursors, lambda x: {'precursor': x},
-                              lambda d: d['precursor'][:12])
+        # <= hg-4.1 requires an explicite gen.
+        # we can use None once the support is dropped
+        #
+        # They also requires an iterator instead of an iterable.
+        gen = iter(" ".join(p[:12] for p in precursors))
+        return templatekw._hybrid(gen.__iter__(), precursors, lambda x: {'precursor': x},
+                                  lambda d: d['precursor'][:12])
 
 def closestsuccessors(repo, nodeid):
     """ returns the closest visible successors sets instead.
     """
     return directsuccessorssets(repo, nodeid)
 
-@eh.templatekw("successors")
-def shownextvisiblesuccessors(repo, ctx, templ, **args):
-    """Returns a string of sets of successors for a changectx
+if util.safehasattr(templatekw, 'showsuccessorssets'):
+    eh.templatekw("successors")(templatekw.showsuccessorssets)
+else:
+    # for version <= hg4.3
 
-    Format used is: [ctx1, ctx2], [ctx3] if ctx has been splitted into ctx1 and
-    ctx2 while also diverged into ctx3"""
-    if not ctx.obsolete():
-        return ''
+    @eh.templatekw("successors")
+    def shownextvisiblesuccessors(repo, ctx, templ, **args):
+        """Returns a string of sets of successors for a changectx
 
-    ssets, _ = closestsuccessors(repo, ctx.node())
-    ssets = [[node.hex(n) for n in ss] for ss in ssets]
+        Format used is: [ctx1, ctx2], [ctx3] if ctx has been splitted into ctx1 and
+        ctx2 while also diverged into ctx3"""
+        if not ctx.obsolete():
+            return ''
 
-    data = []
-    gen = []
-    for ss in ssets:
-        subgen = '[%s]' % ', '.join(n[:12] for n in ss)
-        gen.append(subgen)
-        h = templatekw._hybrid(iter(subgen), ss, lambda x: {'successor': x},
-                               lambda d: "%s" % d["successor"])
-        data.append(h)
+        ssets, _ = closestsuccessors(repo, ctx.node())
+        ssets = [[node.hex(n) for n in ss] for ss in ssets]
 
-    gen = ', '.join(gen)
-    return templatekw._hybrid(iter(gen), data, lambda x: {'successorset': x},
-                              lambda d: d["successorset"])
+        data = []
+        gen = []
+        for ss in ssets:
+            subgen = '[%s]' % ', '.join(n[:12] for n in ss)
+            gen.append(subgen)
+            h = templatekw._hybrid(iter(subgen), ss, lambda x: {'successor': x},
+                                   lambda d: "%s" % d["successor"])
+            data.append(h)
+
+        gen = ', '.join(gen)
+        return templatekw._hybrid(iter(gen), data, lambda x: {'successorset': x},
+                                  lambda d: d["successorset"])
 
 def _getusername(ui):
     """the default username in the config or None"""
@@ -191,17 +200,6 @@
     # Verb
     line.append(obsfateline['verb'])
 
-    # Users
-    if (verbose or normal) and 'users' in obsfateline:
-        users = obsfateline['users']
-
-        if normal:
-            username = _getusername(ui)
-            users = [user for user in users if user != username]
-
-        if users:
-            line.append(" by %s" % ",".join(users))
-
     # Successors
     successors = obsfateline["successors"]
 
@@ -209,6 +207,20 @@
         fmtsuccessors = map(lambda s: s[:12], successors)
         line.append(" as %s" % ", ".join(fmtsuccessors))
 
+    # Users
+    if (verbose or normal) and 'users' in obsfateline:
+        users = obsfateline['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(" by %s" % ", ".join(users))
+
     # Date
     if verbose:
         min_date = obsfateline['min_date']
@@ -234,13 +246,13 @@
 
     return "\n".join(lines)
 
-@eh.templatekw("obsfate")
-def showobsfate(repo, ctx, **args):
+@eh.templatekw("obsfatedata")
+def showobsfatedata(repo, ctx, **args):
     # Get the needed obsfate data
     values = obsfatedata(repo, ctx)
 
     if values is None:
-        return ''
+        return templatekw.showlist("obsfatedata", [], args)
 
     # Format each successorset successors list
     for raw in values:
@@ -291,8 +303,16 @@
 
     return templatekw._hybrid(gen, values, lambda x: {name: x}, fmt)
 
-# Check if we can hook directly on the changeset_printer
-if util.safehasattr(cmdutil.changeset_printer, '_exthook'):
+# rely on core mercurial starting from 4.4 for the obsfate template
+if not util.safehasattr(templatekw, 'showobsfate'):
+
+    @eh.templatekw("obsfate")
+    def showobsfate(*args, **kwargs):
+        return showobsfatedata(*args, **kwargs)
+
+if util.safehasattr(cmdutil.changeset_printer, '_showobsfate'):
+    pass # already included by default
+elif util.safehasattr(cmdutil.changeset_printer, '_exthook'):
     @eh.wrapfunction(cmdutil.changeset_printer, '_exthook')
     def exthook(original, self, ctx):
         # Call potential other extensions
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hgext3rd/topic/README	Fri Oct 20 18:44:52 2017 +0200
@@ -0,0 +1,53 @@
+Topic Extension
+================
+
+This packages also provides the ``topic`` experiment in an independent
+extension. It implements a new experimental concept to provide lightweight
+feature branches for the mutable parts of the history. The experiments is still
+at an early stage and have significant usability and performance issues when
+enabled.
+
+How to Install
+==============
+
+The ``topic`` extension is included into the ``evolve` package, so the same instruction apply.
+
+Using Pip
+---------
+
+You can install the latest version using pip::
+
+    $ pip install --user hg-evolve
+
+Then just enable it in you hgrc::
+
+    $ hg config --edit # adds the two line below:
+    [extensions]
+    topic =
+
+From Source
+-----------
+
+To install a local version from source::
+
+    $ hg clone https://www.mercurial-scm.org/repo/evolve/
+    $ cd evolve
+    $ make install-home
+
+Enable
+------
+
+The topic extensions is included in the evolve package. See the install instruction for evolve.
+
+Then enable it in you configuration::
+
+    $ hg config --edit # adds the two line below:
+    [extensions]
+    topic =
+
+Documentation
+-------------
+
+* See 'hg help -e topic' for a generic help.
+* See 'hg help topics' and 'hg help stack' for help on specific commands.
+* See the 'tests/test-topic-tutorial.t' file for a quick tutorial.
--- a/hgext3rd/topic/__init__.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/topic/__init__.py	Fri Oct 20 18:44:52 2017 +0200
@@ -48,10 +48,26 @@
 
 Be aware that this extension is still an experiment, commands and other features
 are likely to be change/adjusted/dropped over time as we refine the concept.
+
+topic-mode
+==========
+
+The topic extension can be configured to ensure the user do not forget to add
+a topic when committing a new topic::
+
+    [experimental]
+    # behavior when commit is made without an active topic
+    topic-mode = ignore # do nothing special (default)
+    topic-mode = warning # print a warning
+    topic-mode = enforce # abort the commit (except for merge)
+    topic-mode = enforce-all # abort the commit (even for merge)
+    topic-mode = random # use a randomized generated topic (except for merge)
+    topic-mode = random-all # use a randomized generated topic (even for merge)
 """
 
 from __future__ import absolute_import
 
+import functools
 import re
 import time
 import weakref
@@ -88,6 +104,7 @@
     stack,
     topicmap,
     discovery,
+    randomname
 )
 
 if util.safehasattr(registrar, 'command'):
@@ -122,11 +139,44 @@
               'topic.active': 'green',
              }
 
-__version__ = '0.3.0.dev'
-testedwith = '4.0.2 4.1.3 4.2.1'
+__version__ = '0.4.0.dev'
+
+testedwith = '4.0.2 4.1.3 4.2.3 4.3.3'
 minimumhgversion = '4.0'
 buglink = 'https://bz.mercurial-scm.org/'
 
+if util.safehasattr(registrar, 'configitem'):
+    configtable = {}
+    configitem = registrar.configitem(configtable)
+
+    configitem('experimental', 'enforce-topic',
+               default=False,
+    )
+    configitem('experimental', 'topic-mode',
+               default=None,
+    )
+    configitem('_internal', 'keep-topic',
+               default=False,
+    )
+
+    def extsetup(ui):
+        # register config that strickly belong to other code (thg, core, etc)
+        #
+        # To ensure all config items we used are registerd, we register them if
+        # nobody else did so far.
+        from mercurial import configitems
+        extraitem = functools.partial(configitems._register, ui._knownconfig)
+        if ('experimental' not in ui._knownconfig
+                or not ui._knownconfig['experimental'].get('thg.displaynames')):
+            extraitem('experimental', 'thg.displaynames',
+                      default=None,
+            )
+        if ('devel' not in ui._knownconfig
+                or not ui._knownconfig['devel'].get('random')):
+            extraitem('devel', 'randomseed',
+                      default=None,
+            )
+
 def _contexttopic(self, force=False):
     if not (force or self.mutable()):
         return ''
@@ -232,7 +282,7 @@
 
     repo = repo.unfiltered()
 
-    if repo.ui.config('experimental', 'thg.displaynames', None) is None:
+    if repo.ui.config('experimental', 'thg.displaynames') is None:
         repo.ui.setconfig('experimental', 'thg.displaynames', 'topics',
                           source='topic-extension')
 
@@ -322,14 +372,14 @@
             ct = self.currenttopic
             if not ct:
                 return tr
-            ctwasempty = stack.stackdata(self, topic=ct)['changesetcount'] == 0
+            ctwasempty = stack.stack(self, topic=ct).changesetcount == 0
 
             reporef = weakref.ref(self)
 
             def currenttopicempty(tr):
                 # check active topic emptyness
                 repo = reporef()
-                csetcount = stack.stackdata(repo, topic=ct)['changesetcount']
+                csetcount = stack.stack(repo, topic=ct).changesetcount
                 empty = csetcount == 0
                 if empty and not ctwasempty:
                     ui.status('active topic %r is now empty\n' % ct)
@@ -445,6 +495,8 @@
         # Have some restrictions on the topic name just like bookmark name
         scmutil.checknewlabel(repo, topic, 'topic')
 
+    compat.startpager(ui, 'topics')
+
     if list:
         if clear or rev:
             raise error.Abort(_("cannot use --clear or --rev with --list"))
@@ -480,7 +532,7 @@
 
     ct = repo.currenttopic
     if clear:
-        empty = stack.stackdata(repo, topic=ct)['changesetcount'] == 0
+        empty = stack.stack(repo, topic=ct).changesetcount == 0
         if empty:
             if ct:
                 ui.status(_('clearing empty topic "%s"\n') % ct)
@@ -524,6 +576,7 @@
         topic = repo.currenttopic
     if topic is None:
         branch = repo[None].branch()
+    compat.startpager(ui, 'stack')
     return stack.showstack(ui, repo, branch=branch, topic=topic, opts=opts)
 
 @command('debugcb|debugconvertbookmark', [
@@ -702,25 +755,43 @@
         p1 = c.p1().node()
         p2 = c.p2().node()
         if p1 in successors:
-            p1 = successors[p1]
+            p1 = successors[p1][0]
         if p2 in successors:
-            p2 = successors[p2]
-        mc = context.memctx(
-            repo, (p1, p2), c.description(),
-            c.files(), filectxfn,
-            user=c.user(), date=c.date(), extra=fixedextra)
-        newnode = repo.commitctx(mc)
-        successors[c.node()] = newnode
+            p2 = successors[p2][0]
+        mc = context.memctx(repo,
+                            (p1, p2),
+                            c.description(),
+                            c.files(),
+                            filectxfn,
+                            user=c.user(),
+                            date=c.date(),
+                            extra=fixedextra)
+
+        # phase handling
+        commitphase = c.phase()
+        if util.safehasattr(repo.ui, 'configoverride'):
+            overrides = {('phases', 'new-commit'): commitphase}
+            with repo.ui.configoverride(overrides, 'changetopic'):
+                newnode = repo.commitctx(mc)
+        else: # do not attempt to preserver phase (hg <= 4.0)
+            newnode = repo.commitctx(mc)
+
+        successors[c.node()] = (newnode,)
         ui.debug('new node id is %s\n' % node.hex(newnode))
-        obsolete.createmarkers(repo, [(c, (repo[newnode],))])
         rewrote += 1
+
+    # create obsmarkers and move bookmarks
+    # XXX we should be creating marker as we go instead of only at the end,
+    # this makes the operations more modulars
+    compat.cleanupnodes(repo, successors, 'changetopics')
+
     # move the working copy too
     wctx = repo[None]
     # in-progress merge is a bit too complex for now.
     if len(wctx.parents()) == 1:
         newid = successors.get(wctx.p1().node())
         if newid is not None:
-            hg.update(repo, newid, quietempty=True)
+            hg.update(repo, newid[0], quietempty=True)
     return rewrote
 
 def _listtopics(ui, repo, opts):
@@ -732,7 +803,7 @@
         return _showlasttouched(repo, fm, opts)
     activetopic = repo.currenttopic
     namemask = '%s'
-    if repo.topics and ui.verbose:
+    if repo.topics:
         maxwidth = max(len(t) for t in repo.topics)
         namemask = '%%-%is' % maxwidth
     for topic in sorted(repo.topics):
@@ -748,38 +819,46 @@
             fm.plain(' %s ' % marker, label=label)
         fm.write('topic', namemask, topic, label=label)
         fm.data(active=active)
+
+        data = stack.stack(repo, topic=topic)
+        fm.plain(' (')
+        if ui.verbose:
+            fm.write('branches+', 'on branch: %s',
+                     '+'.join(data.branches), # XXX use list directly after 4.0 is released
+                     label='topic.list.branches')
+
+            fm.plain(', ')
+        fm.write('changesetcount', '%d changesets', data.changesetcount,
+                 label='topic.list.changesetcount')
+
+        if data.troubledcount:
+            fm.plain(', ')
+            fm.write('troubledcount', '%d troubled',
+                     data.troubledcount,
+                     label='topic.list.troubledcount')
+
+        headcount = len(data.heads)
+        if 1 < headcount:
+            fm.plain(', ')
+            fm.write('headcount', '%d heads',
+                     headcount,
+                     label='topic.list.headcount.multiple')
+
         if ui.verbose:
             # XXX we should include the data even when not verbose
-            data = stack.stackdata(repo, topic=topic)
-            fm.plain(' (')
-            fm.write('branches+', 'on branch: %s',
-                     '+'.join(data['branches']), # XXX use list directly after 4.0 is released
-                     label='topic.list.branches')
-            fm.plain(', ')
-            fm.write('changesetcount', '%d changesets', data['changesetcount'],
-                     label='topic.list.changesetcount')
-            if data['troubledcount']:
-                fm.plain(', ')
-                fm.write('troubledcount', '%d troubled',
-                         data['troubledcount'],
-                         label='topic.list.troubledcount')
-            if 1 < data['headcount']:
-                fm.plain(', ')
-                fm.write('headcount', '%d heads',
-                         data['headcount'],
-                         label='topic.list.headcount.multiple')
-            if 0 < data['behindcount']:
+
+            behindcount = data.behindcount
+            if 0 < behindcount:
                 fm.plain(', ')
                 fm.write('behindcount', '%d behind',
-                         data['behindcount'],
+                         behindcount,
                          label='topic.list.behindcount')
-            elif -1 == data['behindcount']:
+            elif -1 == behindcount:
                 fm.plain(', ')
                 fm.write('behinderror', '%s',
-                         _('ambiguous destination: %s') % data['behinderror'],
+                         _('ambiguous destination: %s') % data.behinderror,
                          label='topic.list.behinderror')
-            fm.plain(')')
-        fm.plain('\n')
+        fm.plain(')\n')
     fm.end()
 
 def _showlasttouched(repo, fm, opts):
@@ -875,18 +954,68 @@
     # i18n: column positioning for "hg summary"
     ui.write(_("topic:  %s\n") % ui.label(t, 'topic.active'))
 
+_validmode = [
+    'ignore',
+    'warning',
+    'enforce',
+    'enforce-all',
+    'random',
+    'random-all',
+]
+
+def _configtopicmode(ui):
+    """ Parse the config to get the topicmode
+    """
+    topicmode = ui.config('experimental', 'topic-mode')
+
+    # Fallback to read enforce-topic
+    if topicmode is None:
+        enforcetopic = ui.configbool('experimental', 'enforce-topic')
+        if enforcetopic:
+            topicmode = "enforce"
+    if topicmode not in _validmode:
+        topicmode = _validmode[0]
+
+    return topicmode
+
 def commitwrap(orig, ui, repo, *args, **opts):
     with repo.wlock():
-        enforcetopic = ui.configbool('experimental', 'enforce-topic')
+        topicmode = _configtopicmode(ui)
+        ismergecommit = len(repo[None].parents()) == 2
+
+        notopic = not repo.currenttopic
+        mayabort = (topicmode == "enforce" and not ismergecommit)
+        maywarn = (topicmode == "warning"
+                   or (topicmode == "enforce" and ismergecommit))
+
+        mayrandom = False
+        if topicmode == "random":
+            mayrandom = not ismergecommit
+        elif topicmode == "random-all":
+            mayrandom = True
+
+        if topicmode == 'enforce-all':
+            ismergecommit = False
+            mayabort = True
+            maywarn = False
+
+        hint = _("see 'hg help -e topic.topic-mode' for details")
         if opts.get('topic'):
             t = opts['topic']
             with repo.vfs.open('topic', 'w') as f:
                 f.write(t)
-        elif not repo.currenttopic and enforcetopic:
+        elif opts.get('amend'):
+            pass
+        elif notopic and mayabort:
             msg = _("no active topic")
-            hint = _("set a current topic or use '--config " +
-                     "experimental.enforce-topic=no' to commit without a topic")
             raise error.Abort(msg, hint=hint)
+        elif notopic and maywarn:
+            ui.warn(_("warning: new draft commit without topic\n"))
+            if not ui.quiet:
+                ui.warn(("(%s)\n") % hint)
+        elif notopic and mayrandom:
+            with repo.vfs.open('topic', 'w') as f:
+                f.write(randomname.randomtopicname(ui))
         return orig(ui, repo, *args, **opts)
 
 def committextwrap(orig, repo, ctx, subs, extramsg):
@@ -917,7 +1046,7 @@
         # rebased commit. We have explicitly stored in config if rebase is
         # running.
         ot = repo.currenttopic
-        empty = stack.stackdata(repo, topic=ot)['changesetcount'] == 0
+        empty = stack.stack(repo, topic=ot).changesetcount == 0
         if repo.ui.hasconfig('experimental', 'topicrebase'):
             isrebase = True
         if repo.ui.configbool('_internal', 'keep-topic'):
--- a/hgext3rd/topic/compat.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/topic/compat.py	Fri Oct 20 18:44:52 2017 +0200
@@ -7,7 +7,11 @@
 """
 from __future__ import absolute_import
 
-from mercurial import obsolete
+from mercurial import (
+    obsolete,
+    scmutil,
+    util,
+)
 
 getmarkers = None
 successorssets = None
@@ -22,3 +26,22 @@
     getmarkers = obsolete.getmarkers
 if successorssets is None:
     successorssets = obsolete.successorssets
+
+def startpager(ui, cmd):
+    """function to start a pager in case ui.pager() exists"""
+    try:
+        ui.pager(cmd)
+    except AttributeError:
+        pass
+
+def cleanupnodes(repo, replacements, operation, moves=None):
+    # create obsmarkers and move bookmarks
+    # XXX we should be creating marker as we go instead of only at the end,
+    # this makes the operations more modulars
+    if util.safehasattr(scmutil, 'cleanupnodes'):
+        scmutil.cleanupnodes(repo, replacements, 'changetopics',
+                             moves=moves)
+    else:
+        relations = [(repo[o], tuple(repo[n] for n in new))
+                     for (o, new) in replacements.iteritems()]
+        obsolete.createmarkers(repo, relations)
--- a/hgext3rd/topic/evolvebits.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/topic/evolvebits.py	Fri Oct 20 18:44:52 2017 +0200
@@ -81,8 +81,16 @@
                  obs)
         obs = obs.parents()[0]
         newer = compat.successorssets(repo, obs.node())
-    if len(newer) > 1 or len(newer[0]) > 1:
+    if 1 < len(newer):
+        # divergence case
+        # we should pick as arbitrary one
         raise MultipleSuccessorsError(newer)
+    elif 1 < len(newer[0]):
+        splitheads = list(repo.revs('heads(%ln::%ln)', newer[0], newer[0]))
+        if 1 < len(splitheads):
+            # split case, See if we can make sense of it.
+            raise MultipleSuccessorsError(newer)
+        return splitheads[0]
 
     return repo[newer[0][0]].rev()
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hgext3rd/topic/randomname.py	Fri Oct 20 18:44:52 2017 +0200
@@ -0,0 +1,1011 @@
+# randomname.py - topic extension
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+"""random topic generator utils
+"""
+
+import random
+
+animals = [
+    'aardvark',
+    'albatross',
+    'alligator',
+    'alpaca',
+    'ant',
+    'anteater',
+    'antelope',
+    'ape',
+    'armadillo',
+    'baboon',
+    'badger',
+    'barracuda',
+    'bat',
+    'bear',
+    'beaver',
+    'bee',
+    'beetle',
+    'bison',
+    'boar',
+    'buffalo',
+    'bushbaby',
+    'bustard',
+    'butterfly',
+    'camel',
+    'capuchin',
+    'carabao',
+    'caribou',
+    'cat',
+    'caterpillar',
+    'cattle',
+    'chameleon',
+    'chamois',
+    'cheetah',
+    'chicken',
+    'chimpanzee',
+    'chinchilla',
+    'chipmunk',
+    'chough',
+    'cicada',
+    'clam',
+    'cobra',
+    'cockroach',
+    'cod',
+    'cormorant',
+    'coyote',
+    'crab',
+    'crane',
+    'cricket',
+    'crocodile',
+    'crow',
+    'curlew',
+    'deer',
+    'dinosaur',
+    'dog',
+    'dogfish',
+    'dolphin',
+    'donkey',
+    'dotterel',
+    'dove',
+    'dragon',
+    'dragonfly',
+    'duck',
+    'dugong',
+    'dunlin',
+    'eagle',
+    'echidna',
+    'eel',
+    'eland',
+    'elephant',
+    'elk',
+    'emu',
+    'falcon',
+    'ferret',
+    'finch',
+    'fish',
+    'flamingo',
+    'fly',
+    'fox',
+    'frog',
+    'gaur',
+    'gazelle',
+    'gecko',
+    'gerbil',
+    'giraffe',
+    'gnat',
+    'gnu',
+    'goat',
+    'goldfish',
+    'goose',
+    'gorilla',
+    'goshawk',
+    'grasshopper',
+    'grouse',
+    'guanaco',
+    'guinea',
+    'gull',
+    'hamster',
+    'hare',
+    'hawk',
+    'hedgehog',
+    'heron',
+    'herring',
+    'hippopotamus',
+    'hornet',
+    'horse',
+    'horsecrab',
+    'hound',
+    'hummingbird',
+    'hyena',
+    'hyrax',
+    'ibex',
+    'ibis',
+    'iguana',
+    'impala',
+    'insect',
+    'jackal',
+    'jaguar',
+    'jay',
+    'jellyfish',
+    'kangaroo',
+    'koala',
+    'kouprey',
+    'kudu',
+    'lapwing',
+    'lark',
+    'lemming',
+    'lemur',
+    'leopard',
+    'lion',
+    'lizard',
+    'llama',
+    'lobster',
+    'locust',
+    'loris',
+    'louse',
+    'lynx',
+    'lyrebird',
+    'magpie',
+    'mallard',
+    'mammoth',
+    'manatee',
+    'marten',
+    'meerkat',
+    'mink',
+    'minnow',
+    'mole',
+    'mongoose',
+    'monkey',
+    'moose',
+    'mosquito',
+    'mouse',
+    'mule',
+    'muskrat',
+    'narwhal',
+    'newt',
+    'nightingale',
+    'numbat',
+    'octopus',
+    'okapi',
+    'opossum',
+    'oryx',
+    'ostrich',
+    'otter',
+    'owl',
+    'ox',
+    'oyster',
+    'panda',
+    'panther',
+    'parrot',
+    'partridge',
+    'peacock',
+    'peafowl',
+    'pelican',
+    'penguin',
+    'pheasant',
+    'pig',
+    'pigeon',
+    'platypus',
+    'pony',
+    'porcupine',
+    'porpoise',
+    'prairie',
+    'puffin',
+    'pug',
+    'quagga',
+    'quail',
+    'quelea',
+    'rabbit',
+    'raccoon',
+    'ram',
+    'rat',
+    'raven',
+    'reindeer',
+    'rhea',
+    'rhinoceros',
+    'rook',
+    'ruff',
+    'salamander',
+    'salmon',
+    'sambar',
+    'sandpiper',
+    'sardine',
+    'scorpion',
+    'seahorse',
+    'seal',
+    'serval',
+    'shark',
+    'sheep',
+    'shrew',
+    'shrimp',
+    'skink',
+    'skunk',
+    'snail',
+    'snake',
+    'spider',
+    'squid',
+    'squirrel',
+    'starling',
+    'stinkbug',
+    'stork',
+    'swan',
+    'tapir',
+    'tarsier',
+    'termite',
+    'tern',
+    'tiger',
+    'toad',
+    'trout',
+    'turkey',
+    'turtle',
+    'unicorn',
+    'viper',
+    'vulture',
+    'wallaby',
+    'walrus',
+    'wasp',
+    'weasel',
+    'whale',
+    'wolf',
+    'wolverine',
+    'wombat',
+    'woodchuck',
+    'woodcock',
+    'woodpecker',
+    'worm',
+    'wren',
+    'yak',
+    'zebra',
+    'zorilla'
+]
+
+adjectives = [
+    'abiding',
+    'abject',
+    'ablaze',
+    'able',
+    'aboard',
+    'abounding',
+    'absorbed',
+    'absorbing',
+    'abstracted',
+    'abundant',
+    'acceptable',
+    'accessible',
+    'accurate',
+    'acoustic',
+    'adamant',
+    'adaptable',
+    'adhesive',
+    'adjoining',
+    'adorable',
+    'adventurous',
+    'affable',
+    'affectionate',
+    'agreeable',
+    'alert',
+    'alive',
+    'alluring',
+    'amazing',
+    'ambiguous',
+    'ambitious',
+    'amiable',
+    'amicable',
+    'amused',
+    'amusing',
+    'ancient',
+    'animated',
+    'apricot',
+    'aquatic',
+    'arctic',
+    'arenaceous',
+    'aromatic',
+    'aspiring',
+    'assiduous',
+    'assorted',
+    'astonishing',
+    'attractive',
+    'auspicious',
+    'automatic',
+    'available',
+    'average',
+    'awake',
+    'aware',
+    'awesome',
+    'axiomatic',
+    'bashful',
+    'bawdy',
+    'beautiful',
+    'beefy',
+    'befitting',
+    'beneficial',
+    'benevolent',
+    'bent',
+    'best',
+    'better',
+    'bewildered',
+    'bewitching',
+    'big',
+    'billowy',
+    'bizarre',
+    'black',
+    'blithe',
+    'blue',
+    'blushing',
+    'bouncy',
+    'boundless',
+    'brainy',
+    'brash',
+    'brave',
+    'brawny',
+    'brazen',
+    'breezy',
+    'brief',
+    'bright',
+    'brilliant',
+    'broad',
+    'brown',
+    'bucolic',
+    'bulky',
+    'bumpy',
+    'burgundy',
+    'burly',
+    'bustling',
+    'busy',
+    'calm',
+    'capable',
+    'capricious',
+    'captivating',
+    'carefree',
+    'careful',
+    'caring',
+    'carrot',
+    'ceaseless',
+    'cerise',
+    'certain',
+    'challenging',
+    'changeable',
+    'charming',
+    'cheerful',
+    'chief',
+    'chilly',
+    'chipper',
+    'classy',
+    'clean',
+    'clear',
+    'clever',
+    'cloudy',
+    'coherent',
+    'colorful',
+    'colossal',
+    'comfortable',
+    'common',
+    'communicative',
+    'compassionate',
+    'complete',
+    'complex',
+    'compulsive',
+    'confused',
+    'conscientious',
+    'conscious',
+    'conservative',
+    'considerate',
+    'convivial',
+    'cooing',
+    'cool',
+    'cooperative',
+    'coordinated',
+    'courageous',
+    'courteous',
+    'crazy',
+    'creative',
+    'crispy',
+    'crooked',
+    'crowded',
+    'cuddly',
+    'cultured',
+    'cunning',
+    'curious',
+    'curly',
+    'curved',
+    'curvy',
+    'cut',
+    'cute',
+    'daily',
+    'damp',
+    'dapper',
+    'dashing',
+    'dazzling',
+    'dear',
+    'debonair',
+    'decisive',
+    'decorous',
+    'deep',
+    'defiant',
+    'delicate',
+    'delicious',
+    'delighted',
+    'delightful',
+    'delirious',
+    'descriptive',
+    'detached',
+    'detailed',
+    'determined',
+    'different',
+    'diligent',
+    'diminutive',
+    'diplomatic',
+    'discreet',
+    'distinct',
+    'distinctive',
+    'dramatic',
+    'dry',
+    'dynamic',
+    'dynamite',
+    'eager',
+    'early',
+    'earthy',
+    'easy',
+    'easygoing',
+    'eatable',
+    'economic',
+    'ecstatic',
+    'educated',
+    'efficacious',
+    'efficient',
+    'effortless',
+    'eight',
+    'elastic',
+    'elated',
+    'electric',
+    'elegant',
+    'elfin',
+    'elite',
+    'eminent',
+    'emotional',
+    'enchanted',
+    'enchanting',
+    'encouraging',
+    'endless',
+    'energetic',
+    'enormous',
+    'entertaining',
+    'enthusiastic',
+    'envious',
+    'epicurean',
+    'equable',
+    'equal',
+    'eternal',
+    'ethereal',
+    'evanescent',
+    'even',
+    'excellent',
+    'excited',
+    'exciting',
+    'exclusive',
+    'exotic',
+    'expensive',
+    'exquisite',
+    'extroverted',
+    'exuberant',
+    'exultant',
+    'fabulous',
+    'fair',
+    'faithful',
+    'familiar',
+    'famous',
+    'fancy',
+    'fantastic',
+    'far',
+    'fascinated',
+    'fast',
+    'fearless',
+    'female',
+    'fertile',
+    'festive',
+    'few',
+    'fine',
+    'first',
+    'five',
+    'fixed',
+    'flamboyant',
+    'flashy',
+    'flat',
+    'flawless',
+    'flirtatious',
+    'florid',
+    'flowery',
+    'fluffy',
+    'fluttering',
+    'foamy',
+    'foolish',
+    'foregoing',
+    'fortunate',
+    'four',
+    'frank',
+    'free',
+    'frequent',
+    'fresh',
+    'friendly',
+    'full',
+    'functional',
+    'funny',
+    'furry',
+    'future',
+    'futuristic',
+    'fuzzy',
+    'gabby',
+    'gainful',
+    'garrulous',
+    'general',
+    'generous',
+    'gentle',
+    'giant',
+    'giddy',
+    'gifted',
+    'gigantic',
+    'gilded',
+    'glamorous',
+    'gleaming',
+    'glorious',
+    'glossy',
+    'glowing',
+    'godly',
+    'good',
+    'goofy',
+    'gorgeous',
+    'graceful',
+    'grandiose',
+    'grateful',
+    'gratis',
+    'gray',
+    'great',
+    'green',
+    'gregarious',
+    'grey',
+    'groovy',
+    'guiltless',
+    'gusty',
+    'guttural',
+    'habitual',
+    'half',
+    'hallowed',
+    'halting',
+    'handsome',
+    'happy',
+    'hard',
+    'hardworking',
+    'harmonious',
+    'heady',
+    'healthy',
+    'heavenly',
+    'helpful',
+    'hilarious',
+    'historical',
+    'holistic',
+    'hollow',
+    'honest',
+    'honorable',
+    'hopeful',
+    'hospitable',
+    'hot',
+    'huge',
+    'humorous',
+    'hungry',
+    'hushed',
+    'hypnotic',
+    'illustrious',
+    'imaginary',
+    'imaginative',
+    'immense',
+    'imminent',
+    'impartial',
+    'important',
+    'imported',
+    'impossible',
+    'incandescent',
+    'inconclusive',
+    'incredible',
+    'independent',
+    'industrious',
+    'inexpensive',
+    'innate',
+    'innocent',
+    'inquisitive',
+    'instinctive',
+    'intellectual',
+    'intelligent',
+    'intense',
+    'interesting',
+    'internal',
+    'intuitive',
+    'inventive',
+    'invincible',
+    'jazzy',
+    'jolly',
+    'joyful',
+    'joyous',
+    'judicious',
+    'juicy',
+    'jumpy',
+    'keen',
+    'kind',
+    'kindhearted',
+    'kindly',
+    'knotty',
+    'knowing',
+    'knowledgeable',
+    'known',
+    'laconic',
+    'large',
+    'lavish',
+    'lean',
+    'learned',
+    'left',
+    'legal',
+    'level',
+    'light',
+    'likeable',
+    'literate',
+    'little',
+    'lively',
+    'living',
+    'long',
+    'longing',
+    'loud',
+    'lovely',
+    'loving',
+    'loyal',
+    'lucky',
+    'luminous',
+    'lush',
+    'luxuriant',
+    'luxurious',
+    'lyrical',
+    'magenta',
+    'magical',
+    'magnificent',
+    'majestic',
+    'male',
+    'mammoth',
+    'many',
+    'marvelous',
+    'massive',
+    'material',
+    'mature',
+    'meandering',
+    'meaty',
+    'medical',
+    'mellow',
+    'melodic',
+    'melted',
+    'merciful',
+    'mighty',
+    'miniature',
+    'miniscule',
+    'minor',
+    'minute',
+    'misty',
+    'modern',
+    'modest',
+    'momentous',
+    'motionless',
+    'mountainous',
+    'mute',
+    'mysterious',
+    'narrow',
+    'natural',
+    'near',
+    'neat',
+    'nebulous',
+    'necessary',
+    'neighborly',
+    'new',
+    'next',
+    'nice',
+    'nifty',
+    'nimble',
+    'nine',
+    'nippy',
+    'noiseless',
+    'noisy',
+    'nonchalant',
+    'normal',
+    'numberless',
+    'numerous',
+    'nutritious',
+    'obedient',
+    'observant',
+    'obtainable',
+    'oceanic',
+    'omniscient',
+    'one',
+    'open',
+    'opposite',
+    'optimal',
+    'optimistic',
+    'opulent',
+    'orange',
+    'ordinary',
+    'organic',
+    'outgoing',
+    'outrageous',
+    'outstanding',
+    'oval',
+    'overjoyed',
+    'overt',
+    'palatial',
+    'panoramic',
+    'parallel',
+    'passionate',
+    'past',
+    'pastoral',
+    'patient',
+    'peaceful',
+    'perfect',
+    'periodic',
+    'permissible',
+    'perpetual',
+    'persistent',
+    'petite',
+    'philosophical',
+    'physical',
+    'picturesque',
+    'pink',
+    'pioneering',
+    'piquant',
+    'plausible',
+    'pleasant',
+    'plucky',
+    'poised',
+    'polite',
+    'possible',
+    'powerful',
+    'practical',
+    'precious',
+    'premium',
+    'present',
+    'pretty',
+    'previous',
+    'private',
+    'probable',
+    'productive',
+    'profound',
+    'profuse',
+    'protective',
+    'proud',
+    'psychedelic',
+    'public',
+    'pumped',
+    'purple',
+    'purring',
+    'puzzled',
+    'puzzling',
+    'quaint',
+    'quick',
+    'quicker',
+    'quickest',
+    'quiet',
+    'quirky',
+    'quixotic',
+    'quizzical',
+    'rainy',
+    'rapid',
+    'rare',
+    'rational',
+    'ready',
+    'real',
+    'rebel',
+    'receptive',
+    'red',
+    'reflective',
+    'regular',
+    'relaxed',
+    'reliable',
+    'relieved',
+    'remarkable',
+    'reminiscent',
+    'reserved',
+    'resolute',
+    'resonant',
+    'resourceful',
+    'responsible',
+    'rich',
+    'ridiculous',
+    'right',
+    'rightful',
+    'ripe',
+    'ritzy',
+    'roasted',
+    'robust',
+    'romantic',
+    'roomy',
+    'round',
+    'royal',
+    'ruddy',
+    'rural',
+    'rustic',
+    'sable',
+    'safe',
+    'salty',
+    'same',
+    'satisfying',
+    'savory',
+    'scientific',
+    'scintillating',
+    'scrumptious',
+    'second',
+    'secret',
+    'secretive',
+    'seemly',
+    'selective',
+    'sensible',
+    'separate',
+    'shaggy',
+    'shaky',
+    'shining',
+    'shiny',
+    'short',
+    'shy',
+    'silent',
+    'silky',
+    'silly',
+    'simple',
+    'simplistic',
+    'sincere',
+    'six',
+    'sizzling',
+    'skillful',
+    'sleepy',
+    'slick',
+    'slim',
+    'smart',
+    'smiling',
+    'smooth',
+    'soaring',
+    'sociable',
+    'soft',
+    'solid',
+    'sophisticated',
+    'sparkling',
+    'special',
+    'spectacular',
+    'speedy',
+    'spicy',
+    'spiffy',
+    'spiritual',
+    'splendid',
+    'spooky',
+    'spotless',
+    'spotted',
+    'square',
+    'standing',
+    'statuesque',
+    'steadfast',
+    'steady',
+    'steep',
+    'stimulating',
+    'straight',
+    'straightforward',
+    'striking',
+    'striped',
+    'strong',
+    'stunning',
+    'stupendous',
+    'sturdy',
+    'subsequent',
+    'substantial',
+    'subtle',
+    'successful',
+    'succinct',
+    'sudden',
+    'super',
+    'superb',
+    'supreme',
+    'swanky',
+    'sweet',
+    'swift',
+    'sympathetic',
+    'synonymous',
+    'talented',
+    'tall',
+    'tame',
+    'tan',
+    'tangible',
+    'tangy',
+    'tasteful',
+    'tasty',
+    'telling',
+    'temporary',
+    'tempting',
+    'ten',
+    'tender',
+    'terrific',
+    'tested',
+    'thankful',
+    'therapeutic',
+    'thin',
+    'thinkable',
+    'third',
+    'thoughtful',
+    'three',
+    'thrifty',
+    'tidy',
+    'tiny',
+    'toothsome',
+    'towering',
+    'tranquil',
+    'tremendous',
+    'tricky',
+    'true',
+    'truthful',
+    'two',
+    'typical',
+    'ubiquitous',
+    'ultra',
+    'unassuming',
+    'unbiased',
+    'uncovered',
+    'understanding',
+    'understood',
+    'unequaled',
+    'unique',
+    'unusual',
+    'unwritten',
+    'upbeat',
+    'useful',
+    'utopian',
+    'utter',
+    'uttermost',
+    'valuable',
+    'various',
+    'vast',
+    'verdant',
+    'vermilion',
+    'versatile',
+    'versed',
+    'victorious',
+    'vigorous',
+    'violet',
+    'vivacious',
+    'voiceless',
+    'voluptuous',
+    'wacky',
+    'waiting',
+    'wakeful',
+    'wandering',
+    'warm',
+    'warmhearted',
+    'wealthy',
+    'whimsical',
+    'whispering',
+    'white',
+    'whole',
+    'wholesale',
+    'whopping',
+    'wide',
+    'wiggly',
+    'wild',
+    'willing',
+    'windy',
+    'winsome',
+    'wiry',
+    'wise',
+    'wistful',
+    'witty',
+    'womanly',
+    'wonderful',
+    'workable',
+    'young',
+    'youthful',
+    'yummy',
+    'zany',
+    'zealous',
+    'zesty',
+    'zippy'
+]
+
+def randomtopicname(ui):
+    if ui.configint("devel", "randomseed"):
+        random.seed(ui.configint("devel", "randomseed"))
+    return random.choice(adjectives) + "-" + random.choice(animals)
--- a/hgext3rd/topic/stack.py	Wed Sep 27 01:22:58 2017 +0200
+++ b/hgext3rd/topic/stack.py	Fri Oct 20 18:44:52 2017 +0200
@@ -34,9 +34,9 @@
         if topic is not None and branch is not None:
             raise error.ProgrammingError('both branch and topic specified (not defined yet)')
         elif topic is not None:
-            trevs = repo.revs("topic(%s) - obsolete()", topic)
+            trevs = repo.revs("not obsolete() and topic(%s)", topic)
         elif branch is not None:
-            trevs = repo.revs("branch(%s) - public() - obsolete() - topic()", branch)
+            trevs = repo.revs("not public() and branch(%s) - obsolete() - topic()", branch)
         else:
             raise error.ProgrammingError('neither branch and topic specified (not defined yet)')
         self._revs = trevs
@@ -275,28 +275,30 @@
     # super crude initial version
     for idx, isentry, ctx in entries[::-1]:
 
+        symbol = None
         states = []
         iscurrentrevision = repo.revs('%d and parents()', ctx.rev())
 
+        if iscurrentrevision:
+            states.append('current')
+            symbol = '@'
+
+        if ctx.orphan():
+            symbol = '$'
+            states.append('unstable')
+
         if not isentry:
             symbol = '^'
             # "base" is kind of a "ghost" entry
-            # skip other label for them (no current, no unstable)
-            states = ['base']
-        elif ctx.orphan():
-            # current revision can be unstable also, so in that case show both
-            # the states and the symbol '@' (issue5553)
-            if iscurrentrevision:
-                states.append('current')
-                symbol = '@'
-            symbol = '$'
-            states.append('unstable')
-        elif iscurrentrevision:
-            states.append('current')
-            symbol = '@'
-        else:
+            states.append('base')
+
+        # none of the above if statments get executed
+        if not symbol:
             symbol = ':'
             states.append('clean')
+
+        states.sort()
+
         fm.startitem()
         fm.data(isentry=isentry)
 
--- a/tests/test-check-flake8.t	Wed Sep 27 01:22:58 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-#require test-repo
-
-  $ checkflake8() {
-  >   if ! (which flake8 > /dev/null); then
-  >     echo skipped: missing tool: flake8;
-  >     exit 80;
-  >   fi;
-  > };
-  $ checkflake8
-
-Copied from Mercurial core (60ee2593a270)
-
-  $ cd "`dirname "$TESTDIR"`"
-
-run flake8 if it exists; if it doesn't, then just skip
-
-  $ hg files -0 'set:(**.py or grep("^#!.*python")) - removed()' 2>/dev/null \
-  > | xargs -0 flake8
--- a/tests/test-evolve-order.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-evolve-order.t	Fri Oct 20 18:44:52 2017 +0200
@@ -102,7 +102,7 @@
   |/
   o  0:f92638be10c7@default(public) add p
   
-  $ hg evolve --rev "unstable()"
+  $ hg evolve --rev "orphan()"
   move:[11] bprime
   atop:[12] asecond
   move:[7] add _c
@@ -257,7 +257,7 @@
   2 files updated, 0 files merged, 3 files removed, 0 files unresolved
   $ hg amend -m 'b3second'
   1 new unstable changesets
-  $ hg evolve --rev 'unstable()'
+  $ hg evolve --rev "orphan()"
   move:[30] add b4_
   atop:[35] b3second
   skipping 0b9488394e89: divergent rewriting. can't choose destination
--- a/tests/test-evolve-templates.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-evolve-templates.t	Fri Oct 20 18:44:52 2017 +0200
@@ -30,7 +30,7 @@
   $ mkcommit ROOT
   $ mkcommit A0
   $ echo 42 >> A0
-  $ HGUSER=test1 hg amend -m "A1" --config devel.default-date="1234567890 0"
+  $ HGUSER=test hg amend -m "A1" --config devel.default-date="1234567890 0"
   $ HGUSER=test2 hg amend -m "A2" --config devel.default-date="987654321 0"
   $ hg log --hidden -G
   @  changeset:   4:d004c8f274b9
--- a/tests/test-evolve.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-evolve.t	Fri Oct 20 18:44:52 2017 +0200
@@ -384,9 +384,9 @@
 
 Test commit -o options
 
-  $ hg up 6
+  $ hg up -r "desc('a nifty feature')"
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ hg revert -r 7 --all
+  $ hg revert -r "desc('another feature')" --all
   adding file-from-B
   reverting main-file-1
   $ sed -i'' -e s/Zwei/deux/ main-file-1
@@ -399,7 +399,7 @@
 
 phase change turning obsolete changeset public issue a bumped warning
 
-  $ hg phase --hidden --public 7
+  $ hg phase --hidden --public 99833d22b0c6
   1 new bumped changesets
 
 all solving bumped troubled
@@ -428,22 +428,22 @@
   |
   o  0	: base - test
   
-  $ hg diff --hidden -r 9 -r 8
-  $ hg diff -r 9^ -r 9
+  $ hg diff --hidden -r 6707c5e1c49d -r 47d52a103155
+  $ hg diff -r 6707c5e1c49d^ -r 6707c5e1c49d
   diff --git a/main-file-1 b/main-file-1
   --- a/main-file-1
   +++ b/main-file-1
   @@ -3,1 +3,1 @@
   -Zwei
   +deux
-  $ hg log -r 'bumped()' # no more bumped
+  $ hg log -r 'phasedivergent()' # no more bumped
 
 test evolve --all
   $ sed -i'' -e s/deux/to/ main-file-1
   $ hg commit -m 'dansk 2!'
   $ sed -i'' -e s/Three/tre/ main-file-1
   $ hg commit -m 'dansk 3!'
-  $ hg update 9
+  $ hg update 6707c5e1c49d
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ sed -i'' -e s/Un/Én/ main-file-1
   $ hg commit --amend -m 'dansk!'
@@ -938,12 +938,12 @@
 
 Evolve from the middle of a stack pick the right changesets.
 
-  $ hg up 7
+  $ hg up -r "desc('a1_')"
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg ci --amend -m 'a1__'
   2 new unstable changesets
 
-  $ hg up 8
+  $ hg up -r "desc('a2')"
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg log -G --template '{rev} [{branch}] {desc|firstline}\n'
   o  10 [default] a1__
@@ -964,7 +964,7 @@
 
 Evolve disables active bookmarks.
 
-  $ hg up 10
+  $ hg up -r "desc('a1__')"
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg bookmark testbookmark
   $ ls .hg/bookmarks*
@@ -977,25 +977,25 @@
   working directory is now at d952e93add6f
   $ ls .hg/bookmarks*
   .hg/bookmarks
-  $ hg log -G
-  @  11	: a2 - test
+  $ glog
+  @  11:d952e93add6f@mybranch(draft) a2
   |
-  o  10	testbookmark: a1__ - test
+  o  10:9f8b83c2e7f3@default(draft) a1__
   |
-  | o  9	: a3 - test
+  | o  9:777c26ca5e78@mybranch(draft) a3
   | |
-  | x  8	: a2 - test
+  | x  8:eb07e22a0e63@mybranch(draft) a2
   | |
-  | x  7	: a1_ - test
+  | x  7:faafc6cea0ba@default(draft) a1_
   |/
-  o  0	: a0 - test
+  o  0:07c1c36d9ef0@default(draft) a0
   
 
 Possibility to select what trouble to solve first, asking for bumped before
 divergent
-  $ hg up 10
+  $ hg up -r "desc('a1__')"
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg revert -r 11 --all
+  $ hg revert -r d952e93add6f --all
   reverting a
   $ hg log -G --template '{rev} [{branch}] {desc|firstline}\n'
   o  11 [mybranch] a2
@@ -1013,7 +1013,7 @@
   $ echo "hello world" > newfile
   $ hg add newfile
   $ hg commit -m "add new file bumped" -o 11
-  $ hg phase --public --hidden 11
+  $ hg phase --public --hidden d952e93add6f
   1 new bumped changesets
   $ hg log -G
   @  12	: add new file bumped - test
@@ -1049,7 +1049,7 @@
   |/
   o  0	: a0 - test
   
-  $ hg evolve -r 12 --phasedivergent
+  $ hg evolve -r "desc('add new file bumped')" --phasedivergent
   recreate:[12] add new file bumped
   atop:[11] a2
   computing new diff
@@ -1059,18 +1059,6 @@
   move:[9] a3
   atop:[13] bumped update to d952e93add6f:
   working directory is now at cce26b684bfe
-  $ glog
-  @  14:cce26b684bfe@default(draft) a3
-  |
-  o  13:f15d32934071@default(draft) bumped update to d952e93add6f:
-  |
-  o  11:d952e93add6f@mybranch(public) a2
-  |
-  o  10:9f8b83c2e7f3@default(public) a1__
-  |
-  o  0:07c1c36d9ef0@default(public) a0
-  
-
 Check that we can resolve troubles in a revset with more than one commit
   $ hg up cce26b684bfe -C
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -1118,15 +1106,15 @@
   
 
 Evolving an empty revset should do nothing
-  $ hg evolve --rev "16 and 15"
+  $ hg evolve --rev "beb41503aa3e and 27247fcb2df6"
   set of specified revisions is empty
   [1]
 
-  $ hg evolve --rev "14::" --phasedivergent
+  $ hg evolve --rev "cce26b684bfe::" --phasedivergent
   no phasedivergent changesets in specified revisions
   (do you want to use --orphan)
   [2]
-  $ hg evolve --rev "14::" --orphan
+  $ hg evolve --rev "cce26b684bfe::" --orphan
   move:[15] add gg
   atop:[18] a3
   move:[16] add gh
@@ -1249,7 +1237,7 @@
   > EOF
 
 Check hg evolve --rev on singled out commit
-  $ hg up 19 -C
+  $ hg up 24e63b319adf -C
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ mkcommit j1
   $ mkcommit j2
@@ -1260,7 +1248,7 @@
   $ hg add j4
   $ hg amend
   2 new unstable changesets
-  $ glog -r "18::"
+  $ glog -r "edc3c9de504e::"
   @  25:8dc373be86d9@default(draft) add j1
   |
   | o  23:d7eadcf6eccd@default(draft) add j3
@@ -1277,10 +1265,10 @@
   |
   ~
 
-  $ hg evolve --rev 23 --any
+  $ hg evolve --rev d7eadcf6eccd --any
   abort: cannot specify both "--rev" and "--any"
   [255]
-  $ hg evolve --rev 23
+  $ hg evolve --rev d7eadcf6eccd
   cannot solve instability of d7eadcf6eccd, skipping
 
 Check that uncommit respects the allowunstable option
@@ -1300,7 +1288,7 @@
   $ hg uncommit --all
   new changeset is empty
   (use 'hg prune .' to remove it)
-  $ glog -r "18::"
+  $ glog -r "edc3c9de504e::"
   @  26:044804d0c10d@default(draft) add j1
   |
   | o  23:d7eadcf6eccd@default(draft) add j3
@@ -1320,7 +1308,7 @@
 Check that prune respects the allowunstable option
   $ hg up -C .
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg up 20
+  $ hg up e02107f98737
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ hg evolve --all
   nothing to evolve on current working copy parent
@@ -1332,7 +1320,7 @@
   move:[23] add j3
   atop:[27] add j2
   working directory is now at c9a20e2d74aa
-  $ glog -r "18::"
+  $ glog -r "edc3c9de504e::"
   @  28:c9a20e2d74aa@default(draft) add j3
   |
   o  27:b0e3066231e2@default(draft) add j2
@@ -1350,17 +1338,17 @@
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
   $ mkcommit c5_
   created new head
-  $ hg prune '26 + 27'
+  $ hg prune '044804d0c10d + b0e3066231e2'
   abort: touch will orphan 1 descendants
   (see 'hg help evolution.instability')
   [255]
-  $ hg prune '19::28'
+  $ hg prune '24e63b319adf::c9a20e2d74aa'
   abort: touch will orphan 1 descendants
   (see 'hg help evolution.instability')
   [255]
-  $ hg prune '26::'
+  $ hg prune '044804d0c10d::'
   3 changesets pruned
-  $ glog -r "18::"
+  $ glog -r "edc3c9de504e::"
   @  29:2251801b6c91@default(draft) add c5_
   |
   | o  20:e02107f98737@default(draft) add gh
@@ -1379,7 +1367,7 @@
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
   $ mkcommit unstableifparentisfolded
   created new head
-  $ glog -r "18::"
+  $ glog -r "edc3c9de504e::"
   @  30:68330ac625b8@default(draft) add unstableifparentisfolded
   |
   | o  29:2251801b6c91@default(draft) add c5_
@@ -1392,7 +1380,7 @@
   |
   ~
 
-  $ hg fold --exact "19::"
+  $ hg fold --exact "24e63b319adf::"
   2 changesets folded
 
 Check that evolve shows error while handling split commits
@@ -1403,7 +1391,7 @@
   > evolution=all
   > EOF
 
-  $ glog -r "18::"
+  $ glog -r "edc3c9de504e::"
   o  31:580886d07058@default(draft) add gg
   |
   | @  30:68330ac625b8@default(draft) add unstableifparentisfolded
@@ -1432,7 +1420,7 @@
   $ hg prune --succ "desc(_oo) + desc(_pp)" -r "desc('oo+pp')" --split
   1 changesets pruned
   1 new unstable changesets
-  $ glog -r "18::"
+  $ glog -r "edc3c9de504e::"
   @  35:7a555adf2b4a@default(draft) _pp
   |
   o  34:2be4d2d5bf34@default(draft) _oo
@@ -1450,7 +1438,7 @@
   o  18:edc3c9de504e@default(draft) a3
   |
   ~
-  $ hg evolve --rev "18::"
+  $ hg evolve --rev "edc3c9de504e::"
   move:[33] add uu
   atop:[35] _pp
   working directory is now at 43c3f5ef149f
@@ -1472,35 +1460,12 @@
   $ hg add newlyadded
   $ hg commit -m "will cause conflict at evolve"
 
-  $ glog -r "edc3c9de504e::"
-  @  39:02e943732647@default(draft) will cause conflict at evolve
-  |
-  o  38:f8e30e9317aa@default(draft) will be evolved safely
-  |
-  o  37:36030b147271@default(draft) will be amended
-  |
-  o  36:43c3f5ef149f@default(draft) add uu
-  |
-  o  35:7a555adf2b4a@default(draft) _pp
-  |
-  o  34:2be4d2d5bf34@default(draft) _oo
-  |
-  | o  31:580886d07058@default(draft) add gg
-  | |
-  o |  30:68330ac625b8@default(draft) add unstableifparentisfolded
-  |/
-  | o  20:e02107f98737@default(draft) add gh
-  |/
-  o  18:edc3c9de504e@default(draft) a3
-  |
-  ~
-
   $ hg update -q 36030b147271
   $ echo "amended" > newfile
   $ hg amend -m "amended"
   2 new unstable changesets
 
-  $ hg evolve --rev "37::"
+  $ hg evolve --rev "36030b147271::"
   move:[38] will be evolved safely
   atop:[41] amended
   move:[39] will cause conflict at evolve
@@ -1512,7 +1477,7 @@
   abort: unresolved merge conflicts (see hg help resolve)
   [255]
 
-  $ glog -r "36::" --hidden
+  $ glog -r "43c3f5ef149f::" --hidden
   @  42:c904da5245b0@default(draft) will be evolved safely
   |
   o  41:34ae045ec400@default(draft) amended
--- a/tests/test-exchange-obsmarkers-case-A6.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-exchange-obsmarkers-case-A6.t	Fri Oct 20 18:44:52 2017 +0200
@@ -74,7 +74,7 @@
   $ inspect_obsmarkers
   obsstore content
   ================
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   obshashtree
   ===========
   a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04 0000000000000000000000000000000000000000
@@ -100,7 +100,7 @@
   # testing echange of "A1" (e5ea8f9c7314)
   ## initial state
   # obstore: main
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pushdest
   # obstore: pulldest
   ## pushing "A1" from main to pushdest
@@ -110,9 +110,9 @@
   remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pushdest
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pulldest
   ## pulling "e5ea8f9c7314" from main into pulldest
   pulling from main
@@ -120,11 +120,11 @@
   1 new obsolescence markers
   ## post pull state
   # obstore: main
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pushdest
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pulldest
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
 
 Actual Test (bare push version)
 -------------------------------
@@ -133,7 +133,7 @@
   ## Running testcase A.6.b
   ## initial state
   # obstore: main
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pushdest
   # obstore: pulldest
   ## pushing from main to pushdest
@@ -143,9 +143,9 @@
   remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pushdest
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pulldest
   ## pulling from main into pulldest
   pulling from main
@@ -154,8 +154,8 @@
   1 new obsolescence markers
   ## post pull state
   # obstore: main
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pushdest
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pulldest
-  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (*) {'user': 'test'} (glob)
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-exchange-obsmarkers-case-A7.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-exchange-obsmarkers-case-A7.t	Fri Oct 20 18:44:52 2017 +0200
@@ -59,7 +59,7 @@
   $ inspect_obsmarkers
   obsstore content
   ================
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (*) {'user': 'test'} (glob)
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   obshashtree
   ===========
   a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04 0000000000000000000000000000000000000000
@@ -81,7 +81,7 @@
   # testing echange of "O" (a9bdc8b26820)
   ## initial state
   # obstore: main
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (*) {'user': 'test'} (glob)
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pushdest
   # obstore: pulldest
   ## pushing "O" from main to pushdest
@@ -90,7 +90,7 @@
   no changes found
   ## post push state
   # obstore: main
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (*) {'user': 'test'} (glob)
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pushdest
   # obstore: pulldest
   ## pulling "a9bdc8b26820" from main into pulldest
@@ -98,6 +98,6 @@
   no changes found
   ## post pull state
   # obstore: main
-  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (*) {'user': 'test'} (glob)
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   # obstore: pushdest
   # obstore: pulldest
--- a/tests/test-inhibit.t	Wed Sep 27 01:22:58 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,931 +0,0 @@
-  $ cat >> $HGRCPATH <<EOF
-  > [ui]
-  > logtemplate = {rev}:{node|short} {desc}\n
-  > [experimental]
-  > prunestrip=True
-  > evolution=createmarkers
-  > [extensions]
-  > rebase=
-  > strip=
-  > EOF
-  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/" >> $HGRCPATH
-  $ echo "directaccess=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/hack/directaccess.py" >> $HGRCPATH
-  $ echo "inhibit=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/hack/inhibit.py" >> $HGRCPATH
-  $ mkcommit() {
-  >    echo "$1" > "$1"
-  >    hg add "$1"
-  >    hg ci -m "add $1"
-  > }
-
-  $ hg init inhibit
-  $ cd inhibit
-  $ mkcommit cA
-  $ mkcommit cB
-  $ mkcommit cC
-  $ mkcommit cD
-  $ hg up 'desc(cA)'
-  0 files updated, 0 files merged, 3 files removed, 0 files unresolved
-  $ mkcommit cE
-  created new head
-  $ mkcommit cG
-  $ mkcommit cH
-  $ mkcommit cJ
-  $ hg log -G
-  @  7:18214586bf78 add cJ
-  |
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  | o  3:2db36d8066ff add cD
-  | |
-  | o  2:7df62a38b9bf add cC
-  | |
-  | o  1:02bcbc3f6e56 add cB
-  |/
-  o  0:54ccbc537fc2 add cA
-  
-
-plain prune
-
-  $ hg strip 1::
-  3 changesets pruned
-  $ hg log -G
-  @  7:18214586bf78 add cJ
-  |
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-  $ hg debugobsinhibit --hidden 1::
-  $ hg log -G
-  @  7:18214586bf78 add cJ
-  |
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  | o  3:2db36d8066ff add cD
-  | |
-  | o  2:7df62a38b9bf add cC
-  | |
-  | o  1:02bcbc3f6e56 add cB
-  |/
-  o  0:54ccbc537fc2 add cA
-  
-  $ hg strip --hidden 1::
-  3 changesets pruned
-  $ hg log -G
-  @  7:18214586bf78 add cJ
-  |
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-
-after amend
-
-  $ echo babar > cJ
-  $ hg commit --amend
-  $ hg log -G
-  @  9:55c73a90e4b4 add cJ
-  |
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-  $ hg debugobsinhibit --hidden 18214586bf78
-  $ hg log -G
-  @  9:55c73a90e4b4 add cJ
-  |
-  | o  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-
-and no divergence
-
-  $ hg summary
-  parent: 9:55c73a90e4b4 tip
-   add cJ
-  branch: default
-  commit: (clean)
-  update: 1 new changesets, 2 branch heads (merge)
-  phases: 6 draft
-
-check public revision got cleared
-(when adding the second inhibitor, the first one is removed because it is public)
-
-  $ wc -m .hg/store/obsinhibit | sed -e 's/^[ \t]*//'
-  20 .hg/store/obsinhibit
-  $ hg strip 7
-  1 changesets pruned
-  $ hg debugobsinhibit --hidden 18214586bf78
-  $ wc -m .hg/store/obsinhibit | sed -e 's/^[ \t]*//'
-  20 .hg/store/obsinhibit
-  $ hg log -G
-  @  9:55c73a90e4b4 add cJ
-  |
-  | o  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-  $ hg phase --public 7
-  1 new bumped changesets
-  $ hg strip 9
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at cf5c4f4554ce
-  1 changesets pruned
-  $ hg log -G
-  o  7:18214586bf78 add cJ
-  |
-  @  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-  $ hg debugobsinhibit --hidden 55c73a90e4b4
-  $ wc -m .hg/store/obsinhibit | sed -e 's/^[ \t]*//'
-  20 .hg/store/obsinhibit
-  $ hg log -G
-  o  9:55c73a90e4b4 add cJ
-  |
-  | o  7:18214586bf78 add cJ
-  |/
-  @  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-Update should inhibit all related unstable commits
-
-  $ hg update 2 --hidden
-  2 files updated, 0 files merged, 3 files removed, 0 files unresolved
-  $ hg log -G
-  o  9:55c73a90e4b4 add cJ
-  |
-  | o  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  | @  2:7df62a38b9bf add cC
-  | |
-  | o  1:02bcbc3f6e56 add cB
-  |/
-  o  0:54ccbc537fc2 add cA
-  
-
-  $ hg update 9
-  4 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ hg log -G
-  @  9:55c73a90e4b4 add cJ
-  |
-  | o  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  | o  2:7df62a38b9bf add cC
-  | |
-  | o  1:02bcbc3f6e56 add cB
-  |/
-  o  0:54ccbc537fc2 add cA
-  
-  $ hg strip --hidden 1::
-  3 changesets pruned
-  $ hg log -G
-  @  9:55c73a90e4b4 add cJ
-  |
-  | o  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-
-Bookmark should inhibit all related unstable commits
-  $ hg bookmark -r 2 book1  --hidden
-  $ hg log -G
-  @  9:55c73a90e4b4 add cJ
-  |
-  | o  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  | o  2:7df62a38b9bf add cC
-  | |
-  | o  1:02bcbc3f6e56 add cB
-  |/
-  o  0:54ccbc537fc2 add cA
-  
-
-Removing a bookmark with bookmark -D should prune the changes underneath
-that are not reachable from another bookmark or head
-
-  $ hg bookmark -r 1 book2
-  $ hg bookmark -D book1  --config experimental.evolution=createmarkers #--config to make sure prune is not registered as a command.
-  bookmark 'book1' deleted
-  1 changesets pruned
-  $ hg log -G
-  @  9:55c73a90e4b4 add cJ
-  |
-  | o  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  | o  1:02bcbc3f6e56 add cB
-  |/
-  o  0:54ccbc537fc2 add cA
-  
-  $ hg bookmark -D book2
-  bookmark 'book2' deleted
-  1 changesets pruned
-  $ hg log -G
-  @  9:55c73a90e4b4 add cJ
-  |
-  | o  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-Test edge cases of bookmark -D
-  $ hg book -D book2 -m hello
-  abort: Cannot use both -m and -D
-  [255]
-
-  $ hg book -Draster-fix
-  abort: Error, please check your command
-  (make sure to put a space between -D and your bookmark name)
-  [255]
-
-Test that direct access make changesets visible
-
-  $ hg export 2db36d8066ff 02bcbc3f6e56
-  # HG changeset patch
-  # User test
-  # Date 0 0
-  #      Thu Jan 01 00:00:00 1970 +0000
-  # Node ID 2db36d8066ff50e8be3d3e6c2da1ebc0a8381d82
-  # Parent  7df62a38b9bf9daf968de235043ba88a8ef43393
-  add cD
-  
-  diff -r 7df62a38b9bf -r 2db36d8066ff cD
-  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/cD	Thu Jan 01 00:00:00 1970 +0000
-  @@ -0,0 +1,1 @@
-  +cD
-  # HG changeset patch
-  # User test
-  # Date 0 0
-  #      Thu Jan 01 00:00:00 1970 +0000
-  # Node ID 02bcbc3f6e56fb2928efec2c6e24472720bf5511
-  # Parent  54ccbc537fc2d6845a5d61337c1cfb80d1d2815e
-  add cB
-  
-  diff -r 54ccbc537fc2 -r 02bcbc3f6e56 cB
-  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/cB	Thu Jan 01 00:00:00 1970 +0000
-  @@ -0,0 +1,1 @@
-  +cB
-
-But only with hash
-
-  $ hg export 2db36d8066ff::
-  # HG changeset patch
-  # User test
-  # Date 0 0
-  #      Thu Jan 01 00:00:00 1970 +0000
-  # Node ID 2db36d8066ff50e8be3d3e6c2da1ebc0a8381d82
-  # Parent  7df62a38b9bf9daf968de235043ba88a8ef43393
-  add cD
-  
-  diff -r 7df62a38b9bf -r 2db36d8066ff cD
-  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
-  +++ b/cD	Thu Jan 01 00:00:00 1970 +0000
-  @@ -0,0 +1,1 @@
-  +cD
-
-  $ hg export 1 3
-  abort: hidden revision '1'!
-  (use --hidden to access hidden revisions)
-  [255]
-
-
-Test directaccess in a larger revset
-
-  $ hg log -r '. + .^ + 2db36d8066ff' -T '{node|short}\n'
-  55c73a90e4b4
-  cf5c4f4554ce
-  2db36d8066ff
-
-Test directaccess only takes hashes
-
-  $ HOOKPATH=$TESTTMP/printexplicitaccess.py
-  $ cat >> $HOOKPATH <<EOF
-  > def hook(ui, repo, **kwds):
-  >     for i in sorted(repo._explicitaccess):
-  >         ui.write('directaccess: %s\n' % i)
-  > EOF
-
-  $ hg log -r 1 -r 2 -r 2db36d8066f -T '{rev}\n' --config hooks.post-log=python:$HOOKPATH:hook
-  1
-  2
-  3
-  directaccess: 3
-
-With severals hidden sha, rebase of one hidden stack onto another one:
-  $ hg update -C 0
-  0 files updated, 0 files merged, 4 files removed, 0 files unresolved
-  $ mkcommit cK
-  created new head
-  $ mkcommit cL
-  $ hg update -C 9
-  4 files updated, 0 files merged, 2 files removed, 0 files unresolved
-  $ hg log -G
-  o  11:53a94305e133 add cL
-  |
-  o  10:ad78ff7d621f add cK
-  |
-  | @  9:55c73a90e4b4 add cJ
-  | |
-  | | o  7:18214586bf78 add cJ
-  | |/
-  | o  6:cf5c4f4554ce add cH
-  | |
-  | o  5:5419eb264a33 add cG
-  | |
-  | o  4:98065434e5c6 add cE
-  |/
-  o  0:54ccbc537fc2 add cA
-  
-  $ hg strip --hidden 10:
-  2 changesets pruned
-  $ hg log -G
-  @  9:55c73a90e4b4 add cJ
-  |
-  | o  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-  $ hg rebase -s 10 -d 3 
-  abort: hidden revision '3'!
-  (use --hidden to access hidden revisions)
-  [255]
-  $ hg rebase -r ad78ff7d621f -r 53a94305e133 -d  2db36d8066ff --config experimental.rebaseskipobsolete=0
-  Warning: accessing hidden changesets 2db36d8066ff for write operation
-  Warning: accessing hidden changesets ad78ff7d621f,53a94305e133 for write operation
-  rebasing 10:ad78ff7d621f "add cK"
-  rebasing 11:53a94305e133 "add cL"
-  $ hg log -G
-  o  13:2f7b7704d714 add cL
-  |
-  o  12:fe1634cbe235 add cK
-  |
-  | @  9:55c73a90e4b4 add cJ
-  | |
-  | | o  7:18214586bf78 add cJ
-  | |/
-  | o  6:cf5c4f4554ce add cH
-  | |
-  | o  5:5419eb264a33 add cG
-  | |
-  | o  4:98065434e5c6 add cE
-  | |
-  o |  3:2db36d8066ff add cD
-  | |
-  o |  2:7df62a38b9bf add cC
-  | |
-  o |  1:02bcbc3f6e56 add cB
-  |/
-  o  0:54ccbc537fc2 add cA
-  
-
-Check that amending in the middle of a stack does not show obsolete revs
-Since we are doing operation in the middle of the stack we cannot just
-have createmarkers as we are creating instability
-
-  $ cat >> $HGRCPATH <<EOF
-  > [experimental]
-  > evolution=all
-  > EOF
-
-  $ hg strip --hidden 1::
-  5 changesets pruned
-  $ hg log -G
-  @  9:55c73a90e4b4 add cJ
-  |
-  | o  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-  $ hg up 7
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ mkcommit cL
-  $ mkcommit cM
-  $ mkcommit cN
-  $ hg log -G
-  @  16:a438c045eb37 add cN
-  |
-  o  15:2d66e189f5b5 add cM
-  |
-  o  14:d66ccb8c5871 add cL
-  |
-  | o  9:55c73a90e4b4 add cJ
-  | |
-  o |  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-  $ hg up 15
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo "mmm" >> cM
-  $ hg amend
-  $ hg log -G
-  @  18:210589181b14 add cM
-  |
-  | o  16:a438c045eb37 add cN
-  | |
-  | o  15:2d66e189f5b5 add cM
-  |/
-  o  14:d66ccb8c5871 add cL
-  |
-  | o  9:55c73a90e4b4 add cJ
-  | |
-  o |  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-Check that rebasing a commit twice makes the commit visible again
-
-  $ hg rebase -d 18 -r 16 --keep
-  rebasing 16:a438c045eb37 "add cN"
-  $ hg log -r 14:: -G
-  o  19:104eed5354c7 add cN
-  |
-  @  18:210589181b14 add cM
-  |
-  | o  16:a438c045eb37 add cN
-  | |
-  | o  15:2d66e189f5b5 add cM
-  |/
-  o  14:d66ccb8c5871 add cL
-  |
-  ~
-  $ hg strip -r 210589181b14
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at d66ccb8c5871
-  2 changesets pruned
-
-Using a hash prefix solely made of digits should work
-  $ hg update 210589181
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg rebase -d 18 -r 16 --keep
-  rebasing 16:a438c045eb37 "add cN"
-  $ hg log -r 14:: -G
-  o  19:104eed5354c7 add cN
-  |
-  @  18:210589181b14 add cM
-  |
-  | o  16:a438c045eb37 add cN
-  | |
-  | o  15:2d66e189f5b5 add cM
-  |/
-  o  14:d66ccb8c5871 add cL
-  |
-  ~
-
-Test prunestrip
-
-  $ hg book foo -r 104eed5354c7
-  $ hg strip -r 210589181b14
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at d66ccb8c5871
-  2 changesets pruned
-  $ hg log -r 14:: -G -T '{rev}:{node|short} {desc|firstline} {bookmarks}\n'
-  o  16:a438c045eb37 add cN
-  |
-  o  15:2d66e189f5b5 add cM
-  |
-  @  14:d66ccb8c5871 add cL foo
-  |
-  ~
-
-Check that --hidden used with inhibit does not hide every obsolete commit
-We show the log before and after a log -G --hidden, they should be the same
-  $ hg log -G
-  o  16:a438c045eb37 add cN
-  |
-  o  15:2d66e189f5b5 add cM
-  |
-  @  14:d66ccb8c5871 add cL
-  |
-  | o  9:55c73a90e4b4 add cJ
-  | |
-  o |  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-  $ hg log -G --hidden
-  x  19:104eed5354c7 add cN
-  |
-  x  18:210589181b14 add cM
-  |
-  | x  17:b3c3274523f9 temporary amend commit for 2d66e189f5b5
-  | |
-  | | o  16:a438c045eb37 add cN
-  | |/
-  | o  15:2d66e189f5b5 add cM
-  |/
-  @  14:d66ccb8c5871 add cL
-  |
-  | x  13:2f7b7704d714 add cL
-  | |
-  | x  12:fe1634cbe235 add cK
-  | |
-  | | x  11:53a94305e133 add cL
-  | | |
-  | | x  10:ad78ff7d621f add cK
-  | | |
-  | | | o  9:55c73a90e4b4 add cJ
-  | | | |
-  +-------x  8:e84f73d9ad36 temporary amend commit for 18214586bf78
-  | | | |
-  o-----+  7:18214586bf78 add cJ
-   / / /
-  | | o  6:cf5c4f4554ce add cH
-  | | |
-  | | o  5:5419eb264a33 add cG
-  | | |
-  | | o  4:98065434e5c6 add cE
-  | |/
-  x |  3:2db36d8066ff add cD
-  | |
-  x |  2:7df62a38b9bf add cC
-  | |
-  x |  1:02bcbc3f6e56 add cB
-  |/
-  o  0:54ccbc537fc2 add cA
-  
-
-  $ hg log -G
-  o  16:a438c045eb37 add cN
-  |
-  o  15:2d66e189f5b5 add cM
-  |
-  @  14:d66ccb8c5871 add cL
-  |
-  | o  9:55c73a90e4b4 add cJ
-  | |
-  o |  7:18214586bf78 add cJ
-  |/
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
- 
-check that pruning and inhibited node does not confuse anything
-
-  $ hg up --hidden 210589181b14
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg strip --bundle 210589181b14
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  saved backup bundle to $TESTTMP/inhibit/.hg/strip-backup/210589181b14-e09c7b88-backup.hg (glob)
-  $ hg unbundle .hg/strip-backup/210589181b14-e09c7b88-backup.hg # restore state
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 1 changes to 2 files (+1 heads)
-  (run 'hg heads .' to see heads, 'hg merge' to merge)
-
- Only allow direct access and check that evolve works like before
-(also disable evolve commands to avoid hint about using evolve)
-  $ cat >> $HGRCPATH <<EOF
-  > [extensions]
-  > inhibit=!
-  > [experimental]
-  > evolution=createmarkers
-  > EOF
-
-  $ hg up 15
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory parent is obsolete! (2d66e189f5b5)
-  $ cat >> $HGRCPATH <<EOF
-  > [experimental]
-  > evolution=all
-  > EOF
-  $ echo "CM" > cM
-  $ hg amend
-  $ hg log -G
-  @  21:721c3c279519 add cM
-  |
-  | o  16:a438c045eb37 add cN
-  | |
-  | x  15:2d66e189f5b5 add cM
-  |/
-  o  14:d66ccb8c5871 add cL
-  |
-  o  7:18214586bf78 add cJ
-  |
-  o  6:cf5c4f4554ce add cH
-  |
-  o  5:5419eb264a33 add cG
-  |
-  o  4:98065434e5c6 add cE
-  |
-  o  0:54ccbc537fc2 add cA
-  
-  $ cat >> $HGRCPATH <<EOF
-  > [extensions]
-  > EOF
-  $ echo "inhibit=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/hack/inhibit.py" >> $HGRCPATH
-
-Empty commit
-  $ hg amend
-  nothing changed
-  [1]
-
-Check that the behavior of rebase with obsolescence markers is maintained
-despite inhibit
-
-  $ hg up a438c045eb37
-  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg rebase -r 15:: -d 21 --config experimental.rebaseskipobsolete=True
-  note: not rebasing 15:2d66e189f5b5 "add cM", already in destination as 21:721c3c279519 "add cM"
-  rebasing 16:a438c045eb37 "add cN"
-  $ hg up -q 2d66e189f5b5 # To inhibit it as the rest of test depends on it
-  $ hg up -q 21
-
-Directaccess should load after some extensions precised in the conf
-With no extension specified:
-
-  $ cat >$TESTTMP/test_extension.py  << EOF
-  > from mercurial import extensions
-  > def uisetup(ui):
-  >   print extensions._order
-  > EOF
-  $ cat >> $HGRCPATH << EOF
-  > [extensions]
-  > testextension=$TESTTMP/test_extension.py
-  > EOF
-  $ hg id
-  ['rebase', 'strip', 'evolve', 'directaccess', 'inhibit', 'testextension']
-  721c3c279519
-
-With test_extension specified:
-  $ cat >> $HGRCPATH << EOF
-  > [directaccess]
-  > loadsafter=testextension
-  > EOF
-  $ hg id
-  ['rebase', 'strip', 'evolve', 'inhibit', 'testextension', 'directaccess']
-  721c3c279519
-
-Inhibit should not work without directaccess
-  $ cat >> $HGRCPATH <<EOF
-  > [extensions]
-  > directaccess=!
-  > testextension=!
-  > EOF
-  $ hg up .
-  cannot use inhibit without the direct access extension
-  (please enable it or inhibit won't work)
-  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ echo "directaccess=$(echo $(dirname $TESTDIR))/hgext3rd/evolve/hack/directaccess.py" >> $HGRCPATH
-  $ cd ..
-
-hg push should not allow directaccess unless forced with --hidden
-We copy the inhibhit repo to inhibit2 and make some changes to push to inhibit
-
-  $ cp -r inhibit inhibit2
-  $ pwd=$(pwd)
-  $ cd inhibit
-  $ mkcommit pk
-  created new head
-  $ hg id
-  003a4735afde tip
-  $ echo "OO" > pk
-  $ hg amend
-  $ hg id
-  71eb4f100663 tip
-
-Hidden commits cannot be pushed without --hidden
-  $ hg push -r 003a4735afde $pwd/inhibit2
-  pushing to $TESTTMP/inhibit2
-  abort: hidden revision '003a4735afde'!
-  (use --hidden to access hidden revisions)
-  [255]
-
-Visible commits can still be pushed
-  $ hg push -fr 71eb4f100663 $pwd/inhibit2
-  pushing to $TESTTMP/inhibit2
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  2 new obsolescence markers
-
-Create a stack (obsolete with successor in dest) -> (not obsolete) and rebase
-it. We expect to not see the stack at the end of the rebase.
-  $ hg log -G  -r "25::"
-  @  25:71eb4f100663 add pk
-  |
-  ~
-  $ hg up -C 22
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit Dk
-  $ hg prune 22 -s 25
-  1 changesets pruned
-  $ hg rebase -s 22 -d 25 --config experimental.rebaseskipobsolete=True
-  note: not rebasing 22:46cb6daad392 "add cN", already in destination as 25:71eb4f100663 "add pk"
-  rebasing 26:7ad60e760c7b "add Dk" (tip)
-  $ hg log -G  -r "25::"
-  @  27:1192fa9fbc68 add Dk
-  |
-  o  25:71eb4f100663 add pk
-  |
-  ~
-
-Create a stack (obsolete with succ in dest) -> (not obsolete) -> (not obsolete).
-Rebase the first two revs of the stack onto dest, we expect to see one new
-revision on the destination and everything visible.
-  $ hg up 25
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ mkcommit Dl
-  created new head
-  $ mkcommit Dp
-  $ mkcommit Do
-  $ hg log -G -r "71eb4f100663::"
-  @  30:b517facce1ef add Do
-  |
-  o  29:c5a47ab27c2e add Dp
-  |
-  o  28:8c1c2edbaf1b add Dl
-  |
-  | o  27:1192fa9fbc68 add Dk
-  |/
-  o  25:71eb4f100663 add pk
-  |
-  ~
-  $ hg prune 8c1c2edbaf1b -s 1192fa9fbc68
-  1 changesets pruned
-  $ hg up 71eb4f100663
-  0 files updated, 0 files merged, 3 files removed, 0 files unresolved
-  $ hg rebase -r "8c1c2edbaf1b + c5a47ab27c2e" --keep -d 1192fa9fbc68 --config experimental.rebaseskipobsolete=True
-  note: not rebasing 28:8c1c2edbaf1b "add Dl", already in destination as 27:1192fa9fbc68 "add Dk"
-  rebasing 29:c5a47ab27c2e "add Dp"
-  $ hg log -G  -r "71eb4f100663::"
-  o  31:7d8affb1f604 add Dp
-  |
-  | o  30:b517facce1ef add Do
-  | |
-  | o  29:c5a47ab27c2e add Dp
-  | |
-  | o  28:8c1c2edbaf1b add Dl
-  | |
-  o |  27:1192fa9fbc68 add Dk
-  |/
-  @  25:71eb4f100663 add pk
-  |
-  ~
-
-Rebase the same stack in full on the destination, we expect it to disappear
-and only see the top revision added to destination. We don\'t expect 29 to be
-skipped as we used --keep before.
-  $ hg rebase -s 8c1c2edbaf1b -d 1192fa9fbc68 --config experimental.rebaseskipobsolete=True
-  note: not rebasing 28:8c1c2edbaf1b "add Dl", already in destination as 27:1192fa9fbc68 "add Dk"
-  rebasing 29:c5a47ab27c2e "add Dp"
-  rebasing 30:b517facce1ef "add Do"
-  $ hg log -G  -r "71eb4f100663::"
-  o  32:1d43fff9e26f add Do
-  |
-  o  31:7d8affb1f604 add Dp
-  |
-  o  27:1192fa9fbc68 add Dk
-  |
-  @  25:71eb4f100663 add pk
-  |
-  ~
-
-Pulling from a inhibit repo to a non-inhibit repo should work
-
-  $ cd ..
-  $ hg clone -q inhibit not-inhibit
-  $ cat >> not-inhibit/.hg/hgrc <<EOF
-  > [extensions]
-  > inhibit=!
-  > directaccess=!
-  > evolve=!
-  > EOF
-  $ cd not-inhibit
-  $ hg book -d foo
-  $ hg pull
-  pulling from $TESTTMP/inhibit (glob)
-  searching for changes
-  no changes found
-  adding remote bookmark foo
-
-Test that bookmark -D can take multiple branch names
-  $ cd ../inhibit
-  $ hg bookmark book2 book1 book3
-  $ touch foo && hg add foo && hg ci -m "add foo"
-  created new head
-  $ hg up book1
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  (activating bookmark book1)
-  $ hg bookmark -D book2 book3
-  bookmark 'book2' deleted
-  bookmark 'book3' deleted
-  1 changesets pruned
--- a/tests/test-obsolete.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-obsolete.t	Fri Oct 20 18:44:52 2017 +0200
@@ -143,7 +143,7 @@
   $ qlog -r 'suspended()'
   3
   - 0d3f46688ccc
-  $ qlog -r 'unstable()'
+  $ qlog -r "orphan()"
   5
   - a7a6f2b5d8a5
 
@@ -573,7 +573,7 @@
   |
   o  0 - (public) 1f0dee641bb7 add a
   
-  $ hg log -r 'bumped()'
+  $ hg log -r 'phasedivergent()'
   changeset:   12:6db5e282cb91
   tag:         tip
   parent:      10:2033b4e49474
@@ -666,7 +666,7 @@
   phases: 3 draft
   bumped: 1 changesets
   $ hg debugobsolete `getid a7a6f2b5d8a5` `getid 50f11e5e3a63`
-  $ hg log -r 'divergent()'
+  $ hg log -r 'contentdivergent()'
   changeset:   12:6db5e282cb91
   parent:      10:2033b4e49474
   user:        test
--- a/tests/test-sharing.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-sharing.t	Fri Oct 20 18:44:52 2017 +0200
@@ -513,7 +513,7 @@
   base: [4] fix bug 24 (v1)
   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
   working directory is now at 5ad6037c046c
-  $ hg log -q -r 'divergent()'
+  $ hg log -q -r 'contentdivergent()'
 
 Figure SG10: Bob's repository after fixing divergence.
   $ hg --hidden shortlog -G -r 3::
--- a/tests/test-stabilize-conflict.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-stabilize-conflict.t	Fri Oct 20 18:44:52 2017 +0200
@@ -65,7 +65,7 @@
   $ safesed 's/huit/eight/' babar
   $ hg diff
   diff -r 9d5daf8bd956 babar
-  --- a/babar	Thu Jan 01 00:00:00 1970 +0000
+  --- a/babar	* (glob)
   +++ b/babar	* (glob)
   @@ -5,6 +5,6 @@
    cinq
@@ -160,7 +160,7 @@
   
 (fix the conflict and continue)
 
-  $ hg revert -r 71c18f70c34f --all
+  $ hg revert -r 5 --all
   reverting babar
   $ safesed 's/dix/ten/' babar
   $ hg resolve --all -m
--- a/tests/test-stabilize-order.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-stabilize-order.t	Fri Oct 20 18:44:52 2017 +0200
@@ -89,7 +89,7 @@
 
 Test stabilizing a descendant predecessor's child
 
-  $ hg up -r 005fe5914f78
+  $ hg up 7
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ hg debugobsolete > successors.old
   $ hg evolve -v
@@ -133,7 +133,7 @@
 
 Test behavior with --any
 
-  $ hg up 81b8bbcd5892
+  $ hg up 8
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ echo b >> b
   $ hg amend
@@ -149,7 +149,7 @@
   |
   o  0:c471ef929e6a@default(draft) addroot
   
-  $ hg up 0f691739f917
+  $ hg up 9
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg evolve -v
   nothing to evolve on current working copy parent
--- a/tests/test-stabilize-result.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-stabilize-result.t	Fri Oct 20 18:44:52 2017 +0200
@@ -86,7 +86,7 @@
   fix conflict and run 'hg evolve --continue' or use 'hg update -C .' to abort
   abort: unresolved merge conflicts (see hg help resolve)
   [255]
-  $ hg revert -r 'unstable()' a
+  $ hg revert -r "orphan()" a
   $ hg diff
   diff -r 66719795a494 a
   --- a/a	* (glob)
@@ -341,7 +341,7 @@
   2 new divergent changesets
 # reamend so that the case is not the first precursor.
   $ hg amend -m "More addition (2)"
-  $ hg phase 'divergent()'
+  $ hg phase 'contentdivergent()'
   21: draft
   24: draft
   $ hg evolve -qn --contentdivergent
--- a/tests/test-touch.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-touch.t	Fri Oct 20 18:44:52 2017 +0200
@@ -18,7 +18,7 @@
 Basic usage
 
   $ hg log -G
-  @  0:[0-9a-f]{12} a (re)
+  @  0:e93df3427f45 a
   
   $ hg touch .
   $ hg log -G
@@ -50,18 +50,16 @@
   
   o  3:[0-9a-f]{12} ab (re)
   
-  $ hg prune 4
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  working directory now at 000000000000
+  $ hg prune 3
   1 changesets pruned
 
 Duplicate
 
   $ hg touch --duplicate .
   $ hg log -G
-  @  5:[0-9a-f]{12} (re)
+  @  5:[0-9a-f]{12} a (re)
   
-  o  3:[0-9a-f]{12} ab (re)
+  o  4:[0-9a-f]{12} a (re)
   
 
 Multiple touch
@@ -77,19 +75,19 @@
   |
   o  6:[0-9a-f]{12} c (re)
   |
-  o  5:[0-9a-f]{12} (re)
+  o  5:[0-9a-f]{12} a (re)
   
-  o  3:[0-9a-f]{12} ab (re)
+  o  4:[0-9a-f]{12} a (re)
   
-  $ hg touch .^:.
+  $ hg touch 6:7
   $ hg log -G
   @  9:[0-9a-f]{12} d (re)
   |
   o  8:[0-9a-f]{12} c (re)
   |
-  o  5:[0-9a-f]{12} (re)
+  o  5:[0-9a-f]{12} a (re)
   
-  o  3:[0-9a-f]{12} ab (re)
+  o  4:[0-9a-f]{12} a (re)
   
 
 check move data kept after rebase on touch:
@@ -109,36 +107,8 @@
   $ hg touch
   1 new unstable changesets
 
-  $ hg log -G --hidden
-  | o  10:[0-9a-f]{12} move (re)
-  |
-  | x  9:[0-9a-f]{12} gna1 (re)
-  | |
-  | x  6:[0-9a-f]{12} d (re)
-  |/
-  | x  5:[0-9a-f]{12} c (re)
-  |
-  o  8:[0-9a-f]{12} c (re)
-  |
-  | x  7:[0-9a-f]{12} d (re)
-  | |
-  | x  6:[0-9a-f]{12} c (re)
-  |/
-  o  5:[0-9a-f]{12} (re)
-  
-  x  4:[0-9a-f]{12} a (re)
-  
-  o  3:[0-9a-f]{12} ab (re)
-  
-  x  2:[0-9a-f]{12} temporary amend commit for [0-9a-f]{12} (re)
-  |
-  x  1:[0-9a-f]{12} a (re)
-  
-  x  0:[0-9a-f]{12} a (re)
-  
-
   $ hg rebase -s 11 -d 12
-  rebasing 11:[0-9a-f]{12} "move" (re)
+  rebasing 11:* "move" (glob)
   $ hg st -C --change=tip
   A gna2
     gna1
--- a/tests/test-tutorial.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-tutorial.t	Fri Oct 20 18:44:52 2017 +0200
@@ -1800,11 +1800,11 @@
       }
 #endif
 
-  $ hg log -r "unstable()"
+  $ hg log -r "orphan()"
   99f039c5ec9e (draft): SPAM SPAM SPAM
 
 #if docgraph-ext
-  $ hg docgraph -r "unstable()" --sphinx-directive --rankdir LR #rest-ignore
+  $ hg docgraph -r "orphan()" --sphinx-directive --rankdir LR #rest-ignore
   .. graphviz::
   
       strict digraph  {
--- a/tests/test-userguide.t	Wed Sep 27 01:22:58 2017 +0200
+++ b/tests/test-userguide.t	Fri Oct 20 18:44:52 2017 +0200
@@ -71,7 +71,7 @@
   1 changesets pruned
   $ hg parents --template '{rev}:{node|short}  {desc|firstline}\n'
   3:934359450037  implement feature Y
-  $ hg --hidden shortlog -G -r 3:
+  $ hg --hidden shortlog -G -r 934359450037:
   x  4:a3e0ef24aaf0  draft  debug hack
   |
   @  3:934359450037  draft  implement feature Y
@@ -85,7 +85,7 @@
   $ hg uncommit file2.c
   $ hg status
   M file2.c
-  $ hg --hidden shortlog -G -r 'descendants(3) - 4'
+  $ hg --hidden shortlog -G -r 'descendants(934359450037) - a3e0ef24aaf0'
   @  6:c8defeecf7a4  draft  fix bug 234
   |
   | x  5:da4331967f5f  draft  fix bug 234
@@ -105,14 +105,14 @@
   $ hg commit -m 'step 2'
   $ echo step3 >> file2.c
   $ hg commit -m 'step 3'
-  $ hg log --template '{rev}:{node|short}  {desc|firstline}\n' -r 7::
+  $ hg log --template '{rev}:{node|short}  {desc|firstline}\n' -r 05e61aab8294::
   7:05e61aab8294  step 1
   8:be6d5bc8e4cc  step 2
   9:35f432d9f7c1  step 3
-  $ hg fold -d '0 0' -m 'fix bug 64' --from -r 7::
+  $ hg fold -d '0 0' -m 'fix bug 64' --from -r 05e61aab8294::
   3 changesets folded
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg --hidden shortlog -G -r 6::
+  $ hg --hidden shortlog -G -r c8defeecf7a4::
   @  10:171c6a79a27b  draft  fix bug 64
   |
   | x  9:35f432d9f7c1  draft  step 3
@@ -124,13 +124,13 @@
   o  6:c8defeecf7a4  draft  fix bug 234
   |
   ~
-  $ hg --hidden log -q -r 'successors(7) | successors(8) | successors(9)'
+  $ hg --hidden log -q -r 'successors(05e61aab8294) | successors(be6d5bc8e4cc) | successors(35f432d9f7c1)'
   10:171c6a79a27b
-  $ hg --hidden log -q -r 'precursors(10)'
+  $ hg --hidden log -q -r 'precursors(171c6a79a27b)'
   7:05e61aab8294
   8:be6d5bc8e4cc
   9:35f432d9f7c1
-  $ hg diff -c 10 -U 0
+  $ hg diff -c 171c6a79a27b -U 0
   diff -r c8defeecf7a4 -r 171c6a79a27b file1.c
   --- a/file1.c	Thu Jan 01 00:00:10 1970 +0000
   +++ b/file1.c	Thu Jan 01 00:00:00 1970 +0000
@@ -150,7 +150,7 @@
   $ hg commit -u bob -d '4 0' -m 'cleanup'
   $ echo 'new feature' >> file1.c
   $ hg commit -u bob -d '5 0' -m 'feature 23'
-  $ hg --hidden shortlog -G -r 10::
+  $ hg --hidden shortlog -G -r 171c6a79a27b::
   @  13:dadcbba2d606  draft  feature 23
   |
   o  12:debd46bb29dc  draft  cleanup
@@ -162,16 +162,16 @@
   ~
 
 example 7: amend an older changeset (figures 6, 7)
-  $ hg update -q 11
+  $ hg update -q -r 3e1cb8f70c02
   $ echo 'fix fix fix fix' > file2.c
   $ hg amend -u bob -d '6 0'
   2 new unstable changesets
   $ hg shortlog -r 'obsolete()'
   11:3e1cb8f70c02  draft  fix bug 17
-  $ hg shortlog -r 'unstable()'
+  $ hg shortlog -r "orphan()"
   12:debd46bb29dc  draft  cleanup
   13:dadcbba2d606  draft  feature 23
-  $ hg --hidden shortlog -G -r 10::
+  $ hg --hidden shortlog -G -r 171c6a79a27b::
   @  15:395cbeda3a06  draft  fix bug 17
   |
   | x  14:f7fab707e247  draft  temporary amend commit for 3e1cb8f70c02
@@ -186,7 +186,7 @@
   |
   ~
   $ hg evolve -q --all
-  $ hg shortlog -G -r 10::
+  $ hg shortlog -G -r 171c6a79a27b::
   @  17:91b4b0f8b5c5  draft  feature 23
   |
   o  16:fe8858bd9bc2  draft  cleanup
@@ -204,7 +204,7 @@
   $ hg commit -u carl -d '8 0' -m 'debug hack'
   $ echo 'more useful' >> file1.c
   $ hg commit -u carl -d '9 0' -m 'more work'
-  $ hg shortlog -G -r 17::
+  $ hg shortlog -G -r 91b4b0f8b5c5::
   @  20:ea8fafca914b  draft  more work
   |
   o  19:b23d06b457a8  draft  debug hack
@@ -216,19 +216,17 @@
   ~
 
 example 8: prune an older changeset (figures 8, 9)
-  $ hg prune 19
+  $ hg prune b23d06b457a8
   1 changesets pruned
   1 new unstable changesets
-  $ hg --hidden shortlog -G -r 18::
+  $ hg --hidden shortlog -G -r b23d06b457a8::
   @  20:ea8fafca914b  draft  more work
   |
   x  19:b23d06b457a8  draft  debug hack
   |
-  o  18:1f33e68b18b9  draft  useful work
-  |
   ~
   $ hg evolve -q --all --any
-  $ hg --hidden shortlog -G -r 18::
+  $ hg --hidden shortlog -G -r 1f33e68b18b9::
   @  21:4393e5877437  draft  more work
   |
   | x  20:ea8fafca914b  draft  more work
@@ -246,9 +244,9 @@
   $ hg commit -u dan -d '11 0' -m 'fix bug 53'
   $ echo 'and this handles bug 67' >> file1.c
   $ hg commit -u dan -d '12 0' -m 'fix bug 67'
-  $ hg update 22
+  $ hg update -r f84357446753
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg shortlog -G -r 21::
+  $ hg shortlog -G -r 4393e5877437::
   o  23:4db2428c8ae3  draft  fix bug 67
   |
   @  22:f84357446753  draft  fix bug 53
@@ -265,7 +263,7 @@
   move:[23] fix bug 67
   atop:[24] fix bug 53
   working directory is now at 0d972d6888e6
-  $ hg --hidden shortlog -G -r 21::
+  $ hg --hidden shortlog -G -r 4393e5877437::
   @  25:0d972d6888e6  draft  fix bug 67
   |
   o  24:71bb83d674c5  draft  fix bug 53
@@ -286,9 +284,9 @@
   $ hg commit -u dan -d '11 0' -m 'fix a bug'
   $ echo 'new feature' >> file1.c
   $ hg commit -u dan -d '12 0' -m 'new feature'
-  $ hg update 26
+  $ hg update 5b31a1239ab9
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg --hidden shortlog -G -r 25::
+  $ hg --hidden shortlog -G -r 0d972d6888e6::
   o  27:fbb3c6d50427  draft  new feature
   |
   @  26:5b31a1239ab9  draft  fix a bug