[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