merge with stable
authorMatt Mackall <mpm@selenic.com>
Thu, 01 Nov 2012 16:30:48 -0500
changeset 17905 df84bec19dce
parent 17856 917a37b76845 (current diff)
parent 17904 fac6d36d04cb (diff)
child 17908 42f8ee0e04ac
merge with stable
--- a/.hgsigs	Tue Oct 23 09:28:42 2012 +0200
+++ b/.hgsigs	Thu Nov 01 16:30:48 2012 -0500
@@ -60,3 +60,4 @@
 072209ae4ddb654eb2d5fd35bff358c738414432 0 iD8DBQBQQkq0ywK+sNU5EO8RArDTAJ9nk5CySnNAjAXYvqvx4uWCw9ThZwCgqmFRehH/l+oTwj3f8nw8u8qTCdc=
 b3f0f9a39c4e1d0250048cd803ab03542d6f140a 0 iD8DBQBQamltywK+sNU5EO8RAlsqAJ4qF/m6aFu4mJCOKTiAP5RvZFK02ACfawYShUZO6OXEFfveU0aAxDR0M1k=
 d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 0 iD8DBQBQgPV5ywK+sNU5EO8RArylAJ0abcx5NlDjyv3ZDWpAfRIHyRsJtQCgn4TMuEayqgxzrvadQZHdTEU2g38=
+195ad823b5d58c68903a6153a25e3fb4ed25239d 0 iD8DBQBQkuT9ywK+sNU5EO8RAhB4AKCeerItoK2Jipm2cVf4euGofAa/WACeJj3TVd4pFILpb+ogj7ebweFLJi0=
--- a/.hgtags	Tue Oct 23 09:28:42 2012 +0200
+++ b/.hgtags	Thu Nov 01 16:30:48 2012 -0500
@@ -73,3 +73,4 @@
 072209ae4ddb654eb2d5fd35bff358c738414432 2.3.1
 b3f0f9a39c4e1d0250048cd803ab03542d6f140a 2.3.2
 d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 2.4-rc
+195ad823b5d58c68903a6153a25e3fb4ed25239d 2.4
--- a/contrib/synthrepo.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/contrib/synthrepo.py	Thu Nov 01 16:30:48 2012 -0500
@@ -36,7 +36,7 @@
 '''
 
 import bisect, collections, json, os, random, time
-from mercurial import cmdutil, context, patch, scmutil, url, util
+from mercurial import cmdutil, context, patch, scmutil, url, util, hg
 from mercurial.i18n import _
 from mercurial.node import nullrev, nullid
 
@@ -224,7 +224,7 @@
     path to an alternate dictionary to use.
     '''
     try:
-        fp = url.open(ui, descpath)
+        fp = hg.openpath(ui, descpath)
     except Exception, err:
         raise util.Abort('%s: %s' % (descpath, err[0].strerror))
     desc = json.load(fp)
--- a/hgext/largefiles/lfutil.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/hgext/largefiles/lfutil.py	Thu Nov 01 16:30:48 2012 -0500
@@ -215,7 +215,7 @@
     return True
 
 def copytostore(repo, rev, file, uploaded=False):
-    hash = readstandin(repo, file)
+    hash = readstandin(repo, file, rev)
     if instore(repo, hash):
         return
     copytostoreabsolute(repo, repo.wjoin(file), hash)
@@ -234,7 +234,7 @@
     util.makedirs(os.path.dirname(storepath(repo, hash)))
     if inusercache(repo.ui, hash):
         link(usercachepath(repo.ui, hash), storepath(repo, hash))
-    else:
+    elif not getattr(repo, "_isconverting", False):
         dst = util.atomictempfile(storepath(repo, hash),
                                   createmode=repo.store.createmode)
         for chunk in util.filechunkiter(open(file, 'rb')):
--- a/hgext/largefiles/overrides.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/hgext/largefiles/overrides.py	Thu Nov 01 16:30:48 2012 -0500
@@ -1022,10 +1022,13 @@
     if opts.pop('large', None):
         toupload = getoutgoinglfiles(ui, repo, None, **opts)
         if toupload is None:
-            ui.status(_('largefiles: No remote repo\n'))
+            # i18n: column positioning for "hg summary"
+            ui.status(_('largefiles: (no remote repo)\n'))
         elif not toupload:
+            # i18n: column positioning for "hg summary"
             ui.status(_('largefiles: (no files to upload)\n'))
         else:
