changeset 3300:8f74cf219be3 default tip

packaging: merge 7.0.1 into default
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 15 Nov 2017 00:30:15 +0100
parents 5db76f35efce (current diff) f5d5f08c8f08 (diff)
children
files hgext3rd/evolve/metadata.py hgext3rd/topic/__init__.py
diffstat 10 files changed, 241 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags
+++ b/.hgtags
@@ -60,3 +60,4 @@
 430ad68292d76b9387d1eeadf289951f51fd88d3 6.7.1
 ec0bbf26ce7fadd42c637e01d3750dac96ac0b1b 6.8.0
 c56c028f3802202241551e5953bea74ab3a6c434 7.0.0
+c4940c22d76b9c6b3c2117a3b490f3c4fd796972 7.0.1
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -11,6 +11,10 @@
             to server with the extension bu obsolescence marker exchange
             disabled.
 
+topic (0.5.1)
+
+  * fix new-heads check when pushing new topic with --publish.
+
 7.0.0 -- 2017-10-23
 -------------------
 
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+mercurial-evolve (7.0.1) unstable; urgency=medium
+
+  *  new upstream release
+
+ -- Pierre-Yves David <pierre-yves.david@ens-lyon.org>  Wed, 15 Nov 2017 00:14:42 +0100
+
 mercurial-evolve (7.0.0-1) unstable; urgency=medium
 
   * new upstream release
--- a/hgext3rd/evolve/__init__.py
+++ b/hgext3rd/evolve/__init__.py
@@ -416,10 +416,10 @@
 def _configureoptions(ui, repo):
     # If no capabilities are specified, enable everything.
     # This is so existing evolve users don't need to change their config.
-    evolveopts = ui.configlist('experimental', 'evolution')
+    evolveopts = repo.ui.configlist('experimental', 'evolution')
     if not evolveopts:
         evolveopts = ['all']
-        ui.setconfig('experimental', 'evolution', evolveopts, 'evolve')
+        repo.ui.setconfig('experimental', 'evolution', evolveopts, 'evolve')
     if obsolete.isenabled(repo, 'exchange'):
         repo.ui.setconfig('server', 'bundle1', False)
 
--- a/hgext3rd/evolve/metadata.py
+++ b/hgext3rd/evolve/metadata.py
@@ -6,6 +6,6 @@
 # GNU General Public License version 2 or any later version.
 
 __version__ = '7.1.0.dev'
-testedwith = '4.1.3 4.2.3 4.3.2 4.4'
+testedwith = '4.1.3 4.2.3 4.3.2 4.4.1'
 minimumhgversion = '4.1'
 buglink = 'https://bz.mercurial-scm.org/'
--- a/hgext3rd/evolve/serveronly.py
+++ b/hgext3rd/evolve/serveronly.py
@@ -53,9 +53,9 @@
 
 @eh.reposetup
 def default2evolution(ui, repo):
-    evolveopts = ui.configlist('experimental', 'evolution')
+    evolveopts = repo.ui.configlist('experimental', 'evolution')
     if not evolveopts:
         evolveopts = 'all'
-        ui.setconfig('experimental', 'evolution', evolveopts)
+        repo.ui.setconfig('experimental', 'evolution', evolveopts)
     if obsolete.isenabled(repo, 'exchange'):
         repo.ui.setconfig('server', 'bundle1', False)
--- a/hgext3rd/topic/__init__.py
+++ b/hgext3rd/topic/__init__.py
@@ -176,7 +176,7 @@
 
 __version__ = '0.6.0.dev'
 
-testedwith = '4.1.3 4.2.3 4.3.3 4.4'
+testedwith = '4.1.3 4.2.3 4.3.3 4.4.1'
 minimumhgversion = '4.1'
 buglink = 'https://bz.mercurial-scm.org/'
 
--- a/hgext3rd/topic/discovery.py
+++ b/hgext3rd/topic/discovery.py
@@ -1,5 +1,6 @@
 from __future__ import absolute_import
 
+import collections
 import weakref
 
 from mercurial.i18n import _
@@ -15,6 +16,7 @@
 
 def _headssummary(orig, *args):
     # In mercurial < 4.2, we receive repo, remote and outgoing as arguments
+    pushop = None
     if len(args) == 3:
         pushoparg = False
         repo, remote, outgoing = args
