# HG changeset patch # User Martin Geisler # Date 1254338064 -7200 # Node ID 02c43e8e0835dd7aa4e4970a94d4a3a8dc4ec88d # Parent 08914fd0fddba0ecf9d70857f7c92c8b0c379f33# Parent 449e85edc8f1274f07c0d1d1e4c76418b60764f9 Merge with hg-i18n-stable diff -r 08914fd0fddb -r 02c43e8e0835 hgext/convert/p4.py --- a/hgext/convert/p4.py Tue Sep 29 00:54:15 2009 +0200 +++ b/hgext/convert/p4.py Wed Sep 30 21:14:24 2009 +0200 @@ -53,7 +53,7 @@ def _parse_view(self, path): "Read changes affecting the path" cmd = 'p4 -G changes -s submitted "%s"' % path - stdout = util.popen(cmd) + stdout = util.popen(cmd, mode='rb') for d in loaditer(stdout): c = d.get("change", None) if c: @@ -72,7 +72,7 @@ views = {"//": ""} else: cmd = 'p4 -G client -o "%s"' % path - clientspec = marshal.load(util.popen(cmd)) + clientspec = marshal.load(util.popen(cmd, mode='rb')) views = {} for client in clientspec: @@ -105,7 +105,7 @@ lastid = None for change in self.p4changes: cmd = "p4 -G describe %s" % change - stdout = util.popen(cmd) + stdout = util.popen(cmd, mode='rb') d = marshal.load(stdout) desc = self.recode(d["desc"]) @@ -147,7 +147,7 @@ def getfile(self, name, rev): cmd = 'p4 -G print "%s#%s"' % (self.depotname[name], rev) - stdout = util.popen(cmd) + stdout = util.popen(cmd, mode='rb') mode = None contents = "" diff -r 08914fd0fddb -r 02c43e8e0835 hgext/win32mbcs.py --- a/hgext/win32mbcs.py Tue Sep 29 00:54:15 2009 +0200 +++ b/hgext/win32mbcs.py Wed Sep 30 21:14:24 2009 +0200 @@ -123,7 +123,7 @@ funcs = '''os.path.join os.path.split os.path.splitext os.path.splitunc os.path.normpath os.path.normcase os.makedirs mercurial.util.endswithsep mercurial.util.splitpath mercurial.util.checkcase - mercurial.util.fspath mercurial.util.pconvert''' + mercurial.util.fspath mercurial.util.pconvert mercurial.util.normpath''' # codec and alias names of sjis and big5 to be faked. problematic_encodings = '''big5 big5-tw csbig5 big5hkscs big5-hkscs diff -r 08914fd0fddb -r 02c43e8e0835 i18n/pt_BR.po --- a/i18n/pt_BR.po Tue Sep 29 00:54:15 2009 +0200 +++ b/i18n/pt_BR.po Wed Sep 30 21:14:24 2009 +0200 @@ -7193,47 +7193,50 @@ "\n" " With no arguments, show all repository head changesets.\n" "\n" -" Repository \"heads\" are changesets that don't have child\n" -" changesets. They are where development generally takes place and\n" -" are the usual targets for update and merge operations.\n" +" Repository \"heads\" are changesets with no child changesets. They are\n" +" where development generally takes place and are the usual targets\n" +" for update and merge operations.\n" "\n" " If one or more REV is given, the \"branch heads\" will be shown for\n" -" the named branch associated with that revision. The name of the\n" -" branch is called the revision's branch tag.\n" -"\n" -" Branch heads are revisions on a given named branch that do not have\n" -" any descendants on the same branch. A branch head could be a true head\n" -" or it could be the last changeset on a branch before a new branch\n" -" was created. If none of the branch heads are true heads, the branch\n" -" is considered inactive. If -c/--closed is specified, also show branch\n" -" heads marked closed (see hg commit --close-branch).\n" -"\n" -" If STARTREV is specified only those heads (or branch heads) that\n" -" are descendants of STARTREV will be displayed.\n" +" the named branch associated with the specified changeset(s).\n" +"\n" +" Branch heads are changesets on a named branch with no descendants on\n" +" the same branch. A branch head could be a \"true\" (repository) head,\n" +" or it could be the last changeset on that branch before it was\n" +" merged into another branch, or it could be the last changeset on the\n" +" branch before a new branch was created. If none of the branch heads\n" +" are true heads, the branch is considered inactive.\n" +"\n" +" If -c/--closed is specified, also show branch heads marked closed\n" +" (see hg commit --close-branch).\n" +"\n" +" If STARTREV is specified, only those heads that are descendants of\n" +" STARTREV will be displayed.\n" " " msgstr "" "mostra as cabeças atuais do repositório ou cabeças de ramo\n" "\n" " Sem argumentos, mostra todas as cabeças do repositório.\n" "\n" -" \"Cabeças\" do repositório são changesets que não têm nenhum\n" -" changeset filho. Elas são onde o desenvolvimento geralmente\n" +" \"Cabeças\" do repositório são revisões que não têm nenhuma\n" +" revisão filha. Elas são onde o desenvolvimento geralmente\n" " acontece e são os alvos costumeiros para operações update e\n" " merge.\n" "\n" " Se um ou mais argumentos REV forem dados, as \"cabeças de ramo\"\n" -" serão mostradas para os ramos nomeados associados a tais\n" -" revisões. O nome do ramo é chamado de etiqueta de ramo da\n" -" revisão.\n" +" serão mostradas para os ramos nomeados associados às revisões\n" +" especificadas.\n" "\n" " Cabeças de ramo são revisões em um determinado ramo nomeado que\n" " não têm nenhum descendente nesse mesmo ramo. Uma cabeça de\n" -" ramo pode ser uma cabeça verdadeira ou pode ser o último\n" -" changeset em um ramo antes que um novo ramo nomeado fosse criado.\n" -" Se nenhuma das cabeças de ramo forem cabeças verdadeiras, o ramo\n" -" é considerado inativo. Se -c/--closed for especificado, mostra\n" -" também cabeças de ramos marcados como fechados (veja hg commit\n" -" --close-branch).\n" +" ramo pode ser uma cabeça \"verdadeira\" (do repositório), a\n" +" última revisão nesse ramo antes de uma mesclagem com outro ramo,\n" +" ou a última revisão nesse ramo antes de um novo ramo ter sido\n" +" criado. Se nenhuma das cabeças de ramo for uma cabeça verdadeira,\n" +" o ramo é considerado inativo.\n" +"\n" +" Se -c/--closed for especificado, mostra também cabeças de ramos\n" +" marcados como fechados (veja hg commit --close-branch).\n" "\n" " Se REVINICIAL for especificada, serão mostradas apenas cabeças\n" " (ou cabeças de ramo) descendentes de REVINICIAL.\n" @@ -8483,6 +8486,9 @@ " -d/--date.\n" " " +msgid "cannot specify both -c/--check and -C/--clean" +msgstr "não se pode especificar ao mesmo tempo -c/--check e -C/--clean" + msgid "uncommitted local changes" msgstr "alterações locais pendentes" diff -r 08914fd0fddb -r 02c43e8e0835 mercurial/config.py --- a/mercurial/config.py Tue Sep 29 00:54:15 2009 +0200 +++ b/mercurial/config.py Wed Sep 30 21:14:24 2009 +0200 @@ -93,6 +93,7 @@ self.set(section, item, v, "%s:%d" % (src, line)) continue item = None + cont = False m = includere.match(l) if m: inc = m.group(1) diff -r 08914fd0fddb -r 02c43e8e0835 mercurial/dispatch.py --- a/mercurial/dispatch.py Tue Sep 29 00:54:15 2009 +0200 +++ b/mercurial/dispatch.py Wed Sep 30 21:14:24 2009 +0200 @@ -24,6 +24,9 @@ except util.Abort, inst: sys.stderr.write(_("abort: %s\n") % inst) return -1 + except error.ConfigError, inst: + sys.stderr.write(_("hg: %s\n") % inst) + return -1 return _runcatch(u, args) def _runcatch(ui, args): diff -r 08914fd0fddb -r 02c43e8e0835 mercurial/localrepo.py --- a/mercurial/localrepo.py Tue Sep 29 00:54:15 2009 +0200 +++ b/mercurial/localrepo.py Wed Sep 30 21:14:24 2009 +0200 @@ -1159,17 +1159,24 @@ return [n for (r, n) in sorted(heads)] def branchheads(self, branch=None, start=None, closed=False): + '''return a (possibly filtered) list of heads for the given branch + + Heads are returned in topological order, from newest to oldest. + If branch is None, use the dirstate branch. + If start is not None, return only heads reachable from start. + If closed is True, return heads that are marked as closed as well. + ''' if branch is None: branch = self[None].branch() branches = self.branchmap() if branch not in branches: return [] - bheads = branches[branch] # the cache returns heads ordered lowest to highest - bheads.reverse() + bheads = list(reversed(branches[branch])) if start is not None: # filter out the heads that cannot be reached from startrev - bheads = self.changelog.nodesbetween([start], bheads)[2] + fbheads = set(self.changelog.nodesbetween([start], bheads)[2]) + bheads = [h for h in bheads if h in fbheads] if not closed: bheads = [h for h in bheads if ('close' not in self.changelog.read(h)[5])] @@ -1468,19 +1475,16 @@ 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 @@ -1488,13 +1492,15 @@ 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) @@ -1510,7 +1516,7 @@ 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")) @@ -1553,11 +1559,11 @@ 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 -r 08914fd0fddb -r 02c43e8e0835 mercurial/util.py --- a/mercurial/util.py Tue Sep 29 00:54:15 2009 +0200 +++ b/mercurial/util.py Wed Sep 30 21:14:24 2009 +0200 @@ -14,7 +14,7 @@ """ 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,14 @@ # 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. + try: + u = line.decode(encoding.encoding) + w = padding.join(textwrap.wrap(u, width=width - hangindent)) + return w.encode(encoding.encoding) + except UnicodeDecodeError: + return padding.join(textwrap.wrap(line, width=width - hangindent)) def iterlines(iterator): for chunk in iterator: diff -r 08914fd0fddb -r 02c43e8e0835 tests/test-bheads.out --- a/tests/test-bheads.out Tue Sep 29 00:54:15 2009 +0200 +++ b/tests/test-bheads.out Wed Sep 30 21:14:24 2009 +0200 @@ -68,8 +68,8 @@ 3: Adding b branch head 1 0 ------- +6: Merging b branch head 2 and b branch head 3 3: Adding b branch head 1 -6: Merging b branch head 2 and b branch head 3 0 ------- no changes on branch b containing . are reachable from 7 diff -r 08914fd0fddb -r 02c43e8e0835 tests/test-hgrc --- a/tests/test-hgrc Tue Sep 29 00:54:15 2009 +0200 +++ b/tests/test-hgrc Wed Sep 30 21:14:24 2009 +0200 @@ -16,3 +16,9 @@ cat .hg/hgrc |sed -e "s:$p:...:" hg paths |sed -e "s:$p:...:" hg showconfig |sed -e "s:$p:...:" + +# issue1829: wrong indentation +cd .. +echo '[foo]' >> $HGRCPATH +echo ' x = y' >> $HGRCPATH +hg version 2>&1 | sed -e "s|$HGRCPATH|\$HGRCPATH|" diff -r 08914fd0fddb -r 02c43e8e0835 tests/test-hgrc.out --- a/tests/test-hgrc.out Tue Sep 29 00:54:15 2009 +0200 +++ b/tests/test-hgrc.out Wed Sep 30 21:14:24 2009 +0200 @@ -10,3 +10,4 @@ defaults.tag=-d "0 0" paths.default=.../foo%bar ui.slash=True +hg: config error at $HGRCPATH:8: ' x = y' diff -r 08914fd0fddb -r 02c43e8e0835 tests/test-push-warn --- a/tests/test-push-warn Tue Sep 29 00:54:15 2009 +0200 +++ b/tests/test-push-warn Wed Sep 30 21:14:24 2009 +0200 @@ -123,4 +123,21 @@ 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 -r 08914fd0fddb -r 02c43e8e0835 tests/test-push-warn.out --- a/tests/test-push-warn.out Tue Sep 29 00:54:15 2009 +0200 +++ b/tests/test-push-warn.out Wed Sep 30 21:14:24 2009 +0200 @@ -124,3 +124,20 @@ 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) +