Mercurial > hg > mercurial-source
changeset 10910:78db9b7d9f65
prepush: backed out refactoring
It has some problems in corner cases and will fail on a test recently
introduced on stable. Will maybe be reintroduced later, in a better
version.
author | Sune Foldager <cryo@cyanite.org> |
---|---|
date | Wed, 14 Apr 2010 19:43:19 +0200 |
parents | dc097666de01 |
children | 4327409c1303 |
files | mercurial/localrepo.py |
diffstat | 1 files changed, 29 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1500,13 +1500,8 @@ remote_heads = remote.heads() inc = self.findincoming(remote, common, remote_heads, force=force) - cl = self.changelog update, updated_heads = self.findoutgoing(remote, common, remote_heads) - msng_cl, bases, heads = cl.nodesbetween(update, revs) - - outgoingnodeset = set(msng_cl) - # compute set of nodes which, if they were a head before, no longer are - nolongeraheadnodeset = set(p for n in msng_cl for p in cl.parents(n)) + msng_cl, bases, heads = self.changelog.nodesbetween(update, revs) def checkbranch(lheads, rheads, branchname=None): ''' @@ -1516,10 +1511,33 @@ lheads: local branch heads rheads: remote branch heads ''' - newlheads = [n for n in lheads if n in outgoingnodeset] - formerrheads = [n for n in rheads if n in nolongeraheadnodeset] - if len(newlheads) > len(formerrheads): - # we add more new heads than we demote former heads to non-head + + warn = 0 + + if len(lheads) > len(rheads): + warn = 1 + else: + # add local heads involved in the push + updatelheads = [self.changelog.heads(x, lheads) + for x in update] + newheads = set(sum(updatelheads, [])) & set(lheads) + + if not newheads: + return True + + # add heads we don't have or that are not involved in the push + for r in rheads: + if r in self.changelog.nodemap: + desc = self.changelog.heads(r, heads) + l = [h for h in heads if h in desc] + if not l: + newheads.add(r) + else: + newheads.add(r) + if len(newheads) > len(rheads): + warn = 1 + + if warn: if branchname is not None: msg = _("abort: push creates new remote heads" " on branch '%s'!\n") % branchname @@ -1583,7 +1601,7 @@ if revs is None: # use the fast path, no race possible on push - nodes = cl.findmissing(common.keys()) + nodes = self.changelog.findmissing(common.keys()) cg = self._changegroup(nodes, 'push') else: cg = self.changegroupsubset(update, revs, 'push')