+            # i18n: column positioning for "hg summary"
             ui.status(_('largefiles: %d to upload\n') % len(toupload))
 
 def scmutiladdremove(orig, repo, pats=[], opts={}, dry_run=None,
@@ -1113,3 +1116,11 @@
         result = orig(ui, repo, file1, *pats, **opts)
         return result
     return lfcommands.catlfile(repo, file1, ctx.rev(), opts.get('output'))
+
+def mercurialsinkbefore(orig, sink):
+    sink.repo._isconverting = True
+    orig(sink)
+
+def mercurialsinkafter(orig, sink):
+    sink.repo._isconverting = False
+    orig(sink)
--- a/hgext/largefiles/uisetup.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/hgext/largefiles/uisetup.py	Thu Nov 01 16:30:48 2012 -0500
@@ -168,3 +168,10 @@
         if name == 'transplant':
             extensions.wrapcommand(getattr(module, 'cmdtable'), 'transplant',
                 overrides.overridetransplant)
+        if name == 'convert':
+            convcmd = getattr(module, 'convcmd')
+            hgsink = getattr(convcmd, 'mercurial_sink')
+            extensions.wrapfunction(hgsink, 'before',
+                                    overrides.mercurialsinkbefore)
+            extensions.wrapfunction(hgsink, 'after',
+                                    overrides.mercurialsinkafter)
--- a/hgext/mq.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/hgext/mq.py	Thu Nov 01 16:30:48 2012 -0500
@@ -63,7 +63,7 @@
 from mercurial.node import bin, hex, short, nullid, nullrev
 from mercurial.lock import release
 from mercurial import commands, cmdutil, hg, scmutil, util, revset
-from mercurial import repair, extensions, url, error, phases, bookmarks
+from mercurial import repair, extensions, error, phases, bookmarks
 from mercurial import patch as patchmod
 import os, re, errno, shutil
 
@@ -1575,8 +1575,18 @@
             m = list(mm)
             r = list(dd)
             a = list(aa)
-            c = [filter(matchfn, l) for l in (m, a, r)]
-            match = scmutil.matchfiles(repo, set(c[0] + c[1] + c[2] + inclsubs))
+
+            # create 'match' that includes the files to be recommited.
+            # apply matchfn via repo.status to ensure correct case handling.
+            cm, ca, cr, cd = repo.status(patchparent, match=matchfn)[:4]
+            allmatches = set(cm + ca + cr + cd)
+            refreshchanges = [x.intersection(allmatches) for x in (mm, aa, dd)]
+
+            files = set(inclsubs)
+            for x in refreshchanges:
+                files.update(x)
+            match = scmutil.matchfiles(repo, files)
+
             bmlist = repo[top].bookmarks()
 
             try:
@@ -1656,6 +1666,7 @@
                 n = newcommit(repo, oldphase, message, user, ph.date,
                               match=match, force=True)
                 # only write patch after a successful commit
+                c = [list(x) for x in refreshchanges]
                 if inclsubs:
                     self.putsubstate2changes(substatestate, c)
                 chunks = patchmod.diff(repo, patchparent,
@@ -2004,7 +2015,7 @@
                     if filename == '-':
                         text = self.ui.fin.read()
                     else:
-                        fp = url.open(self.ui, filename)
+                        fp = hg.openpath(self.ui, filename)
                         text = fp.read()
                         fp.close()
                 except (OSError, IOError):
@@ -3550,8 +3561,10 @@
     if u:
         m.append(ui.label(_("%d unapplied"), 'qseries.unapplied') % u)
     if m:
-        ui.write("mq:     %s\n" % ', '.join(m))
+        # i18n: column positioning for "hg summary"
+        ui.write(_("mq:     %s\n") % ', '.join(m))
     else:
+        # i18n: column positioning for "hg summary"
         ui.note(_("mq:     (empty queue)\n"))
     return r
 
--- a/hgext/patchbomb.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/hgext/patchbomb.py	Thu Nov 01 16:30:48 2012 -0500
@@ -199,7 +199,7 @@
 
     Finally, the patch itself, as generated by :hg:`export`.
 
-    With the -d/--diffstat or -c/--confirm options, you will be presented
+    With the -d/--diffstat or --confirm options, you will be presented
     with a final summary of all messages and asked for confirmation before
     the messages are sent.
 
@@ -496,8 +496,6 @@
         if not parent.endswith('>'):
             parent += '>'
 
-    first = True
-
     sender_addr = email.Utils.parseaddr(sender)[1]
     sender = mail.addressencode(ui, sender, _charsets, opts.get('test'))
     sendmail = None
@@ -509,9 +507,8 @@
         if parent:
             m['In-Reply-To'] = parent
             m['References'] = parent
-        if first:
+        if not parent or 'X-Mercurial-Node' not in m:
             parent = m['Message-Id']
-            first = False
 
         m['User-Agent'] = 'Mercurial-patchbomb/%s' % util.version()
         m['Date'] = email.Utils.formatdate(start_time[0], localtime=True)
--- a/hgext/transplant.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/hgext/transplant.py	Thu Nov 01 16:30:48 2012 -0500
@@ -605,7 +605,7 @@
 
     sourcerepo = opts.get('source')
     if sourcerepo:
-        peer = hg.peer(ui, opts, ui.expandpath(sourcerepo))
+        peer = hg.peer(repo, opts, ui.expandpath(sourcerepo))
         branches = map(peer.lookup, opts.get('branch', ()))
         source, csets, cleanupfn = bundlerepo.getremotechanges(ui, repo, peer,
                                     onlyheads=branches, force=True)
--- a/i18n/ja.po	Tue Oct 23 09:28:42 2012 +0200
+++ b/i18n/ja.po	Thu Nov 01 16:30:48 2012 -0500
@@ -29,6 +29,13 @@
 # Distributed SCM       分散構成管理ツール
 #
 # abort                 中断
+# active
+#   guard
+#     "hg qguard" 側    ガード設定(状況)
+#     "hg qselect" 側   ガード選択(状況)
+#   queue               使用中
+#   bookmark            アクティブ
+#   branch              アクティブ
 # add                   (構成管理への)追加登録
 # alias                 別名
 # amend                 改変 (※ 『破壊的修正』のニュアンス)
@@ -128,7 +135,7 @@
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2012-09-28 15:58+0900\n"
+"POT-Creation-Date: 2012-10-31 18:16+0900\n"
 "PO-Revision-Date: 2009-11-16 21:24+0100\n"
 "Last-Translator: Japanese translation team <mercurial-ja@googlegroups.com>\n"
 "Language-Team: Japanese\n"
@@ -677,7 +684,7 @@
 "email to the Bugzilla email interface to submit comments to bugs.\n"
 "The From: address in the email is set to the email address of the Mercurial\n"
 "user, so the comment appears to come from the Mercurial user. In the event\n"
-"that the Mercurial user email is not recognised by Bugzilla as a Bugzilla\n"
+"that the Mercurial user email is not recognized by Bugzilla as a Bugzilla\n"
 "user, the email associated with the Bugzilla username used to log into\n"
 "Bugzilla is used instead as the source of the comment. Marking bugs fixed\n"
 "works on all supported Bugzilla versions."
@@ -695,7 +702,7 @@
 
 msgid ""
 "bugzilla.version\n"
-"  This access type to use. Values recognised are:"
+"  The access type to use. Values recognized are:"
 msgstr ""
 "bugzilla.version\n"
 "  連携方式の選択。 指定可能な値は以下の通り:"
@@ -1763,7 +1770,7 @@
 msgid ""
 "    The authormap is a simple text file that maps each source commit\n"
 "    author to a destination commit author. It is handy for source SCMs\n"
-"    that use unix logins to identify authors (eg: CVS). One line per\n"
+"    that use unix logins to identify authors (e.g.: CVS). One line per\n"
 "    author mapping and the line format is::"
 msgstr ""
 "    authormap は、 変換元と変換先の間で、 コミットのユーザ名を変換します。\n"
@@ -3590,7 +3597,7 @@
 "  # Style to use (optional)\n"
 "  #style = foo\n"
 "  # The URL of the CIA notification service (optional)\n"
-"  # You can use mailto: URLs to send by email, eg\n"
+"  # You can use mailto: URLs to send by email, e.g.\n"
 "  # mailto:cia@cia.vc\n"
 "  # Make sure to set email.from if you do this.\n"
 "  #url = http://cia.vc/\n"
@@ -4128,19 +4135,13 @@
 " #  m, mess = 改変内容を維持しつつ、コミットログを修正\n"
 " #\n"
 
-msgid "cannot edit history that would orphan nodes"
-msgstr "履歴ツリーが分断されるような履歴改変はできません"
-
-msgid "can't edit history with merges"
-msgstr "マージに関わる履歴の改変はできません"
-
-#, python-format
-msgid "%s: empty changeset"
-msgstr "%s: 空のリビジョン"
-
 msgid "Fix up the change and run hg histedit --continue"
 msgstr "衝突解消後に \"hg histedit --continue\" してください"
 
+#, python-format
+msgid "%s: empty changeset\n"
+msgstr "%s: 空のリビジョン\n"
+
 msgid ""
 "Make changes as needed, you may commit or record as needed now.\n"
 "When you are finished, run hg histedit --continue to resume."
@@ -4148,6 +4149,10 @@
 "必要に応じて変更/記録を行ってください。 作業が完了したならば、\n"
 "改変再開のために hg histedit --continue を実行してください。"
 
+#, python-format
+msgid "%s: empty changeset"
+msgstr "%s: 空のリビジョン"
+
 msgid "Read history edits from the specified file."
 msgstr "履歴改変手順を指定ファイルから読み込み"
 
@@ -4204,16 +4209,24 @@
 msgid "histedit requires exactly one parent revision"
 msgstr "履歴改変には単一の親リビジョンを指定してください"
 
-msgid "histedit: Should update metadata for the following changes:\n"
-msgstr "histedit: 以下のリビジョンのためにメタデータの更新が必要です:\n"
-
-#, python-format
-msgid "histedit:  %s to %s\n"
-msgstr "histedit:  %s から %s へ\n"
-
-#, python-format
-msgid "histedit:     moving bookmarks %s\n"
-msgstr "histedit:     ブックマーク %s の移動中\n"
+msgid "nothing to edit\n"
+msgstr "改変の必要なリビジョンがありません\n"
+
+#, python-format
+msgid "working directory parent is not a descendant of %s"
+msgstr "作業領域の親リビジョンは %s の子孫ではありません"
+
+#, python-format
+msgid "update to %s or descendant and run \"hg histedit --continue\" again"
+msgstr ""
+"%s かその子孫で作業領域更新後に \"hg histedit --continue\" してください"
+
+msgid "cannot edit history that would orphan nodes"
+msgstr "履歴ツリーが分断されるような履歴改変はできません"
+
+#, python-format
+msgid "cannot edit immutable changeset: %s"
+msgstr "改変不能なリビジョンがあります: %s"
 
 msgid "must specify a rule for each changeset once"
 msgstr "1リビジョン毎に1つのルール指定が必要です"
@@ -4233,6 +4246,10 @@
 msgid "unknown action \"%s\""
 msgstr "未知の操作 \"%s\" が指定されました"
 
+#, python-format
+msgid "histedit: moving bookmarks %s from %s to %s\n"
+msgstr "histedit: ブックマーク %s を %s から %s に移動中\n"
+
 msgid "accelerate status report using Linux's inotify service"
 msgstr "Linux の inoitfy サービスによる状態報告の高速化"
 
@@ -5010,6 +5027,10 @@
 msgstr "リビジョンの変換中"
 
 #, python-format
+msgid "missing largefile '%s' from revision %s"
+msgstr "大容量ファイル '%s' (リビジョン %s 由来) がありません"
+
+#, python-format
 msgid "renamed/copied largefile %s becomes symlink"
 msgstr "改名/複製対象の大容量ファイル %s がシンボリックリンク化されています"
 
@@ -5219,12 +5240,18 @@
 msgid "largefiles: No remote repo\n"
 msgstr "largefiles: 連携先リポジトリが指定されていません\n"
 
+msgid "largefiles: no files to upload\n"
+msgstr "largefiles: 転送予定ファイルはありません\n"
+
 msgid "largefiles to upload:\n"
 msgstr "転送予定大容量ファイル:\n"
 
+msgid "largefiles: (no files to upload)\n"
+msgstr "largefiles      : (転送予定ファイルなし)\n"
+
 #, python-format
 msgid "largefiles: %d to upload\n"
-msgstr "largefiles: 転送予定ファイル数 %d\n"
+msgstr "largefiles      : 転送予定ファイル数 %d\n"
 
 msgid "largefile contents do not match hash"
 msgstr "大容量ファイルの内容が想定ハッシュ値と一致しません"
@@ -6399,8 +6426,8 @@
 "    With no arguments, print the currently active guards.\n"
 "    With arguments, set guards for the named patch."
 msgstr ""
-"    引数指定が無い場合、 現在のガード選択状況を表示します。\n"
-"    引数が指定された場合、 指定パッチに対するガード選択を設定します。"
+"    引数指定が無い場合、 現在のガード設定を表示します。\n"
+"    引数が指定された場合、 指定パッチに対してガードを設定します。"
 
 msgid ""
 "    .. note::\n"
@@ -6726,18 +6753,18 @@
 "    With no arguments, prints the currently active guards.\n"
 "    With one argument, sets the active guard."
 msgstr ""
-"    本コマンドが引数無しで実行された場合、 現在のガード選択状況を表示\n"
-"    します。 引数が指定された場合、 ガード選択を設定します。"
+"    引数指定が無い場合、 現在のガード選択状況を表示します。\n"
+"    引数が指定された場合、 ガード選択を設定します。"
 
 msgid ""
 "    Use -n/--none to deactivate guards (no other arguments needed).\n"
 "    When no guards are active, patches with positive guards are\n"
 "    skipped and patches with negative guards are pushed."
 msgstr ""
-"    -n/--none を指定することで、 ガード選択を無効化します(他の引数は必要\n"
-"    ありません)。 いずれのガードも選択されていない場合、 「正」のガードが\n"
-"    設定されたパッチの適用は見送られますが、 「負」のガードが設定された\n"
-"    パッチは適用されます。"
+"    -n/--none を指定することで、 全てのガード選択を無効化します\n"
+"    (他の引数は必要ありません)。 ガードが全く選択されていない場合、\n"
+"    「正」のガードが設定されたパッチは適用されませんが、\n"
+"    「負」のガードが設定されたパッチは適用されます。"
 
 msgid ""
 "    qselect can change the guards on applied patches. It does not pop\n"
@@ -6835,13 +6862,13 @@
 msgstr "有効なキューの一覧表示"
 
 msgid "print name of active queue"
-msgstr "アクティブなキュー名の表示"
+msgstr "使用中のキュー名の表示"
 
 msgid "create new queue"
 msgstr "新規キューの作成"
 
 msgid "rename active queue"
-msgstr "現行キューの改名"
+msgstr "使用中のキューの改名"
 
 msgid "delete reference to queue"
 msgstr "キューへの参照の削除"
@@ -6871,11 +6898,10 @@
 "print\n"
 "    only the name of the active queue."
 msgstr ""
-"    キュー名称を指定しないか、 -l/--list が指定された場合、 登録済みの\n"
-"    キューの一覧が表示されます - 通常は \"normal\" パッチキューが登録\n"
-"    済みです。 当該時点でアクティブなキューには \"(アクティブ)\" が表示\n"
-"    されます。 --active が指定された場合、 表示対象となるキューは、\n"
-"    アクティブなキューのみです"
+"    キュー名称の指定が無いか、 -l/--list が指定された場合、\n"
+"    登録済みキューが一覧表示されます。 通常は \"patches\" が登録済みです。\n"
+"    実行時点で使用中のキューには \"(使用中)\" が表示されます。\n"
+"    --active が指定された場合は、 使用中のキューのみが表示されます。"
 
 msgid ""
 "    To create a new queue, use -c/--create. The queue is automatically made\n"
@@ -6883,10 +6909,10 @@
 "    currently active queue in the repository. Then the queue will only be\n"
 "    created and switching will fail."
 msgstr ""
-"    -c/--create が指定された場合、 新規キューを作成します。 当該時点で\n"
-"    アクティブなキューからパッチが適用中の場合を除き、 新規作成された\n"
-"    キューが自動的にアクティブなキューとなります。 この場合、\n"
-"    新規キューは生成されますがキューの切り替えは実施されません。"
+"    新規キューの作成には -c/--create を指定します。 新規作成キューは、\n"
+"    自動的に使用キューとなります。 ただし、 新規キューの作成時点で、\n"
+"    既存のキューからパッチが適用中の場合は、 新規キューは作成されますが、\n"
+"    使用キューの切り替えは実施されません。"
 
 msgid ""
 "    To delete an existing queue, use --delete. You cannot delete the "
@@ -6894,19 +6920,19 @@
 "    active queue."
 msgstr ""
 "    --delete が指定された場合、 既存のキューを削除します。\n"
-"    当該時点でアクティブなキューは削除できません。"
-
-msgid "patches applied - cannot set new queue active"
-msgstr "パッチ適用中 - 新規キューはアクティブにできません"
+"    その時点で使用中のキューは削除できません。"
+
+msgid "new queue created, but cannot make active as patches are applied"
+msgstr "パッチ適用中につき使用キューは切り替えません(新規キューは生成済み)"
 
 msgid "cannot delete queue that does not exist"
 msgstr "存在しないキューは削除できません"
 
 msgid "cannot delete currently active queue"
-msgstr "現時点でアクティブなキューは削除できません"
+msgstr "現時点で使用中のキューは削除できません"
 
 msgid " (active)\n"
-msgstr " (アクティブ)\n"
+msgstr " (使用中)\n"
 
 msgid "invalid queue name, may not contain the characters \":\\/.\""
 msgstr "\":\\/.\" を含む不正なキュー名称です"
@@ -6951,11 +6977,11 @@
 
 #, python-format
 msgid "%d applied"
-msgstr "適用パッチ数       %d"
+msgstr "適用パッチ数 %d"
 
 #, python-format
 msgid "%d unapplied"
-msgstr "未適用パッチ数     %d"
+msgstr "未適用パッチ数 %d"
 
 msgid "mq:     (empty queue)\n"
 msgstr "mq:     (空キュー)\n"
@@ -7027,29 +7053,48 @@
 
 msgid ""
 "  [usersubs]\n"
-"  # key is subscriber email, value is a comma-separated list of repo glob\n"
-"  # patterns\n"
+"  # key is subscriber email, value is a comma-separated list of repo "
+"patterns\n"
 "  user@host = pattern"
 msgstr ""
 "  [usersubs]\n"
 "  # 左辺には送信先メールアドレス、右辺にはカンマ区切りの\n"
-"  # リポジトリ合致(glob)パターンを記述してください\n"
+"  # リポジトリ合致判定パターンを記述してください\n"
 "  user@host = pattern"
 
 msgid ""
 "  [reposubs]\n"
-"  # key is glob pattern, value is a comma-separated list of subscriber\n"
-"  # emails\n"
+"  # key is repo pattern, value is a comma-separated list of subscriber "
+"emails\n"
+"  pattern = user@host"
+msgstr ""
+"  # 左辺にはリポジトリの合致判定パターン、右辺にはカンマ区切りの\n"
+"  # 送信先メールアドレスを記述してください\n"
 "  pattern = user@host"
-msgstr ""
-"  # 左辺には合致パターン、右辺にはカンマ区切りの送信先メールアドレスを\n"
-"  # 記述してください\n"
-"  pattern = user@host"
-
-msgid ""
-"Glob patterns are matched against absolute path to repository\n"
-"root."
-msgstr "合致パターンの適用対象は、 リポジトリルートの絶対パスです。"
+
+msgid ""
+"A ``pattern`` is a ``glob`` matching the absolute path to a repository,\n"
+"optionally combined with a revset expression. A revset expression, if\n"
+"present, is separated from the glob by a hash. Example::"
+msgstr ""
+"``pattern`` 指定は、 リポジトリの絶対パスに対する ``glob`` 合致判定で、\n"
+"revset 表記と組み合わせることもできます。 revset 表記を記述する場合は、\n"
+"``glob`` パターンとハッシュ記号 (``#``) で区切ります。記述例::"
+
+msgid ""
+"  [reposubs]\n"
+"  */widgets#branch(release) = qa-team@example.com"
+msgstr ""
+"  [reposubs]\n"
+"  */widgets#branch(release) = qa-team@example.com"
+
+msgid ""
+"This sends to ``qa-team@example.com`` whenever a changeset on the "
+"``release``\n"
+"branch triggers a notification in any repository ending in ``widgets``."
+msgstr ""
+"この設定例では、 ``widgets`` で終わるリポジトリの ``release``\n"
+"ブランチへの変更を契機に ``qa-team@example.com`` への通知が実施されます。"
 
 msgid ""
 "In order to place them under direct user management, ``[usersubs]`` and\n"
@@ -7554,11 +7599,11 @@
 msgstr "    最後の部位には :hg:`export` が生成する差分が配置されます。"
 
 msgid ""
-"    With the -d/--diffstat or -c/--confirm options, you will be presented\n"
+"    With the -d/--diffstat or --confirm options, you will be presented\n"
 "    with a final summary of all messages and asked for confirmation before\n"
 "    the messages are sent."
 msgstr ""
-"    -d/--diffstat ないし -c/--confirm が指定された場合、\n"
+"    -d/--diffstat ないし --confirm が指定された場合、\n"
 "    メッセージの送信に先立って、 全メッセージのまとめを伴って、\n"
 "    確認の問い合わせがあります。"
 
@@ -8155,9 +8200,6 @@
 msgid "rebase merging completed\n"
 msgstr "移動のマージ処理が完了\n"
 
-msgid "warning: new changesets detected on source branch, not stripping\n"
-msgstr "警告: 移動元に新規リビジョンを検出したので、 破棄しません\n"
-
 msgid "rebase completed\n"
 msgstr "移動完了\n"
 
@@ -8197,6 +8239,9 @@
 msgid "source is ancestor of destination"
 msgstr "移動元は移動先の祖先です"
 
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr "警告: 移動元に新規リビジョンを検出したので、 破棄しません\n"
+
 #, python-format
 msgid "updating bookmark %s\n"
 msgstr "ブックマーク %s の更新中\n"
@@ -8305,12 +8350,12 @@
 msgstr " と "
 
 #, python-format
-msgid "record this change to %r?"
-msgstr "この変更を %r に記録しますか?"
-
-#, python-format
-msgid "record change %d/%d to %r?"
-msgstr "この変更 (%d 件目 / %d 件中) を %r に記録しますか?"
+msgid "record this change to '%s'?"
+msgstr "この変更を '%s' に記録しますか?"
+
+#, python-format
+msgid "record change %d/%d to '%s'?"
+msgstr "この変更 (%d 件目 / %d 件中) を '%s' に記録しますか?"
 
 msgid "hg record [OPTION]... [FILE]..."
 msgstr "hg record [OPTION]... [FILE]..."
@@ -9148,10 +9193,6 @@
 msgstr "不正な .hg/bookmarks 記述行: %r\n"
 
 #, python-format
-msgid "bookmark '%s' contains illegal character"
-msgstr "ブックマーク '%s' は不正な文字を含んでいます"
-
-#, python-format
 msgid "branch %s not found"
 msgstr "ブランチ %s が見つかりません"
 
@@ -9195,6 +9236,9 @@
 msgid "%s: unknown bundle version %s"
 msgstr "%s: 未知のバンドル形式バージョン %s"
 
+msgid "no node"
+msgstr "ノードがありません"
+
 msgid "empty username"
 msgstr "ユーザ名が空です"
 
@@ -10070,7 +10114,7 @@
 "          hg bisect --bad"
 
 msgid ""
-"      - mark the current revision, or a known revision, to be skipped (eg. "
+"      - mark the current revision, or a known revision, to be skipped (e.g. "
 "if\n"
 "        that revision is not usable because of another issue)::"
 msgstr ""
@@ -10267,11 +10311,31 @@
 "    current active bookmark will be marked inactive.\n"
 "    "
 msgstr ""
-"    -i/--inactive 指定のある場合は、 作成された新規ブックマークは、\n"
-"    アクティブにはなりません。 -r/--rev 指定のある場合は、 -i/--inactive\n"
+"    -i/--inactive 指定のある場合、 作成された新規ブックマークは、\n"
+"    アクティブにはなりません。 -r/--rev 指定のある場合、 -i/--inactive\n"
 "    指定が無くても、 新規ブックマークはアクティブになりません。\n"
-"    ブックマーク名指定が無い場合、 現ブックマークが非アクティブ化されます。\n"
-"    "
+"    -i/--inactive 指定時に、 ブックマーク名指定が無い場合は、\n"
+"    現在アクティブなブックマークが、 非アクティブ化されます。\n"
+"    "
+
+msgid "bookmark names cannot consist entirely of whitespace"
+msgstr "空白文字だけで構成されたタグ名は不正です"
+
+#, python-format
+msgid "bookmark '%s' already exists (use -f to force)"
+msgstr "ブックマーク '%s' は存在します(強制実行する場合は -f を指定)"
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr "既存ブランチと同名のブックマークは作成できません"
+
+msgid "--delete and --rename are incompatible"
+msgstr "--delete と --rename は併用できません"
+
+msgid "--rev is incompatible with --delete"
+msgstr "--rev と --delete は併用できません"
+
+msgid "--rev is incompatible with --rename"
+msgstr "--rev と --rename は併用できません"
 
 msgid "bookmark name required"
 msgstr "ブックマーク名を要求しました"
@@ -10280,25 +10344,15 @@
 msgid "bookmark '%s' does not exist"
 msgstr "ブックマーク '%s' は存在しません"
 
-#, python-format
-msgid "bookmark '%s' already exists (use -f to force)"
-msgstr "ブックマーク '%s' は存在します(強制実行する場合は -f を指定)"
-
 msgid "new bookmark name required"
 msgstr "新しいブックマーク名を要求しました"
 
-msgid "bookmark name cannot contain newlines"
-msgstr "ブックマーク名に改行を含めません"
-
-msgid "bookmark names cannot consist entirely of whitespace"
-msgstr "空白文字だけで構成されたタグ名は不正です"
-
-msgid "a bookmark cannot have the name of an existing branch"
-msgstr "既存ブランチと同名のブックマークは作成できません"
-
 msgid "no bookmarks set\n"
 msgstr "ブックマークは存在しません\n"
 
+msgid "no active bookmark\n"
+msgstr "アクティブなブックマークがありません\n"
+
 msgid "set branch name even if it shadows an existing branch"
 msgstr "同名既存ブランチが存在する場合でもブランチ作成を実施"
 
@@ -10403,8 +10457,8 @@
 "    If -a/--active is specified, only show active branches. A branch\n"
 "    is considered active if it contains repository heads."
 msgstr ""
-"    -a/--active 指定時には、 活性(active)ブランチのみが表示されます。\n"
-"    リポジトリ中にヘッドを持つものが活性ブランチとみなされます。"
+"    -a/--active 指定時には、 アクティブなブランチのみが表示されます。\n"
+"    リポジトリ中にヘッドを持つものがアクティブなブランチとみなされます。"
 
 msgid "    Use the command :hg:`update` to switch to an existing branch."
 msgstr ""
@@ -11060,7 +11114,7 @@
 
 msgid ""
 "    If you pass a revlog index, the revlog's DAG is emitted. If you list\n"
-"    revision numbers, they get labelled in the output as rN."
+"    revision numbers, they get labeled in the output as rN."
 msgstr ""
 "    差分インデックスファイル (revlog  形式) を指定した場合、\n"
 "    当該ファイルの DAG が出力されます。 リビジョン番号を指定した場合、\n"
@@ -11244,11 +11298,14 @@
 "    各 ID 毎の既知性を、 0 と 1 で表現したリストが出力されます。\n"
 "    "
 
+msgid "markers flag"
+msgstr "廃止マーカ用フラグ"
+
 msgid "[OBSOLETED [REPLACEMENT] [REPL... ]"
 msgstr "[OBSOLETED [REPLACEMENT] [REPL... ]"
 
 msgid "create arbitrary obsolete marker"
-msgstr "任意の『廃止』状態の設定"
+msgstr "任意の廃止状態の設定"
 
 msgid "REPO NAMESPACE [KEY OLD NEW]"
 msgstr "REPO NAMESPACE [KEY OLD NEW]"
@@ -11971,12 +12028,12 @@
 "\"hg help %s\" で詳細なヘルプが表示されます\n"
 
 #, python-format
-msgid ""
-"\n"
-"use \"hg -v help %s\" to show more info\n"
-msgstr ""
-"\n"
-"\"hg -v help %s\" で詳細な情報が表示されます\n"
+msgid "use \"hg -v help %s\" to show more complete help and the global options"
+msgstr "省略されたヘルプの詳細やグローバルオプションの表示は \"hg -v help %s\""
+
+#, python-format
+msgid "use \"hg -v help %s\" to show the global options"
+msgstr "グローバルオプションの表示は \"hg -v help %s\""
 
 msgid "basic commands:"
 msgstr "基本コマンド:"
@@ -12006,13 +12063,17 @@
 
 #, python-format
 msgid "use \"hg help %s\" to show the full help text"
-msgstr "\"hg help %s\" で詳細なヘルプが表示されます"
+msgstr "詳細なヘルプの表示は \"hg help %s\""
 
 #, python-format
 msgid "use \"hg -v help%s\" to show builtin aliases and global options"
 msgstr "組み込み別名およびグローバルオプションの表示は \"hg -v help%s\""
 
 #, python-format
+msgid "use \"hg help -v %s\" to show more complete help"
+msgstr "省略されたヘルプの詳細の表示は \"hg help %s\""
+
+#, python-format
 msgid ""
 "\n"
 "use \"hg help -c %s\" to see help for the %s command\n"
@@ -13172,6 +13233,10 @@
 "    "
 
 #, python-format
+msgid "not removing %s: no tracked files\n"
+msgstr "%s は削除されません: 登録済みファイルはありません\n"
+
+#, python-format
 msgid "not removing %s: file is untracked\n"
 msgstr "%s は削除されません: 未登録ファイルです\n"
 
@@ -13871,19 +13936,19 @@
 msgstr "update 候補     : %d の新規リビジョン、 %d のブランチヘッド(マージ)\n"
 
 msgid "1 or more incoming"
-msgstr "取り込み対象リビジョン(incoming)あり"
+msgstr "取り込み候補(incoming)リビジョンあり"
 
 #, python-format
 msgid "%d outgoing"
-msgstr "%d 個の反映候補リビジョン(outgoing)"
+msgstr "%d 個の反映候補(outgoing)リビジョン"
 
 #, python-format
 msgid "%d incoming bookmarks"
-msgstr "%d 個の取り込み候補ブックマーク(incoming)"
+msgstr "%d 個の取り込み候補(incoming)ブックマーク"
 
 #, python-format
 msgid "%d outgoing bookmarks"
-msgstr "%d 個の更新候補ブックマーク(outgoing)"
+msgstr "%d 個の反映候補(outgoing)ブックマーク"
 
 #, python-format
 msgid "remote: %s\n"
@@ -13976,7 +14041,7 @@
 msgstr "空白文字だけで構成されたタグ名は不正です"
 
 msgid "--rev and --remove are incompatible"
-msgstr "--rev と --remove は同時に使用できません"
+msgstr "--rev と --remove は併用できません"
 
 #, python-format
 msgid "tag '%s' does not exist"
@@ -14182,6 +14247,14 @@
 "    およびチェックサム、 相互関連付けおよびインデックス等の整合性が\n"
 "    検証されます。"
 
+msgid ""
+"    Please see http://mercurial.selenic.com/wiki/RepositoryCorruption\n"
+"    for more information about recovery from corruption of the\n"
+"    repository."
+msgstr ""
+"    リポジトリ破損時の復旧に関する詳細は、 以下の URL を参照してください。\n"
+"    http://mercurial.selenic.com/wiki/JapaneseRepositoryCorruption"
+
 msgid "output version and copyright information"
 msgstr "バージョンおよび著作権情報の表示"
 
@@ -14580,6 +14653,10 @@
 msgstr "警告: ファイル %s でのコマンド解析中にエラー発生\n"
 
 #, python-format
+msgid "invalid value %r for option %s, expected int"
+msgstr "指定値 %r は整数値を想定しているオプション %s には不適切です"
+
+#, python-format
 msgid "couldn't find merge tool %s\n"
 msgstr "マージツール %s が見つかりません\n"
 
@@ -16340,9 +16417,9 @@
 "``post-<command>``\n"
 "  Run after successful invocations of the associated command. The\n"
 "  contents of the command line are passed as ``$HG_ARGS`` and the result\n"
-"  code in ``$HG_RESULT``. Parsed command line arguments are passed as \n"
+"  code in ``$HG_RESULT``. Parsed command line arguments are passed as\n"
 "  ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of\n"
-"  the python data internally passed to <command>. ``$HG_OPTS`` is a \n"
+"  the python data internally passed to <command>. ``$HG_OPTS`` is a\n"
 "  dictionary of options (with unspecified options set to their defaults).\n"
 "  ``$HG_PATS`` is a list of arguments. Hook failure is ignored."
 msgstr ""
@@ -16364,7 +16441,7 @@
 "  are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string\n"
 "  representations of the data internally passed to <command>. ``$HG_OPTS``\n"
 "  is a  dictionary of options (with unspecified options set to their\n"
-"  defaults). ``$HG_PATS`` is a list of arguments. If the hook returns \n"
+"  defaults). ``$HG_PATS`` is a list of arguments. If the hook returns\n"
 "  failure, the command doesn't execute and Mercurial returns the failure\n"
 "  code."
 msgstr ""
@@ -17034,13 +17111,10 @@
 "location of the repository. Default paths can be declared by setting\n"
 "the following entries."
 msgstr ""
-"リポジトリへのシンボリックな名前の割り当て設定。\n"
-"設定記述の左辺にシンボル名を、\n"
-"右辺にリポジトリ位置のディレクトリ、\n"
-"ないし URL を記述します。\n"
-"連携先リポジトリ指定が無い場合でも、\n"
-"以下のシンボルを設定することで、\n"
-"パス指定が可能です。 (※ 訳注: :hg:`help urls` も参照してください)"
+"リポジトリ位置へのシンボリックな名前の割り当て設定。 記述左辺にシンボル、\n"
+"右辺にリポジトリ位置のディレクトリ、 ないし URL を記述します。\n"
+"以下のシンボルを設定することで、 連携先リポジトリ指定が無い場合でも、\n"
+"暗黙のパス指定とみなされます。 (※ 訳注: :hg:`help urls` も参照)"
 
 msgid ""
 "``default``\n"
@@ -17064,9 +17138,32 @@
 "    連携対象となるリポジトリのディレクトリ、 ないし URL。"
 
 msgid ""
+"Custom paths can be defined by assigning the path to a name that later can "
+"be\n"
+"used from the command line. Example::"
+msgstr ""
+"任意の名前へのパス割り当てにより、 コマンドライン等でのリポジトリ指定で、\n"
+"URL 指定の代わりにその名前を使用できます。設定例::"
+
+msgid ""
+"    [paths]\n"
+"    my_path = http://example.com/path"
+msgstr ""
+"    [paths]\n"
+"    my_path = http://example.com/path"
+
+msgid "To push to the path defined in ``my_path`` run the command::"
+msgstr "以下のコマンド実行で ``my_path`` リポジトリに履歴が反映されます::"
+
+msgid "    hg push my_path"
+msgstr "    hg push my_path"
+
+msgid ""
+"\n"
 "``phases``\n"
 "----------"
 msgstr ""
+"\n"
 "``phases``\n"
 "----------"
 
@@ -18184,7 +18281,7 @@
 
 msgid ""
 "``stripes``\n"
-"    How many lines a \"zebra stripe\" should span in multiline output.\n"
+"    How many lines a \"zebra stripe\" should span in multi-line output.\n"
 "    Default is 1; set to 0 to disable."
 msgstr ""
 "``stripes``\n"
@@ -19876,7 +19973,7 @@
 "  - paths\n"
 "  - collections"
 
-msgid "The ``web`` options are thorougly described in :hg:`help config`."
+msgid "The ``web`` options are thoroughly described in :hg:`help config`."
 msgstr "``web`` での記述の詳細は :hg:`help config` を参照してください。"
 
 msgid ""
@@ -21373,6 +21470,13 @@
 msgid "clone from remote to remote not supported"
 msgstr "リモートからリモートの複製は未サポートです"
 
+msgid "updating to bookmark @\n"
+msgstr "ブックマーク @ への更新中\n"
+
+#, python-format
+msgid "updating to bookmark @ on branch %s\n"
+msgstr "ブランチ %s のブックマーク @ へ更新中\n"
+
 #, python-format
 msgid "updating to branch %s\n"
 msgstr "ブランチ %s へ更新中\n"
@@ -21564,10 +21668,6 @@
 msgstr "警告: 作業領域の親 '%s' が未知のリビジョンです!\n"
 
 #, python-format
-msgid "%r cannot be used in a tag name"
-msgstr "%r はタグ名に使用できません"
-
-#, python-format
 msgid "warning: tag %s conflicts with existing branch name\n"
 msgstr "警告: タグ %s が既存のブランチ名と衝突します\n"
 
@@ -21683,19 +21783,23 @@
 msgstr "指定の連携先には履歴反映ができません"
 
 #, python-format
-msgid "push includes an obsolete changeset: %s!"
-msgstr "履歴反映対象に『廃止』リビジョンが含まれます!: %s"
-
-#, python-format
-msgid "push includes an unstable changeset: %s!"
-msgstr "履歴反映対象に『非永続』リビジョンが含まれます!: %s"
+msgid "push includes obsolete changeset: %s!"
+msgstr "履歴反映対象に廃止 (obsolete) リビジョンが含まれます!: %s"
+
+#, python-format
+msgid "push includes unstable changeset: %s!"
+msgstr "履歴反映対象に非永続 (unstable) リビジョンが含まれます!: %s"
+
+#, python-format
+msgid "push includes bumped changeset: %s!"
+msgstr ""
 
 #, python-format
 msgid "updating %s to public failed!\n"
 msgstr "%s のフェーズの public 化に失敗!\n"
 
 msgid "failed to push some obsolete markers!\n"
-msgstr "リビジョンの『廃止』情報の反映に失敗しました!\n"
+msgstr "リビジョンの廃止情報の反映に失敗しました!\n"
 
 #, python-format
 msgid "%d changesets found\n"
@@ -21962,12 +22066,15 @@
 
 #, python-format
 msgid "parsing obsolete marker: unknown version %r"
-msgstr "『廃止』情報解析: 未知のリビジョン %r"
+msgstr "廃止情報解析: 未知のリビジョン %r"
 
 #, python-format
 msgid ""
 "parsing obsolete marker: metadata is too short, %d bytes expected, got %d"
-msgstr "『廃止』情報解析: メタデータの想定サイズ %d に対して %d しかありません"
+msgstr "廃止情報解析: メタデータの想定サイズ %d に対して %d しかありません"
+
+msgid "bad obsolescence marker detected: invalid successors nullid"
+msgstr "不正な廃止情報を検出: 後継としての null 指定は不正です"
 
 #, python-format
 msgid "unknown key: %r"
@@ -22151,9 +22258,6 @@
 msgid "index %s is corrupted"
 msgstr "インデックス %s は破損しています"
 
-msgid "no node"
-msgstr "ノードがありません"
-
 msgid "ambiguous identifier"
 msgstr "曖昧な ID です"
 
@@ -22234,7 +22338,7 @@
 
 msgid ""
 "    - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip\n"
-"    - ``goods``, ``bads``      : csets topologicaly good/bad\n"
+"    - ``goods``, ``bads``      : csets topologically good/bad\n"
 "    - ``range``              : csets taking part in the bisection\n"
 "    - ``pruned``             : csets that are goods, bads or skipped\n"
 "    - ``untested``           : csets whose fate is yet unknown\n"
@@ -22302,6 +22406,22 @@
 "    付きで指定してください。"
 
 msgid ""
+"``bumped()``\n"
+"    Mutable changesets marked as successors of public changesets."
+msgstr ""
+"``bumped()``\n"
+"    public フェーズなリビジョンの後継で、 且つ改変可能なリビジョン。"
+
+msgid "    Only non-public and non-obsolete changesets can be `bumped`."
+msgstr ""
+"    非 public で、且つ廃止設定されていないリビジョンのみが `bumped`\n"
+"    とみなされます。"
+
+#. i18n: "bumped" is a keyword
+msgid "bumped takes no arguments"
+msgstr "bumped には引数が指定できません"
+
+msgid ""
 "``children(set)``\n"
 "    Child changesets of changesets in set."
 msgstr ""
@@ -22408,7 +22528,7 @@
 "    Obsolete changesets with obsolete descendants only."
 msgstr ""
 "``extinct()``\n"
-"    子孫が全て『廃止』リビジョンな、『廃止』リビジョン群。"
+"    子孫が全て廃止リビジョンな、廃止リビジョン群。"
 
 #. i18n: "extinct" is a keyword
 msgid "extinct takes no arguments"
@@ -22576,6 +22696,18 @@
 "    指定リビジョン中の、 子リビジョンを持たないリビジョン群。"
 
 msgid ""
+"``hidden()``\n"
+"    Hidden changesets."
+msgstr ""
+"``hidden()``\n"
+"    不可視状態のリビジョン群 (※ 訳注: 作業領域やブックマーク等から、\n"
+"    到達できない廃止設定のリビジョン群のこと)。"
+
+#. i18n: "hidden" is a keyword
+msgid "hidden takes no arguments"
+msgstr "hidden には引数が指定できません"
+
+msgid ""
 "``keyword(string)``\n"
 "    Search commit message, user name, and names of changed files for\n"
 "    string. The match is case-insensitive."
@@ -22645,6 +22777,17 @@
 msgstr "merge には引数が指定できません"
 
 msgid ""
+"``branchpoint()``\n"
+"    Changesets with more than one child."
+msgstr ""
+"``branchpoint()``\n"
+"    子リビジョンを1つ以上持つリビジョン群。"
+
+#. i18n: "branchpoint" is a keyword
+msgid "branchpoint takes no arguments"
+msgstr "branchpoint には引数が指定できません"
+
+msgid ""
 "``min(set)``\n"
 "    Changeset with lowest revision number in set."
 msgstr ""
@@ -22683,7 +22826,7 @@
 msgstr ""
 "``obsolete()``\n"
 "    新規リビジョンによる改変が可能なリビジョン群。\n"
-"    (※ 訳注: 『廃止』設定されているリビジョン群のこと)"
+"    (※ 訳注: 廃止設定されているリビジョン群のこと)"
 
 #. i18n: "obsolete" is a keyword
 msgid "obsolete takes no arguments"
@@ -22987,7 +23130,8 @@
 "    Non-obsolete changesets with obsolete ancestors."
 msgstr ""
 "``unstable()``\n"
-"    祖先に『廃止』リビジョンを持つ、『非廃止』リビジョン群。"
+"    祖先に廃止リビジョンを持つ、非廃止リビジョン群 (※ 訳注: 日本語訳では\n"
+"    unstable を『非永続』と訳しています)"
 
 #. i18n: "unstable" is a keyword
 msgid "unstable takes no arguments"
@@ -23032,6 +23176,10 @@
 msgstr "差分はありません (secret フェーズの %d 個のリビジョンは無視)\n"
 
 #, python-format
+msgid "%r cannot be used in a name"
+msgstr "%r は名前定義に使用できません"
+
+#, python-format
 msgid "ui.portablefilenames value is invalid ('%s')"
 msgstr "ui.portablefilenames 値が不正です ('%s')"
 
@@ -23431,10 +23579,10 @@
 
 msgid ""
 ":escape: Any text. Replaces the special XML/XHTML characters \"&\", \"<\"\n"
-"    and \">\" with XML entities."
+"    and \">\" with XML entities, and filters out NUL characters."
 msgstr ""
 ":escape: 文字列。 XML/XHTML の特殊文字である \"&\"、 \"<\" および\n"
-"    \">\" を XML のエンティティ形式に変換します。"
+"    \">\" を XML のエンティティ形式に変換し、 NUL 文字を除外します。"
 
 msgid ":fill68: Any text. Wraps the text to fit in 68 columns."
 msgstr ":fill68: 文字列。 68 桁に収まるように文字列を折り返します。"
@@ -23594,6 +23742,15 @@
 msgid ":emailuser: Any text. Returns the user portion of an email address."
 msgstr ":emailuser: 文字列。 メールアドレスのユーザ名部分を取り出します。"
 
+msgid "fill expects one or two arguments"
+msgstr "fill の引数は1つないし2つです"
+
+msgid "fill expects an integer width"
+msgstr "fill には数値を指定してください"
+
+msgid "date expects one or two arguments"
+msgstr "date の引数は1つないし2つです"
+
 msgid ":author: String. The unmodified author of the changeset."
 msgstr ":author: 文字列。 リビジョンの作者名(記録情報そのまま)。"
 
@@ -23676,6 +23833,37 @@
 "    digit string."
 msgstr ":node: 文字列。 リビジョン識別用の 40 桁 16 進数ハッシュ値。"
 
+msgid ""
+":p1rev: Integer. The repository-local revision number of the changeset's\n"
+"    first parent, or -1 if the changeset has no parents."
+msgstr ""
+":p1rev: 整数。 第1親リビジョンの、 当該リポジトリにおけるリビジョン番号。\n"
+"    親を持たないリビジョンの場合は -1。"
+
+msgid ""
+":p2rev: Integer. The repository-local revision number of the changeset's\n"
+"    second parent, or -1 if the changeset has no second parent."
+msgstr ""
+":p2rev: 整数。 第2親リビジョンの、 当該リポジトリにおけるリビジョン番号。\n"
+"    第2親を持たないリビジョンの場合は -1。"
+
+msgid ""
+":p1node: String. The identification hash of the changeset's first parent,\n"
+"    as a 40 digit hexadecimal string. If the changeset has no parents, all\n"
+"    digits are 0."
+msgstr ""
+":p1node: 文字列。 第1親リビジョンの 40 桁ハッシュ値の文字列。\n"
+"    親を持たないリビジョンの場合は、 全桁が 0 のハッシュ値文字列。"
+
+msgid ""
+":p2node: String. The identification hash of the changeset's second\n"
+"    parent, as a 40 digit hexadecimal string. If the changeset has no "
+"second\n"
+"    parent, all digits are 0."
+msgstr ""
+":p2node: 文字列。 第1親リビジョンの 40 桁ハッシュ値の文字列。\n"
+"    第2親を持たないリビジョンの場合は、 全桁が 0 のハッシュ値文字列。"
+
 msgid ":phase: String. The changeset phase name."
 msgstr ":phase: 文字列。 当該リビジョンのフェーズ名。"
 
@@ -23712,9 +23900,25 @@
 msgstr "テンプレート指定が必要です"
 
 #, python-format
+msgid "template filter '%s' is not compatible with keyword '%s'"
+msgstr "フィルタ指定 '%s' はキーワード '%s' と互換性がありません"
+
+#, python-format
 msgid "filter %s expects one argument"
 msgstr "フィルタ %s は引数が1つ必要です"
 
+msgid "join expects one or two arguments"
+msgstr "join の引数は1つないし2つです"
+
+msgid "sub expects three arguments"
+msgstr "sub は引数が3つ必要です"
+
+msgid "if expects two or three arguments"
+msgstr "if は2ないし3の引数が必要です"
+
+msgid "ifeq expects three or four arguments"
+msgstr "ifeq は3ないし4の引数が必要です"
+
 msgid "unmatched quotes"
 msgstr "引用符の対応関係が不正です"
 
--- a/i18n/pt_BR.po	Tue Oct 23 09:28:42 2012 +0200
+++ b/i18n/pt_BR.po	Thu Nov 01 16:30:48 2012 -0500
@@ -31,7 +31,7 @@
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2012-07-31 14:10-0300\n"
+"POT-Creation-Date: 2012-10-23 11:38-0200\n"
 "PO-Revision-Date: 2011-06-28 09:55+0200\n"
 "Last-Translator: Wagner Bruna <wbruna@yahoo.com>\n"
 "Language-Team: Brazilian Portuguese\n"
@@ -586,7 +586,7 @@
 "email to the Bugzilla email interface to submit comments to bugs.\n"
 "The From: address in the email is set to the email address of the Mercurial\n"
 "user, so the comment appears to come from the Mercurial user. In the event\n"
-"that the Mercurial user email is not recognised by Bugzilla as a Bugzilla\n"
+"that the Mercurial user email is not recognized by Bugzilla as a Bugzilla\n"
 "user, the email associated with the Bugzilla username used to log into\n"
 "Bugzilla is used instead as the source of the comment. Marking bugs fixed\n"
 "works on all supported Bugzilla versions."
@@ -607,7 +607,7 @@
 
 msgid ""
 "bugzilla.version\n"
-"  This access type to use. Values recognised are:"
+"  The access type to use. Values recognized are:"
 msgstr ""
 "bugzilla.version\n"
 "  O tipo de acesso a ser usado. Os valores reconhecidos são:"
@@ -1696,7 +1696,7 @@
 msgid ""
 "    The authormap is a simple text file that maps each source commit\n"
 "    author to a destination commit author. It is handy for source SCMs\n"
-"    that use unix logins to identify authors (eg: CVS). One line per\n"
+"    that use unix logins to identify authors (e.g.: CVS). One line per\n"
 "    author mapping and the line format is::"
 msgstr ""
 "    O parâmetro authormap é um arquivo texto simples\n"
@@ -3590,7 +3590,7 @@
 "  # Style to use (optional)\n"
 "  #style = foo\n"
 "  # The URL of the CIA notification service (optional)\n"
-"  # You can use mailto: URLs to send by email, eg\n"
+"  # You can use mailto: URLs to send by email, e.g.\n"
 "  # mailto:cia@cia.vc\n"
 "  # Make sure to set email.from if you do this.\n"
 "  #url = http://cia.vc/\n"
@@ -4120,19 +4120,13 @@
 "#  m, mess = edite a mensagem sem mudar o conteúdo da revisão\n"
 "# #\n"
 
-msgid "cannot edit history that would orphan nodes"
-msgstr "não é possível editar histórico de forma a produzir nós órfãos"
-
-msgid "can't edit history with merges"
-msgstr "não se pode editar histórico contendo mesclagens"
-
-#, python-format
-msgid "%s: empty changeset"
-msgstr "%s: revisão vazia"
-
 msgid "Fix up the change and run hg histedit --continue"
 msgstr "Conserte a mudança e execute hg histedit --continue"
 
+#, python-format
+msgid "%s: empty changeset\n"
+msgstr "%s: revisão vazia\n"
+
 msgid ""
 "Make changes as needed, you may commit or record as needed now.\n"
 "When you are finished, run hg histedit --continue to resume."
@@ -4140,6 +4134,10 @@
 "Faça mudanças conforme for necessário, consolidando ou gravando usando record.\n"
 "Quando tiver terminado, execute hg histedit --continue para retomar."
 
+#, python-format
+msgid "%s: empty changeset"
+msgstr "%s: revisão vazia"
+
 msgid "Read history edits from the specified file."
 msgstr "Lê alterações de histórico a partir do arquivo especificado."
 
@@ -4197,16 +4195,25 @@
 msgid "histedit requires exactly one parent revision"
 msgstr "histedit requer exatamente uma revisão pai"
 
-msgid "histedit: Should update metadata for the following changes:\n"
-msgstr "histedit: Deve atualizar metadados para as seguintes mudanças:\n"
-
-#, python-format
-msgid "histedit:  %s to %s\n"
-msgstr "histedit:  %s a %s\n"
-
-#, python-format
-msgid "histedit:     moving bookmarks %s\n"
-msgstr "histedit:     movendo marcadores %s\n"
+msgid "nothing to edit\n"
+msgstr "nada para editar\n"
+
+#, python-format
+msgid "working directory parent is not a descendant of %s"
+msgstr "a revisão do diretório de trabalho não é descendente de %s"
+
+#, python-format
+msgid "update to %s or descendant and run \"hg histedit --continue\" again"
+msgstr ""
+"atualize para %s ou um descendente e execute \"hg histedit --continue\" "
+"novamente"
+
+msgid "cannot edit history that would orphan nodes"
+msgstr "não é possível editar histórico de forma a produzir nós órfãos"
+
+#, python-format
+msgid "cannot edit immutable changeset: %s"
+msgstr "não é possível editar uma revisão imutável: %s"
 
 msgid "must specify a rule for each changeset once"
 msgstr "é necessário especificar uma vez uma regra para cada revisão"
@@ -4226,6 +4233,10 @@
 msgid "unknown action \"%s\""
 msgstr "ação desconhecida \"%s\""
 
+#, python-format
+msgid "histedit: moving bookmarks %s from %s to %s\n"
+msgstr "histedit: movendo marcadores %s de %s para %s\n"
+
 msgid "accelerate status report using Linux's inotify service"
 msgstr "acelera informações de status usando o serviço inotify do Linux"
 
@@ -5025,6 +5036,10 @@
 msgstr "convertendo revisões"
 
 #, python-format
+msgid "missing largefile '%s' from revision %s"
+msgstr "largefile '%s' da revisão %s faltando"
+
+#, python-format
 msgid "renamed/copied largefile %s becomes symlink"
 msgstr "o largefile %s renomeado/copiado se tornou um link simbólico"
 
@@ -5236,9 +5251,21 @@
 msgid "largefiles: No remote repo\n"
 msgstr "largefiles: Nenhum repositório remoto\n"
 
+msgid "largefiles: no files to upload\n"
+msgstr "largefiles: nenhum arquivo a ser enviado\n"
+
 msgid "largefiles to upload:\n"
 msgstr "largefiles a serem enviados:\n"
 
+#. i18n: column positioning for "hg summary"
+msgid "largefiles: (no remote repo)\n"
+msgstr "largefiles: (nenhum repositório remoto)\n"
+
+#. i18n: column positioning for "hg summary"
+msgid "largefiles: (no files to upload)\n"
+msgstr "largefiles: (nenhum arquivo a ser enviado)\n"
+
+#. i18n: column positioning for "hg summary"
 #, python-format
 msgid "largefiles: %d to upload\n"
 msgstr "largefiles: %d a serem enviados\n"
@@ -6934,8 +6961,9 @@
 "    Para remover uma fila existente, use --delete. Você não pode\n"
 "    remover a fila ativa no momento."
 
-msgid "patches applied - cannot set new queue active"
-msgstr "patches aplicados - não é possível ativar outra fila"
+msgid "new queue created, but cannot make active as patches are applied"
+msgstr ""
+"nova fila criada, mas não pode ser ativada pois patches estão aplicados"
 
 msgid "cannot delete queue that does not exist"
 msgstr "não é possível remover uma fila que não existe"
@@ -6995,6 +7023,12 @@
 msgid "%d unapplied"
 msgstr "%d não aplicados"
 
+#. i18n: column positioning for "hg summary"
+#, python-format
+msgid "mq:     %s\n"
+msgstr "mq:     %s\n"
+
+#. i18n: column positioning for "hg summary"
 msgid "mq:     (empty queue)\n"
 msgstr "mq:     (fila vazia)\n"
 
@@ -7066,32 +7100,48 @@
 
 msgid ""
 "  [usersubs]\n"
-"  # key is subscriber email, value is a comma-separated list of repo glob\n"
-"  # patterns\n"
+"  # key is subscriber email, value is a comma-separated list of repo patterns\n"
 "  user@host = pattern"
 msgstr ""
 "  [usersubs]\n"
 "  # a chave é o e-mail do assinante, o valor é uma lista separada\n"
-"  # por vírgulas de padrões glob de repositórios\n"
+"  # por vírgulas de padrões de repositórios\n"
 "  user@host = padrão,padrão"
 
 msgid ""
 "  [reposubs]\n"
-"  # key is glob pattern, value is a comma-separated list of subscriber\n"
-"  # emails\n"
+"  # key is repo pattern, value is a comma-separated list of subscriber emails\n"
 "  pattern = user@host"
 msgstr ""
 "  [reposubs]\n"
-"  # a chave é o padrão glob, o valor é uma lista separada por\n"
+"  # a chave é o padrão de repositórios, o valor é uma lista separada por\n"
 "  # vírgulas de e-mails dos assinantes\n"
 "  padrão = user@host"
 
 msgid ""
-"Glob patterns are matched against absolute path to repository\n"
-"root."
-msgstr ""
-"Os padrões glob correspondem ao caminho absoluto da raiz do\n"
-"repositório."
+"A ``pattern`` is a ``glob`` matching the absolute path to a repository,\n"
+"optionally combined with a revset expression. A revset expression, if\n"
+"present, is separated from the glob by a hash. Example::"
+msgstr ""
+"Um ``padrão`` é um ``glob`` que combina com o caminho absoluto para\n"
+"um repositório, opcionalmente combinado com uma expressão revset.\n"
+"Uma expressão revset, se presente, é separada do glob por um\n"
+"caractere ``#``. Por exemplo::"
+
+msgid ""
+"  [reposubs]\n"
+"  */widgets#branch(release) = qa-team@example.com"
+msgstr ""
+"  [reposubs]\n"
+"  */widgets#branch(release) = qa-team@example.com"
+
+msgid ""
+"This sends to ``qa-team@example.com`` whenever a changeset on the ``release``\n"
+"branch triggers a notification in any repository ending in ``widgets``."
+msgstr ""
+"Isto envia para ``qa-team@example.com`` sempre que uma revisão no ramo\n"
+"``release`` dispara uma notificação em qualquer repositório terminado\n"
+"por ``widgets``."
 
 msgid ""
 "In order to place them under direct user management, ``[usersubs]`` and\n"
@@ -7608,11 +7658,11 @@
 msgstr "    Por fim, o próprio patch, como gerado por :hg:`export`."
 
 msgid ""
-"    With the -d/--diffstat or -c/--confirm options, you will be presented\n"
+"    With the -d/--diffstat or --confirm options, you will be presented\n"
 "    with a final summary of all messages and asked for confirmation before\n"
 "    the messages are sent."
 msgstr ""
-"    Com as opções -d/--diffstat ou -c/--confirm, será apresentado\n"
+"    Com as opções -d/--diffstat ou --confirm, será apresentado\n"
 "    um resumo final de todas as mensagens, e haverá um pedido de\n"
 "    confirmação antes do envio das mensagens."
 
@@ -8235,10 +8285,6 @@
 msgid "rebase merging completed\n"
 msgstr "mesclagem de rebaseamento completada\n"
 
-msgid "warning: new changesets detected on source branch, not stripping\n"
-msgstr ""
-"aviso: novas revisões detectadas no ramo de origem, strip não realizado\n"
-
 msgid "rebase completed\n"
 msgstr "rebaseamento completado\n"
 
@@ -8281,6 +8327,10 @@
 msgid "source is ancestor of destination"
 msgstr "origem é ancestral do destino"
 
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr ""
+"aviso: novas revisões detectadas no ramo de origem, strip não realizado\n"
+
 #, python-format
 msgid "updating bookmark %s\n"
 msgstr "atualizando marcador %s\n"
@@ -8391,12 +8441,12 @@
 msgstr " e "
 
 #, python-format
-msgid "record this change to %r?"
-msgstr "gravar esta mudança em %r?"
-
-#, python-format
-msgid "record change %d/%d to %r?"
-msgstr "gravar mudança %d/%d em %r?"
+msgid "record this change to '%s'?"
+msgstr "gravar esta mudança em '%s'?"
+
+#, python-format
+msgid "record change %d/%d to '%s'?"
+msgstr "gravar mudança %d/%d em '%s'?"
 
 msgid "hg record [OPTION]... [FILE]..."
 msgstr "hg record [OPÇÃO]... [ARQUIVO]..."
@@ -9257,10 +9307,6 @@
 msgstr "linha malformada em .hg/bookmarks: %r\n"
 
 #, python-format
-msgid "bookmark '%s' contains illegal character"
-msgstr "o marcador '%s' contém um caractere ilegal"
-
-#, python-format
 msgid "branch %s not found"
 msgstr "ramo %s não encontrado"
 
@@ -9305,6 +9351,9 @@
 msgid "%s: unknown bundle version %s"
 msgstr "%s: versão de bundle %s desconhecida"
 
+msgid "no node"
+msgstr "nenhum nó"
+
 msgid "empty username"
 msgstr "nome de usuário vazio"
 
@@ -9418,59 +9467,74 @@
 msgid "child process failed to start"
 msgstr "processo filho falhou ao iniciar"
 
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "changeset:   %d:%s\n"
 msgstr "revisão:     %d:%s\n"
 
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "branch:      %s\n"
 msgstr "ramo:        %s\n"
 
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "bookmark:    %s\n"
 msgstr "marcador:    %s\n"
 
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "tag:         %s\n"
 msgstr "etiqueta:    %s\n"
 
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "phase:       %s\n"
 msgstr "fase:        %s\n"
 
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "parent:      %d:%s\n"
 msgstr "pai:         %d:%s\n"
 
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "manifest:    %d:%s\n"
 msgstr "manifesto:   %d:%s\n"
 
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "user:        %s\n"
 msgstr "usuário:     %s\n"
 
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "date:        %s\n"
 msgstr "data:        %s\n"
 
+#. i18n: column positioning for "hg log"
+msgid "files:"
+msgstr "arquivos:"
+
+#. i18n: column positioning for "hg log"
 msgid "files+:"
 msgstr "arquivos+:"
 
+#. i18n: column positioning for "hg log"
 msgid "files-:"
 msgstr "arquivos-:"
 
-msgid "files:"
-msgstr "arquivos:"
-
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "files:       %s\n"
 msgstr "arquivos:    %s\n"
 
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "copies:      %s\n"
 msgstr "cópias:      %s\n"
 
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "extra:       %s=%s\n"
 msgstr "extra:       %s=%s\n"
@@ -9478,6 +9542,7 @@
 msgid "description:\n"
 msgstr "descrição:\n"
 
+#. i18n: column positioning for "hg log"
 #, python-format
 msgid "summary:     %s\n"
 msgstr "sumário:     %s\n"
@@ -10201,7 +10266,7 @@
 "          hg bisect --bad"
 
 msgid ""
-"      - mark the current revision, or a known revision, to be skipped (eg. if\n"
+"      - mark the current revision, or a known revision, to be skipped (e.g. if\n"
 "        that revision is not usable because of another issue)::"
 msgstr ""
 "      - marca a revisão atual, ou uma revisão conhecida, para que\n"
@@ -10412,6 +10477,25 @@
 "    marcador ativo atual se tornará inativo.\n"
 "    "
 
+msgid "bookmark names cannot consist entirely of whitespace"
+msgstr "nomes de marcadores não podem conter apenas espaços em branco"
+
+#, python-format
+msgid "bookmark '%s' already exists (use -f to force)"
+msgstr "o marcador '%s' já existe (use -f para forçar)"
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr "um marcador não pode ter o mesmo nome de um ramo existente"
+
+msgid "--delete and --rename are incompatible"
+msgstr "--delete e --rename são incompatíveis"
+
+msgid "--rev is incompatible with --delete"
+msgstr "--rev é incompatível com --delete"
+
+msgid "--rev is incompatible with --rename"
+msgstr "--rev é incompatível com --rename"
+
 msgid "bookmark name required"
 msgstr "requerido nome do marcador"
 
@@ -10419,25 +10503,15 @@
 msgid "bookmark '%s' does not exist"
 msgstr "o marcador '%s' não existe"
 
-#, python-format
-msgid "bookmark '%s' already exists (use -f to force)"
-msgstr "o marcador '%s' já existe (use -f para forçar)"
-
 msgid "new bookmark name required"
 msgstr "requerido nome do novo marcador"
 
-msgid "bookmark name cannot contain newlines"
-msgstr "o nome do marcador não pode conter novas linhas"
-
-msgid "bookmark names cannot consist entirely of whitespace"
-msgstr "nomes de marcadores não podem conter apenas espaços em branco"
-
-msgid "a bookmark cannot have the name of an existing branch"
-msgstr "um marcador não pode ter o mesmo nome de um ramo existente"
-
 msgid "no bookmarks set\n"
 msgstr "nenhum marcador definido\n"
 
+msgid "no active bookmark\n"
+msgstr "nenhum marcador ativo\n"
+
 msgid "set branch name even if it shadows an existing branch"
 msgstr "especifica nome do ramo mesmo se ocultar um ramo existente"
 
@@ -11213,7 +11287,7 @@
 
 msgid ""
 "    If you pass a revlog index, the revlog's DAG is emitted. If you list\n"
-"    revision numbers, they get labelled in the output as rN."
+"    revision numbers, they get labeled in the output as rN."
 msgstr ""
 "    Se você passar um índice de revlog, o DAG do revlog será emitido.\n"
 "    Se você listar números de revisão, eles serão rotulados na saída\n"
@@ -11400,6 +11474,9 @@
 "    desconhecidos e conhecidos.\n"
 "    "
 
+msgid "markers flag"
+msgstr "flag de marcação"
+
 msgid "[OBSOLETED [REPLACEMENT] [REPL... ]"
 msgstr "[OBSOLETA [SUBSTITUTA] [SUBSTITUTA... ]"
 
@@ -12157,12 +12234,14 @@
 "use \"hg help %s\" para mostrar o texto completo de ajuda\n"
 
 #, python-format
-msgid ""
-"\n"
-"use \"hg -v help %s\" to show more info\n"
-msgstr ""
-"\n"
-"use \"hg -v help %s\" para mostrar mais informações\n"
+msgid "use \"hg -v help %s\" to show more complete help and the global options"
+msgstr ""
+"use \"hg -v help %s\" para mostrar um texto de ajuda mais completo e opções "
+"globais"
+
+#, python-format
+msgid "use \"hg -v help %s\" to show the global options"
+msgstr "use \"hg -v help %s\" para mostrar opções globais"
 
 msgid "basic commands:"
 msgstr "comandos básicos:"
@@ -12200,6 +12279,10 @@
 "opções globais"
 
 #, python-format
+msgid "use \"hg help -v %s\" to show more complete help"
+msgstr "use \"hg help -v %s\" para mostrar um texto de ajuda mais completo"
+
+#, python-format
 msgid ""
 "\n"
 "use \"hg help -c %s\" to see help for the %s command\n"
@@ -13407,6 +13490,10 @@
 "    "
 
 #, python-format
+msgid "not removing %s: no tracked files\n"
+msgstr "%s não removido: nenhum arquivo rastreado\n"
+
+#, python-format
 msgid "not removing %s: file is untracked\n"
 msgstr "arquivo %s não removido: arquivo não rastreado\n"
 
@@ -14046,6 +14133,7 @@
 "    Com a opção --remote, isto verificará no caminho default mudanças ainda\n"
 "    não sincronizadas. Isto pode levar algum tempo."
 
+#. i18n: column positioning for "hg summary"
 #, python-format
 msgid "parent: %d:%s "
 msgstr "pai: %d:%s "
@@ -14056,10 +14144,12 @@
 msgid " (no revision checked out)"
 msgstr " (nenhuma revisão na cópia de trabalho)"
 
+#. i18n: column positioning for "hg summary"
 #, python-format
 msgid "branch: %s\n"
 msgstr "ramo: %s\n"
 
+#. i18n: column positioning for "hg summary"
 msgid "bookmarks:"
 msgstr "marcadores:"
 
@@ -14118,17 +14208,21 @@
 msgid " (new branch head)"
 msgstr " (nova cabeça de ramo)"
 
+#. i18n: column positioning for "hg summary"
 #, python-format
 msgid "commit: %s\n"
 msgstr "consolidação: %s\n"
 
+#. i18n: column positioning for "hg summary"
 msgid "update: (current)\n"
 msgstr "atualizações: (atual)\n"
 
+#. i18n: column positioning for "hg summary"
 #, python-format
 msgid "update: %d new changesets (update)\n"
 msgstr "atualizações: %d novas revisões (update)\n"
 
+#. i18n: column positioning for "hg summary"
 #, python-format
 msgid "update: %d new changesets, %d branch heads (merge)\n"
 msgstr "atualizações: %d novas revisões, %d cabeças de ramo (merge)\n"
@@ -14148,10 +14242,12 @@
 msgid "%d outgoing bookmarks"
 msgstr "%d marcadores a serem enviados"
 
+#. i18n: column positioning for "hg summary"
 #, python-format
 msgid "remote: %s\n"
 msgstr "remoto: %s\n"
 
+#. i18n: column positioning for "hg summary"
 msgid "remote: (synced)\n"
 msgstr "remoto: (sincronizado)\n"
 
@@ -14457,6 +14553,14 @@
 "    no changelog, manifesto, e arquivos rastreados, bem como a\n"
 "    integridade de seus índices e ligações cruzadas."
 
+msgid ""
+"    Please see http://mercurial.selenic.com/wiki/RepositoryCorruption\n"
+"    for more information about recovery from corruption of the\n"
+"    repository."
+msgstr ""
+"    Por favor veja http://mercurial.selenic.com/wiki/RepositoryCorruption\n"
+"    para mais informações sobre recuperação de repositórios corrompidos."
+
 msgid "output version and copyright information"
 msgstr "exibe versão e informação de copyright"
 
@@ -14862,6 +14966,10 @@
 msgstr "aviso: erro ao localizar comandos em %s\n"
 
 #, python-format
+msgid "invalid value %r for option %s, expected int"
+msgstr "valor %r inválido para a opção %s, int esperado"
+
+#, python-format
 msgid "couldn't find merge tool %s\n"
 msgstr "não foi possível encontrar ferramenta de mesclagem %s\n"
 
@@ -16648,9 +16756,9 @@
 "``post-<command>``\n"
 "  Run after successful invocations of the associated command. The\n"
 "  contents of the command line are passed as ``$HG_ARGS`` and the result\n"
-"  code in ``$HG_RESULT``. Parsed command line arguments are passed as \n"
+"  code in ``$HG_RESULT``. Parsed command line arguments are passed as\n"
 "  ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of\n"
-"  the python data internally passed to <command>. ``$HG_OPTS`` is a \n"
+"  the python data internally passed to <command>. ``$HG_OPTS`` is a\n"
 "  dictionary of options (with unspecified options set to their defaults).\n"
 "  ``$HG_PATS`` is a list of arguments. Hook failure is ignored."
 msgstr ""
@@ -16671,7 +16779,7 @@
 "  are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string\n"
 "  representations of the data internally passed to <command>. ``$HG_OPTS``\n"
 "  is a  dictionary of options (with unspecified options set to their\n"
-"  defaults). ``$HG_PATS`` is a list of arguments. If the hook returns \n"
+"  defaults). ``$HG_PATS`` is a list of arguments. If the hook returns\n"
 "  failure, the command doesn't execute and Mercurial returns the failure\n"
 "  code."
 msgstr ""
@@ -17372,9 +17480,33 @@
 "    não for especificado."
 
 msgid ""
+"Custom paths can be defined by assigning the path to a name that later can be\n"
+"used from the command line. Example::"
+msgstr ""
+"Um caminho personalizado podem ser definido atribuindo o caminho a\n"
+"um nome que mais tarde poderá ser usado na linha de comando. Exemplo::"
+
+msgid ""
+"    [paths]\n"
+"    my_path = http://example.com/path"
+msgstr ""
+"    [paths]\n"
+"    my_path = http://example.com/path"
+
+msgid "To push to the path defined in ``my_path`` run the command::"
+msgstr ""
+"Para enviar revisões para o caminho definido em ``my_path`` execute o "
+"comando::"
+
+msgid "    hg push my_path"
+msgstr "    hg push my_path"
+
+msgid ""
+"\n"
 "``phases``\n"
 "----------"
 msgstr ""
+"\n"
 "``phases``\n"
 "----------"
 
@@ -18526,7 +18658,7 @@
 
 msgid ""
 "``stripes``\n"
-"    How many lines a \"zebra stripe\" should span in multiline output.\n"
+"    How many lines a \"zebra stripe\" should span in multi-line output.\n"
 "    Default is 1; set to 0 to disable."
 msgstr ""
 "``stripes``\n"
@@ -20279,7 +20411,7 @@
 "  - paths\n"
 "  - collections"
 
-msgid "The ``web`` options are thorougly described in :hg:`help config`."
+msgid "The ``web`` options are thoroughly described in :hg:`help config`."
 msgstr "As opções ``web`` são descritas com detalhes em :hg:`help config`."
 
 msgid ""
@@ -21833,6 +21965,13 @@
 msgid "clone from remote to remote not supported"
 msgstr "clone de origem remota para destino remoto não suportado"
 
+msgid "updating to bookmark @\n"
+msgstr "atualizando para o marcador @\n"
+
+#, python-format
+msgid "updating to bookmark @ on branch %s\n"
+msgstr "atualizando para o marcador @ no ramo %s\n"
+
 #, python-format
 msgid "updating to branch %s\n"
 msgstr "atualizando para o ramo %s\n"
@@ -22027,10 +22166,6 @@
 msgstr "aviso: ignorando pai desconhecido do diretório de trabalho '%s'!\n"
 
 #, python-format
-msgid "%r cannot be used in a tag name"
-msgstr "%r não pode ser usado em um nome de etiqueta"
-
-#, python-format
 msgid "warning: tag %s conflicts with existing branch name\n"
 msgstr "aviso: a etiqueta %s conflita com um nome de ramo existente\n"
 
@@ -22159,14 +22294,18 @@
 msgstr "o destino não suporta push"
 
 #, python-format
-msgid "push includes an obsolete changeset: %s!"
+msgid "push includes obsolete changeset: %s!"
 msgstr "push inclui uma revisão obsoleta: %s!"
 
 #, python-format
-msgid "push includes an unstable changeset: %s!"
+msgid "push includes unstable changeset: %s!"
 msgstr "push inclui uma revisão instável: %s!"
 
 #, python-format
+msgid "push includes bumped changeset: %s!"
+msgstr "push inclui revisão colidida: %s!"
+
+#, python-format
 msgid "updating %s to public failed!\n"
 msgstr "a atualização da fase de %s para pública falhou!\n"
 
@@ -22455,6 +22594,10 @@
 "decodificando marcações de obsolescência: metadados são curtos demais, %d "
 "bytes esperados, %d obtidos"
 
+msgid "bad obsolescence marker detected: invalid successors nullid"
+msgstr ""
+"marcação de obsolescência inválida detectada: sucessores nullid inválidos"
+
 #, python-format
 msgid "unknown key: %r"
 msgstr "chave desconhecida: %r"
@@ -22639,9 +22782,6 @@
 msgid "index %s is corrupted"
 msgstr "índice %s corrompido"
 
-msgid "no node"
-msgstr "nenhum nó"
-
 msgid "ambiguous identifier"
 msgstr "identificador ambíguo"
 
@@ -22722,7 +22862,7 @@
 
 msgid ""
 "    - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip\n"
-"    - ``goods``, ``bads``      : csets topologicaly good/bad\n"
+"    - ``goods``, ``bads``      : csets topologically good/bad\n"
 "    - ``range``              : csets taking part in the bisection\n"
 "    - ``pruned``             : csets that are goods, bads or skipped\n"
 "    - ``untested``           : csets whose fate is yet unknown\n"
@@ -22788,6 +22928,21 @@
 "    com `re:` literalmente, use o prefixo `literal:`."
 
 msgid ""
+"``bumped()``\n"
+"    Mutable changesets marked as successors of public changesets."
+msgstr ""
+"``bumped()``\n"
+"    Revisões colididas: revisões mutáveis marcadas como sucessoras de\n"
+"    revisões públicas."
+
+msgid "    Only non-public and non-obsolete changesets can be `bumped`."
+msgstr "    Apenas revisões não-públicas e não-obsoletas podem ser `bumped`."
+
+#. i18n: "bumped" is a keyword
+msgid "bumped takes no arguments"
+msgstr "bumped não tem argumentos"
+
+msgid ""
 "``children(set)``\n"
 "    Child changesets of changesets in set."
 msgstr ""
@@ -23062,6 +23217,17 @@
 "    Membros do conjunto que não tenham filhos no conjunto."
 
 msgid ""
+"``hidden()``\n"
+"    Hidden changesets."
+msgstr ""
+"``hidden()``\n"
+"    Revisões ocultas."
+
+#. i18n: "hidden" is a keyword
+msgid "hidden takes no arguments"
+msgstr "hidden não tem argumentos"
+
+msgid ""
 "``keyword(string)``\n"
 "    Search commit message, user name, and names of changed files for\n"
 "    string. The match is case-insensitive."
@@ -23132,6 +23298,17 @@
 msgstr "merge não tem argumentos"
 
 msgid ""
+"``branchpoint()``\n"
+"    Changesets with more than one child."
+msgstr ""
+"``branchpoint()``\n"
+"    Revisões com mais de uma revisão filha."
+
+#. i18n: "branchpoint" is a keyword
+msgid "branchpoint takes no arguments"
+msgstr "branchpoint não tem argumentos"
+
+msgid ""
 "``min(set)``\n"
 "    Changeset with lowest revision number in set."
 msgstr ""
@@ -23522,6 +23699,10 @@
 msgstr "nenhuma mudança encontrada (%d revisões secretas ignoradas)\n"
 
 #, python-format
+msgid "%r cannot be used in a name"
+msgstr "\"%s\" não pode ser usado em um nome"
+
+#, python-format
 msgid "ui.portablefilenames value is invalid ('%s')"
 msgstr "o valor de ui.portablefilenames é inválido ('%s')"
 
@@ -23936,10 +24117,11 @@
 
 msgid ""
 ":escape: Any text. Replaces the special XML/XHTML characters \"&\", \"<\"\n"
-"    and \">\" with XML entities."
+"    and \">\" with XML entities, and filters out NUL characters."
 msgstr ""
 ":escape: Qualquer texto. Substitui os caracteres especiais\n"
-"    XML/XHTML \"&\", \"<\" e \">\" por entidades XML."
+"    XML/XHTML \"&\", \"<\" e \">\" por entidades XML, e remove\n"
+"    caracteres NUL."
 
 msgid ":fill68: Any text. Wraps the text to fit in 68 columns."
 msgstr ""
@@ -24120,6 +24302,15 @@
 ":emailuser: Qualquer texto. Devolve a parte do usuário de um endereço de "
 "e-mail."
 
+msgid "fill expects one or two arguments"
+msgstr "fill exige um ou dois argumentos"
+
+msgid "fill expects an integer width"
+msgstr "fill espera um número inteiro"
+
+msgid "date expects one or two arguments"
+msgstr "data exige um ou dois argumentos"
+
 msgid ":author: String. The unmodified author of the changeset."
 msgstr ":author: String. O autor da revisão, sem modificações."
 
@@ -24208,6 +24399,38 @@
 ":node: String. O hash de identificação da revisão, como uma string\n"
 "    hexadecimal de 40 dígitos."
 
+msgid ""
+":p1rev: Integer. The repository-local revision number of the changeset's\n"
+"    first parent, or -1 if the changeset has no parents."
+msgstr ""
+":p1rev: Inteiro. O número de revisão local do primeiro pai da revisão,     "
+"ou -1 se a revisão não tiver pais."
+
+msgid ""
+":p2rev: Integer. The repository-local revision number of the changeset's\n"
+"    second parent, or -1 if the changeset has no second parent."
+msgstr ""
+":p2rev: Inteiro. O número de revisão local do segundo pai da revisão,     ou"
+" -1 se a revisão não tiver um segundo pai."
+
+msgid ""
+":p1node: String. The identification hash of the changeset's first parent,\n"
+"    as a 40 digit hexadecimal string. If the changeset has no parents, all\n"
+"    digits are 0."
+msgstr ""
+":p1node: Texto. O hash de identificação do primeiro pai da revisão, na\n"
+"    forma de um hexadecimal de 40 dígitos.\n"
+"    Se a revisão não tiver pais, todos os dígitos serão 0."
+
+msgid ""
+":p2node: String. The identification hash of the changeset's second\n"
+"    parent, as a 40 digit hexadecimal string. If the changeset has no second\n"
+"    parent, all digits are 0."
+msgstr ""
+":p1node: Texto. O hash de identificação do segundo pai da revisão, na\n"
+"    forma de um hexadecimal de 40 dígitos.\n"
+"    Se a revisão não tiver o segundo pai, todos os dígitos serão 0."
+
 msgid ":phase: String. The changeset phase name."
 msgstr ":phase: String. O nome da fase da revisão."
 
@@ -24244,9 +24467,29 @@
 msgstr "esperado um especificador de modelo"
 
 #, python-format
+msgid "template filter '%s' is not compatible with keyword '%s'"
+msgstr "o filtro de modelo '%s' não é compatível com a palavra chave '%s'"
+
+#, python-format
 msgid "filter %s expects one argument"
 msgstr "o filtro %s espera um argumento"
 
+#. i18n: "join" is a keyword
+msgid "join expects one or two arguments"
+msgstr "join exige um ou dois argumentos"
+
+#. i18n: "sub" is a keyword
+msgid "sub expects three arguments"
+msgstr "sub espera três argumentos"
+
+#. i18n: "if" is a keyword
+msgid "if expects two or three arguments"
+msgstr "if espera dois ou três argumentos"
+
+#. i18n: "ifeq" is a keyword
+msgid "ifeq expects three or four arguments"
+msgstr "ifeq espera três ou quatro argumentos"
+
 msgid "unmatched quotes"
 msgstr "aspas não combinam"
 
--- a/mercurial/bookmarks.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/mercurial/bookmarks.py	Thu Nov 01 16:30:48 2012 -0500
@@ -256,7 +256,7 @@
     elif repo.obsstore:
         # We only need this complicated logic if there is obsolescence
         # XXX will probably deserve an optimised revset.
-
+        nm = repo.changelog.nodemap
         validdests = set([old])
         plen = -1
         # compute the whole set of successors or descendants
@@ -268,7 +268,8 @@
                     # obsolescence marker does not apply to public changeset
                     succs.update(obsolete.allsuccessors(repo.obsstore,
                                                         [c.node()]))
-            validdests = set(repo.set('%ln::', succs))
+            known = (n for n in succs if n in nm)
+            validdests = set(repo.set('%ln::', known))
         validdests.remove(old)
         return new in validdests
     else:
--- a/mercurial/cmdutil.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/mercurial/cmdutil.py	Thu Nov 01 16:30:48 2012 -0500
@@ -687,55 +687,71 @@
         parents = [(p, hexfunc(log.node(p)))
                    for p in self._meaningful_parentrevs(log, rev)]
 
+        # i18n: column positioning for "hg log"
         self.ui.write(_("changeset:   %d:%s\n") % (rev, hexfunc(changenode)),
                       label='log.changeset changeset.%s' % ctx.phasestr())
 
         branch = ctx.branch()
         # don't show the default branch name
         if branch != 'default':
+            # i18n: column positioning for "hg log"
             self.ui.write(_("branch:      %s\n") % branch,
                           label='log.branch')
         for bookmark in self.repo.nodebookmarks(changenode):
+            # i18n: column positioning for "hg log"
             self.ui.write(_("bookmark:    %s\n") % bookmark,
                     label='log.bookmark')
         for tag in self.repo.nodetags(changenode):
+            # i18n: column positioning for "hg log"
             self.ui.write(_("tag:         %s\n") % tag,
                           label='log.tag')
         if self.ui.debugflag and ctx.phase():
+            # i18n: column positioning for "hg log"
             self.ui.write(_("phase:       %s\n") % _(ctx.phasestr()),
                           label='log.phase')
         for parent in parents:
+            # i18n: column positioning for "hg log"
             self.ui.write(_("parent:      %d:%s\n") % parent,
                           label='log.parent changeset.%s' % ctx.phasestr())
 
         if self.ui.debugflag:
             mnode = ctx.manifestnode()
+            # i18n: column positioning for "hg log"
             self.ui.write(_("manifest:    %d:%s\n") %
                           (self.repo.manifest.rev(mnode), hex(mnode)),
                           label='ui.debug log.manifest')
+        # i18n: column positioning for "hg log"
         self.ui.write(_("user:        %s\n") % ctx.user(),
                       label='log.user')
+        # i18n: column positioning for "hg log"
         self.ui.write(_("date:        %s\n") % date,
                       label='log.date')
 
         if self.ui.debugflag:
             files = self.repo.status(log.parents(changenode)[0], changenode)[:3]
-            for key, value in zip([_("files:"), _("files+:"), _("files-:")],
-                                  files):
+            for key, value in zip([# i18n: column positioning for "hg log"
+                                   _("files:"),
+                                   # i18n: column positioning for "hg log"
+                                   _("files+:"),
+                                   # i18n: column positioning for "hg log"
+                                   _("files-:")], files):
                 if value:
                     self.ui.write("%-12s %s\n" % (key, " ".join(value)),
                                   label='ui.debug log.files')
         elif ctx.files() and self.ui.verbose:
+            # i18n: column positioning for "hg log"
             self.ui.write(_("files:       %s\n") % " ".join(ctx.files()),
                           label='ui.note log.files')
         if copies and self.ui.verbose:
             copies = ['%s (%s)' % c for c in copies]
+            # i18n: column positioning for "hg log"
             self.ui.write(_("copies:      %s\n") % ' '.join(copies),
                           label='ui.note log.copies')
 
         extra = ctx.extra()
         if extra and self.ui.debugflag:
             for key, value in sorted(extra.items()):
+                # i18n: column positioning for "hg log"
                 self.ui.write(_("extra:       %s=%s\n")
                               % (key, value.encode('string_escape')),
                               label='ui.debug log.extra')
@@ -749,6 +765,7 @@
                               label='ui.note log.description')
                 self.ui.write("\n\n")
             else:
+                # i18n: column positioning for "hg log"
                 self.ui.write(_("summary:     %s\n") %
                               description.splitlines()[0],
                               label='log.summary')
@@ -1611,6 +1628,10 @@
             # See if we got a message from -m or -l, if not, open the editor
             # with the message of the changeset to amend
             message = logmessage(ui, opts)
+            # ensure logfile does not conflict with later enforcement of the
+            # message. potential logfile content has been processed by
+            # `logmessage` anyway.
+            opts.pop('logfile')
             # First, do a regular commit to record all changes in the working
             # directory (if there are any)
             ui.callhooks = False
--- a/mercurial/commands.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/mercurial/commands.py	Thu Nov 01 16:30:48 2012 -0500
@@ -10,7 +10,7 @@
 from i18n import _, gettext
 import os, re, difflib, time, tempfile, errno
 import hg, scmutil, util, revlog, extensions, copies, error, bookmarks
-import patch, help, url, encoding, templatekw, discovery
+import patch, help, encoding, templatekw, discovery
 import archival, changegroup, cmdutil, hbisect
 import sshserver, hgweb, hgweb.server, commandserver
 import merge as mergemod
@@ -1590,7 +1590,7 @@
 @command('debugbundle', [('a', 'all', None, _('show all details'))], _('FILE'))
 def debugbundle(ui, bundlepath, all=None, **opts):
     """lists the contents of a bundle"""
-    f = url.open(ui, bundlepath)
+    f = hg.openpath(ui, bundlepath)
     try:
         gen = changegroup.readbundle(f, bundlepath)
         if all:
@@ -3538,7 +3538,7 @@
 
     if source:
         source, branches = hg.parseurl(ui.expandpath(source))
-        peer = hg.peer(ui, opts, source)
+        peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo
         repo = peer.local()
         revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
 
@@ -3856,7 +3856,7 @@
                 else:
                     patchurl = os.path.join(base, patchurl)
                     ui.status(_('applying %s\n') % patchurl)
-                    patchfile = url.open(ui, patchurl)
+                    patchfile = hg.openpath(ui, patchurl)
 
                 haspatch = False
                 for hunk in patch.split(patchfile):
@@ -5464,6 +5464,7 @@
     for p in parents:
         # label with log.changeset (instead of log.parent) since this
         # shows a working directory parent *changeset*:
+        # i18n: column positioning for "hg summary"
         ui.write(_('parent: %d:%s ') % (p.rev(), str(p)),
                  label='log.changeset changeset.%s' % p.phasestr())
         ui.write(' '.join(p.tags()), label='log.tag')
@@ -5481,6 +5482,7 @@
 
     branch = ctx.branch()
     bheads = repo.branchheads(branch)
+    # i18n: column positioning for "hg summary"
     m = _('branch: %s\n') % branch
     if branch != 'default':
         ui.write(m, label='log.branch')
@@ -5489,6 +5491,7 @@
 
     if marks:
         current = repo._bookmarkcurrent
+        # i18n: column positioning for "hg summary"
         ui.write(_('bookmarks:'), label='log.bookmark')
         if current is not None:
             try:
@@ -5554,8 +5557,10 @@
         t += _(' (new branch head)')
 
     if cleanworkdir:
+        # i18n: column positioning for "hg summary"
         ui.status(_('commit: %s\n') % t.strip())
     else:
+        # i18n: column positioning for "hg summary"
         ui.write(_('commit: %s\n') % t.strip())
 
     # all ancestors of branch heads - all ancestors of parent = new csets
@@ -5573,10 +5578,13 @@
     new = sum(new)
 
     if new == 0:
+        # i18n: column positioning for "hg summary"
         ui.status(_('update: (current)\n'))
     elif pnode not in bheads:
+        # i18n: column positioning for "hg summary"
         ui.write(_('update: %d new changesets (update)\n') % new)
     else:
+        # i18n: column positioning for "hg summary"
         ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
                  (new, len(bheads)))
 
