[PATCH 6 of 6 REPHASE-VIEW] phases: exchange phase boundaries on push

pierre-yves.david at logilab.fr pierre-yves.david at logilab.fr
Wed Oct 26 07:56:30 CDT 2011


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1319633601 -7200
# Node ID 80b44a8d5b6192c7befcc7b0446dcc2e76db3c88
# Parent  594dd18b4d361c39c2b95d69fded97e9f0de3e69
phases: exchange phase boundaries on push

diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -1553,10 +1553,28 @@ class localrepository(repo.repository):
             locallock = self.lock()
             try:
                 cg, remote_heads, fut = discovery.prepush(self, remote, force,
                                                            revs, newbranch)
                 ret = remote_heads
+                # create a callback for addchangegroup.
+                # If will be used branch of the conditionnal too.
+                def phasescallback(added=[]):
+                    # sync local with remote
+                    remotephases = remote.listkeys('phaseroots')
+                    if remotephases: # remote have publish == False
+                        boundaries = phases.computeheads(self, fut, remotephases)
+                        for phase, boundary in enumerate(boundaries):
+                            phases.moveboundary(self, phase, boundary)
+                    else: # remote have publish == True
+                        phases.moveboundary(self, 0, fut)
+                    # send local heads to remote.
+                    # XXX We can be smarter here and don't resend everything.
+                    for phase in phases.trackedphases:
+                        for head in  self.set('heads(%ln & (::%ln))',
+                                              fut, self._phaseheads[phase]):
+                            r = remote.pushkey('phaseheads', head.hex(), None, phase)
+                            assert r
                 if cg is not None:
                     if unbundle:
                         # local repo finds heads on server, finds out what
                         # revs it must push. once revs transferred, if server
                         # finds it has different heads (someone else won
@@ -1564,17 +1582,19 @@ class localrepository(repo.repository):
                         if force:
                             remote_heads = ['force']
                         # ssh: return remote's addchangegroup()
                         # http: return remote's addchangegroup() or 0 for error
                         ret = remote.unbundle(cg, remote_heads, 'push')
+                        phasescallback()
                     else:
                         # we return an integer indicating remote head count change
                         ret = remote.addchangegroup(cg, 'push', self.url(),
-                                                    lock=lock)
-                # if we don't push, the common data is already useful
-                # everything exchange is public for now
-                phases.moveboundary(self, 0, fut)
+                                                    lock=lock,
+                                                    finalizehook=phasescallback)
+                else:
+                    # if we don't push anything, we still exchange phases data
+                    phasescallback()
             finally:
                 locallock.release()
         finally:
             if lock is not None:
                 lock.release()
diff --git a/tests/test-phases-exchange.t b/tests/test-phases-exchange.t
--- a/tests/test-phases-exchange.t
+++ b/tests/test-phases-exchange.t
@@ -268,5 +268,217 @@ pulling back into original repo
   3 0 b-A - f54f1bb90ff3
   2 0 a-C - 54acac6f23ab
   1 0 a-B - 548a3d25dbf0
   0 0 a-A - 054250a37db4
   $ cd ..
