mercurial/discovery.py
changeset 11578 bb7af1de5e38
parent 11577 0bc450253312
child 12759 9c5794223340
equal deleted inserted replaced
11577:0bc450253312 11578:bb7af1de5e38
   236     if not bases:
   236     if not bases:
   237         repo.ui.status(_("no changes found\n"))
   237         repo.ui.status(_("no changes found\n"))
   238         return None, 1
   238         return None, 1
   239 
   239 
   240     if not force and remoteheads != [nullid]:
   240     if not force and remoteheads != [nullid]:
   241 
       
   242         def fail_multiple_heads(unsynced, branch=None):
       
   243             if branch:
       
   244                 msg = _("push creates new remote heads "
       
   245                         "on branch '%s'!") % branch
       
   246             else:
       
   247                 msg = _("push creates new remote heads!")
       
   248 
       
   249             if unsynced:
       
   250                 hint = _("you should pull and merge or use push -f to force")
       
   251             else:
       
   252                 hint = _("did you forget to merge? use push -f to force")
       
   253             raise util.Abort(msg, hint=hint)
       
   254 
       
   255         if remote.capable('branchmap'):
   241         if remote.capable('branchmap'):
   256             # Check for each named branch if we're creating new remote heads.
   242             # Check for each named branch if we're creating new remote heads.
   257             # To be a remote head after push, node must be either:
   243             # To be a remote head after push, node must be either:
   258             # - unknown locally
   244             # - unknown locally
   259             # - a local outgoing head descended from update
   245             # - a local outgoing head descended from update
   296             # 4. Update newmap with outgoing changes.
   282             # 4. Update newmap with outgoing changes.
   297             # This will possibly add new heads and remove existing ones.
   283             # This will possibly add new heads and remove existing ones.
   298             ctxgen = (repo[n] for n in outg)
   284             ctxgen = (repo[n] for n in outg)
   299             repo._updatebranchcache(newmap, ctxgen)
   285             repo._updatebranchcache(newmap, ctxgen)
   300 
   286 
   301             # 5. Check for new heads.
       
   302             # If there are more heads after the push than before, a suitable
       
   303             # warning, depending on unsynced status, is displayed.
       
   304             for branch in branches:
       
   305                 if len(newmap[branch]) > len(oldmap[branch]):
       
   306                     return fail_multiple_heads(branch in unsynced, branch)
       
   307 
       
   308             # 6. Check for unsynced changes on involved branches.
       
   309             if unsynced:
       
   310                 repo.ui.warn(_("note: unsynced remote changes!\n"))
       
   311 
       
   312         else:
   287         else:
   313             # Old servers: Check for new topological heads.
   288             # 1-4b. old servers: Check for new topological heads.
   314             # Code based on _updatebranchcache.
   289             # Construct {old,new}map with branch = None (topological branch).
   315             newheads = set(h for h in remoteheads if h in cl.nodemap)
   290             # (code based on _updatebranchcache)
   316             oldheadcnt = len(newheads)
   291             oldheads = set(h for h in remoteheads if h in cl.nodemap)
   317             newheads.update(outg)
   292             newheads = oldheads.union(outg)
   318             if len(newheads) > 1:
   293             if len(newheads) > 1:
   319                 for latest in reversed(outg):
   294                 for latest in reversed(outg):
   320                     if latest not in newheads:
   295                     if latest not in newheads:
   321                         continue
   296                         continue
   322                     minhrev = min(cl.rev(h) for h in newheads)
   297                     minhrev = min(cl.rev(h) for h in newheads)
   323                     reachable = cl.reachable(latest, cl.node(minhrev))
   298                     reachable = cl.reachable(latest, cl.node(minhrev))
   324                     reachable.remove(latest)
   299                     reachable.remove(latest)
   325                     newheads.difference_update(reachable)
   300                     newheads.difference_update(reachable)
   326             if len(newheads) > oldheadcnt:
   301             branches = set([None])
   327                 return fail_multiple_heads(inc)
   302             newmap = {None: newheads}
   328             if inc:
   303             oldmap = {None: oldheads}
   329                 repo.ui.warn(_("note: unsynced remote changes!\n"))
   304             unsynced = inc and branches or set()
       
   305 
       
   306         # 5. Check for new heads.
       
   307         # If there are more heads after the push than before, a suitable
       
   308         # warning, depending on unsynced status, is displayed.
       
   309         for branch in branches:
       
   310             if len(newmap[branch]) > len(oldmap[branch]):
       
   311                 if branch:
       
   312                     msg = _("push creates new remote heads "
       
   313                             "on branch '%s'!") % branch
       
   314                 else:
       
   315                     msg = _("push creates new remote heads!")
       
   316 
       
   317                 if branch in unsynced:
       
   318                     hint = _("you should pull and merge or use push -f to force")
       
   319                 else:
       
   320                     hint = _("did you forget to merge? use push -f to force")
       
   321                 raise util.Abort(msg, hint=hint)
       
   322 
       
   323         # 6. Check for unsynced changes on involved branches.
       
   324         if unsynced:
       
   325             repo.ui.warn(_("note: unsynced remote changes!\n"))
   330 
   326 
   331     if revs is None:
   327     if revs is None:
   332         # use the fast path, no race possible on push
   328         # use the fast path, no race possible on push
   333         nodes = repo.changelog.findmissing(common.keys())
   329         nodes = repo.changelog.findmissing(common.keys())
   334         cg = repo._changegroup(nodes, 'push')
   330         cg = repo._changegroup(nodes, 'push')