changeset 23382:a81c76106d90

merge with stable
author Matt Mackall <mpm@selenic.com>
date Sat, 22 Nov 2014 17:09:04 -0600
parents 90cc552ceed5 (current diff) cc0ff93d0c0c (diff)
children 0791a10ad87c
files mercurial/changegroup.py mercurial/exchange.py tests/test-generaldelta.t
diffstat 5 files changed, 72 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/changegroup.py	Thu Nov 20 16:39:32 2014 -0800
+++ b/mercurial/changegroup.py	Sat Nov 22 17:09:04 2014 -0600
@@ -325,6 +325,7 @@
         # for progress output
         msgbundling = _('bundling')
 
+        clrevorder = {}
         mfs = {} # needed manifests
         fnodes = {} # needed file nodes
         changedfiles = set()
@@ -334,6 +335,7 @@
         # Returns the linkrev node (identity in the changelog case).
         def lookupcl(x):
             c = cl.read(x)
+            clrevorder[x] = len(clrevorder)
             changedfiles.update(c[3])
             # record the first changeset introducing this manifest version
             mfs.setdefault(c[0], x)
@@ -349,13 +351,16 @@
         # Returns the linkrev node (collected in lookupcl).
         def lookupmf(x):
             clnode = mfs[x]
-            if not fastpathlinkrev:
+            if not fastpathlinkrev or reorder:
                 mdata = mf.readfast(x)
                 for f, n in mdata.iteritems():
                     if f in changedfiles:
                         # record the first changeset introducing this filelog
                         # version
-                        fnodes.setdefault(f, {}).setdefault(n, clnode)
+                        fclnodes = fnodes.setdefault(f, {})
+                        fclnode = fclnodes.setdefault(n, clnode)
+                        if clrevorder[clnode] < clrevorder[fclnode]:
+                            fclnodes[n] = clnode
             return clnode
 
         mfnodes = self.prune(mf, mfs, commonrevs, source)
@@ -368,7 +373,7 @@
         needed = set(cl.rev(x) for x in clnodes)
 
         def linknodes(filerevlog, fname):
-            if fastpathlinkrev:
+            if fastpathlinkrev and not reorder:
                 llr = filerevlog.linkrev
                 def genfilenodes():
                     for r in filerevlog:
--- a/mercurial/exchange.py	Thu Nov 20 16:39:32 2014 -0800
+++ b/mercurial/exchange.py	Sat Nov 22 17:09:04 2014 -0600
@@ -681,51 +681,15 @@
 
         # filter heads already turned public by the push
         outdated = [c for c in outdated if c.node() not in pheads]
-        b2caps = bundle2.bundle2caps(pushop.remote)
-        if 'b2x:pushkey' in b2caps:
-            # server supports bundle2, let's do a batched push through it
-            #
-            # This will eventually be unified with the changesets bundle2 push
-            bundler = bundle2.bundle20(pushop.ui, b2caps)
-            capsblob = bundle2.encodecaps(bundle2.getrepocaps(pushop.repo))
-            bundler.newpart('b2x:replycaps', data=capsblob)
-            part2node = []
-            enc = pushkey.encode
-            for newremotehead in outdated:
-                part = bundler.newpart('b2x:pushkey')
-                part.addparam('namespace', enc('phases'))
-                part.addparam('key', enc(newremotehead.hex()))
-                part.addparam('old', enc(str(phases.draft)))
-                part.addparam('new', enc(str(phases.public)))
-                part2node.append((part.id, newremotehead))
-            stream = util.chunkbuffer(bundler.getchunks())
-            try:
-                reply = pushop.remote.unbundle(stream, ['force'], 'push')
-                op = bundle2.processbundle(pushop.repo, reply)
-            except error.BundleValueError, exc:
-                raise util.Abort('missing support for %s' % exc)
-            for partid, node in part2node:
-                partrep = op.records.getreplies(partid)
-                results = partrep['pushkey']
-                assert len(results) <= 1
-                msg = None
-                if not results:
-                    msg = _('server ignored update of %s to public!\n') % node
-                elif not int(results[0]['return']):
-                    msg = _('updating %s to public failed!\n') % node
-                if msg is not None:
-                    pushop.ui.warn(msg)
-
-        else:
-            # fallback to independent pushkey command
-            for newremotehead in outdated:
-                r = pushop.remote.pushkey('phases',
-                                          newremotehead.hex(),
-                                          str(phases.draft),
-                                          str(phases.public))
-                if not r:
-                    pushop.ui.warn(_('updating %s to public failed!\n')
-                                   % newremotehead)
+        # fallback to independent pushkey command
+        for newremotehead in outdated:
+            r = pushop.remote.pushkey('phases',
+                                      newremotehead.hex(),
+                                      str(phases.draft),
+                                      str(phases.public))
+            if not r:
+                pushop.ui.warn(_('updating %s to public failed!\n')
+                               % newremotehead)
 
 def _localphasemove(pushop, nodes, phase=phases.public):
     """move <nodes> to <phase> in the local source repo"""
