# HG changeset patch # User Pierre-Yves David # Date 1509549993 -3600 # Node ID 678a9802c56b8f666e19e5aaa41a71304eaf3c93 # Parent f286eefbd20d0c3ff5b8ff99fd4d2133fe70f231 topic: add an option to automatically publish topic-less changeset This new option will help playing with merge based workflow. diff -r f286eefbd20d -r 678a9802c56b CHANGELOG --- a/CHANGELOG Mon Oct 30 19:24:14 2017 +0100 +++ b/CHANGELOG Wed Nov 01 16:26:33 2017 +0100 @@ -14,6 +14,8 @@ * add an experimental flag to enforce one head per name policy, (off by default, see 'hg help -e topic' for details) + * add an experimental flag to have changesets without topic published on push, + (off by default, see 'hg help -e topic' for details) 6.8.0 -- 2017-10-23 ------------------- diff -r f286eefbd20d -r 678a9802c56b hgext3rd/topic/__init__.py --- a/hgext3rd/topic/__init__.py Mon Oct 30 19:24:14 2017 +0100 +++ b/hgext3rd/topic/__init__.py Wed Nov 01 16:26:33 2017 +0100 @@ -72,6 +72,27 @@ [experimental] enforce-single-head = yes + +Publishing behavior +=================== + +Topic vanish when changeset move to the public phases. Moving to the public +phase usually happens on push, but it is possible ot update that behavior. The +server needs to have specific config for this. + + # everything pushed become public (the default) + [phase] + publish = yes + + # nothing push turned public + [phase] + publish = no + + # topic branches are not published, changeset without topic are + [phase] + publish = no + [experimental] + topic.publish-bare-branch = yes """ from __future__ import absolute_import @@ -168,6 +189,9 @@ configitem('experimental', 'topic-mode', default=None, ) + configitem('experimental', 'topic.publish-bare-branch', + default=False, + ) configitem('_internal', 'keep-topic', default=False, ) @@ -381,8 +405,8 @@ if desc in ('strip', 'repair') or ctr is not None: return tr + reporef = weakref.ref(self) if repo.ui.configbool('experimental', 'enforce-single-head'): - reporef = weakref.ref(self) origvalidator = tr.validator def validator(tr2): @@ -391,6 +415,20 @@ origvalidator(tr2) tr.validator = validator + if (repo.ui.configbool('experimental', 'topic.publish-bare-branch') + and (desc.startswith('push') + or desc.startswith('serve')) + ): + origclose = tr.close + trref = weakref.ref(tr) + + def close(): + repo = reporef() + tr2 = trref() + flow.publishbarebranch(repo, tr2) + origclose() + tr.close = close + # real transaction start ct = self.currenttopic if not ct: diff -r f286eefbd20d -r 678a9802c56b hgext3rd/topic/flow.py --- a/hgext3rd/topic/flow.py Mon Oct 30 19:24:14 2017 +0100 +++ b/hgext3rd/topic/flow.py Wed Nov 01 16:26:33 2017 +0100 @@ -3,6 +3,7 @@ from mercurial import ( error, node, + phases, ) from mercurial.i18n import _ @@ -13,3 +14,14 @@ hexs = [node.short(n) for n in heads] raise error.Abort(_('%d heads on "%s"') % (len(heads), name), hint=(', '.join(hexs))) + +def publishbarebranch(repo, tr): + """Publish changeset without topic""" + if 'node' not in tr.hookargs: # no new node + return + startnode = node.bin(tr.hookargs['node']) + topublish = repo.revs('not public() and (%n:) - hidden() - topic()', startnode) + if topublish: + cl = repo.changelog + nodes = [cl.node(r) for r in topublish] + repo._phasecache.advanceboundary(repo, tr, phases.public, nodes) diff -r f286eefbd20d -r 678a9802c56b tests/test-topic-flow-publish-bare.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-topic-flow-publish-bare.t Wed Nov 01 16:26:33 2017 +0100 @@ -0,0 +1,292 @@ +===================== +Test workflow options +===================== + + $ . "$TESTDIR/testlib/topic_setup.sh" + $ . "$TESTDIR/testlib/common.sh" + +Publishing of bare branch +========================= + + $ hg init bare-branch-server + $ cd bare-branch-server + $ cat <> .hg/hgrc + > [phases] + > publish = no + > [experimental] + > topic.publish-bare-branch = yes + > EOF + $ mkcommit ROOT + $ mkcommit c_dA0 + $ hg phase --public -r 'all()' + $ cd .. + + $ hg clone bare-branch-server bare-client + updating to branch default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + +pushing a simple branch publish it +---------------------------------- + + $ cd bare-client + $ mkcommit c_dB0 + $ hg push + pushing to $TESTTMP/bare-branch-server + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + $ hg log --rev 'sort(all(), "topo")' -GT '{rev}:{node|short} {desc} {phase} {branch} {topics}' + @ 2:286d02a6e2a2 c_dB0 public default + | + o 1:134bc3852ad2 c_dA0 public default + | + o 0:ea207398892e ROOT public default + + +pushing two heads at the same time +---------------------------------- + + $ hg update 'desc("c_dA0")' + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ mkcommit c_dC0 + created new head + $ hg update 'desc("c_dA0")' + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ mkcommit c_dD0 + created new head + $ hg push -f + pushing to $TESTTMP/bare-branch-server + searching for changes + adding changesets + adding manifests + adding file changes + added 2 changesets with 2 changes to 2 files (+2 heads) + $ hg log --rev 'sort(all(), "topo")' -GT '{rev}:{node|short} {desc} {phase} {branch} {topics}' + @ 4:9bf953aa81f6 c_dD0 public default + | + | o 3:9d5b8e1f08a4 c_dC0 public default + |/ + | o 2:286d02a6e2a2 c_dB0 public default + |/ + o 1:134bc3852ad2 c_dA0 public default + | + o 0:ea207398892e ROOT public default + + +pushing something not on default +-------------------------------- + + $ hg update 'desc("ROOT")' + 0 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ hg branch branchA + marked working directory as branch branchA + (branches are permanent and global, did you want a bookmark?) + $ mkcommit c_aE0 + $ hg push --new-branch + pushing to $TESTTMP/bare-branch-server + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files (+1 heads) + $ hg log --rev 'sort(all(), "topo")' -GT '{rev}:{node|short} {desc} {phase} {branch} {topics}' + @ 5:0db08e758601 c_aE0 public branchA + | + | o 4:9bf953aa81f6 c_dD0 public default + | | + | | o 3:9d5b8e1f08a4 c_dC0 public default + | |/ + | | o 2:286d02a6e2a2 c_dB0 public default + | |/ + | o 1:134bc3852ad2 c_dA0 public default + |/ + o 0:ea207398892e ROOT public default + + +pushing topic +------------- + + $ hg update 'desc("c_dD0")' + 2 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ hg topic foo + marked working directory as topic: foo + $ mkcommit c_dF0 + active topic 'foo' grew its first changeset + $ hg push + pushing to $TESTTMP/bare-branch-server + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + $ hg log --rev 'sort(all(), "topo")' -GT '{rev}:{node|short} {desc} {phase} {branch} {topics}' + @ 6:0867c4471796 c_dF0 draft default foo + | + o 4:9bf953aa81f6 c_dD0 public default + | + | o 3:9d5b8e1f08a4 c_dC0 public default + |/ + | o 2:286d02a6e2a2 c_dB0 public default + |/ + o 1:134bc3852ad2 c_dA0 public default + | + | o 5:0db08e758601 c_aE0 public branchA + |/ + o 0:ea207398892e ROOT public default + + +pushing topic over a bare branch +-------------------------------- + + $ hg update 'desc("c_dC0")' + 1 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ mkcommit c_dG0 + $ hg topic bar + marked working directory as topic: bar + $ mkcommit c_dH0 + active topic 'bar' grew its first changeset + $ hg push + pushing to $TESTTMP/bare-branch-server + searching for changes + adding changesets + adding manifests + adding file changes + added 2 changesets with 2 changes to 2 files + $ hg log --rev 'sort(all(), "topo")' -GT '{rev}:{node|short} {desc} {phase} {branch} {topics}' + @ 8:858be9a8daaf c_dH0 draft default bar + | + o 7:0e4041d324d0 c_dG0 public default + | + o 3:9d5b8e1f08a4 c_dC0 public default + | + | o 2:286d02a6e2a2 c_dB0 public default + |/ + | o 6:0867c4471796 c_dF0 draft default foo + | | + | o 4:9bf953aa81f6 c_dD0 public default + |/ + o 1:134bc3852ad2 c_dA0 public default + | + | o 5:0db08e758601 c_aE0 public branchA + |/ + o 0:ea207398892e ROOT public default + + +Pushing topic in between bare branch +------------------------------------ + + $ hg update 'desc("c_dB0")' + 1 files updated, 0 files merged, 3 files removed, 0 files unresolved + $ mkcommit c_dI0 + $ hg update 'desc("c_dH0")' + switching to topic bar + 3 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ mkcommit c_dJ0 + $ hg update 'desc("c_aE0")' + 1 files updated, 0 files merged, 5 files removed, 0 files unresolved + $ mkcommit c_aK0 + $ hg push + pushing to $TESTTMP/bare-branch-server + searching for changes + adding changesets + adding manifests + adding file changes + added 3 changesets with 3 changes to 3 files + $ hg log --rev 'sort(all(), "topo")' -GT '{rev}:{node|short} {desc} {phase} {branch} {topics}' + @ 11:b0a00ebdfd24 c_aK0 public branchA + | + o 5:0db08e758601 c_aE0 public branchA + | + | o 10:abb5c84eb9e9 c_dJ0 draft default bar + | | + | o 8:858be9a8daaf c_dH0 draft default bar + | | + | o 7:0e4041d324d0 c_dG0 public default + | | + | o 3:9d5b8e1f08a4 c_dC0 public default + | | + | | o 9:4b5570d89f0f c_dI0 public default + | | | + | | o 2:286d02a6e2a2 c_dB0 public default + | |/ + | | o 6:0867c4471796 c_dF0 draft default foo + | | | + | | o 4:9bf953aa81f6 c_dD0 public default + | |/ + | o 1:134bc3852ad2 c_dA0 public default + |/ + o 0:ea207398892e ROOT public default + + +merging a topic in branch +------------------------- + + $ hg update default + 3 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ hg merge foo + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg ci -m 'c_dL0' + $ hg push + pushing to $TESTTMP/bare-branch-server + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 0 changes to 0 files (-1 heads) + $ hg log --rev 'sort(all(), "topo")' -GT '{rev}:{node|short} {desc} {phase} {branch} {topics}' + @ 12:a6f9f8c6c6cc c_dL0 public default + |\ + | o 9:4b5570d89f0f c_dI0 public default + | | + o | 6:0867c4471796 c_dF0 public default + | | + o | 4:9bf953aa81f6 c_dD0 public default + | | + | | o 10:abb5c84eb9e9 c_dJ0 draft default bar + | | | + | | o 8:858be9a8daaf c_dH0 draft default bar + | | | + | | o 7:0e4041d324d0 c_dG0 public default + | | | + +---o 3:9d5b8e1f08a4 c_dC0 public default + | | + | o 2:286d02a6e2a2 c_dB0 public default + |/ + o 1:134bc3852ad2 c_dA0 public default + | + | o 11:b0a00ebdfd24 c_aK0 public branchA + | | + | o 5:0db08e758601 c_aE0 public branchA + |/ + o 0:ea207398892e ROOT public default + + $ hg log -R ../bare-branch-server --rev 'sort(all(), "topo")' -GT '{rev}:{node|short} {desc} {phase} {branch} {topics}' + o 12:a6f9f8c6c6cc c_dL0 public default + |\ + | o 9:4b5570d89f0f c_dI0 public default + | | + o | 6:0867c4471796 c_dF0 public default + | | + o | 4:9bf953aa81f6 c_dD0 public default + | | + | | o 10:abb5c84eb9e9 c_dJ0 draft default bar + | | | + | | o 8:858be9a8daaf c_dH0 draft default bar + | | | + | | o 7:0e4041d324d0 c_dG0 public default + | | | + +---o 3:9d5b8e1f08a4 c_dC0 public default + | | + | o 2:286d02a6e2a2 c_dB0 public default + |/ + @ 1:134bc3852ad2 c_dA0 public default + | + | o 11:b0a00ebdfd24 c_aK0 public branchA + | | + | o 5:0db08e758601 c_aE0 public branchA + |/ + o 0:ea207398892e ROOT public default +