Mercurial > evolve
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