--- a/mercurial/templates/paper/search.tmpl	Thu Nov 20 16:39:32 2014 -0800
+++ b/mercurial/templates/paper/search.tmpl	Sat Nov 22 17:09:04 2014 -0600
@@ -38,8 +38,8 @@
 </form>
 
 <div class="navigate">
-<a href="{url|urlescape}search/{lessvars%urlparameter}">less</a>
-<a href="{url|urlescape}search/{morevars%urlparameter}">more</a>
+<a href="{url|urlescape}log{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}log{morevars%urlparameter}">more</a>
 </div>
 
 <table class="bigtable">
@@ -54,8 +54,8 @@
 </table>
 
 <div class="navigate">
-<a href="{url|urlescape}search/{lessvars%urlparameter}">less</a>
-<a href="{url|urlescape}search/{morevars%urlparameter}">more</a>
+<a href="{url|urlescape}log{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}log{morevars%urlparameter}">more</a>
 </div>
 
 </div>
--- a/tests/test-generaldelta.t	Thu Nov 20 16:39:32 2014 -0800
+++ b/tests/test-generaldelta.t	Sat Nov 22 17:09:04 2014 -0600
@@ -22,3 +22,50 @@
   >>> gdsize = os.stat("gdrepo/.hg/store/00manifest.i").st_size
   >>> if regsize < gdsize:
   ...     print 'generaldata increased size of manifest'
+
+Verify rev reordering doesnt create invalid bundles (issue4462)
+This requires a commit tree that when pulled will reorder manifest revs such
+that the second manifest to create a file rev will be ordered before the first
+manifest to create that file rev. We also need to do a partial pull to ensure
+reordering happens. At the end we verify the linkrev points at the earliest
+commit.
+
+  $ hg init server --config format.generaldelta=True
+  $ cd server
+  $ touch a
+  $ hg commit -Aqm a
+  $ echo x > x
+  $ echo y > y
+  $ hg commit -Aqm xy
+  $ hg up -q '.^'
+  $ echo x > x
+  $ echo z > z
+  $ hg commit -Aqm xz
+  $ hg up -q 1
+  $ echo b > b
+  $ hg commit -Aqm b
+  $ hg merge -q 2
+  $ hg commit -Aqm merge
+  $ echo c > c
+  $ hg commit -Aqm c
+  $ hg log -G -T '{rev} {shortest(node)} {desc}'
+  @  5 ebb8 c
+  |
+  o    4 baf7 merge
+  |\
+  | o  3 a129 b
+  | |
+  o |  2 958c xz
+  | |
+  | o  1 f00c xy
+  |/
+  o  0 3903 a
+  
+  $ cd ..
+  $ hg init client
+  $ cd client
+  $ hg pull -q ../server -r 4
+  $ hg debugindex x
+     rev    offset  length   base linkrev nodeid       p1           p2
+       0         0       3      0       1 1406e7411862 000000000000 000000000000
+
--- a/tests/test-hgweb-commands.t	Thu Nov 20 16:39:32 2014 -0800
+++ b/tests/test-hgweb-commands.t	Sat Nov 22 17:09:04 2014 -0600
@@ -1007,8 +1007,8 @@
   </form>
   
   <div class="navigate">
-  <a href="/search/?rev=base&revcount=5">less</a>
-  <a href="/search/?rev=base&revcount=20">more</a>
+  <a href="/log?rev=base&revcount=5">less</a>
+  <a href="/log?rev=base&revcount=20">more</a>
   </div>
   
   <table class="bigtable">
@@ -1028,8 +1028,8 @@
   </table>
   
   <div class="navigate">
-  <a href="/search/?rev=base&revcount=5">less</a>
-  <a href="/search/?rev=base&revcount=20">more</a>
+  <a href="/log?rev=base&revcount=5">less</a>
+  <a href="/log?rev=base&revcount=20">more</a>
   </div>
   
   </div>