diff mercurial/localrepo.py @ 15933:b8696a6676be

phases: only synchronize on common changeset when push fails If push failed we should not expect the pushed changeset to exist on remote. The common set before the push is used for phase related operation instead of common + missing. Note: * We still pull phase data even if push fails * We still try to push data even if push fails (same than bookmark)
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Thu, 19 Jan 2012 16:09:43 +0100
parents 4154338f0bc0
children ec8a9e06cf05
line wrap: on
line diff
--- a/mercurial/localrepo.py	Thu Jan 19 15:50:55 2012 +0100
+++ b/mercurial/localrepo.py	Thu Jan 19 16:09:43 2012 +0100
@@ -1622,7 +1622,6 @@
                         self.ui.status(_(msg) % len(outgoing.excluded))
                     else:
                         self.ui.status(_("no changes found\n"))
-                    fut = outgoing.common
                     ret = 1
                 else:
                     # something to push
@@ -1653,33 +1652,32 @@
                         # we return an integer indicating remote head count change
                         ret = remote.addchangegroup(cg, 'push', self.url())
 
-                # compute what should be the now common
-                #
-                # XXX If push failed we should use strict common and not
-                # future to avoid pushing phase data on unknown changeset.
-                # This is to done later.
-                fut = outgoing.commonheads + outgoing.missingheads
+                cheads = outgoing.commonheads[:]
+                if ret:
+                    # push succeed, synchonize common + pushed
+                    # this is a no-op if there was nothing to push
+                    cheads += outgoing.missingheads
                 # even when we don't push, exchanging phase data is useful
                 remotephases = remote.listkeys('phases')
                 if not remotephases: # old server or public only repo
-                    phases.advanceboundary(self, phases.public, fut)
+                    phases.advanceboundary(self, phases.public, cheads)
                     # don't push any phase data as there is nothing to push
                 else:
-                    ana = phases.analyzeremotephases(self, fut, remotephases)
+                    ana = phases.analyzeremotephases(self, cheads, remotephases)
                     pheads, droots = ana
                     ### Apply remote phase on local
                     if remotephases.get('publishing', False):
-                        phases.advanceboundary(self, phases.public, fut)
+                        phases.advanceboundary(self, phases.public, cheads)
                     else: # publish = False
                         phases.advanceboundary(self, phases.public, pheads)
-                        phases.advanceboundary(self, phases.draft, fut)
+                        phases.advanceboundary(self, phases.draft, cheads)
                     ### Apply local phase on remote
 
                     # Get the list of all revs draft on remote by public here.
                     # XXX Beware that revset break if droots is not strictly
                     # XXX root we may want to ensure it is but it is costly
                     outdated =  self.set('heads((%ln::%ln) and public())',
-                                         droots, fut)
+                                         droots, cheads)
                     for newremotehead in outdated:
                         r = remote.pushkey('phases',
                                            newremotehead.hex(),