@@ -5618,8 +5626,10 @@
                 t.append(_('%d outgoing bookmarks') % len(diff))
 
         if t:
+            # i18n: column positioning for "hg summary"
             ui.write(_('remote: %s\n') % (', '.join(t)))
         else:
+            # i18n: column positioning for "hg summary"
             ui.status(_('remote: (synced)\n'))
 
 @command('tag',
@@ -5804,7 +5814,7 @@
     wc = repo['.']
     try:
         for fname in fnames:
-            f = url.open(ui, fname)
+            f = hg.openpath(ui, fname)
             gen = changegroup.readbundle(f, fname)
             modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname)
     finally:
--- a/mercurial/dirstate.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/mercurial/dirstate.py	Thu Nov 01 16:30:48 2012 -0500
@@ -673,7 +673,7 @@
             try:
                 entries = listdir(join(nd), stat=True, skip=skip)
             except OSError, inst:
-                if inst.errno == errno.EACCES:
+                if inst.errno in (errno.EACCES, errno.ENOENT):
                     fwarn(nd, inst.strerror)
                     continue
                 raise
--- a/mercurial/filemerge.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/mercurial/filemerge.py	Thu Nov 01 16:30:48 2012 -0500
@@ -72,7 +72,7 @@
     if force:
         toolpath = _findtool(ui, force)
         if toolpath:
