singlehead: introduce option to restrict to public changes
The new experimental.single-head-per-branch:public-changes-only option
restricts the single-head-per-branch filter to public changesets. This
is useful when serving one repository with different views as publishing
and non-publishing repository.
Differential Revision: https://phab.mercurial-scm.org/D9525
--- a/mercurial/configitems.py Thu Dec 03 14:39:39 2020 -0800
+++ b/mercurial/configitems.py Sat Dec 05 23:35:55 2020 +0100
@@ -1079,6 +1079,11 @@
)
coreconfigitem(
b'experimental',
+ b'single-head-per-branch:public-changes-only',
+ default=False,
+)
+coreconfigitem(
+ b'experimental',
b'sshserver.support-v2',
default=False,
)
--- a/mercurial/localrepo.py Thu Dec 03 14:39:39 2020 -0800
+++ b/mercurial/localrepo.py Sat Dec 05 23:35:55 2020 +0100
@@ -2254,7 +2254,13 @@
accountclosed = singleheadsub.get(
b"account-closed-heads", False
)
- scmutil.enforcesinglehead(repo, tr2, desc, accountclosed)
+ if singleheadsub.get(b"public-changes-only", False):
+ filtername = b"immutable"
+ else:
+ filtername = b"visible"
+ scmutil.enforcesinglehead(
+ repo, tr2, desc, accountclosed, filtername
+ )
if hook.hashook(repo.ui, b'pretxnclose-bookmark'):
for name, (old, new) in sorted(
tr.changes[b'bookmarks'].items()
--- a/mercurial/scmutil.py Thu Dec 03 14:39:39 2020 -0800
+++ b/mercurial/scmutil.py Sat Dec 05 23:35:55 2020 +0100
@@ -2189,12 +2189,12 @@
return _(b"%s and %d others") % (first, len(nodes) - maxnumnodes)
-def enforcesinglehead(repo, tr, desc, accountclosed=False):
+def enforcesinglehead(repo, tr, desc, accountclosed, filtername):
"""check that no named branch has multiple heads"""
if desc in (b'strip', b'repair'):
# skip the logic during strip
return
- visible = repo.filtered(b'visible')
+ visible = repo.filtered(filtername)
# possible improvement: we could restrict the check to affected branch
bm = visible.branchmap()
for name in bm:
--- a/relnotes/next Thu Dec 03 14:39:39 2020 -0800
+++ b/relnotes/next Sat Dec 05 23:35:55 2020 +0100
@@ -26,8 +26,13 @@
* The memory footprint per changeset during pull/unbundle
operations has been further reduced.
+
== New Experimental Features ==
+* `experimental.single-head-per-branch:public-changes-only` can be used
+ restrict the single head check to public revision. This is useful for
+ overlay repository that have both a publishing and non-publishing view
+ of the same storage.
== Bug Fixes ==
--- a/tests/test-single-head.t Thu Dec 03 14:39:39 2020 -0800
+++ b/tests/test-single-head.t Sat Dec 05 23:35:55 2020 +0100
@@ -277,7 +277,7 @@
c_aL0
c_aM0
-Let's make a new head and push everythin. The server feedback will mention
+Let's make a new head and push everything. The server feedback will mention
exactly one new head because c_aM0 is closed.
$ hg up 'desc("c_aG0")'
@@ -291,3 +291,98 @@
adding manifests
adding file changes
added 3 changesets with 3 changes to 3 files (+1 heads)
+ $ cd ..
+
+
+Test that singe-head-per-branch can be restricted to public changes
+-------------------------------------------------------------------
+
+ $ hg clone -r 49003e504178 single-head-server public-only
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 9 changes to 9 files
+ 1 new obsolescence markers
+ new changesets ea207398892e:49003e504178 (9 drafts)
+ updating to branch branch_A
+ 9 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd public-only
+ $ cat <<EOF >> .hg/hgrc
+ > [phases]
+ > publish = no
+ > [experimental]
+ > single-head-per-branch = yes
+ > single-head-per-branch:public-changes-only = yes
+ > EOF
+ > hg phase -p :
+ $ hg update 'desc("c_aG0")'
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ mkcommit c_dO0
+ created new head
+ $ hg log -G
+ @ changeset: 9:8058fd35cc2b
+ | branch: branch_A
+ | tag: tip
+ | parent: 7:a33fb808fb4b
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c_dO0
+ |
+ | o changeset: 8:49003e504178
+ |/| branch: branch_A
+ | | parent: 7:a33fb808fb4b
+ | | parent: 3:840af1c6bc88
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: c_aI0
+ | |
+ o | changeset: 7:a33fb808fb4b
+ | | branch: branch_A
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: c_aG0
+ | |
+ o | changeset: 6:99a2dc242c5d
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: c_dF1
+ | |
+ o | changeset: 5:6ed1df20edb1
+ |\ \ parent: 4:9bf953aa81f6
+ | | | parent: 2:286d02a6e2a2
+ | | | user: test
+ | | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | | summary: c_dE0
+ | | |
+ | o | changeset: 4:9bf953aa81f6
+ | | | parent: 1:134bc3852ad2
+ | | | user: test
+ | | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | | summary: c_dD0
+ | | |
+ | | o changeset: 3:840af1c6bc88
+ | | | branch: branch_A
+ | | | parent: 0:ea207398892e
+ | | | user: test
+ | | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | | summary: c_aC0
+ | | |
+ o | | changeset: 2:286d02a6e2a2
+ |/ / user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: c_dB0
+ | |
+ o | changeset: 1:134bc3852ad2
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c_dA0
+ |
+ o changeset: 0:ea207398892e
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: ROOT
+
+ $ hg phase -p .
+ abort: rejecting multiple heads on branch "branch_A"
+ (2 heads: 49003e504178 8058fd35cc2b)
+ [255]