# HG changeset patch # User Martin Geisler # Date 2009-09-27 07:38:53 # Node ID ca3390c19f888e948898d3d0f25c219f8d9b9590 # Parent 829f5c2a2c2e187304067a3280857655de76ad60 # Parent 44758742ad2ee71ba93686a6c1990227d3524b7d Merge with crew-stable diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1475,19 +1475,16 @@ class localrepository(repo.repository): inc = self.findincoming(remote, common, remote_heads, force=force) update, updated_heads = self.findoutgoing(remote, common, remote_heads) - if revs is not None: - msng_cl, bases, heads = self.changelog.nodesbetween(update, revs) - else: - bases, heads = update, self.changelog.heads() + msng_cl, bases, heads = self.changelog.nodesbetween(update, revs) - def checkbranch(lheads, rheads, updatelh): + def checkbranch(lheads, rheads, updatelb): ''' check whether there are more local heads than remote heads on a specific branch. lheads: local branch heads rheads: remote branch heads - updatelh: outgoing local branch heads + updatelb: outgoing local branch bases ''' warn = 0 @@ -1495,13 +1492,15 @@ class localrepository(repo.repository): if not revs and len(lheads) > len(rheads): warn = 1 else: + # add local heads involved in the push updatelheads = [self.changelog.heads(x, lheads) - for x in updatelh] + for x in updatelb] 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) @@ -1517,7 +1516,7 @@ class localrepository(repo.repository): if not rheads: # new branch requires --force self.ui.warn(_("abort: push creates new" " remote branch '%s'!\n") % - self[updatelh[0]].branch()) + self[updatelb[0]].branch()) else: self.ui.warn(_("abort: push creates new remote heads!\n")) @@ -1560,11 +1559,11 @@ class localrepository(repo.repository): else: rheads = [] lheads = localhds[lh] - updatelh = [upd for upd in update + updatelb = [upd for upd in update if self[upd].branch() == lh] - if not updatelh: + if not updatelb: continue - if not checkbranch(lheads, rheads, updatelh): + if not checkbranch(lheads, rheads, updatelb): return None, 0 else: if not checkbranch(heads, remote_heads, update): diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -14,7 +14,7 @@ hide platform-specific details from the """ from i18n import _ -import error, osutil +import error, osutil, encoding import cStringIO, errno, re, shutil, sys, tempfile, traceback import os, stat, time, calendar, random, textwrap import imp @@ -1278,7 +1278,11 @@ def wrap(line, hangindent, width=None): # adjust for weird terminal size width = max(78, hangindent + 1) padding = '\n' + ' ' * hangindent - return padding.join(textwrap.wrap(line, width=width - hangindent)) + # To avoid corrupting multi-byte characters in line, we must wrap + # a Unicode string instead of a bytestring. + u = line.decode(encoding.encoding) + w = padding.join(textwrap.wrap(u, width=width - hangindent)) + return w.encode(encoding.encoding) def iterlines(iterator): for chunk in iterator: diff --git a/tests/test-push-warn b/tests/test-push-warn --- a/tests/test-push-warn +++ b/tests/test-push-warn @@ -123,4 +123,21 @@ echo 11 > foo hg -q ci -d "1000000 0" -m 11 hg push -r 10 -r 11 ../f; echo $? +echo % checking prepush logic does not allow silently pushing multiple new heads +cd .. +hg init g +echo init > g/init +hg -R g ci -Am init +echo a > g/a +hg -R g ci -Am a +hg clone g h +hg -R g up 0 +echo b > g/b +hg -R g ci -Am b +hg -R h up 0 +echo c > h/c +hg -R h ci -Am c +hg -R h push g +echo + exit 0 diff --git a/tests/test-push-warn.out b/tests/test-push-warn.out --- a/tests/test-push-warn.out +++ b/tests/test-push-warn.out @@ -124,3 +124,20 @@ adding manifests adding file changes added 2 changesets with 2 changes to 1 files 0 +% checking prepush logic does not allow silently pushing multiple new heads +abort: repository g already exists! +adding init +adding a +updating working directory +3 files updated, 0 files merged, 0 files removed, 0 files unresolved +1 files updated, 0 files merged, 2 files removed, 0 files unresolved +adding b +created new head +1 files updated, 0 files merged, 2 files removed, 0 files unresolved +adding c +created new head +pushing to g +searching for changes +abort: push creates new remote heads! +(did you forget to merge? use push -f to force) +