-            return (force, '"' + toolpath + '"')
+            return (force, util.shellquote(toolpath))
         else:
             # mimic HGMERGE if given tool not found
             return (force, force)
@@ -87,7 +87,7 @@
         mf = match.match(repo.root, '', [pat])
         if mf(path) and check(tool, pat, symlink, False):
             toolpath = _findtool(ui, tool)
-            return (tool, '"' + toolpath + '"')
+            return (tool, util.shellquote(toolpath))
 
     # then merge tools
     tools = {}
@@ -106,7 +106,7 @@
     for p, t in tools:
         if check(t, None, symlink, binary):
             toolpath = _findtool(ui, t)
-            return (t, '"' + toolpath + '"')
+            return (t, util.shellquote(toolpath))
 
     # internal merge or prompt as last resort
     if symlink or binary:
@@ -255,7 +255,7 @@
             out, a = a, back # read input from backup, write to original
         replace = dict(local=a, base=b, other=c, output=out)
         args = util.interpolate(r'\$', replace, args,
-                                lambda s: '"%s"' % util.localpath(s))
+                                lambda s: util.shellquote(util.localpath(s)))
         r = util.system(toolpath + ' ' + args, cwd=repo.root, environ=env,
                         out=ui.fout)
         return True, r
--- a/mercurial/hg.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/mercurial/hg.py	Thu Nov 01 16:30:48 2012 -0500
@@ -10,7 +10,7 @@
 from lock import release
 from node import hex, nullid
 import localrepo, bundlerepo, httppeer, sshpeer, statichttprepo, bookmarks
