mercurial/exchange.py
changeset 22015 c478031deba2
parent 22014 71083b020b4a
child 22016 7d976d71684c
equal deleted inserted replaced
22014:71083b020b4a 22015:c478031deba2
    82 
    82 
    83     @util.propertycache
    83     @util.propertycache
    84     def futureheads(self):
    84     def futureheads(self):
    85         """future remote heads if the changeset push succeeds"""
    85         """future remote heads if the changeset push succeeds"""
    86         return self.outgoing.missingheads
    86         return self.outgoing.missingheads
       
    87 
       
    88     @util.propertycache
       
    89     def fallbackheads(self):
       
    90         """future remote heads if the changeset push fails"""
       
    91         if self.revs is None:
       
    92             # not target to push, all common are relevant
       
    93             return self.outgoing.commonheads
       
    94         unfi = self.repo.unfiltered()
       
    95         # I want cheads = heads(::missingheads and ::commonheads)
       
    96         # (missingheads is revs with secret changeset filtered out)
       
    97         #
       
    98         # This can be expressed as:
       
    99         #     cheads = ( (missingheads and ::commonheads)
       
   100         #              + (commonheads and ::missingheads))"
       
   101         #              )
       
   102         #
       
   103         # while trying to push we already computed the following:
       
   104         #     common = (::commonheads)
       
   105         #     missing = ((commonheads::missingheads) - commonheads)
       
   106         #
       
   107         # We can pick:
       
   108         # * missingheads part of common (::commonheads)
       
   109         common = set(self.outgoing.common)
       
   110         nm = self.repo.changelog.nodemap
       
   111         cheads = [node for node in self.revs if nm[node] in common]
       
   112         # and
       
   113         # * commonheads parents on missing
       
   114         revset = unfi.set('%ln and parents(roots(%ln))',
       
   115                          self.outgoing.commonheads,
       
   116                          self.outgoing.missing)
       
   117         cheads.extend(c.node() for c in revset)
       
   118         return cheads
       
   119 
    87 
   120 
    88 def push(repo, remote, force=False, revs=None, newbranch=False):
   121 def push(repo, remote, force=False, revs=None, newbranch=False):
    89     '''Push outgoing changesets (limited by revs) from a local
   122     '''Push outgoing changesets (limited by revs) from a local
    90     repository to remote. Return an integer:
   123     repository to remote. Return an integer:
    91       - None means nothing to push
   124       - None means nothing to push
   311         # we return an integer indicating remote head count
   344         # we return an integer indicating remote head count
   312         # change
   345         # change
   313         pushop.ret = pushop.remote.addchangegroup(cg, 'push', pushop.repo.url())
   346         pushop.ret = pushop.remote.addchangegroup(cg, 'push', pushop.repo.url())
   314 
   347 
   315 def _pushcomputecommonheads(pushop):
   348 def _pushcomputecommonheads(pushop):
   316     unfi = pushop.repo.unfiltered()
       
   317     if pushop.ret:
   349     if pushop.ret:
   318         cheads = pushop.futureheads
   350         cheads = pushop.futureheads
   319     elif pushop.revs is None:
       
   320         # All out push fails. synchronize all common
       
   321         cheads = pushop.outgoing.commonheads
       
   322     else:
   351     else:
   323         # I want cheads = heads(::missingheads and ::commonheads)
   352         cheads = pushop.fallbackheads
   324         # (missingheads is revs with secret changeset filtered out)
       
   325         #
       
   326         # This can be expressed as:
       
   327         #     cheads = ( (missingheads and ::commonheads)
       
   328         #              + (commonheads and ::missingheads))"
       
   329         #              )
       
   330         #
       
   331         # while trying to push we already computed the following:
       
   332         #     common = (::commonheads)
       
   333         #     missing = ((commonheads::missingheads) - commonheads)
       
   334         #
       
   335         # We can pick:
       
   336         # * missingheads part of common (::commonheads)
       
   337         common = set(pushop.outgoing.common)
       
   338         nm = pushop.repo.changelog.nodemap
       
   339         cheads = [node for node in pushop.revs if nm[node] in common]
       
   340         # and
       
   341         # * commonheads parents on missing
       
   342         revset = unfi.set('%ln and parents(roots(%ln))',
       
   343                          pushop.outgoing.commonheads,
       
   344                          pushop.outgoing.missing)
       
   345         cheads.extend(c.node() for c in revset)
       
   346     pushop.commonheads = cheads
   353     pushop.commonheads = cheads
   347 
   354 
   348 def _pushsyncphase(pushop):
   355 def _pushsyncphase(pushop):
   349     """synchronise phase information locally and remotely"""
   356     """synchronise phase information locally and remotely"""
   350     unfi = pushop.repo.unfiltered()
   357     unfi = pushop.repo.unfiltered()