Mercurial > hg
changeset 46096:4d5e2fd53707
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
author | Joerg Sonnenberger <joerg@bec.de> |
---|---|
date | Sat, 05 Dec 2020 23:35:55 +0100 |
parents | 93e09d370003 |
children | 1b5e0d0bdb05 |
files | mercurial/configitems.py mercurial/localrepo.py mercurial/scmutil.py relnotes/next tests/test-single-head.t |
diffstat | 5 files changed, 115 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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]