-import lock, util, extensions, error, node, scmutil, phases
+import lock, util, extensions, error, node, scmutil, phases, url
 import cmdutil, discovery
 import merge as mergemod
 import verify as verifymod
@@ -89,6 +89,13 @@
             return False
     return repo.local()
 
+def openpath(ui, path):
+    '''open path with open if local, url.open if remote'''
+    if islocal(path):
+        return util.posixfile(util.urllocalpath(path), 'rb')
+    else:
+        return url.open(ui, path)
+
 def _peerorrepo(ui, path, create=False):
     """return a repository object for the specified path"""
     obj = _peerlookup(path).instance(ui, path, create)
@@ -348,12 +355,13 @@
 
             # we need to re-init the repo after manually copying the data
             # into it
-            destpeer = peer(ui, peeropts, dest)
+            destpeer = peer(srcrepo, peeropts, dest)
             srcrepo.hook('outgoing', source='clone',
                           node=node.hex(node.nullid))
         else:
             try:
-                destpeer = peer(ui, peeropts, dest, create=True)
+                destpeer = peer(srcrepo or ui, peeropts, dest, create=True)
+                                # only pass ui when no srcrepo
             except OSError, inst:
                 if inst.errno == errno.EEXIST:
                     dircleanup.close()
@@ -409,16 +417,32 @@
             if update:
                 if update is not True:
                     checkout = srcpeer.lookup(update)