@@ -31,17 +33,51 @@
 
     publishing = ('phases' not in remote.listkeys('namespaces')
                   or bool(remote.listkeys('phases').get('publishing', False)))
-    if publishing or not remote.capable('topics'):
+    if ((publishing or not remote.capable('topics'))
+            and not getattr(pushop, 'publish', False)):
         return orig(*args)
 
+    publishedset = ()
+    remotebranchmap = None
+    origremotebranchmap = remote.branchmap
+    # < hg-4.4 do not have a --publish flag anyway
+    if pushoparg and util.safehasattr(pushop, 'remotephases'):
+        publishednode = [c.node() for c in pushop.outdatedphases]
+        publishedset = repo.revs('ancestors(%ln + %ln)',
+                                 publishednode,
+                                 pushop.remotephases.publicheads)
+
+        rev = repo.unfiltered().changelog.nodemap.get
+
+        def remotebranchmap():
+            # drop topic information from changeset about to be published
+            result = collections.defaultdict(list)
+            for branch, heads in origremotebranchmap().iteritems():
+                if ':' not in branch:
+                    result[branch].extend(heads)
+                else:
+                    namedbranch = branch.split(':', 1)[0]
+                    for h in heads:
+                        r = rev(h)
+                        if r is not None and r in publishedset:
+                            result[namedbranch].append(h)
+                        else:
+                            result[branch].append(h)
+            for heads in result.itervalues():
+                heads.sort()
+            return result
+
     class repocls(repo.__class__):
         # awful hack to see branch as "branch:topic"
         def __getitem__(self, key):
             ctx = super(repocls, self).__getitem__(key)
             oldbranch = ctx.branch
+            rev = ctx.rev()
 
             def branch():
                 branch = oldbranch()
+                if rev in publishedset:
+                    return branch
                 topic = ctx.topic()
                 if topic:
                     branch = "%s:%s" % (branch, topic)
@@ -56,6 +92,8 @@
 
             def branchinfo(rev):
                 branch, close = changelog.branchinfo(rev)
+                if rev in publishedset:
+                    return branch, close
                 topic = repo[rev].topic()
                 if topic:
                     branch = "%s:%s" % (branch, topic)
@@ -67,6 +105,8 @@
     oldrepocls = repo.__class__
     try:
         repo.__class__ = repocls
+        if remotebranchmap is not None:
+            remote.branchmap = remotebranchmap
         unxx = repo.filtered('unfiltered-topic')
         repo.unfiltered = lambda: unxx
         if pushoparg:
@@ -83,6 +123,8 @@
         if 'unfiltered' in vars(repo):
             del repo.unfiltered
         repo.__class__ = oldrepocls
+        if remotebranchmap is not None:
+            remote.branchmap = origremotebranchmap
 
 def wireprotobranchmap(orig, repo, proto):
     oldrepo = repo.__class__
--- a/tests/test-topic-flow-publish-flag.t
+++ b/tests/test-topic-flow-publish-flag.t
@@ -280,3 +280,147 @@
   |
   o  0:ea207398892e ROOT public default
   
