# HG changeset patch # User Pierre-Yves David # Date 1574934524 -3600 # Node ID 844c9eb2400fcc1e8f42b8a6a96febf89f2b1842 # Parent f3e39a35437852b1cec8898d6bfb6acba315012e# Parent 4f3c87584a4a56b52cf87f2139035577bfa7067e test-compat: merge stable into mercurial-5.1 diff -r f3e39a354378 -r 844c9eb2400f .gitlab-ci.yml --- a/.gitlab-ci.yml Wed Oct 23 01:11:13 2019 +0200 +++ b/.gitlab-ci.yml Thu Nov 28 10:48:44 2019 +0100 @@ -1,12 +1,36 @@ flake8: + image: octobus/ci-py2-hgext3rd + script: + - hg files -0 'set:(**.py or grep("^#!.*python")) - removed()' -X hgext3rd/evolve/thirdparty | xargs -0 flake8 + +tests-py2-cext: + image: octobus/ci-py2-hgext3rd script: - - pip install --user flake8 - - hg files -0 'set:(**.py or grep("^#!.*python")) - removed()' -X hgext3rd/evolve/thirdparty | xargs -0 ~/.local/bin/flake8 -tests: + - hg pull -R /ci/repos/mercurial/ + - hg_rev=$(tests/testlib/map-hg-rev.sh "$(hg log -r . -T '{branch}')") + - hg -R /ci/repos/mercurial/ update "$hg_rev" + - (cd tests; /ci/repos/mercurial/tests/run-tests.py --color=always) + +tests-py2-pure: + image: octobus/ci-py2-hgext3rd script: - - echo $PWD - - rm -rf /tmp/mercurial-clone-`hg log -r . -T "{node}"` - - hg clone https://mirror.octobus.net/hg/ /tmp/mercurial-clone-`hg log -r . -T "{node}"` --config share.pool=/tmp/ - - hg -R /tmp/mercurial-clone-`hg log -r . -T "{node}"` update `hg log -r . -T '{branch}'` - - (cd tests; /tmp/mercurial-clone-`hg log -r . -T "{node}"`/tests/run-tests.py -j 3) - - rm -rf /tmp/mercurial-clone-`hg log -r . -T "{node}"` + - hg pull -R /ci/repos/mercurial/ + - hg_rev=$(tests/testlib/map-hg-rev.sh "$(hg log -r . -T '{branch}')") + - hg -R /ci/repos/mercurial/ update "$hg_rev" + - (cd tests; /ci/repos/mercurial/tests/run-tests.py --color=always --pure) + +tests-py3-cext: + image: octobus/ci-py3-hgext3rd + script: + - hg pull -R /ci/repos/mercurial/ + - hg_rev=$(tests/testlib/map-hg-rev.sh "$(hg log -r . -T '{branch}')") + - hg -R /ci/repos/mercurial/ update "$hg_rev" + - (cd tests; python3 /ci/repos/mercurial/tests/run-tests.py --color=always) + +tests-py3-pure: + image: octobus/ci-py3-hgext3rd + script: + - hg pull -R /ci/repos/mercurial/ + - hg_rev=$(tests/testlib/map-hg-rev.sh "$(hg log -r . -T '{branch}')") + - hg -R /ci/repos/mercurial/ update "$hg_rev" + - (cd tests; python3 /ci/repos/mercurial/tests/run-tests.py --color=always --pure) diff -r f3e39a354378 -r 844c9eb2400f CHANGELOG --- a/CHANGELOG Wed Oct 23 01:11:13 2019 +0200 +++ b/CHANGELOG Thu Nov 28 10:48:44 2019 +0100 @@ -6,6 +6,13 @@ * pick: don't create any successors when there were no changes (issue6093), * metaedit: don't change commit date by default (issue5994), + * rewind: preserve date + * py3: fix setup.py --version + * py3: fix documentation generation + * debian: allow to build with python 3 + * topic: add more options to command synopsis string + * evolve: use more often seen metavariables in command synopsis strings + * documentation: update text and add missing figures 9.2.1 -- 2019-10-05 ------------------- diff -r f3e39a354378 -r 844c9eb2400f README --- a/README Wed Oct 23 01:11:13 2019 +0200 +++ b/README Thu Nov 28 10:48:44 2019 +0100 @@ -116,16 +116,17 @@ .. _evolution: https://bz.mercurial-scm.org/buglist.cgi?component=evolution&query_format=advanced&resolution=--- -You can use the patchbomb extension to send email to `mercurial devel -`_. Please make -sure to use the evolve-ext flag when doing so. You can use a command like -this:: +The recommended way is to create Merge Request on +https://dev.heptapod.net/mercurial/evolve. To do so, create an account and +request access. You'll then be able to create topic based merge request. + +Alternatively, you can use the patchbomb extension to send email to `mercurial +devel `_. +Please make sure to use the evolve-ext flag when doing so. You can use a +command like this:: $ hg email --to mercurial-devel@mercurial-scm.org --flag evolve-ext --rev '' -Some of development happens on a public bitbucket repository (`evolve-devel`_) using the topic extension. - -.. _`evolve-devel`: https://bitbucket.org/octobus/evolve-devel For guidelines on the patch description, see the `official Mercurial guideline`_. diff -r f3e39a354378 -r 844c9eb2400f debian/changelog --- a/debian/changelog Wed Oct 23 01:11:13 2019 +0200 +++ b/debian/changelog Thu Nov 28 10:48:44 2019 +0100 @@ -1,4 +1,13 @@ -mercurial-evolve (9.2.1-1) UNRELEASED; urgency=medium +mercurial-evolve (9.2.1-1.1) UNRELEASED; urgency=medium + + * build with pybuild and sphinxdoc + * update debhelper compat to 10 + * build with Python 3, keeping Python 2 build until there exists a mercurial + package in Debian built with Python 3 + + -- Denis Laxalde Tue, 15 Oct 2019 11:41:40 +0200 + +mercurial-evolve (9.2.1-1) unstable; urgency=medium * new upstream release diff -r f3e39a354378 -r 844c9eb2400f debian/compat --- a/debian/compat Wed Oct 23 01:11:13 2019 +0200 +++ b/debian/compat Thu Nov 28 10:48:44 2019 +0100 @@ -1,1 +1,1 @@ -8 +10 diff -r f3e39a354378 -r 844c9eb2400f debian/control --- a/debian/control Wed Oct 23 01:11:13 2019 +0200 +++ b/debian/control Thu Nov 28 10:48:44 2019 +0100 @@ -9,20 +9,27 @@ Build-Depends: mercurial (>= 4.5), python, - debhelper (>= 8), + python3, + debhelper (>= 10), + dh-python, python-sphinx (>= 1.0.8), imagemagick, librsvg2-bin, wget, + sphinx-common, X-Python-Version: >= 2.7 +X-Python3-Version: >= 3.6 Homepage: https://www.mercurial-scm.org/doc/evolution/ Package: mercurial-evolve Architecture: all Depends: ${python:Depends}, + ${python3:Depends}, ${misc:Depends}, + ${sphinxdoc:Depends}, mercurial (>= 4.5), +Built-Using: ${sphinxdoc:Built-Using} Description: evolve extension for Mercurial This package provides the experimental "evolve" extension for the Mercurial DVCS. diff -r f3e39a354378 -r 844c9eb2400f debian/rules --- a/debian/rules Wed Oct 23 01:11:13 2019 +0200 +++ b/debian/rules Thu Nov 28 10:48:44 2019 +0100 @@ -2,12 +2,14 @@ #export DH_VERBOSE=1 %: - dh $@ --with python2 --buildsystem=python_distutils + dh $@ --with python2,python3,sphinxdoc --buildsystem=pybuild +ifeq (,$(filter nodoc, $(DEB_BUILD_OPTIONS))) override_dh_auto_build: dh_auto_build # Workaround for Sphinx in Debian Buster defaulting to Python 3 SPHINXBUILD="python -m sphinx -bhtml" $(MAKE) -C docs +endif hgsrc_defined: # Use "! -z" instead of "-n", because "-n" without arguments is true @@ -23,6 +25,11 @@ find debian -path '*/hgext3rd/__init__.py' -delete dh_python2 +override_dh_python3: + # avoid conflict with mercurial's own hgext3rd/__init__.py + find debian -path '*/hgext3rd/__init__.py' -delete + dh_python3 + override_dh_auto_clean: clean-docs dh_auto_clean rm -f tests/*.err diff -r f3e39a354378 -r 844c9eb2400f debian/source/options --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/debian/source/options Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,1 @@ +extend-diff-ignore = "^(contrib/|.gitlab-ci.yml|.hg-format-source|MANIFEST|Makefile|docs/tutorial/.netlify|hgext3rd/evolve/hack/|tests/.testtimes)" diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg01-ab.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg01-ab.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,52 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:f649 + + + +0->1 + + + + + +T0 +public + + + +T0->0 + + + + + +T1 +draft + + + +T1->1 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg02-b.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg02-b.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,83 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:f649 + + + +0->1 + + + + + +2 + +2:96d8 + + + +0->2 + + + + + +3 + +3:522d + + + +0->3 + + + + + +1->2 + + + + + +2->3 + + + + + +T12 +obsolete (and hidden) + + + +T12->1 + + + + + +T12->2 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg03.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg03.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,60 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:f649 + + + +0->1 + + + + + +2 + +2:522d + + + +0->2 + + + + + +1->2 + + + + + +T1 +obsolete (and hidden) +after the push + + + +T1->1 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg04-a.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg04-a.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,95 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:f649 + + + +0->1 + + + + + +2 + +2:522d + + + +0->2 + + + + + +3 + +3:e42b + + + +0->3 + + + + + +4 + +4:7b49 + + + +0->4 + + + + + +1->2 + + + + + +2->3 + + + + + +3->4 + + + + + +T3 +not in the other repo + + + +T3->3 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg04-b.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg04-b.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,95 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:f649 + + + +0->1 + + + + + +2 + +2:96d8 + + + +0->2 + + + + + +3 + +3:522d + + + +0->3 + + + + + +4 + +4:7b49 + + + +0->4 + + + + + +1->2 + + + + + +2->3 + + + + + +3->4 + + + + + +T2 +not in the other repo + + + +T2->2 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg05.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg05.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,41 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:7b49 + + + +0->1 + + + + + +T1 +only the final version + + + +T1->1 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg06.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg06.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,60 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:7b49 + + + +0->1 + + + + + +2 + +2:4e96 + + + +1->2 + + + + + +3 + +3:3363 + + + +1->3 + + + + + +2->3 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg07-a.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg07-a.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,108 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:7b49 + + + +0->1 + + + + + +2 + +2:4e96 + + + +1->2 + + + + + +3 + +3:3363 + + + +1->3 + + + + + +4 + +4:c7ff + + + +1->4 + + + + + +5 + +5:1bb4 + + + +1->5 + + + + + +6 + +6:9d21 + + + +1->6 + + + + + +2->3 + + + + + +4->5 + + + + + +5->6 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg07-b.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg07-b.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,42 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:7b49 + + + +0->1 + + + + + +2 + +2:9d21 + + + +1->2 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg08-a.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg08-a.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,126 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:7b49 + + + +0->1 + + + + + +2 + +2:4e96 + + + +1->2 + + + + + +3 + +3:3363 + + + +1->3 + + + + + +4 + +4:c7ff + + + +1->4 + + + + + +5 + +5:1bb4 + + + +1->5 + + + + + +6 + +6:9d21 + + + +1->6 + + + + + +2->3 + + + + + +7 + +7:dd15 + + + +3->7 + + + + + +4->5 + + + + + +5->6 + + + + + +6->7 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg08-b.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg08-b.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,54 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:7b49 + + + +0->1 + + + + + +2 + +2:9d21 + + + +1->2 + + + + + +3 + +3:dd15 + + + +2->3 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg09.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg09.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,130 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:7b49 + + + +0->1 + + + + + +2 + +2:9d21 + + + +1->2 + + + + + +3 + +3:dd15 + + + +2->3 + + + + + +4 + +4:b2be + + + +3->4 + + + + + +5 + +5:541f + + + +3->5 + + + + + +6 + +6:e3a5 + + + +3->6 + + + + + +4->5 + + + + + +4->6 + + + + + +T5 +working dir + + + +T5->5 + + + + + +T56 +content-divergent + + + +T56->5 + + + + + +T56->6 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-sg10.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/figures/figure-sg10.svg Thu Nov 28 10:48:44 2019 +0100 @@ -0,0 +1,138 @@ + + + + + + +Mercurial graph + + +0 + +0:0dc9 + + + +1 + +1:7b49 + + + +0->1 + + + + + +2 + +2:9d21 + + + +1->2 + + + + + +3 + +3:dd15 + + + +2->3 + + + + + +4 + +4:b2be + + + +3->4 + + + + + +5 + +5:541f + + + +3->5 + + + + + +6 + +6:e3a5 + + + +3->6 + + + + + +7 + +7:aa82 + + + +3->7 + + + + + +4->5 + + + + + +4->6 + + + + + +5->7 + + + + + +6->7 + + + + + +T7 +final, single +successor + + + +T7->7 + + + + + diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-ug07.svg --- a/docs/figures/figure-ug07.svg Wed Oct 23 01:11:13 2019 +0200 +++ b/docs/figures/figure-ug07.svg Thu Nov 28 10:48:44 2019 +0100 @@ -236,7 +236,7 @@ id="tspan8594" x="113.19138" y="21.624107" - style="font-size:12px;line-height:1.25;font-family:monospace">hg evolve --all + style="font-size:12px;line-height:1.25;font-family:monospace">hg evolve diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-ug09.svg --- a/docs/figures/figure-ug09.svg Wed Oct 23 01:11:13 2019 +0200 +++ b/docs/figures/figure-ug09.svg Thu Nov 28 10:48:44 2019 +0100 @@ -110,7 +110,7 @@ id="tspan8594" x="132.17838" y="-88.939552" - style="font-size:12px;line-height:1.25;font-family:monospace">hg evolve --all + style="font-size:12px;line-height:1.25;font-family:monospace">hg evolve diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-ug10.svg --- a/docs/figures/figure-ug10.svg Wed Oct 23 01:11:13 2019 +0200 +++ b/docs/figures/figure-ug10.svg Thu Nov 28 10:48:44 2019 +0100 @@ -570,7 +570,7 @@ sodipodi:role="line" x="79.694885" y="806.03015" - style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg evolve --all + style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg evolve diff -r f3e39a354378 -r 844c9eb2400f docs/figures/figure-ug12.svg --- a/docs/figures/figure-ug12.svg Wed Oct 23 01:11:13 2019 +0200 +++ b/docs/figures/figure-ug12.svg Thu Nov 28 10:48:44 2019 +0100 @@ -333,7 +333,7 @@ x="76.696045" sodipodi:role="line" id="tspan3322" - style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg evolve --all + style="font-size:11.99999809px;line-height:1.25;font-family:monospace">hg evolve diff -r f3e39a354378 -r 844c9eb2400f docs/sharing.rst --- a/docs/sharing.rst Wed Oct 23 01:11:13 2019 +0200 +++ b/docs/sharing.rst Thu Nov 28 10:48:44 2019 +0100 @@ -160,12 +160,18 @@ At this point, ``dev-repo`` and ``test-repo`` have the same changesets in the same phases: - [figure SG01: rev 0:0dc9 public, rev 1:f649 draft, same on both repos] +.. figure:: figures/figure-sg01-ab.svg + + Figure 1 a: ``dev-repo`` has rev 0:0dc9 public, rev 1:f649 draft + +.. figure:: figures/figure-sg01-ab.svg + + Figure 1 b: the same exact picture in ``test-repo`` (You may notice a change in notation from the user guide: now changesets are labelled with their revision number and the first four digits of the 40-digit hexadecimal changeset ID. Mercurial revision -numbers are never stable when working across repositories, especially +numbers are not consistent when working across repositories, especially when obsolescence is involved. We'll see why shortly.) Now let's switch to ``test-repo`` to test our change:: @@ -181,16 +187,31 @@ punctuation and capitalization (oops). Let's amend our preliminary fix (and fix the lame commit message while we're at it):: + $ echo 'Fix fix fix' > file1 + $ hg amend -m 'fix bug 37' + +For the sake of illustrating how obsolete changesets are not exchanged, let's +amend again:: + $ echo 'Fix fix fix.' > file1 $ hg amend -m 'fix bug 37' +Note: some time ago, evolve used to create temporary amend commits. Here, +amending twice in a row is reminiscent of that behaviour that you may have seen +in older tutorials. + Now we're in a funny intermediate state (figure 2): revision 1:f649 is -obsolete in ``test-repo``, having been replaced by revision 3:60ff -(revision 2:2a03 is another one of those temporary amend commits that -we saw in the user guide)—but ``dev-repo`` knows nothing of these -recent developments. +obsolete in ``test-repo``, having been replaced by revision 2:96d8 and then by +3:522d—but ``dev-repo`` knows nothing of these recent developments. + +.. figure:: figures/figure-sg01-ab.svg - [figure SG02: test-repo has rev 0:0dc9 public, rev 1:f649, 2:2a03 obsolete, rev 3:60ff draft; dev-repo same as in SG01] + Figure 2 a: ``dev-repo`` same as in Figure 01 a + +.. figure:: figures/figure-sg02-b.svg + + Figure 2 b: ``test-repo`` has rev 0:0dc9 public, revs 1:f649 and 2:96d8 + obsolete, rev 3:522d draft Let's resynchronize:: @@ -198,15 +219,22 @@ $ hg pull -u [...] added 1 changesets with 1 changes to 1 files (+1 heads) + 2 new obsolescence markers + obsoleted 1 changesets + new changesets 522d503432a2 (1 drafts) 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + updated to "522d503432a2: fix bug 37" + 1 other heads for branch "default" As seen in figure 3, this transfers the new changeset *and* the obsolescence marker for revision 1. However, it does *not* transfer -the temporary amend commit, because it is hidden. Push and pull -transfer obsolescence markers between repositories, but they do not -transfer hidden changesets. +2:96d8, because it is hidden. Push and pull transfer obsolescence +markers between repositories, but they do not transfer hidden changesets. - [figure SG03: dev-repo grows new rev 2:60ff, marks 1:f649 obsolete] +.. figure:: figures/figure-sg03.svg + + Figure 3: ``dev-repo`` receives rev 2:522d, 1:f649 is now obsolete like in + ``test-repo`` Because of this deliberately incomplete synchronization, revision numbers in ``test-repo`` and ``dev-repo`` are no longer consistent. We @@ -220,16 +248,24 @@ less-than-perfect idea. We'll implement it locally in ``dev-repo`` and push to ``test-repo``:: + $ echo 'Fix, fix, and fix' > file1 + $ hg amend $ echo 'Fix, fix, and fix.' > file1 $ hg amend $ hg push -This time around, the temporary amend commit is in ``dev-repo``, and +This time around, the first amend commit stays in ``dev-repo``, and it is not transferred to ``test-repo``—the same as before, just in the opposite direction. Figure 4 shows the two repositories after amending in ``dev-repo`` and pushing to ``test-repo``. - [figure SG04: each repo has one temporary amend commit, but they're different in each one] +.. figure:: figures/figure-sg04-a.svg + + Figure 4 a: in ``dev-repo`` the extra amend commit is 3:e42b + +.. figure:: figures/figure-sg04-b.svg + + Figure 4 b: and in ``test-repo`` it is 2:96d8 Let's hop over to ``test-repo`` to test the more elegant fix:: @@ -243,8 +279,9 @@ $ hg push [...] added 1 changesets with 1 changes to 1 files + 4 new obsolescence markers -Note that only one changeset—the final version, after two +Note that only one changeset—the final version, after all the amendments—was actually pushed. Again, Mercurial doesn't transfer hidden changesets on push and pull. @@ -254,12 +291,14 @@ ``dev-repo`` or ``test-repo``. Neither of our missteps nor our amendments are publicly visible, just the final, beautifully polished changeset: - [figure SG05: public repo with rev 0:0dc9, 1:de61, both public] +.. figure:: figures/figure-sg05.svg + + Figure 5: in ``public`` repo with revs 0:0dc9 and 1:7b49, both public There is one important step left to do. Because we pushed from ``test-repo`` to ``public``, the pushed changeset is in *public* phase in those two repositories. But ``dev-repo`` has been out-of-the-loop; -changeset de61 is still *draft* there. If we're not careful, we might +changeset 7b49 is still *draft* there. If we're not careful, we might mutate history in ``dev-repo``, obsoleting a changeset that is already public. Let's avoid that situation for now by pushing up to ``dev-repo``:: @@ -381,11 +420,16 @@ $ hg push [...] added 1 changesets with 1 changes to 1 files (+1 heads) + 1 new obsolescence markers + obsoleted 1 changesets updating bookmark bug15 Figure 6 shows the state of the ``review`` repository at this point. - [figure SG06: rev 2:fn1e is Alice's obsolete v1, rev 3:cbdf is her v2; both children of rev 1:de61] +.. figure:: figures/figure-sg06.svg + + Figure 6: rev 2:4e96 is Alice's obsolete v1, rev 3:3363 is her v2; both + children of rev 1:7b49 After a busy morning of bug fixing, Alice stops for lunch. Let's see what Bob has been up to. @@ -401,7 +445,7 @@ $ cd ../bob $ echo 'stuff' > file1 $ hg bookmark featureX - $ hg commit -u bob -m 'implement feature X (v1)' # rev 4:1636 + $ hg commit -u bob -m 'implement feature X (v1)' # rev 4:c7ff $ hg push -B featureX [...] added 1 changesets with 1 changes to 1 files (+1 heads) @@ -411,17 +455,19 @@ bit, amends, and submits the resulting changeset for review:: $ echo 'do stuff' > file1 - $ hg amend -m 'implement feature X (v2)' # rev 5:0eb7 + $ hg amend -m 'implement feature X (v2)' # rev 5:1bb4 $ hg push [...] added 1 changesets with 1 changes to 1 files (+1 heads) + 1 new obsolescence markers + obsoleted 1 changesets updating bookmark featureX Unfortunately, that still doesn't pass muster. Bob's reviewer insists on proper capitalization and punctuation. :: $ echo 'Do stuff.' > file1 - $ hg amend -m 'implement feature X (v3)' # rev 6:540b + $ hg amend -m 'implement feature X (v3)' # rev 6:9d21 On the bright side, the second review said, "Go ahead and publish once you fix that." So Bob immediately publishes his third attempt:: @@ -429,22 +475,33 @@ $ hg push ../public [...] added 1 changesets with 1 changes to 1 files + 2 new obsolescence markers It's not enough just to update ``public``, though! Other people also use the ``review`` repository, and right now it doesn't have Bob's -latest amendment ("v3", revision 6:540b), nor does it know that the -predecessor of that changeset ("v2", revision 5:0eb7) is obsolete. Thus, +latest amendment ("v3", revision 6:9d21), nor does it know that the +predecessor of that changeset ("v2", revision 5:1bb4) is obsolete. Thus, Bob pushes to ``review`` as well:: $ hg push ../review [...] added 1 changesets with 1 changes to 1 files (+1 heads) + 1 new obsolescence markers + obsoleted 1 changesets updating bookmark featureX Figure 7 shows the result of Bob's work in both ``review`` and ``public``. - [figure SG07: review includes Alice's draft work on bug 15, as well as Bob's v1, v2, and v3 changes for feature X: v1 and v2 obsolete, v3 public. public contains only the final, public implementation of feature X] +.. figure:: figures/figure-sg07-a.svg + + Figure 7 a: ``review`` includes Alice's draft work on bug 15, as well as + Bob's v1, v2, and v3 changes for feature X: v1 and v2 obsolete, v3 public + +.. figure:: figures/figure-sg07-b.svg + + Figure 7 b: ``public`` contains only the final, public implementation of + feature X Incidentally, it's important that Bob push to ``public`` *before* ``review``. If he pushed to ``review`` first, then revision 6:540b @@ -463,9 +520,9 @@ $ hg push ../public [...] - remote has heads on branch 'default' that are not known locally: 540ba8f317e6 - abort: push creates new remote head cbdfbd5a5db2! - (pull and merge or see "hg help push" for details about pushing new heads) + remote has heads on branch 'default' that are not known locally: 9d21d673314a + abort: push creates new remote head 3363442626b3 with bookmark 'bug15'! + (pull and merge or see 'hg help push' for details about pushing new heads) Oops! Bob has won the race to push first to ``public``. So Alice needs to integrate with Bob: let's pull his changeset(s) and see what the @@ -476,9 +533,9 @@ added 1 changesets with 1 changes to 1 files (+1 heads) (run 'hg heads' to see heads, 'hg merge' to merge) $ hg log -G -q -r 'head()' --template '{rev}:{node|short} ({author})\n' - o 5:540ba8f317e6 (bob) + o 4:9d21d673314a (bob) | - | @ 4:cbdfbd5a5db2 (alice) + | @ 3:3363442626b3 (alice) |/ We'll assume Alice and Bob are perfectly comfortable with rebasing @@ -486,19 +543,29 @@ form of ``amend``.) So Alice rebases her changeset on top of Bob's and publishes the result:: - $ hg rebase -d 5 + $ hg rebase -d 4 $ hg push ../public [...] added 1 changesets with 1 changes to 1 files + 2 new obsolescence markers $ hg push ../review [...] - added 1 changesets with 0 changes to 0 files + added 1 changesets with 0 changes to 1 files + 1 new obsolescence markers + obsoleted 1 changesets updating bookmark bug15 The result, in both ``review`` and ``public`` repositories, is shown in figure 8. - [figure SG08: review shows v1 and v2 of Alice's fix, then v1, v2, v3 of Bob's feature, finally Alice's fix rebased onto Bob's. public just shows the final public version of each changeset] +.. figure:: figures/figure-sg08-a.svg + + Figure 8 a: ``review`` shows v1 and v2 of Alice's fix, then v1, v2, v3 of + Bob's feature, finally Alice's fix rebased onto Bob's + +.. figure:: figures/figure-sg08-b.svg + + Figure 8 b: ``public`` just shows the final public version of each changeset Getting into trouble with shared mutable history ------------------------------------------------ @@ -567,7 +634,7 @@ $ cd bob $ echo 'pretty good fix' >> file1 - $ hg commit -u bob -m 'fix bug 24 (v1)' # rev 4:2fe6 + $ hg commit -u bob -m 'fix bug 24 (v1)' # rev 4:b2be Since Alice and Bob are now in cowboy mode, Alice pulls Bob's draft changeset and amends it herself. :: @@ -584,36 +651,42 @@ $ cd ../bob $ echo 'better fix (bob)' >> file1 - $ hg amend -u bob -m 'fix bug 24 (v2 by bob)' # rev 6:a360 + $ hg amend -u bob -m 'fix bug 24 (v2 by bob)' # rev 5:541f At this point, the divergence exists, but only in theory: Bob's -original changeset, 4:2fe6, is obsolete and has two successors. But +original changeset, 4:b2be, is obsolete and has two successors. But those successors are in different repositories, so the trouble is not visible to anyone yet. It will be as soon as Bob pulls from Alice's repository (or vice-versa). :: $ hg pull ../alice [...] - added 1 changesets with 1 changes to 2 files (+1 heads) + added 1 changesets with 1 changes to 1 files (+1 heads) + 1 new obsolescence markers + 2 new content-divergent changesets + new changesets e3a586fd2377 (1 drafts) (run 'hg heads' to see heads, 'hg merge' to merge) - 2 new content-divergent changesets Figure 9 shows the situation in Bob's repository. - [figure SG09: Bob's repo with 2 heads for the 2 content-divergent changesets, 6:a360 and 7:e3f9; wc is at 6:a360; both are successors of obsolete 4:2fe6, hence divergence] +.. figure:: figures/figure-sg09.svg + + Figure 9: Bob's repo with 2 heads for the 2 content-divergent changesets, + 5:541f and 6:e3a5; wc is at 5:541f; both are successors of obsolete 4:b2be, + hence divergence Now we need to get out of trouble. As usual, the answer is to evolve history. :: $ HGMERGE=internal:other hg evolve - merge:[6] fix bug 24 (v2 by bob) - with: [7] fix bug 24 (v2 by alice) + merge:[5] fix bug 24 (v2 by bob) + with: [6] fix bug 24 (v2 by alice) base: [4] fix bug 24 (v1) 0 files updated, 1 files merged, 0 files removed, 0 files unresolved Figure 10 shows how Bob's repository looks now. - [figure SG10: only one visible head, 9:5ad6, successor to hidden 6:a360 and 7:e3f9] + [figure SG10: only one visible head, 7:aa82, successor to hidden 5:541f and 6:e3a5] We carefully dodged a merge conflict by specifying a merge tool (``internal:other``) that will take Alice's changes over Bob's. (You @@ -693,7 +766,7 @@ As usual when there's trouble in your repository, the solution is to evolve it:: - $ hg evolve --all + $ hg evolve Figure 8 illustrates Bob's repository after evolving away the phase-divergent changeset. Ignoring the obsolete changesets, Bob now has a nice, diff -r f3e39a354378 -r 844c9eb2400f docs/user-guide.rst --- a/docs/user-guide.rst Wed Oct 23 01:11:13 2019 +0200 +++ b/docs/user-guide.rst Thu Nov 28 10:48:44 2019 +0100 @@ -403,7 +403,7 @@ The fix is to *evolve* history:: - $ hg evolve --all + $ hg evolve This is a separate step, not automatically part of ``hg amend``, because there might be conflicts. If your amended changeset modifies a @@ -418,7 +418,7 @@ .. figure:: figures/figure-ug07.svg - Figure 7: evolve your repository (``hg evolve --all``) to take care + Figure 7: evolve your repository (``hg evolve``) to take care of instability. Orphan changesets become obsolete, and are replaced by successors just like the amended changeset was. @@ -450,14 +450,14 @@ As before, the solution to orphan changesets is to evolve your repository:: - $ hg evolve --all + $ hg evolve This rebases revision 20 on top of 18 as the new revision 21, leaving 19 and 20 obsolete and hidden: .. figure:: figures/figure-ug09.svg - Figure 9: once again, ``hg evolve --all`` takes care of instability. + Figure 9: once again, ``hg evolve`` takes care of instability. Example 9: Uncommit files from an older changeset (discard changes) ======================================================================= @@ -491,7 +491,7 @@ hack, so we can discard it and immediately evolve the instability away:: $ hg revert file2.c - $ hg evolve --all + $ hg evolve move:[23] fix bug 67 atop:[24] fix bug 53 @@ -545,7 +545,7 @@ This is where things get tricky. As usual when a repository has orphan changesets, we want to evolve it:: - $ hg evolve --all + $ hg evolve The problem is that ``hg evolve`` rebases revision 27 onto revision 28, creating 30 (the successor of 27). This is entirely logical: 27 @@ -570,7 +570,7 @@ to normal state. For complicated implementation reasons, that command doesn't exist. (If you have already pushed an obsolescence marker to another repo, then Mercurial would need a way to revoke that remote -obsolesence marker. That's a hard problem.) +obsolescence marker. That's a hard problem.) Instead, ``evolve`` provides a ``touch`` command to resurrect an obsolete changeset. An unexpected quirk: you almost certainly need to diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/evolve/__init__.py --- a/hgext3rd/evolve/__init__.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/evolve/__init__.py Thu Nov 28 10:48:44 2019 +0100 @@ -525,14 +525,14 @@ def _precursors(repo, s, includeidentical=False): """Precursor of a changeset""" cs = set() - nm = repo.changelog.nodemap + getrev = compat.getgetrev(repo.changelog) markerbysubj = repo.obsstore.predecessors node = repo.changelog.node for r in s: for p in markerbysubj.get(node(r), ()): if not includeidentical and p[2] & rewind.identicalflag: continue - pr = nm.get(p[0]) + pr = getrev(p[0]) if pr is not None: cs.add(pr) cs -= repo.changelog.filteredrevs # nodemap has no filtering @@ -551,10 +551,10 @@ if np not in seen: seen.add(np) toproceed.append(np) - nm = repo.changelog.nodemap + getrev = compat.getgetrev(repo.changelog) cs = set() for p in seen: - pr = nm.get(p) + pr = getrev(p) if pr is not None: cs.add(pr) cs -= repo.changelog.filteredrevs # nodemap has no filtering @@ -564,12 +564,12 @@ """Successors of a changeset""" cs = set() node = repo.changelog.node - nm = repo.changelog.nodemap + getrev = compat.getgetrev(repo.changelog) markerbyobj = repo.obsstore.successors for r in s: for p in markerbyobj.get(node(r), ()): for sub in p[1]: - sr = nm.get(sub) + sr = getrev(sub) if sr is not None: cs.add(sr) cs -= repo.changelog.filteredrevs # nodemap has no filtering @@ -595,10 +595,10 @@ if sub not in seen: seen.add(sub) toproceed.append(sub) - nm = repo.changelog.nodemap + getrev = compat.getgetrev(repo.changelog) cs = set() for s in seen: - sr = nm.get(s) + sr = getrev(s) if sr is not None: cs.add(sr) cs -= repo.changelog.filteredrevs # nodemap has no filtering diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/evolve/cmdrewrite.py --- a/hgext3rd/evolve/cmdrewrite.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/evolve/cmdrewrite.py Thu Nov 28 10:48:44 2019 +0100 @@ -454,7 +454,7 @@ (b'', b'revert', False, _(b'discard working directory changes after uncommit')), (b'n', b'note', b'', _(b'store a note on uncommit'), _(b'TEXT')), ] + commands.walkopts + commitopts + commitopts2 + commitopts3, - _(b'[OPTION]... [NAME]')) + _(b'[OPTION]... [FILE]...')) def uncommit(ui, repo, *pats, **opts): """move changes from parent revision to working directory @@ -522,7 +522,7 @@ # if not everything tracked in that directory can be # uncommitted. if badfiles: - badfiles -= set([f for f in util.dirs(eligible)]) + badfiles -= set([f for f in compat.dirs(eligible)]) try: uipathfn = scmutil.getuipathfn(repo) @@ -689,7 +689,7 @@ (b'', b'from', None, _(b"fold revisions linearly to working copy parent")), (b'n', b'note', b'', _(b'store a note on fold'), _(b'TEXT')), ] + commitopts + commitopts2 + commitopts3, - _(b'hg fold [OPTION]... [-r] REV'), + _(b'hg fold [OPTION]... [-r] REV...'), helpbasic=True) def fold(ui, repo, *revs, **opts): """fold multiple revisions into a single one @@ -820,7 +820,7 @@ (b'', b'fold', None, _(b"also fold specified revisions into one")), (b'n', b'note', b'', _(b'store a note on metaedit'), _(b'TEXT')), ] + commitopts + commitopts2 + commitopts3, - _(b'hg metaedit [OPTION]... [-r] [REV]')) + _(b'hg metaedit [OPTION]... [[-r] REV]...')) def metaedit(ui, repo, *revs, **opts): """edit commit information @@ -977,7 +977,7 @@ _(b"record a split (one precursor, multiple successors)")), (b'B', b'bookmark', [], _(b"remove revs only reachable from given" b" bookmark"), _(b'BOOKMARK'))] + metadataopts, - _(b'[OPTION] [-r] REV...'), + _(b'[OPTION]... [-r] REV...'), helpbasic=True) # XXX -U --noupdate option to prevent wc update and or bookmarks update ? def cmdprune(ui, repo, *revs, **opts): @@ -1171,7 +1171,7 @@ (b'r', b'rev', [], _(b"revision to split"), _(b'REV')), (b'n', b'note', b'', _(b"store a note on split"), _(b'TEXT')), ] + commitopts + commitopts2 + commitopts3, - _(b'hg split [OPTION] [-r REV] [FILES]'), + _(b'hg split [OPTION]... [-r REV] [FILE]...'), helpbasic=True) def cmdsplit(ui, repo, *pats, **opts): """split a changeset into smaller changesets @@ -1347,7 +1347,7 @@ b'mark the new revision as successor of the old one potentially creating ' b'divergence')], # allow to choose the seed ? - _(b'[-r] revs')) + _(b'[OPTION]... [-r] REV...')) def touch(ui, repo, *revs, **opts): """create successors identical to their predecessors but the changeset ID @@ -1448,7 +1448,7 @@ (b'c', b'continue', False, b'continue interrupted pick'), (b'a', b'abort', False, b'abort interrupted pick'), ] + mergetoolopts, - _(b'[-r] rev')) + _(b'[OPTION]... [-r] REV')) def cmdpick(ui, repo, *revs, **opts): """move a commit on the top of working directory parent and updates to it.""" diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/evolve/compat.py --- a/hgext3rd/evolve/compat.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/evolve/compat.py Thu Nov 28 10:48:44 2019 +0100 @@ -45,6 +45,13 @@ displaygraph = cmdutil.displaygraph changesetdiffer = None +# hg <= 5.3 (c21aca51b392) +try: + from mercurial import pathutil + dirs = pathutil.dirs +except (AttributeError, ImportError): + dirs = util.dirs + from . import ( exthelper, ) @@ -515,3 +522,11 @@ if meta.get(b'operation')) return sorted(operations) + +# nodemap.get and index.[has_node|rev|get_rev] +# hg <= 5.3 (02802fa87b74) +def getgetrev(cl): + """Returns index.get_rev or nodemap.get (for pre-5.3 Mercurial).""" + if util.safehasattr(cl.index, 'get_rev'): + return cl.index.get_rev + return cl.nodemap.get diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/evolve/dagutil.py --- a/hgext3rd/evolve/dagutil.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/evolve/dagutil.py Thu Nov 28 10:48:44 2019 +0100 @@ -13,6 +13,8 @@ from mercurial.i18n import _ from mercurial.node import nullrev +from . import compat + class basedag(object): '''generic interface for DAGs @@ -145,8 +147,9 @@ def _internalizeall(self, ids, filterunknown): rl = self._revlog + getrev = compat.getgetrev(rl) if filterunknown: - return [r for r in map(rl.nodemap.get, ids) + return [r for r in map(getrev, ids) if (r is not None and r != nullrev and r not in rl.filteredrevs)] diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/evolve/debugcmd.py --- a/hgext3rd/evolve/debugcmd.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/evolve/debugcmd.py Thu Nov 28 10:48:44 2019 +0100 @@ -17,7 +17,10 @@ from mercurial.i18n import _ -from . import exthelper +from . import ( + compat, + exthelper, +) eh = exthelper.exthelper() @@ -43,7 +46,7 @@ store = repo.obsstore unfi = repo.unfiltered() - nm = unfi.changelog.nodemap + getrev = compat.getgetrev(unfi.changelog) nbmarkers = len(store._all) ui.write(_(b'markers total: %9i\n') % nbmarkers) sucscount = [0, 0, 0, 0] @@ -58,7 +61,7 @@ size_v0 = [] size_v1 = [] for mark in store: - if mark[0] in nm: + if getrev(mark[0]) is not None: known += 1 nbsucs = len(mark[1]) sucscount[min(nbsucs, 3)] += 1 @@ -133,7 +136,7 @@ ui.write(b' any known node: %9i\n' % len([c for c in allclusters - if [n for n in c[0] if nm.get(n) is not None]])) + if [n for n in c[0] if getrev(n) is not None]])) if allclusters: nbcluster = len(allclusters) ui.write((b' smallest length: %9i\n' % len(allclusters[0][1]))) @@ -148,7 +151,7 @@ ui.write((b' using parents data: %9i\n' % len(allpclusters))) ui.write(b' any known node: %9i\n' % len([c for c in allclusters - if [n for n in c[0] if nm.get(n) is not None]])) + if [n for n in c[0] if getrev(n) is not None]])) if allpclusters: nbcluster = len(allpclusters) ui.write((b' smallest length: %9i\n' diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/evolve/obscache.py --- a/hgext3rd/evolve/obscache.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/evolve/obscache.py Thu Nov 28 10:48:44 2019 +0100 @@ -20,6 +20,7 @@ ) from . import ( + compat, exthelper, ) @@ -389,9 +390,9 @@ def _updatemarkers(self, repo, obsmarkers): """update the cache with new markers""" - rev = repo.changelog.nodemap.get + getrev = compat.getgetrev(repo.changelog) for m in obsmarkers: - r = rev(m[0]) + r = getrev(m[0]) if r is not None: self._data[r] = 1 diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/evolve/obsdiscovery.py --- a/hgext3rd/evolve/obsdiscovery.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/evolve/obsdiscovery.py Thu Nov 28 10:48:44 2019 +0100 @@ -414,8 +414,8 @@ max_stored = con.execute(_query_max_stored).fetchall()[0][0] affected_nodes = _affectedby(repo, obsmarkers) - rev = repo.changelog.nodemap.get - affected = [rev(n) for n in affected_nodes] + getrev = compat.getgetrev(repo.changelog) + affected = [getrev(n) for n in affected_nodes] affected = [r for r in affected if r is not None and r <= max_stored] @@ -646,8 +646,8 @@ The range have the id encoded as a node return 'wdirid' for unknown range""" - nm = repo.changelog.nodemap - ranges = [(nm.get(n), idx) for n, idx in ranges] + getrev = compat.getgetrev(repo.changelog) + ranges = [(getrev(n), idx) for n, idx in ranges] if ranges: maxrev = max(r for r, i in ranges) if maxrev is not None: diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/evolve/obshistory.py --- a/hgext3rd/evolve/obshistory.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/evolve/obshistory.py Thu Nov 28 10:48:44 2019 +0100 @@ -50,7 +50,7 @@ (b'p', b'patch', False, _(b'show the patch between two obs versions')), (b'f', b'filternonlocal', False, _(b'filter out non local commits')), ] + commands.formatteropts, - _(b'hg olog [OPTION]... [REV]')) + _(b'hg olog [OPTION]... [[-r] REV]...')) def cmdobshistory(ui, repo, *revs, **opts): """show the obsolescence history of the specified revisions diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/pullbundle.py --- a/hgext3rd/pullbundle.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/pullbundle.py Thu Nov 28 10:48:44 2019 +0100 @@ -180,7 +180,7 @@ def sliceoutgoing(repo, outgoing): cl = repo.changelog - rev = cl.nodemap.get + rev = getgetrev(cl) node = cl.node revsort = repo.stablesort @@ -623,3 +623,11 @@ def fmtdist(name, data): return STATSFORMAT.format(name=name, **data) + +# nodemap.get and index.[has_node|rev|get_rev] +# hg <= 5.3 (02802fa87b74) +def getgetrev(cl): + """Returns index.get_rev or nodemap.get (for pre-5.3 Mercurial).""" + if util.safehasattr(cl.index, 'get_rev'): + return cl.index.get_rev + return cl.nodemap.get diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/topic/__init__.py --- a/hgext3rd/topic/__init__.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/topic/__init__.py Thu Nov 28 10:48:44 2019 +0100 @@ -634,7 +634,7 @@ (b'', b'age', False, b'show when you last touched the topics'), (b'', b'current', None, b'display the current topic only'), ] + commands.formatteropts, - _(b'hg topics [TOPIC]')) + _(b'hg topics [OPTION]... [-r REV]... [TOPIC]')) def topics(ui, repo, topic=None, **opts): """View current topic, set current topic, change topic for a set of revisions, or see all topics. diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/topic/compat.py --- a/hgext3rd/topic/compat.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/topic/compat.py Thu Nov 28 10:48:44 2019 +0100 @@ -10,6 +10,7 @@ from mercurial import ( obsolete, pycompat, + util, ) getmarkers = None @@ -34,3 +35,11 @@ def branchmapitems(branchmap): return branchmap.iteritems() # py3-transform: on + +# nodemap.get and index.[has_node|rev|get_rev] +# hg <= 5.3 (02802fa87b74) +def getgetrev(cl): + """Returns index.get_rev or nodemap.get (for pre-5.3 Mercurial).""" + if util.safehasattr(cl.index, 'get_rev'): + return cl.index.get_rev + return cl.nodemap.get diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/topic/discovery.py --- a/hgext3rd/topic/discovery.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/topic/discovery.py Thu Nov 28 10:48:44 2019 +0100 @@ -45,7 +45,7 @@ publishednode, pushop.remotephases.publicheads) - rev = repo.unfiltered().changelog.nodemap.get + getrev = compat.getgetrev(repo.unfiltered().changelog) def remotebranchmap(): # drop topic information from changeset about to be published @@ -56,7 +56,7 @@ else: namedbranch = branch.split(b':', 1)[0] for h in heads: - r = rev(h) + r = getrev(h) if r is not None and r in publishedset: result[namedbranch].append(h) else: diff -r f3e39a354378 -r 844c9eb2400f hgext3rd/topic/topicmap.py --- a/hgext3rd/topic/topicmap.py Wed Oct 23 01:11:13 2019 +0200 +++ b/hgext3rd/topic/topicmap.py Thu Nov 28 10:48:44 2019 +0100 @@ -14,6 +14,7 @@ from . import ( common, + compat, ) basefilter = set([b'base', b'immutable']) @@ -69,10 +70,10 @@ revs = set() cl = repo.changelog fr = cl.filteredrevs - nm = cl.nodemap + getrev = compat.getgetrev(cl) for roots in repo._phasecache.phaseroots[1:]: for n in roots: - r = nm.get(n) + r = getrev(n) if r not in fr and r < maxrev: revs.add(r) key = nullid diff -r f3e39a354378 -r 844c9eb2400f tests/test-pick.t --- a/tests/test-pick.t Wed Oct 23 01:11:13 2019 +0200 +++ b/tests/test-pick.t Thu Nov 28 10:48:44 2019 +0100 @@ -25,7 +25,7 @@ $ hg init repo $ cd repo $ hg help pick - hg pick [-r] rev + hg pick [OPTION]... [-r] REV aliases: grab diff -r f3e39a354378 -r 844c9eb2400f tests/test-sharing.t --- a/tests/test-sharing.t Wed Oct 23 01:11:13 2019 +0200 +++ b/tests/test-sharing.t Thu Nov 28 10:48:44 2019 +0100 @@ -5,7 +5,7 @@ $ cat >> $HGRCPATH < [alias] - > shortlog = log --template '{rev}:{node|short} {phase} {desc|firstline}\n' + > shortlog = log --template '{rev}:{node|shortest} {phase} {desc|firstline}\n' > [extensions] > rebase = > EOF @@ -57,24 +57,38 @@ $ hg push -q ../test-repo Figure SG01 (roughly) - $ hg shortlog -G - @ 1:f6490818a721 draft prelim change + $ hg -R ../dev-repo shortlog -G + @ 1:f649 draft prelim change | - o 0:0dc9c9f6ab91 public create new project + o 0:0dc9 public create new project + + $ hg -R ../test-repo shortlog -G + o 1:f649 draft prelim change + | + @ 0:0dc9 public create new project Now let's switch to test-repo to test our change and amend:: $ cd ../test-repo $ hg update -q + $ echo 'Fix fix fix' > file1 + $ hg amend -m'fix bug 37' $ echo 'Fix fix fix.' > file1 $ hg amend -m'fix bug 37' Figure SG02 - $ hg shortlog --hidden -G - @ 2:60ffde5765c5 draft fix bug 37 + $ hg -R ../dev-repo shortlog --hidden -G + @ 1:f649 draft prelim change | - | x 1:f6490818a721 draft prelim change + o 0:0dc9 public create new project + + $ hg -R ../test-repo shortlog --hidden -G + @ 3:522d draft fix bug 37 + | + | x 2:96d8 draft fix bug 37 |/ - o 0:0dc9c9f6ab91 public create new project + | x 1:f649 draft prelim change + |/ + o 0:0dc9 public create new project Pull into dev-repo: obsolescence markers are transferred, but not the new obsolete changeset. @@ -86,50 +100,56 @@ adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) - 1 new obsolescence markers + 2 new obsolescence markers obsoleted 1 changesets - new changesets 60ffde5765c5 (1 drafts) + new changesets 522d503432a2 (1 drafts) 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to "60ffde5765c5: fix bug 37" + updated to "522d503432a2: fix bug 37" 1 other heads for branch "default" Figure SG03 - $ hg shortlog --hidden -G - @ 2:60ffde5765c5 draft fix bug 37 + $ hg -R ../dev-repo shortlog --hidden -G + @ 2:522d draft fix bug 37 | - | x 1:f6490818a721 draft prelim change + | x 1:f649 draft prelim change |/ - o 0:0dc9c9f6ab91 public create new project + o 0:0dc9 public create new project Amend again in dev-repo + $ echo 'Fix, fix, and fix' > file1 + $ hg amend $ echo 'Fix, fix, and fix.' > file1 $ hg amend $ hg push -q Figure SG04 (dev-repo) $ hg shortlog --hidden -G - @ 3:de6151c48e1c draft fix bug 37 + @ 4:7b49 draft fix bug 37 | - | x 2:60ffde5765c5 draft fix bug 37 + | x 3:e42b draft fix bug 37 |/ - | x 1:f6490818a721 draft prelim change + | x 2:522d draft fix bug 37 |/ - o 0:0dc9c9f6ab91 public create new project + | x 1:f649 draft prelim change + |/ + o 0:0dc9 public create new project Figure SG04 (test-repo) $ cd ../test-repo $ hg update 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - updated to "de6151c48e1c: fix bug 37" + updated to "7b49f864d655: fix bug 37" 1 other heads for branch "default" $ hg shortlog --hidden -G - @ 3:de6151c48e1c draft fix bug 37 + @ 4:7b49 draft fix bug 37 | - | x 2:60ffde5765c5 draft fix bug 37 + | x 3:522d draft fix bug 37 |/ - | x 1:f6490818a721 draft prelim change + | x 2:96d8 draft fix bug 37 |/ - o 0:0dc9c9f6ab91 public create new project + | x 1:f649 draft prelim change + |/ + o 0:0dc9 public create new project This bug fix is finished. We can push it to the public repository. $ hg push @@ -139,23 +159,23 @@ adding manifests adding file changes added 1 changesets with 1 changes to 1 files - 2 new obsolescence markers + 4 new obsolescence markers Now that the fix is public, we cannot amend it any more. $ hg amend -m 'fix bug 37' - abort: cannot amend public changesets: de6151c48e1c + abort: cannot amend public changesets: 7b49f864d655 (see 'hg help phases' for details) [255] Figure SG05 $ hg -R ../public shortlog -G - o 1:de6151c48e1c public fix bug 37 + o 1:7b49 public fix bug 37 | - o 0:0dc9c9f6ab91 public create new project + o 0:0dc9 public create new project Oops, still have draft changesets in dev-repo: push the phase change there. $ hg -R ../dev-repo shortlog -r 'draft()' - 3:de6151c48e1c draft fix bug 37 + 4:7b49 draft fix bug 37 $ hg push ../dev-repo pushing to ../dev-repo searching for changes @@ -195,7 +215,7 @@ added 1 changesets with 1 changes to 1 files exporting bookmark bug15 $ hg -R ../review bookmarks - bug15 2:f91e97234c2b + bug15 2:4e965c66c983 Alice receives code review, amends her fix, and goes out to lunch to await second review. @@ -212,15 +232,15 @@ obsoleted 1 changesets updating bookmark bug15 $ hg -R ../review bookmarks - bug15 3:cbdfbd5a5db2 + bug15 3:3363442626b3 Figure SG06: review repository after Alice pushes her amended changeset. $ hg --hidden -R ../review shortlog -G -r 1:: - o 3:cbdfbd5a5db2 draft fix bug 15 (v2) + o 3:3363 draft fix bug 15 (v2) | - | x 2:f91e97234c2b draft fix bug 15 (v1) + | x 2:4e96 draft fix bug 15 (v1) |/ - @ 1:de6151c48e1c public fix bug 37 + @ 1:7b49 public fix bug 37 | ~ @@ -232,15 +252,15 @@ $ hg push -B featureX pushing to $TESTTMP/review (glob) searching for changes - remote has heads on branch 'default' that are not known locally: cbdfbd5a5db2 + remote has heads on branch 'default' that are not known locally: 3363442626b3 adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) exporting bookmark featureX $ hg -R ../review bookmarks - bug15 3:cbdfbd5a5db2 - featureX 4:193657d1e852 + bug15 3:3363442626b3 + featureX 4:c7ff98c7916f Bob receives first review, amends and pushes. $ echo 'do stuff' > file1 @@ -248,7 +268,7 @@ $ hg push pushing to $TESTTMP/review (glob) searching for changes - remote has heads on branch 'default' that are not known locally: cbdfbd5a5db2 + remote has heads on branch 'default' that are not known locally: 3363442626b3 adding changesets adding manifests adding file changes @@ -274,7 +294,7 @@ $ hg push ../review pushing to ../review searching for changes - remote has heads on branch 'default' that are not known locally: cbdfbd5a5db2 + remote has heads on branch 'default' that are not known locally: 3363442626b3 adding changesets adding manifests adding file changes @@ -283,45 +303,28 @@ obsoleted 1 changesets updating bookmark featureX $ hg -R ../review bookmarks - bug15 3:cbdfbd5a5db2 - featureX 6:540ba8f317e6 + bug15 3:3363442626b3 + featureX 6:9d21d673314a Figure SG07: review and public repos after Bob implements feature X. $ hg --hidden -R ../review shortlog -G -r 1:: - o 6:540ba8f317e6 public implement feature X (v3) + o 6:9d21 public implement feature X (v3) | - | x 5:0eb74a7b6698 draft implement feature X (v2) + | x 5:1bb4 draft implement feature X (v2) |/ - | x 4:193657d1e852 draft implement feature X (v1) + | x 4:c7ff draft implement feature X (v1) |/ - | o 3:cbdfbd5a5db2 draft fix bug 15 (v2) + | o 3:3363 draft fix bug 15 (v2) |/ - | x 2:f91e97234c2b draft fix bug 15 (v1) + | x 2:4e96 draft fix bug 15 (v1) |/ - @ 1:de6151c48e1c public fix bug 37 + @ 1:7b49 public fix bug 37 | ~ $ hg --hidden -R ../public shortlog -G -r 1:: - o 2:540ba8f317e6 public implement feature X (v3) - | - o 1:de6151c48e1c public fix bug 37 + o 2:9d21 public implement feature X (v3) | - ~ - -How do things look in the review repo? - $ cd ../review - $ hg --hidden shortlog -G -r 1:: - o 6:540ba8f317e6 public implement feature X (v3) - | - | x 5:0eb74a7b6698 draft implement feature X (v2) - |/ - | x 4:193657d1e852 draft implement feature X (v1) - |/ - | o 3:cbdfbd5a5db2 draft fix bug 15 (v2) - |/ - | x 2:f91e97234c2b draft fix bug 15 (v1) - |/ - @ 1:de6151c48e1c public fix bug 37 + o 1:7b49 public fix bug 37 | ~ @@ -329,20 +332,20 @@ her change, so now she can publish it. $ cd ../alice $ hg --hidden shortlog -G -r 1:: - @ 3:cbdfbd5a5db2 draft fix bug 15 (v2) + @ 3:3363 draft fix bug 15 (v2) | - | x 2:f91e97234c2b draft fix bug 15 (v1) + | x 2:4e96 draft fix bug 15 (v1) |/ - o 1:de6151c48e1c public fix bug 37 + o 1:7b49 public fix bug 37 | ~ $ hg outgoing -q ../public - 3:cbdfbd5a5db2 + 3:3363442626b3 $ hg push ../public pushing to ../public searching for changes - remote has heads on branch 'default' that are not known locally: 540ba8f317e6 - abort: push creates new remote head cbdfbd5a5db2 with bookmark 'bug15'! + remote has heads on branch 'default' that are not known locally: 9d21d673314a + abort: push creates new remote head 3363442626b3 with bookmark 'bug15'! (pull and merge or see 'hg help push' for details about pushing new heads) [255] $ hg pull ../public @@ -353,30 +356,30 @@ adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) 2 new obsolescence markers - new changesets 540ba8f317e6 + new changesets 9d21d673314a (run 'hg heads' to see heads, 'hg merge' to merge) $ hg log -G -q -r 'head()' - o 4:540ba8f317e6 + o 4:9d21d673314a | ~ - @ 3:cbdfbd5a5db2 + @ 3:3363442626b3 | ~ $ hg --hidden shortlog -G -r 1:: - o 4:540ba8f317e6 public implement feature X (v3) + o 4:9d21 public implement feature X (v3) | - | @ 3:cbdfbd5a5db2 draft fix bug 15 (v2) + | @ 3:3363 draft fix bug 15 (v2) |/ - | x 2:f91e97234c2b draft fix bug 15 (v1) + | x 2:4e96 draft fix bug 15 (v1) |/ - o 1:de6151c48e1c public fix bug 37 + o 1:7b49 public fix bug 37 | ~ Alice rebases her draft changeset on top of Bob's public changeset and publishes the result. - $ hg rebase -d 5 - rebasing 3:cbdfbd5a5db2 "fix bug 15 (v2)" (bug15) + $ hg rebase -d 4 + rebasing 3:3363442626b3 "fix bug 15 (v2)" (bug15) $ hg push ../public pushing to ../public searching for changes @@ -398,27 +401,27 @@ Figure SG08: review and public changesets after Alice pushes. $ hg --hidden -R ../review shortlog -G -r 1:: - o 7:a06ec1bf97bd public fix bug 15 (v2) + o 7:dd15 public fix bug 15 (v2) | - o 6:540ba8f317e6 public implement feature X (v3) + o 6:9d21 public implement feature X (v3) | - | x 5:0eb74a7b6698 draft implement feature X (v2) + | x 5:1bb4 draft implement feature X (v2) |/ - | x 4:193657d1e852 draft implement feature X (v1) + | x 4:c7ff draft implement feature X (v1) |/ - | x 3:cbdfbd5a5db2 draft fix bug 15 (v2) + | x 3:3363 draft fix bug 15 (v2) |/ - | x 2:f91e97234c2b draft fix bug 15 (v1) + | x 2:4e96 draft fix bug 15 (v1) |/ - @ 1:de6151c48e1c public fix bug 37 + @ 1:7b49 public fix bug 37 | ~ $ hg --hidden -R ../public shortlog -G -r 1:: - o 3:a06ec1bf97bd public fix bug 15 (v2) + o 3:dd15 public fix bug 15 (v2) | - o 2:540ba8f317e6 public implement feature X (v3) + o 2:9d21 public implement feature X (v3) | - o 1:de6151c48e1c public fix bug 37 + o 1:7b49 public fix bug 37 | ~ $ cd .. @@ -445,7 +448,7 @@ $ echo 'pretty good fix' >> file1 $ hg commit -u bob -m 'fix bug 24 (v1)' $ hg shortlog -r . - 4:2fe6c4bd32d0 draft fix bug 24 (v1) + 4:b2be draft fix bug 24 (v1) Alice pulls Bob's draft changeset and amends it herself. :: @@ -457,7 +460,7 @@ adding manifests adding file changes added 1 changesets with 1 changes to 1 files - new changesets 2fe6c4bd32d0 (1 drafts) + new changesets b2be254b3b9f (1 drafts) 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ echo 'better fix (alice)' >> file1 $ hg amend -u alice -m 'fix bug 24 (v2 by alice)' @@ -468,11 +471,11 @@ $ echo 'better fix (bob)' >> file1 $ hg amend -u bob -m 'fix bug 24 (v2 by bob)' $ hg --hidden shortlog -G -r 3:: - @ 5:a360947f6faf draft fix bug 24 (v2 by bob) + @ 5:541f draft fix bug 24 (v2 by bob) | - | x 4:2fe6c4bd32d0 draft fix bug 24 (v1) + | x 4:b2be draft fix bug 24 (v1) |/ - o 3:a06ec1bf97bd public fix bug 15 (v2) + o 3:dd15 public fix bug 15 (v2) | ~ @@ -486,23 +489,23 @@ added 1 changesets with 1 changes to 1 files (+1 heads) 1 new obsolescence markers 2 new content-divergent changesets - new changesets e3f99ce9d9cd (1 drafts) + new changesets e3a586fd2377 (1 drafts) (run 'hg heads' to see heads, 'hg merge' to merge) Figure SG09: multiple heads! divergence! oh my! $ hg --hidden shortlog -G -r 3:: - * 6:e3f99ce9d9cd draft fix bug 24 (v2 by alice) + * 6:e3a5 draft fix bug 24 (v2 by alice) | - | @ 5:a360947f6faf draft fix bug 24 (v2 by bob) + | @ 5:541f draft fix bug 24 (v2 by bob) |/ - | x 4:2fe6c4bd32d0 draft fix bug 24 (v1) + | x 4:b2be draft fix bug 24 (v1) |/ - o 3:a06ec1bf97bd public fix bug 15 (v2) + o 3:dd15 public fix bug 15 (v2) | ~ - $ hg --hidden shortlog -r 'successors(2fe6)' - 5:a360947f6faf draft fix bug 24 (v2 by bob) - 6:e3f99ce9d9cd draft fix bug 24 (v2 by alice) + $ hg --hidden shortlog -r 'successors(b2be)' + 5:541f draft fix bug 24 (v2 by bob) + 6:e3a5 draft fix bug 24 (v2 by alice) Use evolve to fix the divergence. $ cat > editor.sh <