-                for test in (checkout, '@', 'default', 'tip'):
-                    if test is None:
-                        continue
+                uprev = None
+                status = None
+                if checkout is not None:
+                    try:
+                        uprev = destrepo.lookup(checkout)
+                    except error.RepoLookupError:
+                        pass
+                if uprev is None:
                     try:
-                        uprev = destrepo.lookup(test)
-                        break
-                    except error.RepoLookupError:
-                        continue
-                bn = destrepo[uprev].branch()
-                destrepo.ui.status(_("updating to branch %s\n") % bn)
+                        uprev = destrepo._bookmarks['@']
+                        update = '@'
+                        bn = destrepo[uprev].branch()
+                        if bn == 'default':
+                            status = _("updating to bookmark @\n")
+                        else:
+                            status = _("updating to bookmark @ on branch %s\n"
+                                       % bn)
+                    except KeyError:
+                        try:
+                            uprev = destrepo.branchtip('default')
+                        except error.RepoLookupError:
+                            uprev = destrepo.lookup('tip')
+                if not status:
+                    bn = destrepo[uprev].branch()
+                    status = _("updating to branch %s\n") % bn
+                destrepo.ui.status(status)
                 _update(destrepo, uprev)
                 if update in destrepo._bookmarks:
                     bookmarks.setcurrent(destrepo, update)