+
+Testing --publish interaction with multiple head detection
+============================================================
+
+pushing a topic changeset, publishing it
+----------------------------------------
+
+  $ hg topic topic_A
+  marked working directory as topic: topic_A
+  $ mkcommit c_dK0
+  active topic 'topic_A' grew its first changeset
+  $ hg push -r 'desc("c_dK0")' --publish
+  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
+  active topic 'topic_A' is now empty
+  $ hg log --rev 'sort(all(), "topo")' -GT '{rev}:{node|short} {desc} {phase} {branch} {topics}'
+  @  11:d06fc4f891e8 c_dK0 public default
+  |
+  o  10:ac4cf59f2aac c_dJ0 public default
+  |
+  o  9:fbf2be276221 c_dI0 public default
+  |
+  o  5:5576ae39eaee c_dE0 public default
+  |
+  | o  8:8e85646c135f c_oH0 draft other
+  | |
+  | o  7:d293f74a1233 c_oG0 public other
+  | |
+  | o  6:45b23c834b6a c_oF0 public other
+  |/
+  o  4:c63e7dd93a91 c_dD0 public default
+  |
+  o  3:7d56a56d2547 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 a new branch, alongside an existing topic
+-------------------------------------------------
+
+  $ hg topic topic_A
+  $ mkcommit c_dL0
+  active topic 'topic_A' grew its first changeset
+  $ hg push -r 'desc("c_dL0")'
+  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 update 'desc("c_dK")'
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit c_dM0
+  $ hg push -r 'desc("c_dM0")' --publish
+  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}'
+  @  13:0d144c8b6c8f c_dM0 public default
+  |
+  | o  12:3c73f6cabf07 c_dL0 draft default topic_A
+  |/
+  o  11:d06fc4f891e8 c_dK0 public default
+  |
+  o  10:ac4cf59f2aac c_dJ0 public default
+  |
+  o  9:fbf2be276221 c_dI0 public default
+  |
+  o  5:5576ae39eaee c_dE0 public default
+  |
+  | o  8:8e85646c135f c_oH0 draft other
+  | |
+  | o  7:d293f74a1233 c_oG0 public other
+  | |
+  | o  6:45b23c834b6a c_oF0 public other
+  |/
+  o  4:c63e7dd93a91 c_dD0 public default
+  |
+  o  3:7d56a56d2547 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 a topic (publishing) alongside and existing branch head
+---------------------------------------------------------------
+
+  $ hg update 'desc("c_dK")'
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg topic topic_B
+  marked working directory as topic: topic_B
+  $ mkcommit c_dN0
+  active topic 'topic_B' grew its first changeset
+  $ hg push -r 'desc("c_dN0")' --publish
+  pushing to $TESTTMP/bare-branch-server
+  searching for changes
+  abort: push creates new remote head 4dcd0be9db96!
+  (merge or see 'hg help push' for details about pushing new heads)
+  [255]
+  $ hg log --rev 'sort(all(), "topo")' -GT '{rev}:{node|short} {desc} {phase} {branch} {topics}'
+  @  14:4dcd0be9db96 c_dN0 draft default topic_B
+  |
+  | o  13:0d144c8b6c8f c_dM0 public default
+  |/
+  | o  12:3c73f6cabf07 c_dL0 draft default topic_A
+  |/
+  o  11:d06fc4f891e8 c_dK0 public default
+  |
+  o  10:ac4cf59f2aac c_dJ0 public default
+  |
+  o  9:fbf2be276221 c_dI0 public default
+  |
+  o  5:5576ae39eaee c_dE0 public default
+  |
+  | o  8:8e85646c135f c_oH0 draft other
+  | |
+  | o  7:d293f74a1233 c_oG0 public other
+  | |
+  | o  6:45b23c834b6a c_oF0 public other
+  |/
+  o  4:c63e7dd93a91 c_dD0 public default
+  |
+  o  3:7d56a56d2547 c_dC0 public default
+  |
+  o  2:286d02a6e2a2 c_dB0 public default
+  |
+  o  1:134bc3852ad2 c_dA0 public default
+  |
+  o  0:ea207398892e ROOT public default
+  
--- a/tests/test-wireproto.t
+++ b/tests/test-wireproto.t
@@ -208,8 +208,45 @@
   abort: unexpected response: empty string
   [255]
 
+(do some extra pulling to be sure)
+
+  $ hg -R client pull http://localhost:$HGPORT/
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+  obsmarker-exchange: 258 bytes received
+
+  $ hg -R client pull http://localhost:$HGPORT/ --config experimental.evolution=createmarkers
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+
+  $ hg -R client pull http://localhost:$HGPORT/ --config experimental.evolution=createmarkers --config extensions.evolve='!'
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+
 But we do let it goes fine on repository with exchange disabled:
 
   $ $RUNTESTDIR/killdaemons.py $DAEMON_PIDS
   $ hg serve -R server -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log  --config experimental.evolution='!'
   $ hg debugpushkey http://localhost:$HGPORT/ obsolete
+
+(do some extra pulling to be sure)
+
+  $ hg -R client pull http://localhost:$HGPORT/
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+
+  $ hg -R client pull http://localhost:$HGPORT/ --config experimental.evolution=createmarkers
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+
+  $ hg -R client pull http://localhost:$HGPORT/ --config experimental.evolution=createmarkers --config extensions.evolve='!'
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+
+  $ $RUNTESTDIR/killdaemons.py $DAEMON_PIDS