+
+Push
+````
+
+initial setup
+
+  $ cd alpha
+  $ hg glog
+  o  changeset:   6:145e75495359
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     n-B
+  |
+  o  changeset:   5:d6bcb4f74035
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     n-A
+  |
+  o  changeset:   4:f54f1bb90ff3
+  |  parent:      1:548a3d25dbf0
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     b-A
+  |
+  | @  changeset:   3:b555f63b6063
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     a-D
+  | |
+  | o  changeset:   2:54acac6f23ab
+  |/   user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     a-C
+  |
+  o  changeset:   1:548a3d25dbf0
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     a-B
+  |
+  o  changeset:   0:054250a37db4
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     a-A
+  
+  $ mkcommit a-E
+  $ mkcommit a-F
+  $ mkcommit a-G
+  $ hg up d6bcb4f74035 -q
+  $ mkcommit a-H
+  created new head
+  $ hgph
+  10 1 a-H - 967b449fbc94
+  9 1 a-G - 3e27b6f1eee1
+  8 1 a-F - b740e3e5c05d
+  7 1 a-E - e9f537e46dea
+  6 0 n-B - 145e75495359
+  5 0 n-A - d6bcb4f74035
+  4 0 b-A - f54f1bb90ff3
+  3 0 a-D - b555f63b6063
+  2 0 a-C - 54acac6f23ab
+  1 0 a-B - 548a3d25dbf0
+  0 0 a-A - 054250a37db4
+
+Pushing to Publish=False (unknown changeset)
+
+  $ hg push ../mu -r b740e3e5c05d # a-F
+  pushing to ../mu
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files
+  $ hgph
+  10 1 a-H - 967b449fbc94
+  9 1 a-G - 3e27b6f1eee1
+  8 1 a-F - b740e3e5c05d
+  7 1 a-E - e9f537e46dea
+  6 0 n-B - 145e75495359
+  5 0 n-A - d6bcb4f74035
+  4 0 b-A - f54f1bb90ff3
+  3 0 a-D - b555f63b6063
+  2 0 a-C - 54acac6f23ab
+  1 0 a-B - 548a3d25dbf0
+  0 0 a-A - 054250a37db4
+
+  $ cd ../mu
+  $ hgph # d6bcb4f74035 and 145e75495359 changed because common is too smart
+  8 1 a-F - b740e3e5c05d
+  7 1 a-E - e9f537e46dea
+  6 0 n-B - 145e75495359
+  5 0 n-A - d6bcb4f74035
+  4 0 a-D - b555f63b6063
+  3 0 a-C - 54acac6f23ab
+  2 0 b-A - f54f1bb90ff3
+  1 0 a-B - 548a3d25dbf0
+  0 0 a-A - 054250a37db4
+
+Pushing to Publish=True (unknown changeset)
+
+  $ hg push ../beta -r b740e3e5c05d
+  pushing to ../beta
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files
+  $ hgph
+  8 0 a-F - b740e3e5c05d
+  7 0 a-E - e9f537e46dea
+  6 0 n-B - 145e75495359
+  5 0 n-A - d6bcb4f74035
+  4 0 a-D - b555f63b6063
+  3 0 a-C - 54acac6f23ab
+  2 0 b-A - f54f1bb90ff3
+  1 0 a-B - 548a3d25dbf0
+  0 0 a-A - 054250a37db4
+
+Pushing to Publish=True (common changeset)
+
+  $ cd ../beta
+  $ hg push ../alpha
+  pushing to ../alpha
+  searching for changes
+  no changes found
+  $ hgph
+  6 0 a-F - b740e3e5c05d
+  5 0 a-E - e9f537e46dea
+  4 0 a-D - b555f63b6063
+  3 0 a-C - 54acac6f23ab
+  2 0 b-A - f54f1bb90ff3
+  1 0 a-B - 548a3d25dbf0
+  0 0 a-A - 054250a37db4
+  $ cd ../alpha
+  $ hgph
+  10 1 a-H - 967b449fbc94
+  9 1 a-G - 3e27b6f1eee1
+  8 0 a-F - b740e3e5c05d
+  7 0 a-E - e9f537e46dea
+  6 0 n-B - 145e75495359
+  5 0 n-A - d6bcb4f74035
+  4 0 b-A - f54f1bb90ff3
+  3 0 a-D - b555f63b6063
+  2 0 a-C - 54acac6f23ab
+  1 0 a-B - 548a3d25dbf0
+  0 0 a-A - 054250a37db4
+
+Pushing to Publish=False (common changeset that change phase + unknown one)
+
+  $ hg push ../mu -r 967b449fbc94 -f
+  pushing to ../mu
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  $ hgph
+  10 1 a-H - 967b449fbc94
+  9 1 a-G - 3e27b6f1eee1
+  8 0 a-F - b740e3e5c05d
+  7 0 a-E - e9f537e46dea
+  6 0 n-B - 145e75495359
+  5 0 n-A - d6bcb4f74035
+  4 0 b-A - f54f1bb90ff3
+  3 0 a-D - b555f63b6063
+  2 0 a-C - 54acac6f23ab
+  1 0 a-B - 548a3d25dbf0
+  0 0 a-A - 054250a37db4
+  $ cd ../mu
+  $ hgph # d6bcb4f74035 should have changed phase
+  9 1 a-H - 967b449fbc94
+  8 0 a-F - b740e3e5c05d
+  7 0 a-E - e9f537e46dea
+  6 0 n-B - 145e75495359
+  5 0 n-A - d6bcb4f74035
+  4 0 a-D - b555f63b6063
+  3 0 a-C - 54acac6f23ab
+  2 0 b-A - f54f1bb90ff3
+  1 0 a-B - 548a3d25dbf0
+  0 0 a-A - 054250a37db4
+
+
+Pushing to Publish=True (common changeset from publish=False)
+
+  $ hg push ../alpha
+  pushing to ../alpha
+  searching for changes
+  no changes found
+  $ hgph
+  9 0 a-H - 967b449fbc94
+  8 0 a-F - b740e3e5c05d
+  7 0 a-E - e9f537e46dea
+  6 0 n-B - 145e75495359
+  5 0 n-A - d6bcb4f74035
+  4 0 a-D - b555f63b6063
+  3 0 a-C - 54acac6f23ab
+  2 0 b-A - f54f1bb90ff3
+  1 0 a-B - 548a3d25dbf0
+  0 0 a-A - 054250a37db4
+  $ hgph -R ../alpha
+  10 0 a-H - 967b449fbc94
+  9 1 a-G - 3e27b6f1eee1
+  8 0 a-F - b740e3e5c05d
+  7 0 a-E - e9f537e46dea
+  6 0 n-B - 145e75495359
+  5 0 n-A - d6bcb4f74035
+  4 0 b-A - f54f1bb90ff3
+  3 0 a-D - b555f63b6063
+  2 0 a-C - 54acac6f23ab
+  1 0 a-B - 548a3d25dbf0
+  0 0 a-A - 054250a37db4
+


More information about the Mercurial-devel mailing list