@@ -435,9 +459,17 @@
     repo.ui.status(_("%d files updated, %d files merged, "
                      "%d files removed, %d files unresolved\n") % stats)
 
+def updaterepo(repo, node, overwrite):
+    """Update the working directory to node.
+
+    When overwrite is set, changes are clobbered, merged else
+
+    returns stats (see pydoc mercurial.merge.applyupdates)"""
+    return mergemod.update(repo, node, False, overwrite, None)
+
 def update(repo, node):
     """update the working directory to node, merging linear changes"""
-    stats = mergemod.update(repo, node, False, False, None)
+    stats = updaterepo(repo, node, False)
     _showstats(repo, stats)
     if stats[3]:
         repo.ui.status(_("use 'hg resolve' to retry unresolved file merges\n"))
@@ -448,7 +480,7 @@
 
 def clean(repo, node, show_stats=True):
     """forcibly switch the working directory to node, clobbering changes"""
-    stats = mergemod.update(repo, node, False, True, None)
+    stats = updaterepo(repo, node, True)
     if show_stats:
         _showstats(repo, stats)
     return stats[3] > 0
--- a/mercurial/localrepo.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/mercurial/localrepo.py	Thu Nov 01 16:30:48 2012 -0500
@@ -1797,7 +1797,7 @@
                 phases.advanceboundary(self, phases.public, subset)
 
             if obsolete._enabled:
-                self.ui.debug('fetching remote obsolete markers')
+                self.ui.debug('fetching remote obsolete markers\n')
                 remoteobs = remote.listkeys('obsolete')
                 if 'dump0' in remoteobs:
                     if tr is None:
--- a/mercurial/merge.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/mercurial/merge.py	Thu Nov 01 16:30:48 2012 -0500
@@ -99,7 +99,26 @@
         raise util.Abort(_("untracked files in working directory differ "
                            "from files in requested revision"))
 
-def _checkcollision(mctx, wctx):
+def _remains(f, m, ma, workingctx=False):
+    """check whether specified file remains after merge.
+
+    It is assumed that specified file is not contained in the manifest
+    of the other context.
+    """
+    if f in ma:
+        n = m[f]
+        if n != ma[f]:
+            return True # because it is changed locally
+            # even though it doesn't remain, if "remote deleted" is
+            # chosen in manifestmerge()
+        elif workingctx and n[20:] == "a":
+            return True # because it is added locally (linear merge specific)
+        else:
+            return False # because it is removed remotely
+    else:
+        return True # because it is added locally
+
+def _checkcollision(mctx, extractxs):
     "check for case folding collisions in the destination context"
     folded = {}
     for fn in mctx:
@@ -109,7 +128,8 @@
                              % (fn, folded[fold]))
         folded[fold] = fn
 
-    if wctx:
+    if extractxs:
+        wctx, actx = extractxs
         # class to delay looking up copy mapping
         class pathcopies(object):
             @util.propertycache
@@ -121,7 +141,9 @@
         for fn in wctx:
             fold = util.normcase(fn)
             mfn = folded.get(fold, None)
-            if mfn and mfn != fn and pc.map.get(mfn) != fn:
+            if (mfn and mfn != fn and pc.map.get(mfn) != fn and
+                _remains(fn, wctx.manifest(), actx.manifest(), True) and
+                _remains(mfn, mctx.manifest(), actx.manifest())):
                 raise util.Abort(_("case-folding collision between %s and %s")
                                  % (mfn, fn))
 
@@ -595,7 +617,7 @@
                 (force or not wc.dirty(missing=True, branch=False))):
                 _checkcollision(p2, None)
             else:
-                _checkcollision(p2, wc)
+                _checkcollision(p2, (wc, pa))
         if not force:
             _checkunknown(repo, wc, p2)
         action += _forgetremoved(wc, p2, branchmerge)
--- a/mercurial/revset.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/mercurial/revset.py	Thu Nov 01 16:30:48 2012 -0500
@@ -105,6 +105,15 @@
 keywords = set(['and', 'or', 'not'])
 
 def tokenize(program):
+    '''
+    Parse a revset statement into a stream of tokens
+
+    Check that @ is a valid unquoted token character (issue3686):
+    >>> list(tokenize("@::"))
+    [('symbol', '@', 0), ('::', None, 1), ('end', None, 3)]
+
+    '''
+
     pos, l = 0, len(program)
     while pos < l:
         c = program[pos]
@@ -140,12 +149,12 @@
             else:
                 raise error.ParseError(_("unterminated string"), s)
         # gather up a symbol/keyword
-        elif c.isalnum() or c in '._' or ord(c) > 127:
+        elif c.isalnum() or c in '._@' or ord(c) > 127:
             s = pos
             pos += 1
             while pos < l: # find end of symbol
                 d = program[pos]
-                if not (d.isalnum() or d in "._/" or ord(d) > 127):
+                if not (d.isalnum() or d in "._/@" or ord(d) > 127):
                     break
                 if d == '.' and program[pos - 1] == '.': # special case for ..
                     pos -= 1
--- a/mercurial/subrepo.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/mercurial/subrepo.py	Thu Nov 01 16:30:48 2012 -0500
@@ -395,7 +395,11 @@
         if not os.path.exists(os.path.join(root, '.hg')):
             create = True
             util.makedirs(root)
-        self._repo = hg.repository(r.ui, root, create=create)
+        self._repo = hg.repository(r.baseui, root, create=create)
+        for s, k in [('ui', 'commitsubrepos')]:
+            v = r.ui.config(s, k)
+            if v:
+                self._repo.ui.setconfig(s, k, v)
         self._initrepo(r, state[0], create)
 
     def _initrepo(self, parentrepo, source, create):
@@ -497,13 +501,13 @@
         if revision not in self._repo:
             self._repo._subsource = source
             srcurl = _abssource(self._repo)
-            other = hg.peer(self._repo.ui, {}, srcurl)
+            other = hg.peer(self._repo, {}, srcurl)
             if len(self._repo) == 0:
                 self._repo.ui.status(_('cloning subrepo %s from %s\n')
                                      % (subrelpath(self), srcurl))
                 parentrepo = self._repo._subparent
                 shutil.rmtree(self._repo.path)
