[PATCH 4 of 5 REVIEW] phases: mark content pushed as public in local repo on push
pierre-yves.david at logilab.fr
pierre-yves.david at logilab.fr
Wed Oct 19 10:27:22 UTC 2011
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at logilab.fr>
# Date 1319019902 -7200
# Node ID 1628f433553660bf9e4d01ed4adb6dd5d31dfb30
# Parent 678353d217a1b96d3771cac1c6e81ca831d6546b
phases: mark content pushed as public in local repo on push.
diff --git a/mercurial/discovery.py b/mercurial/discovery.py
--- a/mercurial/discovery.py
+++ b/mercurial/discovery.py
@@ -64,30 +64,33 @@ def findcommonoutgoing(repo, other, only
def prepush(repo, remote, force, revs, newbranch):
'''Analyze the local and remote repositories and determine which
changesets need to be pushed to the remote. Return value depends
on circumstances:
- If we are not going to push anything, return a tuple (None,
- outgoing) where outgoing is 0 if there are no outgoing
- changesets and 1 if there are, but we refuse to push them
- (e.g. would create new remote heads).
+ If we are not going to push anything, return a tuple (None, outgoing,
+ future) where outgoing is 0 if there are no outgoing changesets and 1 if
+ there are, but we refuse to push them (e.g. would create new remote heads).
- Otherwise, return a tuple (changegroup, remoteheads), where
+ Otherwise, return a tuple (changegroup, remoteheads, future), where
changegroup is a readable file-like object whose read() returns
successive changegroup chunks ready to be sent over the wire and
- remoteheads is the list of remote heads.'''
+ remoteheads is the list of remote heads.
+
+ In both case, future are the heads of the common set between local and
+ remote after the operation.
+ '''
commoninc = findcommonincoming(repo, remote, force=force)
common, revs = findcommonoutgoing(repo, remote, onlyheads=revs,
commoninc=commoninc, force=force)
_common, inc, remoteheads = commoninc
cl = repo.changelog
outg = cl.findmissing(common, revs)
if not outg:
repo.ui.status(_("no changes found\n"))
- return None, 1
+ return None, 1, common
if not force and remoteheads != [nullid]:
if remote.capable('branchmap'):
# Check for each named branch if we're creating new remote heads.
# To be a remote head after push, node must be either:
@@ -187,6 +190,10 @@ def prepush(repo, remote, force, revs, n
if revs is None:
# use the fast path, no race possible on push
cg = repo._changegroup(outg, 'push')
else:
cg = repo.getbundle('push', heads=revs, common=common)
- return cg, remoteheads
+ # no need to compute set ancestor are all outg have parent in common or outg
+ future = map(repo.changelog.rev, common)
+ future.extend(map(repo.changelog.rev, outg))
+ future = (ctx.node() for ctx in repo.set('heads((%ld))', future))
+ return cg, remoteheads, future
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -1532,12 +1532,12 @@ class localrepository(repo.repository):
lock = None
unbundle = remote.capable('unbundle')
if not unbundle:
lock = remote.lock()
try:
- cg, remote_heads = discovery.prepush(self, remote, force, revs,
- newbranch)
+ cg, remote_heads, fut = discovery.prepush(self, remote, force,
+ revs, newbranch)
ret = remote_heads
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
@@ -1550,10 +1550,13 @@ class localrepository(repo.repository):
ret = remote.unbundle(cg, remote_heads, 'push')
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)
finally:
if lock is not None:
lock.release()
self.ui.debug("checking for updated bookmarks\n")
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
@@ -28,10 +28,16 @@
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 2 files
+ $ hgph
+ 3 1 a-D
+ 2 1 a-C
+ 1 0 a-B
+ 0 0 a-A
+
$ cd ../beta
$ hgph
1 0 a-B
0 0 a-A
$ hg up -q
@@ -53,6 +59,24 @@
3 0 a-C
2 1 b-A
1 0 a-B
0 0 a-A
+pull did not updated ../alpha state.
+push from alpha to beta should update phase even if nothing is transfered
+ $ cd ../alpha
+ $ hgph # not updated by remote pull
+ 3 1 a-D
+ 2 1 a-C
+ 1 0 a-B
+ 0 0 a-A
+ $ hg push ../beta
+ pushing to ../beta
+ searching for changes
+ no changes found
+ $ hgph
+ 3 0 a-D
+ 2 0 a-C
+ 1 0 a-B
+ 0 0 a-A
+
More information about the Mercurial-devel
mailing list