-                other, cloned = hg.clone(self._repo._subparent.ui, {},
+                other, cloned = hg.clone(self._repo._subparent.baseui, {},
                                          other, self._repo.root,
                                          update=False)
                 self._repo = cloned.local()
@@ -519,7 +523,7 @@
         self._get(state)
         source, revision, kind = state
         self._repo.ui.debug("getting subrepo %s\n" % self._path)
-        hg.clean(self._repo, revision, False)
+        hg.updaterepo(self._repo, revision, overwrite)
 
     def merge(self, state):
         self._get(state)
@@ -562,7 +566,7 @@
         dsturl = _abssource(self._repo, True)
         self._repo.ui.status(_('pushing subrepo %s to %s\n') %
             (subrelpath(self), dsturl))
-        other = hg.peer(self._repo.ui, {'ssh': ssh}, dsturl)
+        other = hg.peer(self._repo, {'ssh': ssh}, dsturl)
         return self._repo.push(other, force, newbranch=newbranch)
 
     def outgoing(self, ui, dest, opts):
--- a/mercurial/templater.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/mercurial/templater.py	Thu Nov 01 16:30:48 2012 -0500
@@ -203,6 +203,7 @@
 
 def join(context, mapping, args):
     if not (1 <= len(args) <= 2):
+        # i18n: "join" is a keyword
         raise error.ParseError(_("join expects one or two arguments"))
 
     joinset = args[0][0](context, mapping, args[0][1])
@@ -223,6 +224,7 @@
 
 def sub(context, mapping, args):
     if len(args) != 3:
+        # i18n: "sub" is a keyword
         raise error.ParseError(_("sub expects three arguments"))
 
     pat = stringify(args[0][0](context, mapping, args[0][1]))
@@ -232,6 +234,7 @@
 
 def if_(context, mapping, args):
     if not (2 <= len(args) <= 3):
+        # i18n: "if" is a keyword
         raise error.ParseError(_("if expects two or three arguments"))
 
     test = stringify(args[0][0](context, mapping, args[0][1]))
@@ -244,6 +247,7 @@
 
 def ifeq(context, mapping, args):
     if not (3 <= len(args) <= 4):
+        # i18n: "ifeq" is a keyword
         raise error.ParseError(_("ifeq expects three or four arguments"))
 
     test = stringify(args[0][0](context, mapping, args[0][1]))
--- a/mercurial/verify.py	Tue Oct 23 09:28:42 2012 +0200
+++ b/mercurial/verify.py	Thu Nov 01 16:30:48 2012 -0500
@@ -7,7 +7,7 @@
 
 from node import nullid, short
 from i18n import _
-import os, posixpath
+import os
 import revlog, util, error
 
 def verify(repo):
@@ -17,6 +17,13 @@
     finally:
         lock.release()
 
+def _normpath(f):
+    # under hg < 2.4, convert didn't sanitize paths properly, so a
+    # converted repo may contain repeated slashes
+    while '//' in f:
+        f = f.replace('//', '/')
+    return f
+
 def _verify(repo):
     mflinkrevs = {}
     filelinkrevs = {}
@@ -135,7 +142,7 @@
                 mflinkrevs.setdefault(changes[0], []).append(i)
                 refersmf = True
             for f in changes[3]:
-                filelinkrevs.setdefault(f, []).append(i)
+                filelinkrevs.setdefault(_normpath(f), []).append(i)
         except Exception, inst:
             refersmf = True
             exc(i, _("unpacking changeset %s") % short(n), inst)
@@ -162,7 +169,7 @@
                 if not f:
                     err(lr, _("file without name in manifest"))
                 elif f != "/dev/null":
-                    filenodes.setdefault(f, {}).setdefault(fn, lr)
+                    filenodes.setdefault(_normpath(f), {}).setdefault(fn, lr)
         except Exception, inst:
             exc(lr, _("reading manifest delta %s") % short(n), inst)
     ui.progress(_('checking'), None)
@@ -209,7 +216,7 @@
         if not f:
             err(None, _("cannot decode filename '%s'") % f2)
         elif size > 0 or not revlogv1:
-            storefiles.add(f)
+            storefiles.add(_normpath(f))
 
     files = sorted(set(filenodes) | set(filelinkrevs))
     total = len(files)
@@ -236,12 +243,7 @@
             try:
                 storefiles.remove(ff)
             except KeyError:
-                # under hg < 2.4, convert didn't sanitize paths properly,
-                # so a converted repo may contain repeated slashes
-                try:
-                    storefiles.remove(posixpath.normpath(ff))
-                except KeyError:
-                    err(lr, _("missing revlog!"), ff)
+                err(lr, _("missing revlog!"), ff)
 
         checklog(fl, f, lr)
         seen = {}
--- a/tests/test-bookmarks-pushpull.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-bookmarks-pushpull.t	Thu Nov 01 16:30:48 2012 -0500
@@ -1,6 +1,8 @@
   $ "$TESTDIR/hghave" serve || exit 80
 
   $ cat << EOF >> $HGRCPATH
+  > [ui]
+  > logtemplate={rev}:{node|short} {desc|firstline}
   > [phases]
   > publish=False
   > [extensions]
@@ -197,6 +199,22 @@
   $ hg ci -Am4
   adding f2
   created new head
+  $ echo c5 > f2
+  $ hg ci -Am5
+  $ hg log -G
+  @  5:c922c0139ca0 5
+  |
+  o  4:4efff6d98829 4
+  |
+  | o  3:f6fc62dde3c0 3
+  |/
+  | o  2:0d2164f0ce0d 1
+  |/
+  | o  1:9b140be10808 2
+  |/
+  o  0:4e3505fd9583 test
+  
+
   $ hg book -f Y
 
   $ cat <<EOF > ../a/.hg/hgrc
@@ -211,7 +229,7 @@
   $ hg push http://localhost:$HGPORT2/
   pushing to http://localhost:$HGPORT2/
   searching for changes
-  abort: push creates new remote head 4efff6d98829!
+  abort: push creates new remote head c922c0139ca0!
   (did you forget to merge? use push -f to force)
   [255]
   $ hg -R ../a book
@@ -227,7 +245,7 @@
   $ hg push http://localhost:$HGPORT2/
   pushing to http://localhost:$HGPORT2/
   searching for changes
-  abort: push creates new remote head 4efff6d98829!
+  abort: push creates new remote head c922c0139ca0!
   (did you forget to merge? use push -f to force)
   [255]
   $ hg -R ../a book
@@ -241,20 +259,23 @@
   $ hg id --debug -r 3
   f6fc62dde3c0771e29704af56ba4d8af77abcc2f
   $ hg id --debug -r 4
-  4efff6d98829d9c824c621afd6e3f01865f5439f tip Y
-  $ hg debugobsolete f6fc62dde3c0771e29704af56ba4d8af77abcc2f 4efff6d98829d9c824c621afd6e3f01865f5439f
+  4efff6d98829d9c824c621afd6e3f01865f5439f
+  $ hg id --debug -r 5
+  c922c0139ca03858f655e4a2af4dd02796a63969 tip Y
+  $ hg debugobsolete f6fc62dde3c0771e29704af56ba4d8af77abcc2f cccccccccccccccccccccccccccccccccccccccc
+  $ hg debugobsolete cccccccccccccccccccccccccccccccccccccccc 4efff6d98829d9c824c621afd6e3f01865f5439f
   $ hg push http://localhost:$HGPORT2/
   pushing to http://localhost:$HGPORT2/
   searching for changes
   remote: adding changesets
   remote: adding manifests
   remote: adding file changes
-  remote: added 1 changesets with 1 changes to 1 files (+1 heads)
+  remote: added 2 changesets with 2 changes to 1 files (+1 heads)
   updating bookmark Y
   $ hg -R ../a book
      @                         1:0d2164f0ce0d
    * X                         1:0d2164f0ce0d
-     Y                         4:4efff6d98829
+     Y                         5:c922c0139ca0
      Z                         1:0d2164f0ce0d
 
 hgweb
@@ -278,7 +299,7 @@
   @	9b140be1080824d768c5a4691a564088eede71f9
   foo	0000000000000000000000000000000000000000
   foobar	9b140be1080824d768c5a4691a564088eede71f9
-  Y	4efff6d98829d9c824c621afd6e3f01865f5439f
+  Y	c922c0139ca03858f655e4a2af4dd02796a63969
   X	9b140be1080824d768c5a4691a564088eede71f9
   Z	0d2164f0ce0d8f1d6f94351eba04b794909be66c
   $ hg out -B http://localhost:$HGPORT/
@@ -313,13 +334,13 @@
   adding changesets
   adding manifests
   adding file changes
-  added 4 changesets with 4 changes to 3 files (+2 heads)
-  updating to branch default
+  added 5 changesets with 5 changes to 3 files (+2 heads)
+  updating to bookmark @
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg -R cloned-bookmarks bookmarks
-     @                         1:9b140be10808
+   * @                         1:9b140be10808
      X                         1:9b140be10808
-     Y                         3:4efff6d98829
+     Y                         4:c922c0139ca0
      Z                         2:0d2164f0ce0d
      foo                       -1:000000000000
      foobar                    1:9b140be10808
@@ -333,8 +354,8 @@
   adding changesets
   adding manifests
   adding file changes
-  added 4 changesets with 4 changes to 3 files (+2 heads)
-  updating to branch default
+  added 5 changesets with 5 changes to 3 files (+2 heads)
+  updating to bookmark @
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ cd addmarks
   $ echo foo > foo
@@ -356,6 +377,7 @@
   remote: adding manifests
   remote: adding file changes
   remote: added 1 changesets with 1 changes to 1 files
+  updating bookmark @ failed!
   exporting bookmark add-foo
 
   $ cd ..
--- a/tests/test-bookmarks.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-bookmarks.t	Thu Nov 01 16:30:48 2012 -0500
@@ -363,10 +363,10 @@
      a@                        2:db815d6d32e6
      x  y                      2:db815d6d32e6
   $ hg clone . cloned-bookmarks
-  updating to branch default
+  updating to bookmark @
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg -R cloned-bookmarks bookmarks
-     @                         2:db815d6d32e6
+   * @                         2:db815d6d32e6
      X2                        1:925d80f479bb
      Y                         2:db815d6d32e6
      Z                         2:db815d6d32e6
@@ -381,10 +381,10 @@
   adding manifests
   adding file changes
   added 3 changesets with 3 changes to 3 files (+1 heads)
-  updating to branch default
+  updating to bookmark @
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg -R cloned-bookmarks-pull bookmarks
-     @                         2:db815d6d32e6
+   * @                         2:db815d6d32e6
      X2                        1:925d80f479bb
      Y                         2:db815d6d32e6
      Z                         2:db815d6d32e6
@@ -394,6 +394,22 @@
   $ hg bookmark -d @
   $ hg bookmark -d a@
 
+test clone with a bookmark named "default" (issue3677)
+
+  $ hg bookmark -r 1 -f -i default
+  $ hg clone . cloned-bookmark-default
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg -R cloned-bookmark-default bookmarks
+     X2                        1:925d80f479bb
+     Y                         2:db815d6d32e6
+     Z                         2:db815d6d32e6
+     default                   1:925d80f479bb
+     x  y                      2:db815d6d32e6
+  $ hg -R cloned-bookmark-default parents -q
+  2:db815d6d32e6
+  $ hg bookmark -d default
+
 test clone with a specific revision
 
   $ hg clone -r 925d80 . cloned-bookmarks-rev
--- a/tests/test-casecollision-merge.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-casecollision-merge.t	Thu Nov 01 16:30:48 2012 -0500
@@ -11,8 +11,8 @@
 (1) colliding file is one renamed from collided file:
 this is also case for issue3370.
 
-  $ hg init merge_renameaware_1
-  $ cd merge_renameaware_1
+  $ hg init branch_merge_renaming
+  $ cd branch_merge_renaming
 
   $ echo a > a
   $ hg add a
@@ -53,8 +53,8 @@
 
 (2) colliding file is not related to collided file
 
-  $ hg init merge_renameaware_2
-  $ cd merge_renameaware_2
+  $ hg init branch_merge_collding
+  $ cd branch_merge_collding
 
   $ echo a > a
   $ hg add a
@@ -66,22 +66,26 @@
   $ hg commit -m '#2'
   $ hg update --clean 0
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo 'modified at #3' > a
+  $ echo x > x
+  $ hg add x
   $ hg commit -m '#3'
   created new head
+  $ echo 'modified at #4' > a
+  $ hg commit -m '#4'
 
   $ hg merge
   abort: case-folding collision between A and a
   [255]
   $ hg parents --template '{rev}\n'
-  3
+  4
   $ hg status -A
   C a
+  C x
   $ cat a
-  modified at #3
+  modified at #4
 
   $ hg update --clean 2
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  1 files updated, 0 files merged, 2 files removed, 0 files unresolved
   $ hg merge
   abort: case-folding collision between a and A
   [255]
@@ -92,6 +96,29 @@
   $ cat A
   A
 
+test for deletion awareness of case-folding collision check (issue3648):
+revision '#3' doesn't change 'a', so 'a' should be recognized as
+safely removed in merging between #2 and #3.
+
+  $ hg update --clean 3
+  2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg merge 2
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg status -A
+  M A
+  R a
+  C x
+
+  $ hg update --clean 2
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg merge 3
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg status -A
+  M x
+  C A
+
   $ cd ..
 
 
--- a/tests/test-casefolding.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-casefolding.t	Thu Nov 01 16:30:48 2012 -0500
@@ -160,4 +160,15 @@
   $ hg status -A
   C MiXeDcAsE
 
+  $ hg qpop -a
+  popping refresh-casechange
+  patch queue now empty
+  $ hg qnew refresh-pattern
+  $ hg status
+  $ echo A > A
+  $ hg add
+  adding A
+  $ hg qrefresh a # issue 3271, qrefresh with file handled case wrong
+  $ hg status # empty status means the qrefresh worked
+
   $ cd ..
--- a/tests/test-check-code-hg.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-check-code-hg.t	Thu Nov 01 16:30:48 2012 -0500
@@ -62,9 +62,6 @@
   hgext/hgk.py:0:
    >     ui.write("tree %s\n" % short(ctx.changeset()[0]))
    warning: unwrapped ui message
-  hgext/mq.py:0:
-   >         ui.write("mq:     %s\n" % ', '.join(m))
-   warning: unwrapped ui message
   hgext/patchbomb.py:0:
    >             ui.write('Subject: %s\n' % subj)
    warning: unwrapped ui message
--- a/tests/test-clone.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-clone.t	Thu Nov 01 16:30:48 2012 -0500
@@ -318,8 +318,43 @@
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     hacked default
   
+Test clone with a branch named "@" (issue3677)
 
-  $ rm -r ua
+  $ hg -R ua branch @
+  marked working directory as branch @
+  (branches are permanent and global, did you want a bookmark?)
+  $ hg -R ua commit -m 'created branch @'
+  $ hg clone ua atbranch
+  updating to branch default
+  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg -R atbranch heads
+  changeset:   16:798b6d97153e
+  branch:      @
+  tag:         tip
+  parent:      12:f21241060d6a
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     created branch @
+  
+  changeset:   15:0aae7cf88f0d
+  branch:      stable
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     another change for branch stable
+  
+  changeset:   12:f21241060d6a
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     hacked default
+  
+  $ hg -R atbranch parents
+  changeset:   12:f21241060d6a
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     hacked default
+  
+
+  $ rm -r ua atbranch
 
 
 Testing #<branch>:
@@ -472,10 +507,21 @@
   $ cd a
   $ hg bookmark -r a7949464abda @  # branch point of stable from default
   $ hg clone . ../i
-  updating to branch default
+  updating to bookmark @
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg id -i ../i
   a7949464abda
+  $ rm -r ../i
+
+  $ hg bookmark -f -r stable @
+  $ hg bookmarks
+     @                         15:0aae7cf88f0d
+  $ hg clone . ../i
+  updating to bookmark @ on branch stable
+  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg id -i ../i
+  0aae7cf88f0d
+  $ cd "$TESTTMP"
 
 
 Testing failures:
--- a/tests/test-commit-amend.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-commit-amend.t	Thu Nov 01 16:30:48 2012 -0500
@@ -65,9 +65,11 @@
   saved backup bundle to $TESTTMP/.hg/strip-backup/43f1ba15f28a-amend-backup.hg (glob)
 
 Remove file that was added in amended commit:
+(and test logfile option)
 
   $ hg rm b
-  $ hg ci --amend -m 'amend base1 remove new file'
+  $ echo 'amend base1 remove new file' > ../logfile
+  $ hg ci --amend -l ../logfile
   saved backup bundle to $TESTTMP/.hg/strip-backup/b8e3cb2b3882-amend-backup.hg (glob)
 
   $ hg cat b
--- a/tests/test-hardlinks.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-hardlinks.t	Thu Nov 01 16:30:48 2012 -0500
@@ -197,7 +197,6 @@
   2 r4/.hg/00changelog.i
   2 r4/.hg/branch
   2 r4/.hg/cache/branchheads
-  2 r4/.hg/cache/tags
   2 r4/.hg/dirstate
   2 r4/.hg/hgrc
   2 r4/.hg/last-message.txt
@@ -228,7 +227,6 @@
   2 r4/.hg/00changelog.i
   1 r4/.hg/branch
   2 r4/.hg/cache/branchheads
-  2 r4/.hg/cache/tags
   1 r4/.hg/dirstate
   2 r4/.hg/hgrc
   2 r4/.hg/last-message.txt
--- a/tests/test-largefiles.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-largefiles.t	Thu Nov 01 16:30:48 2012 -0500
@@ -51,7 +51,7 @@
   branch: default
   commit: (clean)
   update: (current)
-  largefiles: No remote repo
+  largefiles: (no remote repo)
 
 Commit preserved largefile contents.
 
@@ -1683,7 +1683,7 @@
   branch: default
   commit: (clean)
   update: (current)
-  largefiles: No remote repo
+  largefiles: (no remote repo)
 
 check messages when there is no files to upload:
 
--- a/tests/test-lfconvert.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-lfconvert.t	Thu Nov 01 16:30:48 2012 -0500
@@ -6,6 +6,7 @@
   > share =
   > graphlog =
   > mq =
+  > convert =
   > [largefiles]
   > minsize = 0.5
   > patterns = **.other
@@ -274,11 +275,70 @@
 
   $ cd ..
 
+Clearing the usercache ensures that commitctx doesn't try to cache largefiles
+from the working dir on a convert.
+  $ rm "${USERCACHE}"/*
+  $ hg convert largefiles-repo
+  assuming destination largefiles-repo-hg
+  initializing destination largefiles-repo-hg repository
+  scanning source...
+  sorting...
+  converting...
+  6 add large, normal1
+  5 add sub/*
+  4 rename sub/ to stuff/
+  3 add normal3, modify sub/*
+  2 remove large, normal3
+  1 merge
+  0 add anotherlarge (should be a largefile)
+
+  $ hg -R largefiles-repo-hg glog --template "{rev}:{node|short}  {desc|firstline}\n"
+  o  6:17126745edfd  add anotherlarge (should be a largefile)
+  |
+  o    5:9cc5aa7204f0  merge
+  |\
+  | o  4:a5a02de7a8e4  remove large, normal3
+  | |
+  | o  3:55759520c76f  add normal3, modify sub/*
+  | |
+  o |  2:261ad3f3f037  rename sub/ to stuff/
+  |/
+  o  1:334e5237836d  add sub/*
+  |
+  o  0:d4892ec57ce2  add large, normal1
+  
+Verify will fail (for now) if the usercache is purged before converting, since
+largefiles are not cached in the converted repo's local store by the conversion
+process.
+  $ hg -R largefiles-repo-hg verify --large --lfa
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+  8 files, 7 changesets, 12 total revisions
+  searching 7 changesets for largefiles
+  changeset 0:d4892ec57ce2: large missing
+    (looked for hash 2e000fa7e85759c7f4c254d4d9c33ef481e459a7)
+  changeset 1:334e5237836d: sub/maybelarge.dat missing
+    (looked for hash 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c)
+  changeset 2:261ad3f3f037: stuff/maybelarge.dat missing
+    (looked for hash 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c)
+  changeset 3:55759520c76f: sub/maybelarge.dat missing
+    (looked for hash 76236b6a2c6102826c61af4297dd738fb3b1de38)
+  changeset 5:9cc5aa7204f0: stuff/maybelarge.dat missing
+    (looked for hash 76236b6a2c6102826c61af4297dd738fb3b1de38)
+  changeset 6:17126745edfd: anotherlarge missing
+    (looked for hash 3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3)
+  verified existence of 6 revisions of 4 largefiles
+  [1]
+  $ hg -R largefiles-repo-hg showconfig paths
+
+
 Avoid a traceback if a largefile isn't available (issue3519)
 
 Ensure the largefile can be cached in the source if necessary
   $ hg clone -U largefiles-repo issue3519
-  $ rm "${USERCACHE}"/*
+  $ rm -f "${USERCACHE}"/*
   $ hg lfconvert --to-normal issue3519 normalized3519
   initializing destination normalized3519
 
--- a/tests/test-merge-tools.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-merge-tools.t	Thu Nov 01 16:30:48 2012 -0500
@@ -773,6 +773,34 @@
   # hg stat
   M f
 
+Issue3581: Merging a filename that needs to be quoted
+(This test doesn't work on Windows filesystems even on Linux, so check
+for Unix-like permission)
+
+#if unix-permissions
+  $ beforemerge
+  [merge-tools]
+  false.whatever=
+  true.priority=1
+  true.executable=cat
+  # hg update -C 1
+  $ echo "revision 4" > '"; exit 1; echo "'
+  $ hg commit -Am "revision 4"
+  adding "; exit 1; echo "
+  warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "'
+  $ hg update -C 1 > /dev/null
+  $ echo "revision 5" > '"; exit 1; echo "'
+  $ hg commit -Am "revision 5"
+  adding "; exit 1; echo "
+  warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "'
+  created new head
+  $ hg merge --config merge-tools.true.executable="true" -r 4
+  merging "; exit 1; echo "
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg update -C 1 > /dev/null
+#endif
+
 Merge post-processing
 
 cat is a bad merge-tool and doesn't change:
--- a/tests/test-mq-qrefresh.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-mq-qrefresh.t	Thu Nov 01 16:30:48 2012 -0500
@@ -208,6 +208,7 @@
   $ echo 'orphan' > orphanchild
   $ hg add orphanchild
   $ hg qrefresh nonexistentfilename # clear patch
+  nonexistentfilename: No such file or directory
   $ hg qrefresh --short 1/base
   $ hg qrefresh --short 2/base
 
--- a/tests/test-patchbomb.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-patchbomb.t	Thu Nov 01 16:30:48 2012 -0500
@@ -1663,8 +1663,8 @@
   Subject: [PATCH 2 of 2] b
   X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
   Message-Id: <97d72e5f12c7e84f8506.61@*> (glob)
-  In-Reply-To: <8580ff50825a50c8f716.60@*> (glob)
-  References: <8580ff50825a50c8f716.60@*> (glob)
+  In-Reply-To: <baz>
+  References: <baz>
   User-Agent: Mercurial-patchbomb/* (glob)
   Date: Thu, 01 Jan 1970 00:01:01 +0000
   From: quux
--- a/tests/test-remove.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-remove.t	Thu Nov 01 16:30:48 2012 -0500
@@ -275,7 +275,13 @@
   $ hg add d1/a
   $ rm d1/a
   $ hg rm --after d1
-  removing d1/a
+  removing d1/a (glob)
+#if windows
+  $ hg rm --after nosuch
+  nosuch: * (glob)
+  [1]
+#else
   $ hg rm --after nosuch
   nosuch: No such file or directory
   [1]
+#endif
--- a/tests/test-revset.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-revset.t	Thu Nov 01 16:30:48 2012 -0500
@@ -750,6 +750,14 @@
   $ log 'min(1 or 2) and not 1'
   $ log 'last(1 or 2, 1) and not 2'
 
+test revsets started with 40-chars hash (issue3669)
+
+  $ ISSUE3669_TIP=`hg tip --template '{node}'`
+  $ hg log -r "${ISSUE3669_TIP}" --template '{rev}\n'
+  9
+  $ hg log -r "${ISSUE3669_TIP}^" --template '{rev}\n'
+  8
+
 tests for 'remote()' predicate:
 #.  (csets in remote) (id)            (remote)
 1.  less than local   current branch  "default"
--- a/tests/test-subrepo.t	Tue Oct 23 09:28:42 2012 +0200
+++ b/tests/test-subrepo.t	Thu Nov 01 16:30:48 2012 -0500
@@ -210,9 +210,10 @@
   subrepo merge f0d2028bf86d+ 1831e14459c4 1f14a2e2d3ec
     subrepo t: other changed, get t:6747d179aa9a688023c4b0cad32e4c92bb7f34ad:hg
   getting subrepo t
+    searching for copies back to rev 1
   resolving manifests
-   overwrite: True, partial: False
-   ancestor: 60ca1237c194+, local: 60ca1237c194+, remote: 6747d179aa9a
+   overwrite: False, partial: False
+   ancestor: 60ca1237c194, local: 60ca1237c194+, remote: 6747d179aa9a
    t: remote is newer -> g
   updating: t 1/1 files (100.00%)
   getting t
@@ -580,16 +581,37 @@
   $ hg -q -R repo2/s push
   $ hg -R repo2/s up -C 0
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ echo 2 > repo2/s/a
-  $ hg -R repo2/s ci -m3
+  $ echo 2 > repo2/s/b
+  $ hg -R repo2/s ci -m3 -A
+  adding b
   created new head
   $ hg -R repo2 ci -m3
   $ hg -q -R repo2 push
-  abort: push creates new remote head 9d66565e64e1!
+  abort: push creates new remote head cc505f09a8b2!
   (did you forget to merge? use push -f to force)
   [255]
   $ hg -R repo update
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+test if untracked file is not overwritten
+
+  $ echo issue3276_ok > repo/s/b
+  $ hg -R repo2 push -f -q
+  $ hg -R repo update
+  b: untracked file differs
+  abort: untracked files in working directory differ from files in requested revision
+  [255]
+
+  $ cat repo/s/b
+  issue3276_ok
+  $ rm repo/s/b
+  $ hg -R repo revert --all
+  reverting repo/.hgsubstate
+  reverting subrepo s
+  $ hg -R repo update
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat repo/s/b
+  2
   $ rm -rf repo2 repo