merge with stable
authorMartin Geisler <mg@aragost.com>
Wed, 02 May 2012 12:55:44 +0200
changeset 16564 979f294dc574
parent 16458 55982f62651f (current diff)
parent 16563 979b1b7340fb (diff)
child 16565 9b7d2ff4b006
merge with stable
tests/test-filelog
tests/test-filelog.out
tests/test-pull-pull-corruption2.t
--- a/.hgignore	Wed Apr 18 01:20:16 2012 +0300
+++ b/.hgignore	Wed May 02 12:55:44 2012 +0200
@@ -52,6 +52,6 @@
 ^\.(pydev)?project
 
 # hackable windows distribution additions
-^hg-python26/
+^hg-python
 ^hg.exe$
 ^hg.py$
--- a/.hgsigs	Wed Apr 18 01:20:16 2012 +0300
+++ b/.hgsigs	Wed May 02 12:55:44 2012 +0200
@@ -51,3 +51,5 @@
 2aa5b51f310fb3befd26bed99c02267f5c12c734 0 iD8DBQBPKZ9bywK+sNU5EO8RAt1TAJ45r1eJ0YqSkInzrrayg4TVCh0SnQCgm0GA/Ua74jnnDwVQ60lAwROuz1Q=
 53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 0 iD8DBQBPT/fvywK+sNU5EO8RAnfYAKCn7d0vwqIb100YfWm1F7nFD5B+FACeM02YHpQLSNsztrBCObtqcnfod7Q=
 b9bd95e61b49c221c4cca24e6da7c946fc02f992 0 iD8DBQBPeLsIywK+sNU5EO8RAvpNAKCtKe2gitz8dYn52IRF0hFOPCR7AQCfRJL/RWCFweu2T1vH/mUOCf8SXXc=
+d9e2f09d5488c395ae9ddbb320ceacd24757e055 0 iD8DBQBPju/dywK+sNU5EO8RArBYAJ9xtifdbk+hCOJO8OZa4JfHX8OYZQCeKPMBaBWiT8N/WHoOm1XU0q+iono=
+00182b3d087909e3c3ae44761efecdde8f319ef3 0 iD8DBQBPoFhIywK+sNU5EO8RAhzhAKCBj1n2jxPTkZNJJ5pSp3soa+XHIgCgsZZpAQxOpXwCp0eCdNGe0+pmxmg=
--- a/.hgtags	Wed Apr 18 01:20:16 2012 +0300
+++ b/.hgtags	Wed May 02 12:55:44 2012 +0200
@@ -63,3 +63,5 @@
 2aa5b51f310fb3befd26bed99c02267f5c12c734 2.1
 53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 2.1.1
 b9bd95e61b49c221c4cca24e6da7c946fc02f992 2.1.2
+d9e2f09d5488c395ae9ddbb320ceacd24757e055 2.2-rc
+00182b3d087909e3c3ae44761efecdde8f319ef3 2.2
--- a/Makefile	Wed Apr 18 01:20:16 2012 +0300
+++ b/Makefile	Wed May 02 12:55:44 2012 +0200
@@ -45,7 +45,7 @@
 clean:
 	-$(PYTHON) setup.py clean --all # ignore errors from this command
 	find . \( -name '*.py[cdo]' -o -name '*.so' \) -exec rm -f '{}' ';'
-	rm -f $(addprefix mercurial/,$(notdir $(wildcard mercurial/pure/*.py)))
+	rm -f $(addprefix mercurial/,$(notdir $(wildcard mercurial/pure/[a-z]*.py)))
 	rm -f MANIFEST MANIFEST.in tests/*.err
 	rm -rf build mercurial/locale
 	$(MAKE) -C doc clean
--- a/contrib/check-code.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/contrib/check-code.py	Wed May 02 12:55:44 2012 +0200
@@ -43,7 +43,7 @@
 
 testpats = [
   [
-    (r'(pushd|popd)', "don't use 'pushd' or 'popd', use 'cd'"),
+    (r'pushd|popd', "don't use 'pushd' or 'popd', use 'cd'"),
     (r'\W\$?\(\([^\)\n]*\)\)', "don't use (()) or $(()), use 'expr'"),
     (r'^function', "don't use 'function', use old style"),
     (r'grep.*-q', "don't use 'grep -q', redirect to /dev/null"),
@@ -55,7 +55,7 @@
     (r'head -c', "don't use 'head -c', use 'dd'"),
     (r'sha1sum', "don't use sha1sum, use $TESTDIR/md5sum.py"),
     (r'ls.*-\w*R', "don't use 'ls -R', use 'find'"),
-    (r'printf.*\\\d{1,3}', "don't use 'printf \NNN', use Python"),
+    (r'printf.*\\([1-9]|0\d)', "don't use 'printf \NNN', use Python"),
     (r'printf.*\\x', "don't use printf \\x, use Python"),
     (r'\$\(.*\)', "don't use $(expr), use `expr`"),
     (r'rm -rf \*', "don't use naked rm -rf, target a directory"),
@@ -65,7 +65,7 @@
     (r'\$PWD', "don't use $PWD, use `pwd`"),
     (r'[^\n]\Z', "no trailing newline"),
     (r'export.*=', "don't export and assign at once"),
-    (r'^([^"\'\n]|("[^"\n]*")|(\'[^\'\n]*\'))*\\^', "^ must be quoted"),
+    (r'^([^"\'\n]|("[^"\n]*")|(\'[^\'\n]*\'))*\^', "^ must be quoted"),
     (r'^source\b', "don't use 'source', use '.'"),
     (r'touch -d', "don't use 'touch -d', use 'touch -t' instead"),
     (r'ls +[^|\n-]+ +-', "options to 'ls' must come before filenames"),
@@ -73,6 +73,10 @@
     (r'^stop\(\)', "don't use 'stop' as a shell function name"),
     (r'(\[|\btest\b).*-e ', "don't use 'test -e', use 'test -f'"),
     (r'^alias\b.*=', "don't use alias, use a function"),
+    (r'if\s*!', "don't use '!' to negate exit status"),
+    (r'/dev/u?random', "don't use entropy, use /dev/zero"),
+    (r'do\s*true;\s*done', "don't use true as loop body, use sleep 0"),
+    (r'^( *)\t', "don't use tabs to indent"),
   ],
   # warnings
   []
@@ -84,7 +88,6 @@
 ]
 
 uprefix = r"^  \$ "
-uprefixc = r"^  > "
 utestpats = [
   [
     (r'^(\S|  $ ).*(\S[ \t]+|^[ \t]+)\n', "trailing whitespace on non-output"),
@@ -94,9 +97,7 @@
     (uprefix + r'.*\|\| echo.*(fail|error)',
      "explicit exit code checks unnecessary"),
     (uprefix + r'set -e', "don't use set -e"),
-    (uprefixc + r'( *)\t', "don't use tabs to indent"),
-    (uprefixc + r'.*do\s*true;\s*done',
-     "don't use true as loop body, use sleep 0"),
+    (uprefix + r'\s', "don't indent commands, use > for continued lines"),
   ],
   # warnings
   []
@@ -105,9 +106,9 @@
 for i in [0, 1]:
     for p, m in testpats[i]:
         if p.startswith(r'^'):
-            p = uprefix + p[1:]
+            p = r"^  \$ (%s)" % p[1:]
         else:
-            p = uprefix + ".*" + p
+            p = r"^  \$ .*(%s)" % p
         utestpats[i].append((p, m))
 
 utestfilters = [
--- a/contrib/plan9/9diff	Wed Apr 18 01:20:16 2012 +0300
+++ b/contrib/plan9/9diff	Wed May 02 12:55:44 2012 +0200
@@ -3,13 +3,13 @@
 
 rfork e
 
-fn getfiles{
-	cd $1 && \
+fn getfiles {
+	cd $1 &&
 	for(f in `{du -as | awk '{print $2}'})
 		test -f $f && echo `{cleanname $f}
 }
 
-fn usage{
+fn usage {
 	echo >[1=2] usage: 9diff [diff options] parent child root
 	exit usage
 }
--- a/contrib/plan9/mkfile	Wed Apr 18 01:20:16 2012 +0300
+++ b/contrib/plan9/mkfile	Wed May 02 12:55:44 2012 +0200
@@ -29,9 +29,9 @@
 		cd $ROOT
 		$SH -c '$PYTHON setup.py $PURE install \
 			--install-scripts $PYTHONBIN \
-			--skip-build' \
-			--force
+			--skip-build \
+			--force'
 	}
 	mkdir -p /lib/mercurial/hgrc.d
-	dircp hgrc.d /lib/mercurial/hgrc.d
-	cp 9diff /rc/bin
+	dircp hgrc.d /lib/mercurial/hgrc.d/
+	cp 9diff /rc/bin/
--- a/contrib/plan9/proto	Wed Apr 18 01:20:16 2012 +0300
+++ b/contrib/plan9/proto	Wed May 02 12:55:44 2012 +0200
@@ -20,4 +20,5 @@
 						mercurial-VERSION-py2.5.egg-info	- sys sys
 	src	- sys sys
 		cmd	- sys sys
-			mercurial	- sys sys
+			hg	- sys sys
+				+	- sys sys
--- a/contrib/win32/ReadMe.html	Wed Apr 18 01:20:16 2012 +0300
+++ b/contrib/win32/ReadMe.html	Wed May 02 12:55:44 2012 +0200
@@ -140,7 +140,7 @@
     </p>
 
     <p>
-      Mercurial is Copyright 2005-2010 Matt Mackall and others. See
+      Mercurial is Copyright 2005-2012 Matt Mackall and others. See
       the <tt>Contributors.txt</tt> file for a list of contributors.
     </p>
 
--- a/doc/hg.1.txt	Wed Apr 18 01:20:16 2012 +0300
+++ b/doc/hg.1.txt	Wed May 02 12:55:44 2012 +0200
@@ -112,7 +112,7 @@
 
 Copying
 -------
-Copyright (C) 2005-2010 Matt Mackall.
+Copyright (C) 2005-2012 Matt Mackall.
 Free use of this software is granted under the terms of the GNU General
 Public License version 2 or any later version.
 
--- a/doc/hgignore.5.txt	Wed Apr 18 01:20:16 2012 +0300
+++ b/doc/hgignore.5.txt	Wed May 02 12:55:44 2012 +0200
@@ -26,7 +26,7 @@
 Copying
 -------
 This manual page is copyright 2006 Vadim Gelfer.
-Mercurial is copyright 2005-2010 Matt Mackall.
+Mercurial is copyright 2005-2012 Matt Mackall.
 Free use of this software is granted under the terms of the GNU General
 Public License version 2 or any later version.
 
--- a/doc/hgrc.5.txt	Wed Apr 18 01:20:16 2012 +0300
+++ b/doc/hgrc.5.txt	Wed May 02 12:55:44 2012 +0200
@@ -34,7 +34,7 @@
 Copying
 -------
 This manual page is copyright 2005 Bryan O'Sullivan.
-Mercurial is copyright 2005-2010 Matt Mackall.
+Mercurial is copyright 2005-2012 Matt Mackall.
 Free use of this software is granted under the terms of the GNU General
 Public License version 2 or any later version.
 
--- a/hgext/acl.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/acl.py	Wed May 02 12:55:44 2012 +0200
@@ -139,9 +139,9 @@
   # under the "images" folder:
   images/** = jack, @designers
 
-  # Everyone (except for "user6" - see acl.deny above) will have write
-  # access to any file under the "resources" folder (except for 1
-  # file. See acl.deny):
+  # Everyone (except for "user6" and "@hg-denied" - see acl.deny above)
+  # will have write access to any file under the "resources" folder
+  # (except for 1 file. See acl.deny):
   src/main/resources/** = *
 
   .hgtags = release_engineer
--- a/hgext/convert/cvs.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/convert/cvs.py	Wed May 02 12:55:44 2012 +0200
@@ -70,7 +70,7 @@
                 cs.author = self.recode(cs.author)
                 self.lastbranch[cs.branch] = id
                 cs.comment = self.recode(cs.comment)
-                date = util.datestr(cs.date)
+                date = util.datestr(cs.date, '%Y-%m-%d %H:%M:%S %1%2')
                 self.tags.update(dict.fromkeys(cs.tags, id))
 
                 files = {}
--- a/hgext/convert/darcs.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/convert/darcs.py	Wed May 02 12:55:44 2012 +0200
@@ -139,7 +139,7 @@
         # etree can return unicode objects for name, comment, and author,
         # so recode() is used to ensure str objects are emitted.
         return commit(author=self.recode(elt.get('author')),
-                      date=util.datestr(date),
+                      date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'),
                       desc=self.recode(desc).strip(),
                       parents=self.parents[rev])
 
--- a/hgext/convert/hg.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/convert/hg.py	Wed May 02 12:55:44 2012 +0200
@@ -342,7 +342,8 @@
             crev = rev
         else:
             crev = None
-        return commit(author=ctx.user(), date=util.datestr(ctx.date()),
+        return commit(author=ctx.user(),
+                      date=util.datestr(ctx.date(), '%Y-%m-%d %H:%M:%S %1%2'),
                       desc=ctx.description(), rev=crev, parents=parents,
                       branch=ctx.branch(), extra=ctx.extra(),
                       sortkey=ctx.rev())
--- a/hgext/convert/p4.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/convert/p4.py	Wed May 02 12:55:44 2012 +0200
@@ -119,7 +119,8 @@
                 parents = []
 
             date = (int(d["time"]), 0)     # timezone not set
-            c = commit(author=self.recode(d["user"]), date=util.datestr(date),
+            c = commit(author=self.recode(d["user"]),
+                       date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'),
                        parents=parents, desc=desc, branch='',
                        extra={"p4": change})
 
--- a/hgext/convert/subversion.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/convert/subversion.py	Wed May 02 12:55:44 2012 +0200
@@ -2,17 +2,14 @@
 #
 # Copyright(C) 2007 Daniel Holth et al
 
-import os
-import re
-import sys
+import os, re, sys, tempfile, urllib, urllib2, xml.dom.minidom
 import cPickle as pickle
-import tempfile
-import urllib
-import urllib2
 
 from mercurial import strutil, scmutil, util, encoding
 from mercurial.i18n import _
 
+propertycache = util.propertycache
+
 # Subversion stuff. Works best with very recent Python SVN bindings
 # e.g. SVN 1.5 or backports. Thanks to the bzr folks for enhancing
 # these bindings.
@@ -555,18 +552,47 @@
     def revnum(self, rev):
         return int(rev.split('@')[-1])
 
-    def latest(self, path, stop=0):
-        """Find the latest revid affecting path, up to stop. It may return
-        a revision in a different module, since a branch may be moved without
-        a change being reported. Return None if computed module does not
-        belong to rootmodule subtree.
+    def latest(self, path, stop=None):
+        """Find the latest revid affecting path, up to stop revision
+        number. If stop is None, default to repository latest
+        revision. It may return a revision in a different module,
+        since a branch may be moved without a change being
+        reported. Return None if computed module does not belong to
+        rootmodule subtree.
         """
+        def findchanges(path, start, stop=None):
+            stream = self._getlog([path], start, stop or 1)
+            try:
+                for entry in stream:
+                    paths, revnum, author, date, message = entry
+                    if stop is None and paths:
+                        # We do not know the latest changed revision,
+                        # keep the first one with changed paths.
+                        break
+                    if revnum <= stop:
+                        break
+
+                    for p in paths:
+                        if (not path.startswith(p) or
+                            not paths[p].copyfrom_path):
+                            continue
+                        newpath = paths[p].copyfrom_path + path[len(p):]
+                        self.ui.debug("branch renamed from %s to %s at %d\n" %
+                                      (path, newpath, revnum))
+                        path = newpath
+                        break
+                if not paths:
+                    revnum = None
+                return revnum, path
+            finally:
+                stream.close()
+
         if not path.startswith(self.rootmodule):
             # Requests on foreign branches may be forbidden at server level
             self.ui.debug('ignoring foreign branch %r\n' % path)
             return None
 
-        if not stop:
+        if stop is None:
             stop = svn.ra.get_latest_revnum(self.ra)
         try:
             prevmodule = self.reparent('')
@@ -581,28 +607,24 @@
         # stat() gives us the previous revision on this line of
         # development, but it might be in *another module*. Fetch the
         # log and detect renames down to the latest revision.
-        stream = self._getlog([path], stop, dirent.created_rev)
-        try:
-            for entry in stream:
-                paths, revnum, author, date, message = entry
-                if revnum <= dirent.created_rev:
-                    break
+        revnum, realpath = findchanges(path, stop, dirent.created_rev)
+        if revnum is None:
+            # Tools like svnsync can create empty revision, when
+            # synchronizing only a subtree for instance. These empty
+            # revisions created_rev still have their original values
+            # despite all changes having disappeared and can be
+            # returned by ra.stat(), at least when stating the root
+            # module. In that case, do not trust created_rev and scan
+            # the whole history.
+            revnum, realpath = findchanges(path, stop)
+            if revnum is None:
+                self.ui.debug('ignoring empty branch %r\n' % realpath)
+                return None
 
-                for p in paths:
-                    if not path.startswith(p) or not paths[p].copyfrom_path:
-                        continue
-                    newpath = paths[p].copyfrom_path + path[len(p):]
-                    self.ui.debug("branch renamed from %s to %s at %d\n" %
-                                  (path, newpath, revnum))
-                    path = newpath
-                    break
-        finally:
-            stream.close()
-
-        if not path.startswith(self.rootmodule):
-            self.ui.debug('ignoring foreign branch %r\n' % path)
+        if not realpath.startswith(self.rootmodule):
+            self.ui.debug('ignoring foreign branch %r\n' % realpath)
             return None
-        return self.revid(dirent.created_rev, path)
+        return self.revid(revnum, realpath)
 
     def reparent(self, module):
         """Reparent the svn transport and return the previous parent."""
@@ -783,7 +805,7 @@
                 branch = None
 
             cset = commit(author=author,
-                          date=util.datestr(date),
+                          date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'),
                           desc=log,
                           parents=parents,
                           branch=branch,
@@ -1032,6 +1054,29 @@
     def wjoin(self, *names):
         return os.path.join(self.wc, *names)
 
+    @propertycache
+    def manifest(self):
+        # As of svn 1.7, the "add" command fails when receiving
+        # already tracked entries, so we have to track and filter them
+        # ourselves.
+        m = set()
+        output = self.run0('ls', recursive=True, xml=True)
+        doc = xml.dom.minidom.parseString(output)
+        for e in doc.getElementsByTagName('entry'):
+            for n in e.childNodes:
+                if n.nodeType != n.ELEMENT_NODE or n.tagName != 'name':
+                    continue
+                name = ''.join(c.data for c in n.childNodes
+                               if c.nodeType == c.TEXT_NODE)
+                # Entries are compared with names coming from
+                # mercurial, so bytes with undefined encoding. Our
+                # best bet is to assume they are in local
+                # encoding. They will be passed to command line calls
+                # later anyway, so they better be.
+                m.add(encoding.tolocal(name.encode('utf-8')))
+                break
+        return m
+
     def putfile(self, filename, flags, data):
         if 'l' in flags:
             self.wopener.symlink(data, filename)
@@ -1074,6 +1119,7 @@
         try:
             self.run0('copy', source, dest)
         finally:
+            self.manifest.add(dest)
             if exists:
                 try:
                     os.unlink(wdest)
@@ -1092,13 +1138,16 @@
 
     def add_dirs(self, files):
         add_dirs = [d for d in sorted(self.dirs_of(files))
-                    if not os.path.exists(self.wjoin(d, '.svn', 'entries'))]
+                    if d not in self.manifest]
         if add_dirs:
+            self.manifest.update(add_dirs)
             self.xargs(add_dirs, 'add', non_recursive=True, quiet=True)
         return add_dirs
 
     def add_files(self, files):
+        files = [f for f in files if f not in self.manifest]
         if files:
+            self.manifest.update(files)
             self.xargs(files, 'add', quiet=True)
         return files
 
@@ -1108,6 +1157,7 @@
             wd = self.wjoin(d)
             if os.listdir(wd) == '.svn':
                 self.run0('delete', d)
+                self.manifest.remove(d)
                 deleted.append(d)
         return deleted
 
@@ -1145,6 +1195,8 @@
             self.copies = []
         if self.delete:
             self.xargs(self.delete, 'delete')
+            for f in self.delete:
+                self.manifest.remove(f)
             self.delete = []
         entries.update(self.add_files(files.difference(entries)))
         entries.update(self.tidy_dirs(entries))
--- a/hgext/factotum.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/factotum.py	Wed May 02 12:55:44 2012 +0200
@@ -35,13 +35,13 @@
 default, these entries are::
 
   [factotum]
-  mount = /mnt/factotum
-  path = /bin/auth/factotum
+  executable = /bin/auth/factotum
+  mountpoint = /mnt/factotum
   service = hg
 
-The mount entry defines the mount point for the factotum file service. The
-path entry defines the full path to the factotum binary. Lastly, the service
-entry controls the service name used when reading keys.
+The executable entry defines the full path to the factotum binary. The
+mountpoint entry defines the path to the factotum file service. Lastly, the
+service entry controls the service name used when reading keys.
 
 '''
 
@@ -58,12 +58,12 @@
     if 'user=' not in params:
         params = '%s user?' % params
     params = '%s !password?' % params
-    os.system("%s -g '%s'" % (_path, params))
+    os.system("%s -g '%s'" % (_executable, params))
 
 def auth_getuserpasswd(self, getkey, params):
     params = 'proto=pass %s' % params
     while True:
-        fd = os.open('%s/rpc' % _mount, os.O_RDWR)
+        fd = os.open('%s/rpc' % _mountpoint, os.O_RDWR)
         try:
             try:
                 os.write(fd, 'start %s' % params)
@@ -112,9 +112,9 @@
     return (user, passwd)
 
 def uisetup(ui):
-    global _mount
-    _mount = ui.config('factotum', 'mount', '/mnt/factotum')
-    global _path
-    _path = ui.config('factotum', 'path', '/bin/auth/factotum')
+    global _executable
+    _executable = ui.config('factotum', 'executable', '/bin/auth/factotum')
+    global _mountpoint
+    _mountpoint = ui.config('factotum', 'mountpoint', '/mnt/factotum')
     global _service
     _service = ui.config('factotum', 'service', 'hg')
--- a/hgext/fetch.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/fetch.py	Wed May 02 12:55:44 2012 +0200
@@ -23,10 +23,9 @@
     Otherwise, the working directory is updated to include the new
     changes.
 
-    When a merge occurs, the newly pulled changes are assumed to be
-    "authoritative". The head of the new changes is used as the first
-    parent, with local changes as the second. To switch the merge
-    order, use --switch-parent.
+    When a merge is needed, the working directory is first updated to
+    the newly pulled changes. Local changes are then merged into the
+    pulled changes. To switch the merge order, use --switch-parent.
 
     See :hg:`help dates` for a list of formats valid for -d/--date.
 
--- a/hgext/largefiles/lfcommands.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/largefiles/lfcommands.py	Wed May 02 12:55:44 2012 +0200
@@ -248,7 +248,7 @@
     mctx = context.memctx(rdst, parents, ctx.description(), dstfiles,
                           getfilectx, ctx.user(), ctx.date(), ctx.extra())
     ret = rdst.commitctx(mctx)
-    rdst.dirstate.setparents(ret)
+    rdst.setparents(ret)
     revmap[ctx.node()] = rdst.changelog.tip()
 
 # Generate list of changed files
--- a/hgext/largefiles/overrides.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/largefiles/overrides.py	Wed May 02 12:55:44 2012 +0200
@@ -202,6 +202,13 @@
     restorematchfn()
     removelargefiles(ui, repo, *pats, **opts)
 
+def overridestatusfn(orig, repo, rev2, **opts):
+    try:
+        repo._repo.lfstatus = True
+        return orig(repo, rev2, **opts)
+    finally:
+        repo._repo.lfstatus = False
+
 def overridestatus(orig, ui, repo, *pats, **opts):
     try:
         repo.lfstatus = True
@@ -209,6 +216,13 @@
     finally:
         repo.lfstatus = False
 
+def overridedirty(orig, repo, ignoreupdate=False):
+    try:
+        repo._repo.lfstatus = True
+        return orig(repo, ignoreupdate)
+    finally:
+        repo._repo.lfstatus = False
+
 def overridelog(orig, ui, repo, *pats, **opts):
     try:
         repo.lfstatus = True
--- a/hgext/largefiles/uisetup.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/largefiles/uisetup.py	Wed May 02 12:55:44 2012 +0200
@@ -12,6 +12,7 @@
     httprepo, localrepo, merge, sshrepo, sshserver, wireproto
 from mercurial.i18n import _
 from mercurial.hgweb import hgweb_mod, protocol, webcommands
+from mercurial.subrepo import hgsubrepo
 
 import overrides
 import proto
@@ -35,8 +36,13 @@
                                    overrides.overrideremove)
     entry = extensions.wrapcommand(commands.table, 'forget',
                                    overrides.overrideforget)
+
+    # Subrepos call status function
     entry = extensions.wrapcommand(commands.table, 'status',
                                    overrides.overridestatus)
+    entry = extensions.wrapfunction(hgsubrepo, 'status',
+                                    overrides.overridestatusfn)
+
     entry = extensions.wrapcommand(commands.table, 'log',
                                    overrides.overridelog)
     entry = extensions.wrapcommand(commands.table, 'rollback',
@@ -75,6 +81,10 @@
     entry = extensions.wrapfunction(cmdutil, 'copy',
                                     overrides.overridecopy)
 
+    # Summary calls dirty on the subrepos
+    entry = extensions.wrapfunction(hgsubrepo, 'dirty',
+                                    overrides.overridedirty)
+
     # Backout calls revert so we need to override both the command and the
     # function
     entry = extensions.wrapcommand(commands.table, 'revert',
--- a/hgext/mq.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/mq.py	Wed May 02 12:55:44 2012 +0200
@@ -749,7 +749,7 @@
                 for f in merged:
                     repo.dirstate.merge(f)
                 p1, p2 = repo.dirstate.parents()
-                repo.dirstate.setparents(p1, merge)
+                repo.setparents(p1, merge)
 
             match = scmutil.matchfiles(repo, files or [])
             oldtip = repo['tip']
@@ -1355,7 +1355,7 @@
                     fctx = ctx[f]
                     repo.wwrite(f, fctx.data(), fctx.flags())
                     repo.dirstate.normal(f)
-                repo.dirstate.setparents(qp, nullid)
+                repo.setparents(qp, nullid)
             for patch in reversed(self.applied[start:end]):
                 self.ui.status(_("popping %s\n") % patch.name)
             del self.applied[start:end]
@@ -1546,7 +1546,7 @@
                 oldphase = repo[top].phase()
 
                 # assumes strip can roll itself back if interrupted
-                repo.dirstate.setparents(*cparents)
+                repo.setparents(*cparents)
                 self.applied.pop()
                 self.applieddirty = True
                 self.strip(repo, [top], update=False,
--- a/hgext/notify.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/notify.py	Wed May 02 12:55:44 2012 +0200
@@ -11,7 +11,7 @@
 changesets are being pushed, from the sending or receiving side.
 
 First, enable the extension as explained in :hg:`help extensions`, and
-register the hook you want to run. ``incoming`` and ``outgoing`` hooks
+register the hook you want to run. ``incoming`` and ``changegroup`` hooks
 are run by the changesets receiver while the ``outgoing`` one is for
 the sender::
 
--- a/hgext/rebase.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/rebase.py	Wed May 02 12:55:44 2012 +0200
@@ -277,7 +277,7 @@
                                           editor=editor)
                 else:
                     # Skip commit if we are collapsing
-                    repo.dirstate.setparents(repo[p1].node())
+                    repo.setparents(repo[p1].node())
                     newrev = None
                 # Update the state
                 if newrev is not None:
@@ -361,7 +361,7 @@
 def concludenode(repo, rev, p1, p2, commitmsg=None, editor=None, extrafn=None):
     'Commit the changes and store useful information in extra'
     try:
-        repo.dirstate.setparents(repo[p1].node(), repo[p2].node())
+        repo.setparents(repo[p1].node(), repo[p2].node())
         ctx = repo[rev]
         if commitmsg is None:
             commitmsg = ctx.description()
@@ -446,6 +446,7 @@
     mqrebase = {}
     mq = repo.mq
     original_series = mq.fullseries[:]
+    skippedpatches = set()
 
     for p in mq.applied:
         rev = repo[p.node].rev()
@@ -453,6 +454,9 @@
             repo.ui.debug('revision %d is an mq patch (%s), finalize it.\n' %
                                         (rev, p.name))
             mqrebase[rev] = (p.name, isagitpatch(repo, p.name))
+        else:
+            # Applied but not rebased, not sure this should happen
+            skippedpatches.add(p.name)
 
     if mqrebase:
         mq.finish(repo, mqrebase.keys())
@@ -464,14 +468,17 @@
                 repo.ui.debug('import mq patch %d (%s)\n' % (state[rev], name))
                 mq.qimport(repo, (), patchname=name, git=isgit,
                                 rev=[str(state[rev])])
+            else:
+                # Rebased and skipped
+                skippedpatches.add(mqrebase[rev][0])
 
-        # restore missing guards
-        for s in original_series:
-            pname = mq.guard_re.split(s, 1)[0]
-            if pname in mq.fullseries:
-                repo.ui.debug('restoring guard for patch %s' % (pname))
-                mq.fullseries[mq.fullseries.index(pname)] = s
-                mq.series_dirty = True
+        # Patches were either applied and rebased and imported in
+        # order, applied and removed or unapplied. Discard the removed
+        # ones while preserving the original series order and guards.
+        newseries = [s for s in original_series
+                     if mq.guard_re.split(s, 1)[0] not in skippedpatches]
+        mq.fullseries[:] = newseries
+        mq.seriesdirty = True
         mq.savedirty()
 
 def updatebookmarks(repo, nstate, originalbookmarks, **opts):
--- a/hgext/transplant.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/hgext/transplant.py	Wed May 02 12:55:44 2012 +0200
@@ -20,6 +20,9 @@
 from mercurial import patch, revlog, scmutil, util, error, cmdutil
 from mercurial import revset, templatekw
 
+class TransplantError(error.Abort):
+    pass
+
 cmdtable = {}
 command = cmdutil.command(cmdtable)
 
@@ -171,11 +174,17 @@
                 del revmap[rev]
                 if patchfile or domerge:
                     try:
-                        n = self.applyone(repo, node,
-                                          source.changelog.read(node),
-                                          patchfile, merge=domerge,
-                                          log=opts.get('log'),
-                                          filter=opts.get('filter'))
+                        try:
+                            n = self.applyone(repo, node,
+                                              source.changelog.read(node),
+                                              patchfile, merge=domerge,
+                                              log=opts.get('log'),
+                                              filter=opts.get('filter'))
+                        except TransplantError:
+                            # Do not rollback, it is up to the user to
+                            # fix the merge or cancel everything
+                            tr.close()
+                            raise
                         if n and domerge:
                             self.ui.status(_('%s merged at %s\n') % (revstr,
                                       short(n)))
@@ -259,13 +268,13 @@
                 p2 = node
                 self.log(user, date, message, p1, p2, merge=merge)
                 self.ui.write(str(inst) + '\n')
-                raise util.Abort(_('fix up the merge and run '
-                                   'hg transplant --continue'))
+                raise TransplantError(_('fix up the merge and run '
+                                        'hg transplant --continue'))
         else:
             files = None
         if merge:
             p1, p2 = repo.dirstate.parents()
-            repo.dirstate.setparents(p1, node)
+            repo.setparents(p1, node)
             m = match.always(repo.root, '')
         else:
             m = match.exact(repo.root, '', files)
@@ -331,7 +340,7 @@
                     _('working dir not at transplant parent %s') %
                                  revlog.hex(parent))
             if merge:
-                repo.dirstate.setparents(p1, parents[1])
+                repo.setparents(p1, parents[1])
             n = repo.commit(message, user, date, extra=extra,
                             editor=self.editor)
             if not n:
--- a/i18n/ja.po	Wed Apr 18 01:20:16 2012 +0300
+++ b/i18n/ja.po	Wed May 02 12:55:44 2012 +0200
@@ -31,6 +31,7 @@
 # abort                 中断
 # add                   (構成管理への)追加登録
 # alias                 別名
+# amend                 改変 (※ 『破壊的修正』のニュアンス)
 # ancestor              祖先
 # apply                 適用
 # archive               アーカイブ
@@ -64,7 +65,9 @@
 # entry                 エントリ
 # extend(ed)            拡張
 # extension             (Mercurialの)エクステンション
-# glob(, rooted at ...) (... を起点とする)ワイルドカード形式
+# glob(, rooted at ...) ワイルドカード形式
+#                       (... からの相対パスに対して、
+#                        パス先頭からのパターン合致で判定する)
 # hash identifier(s)    ハッシュ値
 # head                  ヘッド
 # head changeset(s)     ヘッド
@@ -100,6 +103,7 @@
 # schedule              (add/remove の)予約
 # search                探索
 # server                サーバ
+# source url (of subrepo) (副リポジトリの)参照先 URL
 # subrepo               副リポジトリ
 # summary               要約(情報)
 # support(, not)        (未)サポート
@@ -118,7 +122,7 @@
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2012-03-30 18:05+0900\n"
+"POT-Creation-Date: 2012-05-01 17:15+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"
@@ -451,13 +455,13 @@
 "  images/** = jack, @designers"
 
 msgid ""
-"  # Everyone (except for \"user6\" - see acl.deny above) will have write\n"
-"  # access to any file under the \"resources\" folder (except for 1\n"
-"  # file. See acl.deny):\n"
+"  # Everyone (except for \"user6\" and \"@hg-denied\" - see acl.deny above)\n"
+"  # will have write access to any file under the \"resources\" folder\n"
+"  # (except for 1 file. See acl.deny):\n"
 "  src/main/resources/** = *"
 msgstr ""
-"  # acl.deny で禁止されている \"user6\" 以外の全てのユーザに対して\n"
-"  # (※ 訳注: グループ \"hg-denied\" も禁止されている筈)\n"
+"  # acl.deny で禁止されている \"user6\" ユーザおよび \"hg-denied\"\n"
+"  # グループに属するユーザ以外の、全てのユーザに対して\n"
 "  # \"resources\" 配下の任意のファイルへのアクセスを許可。\n"
 "  # 但し acl.deny で全ユーザにアクセス禁止されている\n"
 "  # src/main/resources/DONT-TOUCH-THIS.txt を除く:\n"
@@ -496,33 +500,45 @@
 "acl: ユーザ \"%s\" はファイル \"%s\" が許可されていません(リビジョン \"%s\")"
 
 msgid "hooks for integrating with the Bugzilla bug tracker"
-msgstr ""
+msgstr "Bugzilla バグ管理システムとの連携用フック集"
 
 msgid ""
 "This hook extension adds comments on bugs in Bugzilla when changesets\n"
 "that refer to bugs by Bugzilla ID are seen. The comment is formatted using\n"
 "the Mercurial template mechanism."
 msgstr ""
-
-msgid "The hook does not change bug status."
-msgstr ""
+"本エクステンションのフックは、 記録されたリビジョンからの Bugzilla バグ\n"
+"ID 検出を契機に、 Bugzilla 上のバグ情報に対して、 コメントを追加します。\n"
+"Mercurial のテンプレート機能を使うことで、 コメント形式を変更可能です。"
+
+msgid ""
+"The bug references can optionally include an update for Bugzilla of the\n"
+"hours spent working on the bug. Bugs can also be marked fixed."
+msgstr ""
+"コミットログからのバグIDの抽出では、 Bugzilla の「作業時間」を更新する、\n"
+"所要時間情報の取り出しも可能です (オプション)。 バグ状態を「解決済み」\n"
+"にすることも可能です。"
 
 msgid "Three basic modes of access to Bugzilla are provided:"
-msgstr ""
+msgstr "Bugzilla との連携方式は、 以下の3種類から選択できます:"
 
 msgid ""
 "1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later."
-msgstr ""
+msgstr "1. Bugzilla XMLRPC インタフェースを使用。 Bugzilla 3.4 以降が必要。"
 
 msgid ""
 "2. Check data via the Bugzilla XMLRPC interface and submit bug change\n"
 "   via email to Bugzilla email interface. Requires Bugzilla 3.4 or later."
 msgstr ""
+"2. データの確認に Bugzilla XMLRPC を、 コメントの追加に Bugzilla\n"
+"   メールインタフェースを使用。 Bugzilla 3.4 以降が必要。"
 
 msgid ""
 "3. Writing directly to the Bugzilla database. Only Bugzilla installations\n"
 "   using MySQL are supported. Requires Python MySQLdb."
 msgstr ""
+"3. Bugzilla データベースを直接操作。 MySQL を使用する Bugzilla 限定。\n"
+"   Python MySQLdb が必要。"
 
 msgid ""
 "Writing directly to the database is susceptible to schema changes, and\n"
@@ -533,16 +549,32 @@
 "MySQL user and password to have full access rights to the Bugzilla\n"
 "database. For these reasons this access mode is now considered\n"
 "deprecated, and will not be updated for new Bugzilla versions going\n"
-"forward."
-msgstr ""
+"forward. Only adding comments is supported in this access mode."
+msgstr ""
+"データベースの直接操作での連携は、 スキーマ変更の影響を受け易く、\n"
+"且つ、 コメント追加通知のメール送信に、 寄贈扱い (contrib) の Bugzilla\n"
+"スクリプトを必要とします。 Mercurial の実行ユーザの権限がそのまま、\n"
+"このスクリプトの実行権限となりますが、 Bugzilla の稼動ホスト上での実行で、\n"
+"且つ Bugzilla の設定ファイルの読み出し権限を持っている必要があります。\n"
+"それに加えて、 Bugzilla データベースに対して、 フルアクセス可能な MySQL\n"
+"ユーザの、 ユーザ名とパスワードが必要となります。 以上の条件から、\n"
+"この連携方式は、 現在は非推奨であり、 Bugzilla の更新にも対応しません。\n"
+"この連携方式では、 コメントの追加のみがサポートされています。"
 
 msgid ""
 "Access via XMLRPC needs a Bugzilla username and password to be specified\n"
 "in the configuration. Comments are added under that username. Since the\n"
 "configuration must be readable by all Mercurial users, it is recommended\n"
 "that the rights of that user are restricted in Bugzilla to the minimum\n"
-"necessary to add comments."
-msgstr ""
+"necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and "
+"later."
+msgstr ""
+"XMLRPC 連携では、 Bugzilla ユーザ名とパスワードを設定ファイルに記述し、\n"
+"当該ユーザの権限でコメントが追加されます。 ユーザ名とパスワードは、\n"
+"当該リポジトリ上で Mercurial を実行する、 全ユーザから参照可能なため、\n"
+"コメント追加に必要な権限しか持たない、 Bugzilla 連携専用ユーザで、\n"
+"運用する事を推奨します。 バグの状態を「解決済み」 (fixed) にするには、\n"
+"Bugzilla 4.0 版以降が必要です。"
 
 msgid ""
 "Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends\n"
@@ -551,16 +583,26 @@
 "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"
 "user, the email associated with the Bugzilla username used to log into\n"
-"Bugzilla is used instead as the source of the comment."
-msgstr ""
+"Bugzilla is used instead as the source of the comment. Marking bugs fixed\n"
+"works on all supported Bugzilla versions."
+msgstr ""
+"XMLRPC/email 連携では、 Bugzilla への問い合わせに XMLRPC を使用しますが、\n"
+"バグへのコメント追加には、 メールを使用します。 メールの From 欄には、\n"
+"各リビジョンに記録されたユーザ情報中の、 メールアドレスが使用されるため、 \n"
+"各リビジョンの作成者によって、 コメントが追加されたように見えます。\n"
+"リビジョンのメールアドレス情報が、 Bugzilla ユーザのものと対応しない場合、\n"
+"Bugzilla へのアクセスで使用されるユーザ名で、 メールが送信されます。\n"
+"サポート対象の全ての版の Bugzilla で、 バグの状態を「解決」にできます。"
 
 msgid "Configuration items common to all access modes:"
-msgstr ""
+msgstr "全連携方式で共通の設定項目は以下の通りです:"
 
 msgid ""
 "bugzilla.version\n"
 "  This access type to use. Values recognised are:"
 msgstr ""
+"bugzilla.version\n"
+"  連携方式の選択。 指定可能な値は以下の通り:"
 
 msgid ""
 "  :``xmlrpc``:       Bugzilla XMLRPC interface.\n"
@@ -571,20 +613,87 @@
 "  :``2.16``:         MySQL access, Bugzilla 2.16 and up to but not\n"
 "                     including 2.18."
 msgstr ""
+"  :``xmlrpc``:       Bugzilla XMLRPC 経由での連携\n"
+"  :``xmlrpc+email``: Bugzilla XMLRPC とメール経由での連携\n"
+"  :``3.0``:          MySQL 経由での連携: Bugzilla 3.0 以降限定\n"
+"  :``2.18``:         MySQL 経由での連携: Bugzilla 2.18 以上 3.0 未満限定\n"
+"  :``2.16``:         MySQL 経由での連携: Bugzilla 2.16 以上 2.18 未満限定"
 
 msgid ""
 "bugzilla.regexp\n"
-"  Regular expression to match bug IDs in changeset commit message.\n"
-"  Must contain one \"()\" group. The default expression matches ``Bug\n"
-"  1234``, ``Bug no. 1234``, ``Bug number 1234``, ``Bugs 1234,5678``,\n"
-"  ``Bug 1234 and 5678`` and variations thereof. Matching is case\n"
-"  insensitive."
-msgstr ""
+"  Regular expression to match bug IDs for update in changeset commit "
+"message.\n"
+"  It must contain one \"()\" named group ``<ids>`` containing the bug\n"
+"  IDs separated by non-digit characters. It may also contain\n"
+"  a named group ``<hours>`` with a floating-point number giving the\n"
+"  hours worked on the bug. If no named groups are present, the first\n"
+"  \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+"  updated. The default expression matches ``Bug 1234``, ``Bug no. 1234``,\n"
+"  ``Bug number 1234``, ``Bugs 1234,5678``, ``Bug 1234 and 5678`` and\n"
+"  variations thereof, followed by an hours number prefixed by ``h`` or\n"
+"  ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+"bugzilla.regexp\n"
+"  状態更新対象のバグID群を、 コミットログから抽出するための正規表現。\n"
+"  非数値文字で区切られたバグID群に合致する ``<ids>`` 名のグループ記述\n"
+"  ( \"()\") が必須です。 バグに対する作業時間を表す、 少数点数に合致する\n"
+"  ``<hours>`` 名グループも記述可能です。 名前付きグループ記述が無い場合、\n"
+"  最初の \"()\" グループがバグID群に、 作業時間の更新は無し、\n"
+"  とみなされます。 デフォルトの正規表現は ``Bug 1234``、 ``Bug no.\n"
+"  1234``、 ``Bug number 1234``、 ``Bugs 1234,5678``、 ``Bug 1234 and\n"
+"  5678`` および類似の形式に加えて、 前置詞に ``h`` ないし ``hours``\n"
+"  が付けられた時間数 (例: ``hours 1.5``) が続くものに合致します。\n"
+"  文字大小は無視されます。"
+
+msgid ""
+"bugzilla.fixregexp\n"
+"  Regular expression to match bug IDs for marking fixed in changeset\n"
+"  commit message. This must contain a \"()\" named group ``<ids>` "
+"containing\n"
+"  the bug IDs separated by non-digit characters. It may also contain\n"
+"  a named group ``<hours>`` with a floating-point number giving the\n"
+"  hours worked on the bug. If no named groups are present, the first\n"
+"  \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+"  updated. The default expression matches ``Fixes 1234``, ``Fixes bug "
+"1234``,\n"
+"  ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` and\n"
+"  variations thereof, followed by an hours number prefixed by ``h`` or\n"
+"  ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+"bugzilla.fixregexp\n"
+"  「解決済み」化するバグID群を、 コミットログから抽出するための正規表現。\n"
+"  非数値文字で区切られたバグID群に合致する ``<ids>`` 名のグループ記述\n"
+"  ( \"()\") が必須です。 バグに対する作業時間を表す、 少数点数に合致する\n"
+"  ``<hours>`` 名グループも記述可能です。 名前付きグループ記述が無い場合、\n"
+"  最初の \"()\" グループがバグID群に、 作業時間の更新は無し、\n"
+"  とみなされます。 デフォルトの正規表現は、 ``Fixes 1234``、 ``Fixes bug\n"
+"  1234``、 ``Fixes bugs 1234,5678``、 ``Fixes 1234 and 5678``\n"
+"  および類似の形式に加えて、 前置詞に ``h`` ないし ``hours``\n"
+"  が付けられた時間数 (例: ``hours 1.5``) が続くものに合致します。\n"
+"  文字大小は無視されます。"
+
+msgid ""
+"bugzilla.fixstatus\n"
+"  The status to set a bug to when marking fixed. Default ``RESOLVED``."
+msgstr ""
+"bugzilla.fixstatus\n"
+"  バグを「解決」状態にする際の「状態」値。 デフォルト値:\n"
+"  ``RESOLVED`` (対象済み)"
+
+msgid ""
+"bugzilla.fixresolution\n"
+"  The resolution to set a bug to when marking fixed. Default ``FIXED``."
+msgstr ""
+"bugzilla.fixresolution\n"
+"  バグを「解決」状態にする際の「対処方法」値。デフォルト値:\n"
+"  ``FIXED`` (修正済み)"
 
 msgid ""
 "bugzilla.style\n"
 "  The style file to use when formatting comments."
 msgstr ""
+"bugzilla.style\n"
+"  コメントの整形に使用するスタイルファイル。"
 
 msgid ""
 "bugzilla.template\n"
@@ -592,6 +701,9 @@
 "  specified. In addition to the usual Mercurial keywords, the\n"
 "  extension specifies:"
 msgstr ""
+"bugzilla.template\n"
+"  コメントの整形に使用するテンプレート。 スタイルファイル指定よりも、\n"
+"  こちらが優先します。 通常のものに加えて、 以下のキーワードが使用できます:"
 
 msgid ""
 "  :``{bug}``:     The Bugzilla bug ID.\n"
@@ -599,11 +711,17 @@
 "  :``{webroot}``: Stripped pathname of the Mercurial repository.\n"
 "  :``{hgweb}``:   Base URL for browsing Mercurial repositories."
 msgstr ""
+"  :``{bug}``:     Bugzilla のバグ ID\n"
+"  :``{root}``:    Mercurial リポジトリのフルパス\n"
+"  :``{webroot}``: Mercurial リポジトリのスラッシュ除外 (strip) 後パス\n"
+"  :``{hgweb}``:   Mercurial リポジトリの URL 生成用のベース URL"
 
 msgid ""
 "  Default ``changeset {node|short} in repo {root} refers to bug\n"
 "  {bug}.\\ndetails:\\n\\t{desc|tabindent}``"
 msgstr ""
+"  無指定の場合、 ``リポジトリ {root} のリビジョン {node|short} がバグ\n"
+"  {bug} に関連。\\n詳細:\\n\\t{desc|tabindent}`` が使用されます。"
 
 msgid ""
 "bugzilla.strip\n"
@@ -613,15 +731,24 @@
 "  ``/var/local/my-project`` with a strip of 2 gives a value for\n"
 "  ``{webroot}`` of ``my-project``. Default 0."
 msgstr ""
+"bugzilla.strip\n"
+"  テンプレートにおける ``{webroot}`` 相当を得るために、 Mercurial\n"
+"  リポジトリのパス (テンプレートの ``{root}`` 相当) 冒頭から、\n"
+"  取り除くスラッシュの数。 例えば ``{root}`` が ``/var/local/my-project``\n"
+"  のリポジトリで、 ``{webroot}`` を ``my-project`` にするためには、\n"
+"  strip に 2 を指定します。 デフォルト値は 0。"
 
 msgid ""
 "web.baseurl\n"
 "  Base URL for browsing Mercurial repositories. Referenced from\n"
 "  templates as ``{hgweb}``."
 msgstr ""
+"web.baseurl\n"
+"  Mercurial リポジトリの URL 生成用ベース URL。 テンプレートキーワード\n"
+"  ``{hgweb}`` で参照可能。"
 
 msgid "Configuration items common to XMLRPC+email and MySQL access modes:"
-msgstr ""
+msgstr "連携方式 XMLRPC+email と MySQL で共通の設定項目は以下の通りです:"
 
 msgid ""
 "bugzilla.usermap\n"
@@ -629,94 +756,134 @@
 "  mappings. If specified, the file should contain one mapping per\n"
 "  line::"
 msgstr ""
+"bugzilla.usermap\n"
+"  Mercurial の各リビジョンの、 生成者情報のメールアドレスと、 Bugzilla\n"
+"  ユーザのメールアドレスの、 対応一覧ファイルへのパス。 対象ファイルは、\n"
+"  1行1対応付けの、 以下の形式で記述してください::"
 
 msgid "    committer = Bugzilla user"
-msgstr ""
+msgstr "    リビジョン作成者 = Bugzilla ユーザ"
 
 msgid "  See also the ``[usermap]`` section."
-msgstr ""
+msgstr "  ``[usermap]`` セクションの説明も参照してください。"
 
 msgid ""
 "The ``[usermap]`` section is used to specify mappings of Mercurial\n"
 "committer email to Bugzilla user email. See also ``bugzilla.usermap``.\n"
 "Contains entries of the form ``committer = Bugzilla user``."
 msgstr ""
+"``[usermap]`` セクションは、 Mercurial の各リビジョンの、\n"
+"生成者情報のメールアドレスと、 Bugzilla ユーザのメールアドレスの、\n"
+"対応付けを行います。 ``bugzilla.usermap`` 設定の説明も参照してください。\n"
+"記述形式は ``リビジョン生成者 = Bugzilla ユーザ`` です。"
 
 msgid "XMLRPC access mode configuration:"
-msgstr ""
+msgstr "XMLRPC 連携固有の設定項目は以下の通りです:"
 
 msgid ""
 "bugzilla.bzurl\n"
 "  The base URL for the Bugzilla installation.\n"
 "  Default ``http://localhost/bugzilla``."
 msgstr ""
+"bugzilla.bzurl\n"
+"  アクセス先 Bugzilla のベース URL。\n"
+"  デフォルト値は ``http://localhost/bugzilla``。"
 
 msgid ""
 "bugzilla.user\n"
 "  The username to use to log into Bugzilla via XMLRPC. Default\n"
 "  ``bugs``."
 msgstr ""
+"bugzilla.user\n"
+"  Bugzilla との XMLRPC 連携で、 ログインに使用するユーザ名。\n"
+"  デフォルト値は ``bugs``。"
 
 msgid ""
 "bugzilla.password\n"
 "  The password for Bugzilla login."
 msgstr ""
+"bugzilla.password\n"
+"  Bugzilla 連携で、 ログインに使用するパスワード。"
 
 msgid ""
 "XMLRPC+email access mode uses the XMLRPC access mode configuration items,\n"
 "and also:"
 msgstr ""
+"XMLRPC+email 経由での連携では、 XMLRPC 経由連携に関する設定に加えて、\n"
+"以下の設定が必要です:"
 
 msgid ""
 "bugzilla.bzemail\n"
 "  The Bugzilla email address."
 msgstr ""
+"bugzilla.bzemail\n"
+"  Bugzilla へ送信する際の宛先メールアドレス。"
 
 msgid ""
 "In addition, the Mercurial email settings must be configured. See the\n"
 "documentation in hgrc(5), sections ``[email]`` and ``[smtp]``."
 msgstr ""
+"以上の設定に加えて、 Mercurial のメール設定も必要です。 hgrc(5)\n"
+"ドキュメント (※ 訳注: :hg:`help config` でも参照可能) の ``[email]``\n"
+"および ``[smtp]`` セクションを参照してください。"
 
 msgid "MySQL access mode configuration:"
-msgstr ""
+msgstr "MySQL 経由連携固有の設定項目は以下の通りです:"
 
 msgid ""
 "bugzilla.host\n"
 "  Hostname of the MySQL server holding the Bugzilla database.\n"
 "  Default ``localhost``."
 msgstr ""
+"bugzilla.host\n"
+"  Bugzilla データベースを持つ MySQL サーバのホスト名。\n"
+"  デフォルト値は ``localhost``。"
 
 msgid ""
 "bugzilla.db\n"
 "  Name of the Bugzilla database in MySQL. Default ``bugs``."
 msgstr ""
+"bugzilla.db\n"
+"  MySQL における Bugzilla データベースの名前。 デフォルト値は ``bugs``。"
 
 msgid ""
 "bugzilla.user\n"
 "  Username to use to access MySQL server. Default ``bugs``."
 msgstr ""
+"bugzilla.user\n"
+"  MySQL サーバへのアクセスに使用するユーザ名。 デフォルト値は ``bugs``。"
 
 msgid ""
 "bugzilla.password\n"
 "  Password to use to access MySQL server."
 msgstr ""
+"bugzilla.password\n"
+"  MySQL サーバへのアクセスに使用するパスワード。"
 
 msgid ""
 "bugzilla.timeout\n"
 "  Database connection timeout (seconds). Default 5."
 msgstr ""
+"bugzilla.timeout\n"
+"  データベース接続のタイムアウト指定 (単位:秒)。 デフォルト値は 5。"
 
 msgid ""
 "bugzilla.bzuser\n"
 "  Fallback Bugzilla user name to record comments with, if changeset\n"
 "  committer cannot be found as a Bugzilla user."
 msgstr ""
+"bugzilla.bzuser\n"
+"  リビジョン生成者名が、 Bugzilla ユーザと対応しない場合に、\n"
+"  コメント追加に使用する Bugzilla ユーザ名 (予備設定)"
 
 msgid ""
 "bugzilla.bzdir\n"
 "   Bugzilla install directory. Used by default notify. Default\n"
 "   ``/var/www/html/bugzilla``."
 msgstr ""
+"bugzilla.bzdir\n"
+"   Bugzilla のインストール先ディレクトリ。 デフォルトの ``notify``\n"
+"   設定において使用されます。 デフォルト値は ``/var/www/html/bugzilla``。"
 
 msgid ""
 "bugzilla.notify\n"
@@ -726,20 +893,33 @@
 "  version; from 2.18 it is \"cd %(bzdir)s && perl -T\n"
 "  contrib/sendbugmail.pl %(id)s %(user)s\"."
 msgstr ""
+"bugzilla.notify\n"
+"  バグ情報の更新通知を、 Bugzilla にメール送信させるコマンド。\n"
+"  3つのキーワード ``bzdir``、 ``id`` (バグ ID) および ``user``\n"
+"  (リビジョン作成者の Bugzilla メールアドレス) が、 置換指定可能です。\n"
+"  デフォルト値は MySQL のバージョンに依存しており、 2.18 版以降では、\n"
+"  \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl %(id)s %(user)s\"\n"
+"  が使用されます。"
 
 msgid "Activating the extension::"
-msgstr ""
+msgstr "エクステンションの有効化::"
 
 msgid ""
 "    [extensions]\n"
 "    bugzilla ="
 msgstr ""
+"    [extensions]\n"
+"    bugzilla ="
 
 msgid ""
 "    [hooks]\n"
 "    # run bugzilla hook on every change pulled or pushed in here\n"
 "    incoming.bugzilla = python:hgext.bugzilla.hook"
 msgstr ""
+"    [hooks]\n"
+"    # リビジョンが当該リポジトリに push/pull で取り込まれた契機で\n"
+"    # Bugzilla 連携のフックを実行\n"
+"    incoming.bugzilla = python:hgext.bugzilla.hook"
 
 msgid "Example configurations:"
 msgstr "設定例:"
@@ -751,6 +931,11 @@
 "collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
 "with a web interface at ``http://my-project.org/hg``. ::"
 msgstr ""
+"以下は XMLRPC 連携の設定例です。 ``http://my-project.org/bugzilla`` の\n"
+"Bugzilla と連携し、 ユーザ名 ``bugmail@my-project.org``、 パスワード\n"
+"``plugh`` でログインします。 URL ``http://my-project.org/hg``\n"
+"配下でアクセスする、 ``/var/local/hg/repos/`` 配下の複数リポジトリでの、\n"
+"設定共有を想定しています::"
 
 msgid ""
 "    [bugzilla]\n"
@@ -763,11 +948,22 @@
 "             {desc}\\n\n"
 "    strip=5"
 msgstr ""
+"    [bugzilla]\n"
+"    bzurl=http://my-project.org/bugzilla\n"
+"    user=bugmail@my-project.org\n"
+"    password=plugh\n"
+"    version=xmlrpc\n"
+"    template=Changeset {node|short} in {root|basename}.\n"
+"             {hgweb}/{webroot}/rev/{node|short}\\n\n"
+"             {desc}\\n\n"
+"    strip=5"
 
 msgid ""
 "    [web]\n"
 "    baseurl=http://my-project.org/hg"
 msgstr ""
+"    [web]\n"
+"    baseurl=http://my-project.org/hg"
 
 msgid ""
 "XMLRPC+email example configuration. This uses the Bugzilla at\n"
@@ -778,6 +974,12 @@
 "are sent to the Bugzilla email address\n"
 "``bugzilla@my-project.org``. ::"
 msgstr ""
+"以下は XMLRPC+email 連携の設定例です。 ``http://my-project.org/bugzilla``\n"
+"の Bugzilla と連携し、 ユーザ名 ``bugmail@my-project.org``、 パスワード\n"
+"``plugh`` でログインします。 URL ``http://my-project.org/hg``\n"
+"配下でアクセスする、 ``/var/local/hg/repos/`` 配下の複数リポジトリでの、\n"
+"設定共有を想定しています。 コメントの追加は、 Bugzilla のメールアドレス\n"
+"``bugzilla@my-project.org`` 宛に送信されます::"
 
 msgid ""
 "    [bugzilla]\n"
@@ -791,11 +993,23 @@
 "             {desc}\\n\n"
 "    strip=5"
 msgstr ""
+"    [bugzilla]\n"
+"    bzurl=http://my-project.org/bugzilla\n"
+"    user=bugmail@my-project.org\n"
+"    password=plugh\n"
+"    version=xmlrpc\n"
+"    bzemail=bugzilla@my-project.org\n"
+"    template=Changeset {node|short} in {root|basename}.\n"
+"             {hgweb}/{webroot}/rev/{node|short}\\n\n"
+"             {desc}\\n\n"
+"    strip=5"
 
 msgid ""
 "    [usermap]\n"
 "    user@emaildomain.com=user.name@bugzilladomain.com"
 msgstr ""
+"    [usermap]\n"
+"    user@emaildomain.com=user.name@bugzilladomain.com"
 
 msgid ""
 "MySQL example configuration. This has a local Bugzilla 3.2 installation\n"
@@ -805,6 +1019,14 @@
 "with a collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
 "with a web interface at ``http://my-project.org/hg``. ::"
 msgstr ""
+"以下は MySQL 連携の設定例です。 ``/opt/bugzilla-3.2`` にインストールされた\n"
+"Bugzilla 3.2 を想定しています。 MySQL サーバのホスト名が ``localhost``、\n"
+"Bugzilla データベース名が ``bugs``、 MySQL サーバへのアクセスに、\n"
+"ユーザ名 ``bugs``、 パスワード ``XYZZY`` を使用します。 URL\n"
+"``http://my-project.org/hg``\n"
+"配下でアクセスする、\n"
+"``/var/local/hg/repos/`` 配下の複数リポジトリでの、\n"
+"設定共有を想定しています::"
 
 msgid ""
 "    [bugzilla]\n"
@@ -818,17 +1040,30 @@
 "             {desc}\\n\n"
 "    strip=5"
 msgstr ""
+"    [bugzilla]\n"
+"    host=localhost\n"
+"    password=XYZZY\n"
+"    version=3.0\n"
+"    bzuser=unknown@domain.com\n"
+"    bzdir=/opt/bugzilla-3.2\n"
+"    template=Changeset {node|short} in {root|basename}.\n"
+"             {hgweb}/{webroot}/rev/{node|short}\\n\n"
+"             {desc}\\n\n"
+"    strip=5"
 
 msgid "All the above add a comment to the Bugzilla bug record of the form::"
 msgstr ""
+"上記設定例で Bugzilla に追加されるコメントは、 全て以下の形式となります::"
 
 msgid ""
 "    Changeset 3b16791d6642 in repository-name.\n"
 "    http://my-project.org/hg/repository-name/rev/3b16791d6642"
 msgstr ""
+"    Changeset 3b16791d6642 in repository-name.\n"
+"    http://my-project.org/hg/repository-name/rev/3b16791d6642"
 
 msgid "    Changeset commit comment. Bug 1234.\n"
-msgstr ""
+msgstr "    (※ ここには各リビジョンのコミットログが展開されます)\n"
 
 #, python-format
 msgid "python mysql support not available: %s"
@@ -850,6 +1085,10 @@
 msgstr "未知のデータベーススキーマ"
 
 #, python-format
+msgid "bug %d does not exist\n"
+msgstr "バグ %d は存在しません\n"
+
+#, python-format
 msgid "bug %d already knows about changeset %s\n"
 msgstr "バグ %d にとってリビジョン %s は既知のものです\n"
 
@@ -883,6 +1122,12 @@
 msgid "cannot find bugzilla user id for %s or %s"
 msgstr "%s か %s の buzilla ユーザ ID を見つけることができません"
 
+msgid "Bugzilla/MySQL cannot update bug state\n"
+msgstr "Bugzilla/MySQL 連携ではバグ状態を更新できません\n"
+
+msgid "Bugzilla/XMLRPC needs Bugzilla 4.0 or later to mark bugs fixed\n"
+msgstr "Bugzilla/XMLRPC 連携でのバグ状態更新は Bugzilla 4.0 以降が必要です\n"
+
 msgid "configuration 'bzemail' missing"
 msgstr "'bzemail' 設定が見つかりません"
 
@@ -894,6 +1139,10 @@
 msgid "bugzilla version %s not supported"
 msgstr "bugzilla のバージョン %s は未サポートです"
 
+#, python-format
+msgid "%s: invalid hours\n"
+msgstr "%s: 不正な時間指定です\n"
+
 msgid ""
 "changeset {node|short} in repo {root} refers to bug {bug}.\n"
 "details:\n"
@@ -1934,8 +2183,8 @@
 msgstr "変換元の種別が bzr であると特定できません\n"
 
 #, python-format
-msgid "%s is not a valid revision in current branch"
-msgstr "%s は現在のブランチの正しいリビジョンではありません"
+msgid "%s is not a valid revision"
+msgstr "%s は有効なリビジョンではありません"
 
 #, python-format
 msgid "%s is not available in %s anymore"
@@ -2865,6 +3114,74 @@
 msgid "hg %s [OPTION]... [FILE]..."
 msgstr "hg %s [OPTION]... [FILE]..."
 
+msgid "http authentication with factotum"
+msgstr "factotum での http 認証"
+
+msgid ""
+"This extension allows the factotum facility on Plan 9 from Bell Labs "
+"platforms\n"
+"to provide authentication information for HTTP access. Configuration "
+"entries\n"
+"specified in the auth section as well as authentication information "
+"provided\n"
+"in the repository URL are fully supported. If no prefix is specified, a "
+"value\n"
+"of ``*`` will be assumed."
+msgstr ""
+"本エクステンションは、 Bell Labs の Plan 9 環境における factotum 機能を、\n"
+"HTTP アクセスでの認証情報取得で、 利用できるようにします。 連携対象の\n"
+"URL 中の認証情報同様に、 設定ファイルの auth セクションにおける設定も、\n"
+"サポート対象です。 設定において、 値が指定されない場合は、\n"
+"``*`` 指定とみなされます。"
+
+msgid "By default, keys are specified as::"
+msgstr "デフォルトでは、 キーの指定は以下のように行います::"
+
+msgid ""
+"  proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
+msgstr ""
+"  proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
+
+msgid ""
+"If the factotum extension is unable to read the required key, one will be\n"
+"requested interactively."
+msgstr ""
+"必要なキーを読み込めない場合、 factotum エクステンションは、\n"
+"対話的なキーの要求を行います。"
+
+msgid ""
+"A configuration section is available to customize runtime behavior. By\n"
+"default, these entries are::"
+msgstr ""
+"実行時の挙動は、 設定によって変更可能です。 デフォルトの設定は、\n"
+"以下のようになっています::"
+
+msgid ""
+"  [factotum]\n"
+"  executable = /bin/auth/factotum\n"
+"  mountpoint = /mnt/factotum\n"
+"  service = hg"
+msgstr ""
+"  [factotum]\n"
+"  executable = /bin/auth/factotum\n"
+"  mountpoint = /mnt/factotum\n"
+"  service = hg"
+
+msgid ""
+"The executable entry defines the full path to the factotum binary. The\n"
+"mountpoint entry defines the path to the factotum file service. Lastly, the\n"
+"service entry controls the service name used when reading keys."
+msgstr ""
+"executable 設定は、 factotum バイナリへのフルパスを指定します。\n"
+"mountpoint 設定は、 factotum ファイルサービスを指定します。\n"
+"service 設定は、 キーの読み込みに使用するサービス名を制御します。"
+
+msgid "factotum not interactive"
+msgstr "factotum が対話的に実行されていません"
+
+msgid "factotum not responding"
+msgstr "factotum が応答しません"
+
 msgid "pull, update and merge in one command"
 msgstr "pull, update, merge の一括実行"
 
@@ -2889,15 +3206,13 @@
 "    それ以外の場合は、 作業領域が最新のリビジョンに更新されます。"
 
 msgid ""
-"    When a merge occurs, the newly pulled changes are assumed to be\n"
-"    \"authoritative\". The head of the new changes is used as the first\n"
-"    parent, with local changes as the second. To switch the merge\n"
-"    order, use --switch-parent."
-msgstr ""
-"    マージが実施される場合、 取り込まれた変更は、 \"信頼できる\"\n"
-"    ものと仮定されます。 取り込まれた変更側のヘッドを第1親、\n"
-"    手元の側のヘッドを第2親として、 マージが実施されます。\n"
-"    --switch-parent 指定により、 マージの親リビジョンを入れ替えられます。"
+"    When a merge is needed, the working directory is first updated to\n"
+"    the newly pulled changes. Local changes are then merged into the\n"
+"    pulled changes. To switch the merge order, use --switch-parent."
+msgstr ""
+"    マージの必要がある場合、 取り込まれた変更による作業領域の更新が、\n"
+"    最初に実施されます。 次に、 手元の変更が作業領域にマージされます。\n"
+"    マージの順序を変更する場合は、 --switch-parent を指定します。"
 
 msgid "    See :hg:`help dates` for a list of formats valid for -d/--date."
 msgstr "    -d/--date での日時表記は :hg:`help dates` を参照してください。"
@@ -3086,23 +3401,64 @@
 msgid "-G/--graph option is incompatible with --%s"
 msgstr "-G/--graph と --%s は併用できません"
 
-msgid "-G/--graph option is incompatible with --follow with file argument"
-msgstr "-G/--graph と、ファイル名指定付きの --follow は併用できません"
-
-msgid "NUM"
-msgstr "数値"
-
-msgid "limit number of changes displayed"
-msgstr "最大表示リビジョン数"
-
-msgid "show patch"
-msgstr "パッチ形式での表示"
+#, python-format
+msgid "cannot follow file not in parent revision: \"%s\""
+msgstr "親リビジョンに存在しないファイルは追跡できません: \"%s\""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr "存在しないファイルは追跡できません: \"%s\""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr "ファイル名が明示された場合のみ複製/改名を追跡可能です"
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr "複製元や改名元の履歴も遡る"
+
+msgid "only follow the first parent of merge changesets (DEPRECATED)"
+msgstr "マージの際には第1親のみを遡る (DEPRECATED)"
+
+msgid "show revisions matching date spec"
+msgstr "指定日時に合致するリビジョンを表示"
+
+msgid "show copied files"
+msgstr "複製されたファイルを表示"
+
+msgid "do case-insensitive search for a given text"
+msgstr "指定キーワードによる検索(大文字小文字は無視)"
 
 msgid "show the specified revision or range"
 msgstr "指定された単一、 ないしリビジョン区間の表示"
 
-msgid "hg glog [OPTION]... [FILE]"
-msgstr "hg glog [OPTION]... [FILE]"
+msgid "include revisions where files were removed"
+msgstr "ファイルが登録除外されたリビジョンを含める"
+
+msgid "show only merges (DEPRECATED)"
+msgstr "マージ実施リビジョンのみを表示 (DEPRECATED)"
+
+msgid "USER"
+msgstr "ユーザ"
+
+msgid "revisions committed by user"
+msgstr "当該ユーザによるリビジョンを表示"
+
+msgid "show only changesets within the given named branch (DEPRECATED)"
+msgstr "指定の名前付きブランチに属するリビジョンを表示 (非推奨)"
+
+msgid "BRANCH"
+msgstr "ブランチ"
+
+msgid "show changesets within the given named branch"
+msgstr "指定の名前付きブランチに属するリビジョンを表示"
+
+msgid "do not display revision or any of its ancestors"
+msgstr "当該リビジョンとその祖先の表示を抑止"
+
+msgid "show hidden changesets (DEPRECATED)"
+msgstr "隠れたリビジョンの表示 (DEPRECATED)"
+
+msgid "[OPTION]... [FILE]"
+msgstr "[OPTION]... [FILE]"
 
 msgid "show revision history alongside an ASCII revision graph"
 msgstr "ASCII 文字による履歴ツリー併用の履歴表示"
@@ -3302,6 +3658,12 @@
 msgid "start interactive history viewer"
 msgstr "対話的な履歴参照の開始"
 
+msgid "NUM"
+msgstr "数値"
+
+msgid "limit number of changes displayed"
+msgstr "最大表示リビジョン数"
+
 msgid "hg view [-l LIMIT] [REVRANGE]"
 msgstr "hg view [-l LIMIT] [REVRANGE]"
 
@@ -4190,6 +4552,10 @@
 msgid "%d largefiles updated, %d removed\n"
 msgstr "大容量ファイルの更新数 %d、 削除数 %d\n"
 
+#, python-format
+msgid "largefile %s is not in cache and could not be downloaded"
+msgstr "大容量ファイル %s はキャッシュされておらず、ダウンロードもできません"
+
 msgid "minimum size (MB) for files to be converted as largefiles"
 msgstr "大容量ファイル化するファイルの最小サイズ (MB)"
 
@@ -4433,8 +4799,7 @@
 msgid ""
 "add all files above this size (in megabytes) as largefiles (default: 10)"
 msgstr ""
-"指定サイズ (メガバイト) 以上のファイルを、大容量ファイルとして追加 (既定値: "
-"10)"
+"指定サイズ (単位:MB) 以上のファイルを、 大容量ファイルとして追加 (既定値:10)"
 
 msgid "verify largefiles"
 msgstr "大容量ファイルを検証"
@@ -5029,8 +5394,8 @@
 msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE..."
 msgstr "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE..."
 
-msgid "import a patch"
-msgstr "パッチの取り込み"
+msgid "import a patch or existing changeset"
+msgstr "パッチないし既存リビジョンの取り込み"
 
 msgid ""
 "    The patch is inserted into the series after the last applied\n"
@@ -5240,9 +5605,6 @@
 msgid "add \"From: <current user>\" to patch"
 msgstr "\"From: <現ユーザ名>\" をパッチに追加"
 
-msgid "USER"
-msgstr "ユーザ"
-
 msgid "add \"From: <USER>\" to patch"
 msgstr "\"From: <ユーザ>\" をパッチに追加"
 
@@ -5309,7 +5671,7 @@
 "    "
 
 msgid "refresh only files already in the patch and specified files"
-msgstr "既存のパッチ対象に加え、明示されたファイルを処理対象にする"
+msgstr "明示されたファイルに加えて、 既存のパッチ対象ファイルも更新"
 
 msgid "add/update author field in patch with current user"
 msgstr "パッチ作成者情報を現行ユーザに設定"
@@ -5342,8 +5704,8 @@
 "    If -s/--short is specified, files currently included in the patch\n"
 "    will be refreshed just like matched files and remain in the patch."
 msgstr ""
-"    -s/--short が指定された場合、 現行パッチが変更を保持するファイルのみが\n"
-"    パッチ内容更新の対象となって、 パッチにとどまり続けます。"
+"    -s/--short が指定された場合、 現行パッチが変更を保持するファイルは、\n"
+"    ファイル指定されたものとみなされ、 パッチにとどまり続けます。"
 
 msgid ""
 "    If -e/--edit is specified, Mercurial will start your configured editor "
@@ -6039,14 +6401,13 @@
 
 msgid ""
 "First, enable the extension as explained in :hg:`help extensions`, and\n"
-"register the hook you want to run. ``incoming`` and ``outgoing`` hooks\n"
+"register the hook you want to run. ``incoming`` and ``changegroup`` hooks\n"
 "are run by the changesets receiver while the ``outgoing`` one is for\n"
 "the sender::"
 msgstr ""
 ":hg:`help extensions` にならって、 本エクステンションを有効にした上で、\n"
-"実行したいフックを登録してください。 `incoming`` および ``outgoing``\n"
-"(※ 訳注: ``changegroup`` の間違い?) フックは反映「先」で、\n"
-"``outgoing`` は反映「元」で実行されます::"
+"実行したいフックを登録してください。 `incoming`` および ``changegroup``\n"
+"フックは反映「先」で、 ``outgoing`` は反映「元」で実行されます::"
 
 msgid ""
 "  [hooks]\n"
@@ -6506,6 +6867,9 @@
 "設定ファイルに関するドキュメント (hgrc(5)) を参照してください。\n"
 "(※ 訳注: :hg:`help config` でも参照可能)\n"
 
+msgid "send patches as inline message text (default)"
+msgstr "インラインメッセージとしてパッチを送信 (デフォルト)"
+
 msgid "send patches as attachments"
 msgstr "添付ファイルとしてパッチを送信"
 
@@ -6627,11 +6991,16 @@
 "    By default the patch is included as text in the email body for\n"
 "    easy reviewing. Using the -a/--attach option will instead create\n"
 "    an attachment for the patch. With -i/--inline an inline attachment\n"
-"    will be created."
-msgstr ""
-"    特に指定の無い場合、 パッチはメール本文中に通常テキストとして埋め込ま\n"
-"    れます。 -a/--attach 指定により、 パッチが添付ファイル化されます。\n"
-"    -i/--inline 指定により、 インライン添付ファイルとなります。"
+"    will be created. You can include a patch both as text in the email\n"
+"    body and as a regular or an inline attachment by combining the\n"
+"    -a/--attach or -i/--inline with the --body option."
+msgstr ""
+"    特に指定の無い場合、 メール本文中の通常テキストとして、\n"
+"    パッチが埋め込まれます。 -a/--attach が指定された場合は、\n"
+"    パッチは添付ファイル化されます。 -i/--inline が指定された場合は、\n"
+"    インライン添付ファイルとなります。 -a/--attach ないし -i/--inline と\n"
+"    --body を組み合わせることで、 パッチの格納先を、 メール本文や、\n"
+"    インラインないし通常の添付ファイルから、 選択することができます。"
 
 msgid ""
 "    With -o/--outgoing, emails will be generated for patches not found\n"
@@ -7304,8 +7673,8 @@
 msgid "%d hunks, %d lines changed\n"
 msgstr "%d 個のハンク、 %d 行の変更\n"
 
-msgid "[Ynsfdaq?]"
-msgstr "[Ynsfdaq?]"
+msgid "[Ynesfdaq?]"
+msgstr "[Ynesfdaq?]"
 
 msgid "&Yes, record this change"
 msgstr "&Yes - この変更を記録します"
@@ -7313,6 +7682,9 @@
 msgid "&No, skip this change"
 msgstr "&No - この変更をスキップします"
 
+msgid "&Edit the change manually"
+msgstr "&Edit - 変更を手動で改変します"
+
 msgid "&Skip remaining changes to this file"
 msgstr "&Skip - このファイルの残りの変更を全てスキップします"
 
@@ -7331,6 +7703,38 @@
 msgid "&?"
 msgstr "&?"
 
+msgid "cannot edit patch for whole file"
+msgstr "ファイル全体に対するパッチの手動改変できません"
+
+msgid "cannot edit patch for binary file"
+msgstr "バイナリファイル向けパッチの手動改変はできません"
+
+msgid ""
+"\n"
+"To remove '-' lines, make them ' ' lines (context).\n"
+"To remove '+' lines, delete them.\n"
+"Lines starting with # will be removed from the patch."
+msgstr ""
+"\n"
+"'-' 行の削除は、行の ' ' (コンテキスト行)化で行います。\n"
+"'+' 行の削除は、行自体の削除で行います。\n"
+"'#' で始まる行は、パッチから除外されます。"
+
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"added to the record list. If it does not apply cleanly, a rejects\n"
+"file will be generated: you can use that when you try again. If\n"
+"all lines of the hunk are removed, then the edit is aborted and\n"
+"the hunk is left unchanged.\n"
+msgstr ""
+"パッチ適用が成功した場合、 変更後のハンクは、 適用対象に追加されます。\n"
+"適用が失敗した場合、 失敗ハンクはファイルに保存されます。 再試行の際は、\n"
+"このファイルを利用可能です。 ハンクの全行が削除された場合、\n"
+"改変作業は中断され、ハンクはそのまま維持されます。\n"
+
+msgid "edit failed"
+msgstr "編集に失敗"
+
 msgid "user quit"
 msgstr "ユーザの指示により終了します"
 
@@ -7373,10 +7777,12 @@
 
 msgid ""
 "      y - record this change\n"
-"      n - skip this change"
+"      n - skip this change\n"
+"      e - edit this change manually"
 msgstr ""
 "      y - この変更を記録します\n"
-"      n - この変更をスキップします"
+"      n - この変更をスキップします\n"
+"      e - この変更を手動で改変します"
 
 msgid ""
 "      s - skip remaining changes to this file\n"
@@ -7693,6 +8099,10 @@
 msgstr "マージ実施リビジョン %s:%s を無視\n"
 
 #, python-format
+msgid "%s is not a parent of %s"
+msgstr "%s は %s の親リビジョンではありません"
+
+#, python-format
 msgid "%s merged at %s\n"
 msgstr "%s を %s にマージ\n"
 
@@ -7760,9 +8170,6 @@
 msgid "pull patches from REPO"
 msgstr "指定リポジトリからの取り込み"
 
-msgid "BRANCH"
-msgstr "ブランチ"
-
 msgid "pull patches from branch BRANCH"
 msgstr "指定ブランチからの取り込み"
 
@@ -7775,6 +8182,9 @@
 msgid "merge at REV"
 msgstr "指定リビジョンの移植をマージで実現"
 
+msgid "parent to choose when transplanting merge"
+msgstr "移植でのマージに使用する親リビジョン"
+
 msgid "append transplant info to log message"
 msgstr "コミットログへの移植情報の付与"
 
@@ -7861,6 +8271,13 @@
 "    原文から大幅に改変してあります。 適宜原文のヘルプも参照してください)"
 
 msgid ""
+"    Merge changesets may be transplanted directly by specifying the\n"
+"    proper parent changeset by calling :hg:`transplant --parent`."
+msgstr ""
+"    :hg:`transplant --parent` 実行での、 適切な親リビジョン指定により、\n"
+"    マージ実施リビジョンを、 直接移植可能です。"
+
+msgid ""
 "    If no merges or revisions are provided, :hg:`transplant` will\n"
 "    start an interactive changeset browser."
 msgstr ""
@@ -8405,17 +8822,6 @@
 msgstr "リビジョンに一致する日付がありません"
 
 #, python-format
-msgid "cannot follow file not in parent revision: \"%s\""
-msgstr "親リビジョンに存在しないファイルは追跡できません: \"%s\""
-
-#, python-format
-msgid "cannot follow nonexistent file: \"%s\""
-msgstr "存在しないファイルは追跡できません: \"%s\""
-
-msgid "can only follow copies/renames for explicit filenames"
-msgstr "ファイル名が明示された場合のみ複製/改名を追跡可能です"
-
-#, python-format
 msgid "adding %s\n"
 msgstr "%s を追加登録中\n"
 
@@ -8423,6 +8829,22 @@
 msgid "skipping missing subrepository: %s\n"
 msgstr "存在しない副リポジトリへの処理を省略: %s\n"
 
+#, python-format
+msgid "amending changeset %s\n"
+msgstr "リビジョン %s を改変中\n"
+
+#, python-format
+msgid "copying changeset %s to %s\n"
+msgstr "リビジョン %s を %s にコピー中\n"
+
+#, python-format
+msgid "stripping intermediate changeset %s\n"
+msgstr "中途リビジョン %s を除外中\n"
+
+#, python-format
+msgid "stripping amended changeset %s\n"
+msgstr "改変対象リビジョン %s を除外中\n"
+
 msgid "HG: Enter commit message.  Lines beginning with 'HG:' are removed."
 msgstr ""
 "HG: コミットメッセージを入力してください。  HG: で始まる行は無視されます。"
@@ -8463,6 +8885,30 @@
 msgid "empty commit message"
 msgstr "コミットメッセージがありません"
 
+#, python-format
+msgid "forgetting %s\n"
+msgstr "%s の追加登録を取り消し中\n"
+
+#, python-format
+msgid "reverting %s\n"
+msgstr "%s の復旧中\n"
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr "%s の復旧中\n"
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr "現行版の %s を %s に保存中\n"
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr "ファイル %s は管理対象ではありません\n"
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr "%s には改変の必要がありません\n"
+
 msgid "repository root directory or name of overlay bundle file"
 msgstr "リポジトリのルート位置、 ないしバンドルファイルのパス"
 
@@ -8562,6 +9008,9 @@
 msgid "display with template"
 msgstr "当該テンプレートで表示をカスタマイズ"
 
+msgid "show patch"
+msgstr "パッチ形式での表示"
+
 msgid "do not show merges"
 msgstr "マージ実施リビジョンの表示抑止"
 
@@ -8937,10 +9386,6 @@
 msgid "cannot backout a merge changeset"
 msgstr "マージ実施リビジョンは打ち消し対象にできません"
 
-#, python-format
-msgid "%s is not a parent of %s"
-msgstr "%s は %s の親リビジョンではありません"
-
 msgid "cannot use --parent on non-merge changeset"
 msgstr "非マージリビジョンには --parent を指定できません"
 
@@ -9460,12 +9905,12 @@
 "    成功時のコマンドの終了値は 0、 変更が検出できない場合は 1 です。\n"
 "    "
 
+msgid "unknown bundle type specified with --type"
+msgstr "--type に未知のバンドル種別が指定されました"
+
 msgid "--base is incompatible with specifying a destination"
 msgstr "--base と連携対象は同時には指定できません"
 
-msgid "unknown bundle type specified with --type"
-msgstr "--type に未知のバンドル種別が指定されました"
-
 msgid "print output to file with formatted name"
 msgstr "ファイル内容の保存先"
 
@@ -9700,6 +10145,9 @@
 msgid "mark a branch as closed, hiding it from the branch list"
 msgstr "ブランチを閉鎖し、 ブランチ一覧での表示から除外"
 
+msgid "amend the parent of the working dir"
+msgstr "作業領域の親リビジョンの改変"
+
 msgid "commit the specified files or all outstanding changes"
 msgstr "指定ファイルないし全ての変更内容のリポジトリへの記録"
 
@@ -9738,6 +10186,41 @@
 "    入力したメッセージは ``.hg/last-message.txt`` に保存されます。"
 
 msgid ""
+"    The --amend flag can be used to amend the parent of the\n"
+"    working directory with a new commit that contains the changes\n"
+"    in the parent in addition to those currently reported by :hg:`status`,\n"
+"    if there are any. The old commit is stored in a backup bundle in\n"
+"    ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`\n"
+"    on how to restore it)."
+msgstr ""
+"    --amend を指定した場合、 作業領域の親リビジョンの持つ変更内容に、\n"
+"    :hg:`status` が表示する変更内容 (変更がある場合) を加えたもので、\n"
+"    作業領域の親リビジョンを改変します。 改変前のリビジョンの内容は、\n"
+"    バンドル形式で ``.hg/strip-backup`` にバックアップされます。\n"
+"    (復旧方法は :hg:`help bundle` および :hg:`help unbundle` を参照).\n"
+"    (※ 訳注: --amend 指定時は、 対象ファイルを指定しても、\n"
+"    追加記録分の選択にのみ使用され、 記録済みファイルの取捨選択には、\n"
+"    影響しません。 MQ エクステンションの hg:`qrefresh` における\n"
+"    ``--short`` 指定と同等な挙動となります。)"
+
+msgid ""
+"    Message, user and date are taken from the amended commit unless\n"
+"    specified. When a message isn't specified on the command line,\n"
+"    the editor will open with the message of the amended commit."
+msgstr ""
+"    コミットログ、 ユーザ名、 記録日付は、 明示的な指定が無い限り、\n"
+"    改変対象のリビジョンのものが再利用されます。 コマンド行において、\n"
+"    コミットログが指定されない場合、 改変前のメッセージを使って、\n"
+"    エディタが起動されます。"
+
+msgid ""
+"    It is not possible to amend public changesets (see :hg:`help phases`)\n"
+"    or changesets that have children."
+msgstr ""
+"    public フェーズ (:hg:`help phases` 参照) のリビジョンや、\n"
+"    既に子リビジョンを持つリビジョンは、 改変できません "
+
+msgid ""
 "    Returns 0 on success, 1 if nothing changed.\n"
 "    "
 msgstr ""
@@ -9747,13 +10230,28 @@
 msgid "can only close branch heads"
 msgstr "ブランチヘッドのみ閉鎖できます"
 
+msgid "cannot amend recursively"
+msgstr "副リポジトリを含む再帰的な改変はできません"
+
+msgid "cannot amend public changesets"
+msgstr "public フェーズのリビジョンは改変できません"
+
+msgid "cannot amend merge changesets"
+msgstr "マージ実施リビジョンは改変できません"
+
+msgid "cannot amend while merging"
+msgstr "マージ実施中の作業領域では改変できません"
+
+msgid "cannot amend changeset with children"
+msgstr "子リビジョンを持つリビジョンは改変できません"
+
+msgid "nothing changed\n"
+msgstr "変更なし\n"
+
 #, python-format
 msgid "nothing changed (%d missing files, see 'hg status')\n"
 msgstr "改変はありません (%d 個のファイルが不在。 'hg status' で確認を)\n"
 
-msgid "nothing changed\n"
-msgstr "変更なし\n"
-
 msgid "created new head\n"
 msgstr "新規ヘッドが増えました\n"
 
@@ -10161,6 +10659,25 @@
 "    実行成否が出力されます。\n"
 "    "
 
+msgid "A B"
+msgstr "A B"
+
+#, python-format
+msgid "a: %s\n"
+msgstr "a: %s\n"
+
+#, python-format
+msgid "b: %s\n"
+msgstr "b: %s\n"
+
+#, python-format
+msgid "depth(a): %d depth(b): %d\n"
+msgstr "深さ(a): %d 深さ(b): %d\n"
+
+#, python-format
+msgid "delta: %d hdist: %d distance: %d relation: %s\n"
+msgstr "差分: %d ハミング(hamming)距離: %d 距離: %d 関連: %s\n"
+
 msgid "revision to rebuild to"
 msgstr "再構築対象リビジョン"
 
@@ -10199,6 +10716,14 @@
 msgid "parse and apply a revision specification"
 msgstr "リビジョン指定記述の解析/適用"
 
+msgid ""
+"    Use --verbose to print the parsed tree before and after aliases\n"
+"    expansion.\n"
+"    "
+msgstr ""
+"    --verbose 指定時は、 別名 (alias) 展開前後の、 解析木を表示します。\n"
+"    "
+
 msgid "REV1 [REV2]"
 msgstr "REV1 [REV2]"
 
@@ -10604,9 +11129,6 @@
 msgid "print all revisions that match"
 msgstr "合致するリビジョンを全て表示"
 
-msgid "follow changeset history, or file history across copies and renames"
-msgstr "複製元や改名元の履歴も遡る"
-
 msgid "ignore case when matching"
 msgstr "大文字小文字を無視して検索"
 
@@ -11274,42 +11796,6 @@
 "    含む単一のファイル名を、 \"xargs\" が複数のファイル名に解釈して\n"
 "    しまう問題は、 このオプションにより解消されます。"
 
-msgid "only follow the first parent of merge changesets (DEPRECATED)"
-msgstr "マージの際には第1親のみを遡る (DEPRECATED)"
-
-msgid "show revisions matching date spec"
-msgstr "指定日時に合致するリビジョンを表示"
-
-msgid "show copied files"
-msgstr "複製されたファイルを表示"
-
-msgid "do case-insensitive search for a given text"
-msgstr "指定キーワードによる検索(大文字小文字は無視)"
-
-msgid "include revisions where files were removed"
-msgstr "ファイルが登録除外されたリビジョンを含める"
-
-msgid "show only merges (DEPRECATED)"
-msgstr "マージ実施リビジョンのみを表示 (DEPRECATED)"
-
-msgid "revisions committed by user"
-msgstr "当該ユーザによるリビジョンを表示"
-
-msgid "show only changesets within the given named branch (DEPRECATED)"
-msgstr "指定の名前付きブランチに属するリビジョンを表示 (非推奨)"
-
-msgid "show changesets within the given named branch"
-msgstr "指定の名前付きブランチに属するリビジョンを表示"
-
-msgid "do not display revision or any of its ancestors"
-msgstr "当該リビジョンとその祖先の表示を抑止"
-
-msgid "show hidden changesets (DEPRECATED)"
-msgstr "隠れたリビジョンの表示 (DEPRECATED)"
-
-msgid "[OPTION]... [FILE]"
-msgstr "[OPTION]... [FILE]"
-
 msgid "show revision history of entire repository or files"
 msgstr "リポジトリ全体ないしファイルの変更履歴の表示"
 
@@ -11743,18 +12229,26 @@
 msgstr "        public < draft < secret"
 
 msgid ""
-"    Return 0 on success, 1 if no phases were changed.\n"
-"    "
-msgstr ""
-"    成功時のコマンドの終了値は 0、 フェーズ状態変更が無ければ 1 です。\n"
+"    Return 0 on success, 1 if no phases were changed or some could not\n"
+"    be changed.\n"
+"    "
+msgstr ""
+"    成功時のコマンドの終了値は 0、 フェーズ状態変更が無い、あるいは、\n"
+"    変更に失敗した場合は 1 です。\n"
 "    "
 
 msgid "only one phase can be specified"
 msgstr "フェーズ指定は1つだけです"
 
 #, python-format
-msgid "phase change for %i changesets\n"
-msgstr "リビジョン %i のフェーズを変更\n"
+msgid "cannot move %i changesets to a more permissive phase, use --force\n"
+msgstr ""
+"公開方向へのフェーズ変更が %i 個のリビジョンで失敗しました。\n"
+"適宜 --force 指定を行ってください。\n"
+
+#, python-format
+msgid "phase changed for %i changesets\n"
+msgstr "%i 個のリビジョンのフェーズを変更\n"
 
 msgid "no phases changed\n"
 msgstr "フェーズの変更なし\n"
@@ -12292,30 +12786,6 @@
 msgid "use --all to revert all files"
 msgstr "全ファイル復旧なら --all 付き実行"
 
-#, python-format
-msgid "forgetting %s\n"
-msgstr "%s の追加登録を取り消し中\n"
-
-#, python-format
-msgid "reverting %s\n"
-msgstr "%s の復旧中\n"
-
-#, python-format
-msgid "undeleting %s\n"
-msgstr "%s の復旧中\n"
-
-#, python-format
-msgid "saving current version of %s as %s\n"
-msgstr "現行版の %s を %s に保存中\n"
-
-#, python-format
-msgid "file not managed: %s\n"
-msgstr "ファイル %s は管理対象ではありません\n"
-
-#, python-format
-msgid "no changes needed to %s\n"
-msgstr "%s には改変の必要がありません\n"
-
 msgid "ignore safety measures"
 msgstr "安全判定を無視"
 
@@ -13097,6 +13567,14 @@
 msgid "cannot include %s (%s)"
 msgstr "%s を読み込めません(%s)"
 
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr "作業領域の親 '%s' が未知のリビジョンです!"
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr "'%s' は未知のリビジョンです"
+
 msgid "not found in manifest"
 msgstr "マニフェストにありません"
 
@@ -13415,6 +13893,19 @@
 "lsprof が利用できません - http://codespeak.net/svn/user/arigo/hack/misc/"
 "lsprof/からインストールしてください"
 
+msgid "statprof not available - install using \"easy_install statprof\""
+msgstr ""
+"statprof が利用できません - \"easy_install statprof\"でインストールしてくださ"
+"い"
+
+#, python-format
+msgid "invalid sampling frequency '%s' - ignoring\n"
+msgstr "不正なサンプリング周期頻度 '%s' を無視します\n"
+
+#, python-format
+msgid "unrecognized profiler '%s' - ignored\n"
+msgstr "不正なプロファイラ指定 '%s' を無視します\n"
+
 #, python-format
 msgid "*** failed to import extension %s from %s: %s\n"
 msgstr "*** %s のインポートに失敗 (%s): %s\n"
@@ -13443,6 +13934,15 @@
 msgid "tool %s requires a GUI\n"
 msgstr "ツール %s は GUI が必要です\n"
 
+msgid ""
+"``internal:prompt``\n"
+"Asks the user which of the local or the other version to keep as\n"
+"    the merged version."
+msgstr ""
+"``internal:prompt``\n"
+"作業領域側とマージ対象リビジョン側のどちらを、\n"
+"   マージ結果として採用するか、 対話的に確認します。"
+
 #, python-format
 msgid ""
 " no tool found to merge %s\n"
@@ -13451,10 +13951,72 @@
 " %s のマージに適切なツールが見つかりません\n"
 "どちらの内容を採用しますか? 作業領域:(l)ocal マージ対象:(o)ther"
 
+msgid ""
+"``internal:local``\n"
+"Uses the local version of files as the merged version."
+msgstr ""
+"``internal:local``\n"
+"マージ結果として、 作業領域側の内容を採用します。"
+
+msgid ""
+"``internal:other``\n"
+"Uses the other version of files as the merged version."
+msgstr ""
+"``internal:other``\n"
+"マージ結果として、 マージ対象リビジョン側の内容を採用します。"
+
+msgid ""
+"``internal:fail``\n"
+"Rather than attempting to merge files that were modified on both\n"
+"    branches, it marks them as unresolved. The resolve command must be\n"
+"    used to resolve these conflicts."
+msgstr ""
+"``internal:fail``\n"
+"変更内容に関するマージ処理は実施せず、 必ずマージ失敗とみなします。\n"
+"   マージ失敗とみなされたファイルに対しては、\n"
+"   :hg:`resolve` による手動での衝突解消が必要です。"
+
 #, python-format
 msgid "%s.premerge not valid ('%s' is neither boolean nor %s)"
 msgstr "%s.premerge は無効です('%s' は真偽ないし %s のいずれでもありません)"
 
+msgid ""
+"``internal:merge``\n"
+"Uses the internal non-interactive simple merge algorithm for merging\n"
+"    files. It will fail if there are any conflicts and leave markers in\n"
+"    the partially merged file."
+msgstr ""
+"``internal:merge``\n"
+"非対話的な、 単純なマージ処理を実施します。\n"
+"   衝突があった場合、 マージ処理は失敗とみなされますが、\n"
+"   マージ結果ファイルには、 衝突マークが記録されます。"
+
+#, python-format
+msgid "merging %s incomplete! (edit conflicts, then use 'hg resolve --mark')\n"
+msgstr "%s のマージは不完全です (衝突解消後に 'hg resolve --mark' が必要)\n"
+
+msgid ""
+"``internal:dump``\n"
+"Creates three versions of the files to merge, containing the\n"
+"    contents of local, other and base. These files can then be used to\n"
+"    perform a merge manually. If the file to be merged is named\n"
+"    ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
+"    ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
+"    same directory as ``a.txt``."
+msgstr ""
+"``internal:dump``\n"
+"作業領域側、 マージ対象リビジョン側、 および共通祖先時点の、\n"
+"   それぞれの内容を持つ3つのファイルを生成します。\n"
+"   これらのファイルは、事後の手動マージ等で使用してください。\n"
+"   対象ファイル名が ``a.txt`` であった場合、\n"
+"   生成されるファイルはそれぞれ ``a.txt.local``、 ``a.txt.other``\n"
+"   および ``a.txt.base`` と命名され、\n"
+"   ``a.txt`` と同じディレクトリに格納されます。"
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr "%s のマージに失敗!\n"
+
 #, python-format
 msgid "was merge of '%s' successful (yn)?"
 msgstr "'%s' のマージは成功しましたか? (y/n) "
@@ -13467,14 +14029,6 @@
 " マージ結果ファイル %s は未変更に見えます\n"
 "マージ成功とみなしますか? (y/n)"
 
-#, python-format
-msgid "merging %s incomplete! (edit conflicts, then use 'hg resolve --mark')\n"
-msgstr "%s のマージは不完全です (衝突解消後に 'hg resolve --mark' が必要)\n"
-
-#, python-format
-msgid "merging %s failed!\n"
-msgstr "%s のマージに失敗!\n"
-
 msgid "unterminated string"
 msgstr "文字列が終端していません"
 
@@ -13705,6 +14259,20 @@
 msgid "copied takes no arguments"
 msgstr "copied には引数が指定できません"
 
+msgid ""
+"``subrepo([pattern])``\n"
+"    Subrepositories whose paths match the given pattern."
+msgstr ""
+"``subrepo([pattern])``\n"
+"    パターンに合致するパスに位置する副リポジトリ。"
+
+#. i18n: "subrepo" is a keyword
+msgid "subrepo takes at most one argument"
+msgstr "subrepo の引数は最大1つです"
+
+msgid "subrepo requires a pattern or no arguments"
+msgstr "subrepo の引数は、パターン指定か、引数無しです"
+
 msgid "invalid token"
 msgstr "不正な記述"
 
@@ -13785,8 +14353,8 @@
 msgid "URL Paths"
 msgstr "URLのパス指定"
 
-msgid "Using additional features"
-msgstr "付加機能の使用"
+msgid "Using Additional Features"
+msgstr "拡張機能(エクステンション)の使用"
 
 msgid "Subrepositories"
 msgstr "副リポジトリ"
@@ -13797,7 +14365,7 @@
 msgid "Glossary"
 msgstr "用語集"
 
-msgid "syntax for Mercurial ignore files"
+msgid "Syntax for Mercurial Ignore Files"
 msgstr "Mercurial の無視指定ファイルの文法"
 
 msgid "Working with Phases"
@@ -13873,33 +14441,35 @@
 "後から読み込んだ設定の方が優先されます。 以下に列挙されるパスにおいて、\n"
 "複数から設定が読み込まれた場合は、 列挙順の早い方の設定が優先されます。"
 
-msgid "| (Unix, Windows) ``<repo>/.hg/hgrc``"
-msgstr "| (Unix, Windows) ``<リポジトリ>/.hg/hgrc``"
+msgid "| (All) ``<repo>/.hg/hgrc``"
+msgstr "| (共通) ``<リポジトリ>/.hg/hgrc``"
 
 msgid ""
 "    Per-repository configuration options that only apply in a\n"
 "    particular repository. This file is not version-controlled, and\n"
 "    will not get transferred during a \"clone\" operation. Options in\n"
 "    this file override options in all other configuration files. On\n"
-"    Unix, most of this file will be ignored if it doesn't belong to a\n"
-"    trusted user or to a trusted group. See the documentation for the\n"
-"    ``[trusted]`` section below for more details."
+"    Plan 9 and Unix, most of this file will be ignored if it doesn't\n"
+"    belong to a trusted user or to a trusted group. See the documentation\n"
+"    for the ``[trusted]`` section below for more details."
 msgstr ""
 "    個々のリポジトリにのみ適用される、 リポジトリ毎設定。\n"
 "    本ファイルは構成管理対象外であり、 :hg:`clone` \n"
 "    によって伝播することもありません。 本ファイルでの設定は、\n"
-"    以下に述べる全ての設定ファイルに優先します。 Unix 環境において、\n"
-"    本ファイルの所有者/グループが、 信頼できるものでない場合、\n"
+"    以下に述べる全ての設定ファイルに優先します。 Unix および Plan 9\n"
+"    環境において、 本ファイルの所有者/グループが、 信頼できない場合、\n"
 "    本ファイル中の設定の大半は無視されます。 詳細に関しては、\n"
 "    後述する ``trusted`` セクションの説明を参照してください。"
 
 msgid ""
+"| (Plan 9) ``$home/lib/hgrc``\n"
 "| (Unix) ``$HOME/.hgrc``\n"
 "| (Windows) ``%USERPROFILE%\\.hgrc``\n"
 "| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
 "| (Windows) ``%HOME%\\.hgrc``\n"
 "| (Windows) ``%HOME%\\Mercurial.ini``"
 msgstr ""
+"| (Plan 9) ``$home/lib/hgrc``\n"
 "| (Unix) ``$HOME/.hgrc``\n"
 "| (Windows) ``%USERPROFILE%\\.hgrc``\n"
 "| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
@@ -13921,9 +14491,13 @@
 "    システム毎/インストール毎の設定より優先されます。"
 
 msgid ""
+"| (Plan 9) ``/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``\n"
 "| (Unix) ``/etc/mercurial/hgrc``\n"
 "| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
 msgstr ""
+"| (Plan 9) ``/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``\n"
 "| (Unix) ``/etc/mercurial/hgrc``\n"
 "| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
 
@@ -13939,9 +14513,13 @@
 "    本ファイルでの設定は、 インストール毎設定より優先されます。"
 
 msgid ""
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc.d/*.rc``\n"
 "| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
 "| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
 msgstr ""
+"| (Plan 9) ``<インストール先>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<インストール先>/lib/mercurial/hgrc.d/*.rc``\n"
 "| (Unix) ``<インストール先>/etc/mercurial/hgrc``\n"
 "| (Unix) ``<インストール先>/etc/mercurial/hgrc.d/*.rc``"
 
@@ -14258,8 +14836,8 @@
 "シェル別名はシェルによって解釈され、 任意のコマンド実行が可能です。\n"
 "例えば以下の定義によって::"
 
-msgid "   echo = !echo"
-msgstr "   echo = !echo"
+msgid "   echo = !echo $@"
+msgstr "   echo = !echo $@"
 
 msgid ""
 "will let you do ``hg echo foo`` to have ``foo`` printed in your\n"
@@ -14279,11 +14857,24 @@
 "purge エクステンションと同じ作法で削除します。"
 
 msgid ""
-"Shell aliases are executed in an environment where ``$HG`` expand to\n"
+"Positional arguments like ``$1``, ``$2``, etc. in the alias definition\n"
+"expand to the command arguments. Unmatched arguments are\n"
+"removed. ``$0`` expands to the alias name and ``$@`` expands to all\n"
+"arguments separated by a space. These expansions happen before the\n"
+"command is passed to the shell."
+msgstr ""
+"別名定義での ``$1`` や ``$2`` 等の位置指定引数は、 別名コマンド実行の際に、\n"
+"コマンド行で指定された、 対応する引数で置換されます。 対応引数が無い場合、\n"
+"引数不足で処理が中断されます。 ``$0`` はコマンド別名そのもの、``$@``\n"
+"は全引数を空白区切りしたもので、それぞれ置換されます。 引数の置換は、\n"
+"シェルによるコマンド行解釈よりも、 前に実施されます。"
+
+msgid ""
+"Shell aliases are executed in an environment where ``$HG`` expands to\n"
 "the path of the Mercurial that was used to execute the alias. This is\n"
 "useful when you want to call further Mercurial commands in a shell\n"
 "alias, as was done above for the purge alias. In addition,\n"
-"``$HG_ARGS`` expand to the arguments given to Mercurial. In the ``hg\n"
+"``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg\n"
 "echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``."
 msgstr ""
 "シェル別名では、 環境変数 ``$HG`` が、 別名コマンドを実行する\n"
@@ -14509,10 +15100,10 @@
 "For each file only the first matching filter applies."
 msgstr ""
 "フィルタは、 フィルタコマンドを伴ったフィルタパターンで指定されます。\n"
-"特に指定が無い場合、 フィルタパターンは、 リポジトリルートを起点とする\n"
-"ワイルドカード形式とみなされます。 例えば、 ルート直下の ``.txt``\n"
-"拡張子を持つファイルにのみ合致させるパターンは ``*.txt`` となります。\n"
-"リポジトリ配下の全ての ``.c`` 拡張子のファイルに合致させるパターンは\n"
+"デフォルトのパターン指定形式は、 作業領域ルートからの相対パスに対して、\n"
+"パス先頭からのパターン合致で判定する、 ワイルドカード形式 (glob) です。\n"
+"例えば、 ルート直下の ``.txt`` 拡張子のファイルにのみ合致させるパターンは\n"
+"``*.txt`` となります。 作業領域中の ``.c`` 拡張子の全ファイルへの合致は、\n"
 "``**.c`` となります。 それぞれのファイルに適用されるフィルタは、\n"
 "最初にマッチしたパターンのものだけです。"
 
@@ -14851,46 +15442,6 @@
 
 msgid ""
 "\n"
-"``hostfingerprints``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
-"\n"
-"``hostfingerprints``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-
-msgid ""
-"Fingerprints of the certificates of known HTTPS servers.\n"
-"A HTTPS connection to a server with a fingerprint configured here will\n"
-"only succeed if the servers certificate matches the fingerprint.\n"
-"This is very similar to how ssh known hosts works.\n"
-"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
-"The CA chain and web.cacerts is not used for servers with a fingerprint."
-msgstr ""
-"既知の HTTPS サーバ証明書のフィンガープリント (fingerprint) 記述。\n"
-"本セクションに記述のあるサーバと HTTPS で接続する場合、\n"
-"サーバ証明書のフィンガープリントが、 記述と一致しなければ、\n"
-"接続失敗とみなされます。 ssh における ``known_hosts`` 設定に相当します。\n"
-"フィンガープリントは、 DER 符号化された証明書の SHA-1 ハッシュ値です。\n"
-"フィンガープリント指定のあるサーバとの接続の場合、\n"
-"CA 連鎖の確認や web.cacerts 設定は無視されます。"
-
-msgid "For example::"
-msgstr "記述例を以下に示します::"
-
-msgid ""
-"    [hostfingerprints]\n"
-"    hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:"
-"d6:4b:ee:cc"
-msgstr ""
-"    [hostfingerprints]\n"
-"    hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:"
-"d6:4b:ee:cc"
-
-msgid "This feature is only supported when using Python 2.6 or later."
-msgstr "本機能は、 Python 2.6 以降でのみ使用可能です。"
-
-msgid ""
-"\n"
 "``format``\n"
 "\"\"\"\"\"\"\"\"\"\""
 msgstr ""
@@ -14951,251 +15502,59 @@
 "    Mercurial と、 ディスク記録形式で互換性が保たれます。"
 
 msgid ""
-"``merge-patterns``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
-"``merge-patterns``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-
-msgid ""
-"This section specifies merge tools to associate with particular file\n"
-"patterns. Tools matched here will take precedence over the default\n"
-"merge tool. Patterns are globs by default, rooted at the repository\n"
-"root."
-msgstr ""
-"特定のファイル名パターンと、 マージツールの関連付け。\n"
-"本セクションでの関連付けは、 デフォルトのマージツール選択に優先します。\n"
-"デフォルトのパターン指定形式は、 リポジトリルートを起点とする、\n"
-"ワイルドカード形式とみなされます。"
-
-msgid ""
-"  [merge-patterns]\n"
-"  **.c = kdiff3\n"
-"  **.jpg = myimgmerge"
-msgstr ""
-"  [merge-patterns]\n"
-"  **.c = kdiff3\n"
-"  **.jpg = myimgmerge"
-
-msgid ""
-"``merge-tools``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
-"``merge-tools``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-
-msgid ""
-"This section configures external merge tools to use for file-level\n"
-"merges."
-msgstr "ファイル単位のマージを行う外部マージツールの設定。"
-
-msgid "Example ``~/.hgrc``::"
-msgstr "``~/.hgrc`` での設定例を以下に示します::"
-
-msgid ""
-"  [merge-tools]\n"
-"  # Override stock tool location\n"
-"  kdiff3.executable = ~/bin/kdiff3\n"
-"  # Specify command line\n"
-"  kdiff3.args = $base $local $other -o $output\n"
-"  # Give higher priority\n"
-"  kdiff3.priority = 1"
-msgstr ""
-"  [merge-tools]\n"
-"  # 既存ツールの実行パスを標準のものから変更\n"
-"  kdiff3.executable = ~/bin/kdiff3\n"
-"  # コマンド行形式の指定\n"
-"  kdiff3.args = $base $local $other -o $output\n"
-"  # 優先順位を高く設定\n"
-"  kdiff3.priority = 1"
-
-msgid ""
-"  # Define new tool\n"
-"  myHtmlTool.args = -m $local $other $base $output\n"
-"  myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
-"  myHtmlTool.priority = 1"
-msgstr ""
-"  # 固有ツールの設定\n"
-"  myHtmlTool.args = -m $local $other $base $output\n"
-"  myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
-"  myHtmlTool.priority = 1"
-
-msgid ""
-"``priority``\n"
-"  The priority in which to evaluate this tool.\n"
-"  Default: 0."
-msgstr ""
-"``priority``\n"
-"  当該ツールを選択する際の優先順位。 デフォルト値: 0"
-
-msgid ""
-"``executable``\n"
-"  Either just the name of the executable or its pathname.  On Windows,\n"
-"  the path can use environment variables with ${ProgramFiles} syntax.\n"
-"  Default: the tool name."
-msgstr ""
-"``executable``\n"
-"  実行可能ファイル名ないしパス名。 Windows 環境では、\n"
-"  ${ProgramFiles} 環境変数を併用した記述が使用可能です。\n"
-"  デフォルト値: ツール名が自動的に設定"
-
-msgid ""
-"``args``\n"
-"  The arguments to pass to the tool executable. You can refer to the\n"
-"  files being merged as well as the output file through these\n"
-"  variables: ``$base``, ``$local``, ``$other``, ``$output``.\n"
-"  Default: ``$local $base $other``"
-msgstr ""
-"``args``\n"
-"  実行可能ファイルに渡される引数。 ``$base``、 ``$local``、 ``$other``\n"
-"  および ``$output`` という記述で、 マージ対象ファイル群や、\n"
-"  結果ファイルを指定可能です。 デフォルト値: ``$local $base $other``"
-
-msgid ""
-"``premerge``\n"
-"  Attempt to run internal non-interactive 3-way merge tool before\n"
-"  launching external tool.  Options are ``true``, ``false``, or ``keep``\n"
-"  to leave markers in the file if the premerge fails.\n"
-"  Default: True"
-msgstr ""
-"``premerge``\n"
-"  外部ツール起動前の、 非対話的な内部 3-way マージツール実行の有無。\n"
-"  ``true`` および ``false`` 以外に、 事前マージが失敗した場合に、\n"
-"  マージマークを残したままにする ``keep`` を指定可能です。\n"
-"  デフォルト値: True"
-
-msgid ""
-"``binary``\n"
-"  This tool can merge binary files. Defaults to False, unless tool\n"
-"  was selected by file pattern match."
-msgstr ""
-"``binary``\n"
-"  当該ツールによる、 バイナリファイルのマージ可否。 デフォルト値は False\n"
-"  ですが、 ツールの選択が、 ファイルパターンの合致で実施された場合は、\n"
-"  この設定値は無視されます。"
-
-msgid ""
-"``symlink``\n"
-"  This tool can merge symlinks. Defaults to False, even if tool was\n"
-"  selected by file pattern match."
-msgstr ""
-"``symlink``\n"
-"  当該ツールによる、 シンボリックリンクのマージ可否。 デフォルト値は False\n"
-"  ですが、 ツールの選択が、 ファイルパターンの合致で実施された場合は、\n"
-"  この設定値は無視されます。"
-
-msgid ""
-"``check``\n"
-"  A list of merge success-checking options:"
-msgstr ""
-"``check``\n"
-"  マージ成否判定方式の選択一覧 (複数指定可能):"
-
-msgid ""
-"  ``changed``\n"
-"    Ask whether merge was successful when the merged file shows no changes.\n"
-"  ``conflicts``\n"
-"    Check whether there are conflicts even though the tool reported "
-"success.\n"
-"  ``prompt``\n"
-"    Always prompt for merge success, regardless of success reported by tool."
-msgstr ""
-"  ``changed``\n"
-"    マージ結果と以前の内容に差分が無い場合、 マージ成否を問い合わせ。\n"
-"  ``conflicts``\n"
-"    ツールの戻り値がマージ成功を示す場合でも、 衝突マークの有無を確認。\n"
-"  ``prompt``\n"
-"    ツールの戻り値がマージ成功を示す場合でも、 常にマージ成否を問い合わせ。"
-
-msgid ""
-"``checkchanged``\n"
-"  True is equivalent to ``check = changed``.\n"
-"  Default: False"
-msgstr ""
-"``checkchanged``\n"
-"  本設定を True にするのは、 ``check = changed`` 設定と等価です。\n"
-"  デフォルト値: False"
-
-msgid ""
-"``checkconflicts``\n"
-"  True is equivalent to ``check = conflicts``.\n"
-"  Default: False"
-msgstr ""
-"``checkconflicts``\n"
-"  本設定を True にするのは、 ``check = conflicts`` 設定と等価です。\n"
-"  デフォルト値: False"
-
-msgid ""
-"``fixeol``\n"
-"  Attempt to fix up EOL changes caused by the merge tool.\n"
-"  Default: False"
-msgstr ""
-"``fixeol``\n"
-"  マージツールの実行による EOL 形式変更の是正の有無。\n"
-"  デフォルト値: False"
-
-msgid ""
-"``gui``\n"
-"  This tool requires a graphical interface to run. Default: False"
-msgstr ""
-"``gui``\n"
-"  当該ツール実行における GUI 表示の要否。\n"
-"  デフォルト値: False"
-
-msgid ""
-"``regkey``\n"
-"  Windows registry key which describes install location of this\n"
-"  tool. Mercurial will search for this key first under\n"
-"  ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.\n"
-"  Default: None"
-msgstr ""
-"``regkey``\n"
-"  当該ツールのインストール位置を保持する Windows レジストリキー。\n"
-"  Mercurial は ``HKEY_CURRENT_USER`` ないし ``HKEY_LOCAL_MACHINE``\n"
-"  配下の当該キーの有無を、 この順序で確認します。\n"
-"  デフォルト値: None"
-
-msgid ""
-"``regkeyalt``\n"
-"  An alternate Windows registry key to try if the first key is not\n"
-"  found.  The alternate key uses the same ``regname`` and ``regappend``\n"
-"  semantics of the primary key.  The most common use for this key\n"
-"  is to search for 32bit applications on 64bit operating systems.\n"
-"  Default: None"
-msgstr ""
-"``regkeyalt``\n"
-"  指定されたレジストリキー不在時の、 代替 Windows レジストリキー。\n"
-"  ``regname`` および ``regappend`` による改変は、\n"
-"  代替キーでも実施されます。 典型的な用途は、\n"
-"  64 ビット環境における 32 ビットアプリの検索です。\n"
-"  デフォルト値: None"
-
-msgid ""
-"``regname``\n"
-"  Name of value to read from specified registry key. Defaults to the\n"
-"  unnamed (default) value."
-msgstr ""
-"``regname``\n"
-"  当該レジストリキーから読み出す値の名前。 デフォルト値は、\n"
-"  ``(既定)`` からの読み出しです。"
-
-msgid ""
-"``regappend``\n"
-"  String to append to the value read from the registry, typically\n"
-"  the executable name of the tool.\n"
-"  Default: None"
-msgstr ""
-"``regappend``\n"
-"  当該レジストリキーからの読み出し値に付加する値。 典型的な設定値は、\n"
-"  ツールの実行可能ファイル名です。\n"
-"  デフォルト値: None"
-
-msgid ""
-"\n"
+"``graph``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+"``graph``\n"
+"\"\"\"\"\"\"\"\"\""
+
+msgid ""
+"Web graph view configuration. This section let you change graph\n"
+"elements display properties by branches, for instance to make the\n"
+"``default`` branch stand out."
+msgstr ""
+"ウェブでのグラフ表示設定。 本セクションでは、 グラフの表示要素に対して、\n"
+"設定を変更できます (例: ``default`` ブランチを目立たせる)。"
+
+msgid "    <branch>.<argument> = <value>"
+msgstr "    <ブランチ名>.<引数> = <値>"
+
+msgid ""
+"where ``<branch>`` is the name of the branch being\n"
+"customized. Example::"
+msgstr "``<ブランチ名>`` は設定変更対象のブランチ名です。例えば::"
+
+msgid ""
+"    [graph]\n"
+"    # 2px width\n"
+"    default.width = 2\n"
+"    # red color\n"
+"    default.color = FF0000"
+msgstr ""
+"    [graph]\n"
+"    # 幅を2ピクセルに変更\n"
+"    default.width = 2\n"
+"    # 色を赤に変更\n"
+"    default.color = FF0000"
+
+msgid ""
+"``width``\n"
+"    Set branch edges width in pixels."
+msgstr ""
+"``width``\n"
+"    ブランチにおけるの線幅を、 ピクセル単位で指定。"
+
+msgid ""
+"``color``\n"
+"    Set branch edges color in hexadecimal RGB notation."
+msgstr ""
+"``color``\n"
+"    ブランチにおける線の色を、 16進 RGB 表記で指定。"
+
+msgid ""
 "``hooks``\n"
 "\"\"\"\"\"\"\"\"\""
 msgstr ""
-"\n"
 "``hooks``\n"
 "\"\"\"\"\"\"\"\"\""
 
@@ -15610,6 +15969,46 @@
 
 msgid ""
 "\n"
+"``hostfingerprints``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+"\n"
+"``hostfingerprints``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+msgid ""
+"Fingerprints of the certificates of known HTTPS servers.\n"
+"A HTTPS connection to a server with a fingerprint configured here will\n"
+"only succeed if the servers certificate matches the fingerprint.\n"
+"This is very similar to how ssh known hosts works.\n"
+"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
+"The CA chain and web.cacerts is not used for servers with a fingerprint."
+msgstr ""
+"既知の HTTPS サーバ証明書のフィンガープリント (fingerprint) 記述。\n"
+"本セクションに記述のあるサーバと HTTPS で接続する場合、\n"
+"サーバ証明書のフィンガープリントが、 記述と一致しなければ、\n"
+"接続失敗とみなされます。 ssh における ``known_hosts`` 設定に相当します。\n"
+"フィンガープリントは、 DER 符号化された証明書の SHA-1 ハッシュ値です。\n"
+"フィンガープリント指定のあるサーバとの接続の場合、\n"
+"CA 連鎖の確認や web.cacerts 設定は無視されます。"
+
+msgid "For example::"
+msgstr "記述例を以下に示します::"
+
+msgid ""
+"    [hostfingerprints]\n"
+"    hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:"
+"d6:4b:ee:cc"
+msgstr ""
+"    [hostfingerprints]\n"
+"    hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:"
+"d6:4b:ee:cc"
+
+msgid "This feature is only supported when using Python 2.6 or later."
+msgstr "本機能は、 Python 2.6 以降でのみ使用可能です。"
+
+msgid ""
+"\n"
 "``http_proxy``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
@@ -15665,68 +16064,244 @@
 "    真偽値。 デフォルト値: False"
 
 msgid ""
-"``smtp``\n"
-"\"\"\"\"\"\"\"\""
-msgstr ""
-"``smtp``\n"
-"\"\"\"\"\"\"\"\""
-
-msgid "Configuration for extensions that need to send email messages."
-msgstr "電子メールを送信するエクステンション向け設定。"
-
-msgid ""
-"``host``\n"
-"    Host name of mail server, e.g. \"mail.example.com\"."
-msgstr ""
-"``host``\n"
-"    SMTP サーバのホスト名。 設定例: \"mail.example.com\""
-
-msgid ""
-"``port``\n"
-"    Optional. Port to connect to on mail server. Default: 25."
-msgstr ""
-"``port``\n"
-"    省略可能。 SMTP サーバのポート番号。 デフォルト値: 25"
-
-msgid ""
-"``tls``\n"
-"    Optional. Method to enable TLS when connecting to mail server: "
-"starttls,\n"
-"    smtps or none. Default: none."
-msgstr ""
-"``tls``\n"
-"    省略可能。 SMTP サーバ接続における TLS 接続の有無/方式の指定。\n"
-"    starttls、 smtps ないし none。 デフォルト値: none"
-
-msgid ""
-"``username``\n"
-"    Optional. User name for authenticating with the SMTP server.\n"
-"    Default: none."
-msgstr ""
-"``username``\n"
-"    省略可能。 SMTP サーバ接続の認証におけるユーザ名。\n"
-"    デフォルト値: none"
-
-msgid ""
-"``password``\n"
-"    Optional. Password for authenticating with the SMTP server. If not\n"
-"    specified, interactive sessions will prompt the user for a\n"
-"    password; non-interactive sessions will fail. Default: none."
-msgstr ""
-"``password``\n"
-"    省略可能。 SMTP サーバ接続の認証におけるパスワード。\n"
-"    無指定の場合、 対話的な実行であれば、\n"
-"    パスワード入力プロンプトが表示されますが、\n"
-"    非対話的な実行であれば、 処理が中断されます。\n"
-"    デフォルト値: none"
-
-msgid ""
-"``local_hostname``\n"
-"    Optional. It's the hostname that the sender can use to identify\n"
-"    itself to the MTA."
-msgstr ""
-"``local_hostname``\n"
-"    省略可能。 MTA に対して、 送信元を指定するためのホスト名。"
+"``merge-patterns``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+"``merge-patterns``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+msgid ""
+"This section specifies merge tools to associate with particular file\n"
+"patterns. Tools matched here will take precedence over the default\n"
+"merge tool. Patterns are globs by default, rooted at the repository\n"
+"root."
+msgstr ""
+"特定のファイル名パターンと、 マージツールの関連付け。\n"
+"本セクションでの関連付けは、 デフォルトのマージツール選択に優先します。\n"
+"デフォルトのパターン指定形式は、 作業領域ルートからの相対パスに対して、\n"
+"パス先頭からのパターン合致で判定する、ワイルドカード形式とみなされます。"
+
+msgid ""
+"  [merge-patterns]\n"
+"  **.c = kdiff3\n"
+"  **.jpg = myimgmerge"
+msgstr ""
+"  [merge-patterns]\n"
+"  **.c = kdiff3\n"
+"  **.jpg = myimgmerge"
+
+msgid ""
+"``merge-tools``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+"``merge-tools``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+msgid ""
+"This section configures external merge tools to use for file-level\n"
+"merges."
+msgstr "ファイル単位のマージを行う外部マージツールの設定。"
+
+msgid "Example ``~/.hgrc``::"
+msgstr "``~/.hgrc`` での設定例を以下に示します::"
+
+msgid ""
+"  [merge-tools]\n"
+"  # Override stock tool location\n"
+"  kdiff3.executable = ~/bin/kdiff3\n"
+"  # Specify command line\n"
+"  kdiff3.args = $base $local $other -o $output\n"
+"  # Give higher priority\n"
+"  kdiff3.priority = 1"
+msgstr ""
+"  [merge-tools]\n"
+"  # 既存ツールの実行パスを標準のものから変更\n"
+"  kdiff3.executable = ~/bin/kdiff3\n"
+"  # コマンド行形式の指定\n"
+"  kdiff3.args = $base $local $other -o $output\n"
+"  # 優先順位を高く設定\n"
+"  kdiff3.priority = 1"
+
+msgid ""
+"  # Define new tool\n"
+"  myHtmlTool.args = -m $local $other $base $output\n"
+"  myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+"  myHtmlTool.priority = 1"
+msgstr ""
+"  # 固有ツールの設定\n"
+"  myHtmlTool.args = -m $local $other $base $output\n"
+"  myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+"  myHtmlTool.priority = 1"
+
+msgid ""
+"``priority``\n"
+"  The priority in which to evaluate this tool.\n"
+"  Default: 0."
+msgstr ""
+"``priority``\n"
+"  当該ツールを選択する際の優先順位。 デフォルト値: 0"
+
+msgid ""
+"``executable``\n"
+"  Either just the name of the executable or its pathname.  On Windows,\n"
+"  the path can use environment variables with ${ProgramFiles} syntax.\n"
+"  Default: the tool name."
+msgstr ""
+"``executable``\n"
+"  実行可能ファイル名ないしパス名。 Windows 環境では、\n"
+"  ${ProgramFiles} 環境変数を併用した記述が使用可能です。\n"
+"  デフォルト値: ツール名が自動的に設定"
+
+msgid ""
+"``args``\n"
+"  The arguments to pass to the tool executable. You can refer to the\n"
+"  files being merged as well as the output file through these\n"
+"  variables: ``$base``, ``$local``, ``$other``, ``$output``.\n"
+"  Default: ``$local $base $other``"
+msgstr ""
+"``args``\n"
+"  実行可能ファイルに渡される引数。 ``$base``、 ``$local``、 ``$other``\n"
+"  および ``$output`` という記述で、 マージ対象ファイル群や、\n"
+"  結果ファイルを指定可能です。 デフォルト値: ``$local $base $other``"
+
+msgid ""
+"``premerge``\n"
+"  Attempt to run internal non-interactive 3-way merge tool before\n"
+"  launching external tool.  Options are ``true``, ``false``, or ``keep``\n"
+"  to leave markers in the file if the premerge fails.\n"
+"  Default: True"
+msgstr ""
+"``premerge``\n"
+"  外部ツール起動前の、 非対話的な内部 3-way マージツール実行の有無。\n"
+"  ``true`` および ``false`` 以外に、 事前マージが失敗した場合に、\n"
+"  マージマークを残したままにする ``keep`` を指定可能です。\n"
+"  デフォルト値: True"
+
+msgid ""
+"``binary``\n"
+"  This tool can merge binary files. Defaults to False, unless tool\n"
+"  was selected by file pattern match."
+msgstr ""
+"``binary``\n"
+"  当該ツールによる、 バイナリファイルのマージ可否。 デフォルト値は False\n"
+"  ですが、 ツールの選択が、 ファイルパターンの合致で実施された場合は、\n"
+"  この設定値は無視されます。"
+
+msgid ""
+"``symlink``\n"
+"  This tool can merge symlinks. Defaults to False, even if tool was\n"
+"  selected by file pattern match."
+msgstr ""
+"``symlink``\n"
+"  当該ツールによる、 シンボリックリンクのマージ可否。 デフォルト値は False\n"
+"  ですが、 ツールの選択が、 ファイルパターンの合致で実施された場合は、\n"
+"  この設定値は無視されます。"
+
+msgid ""
+"``check``\n"
+"  A list of merge success-checking options:"
+msgstr ""
+"``check``\n"
+"  マージ成否判定方式の選択一覧 (複数指定可能):"
+
+msgid ""
+"  ``changed``\n"
+"    Ask whether merge was successful when the merged file shows no changes.\n"
+"  ``conflicts``\n"
+"    Check whether there are conflicts even though the tool reported "
+"success.\n"
+"  ``prompt``\n"
+"    Always prompt for merge success, regardless of success reported by tool."
+msgstr ""
+"  ``changed``\n"
+"    マージ結果と以前の内容に差分が無い場合、 マージ成否を問い合わせ。\n"
+"  ``conflicts``\n"
+"    ツールの戻り値がマージ成功を示す場合でも、 衝突マークの有無を確認。\n"
+"  ``prompt``\n"
+"    ツールの戻り値がマージ成功を示す場合でも、 常にマージ成否を問い合わせ。"
+
+msgid ""
+"``checkchanged``\n"
+"  True is equivalent to ``check = changed``.\n"
+"  Default: False"
+msgstr ""
+"``checkchanged``\n"
+"  本設定を True にするのは、 ``check = changed`` 設定と等価です。\n"
+"  デフォルト値: False"
+
+msgid ""
+"``checkconflicts``\n"
+"  True is equivalent to ``check = conflicts``.\n"
+"  Default: False"
+msgstr ""
+"``checkconflicts``\n"
+"  本設定を True にするのは、 ``check = conflicts`` 設定と等価です。\n"
+"  デフォルト値: False"
+
+msgid ""
+"``fixeol``\n"
+"  Attempt to fix up EOL changes caused by the merge tool.\n"
+"  Default: False"
+msgstr ""
+"``fixeol``\n"
+"  マージツールの実行による EOL 形式変更の是正の有無。\n"
+"  デフォルト値: False"
+
+msgid ""
+"``gui``\n"
+"  This tool requires a graphical interface to run. Default: False"
+msgstr ""
+"``gui``\n"
+"  当該ツール実行における GUI 表示の要否。\n"
+"  デフォルト値: False"
+
+msgid ""
+"``regkey``\n"
+"  Windows registry key which describes install location of this\n"
+"  tool. Mercurial will search for this key first under\n"
+"  ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.\n"
+"  Default: None"
+msgstr ""
+"``regkey``\n"
+"  当該ツールのインストール位置を保持する Windows レジストリキー。\n"
+"  Mercurial は ``HKEY_CURRENT_USER`` ないし ``HKEY_LOCAL_MACHINE``\n"
+"  配下の当該キーの有無を、 この順序で確認します。\n"
+"  デフォルト値: None"
+
+msgid ""
+"``regkeyalt``\n"
+"  An alternate Windows registry key to try if the first key is not\n"
+"  found.  The alternate key uses the same ``regname`` and ``regappend``\n"
+"  semantics of the primary key.  The most common use for this key\n"
+"  is to search for 32bit applications on 64bit operating systems.\n"
+"  Default: None"
+msgstr ""
+"``regkeyalt``\n"
+"  指定されたレジストリキー不在時の、 代替 Windows レジストリキー。\n"
+"  ``regname`` および ``regappend`` による改変は、\n"
+"  代替キーでも実施されます。 典型的な用途は、\n"
+"  64 ビット環境における 32 ビットアプリの検索です。\n"
+"  デフォルト値: None"
+
+msgid ""
+"``regname``\n"
+"  Name of value to read from specified registry key. Defaults to the\n"
+"  unnamed (default) value."
+msgstr ""
+"``regname``\n"
+"  当該レジストリキーから読み出す値の名前。 デフォルト値は、\n"
+"  ``(既定)`` からの読み出しです。"
+
+msgid ""
+"``regappend``\n"
+"  String to append to the value read from the registry, typically\n"
+"  the executable name of the tool.\n"
+"  Default: None"
+msgstr ""
+"``regappend``\n"
+"  当該レジストリキーからの読み出し値に付加する値。 典型的な設定値は、\n"
+"  ツールの実行可能ファイル名です。\n"
+"  デフォルト値: None"
 
 msgid ""
 "\n"
@@ -15858,25 +16433,60 @@
 "\"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid ""
-"Specifies profiling format and file output. In this section\n"
-"description, 'profiling data' stands for the raw data collected\n"
-"during profiling, while 'profiling report' stands for a statistical\n"
-"text report generated from the profiling data. The profiling is done\n"
-"using lsprof."
-msgstr ""
-"プロファイルの形式と、 出力ファイルに関する設定。\n"
+"Specifies profiling type, format, and file output. Two profilers are\n"
+"supported: an instrumenting profiler (named ``ls``), and a sampling\n"
+"profiler (named ``stat``)."
+msgstr ""
+"プロファイリングの種別、 形式および出力先の設定。 指定可能な種別は、\n"
+"精密プロファイル (名称: ``ls``) と、 サンプリングプロファイル (名称:\n"
+"``stat``) の2種類です。"
+
+msgid ""
+"In this section description, 'profiling data' stands for the raw data\n"
+"collected during profiling, while 'profiling report' stands for a\n"
+"statistical text report generated from the profiling data. The\n"
+"profiling is done using lsprof."
+msgstr ""
 "以下の説明では、 プロファイル期間に採取される生データの事を\n"
 "'プロファイルデータ'、 プロファイルデータを元にした、\n"
 "テキスト形式の統計報告を 'プロファイル報告' と呼称します。\n"
 "プロファイル採取には、 lsprof が用いられます。"
 
 msgid ""
+"``type``\n"
+"    The type of profiler to use.\n"
+"    Default: ls."
+msgstr ""
+"``type``\n"
+"    使用するプロファイラ種別。 デフォルト値: ls."
+
+msgid ""
+"    ``ls``\n"
+"      Use Python's built-in instrumenting profiler. This profiler\n"
+"      works on all platforms, but each line number it reports is the\n"
+"      first line of a function. This restriction makes it difficult to\n"
+"      identify the expensive parts of a non-trivial function.\n"
+"    ``stat``\n"
+"      Use a third-party statistical profiler, statprof. This profiler\n"
+"      currently runs only on Unix systems, and is most useful for\n"
+"      profiling commands that run for longer than about 0.1 seconds."
+msgstr ""
+"    ``ls``\n"
+"      Python 組み込みの詳細プロファイラ。 どの環境でも利用できますが、\n"
+"      報告される行番号は、 常に関数の冒頭行に固定されます。 そのため、\n"
+"      入り組んだ関数内部の、 高コストな部位は、 特定が困難です。\n"
+"    ``stat``\n"
+"      サードパーティ製の statprof。 現時点では Unix 環境でのみ使用でき、\n"
+"      0.1 秒以上を要するコマンド実行の解析で有用です。"
+
+msgid ""
 "``format``\n"
-"    Profiling format.\n"
+"    Profiling format.  Specific to the ``ls`` instrumenting profiler.\n"
 "    Default: text."
 msgstr ""
 "``format``\n"
-"    プロファイル形式。 デフォルト値: text"
+"    プロファイル形式。 詳細プロファイラ ``ls`` 固有の設定。\n"
+"    デフォルト値: text"
 
 msgid ""
 "    ``text``\n"
@@ -15896,6 +16506,15 @@
 "      当該ファイルは直接 kcachegrind で読み込めます。"
 
 msgid ""
+"``frequency``\n"
+"    Sampling frequency.  Specific to the ``stat`` sampling profiler.\n"
+"    Default: 1000."
+msgstr ""
+"``frequency``\n"
+"    サンプリング頻度。 サンプリングプロファイラ ``stat`` 固有の設定。\n"
+"    デフォルト値: 1000."
+
+msgid ""
 "``output``\n"
 "    File path where profiling data or report should be saved. If the\n"
 "    file exists, it is replaced. Default: None, data is printed on\n"
@@ -15954,6 +16573,15 @@
 "    デフォルト値: True"
 
 msgid ""
+"``preferuncompressed``\n"
+"    When set, clients will try to use the uncompressed streaming\n"
+"    protocol. Default is False."
+msgstr ""
+"``preferuncompressed``\n"
+"    真値が設定された場合、 クライアントは非圧縮での転送を試みます。\n"
+"    デフォルト値: False"
+
+msgid ""
 "``validate``\n"
 "    Whether to validate the completeness of pushed changesets by\n"
 "    checking that all new file revisions specified in manifests are\n"
@@ -15965,27 +16593,99 @@
 "    データの完全性を確認します。 デフォルト値: False"
 
 msgid ""
+"``smtp``\n"
+"\"\"\"\"\"\"\"\""
+msgstr ""
+"``smtp``\n"
+"\"\"\"\"\"\"\"\""
+
+msgid "Configuration for extensions that need to send email messages."
+msgstr "電子メールを送信するエクステンション向け設定。"
+
+msgid ""
+"``host``\n"
+"    Host name of mail server, e.g. \"mail.example.com\"."
+msgstr ""
+"``host``\n"
+"    SMTP サーバのホスト名。 設定例: \"mail.example.com\""
+
+msgid ""
+"``port``\n"
+"    Optional. Port to connect to on mail server. Default: 25."
+msgstr ""
+"``port``\n"
+"    省略可能。 SMTP サーバのポート番号。 デフォルト値: 25"
+
+msgid ""
+"``tls``\n"
+"    Optional. Method to enable TLS when connecting to mail server: "
+"starttls,\n"
+"    smtps or none. Default: none."
+msgstr ""
+"``tls``\n"
+"    省略可能。 SMTP サーバ接続における TLS 接続の有無/方式の指定。\n"
+"    starttls、 smtps ないし none。 デフォルト値: none"
+
+msgid ""
+"``username``\n"
+"    Optional. User name for authenticating with the SMTP server.\n"
+"    Default: none."
+msgstr ""
+"``username``\n"
+"    省略可能。 SMTP サーバ接続の認証におけるユーザ名。\n"
+"    デフォルト値: none"
+
+msgid ""
+"``password``\n"
+"    Optional. Password for authenticating with the SMTP server. If not\n"
+"    specified, interactive sessions will prompt the user for a\n"
+"    password; non-interactive sessions will fail. Default: none."
+msgstr ""
+"``password``\n"
+"    省略可能。 SMTP サーバ接続の認証におけるパスワード。\n"
+"    無指定の場合、 対話的な実行であれば、\n"
+"    パスワード入力プロンプトが表示されますが、\n"
+"    非対話的な実行であれば、 処理が中断されます。\n"
+"    デフォルト値: none"
+
+msgid ""
+"``local_hostname``\n"
+"    Optional. It's the hostname that the sender can use to identify\n"
+"    itself to the MTA."
+msgstr ""
+"``local_hostname``\n"
+"    省略可能。 MTA に対して、 送信元を指定するためのホスト名。"
+
+msgid ""
+"\n"
 "``subpaths``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"\n"
 "``subpaths``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\""
 
-msgid "Defines subrepositories source locations rewriting rules of the form::"
-msgstr "副リポジトリの元位置情報を書き換える、 以下の形式の設定::"
+msgid ""
+"Subrepository source URLs can go stale if a remote server changes name\n"
+"or becomes temporarily unavailable. This section lets you define\n"
+"rewrite rules of the form::"
+msgstr ""
+"連携先ホストの名称変更や一時的な停止などで、 副リポジトリの参照先 URL が、\n"
+"無効になる場合があります。 本セクションでは、 参照先 URL の書き換えを、\n"
+"以下の形式で記述できます::"
 
 msgid "    <pattern> = <replacement>"
 msgstr "    <パターン> = <置換結果>"
 
 msgid ""
-"Where ``pattern`` is a regular expression matching the source and\n"
-"``replacement`` is the replacement string used to rewrite it. Groups\n"
-"can be matched in ``pattern`` and referenced in ``replacements``. For\n"
-"instance::"
-msgstr ""
-"``パターン`` には元位置情報に対する正規表現を、\n"
-"``置換結果`` には元位置情報の書き換え内容を記述します。\n"
-"``パターン`` におけるグループ表記は ``置換結果`` で参照可能です。\n"
+"where ``pattern`` is a regular expression matching a subrepository\n"
+"source URL and ``replacement`` is the replacement string used to\n"
+"rewrite it. Groups can be matched in ``pattern`` and referenced in\n"
+"``replacements``. For instance::"
+msgstr ""
+"``パターン`` には副リポジトリの参照先 URL に合致する正規表現を、\n"
+"``置換結果`` には参照先 URL の書き換え結果を記述します。\n"
+"``パターン`` でのグループ表記への合致は、``置換結果`` で参照可能です。\n"
 "記述例を以下に示します::"
 
 msgid "    http://server/(.*)-hg/ = http://hg.server/\\1/"
@@ -15996,8 +16696,14 @@
 "上記設定によって、 ``http://server/foo-hg/`` は\n"
 "``http://hg.server/foo/`` に書き換えられます。"
 
-msgid "All patterns are applied in definition order."
-msgstr "記述順序に従い、 全てのパターン記述が適用されます。"
+msgid ""
+"Relative subrepository paths are first made absolute, and the the\n"
+"rewrite rules are then applied on the full (absolute) path. The rules\n"
+"are applied in definition order."
+msgstr ""
+"副リポジトリの参照先 URL が相対パスの場合、 書き換えの``パターン``は、\n"
+"参照先 URL を絶対パス化した後で、 絶対パス全体に適用されます。\n"
+"書き換えの適用は、 記述順に実施されます。"
 
 msgid ""
 "``trusted``\n"
@@ -16220,6 +16926,15 @@
 "    clone/push/pull 処理における遠隔実行コマンド。 デフォルト値: ``hg``"
 
 msgid ""
+"``reportoldssl``\n"
+"    Warn if an SSL certificate is unable to be due to using Python\n"
+"    2.5 or earlier. True or False. Default is True."
+msgstr ""
+"``reportoldssl``\n"
+"    Python 2.5 以前の使用により、 SSL 証明書の処理ができない場合の、\n"
+"    警告表示を指定する真偽値。 デフォルト値: True"
+
+msgid ""
 "``report_untrusted``\n"
 "    Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a\n"
 "    trusted user or group. True or False. Default is True."
@@ -16501,7 +17216,7 @@
 "    authority certificates. Environment variables and ``~user``\n"
 "    constructs are expanded in the filename. If specified on the\n"
 "    client, then it will verify the identity of remote HTTPS servers\n"
-"    with these certificates. The form must be as follows::"
+"    with these certificates."
 msgstr ""
 "``cacerts``\n"
 "    PEM 符号化形式の証明書認証局証明書一覧格納ファイルへのパス。\n"
@@ -16510,6 +17225,35 @@
 "    HTTPS サーバが認証されます。 ファイルの形式例を以下に示します::"
 
 msgid ""
+"    This feature is only supported when using Python 2.6 or later. If you "
+"wish\n"
+"    to use it with earlier versions of Python, install the backported\n"
+"    version of the ssl library that is available from\n"
+"    ``http://pypi.python.org``."
+msgstr ""
+"    本機能は Python 2.6 以降で利用可能です。 それ以前の Python において、\n"
+"    本機能を利用する場合は、 ``http://pypi.python.org`` から入手できる\n"
+"    SSL ライブラリの後方移植版をインストールしてください。"
+
+msgid ""
+"    To disable SSL verification temporarily, specify ``--insecure`` from\n"
+"    command line."
+msgstr ""
+"    SSL の証明書検証を、 一時的に停止したい場合は、 コマンドライン上で\n"
+"    ``--insecure`` を指定してください。"
+
+msgid ""
+"    You can use OpenSSL's CA certificate file if your platform has\n"
+"    one. On most Linux systems this will be\n"
+"    ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to\n"
+"    generate this file manually. The form must be as follows::"
+msgstr ""
+"    OpenSSL の CA 証明書ファイルがあれば、 それを利用しても構いません。\n"
+"    多くの Linux システムでは、 ``/etc/ssl/certs/ca-certificates.crt``\n"
+"    に格納されている筈です。 それ以外は、 手動で生成する必要があります。\n"
+"    ファイルの形式を以下に示します::"
+
+msgid ""
 "        -----BEGIN CERTIFICATE-----\n"
 "        ... (certificate in base64 PEM encoding) ...\n"
 "        -----END CERTIFICATE-----\n"
@@ -16525,34 +17269,6 @@
 "        -----END CERTIFICATE-----"
 
 msgid ""
-"    This feature is only supported when using Python 2.6 or later. If you "
-"wish\n"
-"    to use it with earlier versions of Python, install the backported\n"
-"    version of the ssl library that is available from\n"
-"    ``http://pypi.python.org``."
-msgstr ""
-"    本機能は Python 2.6 以降で利用可能です。 それ以前の Python において、\n"
-"    本機能を利用する場合は、 ``http://pypi.python.org`` から入手できる\n"
-"    SSL ライブラリの後方移植版をインストールしてください。"
-
-msgid ""
-"    You can use OpenSSL's CA certificate file if your platform has one.\n"
-"    On most Linux systems this will be ``/etc/ssl/certs/ca-certificates."
-"crt``.\n"
-"    Otherwise you will have to generate this file manually."
-msgstr ""
-"    OpenSSL の CA 証明書ファイルがあれば、 それを利用しても構いません。\n"
-"    多くの Linux システムでは、 ``/etc/ssl/certs/ca-certificates.crt``\n"
-"    に格納されている筈です。 それ以外は、 手動で生成する必要があります。"
-
-msgid ""
-"    To disable SSL verification temporarily, specify ``--insecure`` from\n"
-"    command line."
-msgstr ""
-"    SSL の証明書検証を、 一時的に停止したい場合は、 コマンドライン上で\n"
-"    ``--insecure`` を指定してください。"
-
-msgid ""
 "``cache``\n"
 "    Whether to support caching in hgweb. Defaults to True."
 msgstr ""
@@ -17246,7 +17962,7 @@
 "文字列指定の冒頭に ``r`` を付けます。 例: ``r'...'``."
 
 msgid "There is a single prefix operator:"
-msgstr "使用可能な単項演算子を以下に列挙します:"
+msgstr "使用可能な前置単項演算子を以下に列挙します:"
 
 msgid ""
 "``not x``\n"
@@ -17378,11 +18094,11 @@
 "    (名詞) [ブランチ] ヘッドではない (= 他に子リビジョンを持つ)\n"
 "    リビジョンを親として、 作成された子リビジョン。\n"
 "    これは 「位相的 (topological) ブランチ」 と呼ばれます。\n"
-"    ('Branch, topological' 参照) 位相的ブランチに名前が付与された場合は\n"
-"    「名前付きブランチ」、 名前を持たない場合は、 「名前無しブランチ」\n"
-"    と呼ばれます。 (※ 訳注: 名前を「持たない」は、 「親と異なる名前」\n"
-"    を持つことを意味します) 'Branch, anonymous' および 'Branch, named'\n"
-"    も参照してください。"
+"    ('Branch, topological' 参照) 位相的ブランチが名前を持つ場合は\n"
+"    「名前付きブランチ」、 名前を持たない場合は「名前無しブランチ」\n"
+"    と呼ばれます。 (※ 訳注: 名前を「持つ/持たない」は、\n"
+"    「親と異なる名前」を持つ/持たない、 を意味します)\n"
+"    'Branch, anonymous' および 'Branch, named' も参照してください。"
 
 msgid ""
 "    Branches may be created when changes are pulled from or pushed to\n"
@@ -17444,7 +18160,7 @@
 "Branch, default\n"
 "    [デフォルトブランチ] 所属する名前付きブランチが、 明示されない場合に、\n"
 "    新規リビジョンが属する名前付きブランチ。 (※ 訳注: 親リビジョンが、\n"
-"    既に default 以外の名前付きリビジョンに属する場合、 所属ブランチは、\n"
+"    既に default 以外の名前付きブランチに属する場合、 所属ブランチは、\n"
 "    明示されているものとして扱われます)"
 
 msgid ""
@@ -17636,11 +18352,10 @@
 
 msgid ""
 "Close changeset\n"
-"    See 'Changeset, close'."
+"    See 'Head, closed branch'"
 msgstr ""
 "Close changeset\n"
-"    'Changeset, close' を参照してください。\n"
-"    (※ 訳注: 'Branch, closed' の間違いか?)"
+"    'Head, closed branch' を参照してください。"
 
 msgid ""
 "Closed branch\n"
@@ -17859,6 +18574,13 @@
 "    で名前が列挙されなくなります。"
 
 msgid ""
+"    Closed heads can be re-opened by committing new changeset as the\n"
+"    child of the changeset that marks a head as closed."
+msgstr ""
+"    閉鎖ブランチのヘッドに対して、 新規の子リビジョンを生成することで、\n"
+"    当該ヘッドの閉鎖状態が解消されます。"
+
+msgid ""
 "Head, repository\n"
 "    A topological head which has not been closed."
 msgstr ""
@@ -18348,16 +19070,22 @@
 "and a regexp pattern of the form ``\\.c$`` will do the same. To root a\n"
 "regexp pattern, start it with ``^``."
 msgstr ""
-"glob と regexp のいずれの場合も、 リポジトリルートからの相対パスに対する\n"
-"部分一致で合致とみなされます。(※ 訳注: コマンドに対する ``-I`` および\n"
-"``-X`` の場合、 ルートからの相対パスに対して、\n"
-"先頭からの合致が要求されます)\n"
-"glob 文法での ``*.c`` パターン指定は、\n"
+"glob と regexp のいずれの場合も、 作業領域ルートからの相対パスに対して、\n"
+"部分一致すれば合致とみなされます。 glob 文法での ``*.c`` パターン指定は、\n"
 "任意のディレクトリにおける ``.c`` 拡張子ファイルに合致しますし、\n"
-"regexp 文法での ``\\.c$`` パターン指定も、\n"
-"同様のファイルに合致します。\n"
-"ルート直下のファイルにのみ合致させたい場合、\n"
-"regexp 文法であれば、 パターン記述を ``^`` で開始してください。"
+"regexp 文法での ``\\.c$`` パターン指定も、 同様のファイルに合致します。\n"
+"ルート直下のファイルにのみ合致させたい場合、 regexp 文法であれば、\n"
+"パターン記述を ``^`` で開始してください。"
+
+msgid ""
+".. note::\n"
+"  Patterns specified in other than ``.hgignore`` are always rooted.\n"
+"  Please see :hg:`help patterns` for details."
+msgstr ""
+".. note::\n"
+"  ``.hgignore`` 以外の記述では、 作業領域ルートからの相対パスに対して、\n"
+"  パス先頭からのパターン合致が要求されます。 詳細は :hg:`help patterns`\n"
+"  を参照してください。"
 
 msgid ""
 "Example\n"
@@ -18587,65 +19315,8 @@
 "merge tools are:"
 msgstr "以下のような内部マージツールも利用可能です:"
 
-msgid ""
-"``internal:merge``\n"
-"   Uses the internal non-interactive simple merge algorithm for merging\n"
-"   files. It will fail if there are any conflicts and leave markers in\n"
-"   the partially merged file."
-msgstr ""
-"``internal:merge``\n"
-"   非対話的な、 単純なマージ処理を実施します。\n"
-"   衝突があった場合、 マージ処理は失敗とみなされますが、\n"
-"   マージ結果ファイルには、 衝突マークが記録されます。"
-
-msgid ""
-"``internal:fail``\n"
-"   Rather than attempting to merge files that were modified on both\n"
-"   branches, it marks them as unresolved. The resolve command must be\n"
-"   used to resolve these conflicts."
-msgstr ""
-"   変更内容に関するマージ処理は実施せず、 必ずマージ失敗とみなします。\n"
-"   マージ失敗とみなされたファイルに対しては、\n"
-"   :hg:`resolve` による手動での衝突解消が必要です。"
-
-msgid ""
-"``internal:local``\n"
-"   Uses the local version of files as the merged version."
-msgstr ""
-"``internal:local``\n"
-"   マージ結果として、 作業領域側の内容を採用します。"
-
-msgid ""
-"``internal:other``\n"
-"   Uses the other version of files as the merged version."
-msgstr "   マージ結果として、 マージ対象リビジョン側の内容を採用します。"
-
-msgid ""
-"``internal:prompt``\n"
-"   Asks the user which of the local or the other version to keep as\n"
-"   the merged version."
-msgstr ""
-"``internal:prompt``\n"
-"   作業領域側とマージ対象リビジョン側のどちらを、\n"
-"   マージ結果として採用するか、 対話的に確認します。"
-
-msgid ""
-"``internal:dump``\n"
-"   Creates three versions of the files to merge, containing the\n"
-"   contents of local, other and base. These files can then be used to\n"
-"   perform a merge manually. If the file to be merged is named\n"
-"   ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
-"   ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
-"   same directory as ``a.txt``."
-msgstr ""
-"``internal:dump``\n"
-"   作業領域側、 マージ対象リビジョン側、 および共通祖先時点の、\n"
-"   それぞれの内容を持つ3つのファイルを生成します。\n"
-"   これらのファイルは、事後の手動マージ等で使用してください。\n"
-"   対象ファイル名が ``a.txt`` であった場合、\n"
-"   生成されるファイルはそれぞれ ``a.txt.local``、 ``a.txt.other``\n"
-"   および ``a.txt.base`` と命名され、\n"
-"   ``a.txt`` と同じディレクトリに格納されます。"
+msgid ".. internaltoolsmarker"
+msgstr ".. internaltoolsmarker"
 
 msgid ""
 "Internal tools are always available and do not require a GUI but will by "
@@ -18818,6 +19489,16 @@
 msgstr "別な形式でのパターン記述の際には、 明示的に種別を指定してください。"
 
 msgid ""
+".. note::\n"
+"  Patterns specified in ``.hgignore`` are not rooted. \n"
+"  Please see :hg:`help hgignore` for details."
+msgstr ""
+".. note::\n"
+"  ``.hgignore`` での記述では、 作業領域ルートからの相対パスに対して、\n"
+"  部分一致のみで合致判定されます。 詳細は :hg:`help hgignore`\n"
+"  を参照してください。"
+
+msgid ""
 "To use a plain path name without any pattern matching, start it with\n"
 "``path:``. These path names must completely match starting at the\n"
 "current repository root."
@@ -18832,9 +19513,9 @@
 "in the current directory ending with ``.c``."
 msgstr ""
 "拡張ワイルドカード合致の場合、 名前の前に ``glob:`` を記述します。\n"
-"この形式は現ディレクトリからの相対合致になりますので、\n"
-"``*.c`` パターンと合致するのは、\n"
-"末尾が ``.c`` で終わる、現ディレクトリ中のファイルのみです。"
+"この形式での合致判定は、 現ディレクトリからの相対パスに対しての、\n"
+"パス先頭からのパターン合致となりますので、 ``*.c`` と合致するのは、\n"
+"現ディレクトリ直下の末尾が ``.c`` で終わるファイルのみです。"
 
 msgid ""
 "The supported glob syntax extensions are ``**`` to match any string\n"
@@ -18848,10 +19529,8 @@
 "Regexp pattern matching is anchored at the root of the repository."
 msgstr ""
 "Perl/Python 形式の正規表現の場合、 名前の前に ``re:`` を記述します。\n"
-"正規表現形式では、 作業領域ルートからの相対パスに対して、\n"
-"その先頭からパターンが一致することが要求されます。\n"
-"(※ 訳注: .hgignore での指定では、 相対パスとの部分一致で許されるため、\n"
-"場合によっては書き分ける必要があります)。"
+"正規表現形式でのパターンは、 作業領域ルートからの相対パスに対して、\n"
+"常に先頭からのパターン合致が要求されます。"
 
 msgid ""
 "To read name patterns from a file, use ``listfile:`` or ``listfile0:``.\n"
@@ -19249,7 +19928,7 @@
 "  ``x~0`` はリビジョン自身、 ``x~3`` は ``x^^^`` と等価。"
 
 msgid "There is a single postfix operator:"
-msgstr "使用可能な単項演算子を以下に列挙します:"
+msgstr "使用可能な後置単項演算子を以下に列挙します:"
 
 msgid ""
 "``x^``\n"
@@ -19403,20 +20082,20 @@
 "   任意の場所に配置可能です。"
 
 msgid ""
-"2. Nested repository references. They are defined in ``.hgsub`` and\n"
+"2. Nested repository references. They are defined in ``.hgsub``, which\n"
+"   should be placed in the root of working directory, and\n"
 "   tell where the subrepository checkouts come from. Mercurial\n"
 "   subrepositories are referenced like:"
 msgstr ""
-"2. 入れ子リポジトリへの参照。 副リポジトリの連携先情報を、 ``.hgsub``\n"
-"   において記述します。 (※ 訳注: ``.hgsub`` の配置場所は、\n"
-"   親リポジトリのルート直下です) Mercurial の副リポジトリ参照は、\n"
-"   以下のように記述します:"
+"2. 入れ子リポジトリへの参照。 親リポジトリの作業領域ルート直下に配置した\n"
+"   ``.hgsub`` において、 副リポジトリの参照先を記述します。 Mercurial\n"
+"   の副リポジトリの参照先は、 以下のように記述します:"
 
 msgid "     path/to/nested = https://example.com/nested/repo/path"
 msgstr "     入れ子/作業領域/パス = https://example.com/nested/repo/path"
 
 msgid "   Git and Subversion subrepos are also supported:"
-msgstr "   Git や Subversion の副リポジトリでは以下のようにも記述可能です:"
+msgstr "   Git や Subversion も副リポジトリとして利用可能です:"
 
 msgid ""
 "     path/to/nested = [git]git://example.com/nested/repo/path\n"
@@ -19431,7 +20110,7 @@
 "   is the source repository path. The source can also reference a\n"
 "   filesystem path."
 msgstr ""
-"   ``入れ子/作業領域/パス`` は、 Mercurial 親リポジトリのルートに対する、\n"
+"   ``入れ子/作業領域/パス`` は、 親リポジトリの作業領域ルートに対する、\n"
 "   副リポジトリ作業領域の相対パス、\n"
 "   ``https://example.com/nested/repo/path`` は、\n"
 "   副リポジトリの連携先情報です。 連携先には、\n"
@@ -19444,19 +20123,21 @@
 msgstr ""
 "   Mercurial リポジトリは、 ``.hgsub`` を自動的には生成しませんので、\n"
 "   副リポジトリを使用する際には、 手動で ``.hgsub`` を生成し、\n"
-"   親リポジトリに追加する必要があります。"
-
-msgid ""
-"3. Nested repository states. They are defined in ``.hgsubstate`` and\n"
+"   親リポジトリにおいて、 履歴管理対象に追加する必要があります。"
+
+msgid ""
+"3. Nested repository states. They are defined in ``.hgsubstate``, which\n"
+"   is placed in the root of working directory, and\n"
 "   capture whatever information is required to restore the\n"
 "   subrepositories to the state they were committed in a parent\n"
 "   repository changeset. Mercurial automatically record the nested\n"
 "   repositories states when committing in the parent repository."
 msgstr ""
-"3. 入れ子リポジトリの状態情報。 ``.hgsubstate`` に記録され、\n"
-"   親リポジトリでのコミット時点における副リポジトリの状態を、\n"
-"   復旧するのに必要な情報が格納されます。 このファイルの生成は、\n"
-"   親リポジトリでのコミットの際に Mercurial によって自動的に実施されます。"
+"3. 入れ子リポジトリの状態情報。 親リポジトリのルート直下に配置された\n"
+"   ``.hgsubstate`` において、 親リポジトリでのコミット時点における、\n"
+"   副リポジトリの状態を復旧するために、 必要な情報が格納されます。\n"
+"   このファイルの生成は、 親リポジトリでのコミットの際に、 Mercurial\n"
+"   によって自動的に実施されます。"
 
 msgid ""
 "   .. note::\n"
@@ -19482,16 +20163,15 @@
 "subrepository is tracked and the next commit will record its state in\n"
 "``.hgsubstate`` and bind it to the committed changeset."
 msgstr ""
-"まだ ``.hgsub`` が存在しない場合は、 親リポジトリにおいて、\n"
-"手動でこのファイルを作成してください。 (※ 訳注: ``.hgsub`` の配置場所は、\n"
-"親リポジトリのルート直下です)。 親リポジトリの作業領域中の任意の場所に、\n"
-"外部リポジトリを元に作業領域を生成 (checkout) してください。\n"
-"この外部リポジトリのためのエントリを ``.hgsub`` に追加してください。\n"
-"これ以後この副リポジトリは構成管理対象となり、 次回のコミットにおいて、\n"
+"まだ ``.hgsub`` が親リポジトリに存在しない場合は、 手動で作成した上で、\n"
+"履歴管理対象に登録してください。 親リポジトリの作業領域中の任意の場所に、\n"
+"外部リポジトリを元に、 作業領域を生成 (checkout) してください。\n"
+"追加対象の外部リポジトリのためのエントリを ``.hgsub`` に追加してください。\n"
+"これ以後、 この副リポジトリは構成管理対象となり、 次回のコミットにおいて、\n"
 "``.hgsubstate`` に状態が記録され、 親リポジトリのリビジョンに対して、\n"
 "対応付けが行われます。 (※ 訳注: 副リポジトリに関する「構成管理」は、\n"
-"あくまで 「親リポジトリの各リビジョンと対応するのが、\n"
-"副リポジトリのどのリビジョンであるか?」 という対応付け情報のみです)"
+"あくまで 「親リポジトリの各リビジョンが、 副リポジトリのどのリビジョンと、\n"
+"どう対応するのか?」 という対応付け情報のみです)"
 
 msgid ""
 "Synchronizing a Subrepository\n"
@@ -20161,14 +20841,6 @@
 msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
 msgstr "作業領域の .hgtags が変更されています(手動でコミットしてください)"
 
-#, python-format
-msgid "working directory has unknown parent '%s'!"
-msgstr "作業領域の親 '%s' が未知のリビジョンです!"
-
-#, python-format
-msgid "unknown revision '%s'"
-msgstr "'%s' は未知のリビジョンです"
-
 msgid "abandoned transaction found - run hg recover"
 msgstr "中断トランザクションを検出 - 'hg recover' を実施してください"
 
@@ -20229,12 +20901,16 @@
 msgid "cannot partially commit a merge (do not specify files or patterns)"
 msgstr "マージの部分コミットはできません(ファイル名/パターンは指定できません)"
 
-msgid "can't commit subrepos without .hgsub"
-msgstr ".hgsub の無い副リポジトリはコミットできません"
+#, python-format
+msgid "commit with new subrepo %s excluded"
+msgstr "コミット対象に、新規副リポジトリ %s が含まれていません"
 
 msgid "use --subrepos for recursive commit"
 msgstr "--subrepos 指定で再帰コミット"
 
+msgid "can't commit subrepos without .hgsub"
+msgstr ".hgsub の無い副リポジトリはコミットできません"
+
 msgid "file not found!"
 msgstr "ファイルが見つかりません!"
 
@@ -20244,6 +20920,9 @@
 msgid "file not tracked!"
 msgstr "ファイルは未登録です!"
 
+msgid "cannot commit merge with missing files"
+msgstr "管理対象ファイルが不在の状況では、マージ結果をコミットできません"
+
 msgid "unresolved merge conflicts (see hg help resolve)"
 msgstr "未解消の衝突が残っています (hg help resolveを参照してください)"
 
@@ -20587,21 +21266,30 @@
 msgid "bad hunk #%d old text line %d"
 msgstr "不正なハンク: #%d 元テキスト %d 行目"
 
-msgid "could not extract binary patch"
-msgstr "バイナリパッチの適用に失敗"
-
-#, python-format
-msgid "binary patch is %d bytes, not %d"
-msgstr "バイナリパッチのサイズ不正: 実サイズ %d, 想定サイズ %d"
+#, python-format
+msgid "could not extract \"%s\" binary data"
+msgstr "バイナリデータ \"%s\" が展開できません"
+
+#, python-format
+msgid "could not decode \"%s\" binary patch: %s"
+msgstr "バイナリパッチ \"%s\" の解析に失敗しました: %s"
+
+#, python-format
+msgid "\"%s\" length is %d bytes, should be %d"
+msgstr "バイナリパッチ \"%s\" の実サイズ %d と想定サイズ %d が異なります"
 
 #, python-format
 msgid "unable to strip away %d of %d dirs from %s"
-msgstr "%d 個のパス要素は、 %d 個のパス要素を持つ %s から除外できません"
+msgstr "%d 個のパス要素除外が、パス要素を %d 個しか持たない %s で失敗しました"
 
 msgid "undefined source and destination files"
 msgstr "パッチ対象のファイル名が指定されていません"
 
 #, python-format
+msgid "failed to synchronize metadata for \"%s\""
+msgstr "\"%s\" のメタデータの同期に失敗しました"
+
+#, python-format
 msgid "cannot create %s: destination already exists"
 msgstr "%s を作成できません: 作業先にすでに存在します"
 
@@ -20648,6 +21336,10 @@
 msgstr "ブランチを追加中\n"
 
 #, python-format
+msgid "error removing %s: %s\n"
+msgstr "ファイル %s の破棄に失敗: %s\n"
+
+#, python-format
 msgid "strip failed, full bundle stored in '%s'\n"
 msgstr "リビジョン除外に失敗: 完全なバンドルを '%s' に保存\n"
 
@@ -20881,7 +21573,11 @@
 "    Changesets connected to the specified filelog."
 msgstr ""
 "``filelog(pattern)``\n"
-"    パターンに合致するファイルに関連付けられたリビジョン群。"
+"    パターンに合致するファイルの改変に関連付けられたリビジョン群。\n"
+"    (※ 訳注: ``filelog()`` に合致するリビジョンは ``file()`` にも合致。\n"
+"    filelog 情報を元にするため、 ``file()`` と一致しない場合もある。\n"
+"    ``filelog()`` の方が高速だが、 合致しないリビジョンもあるため、\n"
+"    実行性能上の必要性が無ければ、 ``file()`` の利用を推奨)"
 
 msgid "filelog requires a pattern"
 msgstr "filelog にはパターンを指定してください"
@@ -20893,6 +21589,14 @@
 "``first(set, [n])``\n"
 "    limit() 記述の別名。"
 
+#, python-format
+msgid "%s takes no arguments or a filename"
+msgstr "%s の引数は、ファイル名か、引数無しです"
+
+#, python-format
+msgid "%s expected a filename"
+msgstr "%s にはファイル名を指定してください"
+
 msgid ""
 "``follow([file])``\n"
 "    An alias for ``::.`` (ancestors of the working copy's first parent).\n"
@@ -20903,13 +21607,6 @@
 "    ``::.`` (作業領域の第1親の祖先リビジョン群) 記述の別名。\n"
 "    ファイル名指定がある場合、 当該ファイルの履歴 (複製含む) を辿ります。"
 
-#. i18n: "follow" is a keyword
-msgid "follow takes no arguments or a filename"
-msgstr "follow の引数は最大1つです"
-
-msgid "follow expected a filename"
-msgstr "follow にはファイル名を指定してください"
-
 msgid ""
 "``all()``\n"
 "    All changesets, the same as ``0:tip``."
@@ -20942,12 +21639,31 @@
 msgid "invalid match pattern: %s"
 msgstr "不正なマッチングパターン: %s"
 
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles requires at least one argument"
+msgstr "_matchfiles には最低1つの引数が必要です"
+
+msgid "_matchfiles requires string arguments"
+msgstr "_matchfiles には文字列引数が必要です"
+
+msgid "_matchfiles expected at most one revision"
+msgstr "_matchfiles へのリビジョン指定は最大1つです"
+
+msgid "_matchfiles expected at most one default mode"
+msgstr "_matchfiles へのモード指定は最大1つです"
+
+#, python-format
+msgid "invalid _matchfiles prefix: %s"
+msgstr "不正な _matchfiles 前置詞指定: %s"
+
 msgid ""
 "``file(pattern)``\n"
 "    Changesets affecting files matched by pattern."
 msgstr ""
 "``file(pattern)``\n"
-"    パターンに合致するファイルに影響を与えるリビジョン群。"
+"    パターンに合致するファイルに改変を行ったリビジョン群。\n"
+"    (※ 訳注: ``filelog()`` に合致するリビジョンは ``file()`` にも合致。\n"
+"    リビジョン側情報で判定するため ``filelog()`` と一致しない場合もある。)"
 
 #. i18n: "file" is a keyword
 msgid "file requires a pattern"
@@ -21188,6 +21904,65 @@
 msgstr "rev には数値を指定してください"
 
 msgid ""
+"``matching(revision [, field])``\n"
+"    Changesets in which a given set of fields match the set of fields in "
+"the\n"
+"    selected revision or set."
+msgstr ""
+"``matching(revision [, field])``\n"
+"    指定リビジョン群 (revision) と、指定項目 (field) 値が同一な、\n"
+"    リビジョンの抽出 (※ 訳注: ``and`` 結合等での抽出元指定が無い場合、\n"
+"    全リビジョンが抽出元になります)。"
+
+msgid ""
+"    To match more than one field pass the list of fields to match separated\n"
+"    by spaces (e.g. ``author description``)."
+msgstr ""
+"    複数項目の合致判定は、 対象項目を空白区切りで指定します\n"
+"    (例: 'author description')。"
+
+msgid ""
+"    Valid fields are most regular revision fields and some special fields."
+msgstr "    リビジョンの一般的な項目以外に、 特別な項目も指定できます。"
+
+msgid ""
+"    Regular revision fields are ``description``, ``author``, ``branch``,\n"
+"    ``date``, ``files``, ``phase``, ``parents``, ``substate`` and ``user``.\n"
+"    Note that ``author`` and ``user`` are synonyms."
+msgstr ""
+"    一般的な項目には、``description``、 ``author``、 ``branch``、\n"
+"    ``date``、 ``files``、 ``phase``、 ``parents``、 ``substate`` および\n"
+"    ``user`` があります。 ``author`` と ``user`` は同一項目です。"
+
+msgid ""
+"    Special fields are ``summary`` and ``metadata``:\n"
+"    ``summary`` matches the first line of the description.\n"
+"    ``metatadata`` is equivalent to matching ``description user date``\n"
+"    (i.e. it matches the main metadata fields)."
+msgstr ""
+"    特殊項目には ``summary`` および ``metadata`` があります: ``summary``\n"
+"    は ``description`` の1行目に相当します。 ``metadata`` は\n"
+"    ``description user date`` との合致に相当します (この名称は、\n"
+"    「主なメタデータ項目との合致」判定に由来します)"
+
+msgid ""
+"    ``metadata`` is the default field which is used when no fields are\n"
+"    specified. You can match more than one field at a time."
+msgstr ""
+"    フィールド指定が無い場合、 ``metadata`` フィールドが対象となります。\n"
+"    同時に複数フィールドの合致判定が可能です。"
+
+msgid "matching takes 1 or 2 arguments"
+msgstr "matching の引数は1つか2つです"
+
+msgid "matching requires a string as its second argument"
+msgstr "matching の第2引数は文字列です"
+
+#, python-format
+msgid "unexpected field name passed to matching: %s"
+msgstr "matching への想定外のフィールド名指定: %s"
+
+msgid ""
 "``reverse(set)``\n"
 "    Reverse order of set."
 msgstr ""
@@ -21196,10 +21971,11 @@
 
 msgid ""
 "``roots(set)``\n"
-"    Changesets with no parent changeset in set."
+"    Changesets in set with no parent changeset in set."
 msgstr ""
 "``roots(set)``\n"
-"    親リビジョンが指定リビジョン群中に存在しない全リビジョン群。"
+"    指定リビジョン群中の、 親リビジョンが指定リビジョン群中に存在しない、\n"
+"    全リビジョン。"
 
 msgid ""
 "``secret()``\n"
@@ -21276,6 +22052,10 @@
 msgstr "シンボル以外が指定されました"
 
 #, python-format
+msgid "infinite expansion of revset alias \"%s\" detected"
+msgstr "revset 別名定義 \"%s\" は無限に展開されてしまいます"
+
+#, python-format
 msgid "invalid number of arguments: %s"
 msgstr "引数の数が不正です: %s"
 
@@ -21555,6 +22335,10 @@
 msgstr "副リポジトリ %s から %s へ反映中\n"
 
 #, python-format
+msgid "reverting subrepo %s\n"
+msgstr "副リポジトリ %s の変更取り消し中\n"
+
+#, python-format
 msgid "'svn' executable not found for subrepo '%s'"
 msgstr "副リポジトリ '%s' に使用する 'svn' コマンドが見つかりません"
 
@@ -21564,6 +22348,12 @@
 msgid "cannot commit svn externals"
 msgstr "svn 外部リポジトリに commit できません"
 
+msgid "cannot commit missing svn entries"
+msgstr "svn 管理対象に不在ファイルがある状態では commit できません"
+
+msgid "failed to commit svn changes"
+msgstr "svn への変更コミットに失敗しました"
+
 #, python-format
 msgid "not removing repo %s because it has changes.\n"
 msgstr "変更が含まれているため、 リポジトリ %s は削除されません\n"
@@ -21717,8 +22507,43 @@
 "    XML entities."
 msgstr ":obfuscate: 文字列。 全ての文字を XML エンティティ形式に変換します。"
 
-msgid ":person: Any text. Returns the text before an email address."
-msgstr ":person: 文字列。 メールアドレス直前の部分だけを取り出します。"
+msgid ""
+":person: Any text. Returns the name before an email address,\n"
+"    interpreting it as per RFC 5322."
+msgstr ""
+":person: 文字列。 メールアドレスを RFC 5322 形式で解析して、\n"
+"    名前部分だけを取り出します。"
+
+msgid ""
+"    >>> person('foo@bar')\n"
+"    'foo'\n"
+"    >>> person('Foo Bar <foo@bar>')\n"
+"    'Foo Bar'\n"
+"    >>> person('\"Foo Bar\" <foo@bar>')\n"
+"    'Foo Bar'\n"
+"    >>> person('\"Foo \"buz\" Bar\" <foo@bar>')\n"
+"    'Foo \"buz\" Bar'\n"
+"    >>> # The following are invalid, but do exist in real-life\n"
+"    ...\n"
+"    >>> person('Foo \"buz\" Bar <foo@bar>')\n"
+"    'Foo \"buz\" Bar'\n"
+"    >>> person('\"Foo Bar <foo@bar>')\n"
+"    'Foo Bar'"
+msgstr ""
+"    >>> person('foo@bar')\n"
+"    'foo'\n"
+"    >>> person('Foo Bar <foo@bar>')\n"
+"    'Foo Bar'\n"
+"    >>> person('\"Foo Bar\" <foo@bar>')\n"
+"    'Foo Bar'\n"
+"    >>> person('\"Foo \"buz\" Bar\" <foo@bar>')\n"
+"    'Foo \"buz\" Bar'\n"
+"    >>> # The following are invalid, but do exist in real-life\n"
+"    ...\n"
+"    >>> person('Foo \"buz\" Bar <foo@bar>')\n"
+"    'Foo \"buz\" Bar'\n"
+"    >>> person('\"Foo Bar <foo@bar>')\n"
+"    'Foo Bar'"
 
 msgid ""
 ":rfc3339date: Date. Returns a date using the Internet date format\n"
@@ -21781,8 +22606,15 @@
 ":urlescape: 文字列。 全ての「特殊」文字を変換します。\n"
 "    例えば \"foo bar\" は \"foo%20bar\" となります。"
 
-msgid ":user: Any text. Returns the user portion of an email address."
-msgstr ":user: 文字列。 メールアドレスのユーザ名部分を取り出します。"
+msgid ""
+":user: Any text. Returns a short representation of a user name or email\n"
+"    address."
+msgstr ""
+":user: 文字列。 ユーザ名ないしメールアドレスから、\n"
+"    ユーザ名の短縮形式部分を取り出します。"
+
+msgid ":emailuser: Any text. Returns the user portion of an email address."
+msgstr ":emailuser: 文字列。 メールアドレスのユーザ名部分を取り出します。"
 
 msgid ":author: String. The unmodified author of the changeset."
 msgstr ":author: 文字列。 リビジョンの作者名(記録情報そのまま)。"
@@ -21973,9 +22805,6 @@
 msgid "password: "
 msgstr "パスワード: "
 
-msgid "edit failed"
-msgstr "編集に失敗"
-
 msgid "http authorization required"
 msgstr "HTTP 認証に失敗"
 
--- a/i18n/pt_BR.po	Wed Apr 18 01:20:16 2012 +0300
+++ b/i18n/pt_BR.po	Wed May 02 12:55:44 2012 +0200
@@ -31,7 +31,7 @@
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2012-01-23 16:07-0200\n"
+"POT-Creation-Date: 2012-04-21 11:29-0300\n"
 "PO-Revision-Date: 2011-06-28 09:55+0200\n"
 "Last-Translator: Wagner Bruna <wbruna@yahoo.com>\n"
 "Language-Team: Brazilian Portuguese\n"
@@ -369,14 +369,14 @@
 "  imagens/** = joao, @designers"
 
 msgid ""
-"  # Everyone (except for \"user6\" - see acl.deny above) will have write\n"
-"  # access to any file under the \"resources\" folder (except for 1\n"
-"  # file. See acl.deny):\n"
+"  # Everyone (except for \"user6\" and \"@hg-denied\" - see acl.deny above)\n"
+"  # will have write access to any file under the \"resources\" folder\n"
+"  # (except for 1 file. See acl.deny):\n"
 "  src/main/resources/** = *"
 msgstr ""
-"  # Todos (exceto \"usuário6\" - veja acl.deny acima) terão acesso de\n"
-"  # escrita a qualquer arquivo sob a pasta \"resources\" (exceto um\n"
-"  # arquivo - veja acl.deny):\n"
+"  # Todos (exceto \"usuário6\" e \"@hg-denied\" - veja acl.deny acima)\n"
+"  # terão acesso de escrita a qualquer arquivo sob a pasta \"resources\"\n"
+"  # (exceto um arquivo - veja acl.deny):\n"
 "  src/main/resources/** = *"
 
 msgid "  .hgtags = release_engineer"
@@ -422,8 +422,13 @@
 "Os comentários são formatados usando o mecanismo de templates\n"
 "do Mercurial."
 
-msgid "The hook does not change bug status."
-msgstr "Esse gancho não muda o estado do bug."
+msgid ""
+"The bug references can optionally include an update for Bugzilla of the\n"
+"hours spent working on the bug. Bugs can also be marked fixed."
+msgstr ""
+"As referências para bugs podem opcionalmente incluir atualizações do\n"
+"registro do Bugzilla de horas de trabalho gastas com o bug. Bugs\n"
+"também podem ser marcados como corrigidos."
 
 msgid "Three basic modes of access to Bugzilla are provided:"
 msgstr "Três modos básicos de acesso ao Bugzilla são fornecidos:"
@@ -459,7 +464,7 @@
 "MySQL user and password to have full access rights to the Bugzilla\n"
 "database. For these reasons this access mode is now considered\n"
 "deprecated, and will not be updated for new Bugzilla versions going\n"
-"forward."
+"forward. Only adding comments is supported in this access mode."
 msgstr ""
 "A escrita direta na base de dados é suscetível a mudanças de schema,\n"
 "e se baseia em um script Bugzilla para enviar notificações de mudança\n"
@@ -469,21 +474,23 @@
 "do Bugzilla e um usuário e senha do MySQL que tenha acesso completo\n"
 "à base de dados do Bugzilla.\n"
 "Por essas razões, este modo de acesso é considerado obsoleto, e\n"
-"não será atualizado para novas versões do Bugzilla."
+"não será atualizado para novas versões do Bugzilla.\n"
+"Neste modo de acesso, apenas a adição de comentários é suportada."
 
 msgid ""
 "Access via XMLRPC needs a Bugzilla username and password to be specified\n"
 "in the configuration. Comments are added under that username. Since the\n"
 "configuration must be readable by all Mercurial users, it is recommended\n"
 "that the rights of that user are restricted in Bugzilla to the minimum\n"
-"necessary to add comments."
+"necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and later."
 msgstr ""
 "O acesso por XMLRPC necessita de um nome de usuário e senha do\n"
 "Bugzilla especificados na configuração. Comentários são adicionados\n"
 "sob tal nome de usuário. Como a configuração deve ser legível por\n"
 "todos os usuários do Mercurial, recomenda-se que os direitos desse\n"
 "usuário sejam restritos ao mínimo necessário para adicionar\n"
-"comentários."
+"comentários.\n"
+"Marcar bugs como corrigidos exige o Bugzilla versão 4.0 ou posterior."
 
 msgid ""
 "Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends\n"
@@ -492,7 +499,8 @@
 "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"
 "user, the email associated with the Bugzilla username used to log into\n"
-"Bugzilla is used instead as the source of the comment."
+"Bugzilla is used instead as the source of the comment. Marking bugs fixed\n"
+"works on all supported Bugzilla versions."
 msgstr ""
 "O acesso por XMLRPC/email usa XMLRPC para consultar o Bugzilla,\n"
 "mas envia um email para a interface de emails do Bugzilla para\n"
@@ -501,7 +509,9 @@
 "comentário parecerá vir do usuário do Mercurial. Se o email do\n"
 "usuário não for reconhecido pelo Bugzilla como um usuário do\n"
 "Bugzilla, a origem do comentário será o email associado ao nome\n"
-"de usuário do Bugzilla usado para entrar no Bugzilla."
+"de usuário do Bugzilla usado para entrar no Bugzilla.\n"
+"Marcar bugs como corrigidos funciona em todas as versões do\n"
+"Bugzilla suportadas."
 
 msgid "Configuration items common to all access modes:"
 msgstr "Itens de configuração comuns a todos os modos de acesso:"
@@ -530,18 +540,77 @@
 
 msgid ""
 "bugzilla.regexp\n"
-"  Regular expression to match bug IDs in changeset commit message.\n"
-"  Must contain one \"()\" group. The default expression matches ``Bug\n"
-"  1234``, ``Bug no. 1234``, ``Bug number 1234``, ``Bugs 1234,5678``,\n"
-"  ``Bug 1234 and 5678`` and variations thereof. Matching is case\n"
-"  insensitive."
+"  Regular expression to match bug IDs for update in changeset commit message.\n"
+"  It must contain one \"()\" named group ``<ids>`` containing the bug\n"
+"  IDs separated by non-digit characters. It may also contain\n"
+"  a named group ``<hours>`` with a floating-point number giving the\n"
+"  hours worked on the bug. If no named groups are present, the first\n"
+"  \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+"  updated. The default expression matches ``Bug 1234``, ``Bug no. 1234``,\n"
+"  ``Bug number 1234``, ``Bugs 1234,5678``, ``Bug 1234 and 5678`` and\n"
+"  variations thereof, followed by an hours number prefixed by ``h`` or\n"
+"  ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
 msgstr ""
 "bugzilla.regexp\n"
-"  Expressão regular para encontrar os IDs dos bugs na mensagem de\n"
-"  consolidação da revisão. Deve conter um grupo de \"()\". A\n"
-"  expressão padrão encontra ``Bug 1234``, ``Bug no. 1234``, ``Bug number\n"
-"  1234``, ``Bugs 1234,5678``, ``Bug 1234 and 5678`` e variações. A\n"
-"  equivalência não é sensível a maiúsculas e minúsculas."
+"  Expressão regular para encontrar na mensagem de consolidação da\n"
+"  revisão os IDs dos bugs a serem atualizados.\n"
+"  Deve conter um grupo \"()\" nomeado ``<ids>`` contendo os IDs de\n"
+"  bugs separados por não-dígitos. Pode também conter um grupo\n"
+"  nomeado ``<hours>`` com um valor de ponto flutuante fornecendo\n"
+"  as horas trabalhadas no bug. Se nenhum grupo nomeado estiver\n"
+"  presente, assume-se que o primeiro grupo \"()\" irá conter os\n"
+"  IDs dos bugs, e as horas trabalhadas não serão atualizadas.\n"
+"  A expressão padrão encontra\n"
+"  ``Bug 1234``, ``Bug no. 1234``, ``Bug number 1234``,\n"
+"  ``Bugs 1234,5678``, ``Bug 1234 and 5678`` e variações,\n"
+"  seguidas de um número de horas prefixado por ``h`` ou ``hours``,\n"
+"  como em ``hours 1.5``.\n"
+"  A busca não é sensível a maiúsculas e minúsculas."
+
+msgid ""
+"bugzilla.fixregexp\n"
+"  Regular expression to match bug IDs for marking fixed in changeset\n"
+"  commit message. This must contain a \"()\" named group ``<ids>` containing\n"
+"  the bug IDs separated by non-digit characters. It may also contain\n"
+"  a named group ``<hours>`` with a floating-point number giving the\n"
+"  hours worked on the bug. If no named groups are present, the first\n"
+"  \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+"  updated. The default expression matches ``Fixes 1234``, ``Fixes bug 1234``,\n"
+"  ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` and\n"
+"  variations thereof, followed by an hours number prefixed by ``h`` or\n"
+"  ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+"bugzilla.fixregexp\n"
+"  Expressão regular para encontrar na mensagem de consolidação da\n"
+"  revisão os IDs dos bugs a serem marcados como resolvidos.\n"
+"  Deve conter um grupo \"()\" nomeado ``<ids>`` contendo os IDs de\n"
+"  bugs separados por não-dígitos. Pode também conter um grupo\n"
+"  nomeado ``<hours>`` com um valor de ponto flutuante fornecendo\n"
+"  as horas trabalhadas no bug. Se nenhum grupo nomeado estiver\n"
+"  presente, assume-se que o primeiro grupo \"()\" irá conter os\n"
+"  IDs dos bugs, e as horas trabalhadas não serão atualizadas.\n"
+"  A expressão padrão encontra\n"
+"  ``Fixes 1234``, ``Fixes bug 1234``,\n"
+"  ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` e variações,\n"
+"  seguidas de um número de horas prefixado por ``h`` ou ``hours``,\n"
+"  como em ``hours 1.5``.\n"
+"  A busca não é sensível a maiúsculas e minúsculas."
+
+msgid ""
+"bugzilla.fixstatus\n"
+"  The status to set a bug to when marking fixed. Default ``RESOLVED``."
+msgstr ""
+"bugzilla.fixstatus\n"
+"  O status definido em um bug que tiver sido marcado como corrigido.\n"
+"  O padrão é ``RESOLVED``."
+
+msgid ""
+"bugzilla.fixresolution\n"
+"  The resolution to set a bug to when marking fixed. Default ``FIXED``."
+msgstr ""
+"bugzilla.fixresolution\n"
+"  A resolução definida em um bug que tiver sido marcado como corrigido.\n"
+"  O padrão é ``FIXED``."
 
 msgid ""
 "bugzilla.style\n"
@@ -942,6 +1011,10 @@
 msgstr "esquema de banco de dados desconhecido"
 
 #, python-format
+msgid "bug %d does not exist\n"
+msgstr "o bug %d não existe\n"
+
+#, python-format
 msgid "bug %d already knows about changeset %s\n"
 msgstr "o bug %d já sabe sobre a revisão %s\n"
 
@@ -975,6 +1048,14 @@
 msgid "cannot find bugzilla user id for %s or %s"
 msgstr "não é possível encontrar o id do usuário no bugzilla para %s ou %s"
 
+msgid "Bugzilla/MySQL cannot update bug state\n"
+msgstr "Bugzilla/MySQL não pode atualizar o estado do bug\n"
+
+msgid "Bugzilla/XMLRPC needs Bugzilla 4.0 or later to mark bugs fixed\n"
+msgstr ""
+"Bugzilla/XMLRPC requer o Bugzilla 4.0 ou posterior para marcar bugs como "
+"corrigidos\n"
+
 msgid "configuration 'bzemail' missing"
 msgstr "a configuração 'bzemail' está faltando"
 
@@ -986,6 +1067,10 @@
 msgid "bugzilla version %s not supported"
 msgstr "versão %s do bugzilla não suportada"
 
+#, python-format
+msgid "%s: invalid hours\n"
+msgstr "%s: horas inválidas\n"
+
 msgid ""
 "changeset {node|short} in repo {root} refers to bug {bug}.\n"
 "details:\n"
@@ -2061,8 +2146,8 @@
 msgstr "o tipo de origem bzr não pôde ser determinado\n"
 
 #, python-format
-msgid "%s is not a valid revision in current branch"
-msgstr "%s não é uma revisão válida no ramo atual"
+msgid "%s is not a valid revision"
+msgstr "%s não é uma revisão válida"
 
 #, python-format
 msgid "%s is not available in %s anymore"
@@ -3021,6 +3106,72 @@
 msgid "hg %s [OPTION]... [FILE]..."
 msgstr "hg %s [OPÇÃO]... [ARQUIVO]..."
 
+msgid "http authentication with factotum"
+msgstr "autenticação http com factotum"
+
+msgid ""
+"This extension allows the factotum facility on Plan 9 from Bell Labs platforms\n"
+"to provide authentication information for HTTP access. Configuration entries\n"
+"specified in the auth section as well as authentication information provided\n"
+"in the repository URL are fully supported. If no prefix is specified, a value\n"
+"of ``*`` will be assumed."
+msgstr ""
+"Esta extensão permite que o recurso factotum nas plataformas\n"
+"Plan 9 from Bell Labs forneçam informação de autenticação para\n"
+"acesso HTTP. Entradas de configuração especificadas na seção\n"
+"auth bem como informações de autenticação fornecidas na URL do\n"
+"repositório são inteiramente suportadas. Se nenhum prefixo for\n"
+"especificado, assume-se o valor ``*``."
+
+msgid "By default, keys are specified as::"
+msgstr "Por padrão, as chaves são especificadas da seguinte maneira::"
+
+msgid ""
+"  proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
+msgstr ""
+"  proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
+
+msgid ""
+"If the factotum extension is unable to read the required key, one will be\n"
+"requested interactively."
+msgstr ""
+"Se a extensão factotum for incapaz de ler a chave exigida, uma chave\n"
+"será solicitada interativamente."
+
+msgid ""
+"A configuration section is available to customize runtime behavior. By\n"
+"default, these entries are::"
+msgstr ""
+"A seção de configuração factotum pode ser usada para customização do\n"
+"comportamento da extensão. Por padrão, estas entradas são::"
+
+msgid ""
+"  [factotum]\n"
+"  executable = /bin/auth/factotum\n"
+"  mountpoint = /mnt/factotum\n"
+"  service = hg"
+msgstr ""
+"  [factotum]\n"
+"  executable = /bin/auth/factotum\n"
+"  mountpoint = /mnt/factotum\n"
+"  service = hg"
+
+msgid ""
+"The executable entry defines the full path to the factotum binary. The\n"
+"mountpoint entry defines the path to the factotum file service. Lastly, the\n"
+"service entry controls the service name used when reading keys."
+msgstr ""
+"A entrada executable define o caminho completo para o binário\n"
+"factotum. A entrada mountpoint define o caminho para o serviço de\n"
+"arquivos do factotum. Por fim, a entrada service controla o nome do\n"
+"serviço usado ao ler chaves."
+
+msgid "factotum not interactive"
+msgstr "factotum não é interativo"
+
+msgid "factotum not responding"
+msgstr "factotum não está respondendo"
+
 msgid "pull, update and merge in one command"
 msgstr "pull, update e merge em um comando"
 
@@ -3046,15 +3197,14 @@
 "    atualizado para incluir as novas mudanças."
 
 msgid ""
-"    When a merge occurs, the newly pulled changes are assumed to be\n"
-"    \"authoritative\". The head of the new changes is used as the first\n"
-"    parent, with local changes as the second. To switch the merge\n"
-"    order, use --switch-parent."
-msgstr ""
-"    Quando ocorre uma mesclagem, assume-se que as novas mudanças\n"
-"    trazidas sejam \"autoritativas\". A nova cabeça é usada como\n"
-"    primeiro pai, e as mudanças locais como o segundo. Para mudar a\n"
-"    ordem de mesclagem, use --switch-parent."
+"    When a merge is needed, the working directory is first updated to\n"
+"    the newly pulled changes. Local changes are then merged into the\n"
+"    pulled changes. To switch the merge order, use --switch-parent."
+msgstr ""
+"    Quando uma mesclagem é necessária, o diretório de trabalho será\n"
+"    inicialmente atualizado para as revisões recém trazidas. As\n"
+"    revisões locais serão então mescladas com as novas revisões.\n"
+"    Para mudar essa ordem de mesclagem, use --switch-parent."
 
 msgid "    See :hg:`help dates` for a list of formats valid for -d/--date."
 msgstr ""
@@ -3250,23 +3400,68 @@
 msgid "-G/--graph option is incompatible with --%s"
 msgstr "a opção -G/--graph é incompatível com --%s"
 
-msgid "-G/--graph option is incompatible with --follow with file argument"
-msgstr "a opção -G/--graph é incompatível com --follow com a opção de arquivo"
-
-msgid "NUM"
-msgstr "NÚMERO"
-
-msgid "limit number of changes displayed"
-msgstr "número limite de mudanças exibidas"
-
-msgid "show patch"
-msgstr "mostra o patch"
+#, python-format
+msgid "cannot follow file not in parent revision: \"%s\""
+msgstr "não é possível seguir arquivo não presente na revisão pai: \"%s\""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr "não é possível seguir arquivo inexistente: \"%s\""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr ""
+"é possível acompanhar cópias/renomeações apenas para nomes de arquivo "
+"explícitos"
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr ""
+"acompanha histórico de revisões, ou histórico de arquivo através de cópias e"
+" renomeações"
+
+msgid "only follow the first parent of merge changesets (DEPRECATED)"
+msgstr "acompanha apenas o primeiro pai de revisões de mesclagem (OBSOLETO)"
+
+msgid "show revisions matching date spec"
+msgstr "mostra revisões que casem com a especificação de data"
+
+msgid "show copied files"
+msgstr "mostra arquivos copiados"
+
+msgid "do case-insensitive search for a given text"
+msgstr "faz uma busca insensível a maiúsculas / minúsculas por um texto dado"
 
 msgid "show the specified revision or range"
 msgstr "mostra a revisão ou sequência de revisões especificada"
 
-msgid "hg glog [OPTION]... [FILE]"
-msgstr "hg glog [OPÇÃO]... [ARQUIVO]"
+msgid "include revisions where files were removed"
+msgstr "inclui revisões nas quais arquivos foram removidos"
+
+msgid "show only merges (DEPRECATED)"
+msgstr "mostra apenas mesclagens (OBSOLETO)"
+
+msgid "USER"
+msgstr "USUÁRIO"
+
+msgid "revisions committed by user"
+msgstr "revisões de autoria do usuário"
+
+msgid "show only changesets within the given named branch (DEPRECATED)"
+msgstr "mostra apenas revisões dentro do ramo nomeado especificado (OBSOLETA)"
+
+msgid "BRANCH"
+msgstr "RAMO"
+
+msgid "show changesets within the given named branch"
+msgstr "mostra apenas revisões dentro do ramo nomeado especificado"
+
+msgid "do not display revision or any of its ancestors"
+msgstr "não exibe revisão ou qualquer de seus ancestrais"
+
+msgid "show hidden changesets (DEPRECATED)"
+msgstr "exibe revisões ocultas (OBSOLETO)"
+
+msgid "[OPTION]... [FILE]"
+msgstr "[OPÇÃO]... [ARQUIVO]"
 
 msgid "show revision history alongside an ASCII revision graph"
 msgstr "mostra histórico de revisões ao lado de um grafo ASCII de revisões"
@@ -3469,6 +3664,12 @@
 msgid "start interactive history viewer"
 msgstr "inicia um visualizador de histórico interativo"
 
+msgid "NUM"
+msgstr "NÚMERO"
+
+msgid "limit number of changes displayed"
+msgstr "número limite de mudanças exibidas"
+
 msgid "hg view [-l LIMIT] [REVRANGE]"
 msgstr "hg view [-l LIMITE] [SEQUÊNCIADEREVISÕES]"
 
@@ -4379,6 +4580,10 @@
 msgid "%d largefiles updated, %d removed\n"
 msgstr "%d largefiles atualizados, %d removidos\n"
 
+#, python-format
+msgid "largefile %s is not in cache and could not be downloaded"
+msgstr "o largefile %s não está no cache e não pôde ser baixado"
+
 msgid "minimum size (MB) for files to be converted as largefiles"
 msgstr "tamanho mínimo (MB) para arquivos serem convertidos em largefiles"
 
@@ -5224,8 +5429,8 @@
 msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE..."
 msgstr "hg qimport [-e] [-n NOME] [-f] [-g] [-P] [-r REV]... ARQUIVO..."
 
-msgid "import a patch"
-msgstr "importa um patch"
+msgid "import a patch or existing changeset"
+msgstr "importa um patch ou revisão existente"
 
 msgid ""
 "    The patch is inserted into the series after the last applied\n"
@@ -5438,9 +5643,6 @@
 msgid "add \"From: <current user>\" to patch"
 msgstr "adiciona \"From: <usuário atual>\" ao patch"
 
-msgid "USER"
-msgstr "USUÁRIO"
-
 msgid "add \"From: <USER>\" to patch"
 msgstr "adiciona \"From: <USUÁRIO>\" ao patch"
 
@@ -6246,14 +6448,14 @@
 
 msgid ""
 "First, enable the extension as explained in :hg:`help extensions`, and\n"
-"register the hook you want to run. ``incoming`` and ``outgoing`` hooks\n"
+"register the hook you want to run. ``incoming`` and ``changegroup`` hooks\n"
 "are run by the changesets receiver while the ``outgoing`` one is for\n"
 "the sender::"
 msgstr ""
 "Em primeiro lugar, habilite a extensão como explicado em\n"
 ":hg:`help extensions`, e registre o gancho que você deseja executar.\n"
 "O gancho ``outgoing`` é executado do lado que envia revisões; os\n"
-"ganchos ``incoming`` e ``outgoing`` são executados do lado que recebe\n"
+"ganchos ``incoming`` e ``changegroup`` são executados do lado que recebe\n"
 "as revisões::"
 
 msgid ""
@@ -6724,6 +6926,9 @@
 "Veja as seções [email] e [smtp] na página de manual hgrc(5) para\n"
 "mais detalhes.\n"
 
+msgid "send patches as inline message text (default)"
+msgstr "envia patches como texto no corpo da mensagem (padrão)"
+
 msgid "send patches as attachments"
 msgstr "envia patches como anexos"
 
@@ -6848,12 +7053,17 @@
 "    By default the patch is included as text in the email body for\n"
 "    easy reviewing. Using the -a/--attach option will instead create\n"
 "    an attachment for the patch. With -i/--inline an inline attachment\n"
-"    will be created."
+"    will be created. You can include a patch both as text in the email\n"
+"    body and as a regular or an inline attachment by combining the\n"
+"    -a/--attach or -i/--inline with the --body option."
 msgstr ""
 "    Por padrão o patch é incluído como texto no corpo do e-mail para\n"
 "    facilitar a revisão. A opção -a/--attach pode ser usada para ao\n"
 "    invés disso criar um anexo para o patch. Com a opção -i/--inline\n"
-"    um anexo inline será criado."
+"    um anexo inline será criado.\n"
+"    Você pode incluir um patch tanto como texto no corpo da mensagem\n"
+"    como um anexo comum ou embutido combinando as opções -a/--attach\n"
+"    ou -i/--inline com a opção --body."
 
 msgid ""
 "    With -o/--outgoing, emails will be generated for patches not found\n"
@@ -7556,8 +7766,8 @@
 msgid "%d hunks, %d lines changed\n"
 msgstr "%d trechos, %d linhas modificadas\n"
 
-msgid "[Ynsfdaq?]"
-msgstr "[Ynsfdaq?]"
+msgid "[Ynesfdaq?]"
+msgstr "[Ynesfdaq?]"
 
 msgid "&Yes, record this change"
 msgstr "(&Y) sim, grava esta mudança"
@@ -7565,6 +7775,9 @@
 msgid "&No, skip this change"
 msgstr "(&N) não, descarta essa mudança"
 
+msgid "&Edit the change manually"
+msgstr "&Edita a mudança manualmente"
+
 msgid "&Skip remaining changes to this file"
 msgstr "(&S) descarta mudanças restantes neste arquivo"
 
@@ -7583,6 +7796,39 @@
 msgid "&?"
 msgstr "&?"
 
+msgid "cannot edit patch for whole file"
+msgstr "não é possível editar um patch para o arquivo inteiro"
+
+msgid "cannot edit patch for binary file"
+msgstr "não é possível editar um patch para um arquivo binário"
+
+msgid ""
+"\n"
+"To remove '-' lines, make them ' ' lines (context).\n"
+"To remove '+' lines, delete them.\n"
+"Lines starting with # will be removed from the patch."
+msgstr ""
+"\n"
+"Para remover linhas '-', marque-as como linhas ' ' (contexto).\n"
+"Para remover linhas '+', apague-as.\n"
+"Linhas iniciadas por '#' serão removidas do patch."
+
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"added to the record list. If it does not apply cleanly, a rejects\n"
+"file will be generated: you can use that when you try again. If\n"
+"all lines of the hunk are removed, then the edit is aborted and\n"
+"the hunk is left unchanged.\n"
+msgstr ""
+"Se o patch aplicar de forma limpa, o trecho editado será adicionado\n"
+"imediatamente à lista de gravação. Se o patch não aplicar de forma\n"
+"limpa, um arquivo de rejeitos será gerado: você poderá usar esse\n"
+"arquivo ao tentar novamente. Se todas as linhas do trecho forem\n"
+"removidas, a edição será abortada e o trecho não será modificado.\n"
+
+msgid "edit failed"
+msgstr "falha ao editar"
+
 msgid "user quit"
 msgstr "usuário encerrou"
 
@@ -7627,10 +7873,12 @@
 
 msgid ""
 "      y - record this change\n"
-"      n - skip this change"
-msgstr ""
-"      y - grava essa alteração\n"
-"      n - omite a alteração"
+"      n - skip this change\n"
+"      e - edit this change manually"
+msgstr ""
+"      y - grava esta alteração\n"
+"      n - omite esta alteração\n"
+"      e - edita manualmente esta alteração"
 
 msgid ""
 "      s - skip remaining changes to this file\n"
@@ -7953,6 +8201,10 @@
 msgstr "omitindo revisão de mesclagem %s:%s\n"
 
 #, python-format
+msgid "%s is not a parent of %s"
+msgstr "%s não é um pai de %s"
+
+#, python-format
 msgid "%s merged at %s\n"
 msgstr "%s mesclado em %s\n"
 
@@ -8020,9 +8272,6 @@
 msgid "pull patches from REPO"
 msgstr "traz patches do REPOSITÓRIO"
 
-msgid "BRANCH"
-msgstr "RAMO"
-
 msgid "pull patches from branch BRANCH"
 msgstr "traz patches do ramo RAMO"
 
@@ -8035,6 +8284,9 @@
 msgid "merge at REV"
 msgstr "mesclagem em REV"
 
+msgid "parent to choose when transplanting merge"
+msgstr "pai a ser escolhido ao transplantar uma mesclagem"
+
 msgid "append transplant info to log message"
 msgstr "anexa informações de transplante à mensagem de log"
 
@@ -8120,6 +8372,14 @@
 "    transplantá-los."
 
 msgid ""
+"    Merge changesets may be transplanted directly by specifying the\n"
+"    proper parent changeset by calling :hg:`transplant --parent`."
+msgstr ""
+"    Revisões de mesclagem podem ser transplantadas diretamente\n"
+"    especificando uma revisão pai adequada ao usar a opção\n"
+"    :hg:`transplant --parent`."
+
+msgid ""
 "    If no merges or revisions are provided, :hg:`transplant` will\n"
 "    start an interactive changeset browser."
 msgstr ""
@@ -8682,19 +8942,6 @@
 msgstr "revisão com data equivalente não encontrada"
 
 #, python-format
-msgid "cannot follow file not in parent revision: \"%s\""
-msgstr "não é possível seguir arquivo não presente na revisão pai: \"%s\""
-
-#, python-format
-msgid "cannot follow nonexistent file: \"%s\""
-msgstr "não é possível seguir arquivo inexistente: \"%s\""
-
-msgid "can only follow copies/renames for explicit filenames"
-msgstr ""
-"é possível acompanhar cópias/renomeações apenas para nomes de arquivo "
-"explícitos"
-
-#, python-format
 msgid "adding %s\n"
 msgstr "adicionando %s\n"
 
@@ -8702,6 +8949,22 @@
 msgid "skipping missing subrepository: %s\n"
 msgstr "desconsiderando sub-repositório faltando: %s\n"
 
+#, python-format
+msgid "amending changeset %s\n"
+msgstr "emendando revisão %s\n"
+
+#, python-format
+msgid "copying changeset %s to %s\n"
+msgstr "copiando revisão %s para %s\n"
+
+#, python-format
+msgid "stripping intermediate changeset %s\n"
+msgstr "removendo revisão intermediária %s\n"
+
+#, python-format
+msgid "stripping amended changeset %s\n"
+msgstr "removendo revisão emendada %s\n"
+
 msgid "HG: Enter commit message.  Lines beginning with 'HG:' are removed."
 msgstr ""
 "HG: Edite a mensagem de consolidação.\n"
@@ -8743,6 +9006,30 @@
 msgid "empty commit message"
 msgstr "mensagem de consolidação vazia"
 
+#, python-format
+msgid "forgetting %s\n"
+msgstr "esquecendo %s\n"
+
+#, python-format
+msgid "reverting %s\n"
+msgstr "revertendo %s\n"
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr "revertendo remoção de %s\n"
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr "gravando versão atual de %s como %s\n"
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr "arquivo não gerenciado: %s\n"
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr "nenhuma mudança necessária para %s\n"
+
 msgid "repository root directory or name of overlay bundle file"
 msgstr ""
 "diretório raiz do repositório ou nome de arquivo de bundle para sobreposição"
@@ -8847,6 +9134,9 @@
 msgid "display with template"
 msgstr "exibe usando modelo"
 
+msgid "show patch"
+msgstr "mostra o patch"
+
 msgid "do not show merges"
 msgstr "não mostra mesclagens"
 
@@ -9225,10 +9515,6 @@
 msgid "cannot backout a merge changeset"
 msgstr "não se pode anular revisões de mesclagem"
 
-#, python-format
-msgid "%s is not a parent of %s"
-msgstr "%s não é um pai de %s"
-
 msgid "cannot use --parent on non-merge changeset"
 msgstr "não se pode usar --parent numa revisão que não seja uma mesclagem"
 
@@ -9761,12 +10047,12 @@
 "    Devolve 0 indicando sucesso, 1 se não foram encontradas mudanças.\n"
 "    "
 
+msgid "unknown bundle type specified with --type"
+msgstr "tipo de bundle especificado por --type desconhecido"
+
 msgid "--base is incompatible with specifying a destination"
 msgstr "--base é incompatível com uma especificação de destino"
 
-msgid "unknown bundle type specified with --type"
-msgstr "tipo de bundle especificado por --type desconhecido"
-
 msgid "print output to file with formatted name"
 msgstr "imprime a saída para o arquivo com o nome formatado"
 
@@ -10012,6 +10298,9 @@
 msgid "mark a branch as closed, hiding it from the branch list"
 msgstr "marca um ramo como fechado, escondendo-o da lista de ramos"
 
+msgid "amend the parent of the working dir"
+msgstr "emenda o pai do diretório de trabalho"
+
 msgid "commit the specified files or all outstanding changes"
 msgstr "consolida os arquivos pedidos ou todas as mudanças por gravar"
 
@@ -10051,6 +10340,38 @@
 "    dessa mensagem em ``.hg/last-message.txt``."
 
 msgid ""
+"    The --amend flag can be used to amend the parent of the\n"
+"    working directory with a new commit that contains the changes\n"
+"    in the parent in addition to those currently reported by :hg:`status`,\n"
+"    if there are any. The old commit is stored in a backup bundle in\n"
+"    ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`\n"
+"    on how to restore it)."
+msgstr ""
+"    A opção --amend pode ser usada para emendar o pai do diretório\n"
+"    de trabalho com uma nova revisão que contenha as mudanças no pai\n"
+"    somadas às mudanças atualmente informadas por :hg:`status`, se\n"
+"    houver alguma. A revisão antiga é armazenada em um bundle de\n"
+"    backup em ``.hg/strip-backup`` (para restaurar essa revisão, veja\n"
+"    :hg:`help bundle` e :hg:`help unbundle`)."
+
+msgid ""
+"    Message, user and date are taken from the amended commit unless\n"
+"    specified. When a message isn't specified on the command line,\n"
+"    the editor will open with the message of the amended commit."
+msgstr ""
+"    Se não forem especificados, o usuário, mensagem e data são\n"
+"    tomados da revisão emendada. Se uma mensagem não for especificada\n"
+"    na linha de comando, o editor será aberto com a mensagem original\n"
+"    da revisão emendada."
+
+msgid ""
+"    It is not possible to amend public changesets (see :hg:`help phases`)\n"
+"    or changesets that have children."
+msgstr ""
+"    Não é possível emendar revisões públicas (veja :hg:`help phases`)\n"
+"    ou revisões que contenham filhas."
+
+msgid ""
 "    Returns 0 on success, 1 if nothing changed.\n"
 "    "
 msgstr ""
@@ -10060,13 +10381,28 @@
 msgid "can only close branch heads"
 msgstr "só pode fechar cabeças de ramo"
 
+msgid "cannot amend recursively"
+msgstr "não é possível emendar recursivamente"
+
+msgid "cannot amend public changesets"
+msgstr "não é possível emendar revisões públicas"
+
+msgid "cannot amend merge changesets"
+msgstr "não é possível emendar revisões de mesclagem"
+
+msgid "cannot amend while merging"
+msgstr "não é possível emendar durante uma mesclagem"
+
+msgid "cannot amend changeset with children"
+msgstr "não é possível emendar revisões com filhas"
+
+msgid "nothing changed\n"
+msgstr "nada mudou\n"
+
 #, python-format
 msgid "nothing changed (%d missing files, see 'hg status')\n"
 msgstr "nada mudou (%d arquivos faltando, veja 'hg status')\n"
 
-msgid "nothing changed\n"
-msgstr "nada mudou\n"
-
 msgid "created new head\n"
 msgstr "nova cabeça criada\n"
 
@@ -10478,6 +10814,25 @@
 "    Informa sobre sucesso ou falha.\n"
 "    "
 
+msgid "A B"
+msgstr "A B"
+
+#, python-format
+msgid "a: %s\n"
+msgstr "a: %s\n"
+
+#, python-format
+msgid "b: %s\n"
+msgstr "b: %s\n"
+
+#, python-format
+msgid "depth(a): %d depth(b): %d\n"
+msgstr "profundidade(a): %d profundidade(b): %d\n"
+
+#, python-format
+msgid "delta: %d hdist: %d distance: %d relation: %s\n"
+msgstr "delta: %d hdist: %d distância: %d relação: %s\n"
+
 msgid "revision to rebuild to"
 msgstr "revisão para a qual reconstruir"
 
@@ -10516,6 +10871,15 @@
 msgid "parse and apply a revision specification"
 msgstr "interpreta e aplica uma especificação de revisões"
 
+msgid ""
+"    Use --verbose to print the parsed tree before and after aliases\n"
+"    expansion.\n"
+"    "
+msgstr ""
+"    Use --verbose para imprimir a árvore decodificada antes e depois\n"
+"    da expansão de apelidos.\n"
+"    "
+
 msgid "REV1 [REV2]"
 msgstr "REV1 [REV2]"
 
@@ -10946,11 +11310,6 @@
 msgid "print all revisions that match"
 msgstr "imprime todas as revisões que casarem"
 
-msgid "follow changeset history, or file history across copies and renames"
-msgstr ""
-"acompanha histórico de revisões, ou histórico de arquivo através de cópias e"
-" renomeações"
-
 msgid "ignore case when matching"
 msgstr "ignora maiúsculas/minúsculas ao casar"
 
@@ -11638,42 +11997,6 @@
 "    \"xargs\". Isso irá evitar que \"xargs\" trate nomes de arquivo\n"
 "    contendo espaços como múltiplos nomes de arquivo."
 
-msgid "only follow the first parent of merge changesets (DEPRECATED)"
-msgstr "acompanha apenas o primeiro pai de revisões de mesclagem (OBSOLETO)"
-
-msgid "show revisions matching date spec"
-msgstr "mostra revisões que casem com a especificação de data"
-
-msgid "show copied files"
-msgstr "mostra arquivos copiados"
-
-msgid "do case-insensitive search for a given text"
-msgstr "faz uma busca insensível a maiúsculas / minúsculas por um texto dado"
-
-msgid "include revisions where files were removed"
-msgstr "inclui revisões nas quais arquivos foram removidos"
-
-msgid "show only merges (DEPRECATED)"
-msgstr "mostra apenas mesclagens (OBSOLETO)"
-
-msgid "revisions committed by user"
-msgstr "revisões de autoria do usuário"
-
-msgid "show only changesets within the given named branch (DEPRECATED)"
-msgstr "mostra apenas revisões dentro do ramo nomeado especificado (OBSOLETA)"
-
-msgid "show changesets within the given named branch"
-msgstr "mostra apenas revisões dentro do ramo nomeado especificado"
-
-msgid "do not display revision or any of its ancestors"
-msgstr "não exibe revisão ou qualquer de seus ancestrais"
-
-msgid "show hidden changesets (DEPRECATED)"
-msgstr "exibe revisões ocultas (OBSOLETO)"
-
-msgid "[OPTION]... [FILE]"
-msgstr "[OPÇÃO]... [ARQUIVO]"
-
 msgid "show revision history of entire repository or files"
 msgstr "mostra o histórico de revisões do repositório ou de arquivos"
 
@@ -12123,18 +12446,26 @@
 msgstr "        pública < rascunho < secreta"
 
 msgid ""
-"    Return 0 on success, 1 if no phases were changed.\n"
-"    "
-msgstr ""
-"    Devolve 0 para indicar sucesso, 1 se não houver mudanças de fase.\n"
+"    Return 0 on success, 1 if no phases were changed or some could not\n"
+"    be changed.\n"
+"    "
+msgstr ""
+"    Devolve 0 para indicar sucesso, 1 se não houver mudanças de fase\n"
+"    ou se algumas não puderam ser mudadas.\n"
 "    "
 
 msgid "only one phase can be specified"
 msgstr "apenas uma fase pode ser especificada"
 
 #, python-format
-msgid "phase change for %i changesets\n"
-msgstr "mudança de fase em %i revisões\n"
+msgid "cannot move %i changesets to a more permissive phase, use --force\n"
+msgstr ""
+"não é possível mover %i revisões para uma fase mais permissiva sem usar "
+"--force\n"
+
+#, python-format
+msgid "phase changed for %i changesets\n"
+msgstr "as fases de %i revisões foram modificadas\n"
 
 msgid "no phases changed\n"
 msgstr "nenhuma fase mudou\n"
@@ -12696,30 +13027,6 @@
 msgid "use --all to revert all files"
 msgstr "use --all para reverter todos os arquivos"
 
-#, python-format
-msgid "forgetting %s\n"
-msgstr "esquecendo %s\n"
-
-#, python-format
-msgid "reverting %s\n"
-msgstr "revertendo %s\n"
-
-#, python-format
-msgid "undeleting %s\n"
-msgstr "revertendo remoção de %s\n"
-
-#, python-format
-msgid "saving current version of %s as %s\n"
-msgstr "gravando versão atual de %s como %s\n"
-
-#, python-format
-msgid "file not managed: %s\n"
-msgstr "arquivo não gerenciado: %s\n"
-
-#, python-format
-msgid "no changes needed to %s\n"
-msgstr "nenhuma mudança necessária para %s\n"
-
 msgid "ignore safety measures"
 msgstr "ignora medidas de segurança"
 
@@ -13526,6 +13833,14 @@
 msgid "cannot include %s (%s)"
 msgstr "não é possível incluir %s (%s)"
 
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr "diretório de trabalho tem pai desconhecido '%s'!"
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr "revisão desconhecida '%s'"
+
 msgid "not found in manifest"
 msgstr "não encontrado no manifesto"
 
@@ -13852,6 +14167,17 @@
 "lsprof não disponível - instale de "
 "http://codespeak.net/svn/user/arigo/hack/misc/lsprof/"
 
+msgid "statprof not available - install using \"easy_install statprof\""
+msgstr "statprof não está disponível - instale usando \"easy_install statprof\""
+
+#, python-format
+msgid "invalid sampling frequency '%s' - ignoring\n"
+msgstr "frequência de amostragem '%s' inválida - ignorando\n"
+
+#, python-format
+msgid "unrecognized profiler '%s' - ignored\n"
+msgstr "profiler '%s' não reconhecido - ignorado\n"
+
 #, python-format
 msgid "*** failed to import extension %s from %s: %s\n"
 msgstr "*** falha ao importar a extensão %s de %s: %s\n"
@@ -13880,6 +14206,15 @@
 msgid "tool %s requires a GUI\n"
 msgstr "a ferramenta %s requer uma interface gráfica (GUI)\n"
 
+msgid ""
+"``internal:prompt``\n"
+"Asks the user which of the local or the other version to keep as\n"
+"    the merged version."
+msgstr ""
+"``internal:prompt``\n"
+"Pergunta ao usuário se a versão local ou a outra deve ser usada\n"
+"    como resultado da mesclagem."
+
 #, python-format
 msgid ""
 " no tool found to merge %s\n"
@@ -13888,10 +14223,73 @@
 " nenhuma ferramenta encontrada para mesclar %s\n"
 "manter (l)ocal ou usar (o)utro?"
 
+msgid ""
+"``internal:local``\n"
+"Uses the local version of files as the merged version."
+msgstr ""
+"``internal:local``\n"
+"Usa a versão local de arquivos como resultado da mesclagem."
+
+msgid ""
+"``internal:other``\n"
+"Uses the other version of files as the merged version."
+msgstr ""
+"``internal:other``\n"
+"Usa a outra (não local) versão de arquivos como resultado da mesclagem."
+
+msgid ""
+"``internal:fail``\n"
+"Rather than attempting to merge files that were modified on both\n"
+"    branches, it marks them as unresolved. The resolve command must be\n"
+"    used to resolve these conflicts."
+msgstr ""
+"``internal:fail``\n"
+"Ao invés de tentar mesclar arquivos modificados em ambos os ramos,\n"
+"    marca tais arquivos como não resolvidos. O comando resolve deve\n"
+"    então ser usado para resolver esses conflitos."
+
 #, python-format
 msgid "%s.premerge not valid ('%s' is neither boolean nor %s)"
 msgstr "%s.premerge não é válido ('%s' não é nem booleano nem %s)"
 
+msgid ""
+"``internal:merge``\n"
+"Uses the internal non-interactive simple merge algorithm for merging\n"
+"    files. It will fail if there are any conflicts and leave markers in\n"
+"    the partially merged file."
+msgstr ""
+"``internal:merge``\n"
+"Usa o algoritmo não interativo interno simples para mesclar arquivos.\n"
+"    Se houver qualquer conflito, esse algoritmo falhará, deixando\n"
+"    marcadores no arquivo parcialmente mesclado."
+
+#, python-format
+msgid "merging %s incomplete! (edit conflicts, then use 'hg resolve --mark')\n"
+msgstr ""
+"a mesclagem de %s está incompleta! (edite os conflitos, e em seguida use 'hg"
+" resolve --mark')\n"
+
+msgid ""
+"``internal:dump``\n"
+"Creates three versions of the files to merge, containing the\n"
+"    contents of local, other and base. These files can then be used to\n"
+"    perform a merge manually. If the file to be merged is named\n"
+"    ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
+"    ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
+"    same directory as ``a.txt``."
+msgstr ""
+"``internal:dump``\n"
+"Cria três versões dos arquivos a serem mesclados, com os conteúdos\n"
+"    das versões local, outra e base. Estes arquivos podem então ser\n"
+"    usados para fazer uma mesclagem manual. Se o arquivo a ser mesclado\n"
+"    se chamar ``a.txt``, estes arquivos serão chamados respectivamente\n"
+"    ``a.txt.local``, ``a.txt.other`` e ``a.txt.base`` e serão colocados\n"
+"    no mesmo diretório de ``a.txt``."
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr "mesclagem de %s falhou!\n"
+
 #, python-format
 msgid "was merge of '%s' successful (yn)?"
 msgstr "a mesclagem de '%s' teve sucesso (yn)?"
@@ -13904,16 +14302,6 @@
 " arquivo de saída %s parece não ter modificações\n"
 "a mesclagem teve sucesso (yn)?"
 
-#, python-format
-msgid "merging %s incomplete! (edit conflicts, then use 'hg resolve --mark')\n"
-msgstr ""
-"a mesclagem de %s está incompleta! (edite os conflitos, e em seguida use 'hg"
-" resolve --mark')\n"
-
-#, python-format
-msgid "merging %s failed!\n"
-msgstr "mesclagem de %s falhou!\n"
-
 msgid "unterminated string"
 msgstr "string não terminada"
 
@@ -14144,6 +14532,20 @@
 msgid "copied takes no arguments"
 msgstr "copied não tem argumentos"
 
+msgid ""
+"``subrepo([pattern])``\n"
+"    Subrepositories whose paths match the given pattern."
+msgstr ""
+"``subrepo([padrão])``\n"
+"    Sub-repositórios cujos caminhos combinam com o padrão."
+
+#. i18n: "subrepo" is a keyword
+msgid "subrepo takes at most one argument"
+msgstr "subrepo recebe um ou nenhum argumento"
+
+msgid "subrepo requires a pattern or no arguments"
+msgstr "subrepo requer um padrão ou nenhum argumento"
+
 msgid "invalid token"
 msgstr "token inválido"
 
@@ -14224,8 +14626,8 @@
 msgid "URL Paths"
 msgstr "Caminhos URL"
 
-msgid "Using additional features"
-msgstr "Usando funcionalidades adicionais"
+msgid "Using Additional Features"
+msgstr "Usando Funcionalidades Adicionais"
 
 msgid "Subrepositories"
 msgstr "Sub-repositórios"
@@ -14236,8 +14638,8 @@
 msgid "Glossary"
 msgstr "Glossário"
 
-msgid "syntax for Mercurial ignore files"
-msgstr "sintaxe dos arquivos de padrões de arquivos ignorados"
+msgid "Syntax for Mercurial Ignore Files"
+msgstr "Sintaxe dos Arquivos de Padrões de Arquivos Ignorados"
 
 msgid "Working with Phases"
 msgstr "Trabalhando Com Fases"
@@ -14311,33 +14713,35 @@
 "mencionados abaixo, definições de caminhos anteriores sobrepõe\n"
 "definições de caminhos posteriores."
 
-msgid "| (Unix, Windows) ``<repo>/.hg/hgrc``"
-msgstr "| (Unix, Windows) ``<repo>/.hg/hgrc``"
+msgid "| (All) ``<repo>/.hg/hgrc``"
+msgstr "| (Todos) ``<repo>/.hg/hgrc``"
 
 msgid ""
 "    Per-repository configuration options that only apply in a\n"
 "    particular repository. This file is not version-controlled, and\n"
 "    will not get transferred during a \"clone\" operation. Options in\n"
 "    this file override options in all other configuration files. On\n"
-"    Unix, most of this file will be ignored if it doesn't belong to a\n"
-"    trusted user or to a trusted group. See the documentation for the\n"
-"    ``[trusted]`` section below for more details."
+"    Plan 9 and Unix, most of this file will be ignored if it doesn't\n"
+"    belong to a trusted user or to a trusted group. See the documentation\n"
+"    for the ``[trusted]`` section below for more details."
 msgstr ""
 "    Configurações específicas do repositório <repo>. Este arquivo\n"
 "    não é versionado, e não é transferido durante uma operação\n"
 "    \"clone\". Opções neste arquivo sobrepõe opções em qualquer outro\n"
-"    arquivo de configuração. Em Unix, a maior parte deste arquivo\n"
+"    arquivo de configuração. No Plan 9 e Unix, a maior parte deste arquivo\n"
 "    será ignorada se ele não pertencer a um usuário ou grupo\n"
 "    confiável; veja abaixo a documentação sobre a seção [trusted]\n"
 "    para maiores detalhes."
 
 msgid ""
+"| (Plan 9) ``$home/lib/hgrc``\n"
 "| (Unix) ``$HOME/.hgrc``\n"
 "| (Windows) ``%USERPROFILE%\\.hgrc``\n"
 "| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
 "| (Windows) ``%HOME%\\.hgrc``\n"
 "| (Windows) ``%HOME%\\Mercurial.ini``"
 msgstr ""
+"| (Plan 9) ``$home/lib/hgrc``\n"
 "| (Unix) ``$HOME/.hgrc``\n"
 "| (Windows) ``%USERPROFILE%\\.hgrc``\n"
 "| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
@@ -14358,9 +14762,13 @@
 "    por sistema e por instalação."
 
 msgid ""
+"| (Plan 9) ``/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``\n"
 "| (Unix) ``/etc/mercurial/hgrc``\n"
 "| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
 msgstr ""
+"| (Plan 9) ``/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``\n"
 "| (Unix) ``/etc/mercurial/hgrc``\n"
 "| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
 
@@ -14376,9 +14784,13 @@
 "    diretório. Opções nestes arquivos sobrepõe opções por instalação."
 
 msgid ""
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc.d/*.rc``\n"
 "| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
 "| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
 msgstr ""
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc.d/*.rc``\n"
 "| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
 "| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
 
@@ -14702,8 +15114,8 @@
 "um apelido de shell. Um apelido de shell é executado pelo shell, e pode\n"
 "ser usado para executar comandos arbitrários. Por exemplo, ::"
 
-msgid "   echo = !echo"
-msgstr "   echo = !echo"
+msgid "   echo = !echo $@"
+msgstr "   echo = !echo $@"
 
 msgid ""
 "will let you do ``hg echo foo`` to have ``foo`` printed in your\n"
@@ -14723,11 +15135,25 @@
 "repositório da mesma maneira que a extensão purge."
 
 msgid ""
-"Shell aliases are executed in an environment where ``$HG`` expand to\n"
+"Positional arguments like ``$1``, ``$2``, etc. in the alias definition\n"
+"expand to the command arguments. Unmatched arguments are\n"
+"removed. ``$0`` expands to the alias name and ``$@`` expands to all\n"
+"arguments separated by a space. These expansions happen before the\n"
+"command is passed to the shell."
+msgstr ""
+"Argumentos posicionais como ``$1``, ``$2``, etc. na definição\n"
+"do apelido expandem para argumentos da linha de comando. Argumentos\n"
+"em excesso são removidos. ``$0`` expande para o nome do apelido e\n"
+"``$@`` expande para todos os argumentos, separados por espaços.\n"
+"Estas expansões são realizadas antes de o comando ser passado\n"
+"para o shell."
+
+msgid ""
+"Shell aliases are executed in an environment where ``$HG`` expands to\n"
 "the path of the Mercurial that was used to execute the alias. This is\n"
 "useful when you want to call further Mercurial commands in a shell\n"
 "alias, as was done above for the purge alias. In addition,\n"
-"``$HG_ARGS`` expand to the arguments given to Mercurial. In the ``hg\n"
+"``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg\n"
 "echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``."
 msgstr ""
 "Apelidos de shell são executados em um ambiente no qual ``$HG``\n"
@@ -15314,47 +15740,6 @@
 
 msgid ""
 "\n"
-"``hostfingerprints``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
-"\n"
-"``hostfingerprints``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-
-msgid ""
-"Fingerprints of the certificates of known HTTPS servers.\n"
-"A HTTPS connection to a server with a fingerprint configured here will\n"
-"only succeed if the servers certificate matches the fingerprint.\n"
-"This is very similar to how ssh known hosts works.\n"
-"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
-"The CA chain and web.cacerts is not used for servers with a fingerprint."
-msgstr ""
-"Impressões digitais (\"fingerprints\") dos certificados de servidores\n"
-"HTTPS conhecidos.\n"
-"Uma conexão HTTPS com um servidor com uma impressão digital configurada\n"
-"aqui só terá sucesso se o certificado do servidor bater com a impressão.\n"
-"Isto é bastante similar ao mecanismo \"known hosts\" do ssh.\n"
-"A impressão digital é o valor do hash SHA-1 do certificado codificado\n"
-"em formato DER.\n"
-"A cadeia CA e a opção web.cacerts não são usadas para servidores com\n"
-"impressões digitais configuradas."
-
-msgid "For example::"
-msgstr "Por exemplo::"
-
-msgid ""
-"    [hostfingerprints]\n"
-"    hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:d6:4b:ee:cc"
-msgstr ""
-"    [hostfingerprints]\n"
-"    hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:d6:4b:ee:cc"
-
-msgid "This feature is only supported when using Python 2.6 or later."
-msgstr ""
-"Esta funcionalidade só é suportada nas versões do Python 2.6 ou posteriores."
-
-msgid ""
-"\n"
 "``format``\n"
 "\"\"\"\"\"\"\"\"\"\""
 msgstr ""
@@ -15418,258 +15803,60 @@
 "    anteriores à 1.7."
 
 msgid ""
-"``merge-patterns``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
-"``merge-patterns``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-
-msgid ""
-"This section specifies merge tools to associate with particular file\n"
-"patterns. Tools matched here will take precedence over the default\n"
-"merge tool. Patterns are globs by default, rooted at the repository\n"
-"root."
-msgstr ""
-"Esta seção especifica ferramentas de mesclagem a serem associados a\n"
-"determinados padrões de arquivo. As ferramentas correspondentes têm\n"
-"prioridade sobre o utilitário padrão de mesclagem. Por padrão, os\n"
-"padrões de arquivo são globs a partir do raiz do repositório."
-
-msgid ""
-"  [merge-patterns]\n"
-"  **.c = kdiff3\n"
-"  **.jpg = myimgmerge"
-msgstr ""
-"  [merge-patterns]\n"
-"  **.c = kdiff3\n"
-"  **.jpg = myimgmerge"
-
-msgid ""
-"``merge-tools``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
-"``merge-tools``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-
-msgid ""
-"This section configures external merge tools to use for file-level\n"
-"merges."
-msgstr ""
-"Esta seção configura ferramentas de mesclagem externas a serem\n"
-"usadas em mesclagens de arquivo."
-
-msgid "Example ``~/.hgrc``::"
-msgstr "Um exemplo de ``~/.hgrc``::"
-
-msgid ""
-"  [merge-tools]\n"
-"  # Override stock tool location\n"
-"  kdiff3.executable = ~/bin/kdiff3\n"
-"  # Specify command line\n"
-"  kdiff3.args = $base $local $other -o $output\n"
-"  # Give higher priority\n"
-"  kdiff3.priority = 1"
-msgstr ""
-"  [merge-tools]\n"
-"  # sobrepõe a localização padrão da ferramenta\n"
-"  kdiff3.executable = ~/bin/kdiff3\n"
-"  # Especifica a linha de comando\n"
-"  kdiff3.args = $base $local $other -o $output\n"
-"  # Usa uma prioridade mais alta\n"
-"  kdiff3.priority = 1"
-
-msgid ""
-"  # Define new tool\n"
-"  myHtmlTool.args = -m $local $other $base $output\n"
-"  myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
-"  myHtmlTool.priority = 1"
-msgstr ""
-"  # Define uma nova ferramenta\n"
-"  myHtmlTool.args = -m $local $other $base $output\n"
-"  myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
-"  myHtmlTool.priority = 1"
-
-msgid ""
-"``priority``\n"
-"  The priority in which to evaluate this tool.\n"
-"  Default: 0."
-msgstr ""
-"``priority``\n"
-"  A prioridade com a qual avaliar esta ferramenta.\n"
-"  Padrão: 0."
-
-msgid ""
-"``executable``\n"
-"  Either just the name of the executable or its pathname.  On Windows,\n"
-"  the path can use environment variables with ${ProgramFiles} syntax.\n"
-"  Default: the tool name."
-msgstr ""
-"``executable``\n"
-"  Pode ser apenas o nome do executável ou seu caminho completo. No\n"
-"  Windows, o caminho pode usar variáveis de ambiente com a sintaxe\n"
-"  ${ProgramFiles}.\n"
-"  Padrão: o próprio nome da ferramenta."
-
-msgid ""
-"``args``\n"
-"  The arguments to pass to the tool executable. You can refer to the\n"
-"  files being merged as well as the output file through these\n"
-"  variables: ``$base``, ``$local``, ``$other``, ``$output``.\n"
-"  Default: ``$local $base $other``"
-msgstr ""
-"``args``\n"
-"  Os parâmetros passados para o executável da ferramenta. Você pode se\n"
-"  referir aos arquivos a serem mesclados bem como ao arquivo de saída\n"
-"  usando as seguintes variáveis: ``$base`` (versão base), ``$local``\n"
-"  (versão local), ``$other`` (a outra versão), ``$output`` (o arquivo\n"
-"  de saída).\n"
-"  Padrão: ``$local $base $other``"
-
-msgid ""
-"``premerge``\n"
-"  Attempt to run internal non-interactive 3-way merge tool before\n"
-"  launching external tool.  Options are ``true``, ``false``, or ``keep``\n"
-"  to leave markers in the file if the premerge fails.\n"
-"  Default: True"
-msgstr ""
-"``premerge``\n"
-"  Tenta executar a ferramenta interna não interativa de mesclagem de\n"
-"  3 vias antes de executar a ferramenta externa. As opções são\n"
-"  ``true``, ``false``, ou ``keep`` para deixar marcações no conteúdo\n"
-"  do arquivo se o premerge falhar.\n"
-"  Padrão: True"
-
-msgid ""
-"``binary``\n"
-"  This tool can merge binary files. Defaults to False, unless tool\n"
-"  was selected by file pattern match."
-msgstr ""
-"``binary``\n"
-"  Esta ferramenta é capaz de mesclar arquivos binários. O padrão é\n"
-"  False, a não ser que a ferramenta tenha sido selecionada por\n"
-"  correspondência de padrão de arquivo (seção ``[merge-patterns]``)."
-
-msgid ""
-"``symlink``\n"
-"  This tool can merge symlinks. Defaults to False, even if tool was\n"
-"  selected by file pattern match."
-msgstr ""
-"``symlink``\n"
-"  Esta ferramenta pode mesclar links simbólicos. O padrão é False,\n"
-"  mesmo que a ferramenta tenha sido selecionada por\n"
-"  correspondência de padrão de arquivo."
-
-msgid ""
-"``check``\n"
-"  A list of merge success-checking options:"
-msgstr ""
-"``check``\n"
-"  Uma lista de opções de verificação de sucesso da mesclagem:"
-
-msgid ""
-"  ``changed``\n"
-"    Ask whether merge was successful when the merged file shows no changes.\n"
-"  ``conflicts``\n"
-"    Check whether there are conflicts even though the tool reported success.\n"
-"  ``prompt``\n"
-"    Always prompt for merge success, regardless of success reported by tool."
-msgstr ""
-"  ``changed``\n"
-"    Perguntar se a mesclagem teve sucesso, caso o arquivo mesclado não mostre mudanças.\n"
-"  ``conflicts``\n"
-"    Verificar a existência de conflitos mesmo que a ferramenta indique sucesso.\n"
-"  ``prompt``\n"
-"    Sempre perguntar se a mesclagem teve sucesso, sem levar em conta o informado pela ferramenta."
-
-msgid ""
-"``checkchanged``\n"
-"  True is equivalent to ``check = changed``.\n"
-"  Default: False"
-msgstr ""
-"``checkchanged``\n"
-"  True equivale a ``check = changed``.\n"
-"  Padrão: False"
-
-msgid ""
-"``checkconflicts``\n"
-"  True is equivalent to ``check = conflicts``.\n"
-"  Default: False"
-msgstr ""
-"``checkconflicts``\n"
-"  True equivale a ``check = conflicts``.\n"
-"  Padrão: False"
-
-msgid ""
-"``fixeol``\n"
-"  Attempt to fix up EOL changes caused by the merge tool.\n"
-"  Default: False"
-msgstr ""
-"``fixeol``\n"
-"  Tenta corrigir mudanças de quebras de linha causadas pela ferramenta de mesclagem.\n"
-"  Padrão: False"
-
-msgid ""
-"``gui``\n"
-"  This tool requires a graphical interface to run. Default: False"
-msgstr ""
-"``gui``\n"
-"  Esta ferramenta exige uma interface gráfica para ser executada. Padrão: False"
-
-msgid ""
-"``regkey``\n"
-"  Windows registry key which describes install location of this\n"
-"  tool. Mercurial will search for this key first under\n"
-"  ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.\n"
-"  Default: None"
-msgstr ""
-"``regkey``\n"
-"  Chave do registro do Windows que descreve a localização de instalação\n"
-"  desta ferramenta. O Mercurial procurará por esta chave primeiro sob\n"
-"  ``HKEY_CURRENT_USER`` e em seguida sob ``HKEY_LOCAL_MACHINE``.\n"
-"  Padrão: Nenhum"
-
-msgid ""
-"``regkeyalt``\n"
-"  An alternate Windows registry key to try if the first key is not\n"
-"  found.  The alternate key uses the same ``regname`` and ``regappend``\n"
-"  semantics of the primary key.  The most common use for this key\n"
-"  is to search for 32bit applications on 64bit operating systems.\n"
-"  Default: None"
-msgstr ""
-"``regkeyalt``\n"
-"  Uma chave alternativa de registro do Windows a ser tentada caso a primeira\n"
-"  chave não seja encontrada. A chave alternativa usa as mesmas semânticas\n"
-"  ``regname`` e ``regappend`` da chave primária.\n"
-"  O uso mais comum desta chave é a procura de aplicações 32 bits em\n"
-"  sistemas operacionais 64 bits.\n"
-"  Padrão: None"
-
-msgid ""
-"``regname``\n"
-"  Name of value to read from specified registry key. Defaults to the\n"
-"  unnamed (default) value."
-msgstr ""
-"``regname``\n"
-"  Nome do valor a ser lido da chave de registro especificada. O padrão é\n"
-"  o valor sem nome (padrão)."
-
-msgid ""
-"``regappend``\n"
-"  String to append to the value read from the registry, typically\n"
-"  the executable name of the tool.\n"
-"  Default: None"
-msgstr ""
-"``regappend``\n"
-"  String a ser anexada ao valor lido do registro, tipicamente o nome\n"
-"  do executável da ferramenta.\n"
-"  Padrão: None"
-
-msgid ""
-"\n"
+"``graph``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+"``graph``\n"
+"\"\"\"\"\"\"\"\"\""
+
+msgid ""
+"Web graph view configuration. This section let you change graph\n"
+"elements display properties by branches, for instance to make the\n"
+"``default`` branch stand out."
+msgstr ""
+"Configuração da visualização de grafo da interface web. Esta seção\n"
+"possibilita mudar propriedades de exibição de elementos do grafo,\n"
+"para por exemplo ressaltar o ramo ``default``."
+
+msgid "    <branch>.<argument> = <value>"
+msgstr "    <ramo>.<argumento> = <valor>"
+
+msgid ""
+"where ``<branch>`` is the name of the branch being\n"
+"customized. Example::"
+msgstr "onde ``<ramo>`` é o nome do ramo a ser personalizado. Por exemplo::"
+
+msgid ""
+"    [graph]\n"
+"    # 2px width\n"
+"    default.width = 2\n"
+"    # red color\n"
+"    default.color = FF0000"
+msgstr ""
+"    [graph]\n"
+"    # 2 pixels de largura\n"
+"    default.width = 2\n"
+"    # cor vermelha\n"
+"    default.color = FF0000"
+
+msgid ""
+"``width``\n"
+"    Set branch edges width in pixels."
+msgstr ""
+"``width``\n"
+"    Define a largura das arestas do ramo, em pixels."
+
+msgid ""
+"``color``\n"
+"    Set branch edges color in hexadecimal RGB notation."
+msgstr ""
+"``color``\n"
+"    Define a cor das arestas do ramo, em notação RGB hexadecimal."
+
+msgid ""
 "``hooks``\n"
 "\"\"\"\"\"\"\"\"\""
 msgstr ""
-"\n"
 "``hooks``\n"
 "\"\"\"\"\"\"\"\"\""
 
@@ -16076,6 +16263,47 @@
 
 msgid ""
 "\n"
+"``hostfingerprints``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+"\n"
+"``hostfingerprints``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+msgid ""
+"Fingerprints of the certificates of known HTTPS servers.\n"
+"A HTTPS connection to a server with a fingerprint configured here will\n"
+"only succeed if the servers certificate matches the fingerprint.\n"
+"This is very similar to how ssh known hosts works.\n"
+"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
+"The CA chain and web.cacerts is not used for servers with a fingerprint."
+msgstr ""
+"Impressões digitais (\"fingerprints\") dos certificados de servidores\n"
+"HTTPS conhecidos.\n"
+"Uma conexão HTTPS com um servidor com uma impressão digital configurada\n"
+"aqui só terá sucesso se o certificado do servidor bater com a impressão.\n"
+"Isto é bastante similar ao mecanismo \"known hosts\" do ssh.\n"
+"A impressão digital é o valor do hash SHA-1 do certificado codificado\n"
+"em formato DER.\n"
+"A cadeia CA e a opção web.cacerts não são usadas para servidores com\n"
+"impressões digitais configuradas."
+
+msgid "For example::"
+msgstr "Por exemplo::"
+
+msgid ""
+"    [hostfingerprints]\n"
+"    hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:d6:4b:ee:cc"
+msgstr ""
+"    [hostfingerprints]\n"
+"    hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:d6:4b:ee:cc"
+
+msgid "This feature is only supported when using Python 2.6 or later."
+msgstr ""
+"Esta funcionalidade só é suportada nas versões do Python 2.6 ou posteriores."
+
+msgid ""
+"\n"
 "``http_proxy``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
@@ -16132,67 +16360,251 @@
 "    entradas em ``http_proxy.no``. Booleana; o padrão é False."
 
 msgid ""
-"``smtp``\n"
-"\"\"\"\"\"\"\"\""
-msgstr ""
-"``smtp``\n"
-"\"\"\"\"\"\"\"\""
-
-msgid "Configuration for extensions that need to send email messages."
-msgstr "Configurações para extensões que enviam mensagens de email."
-
-msgid ""
-"``host``\n"
-"    Host name of mail server, e.g. \"mail.example.com\"."
-msgstr ""
-"``host``\n"
-"    Nome do servidor de emails, como em \"mail.example.com\"."
-
-msgid ""
-"``port``\n"
-"    Optional. Port to connect to on mail server. Default: 25."
-msgstr ""
-"``port``\n"
-"    Opcional. Porta usada pelo servidor de emails. Padrão: 25."
-
-msgid ""
-"``tls``\n"
-"    Optional. Method to enable TLS when connecting to mail server: starttls,\n"
-"    smtps or none. Default: none."
-msgstr ""
-"``tls``\n"
-"    Opcional. Método para habilitar TLS ao conectar com o servidor de\n"
-"    emails: starttls, smtps ou none. Padrão: none."
-
-msgid ""
-"``username``\n"
-"    Optional. User name for authenticating with the SMTP server.\n"
-"    Default: none."
-msgstr ""
-"``username``\n"
-"    Opcional. Nome de usuário usado para autenticação no servidor\n"
-"    de emails. Padrão: none."
-
-msgid ""
-"``password``\n"
-"    Optional. Password for authenticating with the SMTP server. If not\n"
-"    specified, interactive sessions will prompt the user for a\n"
-"    password; non-interactive sessions will fail. Default: none."
-msgstr ""
-"``password``\n"
-"    Opcional. Senha usada para autenticação no servidor de emails.\n"
-"    Se não for especificada, sessões interativas consultarão o\n"
-"    usuário para que ele forneça a senha; sessões não interativas\n"
-"    falharão. Padrão: none."
-
-msgid ""
-"``local_hostname``\n"
-"    Optional. It's the hostname that the sender can use to identify\n"
-"    itself to the MTA."
-msgstr ""
-"``local_hostname``\n"
-"    Opcional. É o nome de servidor que o remetente pode usar para se\n"
-"    identificar para o MTA."
+"``merge-patterns``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+"``merge-patterns``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+msgid ""
+"This section specifies merge tools to associate with particular file\n"
+"patterns. Tools matched here will take precedence over the default\n"
+"merge tool. Patterns are globs by default, rooted at the repository\n"
+"root."
+msgstr ""
+"Esta seção especifica ferramentas de mesclagem a serem associados a\n"
+"determinados padrões de arquivo. As ferramentas correspondentes têm\n"
+"prioridade sobre o utilitário padrão de mesclagem. Por padrão, os\n"
+"padrões de arquivo são globs a partir do raiz do repositório."
+
+msgid ""
+"  [merge-patterns]\n"
+"  **.c = kdiff3\n"
+"  **.jpg = myimgmerge"
+msgstr ""
+"  [merge-patterns]\n"
+"  **.c = kdiff3\n"
+"  **.jpg = myimgmerge"
+
+msgid ""
+"``merge-tools``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+"``merge-tools``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+msgid ""
+"This section configures external merge tools to use for file-level\n"
+"merges."
+msgstr ""
+"Esta seção configura ferramentas de mesclagem externas a serem\n"
+"usadas em mesclagens de arquivo."
+
+msgid "Example ``~/.hgrc``::"
+msgstr "Um exemplo de ``~/.hgrc``::"
+
+msgid ""
+"  [merge-tools]\n"
+"  # Override stock tool location\n"
+"  kdiff3.executable = ~/bin/kdiff3\n"
+"  # Specify command line\n"
+"  kdiff3.args = $base $local $other -o $output\n"
+"  # Give higher priority\n"
+"  kdiff3.priority = 1"
+msgstr ""
+"  [merge-tools]\n"
+"  # sobrepõe a localização padrão da ferramenta\n"
+"  kdiff3.executable = ~/bin/kdiff3\n"
+"  # Especifica a linha de comando\n"
+"  kdiff3.args = $base $local $other -o $output\n"
+"  # Usa uma prioridade mais alta\n"
+"  kdiff3.priority = 1"
+
+msgid ""
+"  # Define new tool\n"
+"  myHtmlTool.args = -m $local $other $base $output\n"
+"  myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+"  myHtmlTool.priority = 1"
+msgstr ""
+"  # Define uma nova ferramenta\n"
+"  myHtmlTool.args = -m $local $other $base $output\n"
+"  myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+"  myHtmlTool.priority = 1"
+
+msgid ""
+"``priority``\n"
+"  The priority in which to evaluate this tool.\n"
+"  Default: 0."
+msgstr ""
+"``priority``\n"
+"  A prioridade com a qual avaliar esta ferramenta.\n"
+"  Padrão: 0."
+
+msgid ""
+"``executable``\n"
+"  Either just the name of the executable or its pathname.  On Windows,\n"
+"  the path can use environment variables with ${ProgramFiles} syntax.\n"
+"  Default: the tool name."
+msgstr ""
+"``executable``\n"
+"  Pode ser apenas o nome do executável ou seu caminho completo. No\n"
+"  Windows, o caminho pode usar variáveis de ambiente com a sintaxe\n"
+"  ${ProgramFiles}.\n"
+"  Padrão: o próprio nome da ferramenta."
+
+msgid ""
+"``args``\n"
+"  The arguments to pass to the tool executable. You can refer to the\n"
+"  files being merged as well as the output file through these\n"
+"  variables: ``$base``, ``$local``, ``$other``, ``$output``.\n"
+"  Default: ``$local $base $other``"
+msgstr ""
+"``args``\n"
+"  Os parâmetros passados para o executável da ferramenta. Você pode se\n"
+"  referir aos arquivos a serem mesclados bem como ao arquivo de saída\n"
+"  usando as seguintes variáveis: ``$base`` (versão base), ``$local``\n"
+"  (versão local), ``$other`` (a outra versão), ``$output`` (o arquivo\n"
+"  de saída).\n"
+"  Padrão: ``$local $base $other``"
+
+msgid ""
+"``premerge``\n"
+"  Attempt to run internal non-interactive 3-way merge tool before\n"
+"  launching external tool.  Options are ``true``, ``false``, or ``keep``\n"
+"  to leave markers in the file if the premerge fails.\n"
+"  Default: True"
+msgstr ""
+"``premerge``\n"
+"  Tenta executar a ferramenta interna não interativa de mesclagem de\n"
+"  3 vias antes de executar a ferramenta externa. As opções são\n"
+"  ``true``, ``false``, ou ``keep`` para deixar marcações no conteúdo\n"
+"  do arquivo se o premerge falhar.\n"
+"  Padrão: True"
+
+msgid ""
+"``binary``\n"
+"  This tool can merge binary files. Defaults to False, unless tool\n"
+"  was selected by file pattern match."
+msgstr ""
+"``binary``\n"
+"  Esta ferramenta é capaz de mesclar arquivos binários. O padrão é\n"
+"  False, a não ser que a ferramenta tenha sido selecionada por\n"
+"  correspondência de padrão de arquivo (seção ``[merge-patterns]``)."
+
+msgid ""
+"``symlink``\n"
+"  This tool can merge symlinks. Defaults to False, even if tool was\n"
+"  selected by file pattern match."
+msgstr ""
+"``symlink``\n"
+"  Esta ferramenta pode mesclar links simbólicos. O padrão é False,\n"
+"  mesmo que a ferramenta tenha sido selecionada por\n"
+"  correspondência de padrão de arquivo."
+
+msgid ""
+"``check``\n"
+"  A list of merge success-checking options:"
+msgstr ""
+"``check``\n"
+"  Uma lista de opções de verificação de sucesso da mesclagem:"
+
+msgid ""
+"  ``changed``\n"
+"    Ask whether merge was successful when the merged file shows no changes.\n"
+"  ``conflicts``\n"
+"    Check whether there are conflicts even though the tool reported success.\n"
+"  ``prompt``\n"
+"    Always prompt for merge success, regardless of success reported by tool."
+msgstr ""
+"  ``changed``\n"
+"    Perguntar se a mesclagem teve sucesso, caso o arquivo mesclado não mostre mudanças.\n"
+"  ``conflicts``\n"
+"    Verificar a existência de conflitos mesmo que a ferramenta indique sucesso.\n"
+"  ``prompt``\n"
+"    Sempre perguntar se a mesclagem teve sucesso, sem levar em conta o informado pela ferramenta."
+
+msgid ""
+"``checkchanged``\n"
+"  True is equivalent to ``check = changed``.\n"
+"  Default: False"
+msgstr ""
+"``checkchanged``\n"
+"  True equivale a ``check = changed``.\n"
+"  Padrão: False"
+
+msgid ""
+"``checkconflicts``\n"
+"  True is equivalent to ``check = conflicts``.\n"
+"  Default: False"
+msgstr ""
+"``checkconflicts``\n"
+"  True equivale a ``check = conflicts``.\n"
+"  Padrão: False"
+
+msgid ""
+"``fixeol``\n"
+"  Attempt to fix up EOL changes caused by the merge tool.\n"
+"  Default: False"
+msgstr ""
+"``fixeol``\n"
+"  Tenta corrigir mudanças de quebras de linha causadas pela ferramenta de mesclagem.\n"
+"  Padrão: False"
+
+msgid ""
+"``gui``\n"
+"  This tool requires a graphical interface to run. Default: False"
+msgstr ""
+"``gui``\n"
+"  Esta ferramenta exige uma interface gráfica para ser executada. Padrão: False"
+
+msgid ""
+"``regkey``\n"
+"  Windows registry key which describes install location of this\n"
+"  tool. Mercurial will search for this key first under\n"
+"  ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.\n"
+"  Default: None"
+msgstr ""
+"``regkey``\n"
+"  Chave do registro do Windows que descreve a localização de instalação\n"
+"  desta ferramenta. O Mercurial procurará por esta chave primeiro sob\n"
+"  ``HKEY_CURRENT_USER`` e em seguida sob ``HKEY_LOCAL_MACHINE``.\n"
+"  Padrão: Nenhum"
+
+msgid ""
+"``regkeyalt``\n"
+"  An alternate Windows registry key to try if the first key is not\n"
+"  found.  The alternate key uses the same ``regname`` and ``regappend``\n"
+"  semantics of the primary key.  The most common use for this key\n"
+"  is to search for 32bit applications on 64bit operating systems.\n"
+"  Default: None"
+msgstr ""
+"``regkeyalt``\n"
+"  Uma chave alternativa de registro do Windows a ser tentada caso a primeira\n"
+"  chave não seja encontrada. A chave alternativa usa as mesmas semânticas\n"
+"  ``regname`` e ``regappend`` da chave primária.\n"
+"  O uso mais comum desta chave é a procura de aplicações 32 bits em\n"
+"  sistemas operacionais 64 bits.\n"
+"  Padrão: None"
+
+msgid ""
+"``regname``\n"
+"  Name of value to read from specified registry key. Defaults to the\n"
+"  unnamed (default) value."
+msgstr ""
+"``regname``\n"
+"  Nome do valor a ser lido da chave de registro especificada. O padrão é\n"
+"  o valor sem nome (padrão)."
+
+msgid ""
+"``regappend``\n"
+"  String to append to the value read from the registry, typically\n"
+"  the executable name of the tool.\n"
+"  Default: None"
+msgstr ""
+"``regappend``\n"
+"  String a ser anexada ao valor lido do registro, tipicamente o nome\n"
+"  do executável da ferramenta.\n"
+"  Padrão: None"
 
 msgid ""
 "\n"
@@ -16319,25 +16731,65 @@
 "\"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid ""
-"Specifies profiling format and file output. In this section\n"
-"description, 'profiling data' stands for the raw data collected\n"
-"during profiling, while 'profiling report' stands for a statistical\n"
-"text report generated from the profiling data. The profiling is done\n"
-"using lsprof."
-msgstr ""
-"Especifica formatos de profiling e saída de arquivos. Na descrição desta\n"
+"Specifies profiling type, format, and file output. Two profilers are\n"
+"supported: an instrumenting profiler (named ``ls``), and a sampling\n"
+"profiler (named ``stat``)."
+msgstr ""
+"Especifica o tipo, formato e saída de arquivo de profiling.\n"
+"Dois profilers são suportados: um profiler de instrumentação\n"
+"(chamado ``ls``) e um de amostragem (chamado ``stat``)."
+
+msgid ""
+"In this section description, 'profiling data' stands for the raw data\n"
+"collected during profiling, while 'profiling report' stands for a\n"
+"statistical text report generated from the profiling data. The\n"
+"profiling is done using lsprof."
+msgstr ""
+"Na descrição desta\n"
 "seção, 'dados de profiling' são os dados crus coletados durante o\n"
 "profiling, enquanto 'relatório de profiling' é um relatório estatístico\n"
 "em formato texto gerado a partir dos dados de profiling.\n"
 "O profiling é feito usando lsprof."
 
 msgid ""
+"``type``\n"
+"    The type of profiler to use.\n"
+"    Default: ls."
+msgstr ""
+"``type``\n"
+"    O tipo de profiler a ser usado.\n"
+"    Padrão: ls."
+
+msgid ""
+"    ``ls``\n"
+"      Use Python's built-in instrumenting profiler. This profiler\n"
+"      works on all platforms, but each line number it reports is the\n"
+"      first line of a function. This restriction makes it difficult to\n"
+"      identify the expensive parts of a non-trivial function.\n"
+"    ``stat``\n"
+"      Use a third-party statistical profiler, statprof. This profiler\n"
+"      currently runs only on Unix systems, and is most useful for\n"
+"      profiling commands that run for longer than about 0.1 seconds."
+msgstr ""
+"    ``ls``\n"
+"      Usa o profiler de instrumentação embutido no Python. Este profiler\n"
+"      funciona em todas as plataformas, mas cada número de linha que ele\n"
+"      informa é a primeira linha de uma função. Esta restrição dificulta\n"
+"      a identificação de partes caras de funções não triviais.\n"
+"    ``stat``\n"
+"      Usa o profiler estatístico statprof, fornecido separadamente. No\n"
+"      momento este profiler funciona apenas em sistemas Unix, e é mais\n"
+"      útil para analisar comandos que rodem por mais de cerca de 0.1\n"
+"      segundos."
+
+msgid ""
 "``format``\n"
-"    Profiling format.\n"
+"    Profiling format.  Specific to the ``ls`` instrumenting profiler.\n"
 "    Default: text."
 msgstr ""
 "``format``\n"
-"    Formato de profiling.\n"
+"    Formato de profiling. Específico para o profiler de\n"
+"    instrumentação ``ls``.\n"
 "    Padrão: text."
 
 msgid ""
@@ -16360,6 +16812,16 @@
 "      no kcachegrind."
 
 msgid ""
+"``frequency``\n"
+"    Sampling frequency.  Specific to the ``stat`` sampling profiler.\n"
+"    Default: 1000."
+msgstr ""
+"``frequency``\n"
+"    Frequência de amostragem. Específico para o profiler de amostragem\n"
+"    ``stat``.\n"
+"    Padrão: 1000."
+
+msgid ""
 "``output``\n"
 "    File path where profiling data or report should be saved. If the\n"
 "    file exists, it is replaced. Default: None, data is printed on\n"
@@ -16420,6 +16882,16 @@
 "    O padrão é True."
 
 msgid ""
+"``preferuncompressed``\n"
+"    When set, clients will try to use the uncompressed streaming\n"
+"    protocol. Default is False."
+msgstr ""
+"``preferuncompressed``\n"
+"    Se definido, clientes preferirão o protocolo de streaming\n"
+"    não comprimido.\n"
+"    O padrão é False."
+
+msgid ""
 "``validate``\n"
 "    Whether to validate the completeness of pushed changesets by\n"
 "    checking that all new file revisions specified in manifests are\n"
@@ -16431,29 +16903,99 @@
 "    estão presentes. O padrão é False."
 
 msgid ""
-"``subpaths``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"``smtp``\n"
+"\"\"\"\"\"\"\"\""
+msgstr ""
+"``smtp``\n"
+"\"\"\"\"\"\"\"\""
+
+msgid "Configuration for extensions that need to send email messages."
+msgstr "Configurações para extensões que enviam mensagens de email."
+
+msgid ""
+"``host``\n"
+"    Host name of mail server, e.g. \"mail.example.com\"."
+msgstr ""
+"``host``\n"
+"    Nome do servidor de emails, como em \"mail.example.com\"."
+
+msgid ""
+"``port``\n"
+"    Optional. Port to connect to on mail server. Default: 25."
+msgstr ""
+"``port``\n"
+"    Opcional. Porta usada pelo servidor de emails. Padrão: 25."
+
+msgid ""
+"``tls``\n"
+"    Optional. Method to enable TLS when connecting to mail server: starttls,\n"
+"    smtps or none. Default: none."
+msgstr ""
+"``tls``\n"
+"    Opcional. Método para habilitar TLS ao conectar com o servidor de\n"
+"    emails: starttls, smtps ou none. Padrão: none."
+
+msgid ""
+"``username``\n"
+"    Optional. User name for authenticating with the SMTP server.\n"
+"    Default: none."
+msgstr ""
+"``username``\n"
+"    Opcional. Nome de usuário usado para autenticação no servidor\n"
+"    de emails. Padrão: none."
+
+msgid ""
+"``password``\n"
+"    Optional. Password for authenticating with the SMTP server. If not\n"
+"    specified, interactive sessions will prompt the user for a\n"
+"    password; non-interactive sessions will fail. Default: none."
+msgstr ""
+"``password``\n"
+"    Opcional. Senha usada para autenticação no servidor de emails.\n"
+"    Se não for especificada, sessões interativas consultarão o\n"
+"    usuário para que ele forneça a senha; sessões não interativas\n"
+"    falharão. Padrão: none."
+
+msgid ""
+"``local_hostname``\n"
+"    Optional. It's the hostname that the sender can use to identify\n"
+"    itself to the MTA."
+msgstr ""
+"``local_hostname``\n"
+"    Opcional. É o nome de servidor que o remetente pode usar para se\n"
+"    identificar para o MTA."
+
+msgid ""
+"\n"
 "``subpaths``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\""
-
-msgid "Defines subrepositories source locations rewriting rules of the form::"
-msgstr ""
-"Define regras de reescrita de localização de subrepositórios da forma::"
+msgstr ""
+"\n"
+"``subpaths``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\""
+
+msgid ""
+"Subrepository source URLs can go stale if a remote server changes name\n"
+"or becomes temporarily unavailable. This section lets you define\n"
+"rewrite rules of the form::"
+msgstr ""
+"URLs de origem de sub-repositórios podem se tornar obsoletas se\n"
+"um servidor remoto mudar de nome ou se tornar indisponível. Esta\n"
+"seção possibilita a definição de regras de reescrita com a forma::"
 
 msgid "    <pattern> = <replacement>"
 msgstr "    <padrão> = <substituição>"
 
 msgid ""
-"Where ``pattern`` is a regular expression matching the source and\n"
-"``replacement`` is the replacement string used to rewrite it. Groups\n"
-"can be matched in ``pattern`` and referenced in ``replacements``. For\n"
-"instance::"
-msgstr ""
-"Onde ``padrão`` é uma expressão regular comparada com a origem e\n"
-"``substituição`` é o texto a ser usado para reescrevê-la. Grupos\n"
-"podem ser usados em ``padrão`` e referenciados em ``substituição``.\n"
-"Por exemplo::"
+"where ``pattern`` is a regular expression matching a subrepository\n"
+"source URL and ``replacement`` is the replacement string used to\n"
+"rewrite it. Groups can be matched in ``pattern`` and referenced in\n"
+"``replacements``. For instance::"
+msgstr ""
+"Onde ``padrão`` é uma expressão regular comparada com uma URL de\n"
+"sub-repositório original e ``substituição`` é o texto a ser usado\n"
+"para reescrevê-la. Grupos podem ser usados em ``padrão`` e\n"
+"referenciados em ``substituição``. Por exemplo::"
 
 msgid "    http://server/(.*)-hg/ = http://hg.server/\\1/"
 msgstr "    http://server/(.*)-hg/ = http://hg.server/\\1/"
@@ -16461,8 +17003,14 @@
 msgid "rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``."
 msgstr "reescreve ``http://server/foo-hg/`` como ``http://hg.server/foo/``."
 
-msgid "All patterns are applied in definition order."
-msgstr "Todos os padrões são aplicados na ordem de definição."
+msgid ""
+"Relative subrepository paths are first made absolute, and the the\n"
+"rewrite rules are then applied on the full (absolute) path. The rules\n"
+"are applied in definition order."
+msgstr ""
+"Caminhos relativos para sub-repositórios são primeiramente tornados\n"
+"absolutos, e em seguida as regras de reescrita são aplicadas no\n"
+"caminho absoluto completo. As regras são aplicadas na ordem de definição."
 
 msgid ""
 "``trusted``\n"
@@ -16684,6 +17232,16 @@
 "    O padrão é ``hg``."
 
 msgid ""
+"``reportoldssl``\n"
+"    Warn if an SSL certificate is unable to be due to using Python\n"
+"    2.5 or earlier. True or False. Default is True."
+msgstr ""
+"``reportoldssl``\n"
+"    Avisa se um certificado SSL não puder ser usado por falta de\n"
+"    suporte nas versões do Pyton 2.5 ou anteriores. True ou False.\n"
+"    O padrão é True."
+
+msgid ""
 "``report_untrusted``\n"
 "    Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a\n"
 "    trusted user or group. True or False. Default is True."
@@ -16979,15 +17537,44 @@
 "    authority certificates. Environment variables and ``~user``\n"
 "    constructs are expanded in the filename. If specified on the\n"
 "    client, then it will verify the identity of remote HTTPS servers\n"
-"    with these certificates. The form must be as follows::"
+"    with these certificates."
 msgstr ""
 "``cacerts``\n"
 "    Caminho para um arquivo contendo uma lista de certificados de\n"
 "    autoridades certificadoras em formato PEM. Variáveis de ambiente\n"
 "    e construções ``~user`` são expandidas no nome de arquivo. Se\n"
 "    especificada no cliente, o Mercurial irá verificar a identidade\n"
-"    de servidores HTTPS remotos usando estes certificados. A forma\n"
-"    deve ser a seguinte::"
+"    de servidores HTTPS remotos usando estes certificados."
+
+msgid ""
+"    This feature is only supported when using Python 2.6 or later. If you wish\n"
+"    to use it with earlier versions of Python, install the backported\n"
+"    version of the ssl library that is available from\n"
+"    ``http://pypi.python.org``."
+msgstr ""
+"    Esta funcionalidade só é suportada em versões do Python 2.6 ou\n"
+"    posteriores. Se você quiser usá-la em versões anteriores do Python,\n"
+"    a versão da biblioteca ssl readaptada para versões antigas do Python\n"
+"    disponível em ``http://pypi.python.org``."
+
+msgid ""
+"    To disable SSL verification temporarily, specify ``--insecure`` from\n"
+"    command line."
+msgstr ""
+"    Para temporariamente desabilitar a verificação SSL, especifique\n"
+"    ``--insecure`` (inseguro) na linha de comando."
+
+msgid ""
+"    You can use OpenSSL's CA certificate file if your platform has\n"
+"    one. On most Linux systems this will be\n"
+"    ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to\n"
+"    generate this file manually. The form must be as follows::"
+msgstr ""
+"    Você pode usar o arquivo de certificado CA do OpenSSL se sua\n"
+"    plataforma tiver um. Em muitos sistemas Linux, será o arquivo\n"
+"    ``/etc/ssl/certs/ca-certificates.crt``.\n"
+"    De outro modo, você terá que gerar esse arquivo manualmente.\n"
+"    A forma deve ser a seguinte::"
 
 msgid ""
 "        -----BEGIN CERTIFICATE-----\n"
@@ -17005,34 +17592,6 @@
 "        -----END CERTIFICATE-----"
 
 msgid ""
-"    This feature is only supported when using Python 2.6 or later. If you wish\n"
-"    to use it with earlier versions of Python, install the backported\n"
-"    version of the ssl library that is available from\n"
-"    ``http://pypi.python.org``."
-msgstr ""
-"    Esta funcionalidade só é suportada em versões do Python 2.6 ou\n"
-"    posteriores. Se você quiser usá-la em versões anteriores do Python,\n"
-"    a versão da biblioteca ssl readaptada para versões antigas do Python\n"
-"    disponível em ``http://pypi.python.org``."
-
-msgid ""
-"    You can use OpenSSL's CA certificate file if your platform has one.\n"
-"    On most Linux systems this will be ``/etc/ssl/certs/ca-certificates.crt``.\n"
-"    Otherwise you will have to generate this file manually."
-msgstr ""
-"    Você pode usar o arquivo de certificado CA do OpenSSL se sua\n"
-"    plataforma tiver um. Em muitos sistemas Linux, será o arquivo\n"
-"    ``/etc/ssl/certs/ca-certificates.crt``.\n"
-"    De outro modo, você terá que gerar esse arquivo manualmente."
-
-msgid ""
-"    To disable SSL verification temporarily, specify ``--insecure`` from\n"
-"    command line."
-msgstr ""
-"    Para temporariamente desabilitar a verificação SSL, especifique\n"
-"    ``--insecure`` (inseguro) na linha de comando."
-
-msgid ""
 "``cache``\n"
 "    Whether to support caching in hgweb. Defaults to True."
 msgstr ""
@@ -18143,10 +18702,10 @@
 
 msgid ""
 "Close changeset\n"
-"    See 'Changeset, close'."
-msgstr ""
-"Close changeset\n"
-"    Veja 'Changeset, close'."
+"    See 'Head, closed branch'"
+msgstr ""
+"Closed changeset\n"
+"    Veja 'Head, closed branch'."
 
 msgid ""
 "Closed branch\n"
@@ -18376,6 +18935,13 @@
 "    consequentemente não será listado por :hg:`branches`."
 
 msgid ""
+"    Closed heads can be re-opened by committing new changeset as the\n"
+"    child of the changeset that marks a head as closed."
+msgstr ""
+"    Cabeças fechadas podem ser reabertas com a consolidação de uma\n"
+"    nova revisão filha da revisão que marca a cabeça como fechada."
+
+msgid ""
 "Head, repository\n"
 "    A topological head which has not been closed."
 msgstr ""
@@ -18901,6 +19467,16 @@
 "partir da raiz, comece-o por ``^``."
 
 msgid ""
+".. note::\n"
+"  Patterns specified in other than ``.hgignore`` are always rooted.\n"
+"  Please see :hg:`help patterns` for details."
+msgstr ""
+".. note::\n"
+"  Padrões são sempre relativos à raiz do repositório, com exceção\n"
+"  dos especificados em ``.hgignore``.\n"
+"  Veja :hg:`help patterns` para mais detalhes."
+
+msgid ""
 "Example\n"
 "-------"
 msgstr ""
@@ -19127,67 +19703,8 @@
 "Também estão disponíveis os seguintes utilitários de mesclagem\n"
 "internos:"
 
-msgid ""
-"``internal:merge``\n"
-"   Uses the internal non-interactive simple merge algorithm for merging\n"
-"   files. It will fail if there are any conflicts and leave markers in\n"
-"   the partially merged file."
-msgstr ""
-"``internal:merge``\n"
-"   Usa o algoritmo não interativo interno simples para mesclar arquivos.\n"
-"   Se houver qualquer conflito, esse algoritmo falhará, deixando\n"
-"   marcadores no arquivo parcialmente mesclado."
-
-msgid ""
-"``internal:fail``\n"
-"   Rather than attempting to merge files that were modified on both\n"
-"   branches, it marks them as unresolved. The resolve command must be\n"
-"   used to resolve these conflicts."
-msgstr ""
-"``internal:fail``\n"
-"   Ao invés de tentar mesclar arquivos modificados em ambos os ramos,\n"
-"   marca tais arquivos como não resolvidos. O comando resolve deve\n"
-"   então ser usado para resolver esses conflitos."
-
-msgid ""
-"``internal:local``\n"
-"   Uses the local version of files as the merged version."
-msgstr ""
-"``internal:local``\n"
-"   Usa a versão local de arquivos como resultado da mesclagem."
-
-msgid ""
-"``internal:other``\n"
-"   Uses the other version of files as the merged version."
-msgstr ""
-"``internal:other``\n"
-"   Usa a outra (não local) versão de arquivos como resultado da mesclagem."
-
-msgid ""
-"``internal:prompt``\n"
-"   Asks the user which of the local or the other version to keep as\n"
-"   the merged version."
-msgstr ""
-"``internal:prompt``\n"
-"   Pergunta ao usuário se a versão local ou a outra deve ser usada\n"
-"   como resultado da mesclagem."
-
-msgid ""
-"``internal:dump``\n"
-"   Creates three versions of the files to merge, containing the\n"
-"   contents of local, other and base. These files can then be used to\n"
-"   perform a merge manually. If the file to be merged is named\n"
-"   ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
-"   ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
-"   same directory as ``a.txt``."
-msgstr ""
-"``internal:dump``\n"
-"   Cria três versões dos arquivos a serem mesclados, com os conteúdos\n"
-"   das versões local, outra e base. Estes arquivos podem então ser\n"
-"   usados para fazer uma mesclagem manual. Se o arquivo a ser mesclado\n"
-"   se chamar ``a.txt``, estes arquivos serão chamados respectivamente\n"
-"   ``a.txt.local``, ``a.txt.other`` e ``a.txt.base`` e serão colocados\n"
-"   no mesmo diretório de ``a.txt``."
+msgid ".. internaltoolsmarker"
+msgstr ".. internaltoolsmarker"
 
 msgid ""
 "Internal tools are always available and do not require a GUI but will by default\n"
@@ -19358,6 +19875,16 @@
 "explicitamente."
 
 msgid ""
+".. note::\n"
+"  Patterns specified in ``.hgignore`` are not rooted. \n"
+"  Please see :hg:`help hgignore` for details."
+msgstr ""
+".. note::\n"
+"  Padrões especificados em ``.hgignore`` não são relativos à raiz do\n"
+"  repositório.\n"
+"  Veja :hg:`help hgignore` para mais detalhes."
+
+msgid ""
 "To use a plain path name without any pattern matching, start it with\n"
 "``path:``. These path names must completely match starting at the\n"
 "current repository root."
@@ -19974,12 +20501,14 @@
 "   de trabalho pai."
 
 msgid ""
-"2. Nested repository references. They are defined in ``.hgsub`` and\n"
+"2. Nested repository references. They are defined in ``.hgsub``, which\n"
+"   should be placed in the root of working directory, and\n"
 "   tell where the subrepository checkouts come from. Mercurial\n"
 "   subrepositories are referenced like:"
 msgstr ""
-"2. Referências a repositórios aninhados. São definidos no\n"
-"   arquivo ``.hgsub`` e informam ao Mercurial de onde as cópias\n"
+"2. Referências a repositórios aninhados. São definidas no\n"
+"   arquivo ``.hgsub`` no raiz do repositório,\n"
+"   e informam ao Mercurial de onde as cópias\n"
 "   locais devem ser obtidas. Sub-repositórios do Mercurial são\n"
 "   referenciados da seguinte maneira:"
 
@@ -20018,14 +20547,16 @@
 "   repositório pai para poder usar sub-repositórios."
 
 msgid ""
-"3. Nested repository states. They are defined in ``.hgsubstate`` and\n"
+"3. Nested repository states. They are defined in ``.hgsubstate``, which\n"
+"   is placed in the root of working directory, and\n"
 "   capture whatever information is required to restore the\n"
 "   subrepositories to the state they were committed in a parent\n"
 "   repository changeset. Mercurial automatically record the nested\n"
 "   repositories states when committing in the parent repository."
 msgstr ""
 "3. Os estados dos repositórios aninhados. Eles são definidos no\n"
-"   arquivo ``.hgsubstate`` e capturam quaisquer informações\n"
+"   arquivo ``.hgsubstate`` no raiz do repositório,\n"
+"   e capturam quaisquer informações\n"
 "   necessárias para restaurar os sub-repositórios para o estado\n"
 "   com o qual foram consolidados na revisão do repositório pai.\n"
 "   O Mercurial grava esses estados automaticamente durante uma\n"
@@ -20755,14 +21286,6 @@
 "a cópia de trabalho de .hgtags foi modificada (por favor consolide .hgtags "
 "manualmente)"
 
-#, python-format
-msgid "working directory has unknown parent '%s'!"
-msgstr "diretório de trabalho tem pai desconhecido '%s'!"
-
-#, python-format
-msgid "unknown revision '%s'"
-msgstr "revisão desconhecida '%s'"
-
 msgid "abandoned transaction found - run hg recover"
 msgstr "transação abandonada encontrada - execute hg recover"
 
@@ -20832,12 +21355,16 @@
 "não é possível consolidar parcialmente uma mesclagem (não especifique "
 "arquivos ou padrões)"
 
-msgid "can't commit subrepos without .hgsub"
-msgstr "não é possível consolidar sub-repositórios sem o arquivo .hgsub"
+#, python-format
+msgid "commit with new subrepo %s excluded"
+msgstr "consolidação com novo sub-repositório %s excluída"
 
 msgid "use --subrepos for recursive commit"
 msgstr "use --subrepos para um commit recursivo"
 
+msgid "can't commit subrepos without .hgsub"
+msgstr "não é possível consolidar sub-repositórios sem o arquivo .hgsub"
+
 msgid "file not found!"
 msgstr "arquivo não encontrado!"
 
@@ -20847,6 +21374,9 @@
 msgid "file not tracked!"
 msgstr "arquivo não rastreado!"
 
+msgid "cannot commit merge with missing files"
+msgstr "não se pode consolidar uma mesclagem com arquivos ausentes"
+
 msgid "unresolved merge conflicts (see hg help resolve)"
 msgstr "conflitos de mesclagem não resolvidos (veja hg help resolve)"
 
@@ -21202,12 +21732,17 @@
 msgid "bad hunk #%d old text line %d"
 msgstr "trecho ruim #%d antiga linha de texto %d"
 
-msgid "could not extract binary patch"
-msgstr "não foi possível extrair o patch binário"
-
-#, python-format
-msgid "binary patch is %d bytes, not %d"
-msgstr "patch binário tem %d bytes, e não %d"
+#, python-format
+msgid "could not extract \"%s\" binary data"
+msgstr "não foi possível extrair os dados binários de \"%s\""
+
+#, python-format
+msgid "could not decode \"%s\" binary patch: %s"
+msgstr "não foi possível decodificar o patch binário \"%s\": %s"
+
+#, python-format
+msgid "\"%s\" length is %d bytes, should be %d"
+msgstr "o comprimento de \"%s\" é %d bytes, deveria ser %d"
 
 #, python-format
 msgid "unable to strip away %d of %d dirs from %s"
@@ -21217,6 +21752,10 @@
 msgstr "arquivos de origem e destino não definidos"
 
 #, python-format
+msgid "failed to synchronize metadata for \"%s\""
+msgstr "falha ao sincronizar metadados para \"%s\""
+
+#, python-format
 msgid "cannot create %s: destination already exists"
 msgstr "impossível criar %s: destino já existe"
 
@@ -21263,6 +21802,10 @@
 msgstr "adicionando ramo\n"
 
 #, python-format
+msgid "error removing %s: %s\n"
+msgstr "erro ao remover %s: %s\n"
+
+#, python-format
 msgid "strip failed, full bundle stored in '%s'\n"
 msgstr "strip falhou, bundle completo armazenado em '%s'\n"
 
@@ -21508,6 +22051,14 @@
 "``first(conjunto, [n])``\n"
 "    Um apelido para limit()."
 
+#, python-format
+msgid "%s takes no arguments or a filename"
+msgstr "%s requer um nome de arquivo ou nenhum argumento"
+
+#, python-format
+msgid "%s expected a filename"
+msgstr "%s espera um nome de arquivo"
+
 msgid ""
 "``follow([file])``\n"
 "    An alias for ``::.`` (ancestors of the working copy's first parent).\n"
@@ -21519,13 +22070,6 @@
 "    Se um nome de arquivo for especificado, o histórico do arquivo pedido será\n"
 "    seguido, incluindo cópias."
 
-#. i18n: "follow" is a keyword
-msgid "follow takes no arguments or a filename"
-msgstr "follow requer um nome de arquivo ou nenhum argumento"
-
-msgid "follow expected a filename"
-msgstr "follow espera um nome de arquivo"
-
 msgid ""
 "``all()``\n"
 "    All changesets, the same as ``0:tip``."
@@ -21557,6 +22101,23 @@
 msgid "invalid match pattern: %s"
 msgstr "padrão de busca inválido: %s"
 
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles requires at least one argument"
+msgstr "_matchfiles requer ao menos um argumento"
+
+msgid "_matchfiles requires string arguments"
+msgstr "_matchfiles requer argumentos de texto"
+
+msgid "_matchfiles expected at most one revision"
+msgstr "_matchfiles espera no máximo uma revisão"
+
+msgid "_matchfiles expected at most one default mode"
+msgstr "_matchfiles espera no máximo um modo padrão"
+
+#, python-format
+msgid "invalid _matchfiles prefix: %s"
+msgstr "prefixo _matchfiles inválido: %s"
+
 msgid ""
 "``file(pattern)``\n"
 "    Changesets affecting files matched by pattern."
@@ -21805,6 +22366,67 @@
 msgstr "rev espera um número"
 
 msgid ""
+"``matching(revision [, field])``\n"
+"    Changesets in which a given set of fields match the set of fields in the\n"
+"    selected revision or set."
+msgstr ""
+"``matching(revisão [, campos])``\n"
+"    Revisões nas quais os valores do conjunto especificado de campos\n"
+"    combinam com os valores do mesmo conjunto de campos na revisão ou\n"
+"    conjunto de revisões pedido."
+
+msgid ""
+"    To match more than one field pass the list of fields to match separated\n"
+"    by spaces (e.g. ``author description``)."
+msgstr ""
+"    Para combinar com mais de um campo, passe a lista de campos\n"
+"    separada por espaços (como em 'author description')."
+
+msgid ""
+"    Valid fields are most regular revision fields and some special fields."
+msgstr ""
+"    Os campos válidos são a maior parte dos campos comuns de revisões,\n"
+"    além de alguns campos especiais."
+
+msgid ""
+"    Regular revision fields are ``description``, ``author``, ``branch``,\n"
+"    ``date``, ``files``, ``phase``, ``parents``, ``substate`` and ``user``.\n"
+"    Note that ``author`` and ``user`` are synonyms."
+msgstr ""
+"    Os campos comuns são: ``description`` (descrição), ``author`` (autor),\n"
+"    ``branch`` (ramo), ``date`` (data), ``files`` (arquivos),\n"
+"    ``phase`` (fase), ``parents`` (pais), ``substate`` (sub-repositórios)\n"
+"    e ``user`` (usuário). Note que ``user`` ``author`` são sinônimos."
+
+msgid ""
+"    Special fields are ``summary`` and ``metadata``:\n"
+"    ``summary`` matches the first line of the description.\n"
+"    ``metatadata`` is equivalent to matching ``description user date``\n"
+"    (i.e. it matches the main metadata fields)."
+msgstr ""
+"    Os campos especiais são ``summary`` (sumário) e ``metadata`` (metadados):\n"
+"    ``summary`` corresponde à primeira linha da descrição.\n"
+"    ``metatadata`` é equivalente a ``description user date``\n"
+"    (ou seja, corresponde aos principais campos de metadados)."
+
+msgid ""
+"    ``metadata`` is the default field which is used when no fields are\n"
+"    specified. You can match more than one field at a time."
+msgstr ""
+"    Se não forem especificados campos, será utilizado o campo metadata.\n"
+"    Você pode corresponder mais de um campo simultaneamente."
+
+msgid "matching takes 1 or 2 arguments"
+msgstr "matching recebe um ou dois argumentos"
+
+msgid "matching requires a string as its second argument"
+msgstr "matching exige uma string como segundo argumento"
+
+#, python-format
+msgid "unexpected field name passed to matching: %s"
+msgstr "nome de campo inesperado passado para matching: %s"
+
+msgid ""
 "``reverse(set)``\n"
 "    Reverse order of set."
 msgstr ""
@@ -21813,10 +22435,10 @@
 
 msgid ""
 "``roots(set)``\n"
-"    Changesets with no parent changeset in set."
+"    Changesets in set with no parent changeset in set."
 msgstr ""
 "``roots(conjunto)``\n"
-"    Revisões sem revisões pais no conjunto."
+"    Revisões no conjunto sem revisões pais no conjunto."
 
 msgid ""
 "``secret()``\n"
@@ -21896,6 +22518,10 @@
 msgstr "não é um símbolo"
 
 #, python-format
+msgid "infinite expansion of revset alias \"%s\" detected"
+msgstr "detectada expansão infinita no apelido de revset \"%s\""
+
+#, python-format
 msgid "invalid number of arguments: %s"
 msgstr "número de argumentos inválido: %s"
 
@@ -22183,6 +22809,10 @@
 msgstr "enviando sub-repositório %s para %s\n"
 
 #, python-format
+msgid "reverting subrepo %s\n"
+msgstr "revertendo sub-repositório %s\n"
+
+#, python-format
 msgid "'svn' executable not found for subrepo '%s'"
 msgstr "executável 'svn' não encontrado para o sub-repositório '%s'"
 
@@ -22192,6 +22822,12 @@
 msgid "cannot commit svn externals"
 msgstr "não se pode consolidar svn externals"
 
+msgid "cannot commit missing svn entries"
+msgstr "não se pode consolidar entradas svn ausentes"
+
+msgid "failed to commit svn changes"
+msgstr "falha ao consolidar mudanças do svn"
+
 #, python-format
 msgid "not removing repo %s because it has changes.\n"
 msgstr "repositório %s não removido por possuir mudanças.\n"
@@ -22357,10 +22993,29 @@
 ":obfuscate: Qualquer texto. Devolve o texto de entrada\n"
 "    renderizado como uma sequência de entidades XML."
 
-msgid ":person: Any text. Returns the text before an email address."
+msgid ""
+":person: Any text. Returns the name before an email address,\n"
+"    interpreting it as per RFC 5322."
 msgstr ""
 ":person: Qualquer texto. Devolve o texto antes de um endereço\n"
-"    de e-mail."
+"    de e-mail, interpretando-o de acordo com a RFC 5322."
+
+msgid ""
+"    >>> person('foo@bar')\n"
+"    'foo'\n"
+"    >>> person('Foo Bar <foo@bar>')\n"
+"    'Foo Bar'\n"
+"    >>> person('\"Foo Bar\" <foo@bar>')\n"
+"    'Foo Bar'\n"
+"    >>> person('\"Foo \"buz\" Bar\" <foo@bar>')\n"
+"    'Foo \"buz\" Bar'\n"
+"    >>> # The following are invalid, but do exist in real-life\n"
+"    ...\n"
+"    >>> person('Foo \"buz\" Bar <foo@bar>')\n"
+"    'Foo \"buz\" Bar'\n"
+"    >>> person('\"Foo Bar <foo@bar>')\n"
+"    'Foo Bar'"
+msgstr ""
 
 msgid ""
 ":rfc3339date: Date. Returns a date using the Internet date format\n"
@@ -22435,9 +23090,17 @@
 "    \"especiais\". Por exemplo, \"foo bar\" se torna\n"
 "    \"foo%20bar\"."
 
-msgid ":user: Any text. Returns the user portion of an email address."
-msgstr ""
-":user: Qualquer texto. Devolve a parte do usuário de um endereço de e-mail."
+msgid ""
+":user: Any text. Returns a short representation of a user name or email\n"
+"    address."
+msgstr ""
+":user: Qualquer texto. Devolve uma representação curta de um nome\n"
+"    de usuário ou endereço de e-mail."
+
+msgid ":emailuser: Any text. Returns the user portion of an email address."
+msgstr ""
+":emailuser: Qualquer texto. Devolve a parte do usuário de um endereço de "
+"e-mail."
 
 msgid ":author: String. The unmodified author of the changeset."
 msgstr ":author: String. O autor da revisão, sem modificações."
@@ -22634,9 +23297,6 @@
 msgid "password: "
 msgstr "senha: "
 
-msgid "edit failed"
-msgstr "falha ao editar"
-
 msgid "http authorization required"
 msgstr "autorização http requerida"
 
--- a/mercurial/base85.c	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/base85.c	Wed May 02 12:55:44 2012 +0200
@@ -109,7 +109,7 @@
 			if (c < 0)
 				return PyErr_Format(
 					PyExc_ValueError,
-					"Bad base85 character at position %d", i);
+					"bad base85 character at position %d", i);
 			acc = acc * 85 + c;
 		}
 		if (i++ < len)
@@ -118,13 +118,13 @@
 			if (c < 0)
 				return PyErr_Format(
 					PyExc_ValueError,
-					"Bad base85 character at position %d", i);
+					"bad base85 character at position %d", i);
 			/* overflow detection: 0xffffffff == "|NsC0",
 			 * "|NsC" == 0x03030303 */
 			if (acc > 0x03030303 || (acc *= 85) > 0xffffffff - c)
 				return PyErr_Format(
 					PyExc_ValueError,
-					"Bad base85 sequence at position %d", i);
+					"bad base85 sequence at position %d", i);
 			acc += c;
 		}
 
--- a/mercurial/bdiff.c	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/bdiff.c	Wed May 02 12:55:44 2012 +0200
@@ -339,10 +339,12 @@
 	struct line *al, *bl;
 	struct hunk l, *h;
 	int an, bn, len = 0, la, lb, count;
+	PyThreadState *_save;
 
 	if (!PyArg_ParseTuple(args, "s#s#:bdiff", &sa, &la, &sb, &lb))
 		return NULL;
 
+	_save = PyEval_SaveThread();
 	an = splitlines(sa, la, &al);
 	bn = splitlines(sb, lb, &bl);
 	if (!al || !bl)
@@ -361,6 +363,8 @@
 		la = h->a2;
 		lb = h->b2;
 	}
+	PyEval_RestoreThread(_save);
+	_save = NULL;
 
 	result = PyBytes_FromStringAndSize(NULL, len);
 
@@ -385,6 +389,8 @@
 	}
 
 nomem:
+	if (_save)
+		PyEval_RestoreThread(_save);
 	free(al);
 	free(bl);
 	freehunks(l.next);
--- a/mercurial/changegroup.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/changegroup.py	Wed May 02 12:55:44 2012 +0200
@@ -118,7 +118,7 @@
     elif alg == 'GZ':
         def generator(f):
             zd = zlib.decompressobj()
-            for chunk in f:
+            for chunk in util.filechunkiter(f):
                 yield zd.decompress(chunk)
     elif alg == 'BZ':
         def generator(f):
--- a/mercurial/cmdutil.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/cmdutil.py	Wed May 02 12:55:44 2012 +0200
@@ -268,6 +268,11 @@
     # otarget: ossep
     def copyfile(abssrc, relsrc, otarget, exact):
         abstarget = scmutil.canonpath(repo.root, cwd, otarget)
+        if '/' in abstarget:
+            # We cannot normalize abstarget itself, this would prevent
+            # case only renames, like a => A.
+            abspath, absname = abstarget.rsplit('/', 1)
+            abstarget = repo.dirstate.normalize(abspath) + '/' + absname
         reltarget = repo.pathto(abstarget, cwd)
         target = repo.wjoin(abstarget)
         src = repo.wjoin(abssrc)
@@ -1291,9 +1296,6 @@
 
     wlock = repo.wlock()
     try:
-        # Fix up dirstate for copies and renames
-        duplicatecopies(repo, None, base.node())
-
         # First, do a regular commit to record all changes in the working
         # directory (if there are any)
         node = commit(ui, repo, commitfunc, pats, opts)
@@ -1321,6 +1323,8 @@
             date = ctx.date()
             message = ctx.description()
             extra = ctx.extra()
+            # Recompute copies (avoid recording a -> b -> a)
+            copied = copies.pathcopies(base, ctx)
 
             # Prune files which were reverted by the updates: if old introduced
             # file X and our intermediate commit, node, renamed that file, then
@@ -1334,8 +1338,7 @@
                     if f in base.manifest():
                         b = base.filectx(f)
                         return (a.data() == b.data()
-                                and a.flags() == b.flags()
-                                and a.renamed() == b.renamed())
+                                and a.flags() == b.flags())
                     else:
                         return False
                 else:
@@ -1344,7 +1347,13 @@
 
             def filectxfn(repo, ctx_, path):
                 try:
-                    return ctx.filectx(path)
+                    fctx = ctx[path]
+                    flags = fctx.flags()
+                    mctx = context.memfilectx(fctx.path(), fctx.data(),
+                                              islink='l' in flags,
+                                              isexec='x' in flags,
+                                              copied=copied.get(path))
+                    return mctx
                 except KeyError:
                     raise IOError()
         else:
@@ -1379,7 +1388,7 @@
         newid = repo.commitctx(new)
         if newid != old.node():
             # Reroute the working copy parent to the new changeset
-            repo.dirstate.setparents(newid, nullid)
+            repo.setparents(newid, nullid)
 
             # Move bookmarks from old parent to amend commit
             bms = repo.nodebookmarks(old.node())
--- a/mercurial/commands.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/commands.py	Wed May 02 12:55:44 2012 +0200
@@ -449,42 +449,46 @@
         parent = p1
 
     # the backout should appear on the same branch
-    branch = repo.dirstate.branch()
-    hg.clean(repo, node, show_stats=False)
-    repo.dirstate.setbranch(branch)
-    revert_opts = opts.copy()
-    revert_opts['date'] = None
-    revert_opts['all'] = True
-    revert_opts['rev'] = hex(parent)
-    revert_opts['no_backup'] = None
-    revert(ui, repo, **revert_opts)
-    if not opts.get('merge') and op1 != node:
-        try:
-            ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
-            return hg.update(repo, op1)
-        finally:
-            ui.setconfig('ui', 'forcemerge', '')
-
-    commit_opts = opts.copy()
-    commit_opts['addremove'] = False
-    if not commit_opts['message'] and not commit_opts['logfile']:
-        # we don't translate commit messages
-        commit_opts['message'] = "Backed out changeset %s" % short(node)
-        commit_opts['force_editor'] = True
-    commit(ui, repo, **commit_opts)
-    def nice(node):
-        return '%d:%s' % (repo.changelog.rev(node), short(node))
-    ui.status(_('changeset %s backs out changeset %s\n') %
-              (nice(repo.changelog.tip()), nice(node)))
-    if opts.get('merge') and op1 != node:
-        hg.clean(repo, op1, show_stats=False)
-        ui.status(_('merging with changeset %s\n')
-                  % nice(repo.changelog.tip()))
-        try:
-            ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
-            return hg.merge(repo, hex(repo.changelog.tip()))
-        finally:
-            ui.setconfig('ui', 'forcemerge', '')
+    wlock = repo.wlock()
+    try:
+        branch = repo.dirstate.branch()
+        hg.clean(repo, node, show_stats=False)
+        repo.dirstate.setbranch(branch)
+        revert_opts = opts.copy()
+        revert_opts['date'] = None
+        revert_opts['all'] = True
+        revert_opts['rev'] = hex(parent)
+        revert_opts['no_backup'] = None
+        revert(ui, repo, **revert_opts)
+        if not opts.get('merge') and op1 != node:
+            try:
+                ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+                return hg.update(repo, op1)
+            finally:
+                ui.setconfig('ui', 'forcemerge', '')
+
+        commit_opts = opts.copy()
+        commit_opts['addremove'] = False
+        if not commit_opts['message'] and not commit_opts['logfile']:
+            # we don't translate commit messages
+            commit_opts['message'] = "Backed out changeset %s" % short(node)
+            commit_opts['force_editor'] = True
+        commit(ui, repo, **commit_opts)
+        def nice(node):
+            return '%d:%s' % (repo.changelog.rev(node), short(node))
+        ui.status(_('changeset %s backs out changeset %s\n') %
+                  (nice(repo.changelog.tip()), nice(node)))
+        if opts.get('merge') and op1 != node:
+            hg.clean(repo, op1, show_stats=False)
+            ui.status(_('merging with changeset %s\n')
+                      % nice(repo.changelog.tip()))
+            try:
+                ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+                return hg.merge(repo, hex(repo.changelog.tip()))
+            finally:
+                ui.setconfig('ui', 'forcemerge', '')
+    finally:
+        wlock.release()
     return 0
 
 @command('bisect',
@@ -859,23 +863,29 @@
 
     Returns 0 on success.
     """
-
-    if opts.get('clean'):
-        label = repo[None].p1().branch()
-        repo.dirstate.setbranch(label)
-        ui.status(_('reset working directory to branch %s\n') % label)
-    elif label:
-        if not opts.get('force') and label in repo.branchtags():
-            if label not in [p.branch() for p in repo.parents()]:
-                raise util.Abort(_('a branch of the same name already exists'),
-                                 # i18n: "it" refers to an existing branch
-                                 hint=_("use 'hg update' to switch to it"))
-        repo.dirstate.setbranch(label)
-        ui.status(_('marked working directory as branch %s\n') % label)
-        ui.status(_('(branches are permanent and global, '
-                    'did you want a bookmark?)\n'))
-    else:
+    if not opts.get('clean') and not label:
         ui.write("%s\n" % repo.dirstate.branch())
+        return
+
+    wlock = repo.wlock()
+    try:
+        if opts.get('clean'):
+            label = repo[None].p1().branch()
+            repo.dirstate.setbranch(label)
+            ui.status(_('reset working directory to branch %s\n') % label)
+        elif label:
+            if not opts.get('force') and label in repo.branchtags():
+                if label not in [p.branch() for p in repo.parents()]:
+                    raise util.Abort(_('a branch of the same name already'
+                                       ' exists'),
+                                     # i18n: "it" refers to an existing branch
+                                     hint=_("use 'hg update' to switch to it"))
+            repo.dirstate.setbranch(label)
+            ui.status(_('marked working directory as branch %s\n') % label)
+            ui.status(_('(branches are permanent and global, '
+                        'did you want a bookmark?)\n'))
+    finally:
+        wlock.release()
 
 @command('branches',
     [('a', 'active', False, _('show only branches that have unmerged heads')),
@@ -1218,7 +1228,7 @@
     bheads = repo.branchheads(branch)
 
     if opts.get('amend'):
-        if ui.config('ui', 'commitsubrepos'):
+        if ui.configbool('ui', 'commitsubrepos'):
             raise util.Abort(_('cannot amend recursively'))
 
         old = repo['.']
@@ -2260,7 +2270,7 @@
 
     wlock = repo.wlock()
     try:
-        repo.dirstate.setparents(r1, r2)
+        repo.setparents(r1, r2)
     finally:
         wlock.release()
 
@@ -2663,52 +2673,56 @@
     if not revs:
         return -1
 
-    for pos, ctx in enumerate(repo.set("%ld", revs)):
-        current = repo['.']
-
-        ui.status(_('grafting revision %s\n') % ctx.rev())
-        if opts.get('dry_run'):
-            continue
-
-        # we don't merge the first commit when continuing
-        if not cont:
-            # perform the graft merge with p1(rev) as 'ancestor'
-            try:
-                # ui.forcemerge is an internal variable, do not document
-                repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
-                stats = mergemod.update(repo, ctx.node(), True, True, False,
-                                        ctx.p1().node())
-            finally:
-                ui.setconfig('ui', 'forcemerge', '')
-            # drop the second merge parent
-            repo.dirstate.setparents(current.node(), nullid)
-            repo.dirstate.write()
-            # fix up dirstate for copies and renames
-            cmdutil.duplicatecopies(repo, ctx.rev(), ctx.p1().rev())
-            # report any conflicts
-            if stats and stats[3] > 0:
-                # write out state for --continue
-                nodelines = [repo[rev].hex() + "\n" for rev in revs[pos:]]
-                repo.opener.write('graftstate', ''.join(nodelines))
-                raise util.Abort(
-                    _("unresolved conflicts, can't continue"),
-                    hint=_('use hg resolve and hg graft --continue'))
-        else:
-            cont = False
-
-        # commit
-        source = ctx.extra().get('source')
-        if not source:
-            source = ctx.hex()
-        extra = {'source': source}
-        user = ctx.user()
-        if opts.get('user'):
-            user = opts['user']
-        date = ctx.date()
-        if opts.get('date'):
-            date = opts['date']
-        repo.commit(text=ctx.description(), user=user,
-                    date=date, extra=extra, editor=editor)
+    wlock = repo.wlock()
+    try:
+        for pos, ctx in enumerate(repo.set("%ld", revs)):
+            current = repo['.']
+
+            ui.status(_('grafting revision %s\n') % ctx.rev())
+            if opts.get('dry_run'):
+                continue
+
+            # we don't merge the first commit when continuing
+            if not cont:
+                # perform the graft merge with p1(rev) as 'ancestor'
+                try:
+                    # ui.forcemerge is an internal variable, do not document
+                    repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+                    stats = mergemod.update(repo, ctx.node(), True, True, False,
+                                            ctx.p1().node())
+                finally:
+                    ui.setconfig('ui', 'forcemerge', '')
+                # drop the second merge parent
+                repo.setparents(current.node(), nullid)
+                repo.dirstate.write()
+                # fix up dirstate for copies and renames
+                cmdutil.duplicatecopies(repo, ctx.rev(), ctx.p1().rev())
+                # report any conflicts
+                if stats and stats[3] > 0:
+                    # write out state for --continue
+                    nodelines = [repo[rev].hex() + "\n" for rev in revs[pos:]]
+                    repo.opener.write('graftstate', ''.join(nodelines))
+                    raise util.Abort(
+                        _("unresolved conflicts, can't continue"),
+                        hint=_('use hg resolve and hg graft --continue'))
+            else:
+                cont = False
+
+            # commit
+            source = ctx.extra().get('source')
+            if not source:
+                source = ctx.hex()
+            extra = {'source': source}
+            user = ctx.user()
+            if opts.get('user'):
+                user = opts['user']
+            date = ctx.date()
+            if opts.get('date'):
+                date = opts['date']
+            repo.commit(text=ctx.description(), user=user,
+                        date=date, extra=extra, editor=editor)
+    finally:
+        wlock.release()
 
     # remove state when we complete successfully
     if not opts.get('dry_run') and os.path.exists(repo.join('graftstate')):
@@ -3621,7 +3635,7 @@
                 if p1 != parents[0]:
                     hg.clean(repo, p1.node())
                 if p2 != parents[1]:
-                    repo.dirstate.setparents(p1.node(), p2.node())
+                    repo.setparents(p1.node(), p2.node())
 
                 if opts.get('exact') or opts.get('import_branch'):
                     repo.dirstate.setbranch(branch or 'default')
@@ -5646,11 +5660,10 @@
         rev = cmdutil.finddate(ui, repo, date)
 
     if check:
-        # we could use dirty() but we can ignore merge and branch trivia
         c = repo[None]
-        if c.modified() or c.added() or c.removed():
+        if c.dirty(merge=False, branch=False):
             raise util.Abort(_("uncommitted local changes"))
-        if not rev:
+        if rev is None:
             rev = repo[repo[None].branch()].rev()
         mergemod._checkunknown(repo, repo[None], repo[rev])
 
--- a/mercurial/context.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/context.py	Wed May 02 12:55:44 2012 +0200
@@ -940,14 +940,15 @@
         return sorted(self._repo.dirstate.walk(match, self.substate.keys(),
                                                True, False))
 
-    def dirty(self, missing=False):
+    def dirty(self, missing=False, merge=True, branch=True):
         "check whether a working directory is modified"
         # check subrepos first
         for s in self.substate:
             if self.sub(s).dirty():
                 return True
         # check current working dir
-        return (self.p2() or self.branch() != self.p1().branch() or
+        return ((merge and self.p2()) or
+                (branch and self.branch() != self.p1().branch()) or
                 self.modified() or self.added() or self.removed() or
                 (missing and self.deleted()))
 
--- a/mercurial/dirstate.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/dirstate.py	Wed May 02 12:55:44 2012 +0200
@@ -237,14 +237,36 @@
         return encoding.tolocal(self._branch)
 
     def setparents(self, p1, p2=nullid):
+        """Set dirstate parents to p1 and p2.
+
+        When moving from two parents to one, 'm' merged entries a
+        adjusted to normal and previous copy records discarded and
+        returned by the call.
+
+        See localrepo.setparents()
+        """
         self._dirty = self._dirtypl = True
+        oldp2 = self._pl[1]
         self._pl = p1, p2
+        copies = {}
+        if oldp2 != nullid and p2 == nullid:
+            # Discard 'm' markers when moving away from a merge state
+            for f, s in self._map.iteritems():
+                if s[0] == 'm':
+                    if f in self._copymap:
+                        copies[f] = self._copymap[f]
+                    self.normallookup(f)
+        return copies
 
     def setbranch(self, branch):
         if branch in ['tip', '.', 'null']:
             raise util.Abort(_('the name \'%s\' is reserved') % branch)
         self._branch = encoding.fromlocal(branch)
-        self._opener.write("branch", self._branch + '\n')
+        f = self._opener('branch', 'w', atomictemp=True)
+        try:
+            f.write(self._branch + '\n')
+        finally:
+            f.close()
 
     def _read(self):
         self._map = {}
@@ -382,6 +404,8 @@
 
     def merge(self, f):
         '''Mark a file merged.'''
+        if self._pl[1] == nullid:
+            return self.normallookup(f)
         self._dirty = True
         s = os.lstat(self._join(f))
         self._addpath(f)
@@ -396,32 +420,48 @@
             self._droppath(f)
             del self._map[f]
 
-    def _normalize(self, path, isknown):
+    def _normalize(self, path, isknown, ignoremissing=False, exists=None):
         normed = util.normcase(path)
         folded = self._foldmap.get(normed, None)
         if folded is None:
-            if isknown or not os.path.lexists(os.path.join(self._root, path)):
+            if isknown:
                 folded = path
             else:
-                # recursively normalize leading directory components
-                # against dirstate
-                if '/' in normed:
-                    d, f = normed.rsplit('/', 1)
-                    d = self._normalize(d, isknown)
-                    r = self._root + "/" + d
-                    folded = d + "/" + util.fspath(f, r)
+                if exists is None:
+                    exists = os.path.lexists(os.path.join(self._root, path))
+                if not exists:
+                    # Maybe a path component exists
+                    if not ignoremissing and '/' in path:
+                        d, f = path.rsplit('/', 1)
+                        d = self._normalize(d, isknown, ignoremissing, None)
+                        folded = d + "/" + f
+                    else:
+                        # No path components, preserve original case
+                        folded = path
                 else:
-                    folded = util.fspath(normed, self._root)
-                self._foldmap[normed] = folded
+                    # recursively normalize leading directory components
+                    # against dirstate
+                    if '/' in normed:
+                        d, f = normed.rsplit('/', 1)
+                        d = self._normalize(d, isknown, ignoremissing, True)
+                        r = self._root + "/" + d
+                        folded = d + "/" + util.fspath(f, r)
+                    else:
+                        folded = util.fspath(normed, self._root)
+                    self._foldmap[normed] = folded
 
         return folded
 
-    def normalize(self, path, isknown=False):
+    def normalize(self, path, isknown=False, ignoremissing=False):
         '''
         normalize the case of a pathname when on a casefolding filesystem
 
         isknown specifies whether the filename came from walking the
-        disk, to avoid extra filesystem access
+        disk, to avoid extra filesystem access.
+
+        If ignoremissing is True, missing path are returned
+        unchanged. Otherwise, we try harder to normalize possibly
+        existing path components.
 
         The normalized case is determined based on the following precedence:
 
@@ -431,7 +471,7 @@
         '''
 
         if self._checkcase:
-            return self._normalize(path, isknown)
+            return self._normalize(path, isknown, ignoremissing)
         return path
 
     def clear(self):
@@ -563,7 +603,7 @@
             normalize = self._normalize
             skipstep3 = False
         else:
-            normalize = lambda x, y: x
+            normalize = lambda x, y, z: x
 
         files = sorted(match.files())
         subrepos.sort()
@@ -584,7 +624,7 @@
 
         # step 1: find all explicit files
         for ff in files:
-            nf = normalize(normpath(ff), False)
+            nf = normalize(normpath(ff), False, True)
             if nf in results:
                 continue
 
@@ -634,7 +674,7 @@
                     continue
                 raise
             for f, kind, st in entries:
-                nf = normalize(nd and (nd + "/" + f) or f, True)
+                nf = normalize(nd and (nd + "/" + f) or f, True, True)
                 if nf not in results:
                     if kind == dirkind:
                         if not ignore(nf):
--- a/mercurial/discovery.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/discovery.py	Wed May 02 12:55:44 2012 +0200
@@ -153,7 +153,10 @@
         branches = set(repo[n].branch() for n in outgoing.missing)
 
         # 2. Check for new branches on the remote.
-        remotemap = remote.branchmap()
+        if remote.local():
+            remotemap = phases.visiblebranchmap(remote)
+        else:
+            remotemap = remote.branchmap()
         newbranches = branches - set(remotemap)
         if newbranches and not newbranch: # new branch requires --new-branch
             branchnames = ', '.join(sorted(newbranches))
--- a/mercurial/encoding.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/encoding.py	Wed May 02 12:55:44 2012 +0200
@@ -169,7 +169,7 @@
     "best-effort encoding-aware case-folding of local string s"
     try:
         return s.encode('ascii').lower()
-    except UnicodeDecodeError:
+    except UnicodeError:
         pass
     try:
         if isinstance(s, localstr):
--- a/mercurial/help.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/help.py	Wed May 02 12:55:44 2012 +0200
@@ -67,11 +67,11 @@
     (['templating', 'templates'], _('Template Usage'),
      loaddoc('templates')),
     (['urls'], _('URL Paths'), loaddoc('urls')),
-    (["extensions"], _("Using additional features"), extshelp),
+    (["extensions"], _("Using Additional Features"), extshelp),
    (["subrepo", "subrepos"], _("Subrepositories"), loaddoc('subrepos')),
    (["hgweb"], _("Configuring hgweb"), loaddoc('hgweb')),
    (["glossary"], _("Glossary"), loaddoc('glossary')),
-   (["hgignore", "ignore"], _("syntax for Mercurial ignore files"),
+   (["hgignore", "ignore"], _("Syntax for Mercurial Ignore Files"),
     loaddoc('hgignore')),
    (["phases"], _("Working with Phases"), loaddoc('phases')),
 ])
--- a/mercurial/help/config.txt	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/help/config.txt	Wed May 02 12:55:44 2012 +0200
@@ -211,7 +211,7 @@
 shell alias. A shell alias is executed with the shell and will let you
 run arbitrary commands. As an example, ::
 
-   echo = !echo
+   echo = !echo $@
 
 will let you do ``hg echo foo`` to have ``foo`` printed in your
 terminal. A better example might be::
@@ -221,11 +221,17 @@
 which will make ``hg purge`` delete all unknown files in the
 repository in the same manner as the purge extension.
 
-Shell aliases are executed in an environment where ``$HG`` expand to
+Positional arguments like ``$1``, ``$2``, etc. in the alias definition
+expand to the command arguments. Unmatched arguments are
+removed. ``$0`` expands to the alias name and ``$@`` expands to all
+arguments separated by a space. These expansions happen before the
+command is passed to the shell.
+
+Shell aliases are executed in an environment where ``$HG`` expands to
 the path of the Mercurial that was used to execute the alias. This is
 useful when you want to call further Mercurial commands in a shell
 alias, as was done above for the purge alias. In addition,
-``$HG_ARGS`` expand to the arguments given to Mercurial. In the ``hg
+``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg
 echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``.
 
 .. note:: Some global configuration options such as ``-R`` are
@@ -1046,20 +1052,24 @@
 ``subpaths``
 """"""""""""
 
-Defines subrepositories source locations rewriting rules of the form::
+Subrepository source URLs can go stale if a remote server changes name
+or becomes temporarily unavailable. This section lets you define
+rewrite rules of the form::
 
     <pattern> = <replacement>
 
-Where ``pattern`` is a regular expression matching the source and
-``replacement`` is the replacement string used to rewrite it. Groups
-can be matched in ``pattern`` and referenced in ``replacements``. For
-instance::
+where ``pattern`` is a regular expression matching a subrepository
+source URL and ``replacement`` is the replacement string used to
+rewrite it. Groups can be matched in ``pattern`` and referenced in
+``replacements``. For instance::
 
     http://server/(.*)-hg/ = http://hg.server/\1/
 
 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
 
-All patterns are applied in definition order.
+Relative subrepository paths are first made absolute, and the the
+rewrite rules are then applied on the full (absolute) path. The rules
+are applied in definition order.
 
 ``trusted``
 """""""""""
--- a/mercurial/help/glossary.txt	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/help/glossary.txt	Wed May 02 12:55:44 2012 +0200
@@ -135,7 +135,7 @@
     See 'Changeset, child'.
 
 Close changeset
-    See 'Changeset, close'.
+    See 'Head, closed branch'
 
 Closed branch
     See 'Branch, closed'.
@@ -237,6 +237,9 @@
     closed when all its heads are closed and consequently is not
     listed by :hg:`branches`.
 
+    Closed heads can be re-opened by committing new changeset as the
+    child of the changeset that marks a head as closed.
+
 Head, repository
     A topological head which has not been closed.
 
--- a/mercurial/help/hgignore.txt	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/help/hgignore.txt	Wed May 02 12:55:44 2012 +0200
@@ -63,6 +63,10 @@
 and a regexp pattern of the form ``\.c$`` will do the same. To root a
 regexp pattern, start it with ``^``.
 
+.. note::
+  Patterns specified in other than ``.hgignore`` are always rooted.
+  Please see :hg:`help patterns` for details.
+
 Example
 -------
 
--- a/mercurial/help/patterns.txt	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/help/patterns.txt	Wed May 02 12:55:44 2012 +0200
@@ -6,6 +6,10 @@
 
 Alternate pattern notations must be specified explicitly.
 
+.. note::
+  Patterns specified in ``.hgignore`` are not rooted. 
+  Please see :hg:`help hgignore` for details.
+
 To use a plain path name without any pattern matching, start it with
 ``path:``. These path names must completely match starting at the
 current repository root.
--- a/mercurial/help/subrepos.txt	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/help/subrepos.txt	Wed May 02 12:55:44 2012 +0200
@@ -10,7 +10,8 @@
 1. Nested repository checkouts. They can appear anywhere in the
    parent working directory.
 
-2. Nested repository references. They are defined in ``.hgsub`` and
+2. Nested repository references. They are defined in ``.hgsub``, which
+   should be placed in the root of working directory, and
    tell where the subrepository checkouts come from. Mercurial
    subrepositories are referenced like:
 
@@ -30,7 +31,8 @@
    repositories, you have to create and add it to the parent
    repository before using subrepositories.
 
-3. Nested repository states. They are defined in ``.hgsubstate`` and
+3. Nested repository states. They are defined in ``.hgsubstate``, which
+   is placed in the root of working directory, and
    capture whatever information is required to restore the
    subrepositories to the state they were committed in a parent
    repository changeset. Mercurial automatically record the nested
--- a/mercurial/hgweb/webcommands.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/hgweb/webcommands.py	Wed May 02 12:55:44 2012 +0200
@@ -806,7 +806,7 @@
 def _getdoc(e):
     doc = e[0].__doc__
     if doc:
-        doc = doc.split('\n')[0]
+        doc = _(doc).split('\n')[0]
     else:
         doc = _('(no help text available)')
     return doc
--- a/mercurial/localrepo.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/localrepo.py	Wed May 02 12:55:44 2012 +0200
@@ -633,6 +633,17 @@
         '''get list of changectxs for parents of changeid'''
         return self[changeid].parents()
 
+    def setparents(self, p1, p2=nullid):
+        copies = self.dirstate.setparents(p1, p2)
+        if copies:
+            # Adjust copy records, the dirstate cannot do it, it
+            # requires access to parents manifests. Preserve them
+            # only for entries added to first parent.
+            pctx = self[p1]
+            for f in copies:
+                if f not in pctx and copies[f] in pctx:
+                    self.dirstate.copy(copies[f], f)
+
     def filectx(self, path, changeid=None, fileid=None):
         """changeid can be a changeset revision, node, or tag.
            fileid can be a file revision or node."""
@@ -1147,6 +1158,9 @@
                 and wctx.branch() == wctx.p1().branch()):
                 return None
 
+            if merge and changes[3]:
+                raise util.Abort(_("cannot commit merge with missing files"))
+
             ms = mergemod.mergestate(self)
             for f in changes[0]:
                 if f in ms and ms[f] == 'u':
--- a/mercurial/merge.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/merge.py	Wed May 02 12:55:44 2012 +0200
@@ -83,7 +83,7 @@
 
 def _checkunknownfile(repo, wctx, mctx, f):
     return (not repo.dirstate._ignore(f)
-        and os.path.exists(repo.wjoin(f))
+        and os.path.isfile(repo.wjoin(f))
         and repo.dirstate.normalize(f) not in repo.dirstate
         and mctx[f].cmp(wctx[f]))
 
@@ -110,10 +110,18 @@
         folded[fold] = fn
 
     if wctx:
+        # class to delay looking up copy mapping
+        class pathcopies(object):
+            @util.propertycache
+            def map(self):
+                # {dst@mctx: src@wctx} copy mapping
+                return copies.pathcopies(wctx, mctx)
+        pc = pathcopies()
+
         for fn in wctx:
             fold = util.normcase(fn)
             mfn = folded.get(fold, None)
-            if mfn and (mfn != fn):
+            if mfn and mfn != fn and pc.map.get(mfn) != fn:
                 raise util.Abort(_("case-folding collision between %s and %s")
                                  % (mfn, fn))
 
@@ -568,7 +576,12 @@
         action = []
         folding = not util.checkcase(repo.path)
         if folding:
-            _checkcollision(p2, branchmerge and p1)
+            # collision check is not needed for clean update
+            if (not branchmerge and
+                (force or not wc.dirty(missing=True, branch=False))):
+                _checkcollision(p2, None)
+            else:
+                _checkcollision(p2, wc)
         if not force:
             _checkunknown(repo, wc, p2)
         action += _forgetremoved(wc, p2, branchmerge)
@@ -583,7 +596,7 @@
         stats = applyupdates(repo, action, wc, p2, pa, overwrite)
 
         if not partial:
-            repo.dirstate.setparents(fp1, fp2)
+            repo.setparents(fp1, fp2)
             recordupdates(repo, action, branchmerge)
             if not branchmerge:
                 repo.dirstate.setbranch(p2.branch())
--- a/mercurial/patch.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/patch.py	Wed May 02 12:55:44 2012 +0200
@@ -230,7 +230,7 @@
                         elif line.startswith("# Node ID "):
                             nodeid = line[10:]
                         elif line.startswith("# Parent "):
-                            parents.append(line[10:])
+                            parents.append(line[9:].lstrip())
                         elif not line.startswith("# "):
                             hgpatchheader = False
                     elif line == '---' and gitsendmail:
@@ -290,6 +290,19 @@
         other.binary = self.binary
         return other
 
+    def _ispatchinga(self, afile):
+        if afile == '/dev/null':
+            return self.op == 'ADD'
+        return afile == 'a/' + (self.oldpath or self.path)
+
+    def _ispatchingb(self, bfile):
+        if bfile == '/dev/null':
+            return self.op == 'DELETE'
+        return bfile == 'b/' + self.path
+
+    def ispatching(self, afile, bfile):
+        return self._ispatchinga(afile) and self._ispatchingb(bfile)
+
     def __repr__(self):
         return "<patchmeta %s %r>" % (self.op, self.path)
 
@@ -1009,9 +1022,10 @@
 
 class binhunk(object):
     'A binary patch file. Only understands literals so far.'
-    def __init__(self, lr):
+    def __init__(self, lr, fname):
         self.text = None
         self.hunk = ['GIT binary patch\n']
+        self._fname = fname
         self._read(lr)
 
     def complete(self):
@@ -1021,30 +1035,36 @@
         return [self.text]
 
     def _read(self, lr):
-        line = lr.readline()
-        self.hunk.append(line)
+        def getline(lr, hunk):
+            l = lr.readline()
+            hunk.append(l)
+            return l.rstrip('\r\n')
+
+        line = getline(lr, self.hunk)
         while line and not line.startswith('literal '):
-            line = lr.readline()
-            self.hunk.append(line)
+            line = getline(lr, self.hunk)
         if not line:
-            raise PatchError(_('could not extract binary patch'))
+            raise PatchError(_('could not extract "%s" binary data')
+                             % self._fname)
         size = int(line[8:].rstrip())
         dec = []
-        line = lr.readline()
-        self.hunk.append(line)
+        line = getline(lr, self.hunk)
         while len(line) > 1:
             l = line[0]
             if l <= 'Z' and l >= 'A':
                 l = ord(l) - ord('A') + 1
             else:
                 l = ord(l) - ord('a') + 27
-            dec.append(base85.b85decode(line[1:-1])[:l])
-            line = lr.readline()
-            self.hunk.append(line)
+            try:
+                dec.append(base85.b85decode(line[1:])[:l])
+            except ValueError, e:
+                raise PatchError(_('could not decode "%s" binary patch: %s')
+                                 % (self._fname, str(e)))
+            line = getline(lr, self.hunk)
         text = zlib.decompress(''.join(dec))
         if len(text) != size:
-            raise PatchError(_('binary patch is %d bytes, not %d') %
-                             len(text), size)
+            raise PatchError(_('"%s" length is %d bytes, should be %d')
+                             % (self._fname, len(text), size))
         self.text = text
 
 def parsefilename(str):
@@ -1180,10 +1200,10 @@
             or x.startswith('GIT binary patch')):
             gp = None
             if (gitpatches and
-                (gitpatches[-1][0] == afile or gitpatches[-1][1] == bfile)):
-                gp = gitpatches.pop()[2]
+                gitpatches[-1].ispatching(afile, bfile)):
+                gp = gitpatches.pop()
             if x.startswith('GIT binary patch'):
-                h = binhunk(lr)
+                h = binhunk(lr, gp.path)
             else:
                 if context is None and x.startswith('***************'):
                     context = True
@@ -1194,25 +1214,24 @@
                 yield 'file', (afile, bfile, h, gp and gp.copy() or None)
             yield 'hunk', h
         elif x.startswith('diff --git'):
-            m = gitre.match(x)
+            m = gitre.match(x.rstrip(' \r\n'))
             if not m:
                 continue
-            if not gitpatches:
+            if gitpatches is None:
                 # scan whole input for git metadata
-                gitpatches = [('a/' + gp.path, 'b/' + gp.path, gp) for gp
-                              in scangitpatch(lr, x)]
-                yield 'git', [g[2].copy() for g in gitpatches
-                              if g[2].op in ('COPY', 'RENAME')]
+                gitpatches = scangitpatch(lr, x)
+                yield 'git', [g.copy() for g in gitpatches
+                              if g.op in ('COPY', 'RENAME')]
                 gitpatches.reverse()
             afile = 'a/' + m.group(1)
             bfile = 'b/' + m.group(2)
-            while afile != gitpatches[-1][0] and bfile != gitpatches[-1][1]:
-                gp = gitpatches.pop()[2]
+            while gitpatches and not gitpatches[-1].ispatching(afile, bfile):
+                gp = gitpatches.pop()
                 yield 'file', ('a/' + gp.path, 'b/' + gp.path, None, gp.copy())
-            gp = gitpatches[-1][2]
-            # copy/rename + modify should modify target, not source
-            if gp.op in ('COPY', 'DELETE', 'RENAME', 'ADD') or gp.mode:
-                afile = bfile
+            if not gitpatches:
+                raise PatchError(_('failed to synchronize metadata for "%s"')
+                                 % afile[2:])
+            gp = gitpatches[-1]
             newfile = True
         elif x.startswith('---'):
             # check for a unified diff
@@ -1247,7 +1266,7 @@
             hunknum = 0
 
     while gitpatches:
-        gp = gitpatches.pop()[2]
+        gp = gitpatches.pop()
         yield 'file', ('a/' + gp.path, 'b/' + gp.path, None, gp.copy())
 
 def applydiff(ui, fp, backend, store, strip=1, eolmode='strict'):
--- a/mercurial/phases.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/phases.py	Wed May 02 12:55:44 2012 +0200
@@ -263,6 +263,28 @@
         vheads = repo.heads()
     return vheads
 
+def visiblebranchmap(repo):
+    """return a branchmap for the visible set"""
+    # XXX Recomputing this data on the fly is very slow.  We should build a
+    # XXX cached version while computin the standard branchmap version.
+    sroots = repo._phaseroots[secret]
+    if sroots:
+        vbranchmap = {}
+        for branch, nodes in  repo.branchmap().iteritems():
+            # search for secret heads.
+            for n in nodes:
+                if repo[n].phase() >= secret:
+                    nodes = None
+                    break
+            # if secreat heads where found we must compute them again
+            if nodes is None:
+                s = repo.set('heads(branch(%s) - secret())', branch)
+                nodes = [c.node() for c in s]
+            vbranchmap[branch] = nodes
+    else:
+        vbranchmap = repo.branchmap()
+    return vbranchmap
+
 def analyzeremotephases(repo, subset, roots):
     """Compute phases heads and root in a subset of node from root dict
 
--- a/mercurial/pure/osutil.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/pure/osutil.py	Wed May 02 12:55:44 2012 +0200
@@ -58,7 +58,7 @@
 if os.name != 'nt':
     posixfile = open
 else:
-    import ctypes, ctypes.util
+    import ctypes, msvcrt
 
     _kernel32 = ctypes.windll.kernel32
 
@@ -68,15 +68,6 @@
 
     _INVALID_HANDLE_VALUE = _HANDLE(-1).value
 
-    def _crtname():
-        try:
-            # find_msvcrt was introduced in Python 2.6
-            return ctypes.util.find_msvcrt()
-        except AttributeError:
-            return 'msvcr71.dll' # CPython 2.5 and 2.4
-
-    _crt = ctypes.PyDLL(_crtname())
-
     # CreateFile 
     _FILE_SHARE_READ = 0x00000001
     _FILE_SHARE_WRITE = 0x00000002
@@ -105,9 +96,6 @@
         _DWORD, _DWORD, _HANDLE]
     _kernel32.CreateFileA.restype = _HANDLE
 
-    _crt._open_osfhandle.argtypes = [_HANDLE, ctypes.c_int]
-    _crt._open_osfhandle.restype = ctypes.c_int
-
     def _raiseioerror(name):
         err = ctypes.WinError()
         raise IOError(err.errno, '%s: %s' % (name, err.strerror))
@@ -156,10 +144,7 @@
             if fh == _INVALID_HANDLE_VALUE:
                 _raiseioerror(name)
 
-            # for CPython we must use the same CRT as Python uses,
-            # or the os.fdopen call below will abort with
-            #   "OSError: [Errno 9] Bad file descriptor"
-            fd = _crt._open_osfhandle(fh, flags)
+            fd = msvcrt.open_osfhandle(fh, flags)
             if fd == -1:
                 _kernel32.CloseHandle(fh)
                 _raiseioerror(name)
--- a/mercurial/revlog.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/revlog.py	Wed May 02 12:55:44 2012 +0200
@@ -812,7 +812,7 @@
         else:
             df = self.opener(self.datafile)
 
-        readahead = max(_chunksize, length)
+        readahead = max(65536, length)
         df.seek(offset)
         d = df.read(readahead)
         df.close()
--- a/mercurial/revset.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/revset.py	Wed May 02 12:55:44 2012 +0200
@@ -291,7 +291,8 @@
     - ``ignored``            : csets ignored due to DAG topology
     """
     status = getstring(x, _("bisect requires a string")).lower()
-    return [r for r in subset if r in hbisect.get(repo, status)]
+    state = set(hbisect.get(repo, status))
+    return [r for r in subset if r in state]
 
 # Backward-compatibility
 # - no help entry so that we do not advertise it any more
@@ -340,23 +341,26 @@
 def checkstatus(repo, subset, pat, field):
     m = None
     s = []
-    fast = not matchmod.patkind(pat)
+    hasset = matchmod.patkind(pat) == 'set'
+    fname = None
     for r in subset:
         c = repo[r]
-        if fast:
-            if pat not in c.files():
+        if not m or hasset:
+            m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=c)
+            if not m.anypats() and len(m.files()) == 1:
+                fname = m.files()[0]
+        if fname is not None:
+            if fname not in c.files():
                 continue
         else:
-            if not m or matchmod.patkind(pat) == 'set':
-                m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=c)
             for f in c.files():
                 if m(f):
                     break
             else:
                 continue
         files = repo.status(c.p1().node(), c.node())[field]
-        if fast:
-            if pat in files:
+        if fname is not None:
+            if fname in files:
                 s.append(r)
         else:
             for f in files:
@@ -910,19 +914,23 @@
     """``matching(revision [, field])``
     Changesets in which a given set of fields match the set of fields in the
     selected revision or set.
+
     To match more than one field pass the list of fields to match separated
-    by spaces (e.g. 'author description').
-    Valid fields are most regular revision fields and some special fields:
-    * regular fields:
-      - description, author, branch, date, files, phase, parents,
-      substate, user.
-      Note that author and user are synonyms.
-    * special fields: summary, metadata.
-      - summary: matches the first line of the description.
-      - metatadata: It is equivalent to matching 'description user date'
-        (i.e. it matches the main metadata fields).
-    metadata is the default field which is used when no fields are specified.
-    You can match more than one field at a time.
+    by spaces (e.g. ``author description``).
+
+    Valid fields are most regular revision fields and some special fields.
+
+    Regular revision fields are ``description``, ``author``, ``branch``,
+    ``date``, ``files``, ``phase``, ``parents``, ``substate`` and ``user``.
+    Note that ``author`` and ``user`` are synonyms.
+
+    Special fields are ``summary`` and ``metadata``:
+    ``summary`` matches the first line of the description.
+    ``metatadata`` is equivalent to matching ``description user date``
+    (i.e. it matches the main metadata fields).
+
+    ``metadata`` is the default field which is used when no fields are
+    specified. You can match more than one field at a time.
     """
     l = getargs(x, 1, 2, _("matching takes 1 or 2 arguments"))
 
--- a/mercurial/scmutil.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/scmutil.py	Wed May 02 12:55:44 2012 +0200
@@ -160,7 +160,7 @@
         raise NotImplementedError('attempted instantiating ' + str(type(self)))
 
     def tryread(self, path):
-        'gracefully return an empty string for missing files'
+        '''gracefully return an empty string for missing files'''
         try:
             return self.read(path)
         except IOError, inst:
--- a/mercurial/subrepo.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/subrepo.py	Wed May 02 12:55:44 2012 +0200
@@ -366,9 +366,11 @@
         pass
 
     def forget(self, ui, match, prefix):
-        return []
+        return ([], [])
 
     def revert(self, ui, substate, *pats, **opts):
+        ui.warn('%s: reverting %s subrepos is unsupported\n' \
+            % (substate[0], substate[2]))
         return []
 
 class hgsubrepo(abstractsubrepo):
@@ -678,12 +680,13 @@
         return self._wcrevs()[0]
 
     def _wcchanged(self):
-        """Return (changes, extchanges) where changes is True
-        if the working directory was changed, and extchanges is
-        True if any of these changes concern an external entry.
+        """Return (changes, extchanges, missing) where changes is True
+        if the working directory was changed, extchanges is
+        True if any of these changes concern an external entry and missing
+        is True if any change is a missing entry.
         """
         output, err = self._svncommand(['status', '--xml'])
-        externals, changes = [], []
+        externals, changes, missing = [], [], []
         doc = xml.dom.minidom.parseString(output)
         for e in doc.getElementsByTagName('entry'):
             s = e.getElementsByTagName('wc-status')
@@ -694,14 +697,16 @@
             path = e.getAttribute('path')
             if item == 'external':
                 externals.append(path)
+            elif item == 'missing':
+                missing.append(path)
             if (item not in ('', 'normal', 'unversioned', 'external')
                 or props not in ('', 'none', 'normal')):
                 changes.append(path)
         for path in changes:
             for ext in externals:
                 if path == ext or path.startswith(ext + os.sep):
-                    return True, True
-        return bool(changes), False
+                    return True, True, bool(missing)
+        return bool(changes), False, bool(missing)
 
     def dirty(self, ignoreupdate=False):
         if not self._wcchanged()[0]:
@@ -710,20 +715,41 @@
         return True
 
     def basestate(self):
-        return self._wcrev()
+        lastrev, rev = self._wcrevs()
+        if lastrev != rev:
+            # Last committed rev is not the same than rev. We would
+            # like to take lastrev but we do not know if the subrepo
+            # URL exists at lastrev.  Test it and fallback to rev it
+            # is not there.
+            try:
+                self._svncommand(['info', '%s@%s' % (self._state[0], lastrev)])
+                return lastrev
+            except error.Abort:
+                pass
+        return rev
 
     def commit(self, text, user, date):
         # user and date are out of our hands since svn is centralized
-        changed, extchanged = self._wcchanged()
+        changed, extchanged, missing = self._wcchanged()
         if not changed:
-            return self._wcrev()
+            return self.basestate()
         if extchanged:
             # Do not try to commit externals
             raise util.Abort(_('cannot commit svn externals'))
+        if missing:
+            # svn can commit with missing entries but aborting like hg
+            # seems a better approach.
+            raise util.Abort(_('cannot commit missing svn entries'))
         commitinfo, err = self._svncommand(['commit', '-m', text])
         self._ui.status(commitinfo)
         newrev = re.search('Committed revision ([0-9]+).', commitinfo)
         if not newrev:
+            if not commitinfo.strip():
+                # Sometimes, our definition of "changed" differs from
+                # svn one. For instance, svn ignores missing files
+                # when committing. If there are only missing files, no
+                # commit is made, no output and no error code.
+                raise util.Abort(_('failed to commit svn changes'))
             raise util.Abort(commitinfo.splitlines()[-1])
         newrev = newrev.groups()[0]
         self._ui.status(self._svncommand(['update', '-r', newrev])[0])
@@ -765,7 +791,7 @@
         status, err = self._svncommand(args, failok=True)
         if not re.search('Checked out revision [0-9]+.', status):
             if ('is already a working copy for a different URL' in err
-                and (self._wcchanged() == (False, False))):
+                and (self._wcchanged()[:2] == (False, False))):
                 # obstructed but clean working copy, so just blow it away.
                 self.remove()
                 self.get(state, overwrite=False)
@@ -776,9 +802,10 @@
     def merge(self, state):
         old = self._state[1]
         new = state[1]
-        if new != self._wcrev():
-            dirty = old == self._wcrev() or self._wcchanged()[0]
-            if _updateprompt(self._ui, self, dirty, self._wcrev(), new):
+        wcrev = self._wcrev()
+        if new != wcrev:
+            dirty = old == wcrev or self._wcchanged()[0]
+            if _updateprompt(self._ui, self, dirty, wcrev, new):
                 self.get(state, False)
 
     def push(self, opts):
--- a/mercurial/wireproto.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/mercurial/wireproto.py	Wed May 02 12:55:44 2012 +0200
@@ -396,7 +396,7 @@
     return "".join(r)
 
 def branchmap(repo, proto):
-    branchmap = repo.branchmap()
+    branchmap = phases.visiblebranchmap(repo)
     heads = []
     for branch, nodes in branchmap.iteritems():
         branchname = urllib.quote(encoding.fromlocal(branch))
@@ -555,7 +555,7 @@
     their_heads = decodelist(heads)
 
     def check_heads():
-        heads = repo.heads()
+        heads = phases.visibleheads(repo)
         heads_hash = util.sha1(''.join(sorted(heads))).digest()
         return (their_heads == ['force'] or their_heads == heads or
                 their_heads == ['hashed', heads_hash])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/bundles/rename.sh	Wed May 02 12:55:44 2012 +0200
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+#  @  3: 'move2'
+#  |
+#  o  2: 'move1'
+#  |
+#  | o  1: 'change'
+#  |/
+#  o  0: 'add'
+
+hg init copies
+cd copies
+echo a > a
+echo b > b
+echo c > c
+hg ci -Am add
+echo a >> a
+echo b >> b
+echo c >> c
+hg ci -m change
+hg up -qC 0
+hg cp a d
+hg mv b e
+hg mv c f
+hg ci -m move1
+hg mv e g
+hg mv f c
+hg ci -m move2
+hg bundle -a ../renames.hg
+cd ..
Binary file tests/bundles/renames.hg has changed
--- a/tests/run-tests.py	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/run-tests.py	Wed May 02 12:55:44 2012 +0200
@@ -209,7 +209,7 @@
     if options.local:
         testdir = os.path.dirname(os.path.realpath(sys.argv[0]))
         hgbin = os.path.join(os.path.dirname(testdir), 'hg')
-        if not os.access(hgbin, os.X_OK):
+        if os.name != 'nt' and not os.access(hgbin, os.X_OK):
             parser.error('--local specified, but %r not found or not executable'
                          % hgbin)
         options.with_hg = hgbin
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/svn/empty.svndump	Wed May 02 12:55:44 2012 +0200
@@ -0,0 +1,129 @@
+SVN-fs-dump-format-version: 2
+
+UUID: b70c45d5-2b76-4722-a373-d9babae61626
+
+Revision-number: 0
+Prop-content-length: 260
+Content-length: 260
+
+K 8
+svn:date
+V 27
+2012-04-18T11:35:14.752409Z
+K 17
+svn:sync-from-url
+V 73
+file:///Users/pmezard/dev/hg/hg-pmezard/tests/svn/temp/svn-repo/trunk/dir
+K 18
+svn:sync-from-uuid
+V 36
+56625b9e-e7e9-45be-ab61-052d41f0e1dd
+K 24
+svn:sync-last-merged-rev
+V 1
+4
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 112
+Content-length: 112
+
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2012-04-18T11:35:14.769622Z
+K 7
+svn:log
+V 10
+init projA
+PROPS-END
+
+Node-path: trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 2
+Prop-content-length: 107
+Content-length: 107
+
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2012-04-18T11:35:15.052989Z
+K 7
+svn:log
+V 6
+adddir
+PROPS-END
+
+Node-path: trunk/dir
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/dir/a
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
+Content-length: 12
+
+PROPS-END
+a
+
+
+Revision-number: 3
+Prop-content-length: 105
+Content-length: 105
+
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2012-04-18T11:35:16.050353Z
+K 7
+svn:log
+V 4
+addb
+PROPS-END
+
+Revision-number: 4
+Prop-content-length: 105
+Content-length: 105
+
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2012-04-18T11:35:17.050768Z
+K 7
+svn:log
+V 4
+addc
+PROPS-END
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/svn/svndump-empty.sh	Wed May 02 12:55:44 2012 +0200
@@ -0,0 +1,47 @@
+#!/bin/sh
+#
+# Use this script to generate empty.svndump
+#
+
+mkdir temp
+cd temp
+
+mkdir project-orig
+cd project-orig
+mkdir trunk
+mkdir branches
+mkdir tags
+cd ..
+
+svnadmin create svn-repo
+svnurl=file://`pwd`/svn-repo
+svn import project-orig $svnurl -m "init projA"
+
+svn co $svnurl project
+cd project
+mkdir trunk/dir
+echo a > trunk/dir/a
+svn add trunk/dir
+svn ci -m adddir
+
+echo b > trunk/b
+svn add trunk/b
+svn ci -m addb
+
+echo c > c
+svn add c
+svn ci -m addc
+cd ..
+
+# svnsync repo/trunk/dir only so the last two revisions are empty
+svnadmin create svn-empty
+cat > svn-empty/hooks/pre-revprop-change <<EOF
+#!/bin/sh
+exit 0
+EOF
+chmod +x svn-empty/hooks/pre-revprop-change
+svnsync init --username svnsync file://`pwd`/svn-empty file://`pwd`/svn-repo/trunk/dir
+svnsync sync file://`pwd`/svn-empty
+svn log -v file://`pwd`/svn-empty
+
+svnadmin dump svn-empty > ../empty.svndump
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/svnxml.py	Wed May 02 12:55:44 2012 +0200
@@ -0,0 +1,51 @@
+# Read the output of a "svn log --xml" command on stdin, parse it and
+# print a subset of attributes common to all svn versions tested by
+# hg.
+import xml.dom.minidom, sys
+
+def xmltext(e):
+    return ''.join(c.data for c
+                   in e.childNodes
+                   if c.nodeType == c.TEXT_NODE)
+
+def parseentry(entry):
+    e = {}
+    e['revision'] = entry.getAttribute('revision')
+    e['author'] = xmltext(entry.getElementsByTagName('author')[0])
+    e['msg'] = xmltext(entry.getElementsByTagName('msg')[0])
+    e['paths'] = []
+    paths = entry.getElementsByTagName('paths')
+    if paths:
+        paths = paths[0]
+        for p in paths.getElementsByTagName('path'):
+            action = p.getAttribute('action')
+            path = xmltext(p)
+            frompath = p.getAttribute('copyfrom-path')
+            fromrev = p.getAttribute('copyfrom-rev')
+            e['paths'].append((path, action, frompath, fromrev))
+    return e
+
+def parselog(data):
+    entries = []
+    doc = xml.dom.minidom.parseString(data)
+    for e in doc.getElementsByTagName('logentry'):
+        entries.append(parseentry(e))
+    return entries
+
+def printentries(entries):
+    fp = sys.stdout
+    for e in entries:
+        for k in ('revision', 'author', 'msg'):
+            fp.write(('%s: %s\n' % (k, e[k])).encode('utf-8'))
+        for path, action, fpath, frev in sorted(e['paths']):
+            frominfo = ''
+            if frev:
+                frominfo = ' (from %s@%s)' % (fpath, frev)
+            p = ' %s %s%s\n' % (action, path, frominfo)
+            fp.write(p.encode('utf-8'))
+
+if __name__ == '__main__':
+    data = sys.stdin.read()
+    entries = parselog(data)
+    printentries(entries)
+
--- a/tests/test-bad-pull.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-bad-pull.t	Wed May 02 12:55:44 2012 +0200
@@ -20,7 +20,7 @@
 
   $ python dumb.py 2> log &
   $ P=$!
-  $ while [ ! -f listening ]; do true; done
+  $ while [ ! -f listening ]; do sleep 0; done
   $ hg clone http://localhost:$HGPORT/foo copy2
   abort: HTTP Error 404: * (glob)
   [255]
--- a/tests/test-casecollision-merge.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-casecollision-merge.t	Wed May 02 12:55:44 2012 +0200
@@ -6,104 +6,204 @@
 test for branch merging
 ################################
 
-  $ hg init repo1
-  $ cd repo1
-
-create base revision
+test for rename awareness of case-folding collision check:
 
-  $ echo base > base.txt
-  $ hg add base.txt
-  $ hg commit -m 'base'
+(1) colliding file is one renamed from collided file:
+this is also case for issue3370.
 
-add same file in different case on both heads
+  $ hg init merge_renameaware_1
+  $ cd merge_renameaware_1
 
-  $ echo a > a.txt
-  $ hg add a.txt
-  $ hg commit -m 'add a.txt'
-
+  $ echo a > a
+  $ hg add a
+  $ hg commit -m '#0'
+  $ hg rename a tmp
+  $ hg rename tmp A
+  $ hg commit -m '#1'
   $ hg update 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-
-  $ echo A > A.TXT
-  $ hg add A.TXT
-  $ hg commit -m 'add A.TXT'
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo 'modified at #2' > a
+  $ hg commit -m '#2'
   created new head
 
-merge another, and fail with case-folding collision
+  $ hg merge
+  merging a and A to A
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg status -A
+  M A
+    a
+  R a
+  $ cat A
+  modified at #2
+
+  $ hg update --clean 1
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg merge
+  merging A and a to A
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ hg status -A
+  M A
+    a
+  $ cat A
+  modified at #2
+
+  $ cd ..
+
+(2) colliding file is not related to collided file
+
+  $ hg init merge_renameaware_2
+  $ cd merge_renameaware_2
+
+  $ echo a > a
+  $ hg add a
+  $ hg commit -m '#0'
+  $ hg remove a
+  $ hg commit -m '#1'
+  $ echo A > A
+  $ hg add A
+  $ 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
+  $ hg commit -m '#3'
+  created new head
 
   $ hg merge
-  abort: case-folding collision between a.txt and A.TXT
+  abort: case-folding collision between A and a
   [255]
+  $ hg parents --template '{rev}\n'
+  3
+  $ hg status -A
+  C a
+  $ cat a
+  modified at #3
 
-check clean-ness of working directory
-
-  $ hg status
+  $ hg update --clean 2
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg merge
+  abort: case-folding collision between a and A
+  [255]
   $ hg parents --template '{rev}\n'
   2
+  $ hg status -A
+  C A
+  $ cat A
+  A
+
   $ cd ..
 
+
 ################################
 test for linear updates
 ################################
 
-  $ hg init repo2
-  $ cd repo2
+test for rename awareness of case-folding collision check:
 
-create base revision (rev:0)
+(1) colliding file is one renamed from collided file
+
+  $ hg init linearupdate_renameaware_1
+  $ cd linearupdate_renameaware_1
 
-  $ hg import --bypass --exact - <<EOF
-  > # HG changeset patch
-  > # User null
-  > # Date 1 0
-  > # Node ID e1bdf414b0ea9c831fd3a14e94a0a18e1410f98b
-  > # Parent  0000000000000000000000000000000000000000
-  > add a
-  > 
-  > diff --git a/a b/a
-  > new file mode 100644
-  > --- /dev/null
-  > +++ b/a
-  > @@ -0,0 +1,3 @@
-  > +this is line 1
-  > +this is line 2
-  > +this is line 3
-  > EOF
-  applying patch from stdin
-
-create rename revision (rev:1)
-
-  $ hg import --bypass --exact - <<EOF
-  > # HG changeset patch
-  > # User null
-  > # Date 1 0
-  > # Node ID 9dca9f19bb91851bc693544b598b0740629edfad
-  > # Parent  e1bdf414b0ea9c831fd3a14e94a0a18e1410f98b
-  > rename a to A
-  > 
-  > diff --git a/a b/A
-  > rename from a
-  > rename to A
-  > EOF
-  applying patch from stdin
-
-update to base revision, and modify 'a'
+  $ echo a > a
+  $ hg add a
+  $ hg commit -m '#0'
+  $ hg rename a tmp
+  $ hg rename tmp A
+  $ hg commit -m '#1'
 
   $ hg update 0
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ echo 'this is added line' >> a
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
 
-update to current tip linearly
-
+  $ echo 'this is added line' >> a
   $ hg update 1
   merging a and A to A
   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
-
-check status and contents of file
-
   $ hg status -A
   M A
   $ cat A
-  this is line 1
-  this is line 2
-  this is line 3
+  a
   this is added line
+
+  $ cd ..
+
+(2) colliding file is not related to collided file
+
+  $ hg init linearupdate_renameaware_2
+  $ cd linearupdate_renameaware_2
+
+  $ echo a > a
+  $ hg add a
+  $ hg commit -m '#0'
+  $ hg remove a
+  $ hg commit -m '#1'
+  $ echo A > A
+  $ hg add A
+  $ hg commit -m '#2'
+
+  $ hg update 0
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg parents --template '{rev}\n'
+  0
+  $ hg status -A
+  C a
+  $ cat A
+  a
+  $ hg up -qC 2
+
+  $ hg update --check 0
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg parents --template '{rev}\n'
+  0
+  $ hg status -A
+  C a
+  $ cat a
+  a
+
+  $ hg update --clean 2
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg parents --template '{rev}\n'
+  2
+  $ hg status -A
+  C A
+  $ cat A
+  A
+
+  $ cd ..
+
+(3) colliding file is not related to collided file: added in working dir
+
+  $ hg init linearupdate_renameaware_3
+  $ cd linearupdate_renameaware_3
+
+  $ echo a > a
+  $ hg add a
+  $ hg commit -m '#0'
+  $ hg rename a b
+  $ hg commit -m '#1'
+  $ hg update 0
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+  $ echo B > B
+  $ hg add B
+  $ hg status
+  A B
+  $ hg update
+  abort: case-folding collision between b and B
+  [255]
+
+  $ hg update --check
+  abort: uncommitted local changes
+  [255]
+
+  $ hg update --clean
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg parents --template '{rev}\n'
+  1
+  $ hg status -A
+  C b
+  $ cat b
+  a
+
+  $ cd ..
--- a/tests/test-casefolding.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-casefolding.t	Wed May 02 12:55:44 2012 +0200
@@ -32,6 +32,42 @@
   $ hg mv a A
   $ hg mv A a
   $ hg st
+
+test changing case of path components
+
+  $ mkdir D
+  $ echo b > D/b
+  $ hg ci -Am addb D/b
+  $ hg mv D/b d/b
+  D/b: not overwriting - file exists
+  $ hg mv D/b d/c
+  $ hg st
+  A D/c
+  R D/b
+  $ mv D temp
+  $ mv temp d
+  $ hg st
+  A D/c
+  R D/b
+  $ hg revert -aq
+  $ rm d/c
+  $ echo c > D/c
+  $ hg add D/c
+  $ hg st
+  A D/c
+  $ hg ci -m addc D/c
+  $ hg mv d/b d/e
+  moving D/b to D/e
+  $ hg st
+  A D/e
+  R D/b
+  $ hg revert -aq
+  $ rm d/e
+  $ hg mv d/b D/B
+  moving D/b to D/B
+  $ hg st
+  A D/B
+  R D/b
   $ cd ..
 
 test case collision between revisions (issue912)
--- a/tests/test-check-code-hg.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-check-code-hg.t	Wed May 02 12:55:44 2012 +0200
@@ -1,6 +1,7 @@
   $ check_code="$TESTDIR"/../contrib/check-code.py
   $ cd "$TESTDIR"/..
-  $ if ! hg identify -q > /dev/null; then
+  $ if hg identify -q > /dev/null; then :
+  > else
   >     echo "skipped: not a Mercurial working dir" >&2
   >     exit 80
   > fi
--- a/tests/test-commit-amend.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-commit-amend.t	Wed May 02 12:55:44 2012 +0200
@@ -1,3 +1,5 @@
+  $ "$TESTDIR/hghave" execbit || exit 80
+
   $ hg init
 
 Setup:
@@ -273,7 +275,7 @@
   $ hg mv c d
   $ hg ci --amend -m 'b -> d'
   saved backup bundle to $TESTTMP/.hg/strip-backup/9c207120aa98-amend-backup.hg
-  $ hg st --rev .^ --copies d
+  $ hg st --rev '.^' --copies d
   A d
     b
   $ hg cp d e
@@ -281,10 +283,34 @@
   $ hg cp e f
   $ hg ci --amend -m 'f = d'
   saved backup bundle to $TESTTMP/.hg/strip-backup/fda2b3b27b22-amend-backup.hg
-  $ hg st --rev .^ --copies f
+  $ hg st --rev '.^' --copies f
   A f
     d
 
+  $ mv f f.orig
+  $ hg rm -A f
+  $ hg ci -m removef
+  $ hg cp a f
+  $ mv f.orig f
+  $ hg ci --amend -m replacef
+  saved backup bundle to $TESTTMP/.hg/strip-backup/20a7413547f9-amend-backup.hg
+  $ hg st --change . --copies
+  $ hg log -r . --template "{file_copies}\n"
+  
+
+Move added file (issue3410):
+
+  $ echo g >> g
+  $ hg ci -Am g
+  adding g
+  $ hg mv g h
+  $ hg ci --amend
+  saved backup bundle to $TESTTMP/.hg/strip-backup/5daa77a5d616-amend-backup.hg
+  $ hg st --change . --copies h
+  A h
+  $ hg log -r . --template "{file_copies}\n"
+  
+
 Can't rollback an amend:
 
   $ hg rollback
--- a/tests/test-convert-p4-filetypes	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-convert-p4-filetypes	Wed May 02 12:55:44 2012 +0200
@@ -44,7 +44,7 @@
    T2=`echo $T | tr [:upper:] [:lower:]`
    case $T in
       apple)
-	 ;;
+         ;;
       symlink*)
          echo "this is target $T" >target_$T2
          ln -s target_$T file_$T2
@@ -52,7 +52,7 @@
          p4 add -t $T file_$T2
          ;;
       binary*)
-	 python -c "file('file_$T2', 'wb').write('this is $T')"
+         python -c "file('file_$T2', 'wb').write('this is $T')"
          p4 add -t $T file_$T2
          ;;
       *)
--- a/tests/test-convert-splicemap.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-convert-splicemap.t	Wed May 02 12:55:44 2012 +0200
@@ -125,7 +125,7 @@
 the bug should be exhibited with all conversion orders.
 
   $ cat > ../splicemap <<EOF
-  > $(hg id -r 2 -i --debug) $(hg id -r 1 -i --debug), $(hg id -r 3 -i --debug)
+  > `(hg id -r 2 -i --debug)` `(hg id -r 1 -i --debug)`, `(hg id -r 3 -i --debug)`
   > EOF
   $ cd ..
   $ cat splicemap
@@ -169,9 +169,9 @@
   converting...
   0 addb
   $ cat > splicemap <<EOF
-  > $(hg -R ordered id -r 2 -i --debug) \
-  > $(hg -R ordered-hg2 id -r 1 -i --debug),\
-  > $(hg -R ordered-hg2 id -r 2 -i --debug)
+  > `(hg -R ordered id -r 2 -i --debug)` \
+  > `(hg -R ordered-hg2 id -r 1 -i --debug)`,\
+  > `(hg -R ordered-hg2 id -r 2 -i --debug)`
   > deadbeef102a90ea7b4a3361e4082ed620918c26 deadbeef102a90ea7b4a3361e4082ed620918c27
   > EOF
   $ hg convert --splicemap splicemap ordered ordered-hg2
@@ -211,9 +211,9 @@
 Test invalid dependency
 
   $ cat > splicemap <<EOF
-  > $(hg -R ordered id -r 2 -i --debug) \
+  > `(hg -R ordered id -r 2 -i --debug)` \
   > deadbeef102a90ea7b4a3361e4082ed620918c26,\
-  > $(hg -R ordered-hg2 id -r 2 -i --debug)
+  > `(hg -R ordered-hg2 id -r 2 -i --debug)`
   > EOF
   $ hg convert --splicemap splicemap ordered ordered-hg4
   initializing destination ordered-hg4 repository
--- a/tests/test-convert-svn-sink.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-convert-svn-sink.t	Wed May 02 12:55:44 2012 +0200
@@ -8,16 +8,13 @@
   > {
   >     (
   >        cd $1;
-  >        svn up;
-  >        svn st -v | fixpath | sed 's/  */ /g'
+  >        svn up -q;
+  >        svn st -v | fixpath | sed 's/  */ /g' | sort
   >        limit=''
   >        if [ $2 -gt 0 ]; then
   >            limit="--limit=$2"
   >        fi
-  >        svn log --xml -v $limit \
-  >            | fixpath \
-  >            | sed 's,<date>.*,<date/>,' \
-  >            | grep -v 'kind="'
+  >        svn log --xml -v $limit | python "$TESTDIR/svnxml.py"
   >     )
   > }
 
@@ -57,44 +54,24 @@
   1 add a file
   0 modify a file
   $ svnupanddisplay a-hg-wc 2
-  At revision 2.
-   2 2 test .
-   2 2 test a
    2 1 test d1
    2 1 test d1/d2
    2 1 test d1/d2/b
    2 1 test link
-  <?xml version="1.0"?>
-  <log>
-  <logentry
-     revision="2">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="M">/a</path>
-  </paths>
-  <msg>modify a file</msg>
-  </logentry>
-  <logentry
-     revision="1">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="A">/a</path>
-  <path
-     action="A">/d1</path>
-  <path
-     action="A">/d1/d2</path>
-  <path
-     action="A">/d1/d2/b</path>
-  <path
-     action="A">/link</path>
-  </paths>
-  <msg>add a file</msg>
-  </logentry>
-  </log>
+   2 2 test .
+   2 2 test a
+  revision: 2
+  author: test
+  msg: modify a file
+   M /a
+  revision: 1
+  author: test
+  msg: add a file
+   A /a
+   A /d1
+   A /d1/d2
+   A /d1/d2/b
+   A /link
   $ ls a a-hg-wc
   a:
   a
@@ -124,36 +101,19 @@
   converting...
   0 rename a file
   $ svnupanddisplay a-hg-wc 1
-  At revision 3.
-   3 3 test .
-   3 3 test b
    3 1 test d1
    3 1 test d1/d2
    3 1 test d1/d2/b
+   3 3 test .
+   3 3 test b
    3 3 test newlink
-  <?xml version="1.0"?>
-  <log>
-  <logentry
-     revision="3">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="D">/a</path>
-  <path
-     copyfrom-path="/a"
-     copyfrom-rev="2"
-     action="A">/b</path>
-  <path
-     copyfrom-path="/link"
-     copyfrom-rev="2"
-     action="A">/newlink</path>
-  <path
-     action="D">/link</path>
-  </paths>
-  <msg>rename a file</msg>
-  </logentry>
-  </log>
+  revision: 3
+  author: test
+  msg: rename a file
+   D /a
+   A /b (from /a@2)
+   D /link
+   A /newlink (from /link@2)
   $ ls a a-hg-wc
   a:
   b
@@ -181,29 +141,17 @@
   converting...
   0 copy a file
   $ svnupanddisplay a-hg-wc 1
-  At revision 4.
-   4 4 test .
-   4 3 test b
-   4 4 test c
    4 1 test d1
    4 1 test d1/d2
    4 1 test d1/d2/b
+   4 3 test b
    4 3 test newlink
-  <?xml version="1.0"?>
-  <log>
-  <logentry
-     revision="4">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     copyfrom-path="/b"
-     copyfrom-rev="3"
-     action="A">/c</path>
-  </paths>
-  <msg>copy a file</msg>
-  </logentry>
-  </log>
+   4 4 test .
+   4 4 test c
+  revision: 4
+  author: test
+  msg: copy a file
+   A /c (from /b@3)
   $ ls a a-hg-wc
   a:
   b
@@ -233,26 +181,16 @@
   converting...
   0 remove a file
   $ svnupanddisplay a-hg-wc 1
-  At revision 5.
-   5 5 test .
-   5 4 test c
    5 1 test d1
    5 1 test d1/d2
    5 1 test d1/d2/b
    5 3 test newlink
-  <?xml version="1.0"?>
-  <log>
-  <logentry
-     revision="5">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="D">/b</path>
-  </paths>
-  <msg>remove a file</msg>
-  </logentry>
-  </log>
+   5 4 test c
+   5 5 test .
+  revision: 5
+  author: test
+  msg: remove a file
+   D /b
   $ ls a a-hg-wc
   a:
   c
@@ -279,26 +217,16 @@
   converting...
   0 make a file executable
   $ svnupanddisplay a-hg-wc 1
-  At revision 6.
-   6 6 test .
-   6 6 test c
    6 1 test d1
    6 1 test d1/d2
    6 1 test d1/d2/b
    6 3 test newlink
-  <?xml version="1.0"?>
-  <log>
-  <logentry
-     revision="6">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="M">/c</path>
-  </paths>
-  <msg>make a file executable</msg>
-  </logentry>
-  </log>
+   6 6 test .
+   6 6 test c
+  revision: 6
+  author: test
+  msg: make a file executable
+   M /c
   $ test -x a-hg-wc/c
 
 Executable in new directory
@@ -321,25 +249,14 @@
   converting...
   0 add executable file in new directory
   $ svnupanddisplay a-hg-wc 1
-  At revision 1.
    1 1 test .
    1 1 test d1
    1 1 test d1/a
-  <?xml version="1.0"?>
-  <log>
-  <logentry
-     revision="1">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="A">/d1</path>
-  <path
-     action="A">/d1/a</path>
-  </paths>
-  <msg>add executable file in new directory</msg>
-  </logentry>
-  </log>
+  revision: 1
+  author: test
+  msg: add executable file in new directory
+   A /d1
+   A /d1/a
   $ test -x a-hg-wc/d1/a
 
 Copy to new directory
@@ -356,29 +273,16 @@
   converting...
   0 copy file to new directory
   $ svnupanddisplay a-hg-wc 1
-  At revision 2.
-   2 2 test .
    2 1 test d1
    2 1 test d1/a
+   2 2 test .
    2 2 test d2
    2 2 test d2/a
-  <?xml version="1.0"?>
-  <log>
-  <logentry
-     revision="2">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="A">/d2</path>
-  <path
-     copyfrom-path="/d1/a"
-     copyfrom-rev="1"
-     action="A">/d2/a</path>
-  </paths>
-  <msg>copy file to new directory</msg>
-  </logentry>
-  </log>
+  revision: 2
+  author: test
+  msg: copy file to new directory
+   A /d2
+   A /d2/a (from /d1/a@1)
 
 Branchy history
 
@@ -441,62 +345,31 @@
   0 merge
 
   $ svnupanddisplay b-hg-wc 0
-  At revision 4.
-   4 4 test .
+   4 2 test left-1
    4 3 test b
-   4 2 test left-1
    4 3 test left-2
+   4 4 test .
    4 4 test right-1
    4 4 test right-2
-  <?xml version="1.0"?>
-  <log>
-  <logentry
-     revision="4">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="A">/right-1</path>
-  <path
-     action="A">/right-2</path>
-  </paths>
-  <msg>merge</msg>
-  </logentry>
-  <logentry
-     revision="3">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="M">/b</path>
-  <path
-     action="A">/left-2</path>
-  </paths>
-  <msg>left-2</msg>
-  </logentry>
-  <logentry
-     revision="2">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="M">/b</path>
-  <path
-     action="A">/left-1</path>
-  </paths>
-  <msg>left-1</msg>
-  </logentry>
-  <logentry
-     revision="1">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="A">/b</path>
-  </paths>
-  <msg>base</msg>
-  </logentry>
-  </log>
+  revision: 4
+  author: test
+  msg: merge
+   A /right-1
+   A /right-2
+  revision: 3
+  author: test
+  msg: left-2
+   M /b
+   A /left-2
+  revision: 2
+  author: test
+  msg: left-1
+   M /b
+   A /left-1
+  revision: 1
+  author: test
+  msg: base
+   A /b
 
 Tags are not supported, but must not break conversion
 
@@ -518,31 +391,15 @@
   0 Tagged as v1.0
   writing Subversion tags is not yet implemented
   $ svnupanddisplay a-hg-wc 2
-  At revision 2.
+   2 1 test a
    2 2 test .
-   2 1 test a
    2 2 test .hgtags
-  <?xml version="1.0"?>
-  <log>
-  <logentry
-     revision="2">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="A">/.hgtags</path>
-  </paths>
-  <msg>Tagged as v1.0</msg>
-  </logentry>
-  <logentry
-     revision="1">
-  <author>test</author>
-  <date/>
-  <paths>
-  <path
-     action="A">/a</path>
-  </paths>
-  <msg>Add file a</msg>
-  </logentry>
-  </log>
+  revision: 2
+  author: test
+  msg: Tagged as v1.0
+   A /.hgtags
+  revision: 1
+  author: test
+  msg: Add file a
+   A /a
   $ rm -rf a a-hg a-hg-wc
--- a/tests/test-convert-svn-source.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-convert-svn-source.t	Wed May 02 12:55:44 2012 +0200
@@ -34,10 +34,10 @@
   $ cd ..
 
   $ svnurl="file://$svnpath/svn-repo/proj%20B"
-  $ svn import -m "init projB" projB "$svnurl" | fixpath
+  $ svn import -m "init projB" projB "$svnurl" | fixpath | sort
+  
   Adding         projB/mytrunk
   Adding         projB/tags
-  
   Committed revision 1.
 
 Update svn repository
@@ -187,3 +187,24 @@
   extra:       branch=default
   extra:       convert_revision=svn:........-....-....-....-............/proj B/mytrunk@1 (re)
   $ cd ..
+
+Test converting empty heads (issue3347)
+
+  $ svnadmin create svn-empty
+  $ svnadmin load -q svn-empty < "$TESTDIR/svn/empty.svndump"
+  $ hg --config convert.svn.trunk= convert svn-empty
+  assuming destination svn-empty-hg
+  initializing destination svn-empty-hg repository
+  scanning source...
+  sorting...
+  converting...
+  1 init projA
+  0 adddir
+  $ hg --config convert.svn.trunk= convert file://$svnpath/svn-empty/trunk
+  assuming destination trunk-hg
+  initializing destination trunk-hg repository
+  scanning source...
+  sorting...
+  converting...
+  1 init projA
+  0 adddir
--- a/tests/test-copy2.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-copy2.t	Wed May 02 12:55:44 2012 +0200
@@ -100,7 +100,7 @@
     bar
 
 foo was clean:
-  $  hg st -AC foo
+  $ hg st -AC foo
   C foo
 but it's considered modified after a copy --after --force
   $ hg copy -Af bar foo
--- a/tests/test-diff-change.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-diff-change.t	Wed May 02 12:55:44 2012 +0200
@@ -33,8 +33,8 @@
 Testing diff --change when merge:
 
   $ for i in 1 2 3 4 5 6 7 8 9 10; do
-  $    echo $i >> file.txt
-  $ done
+  >    echo $i >> file.txt
+  > done
   $ hg commit -m "lots of text" # 3
 
   $ sed -e 's,^2$,x,' file.txt > file.txt.tmp
--- a/tests/test-filelog	Wed Apr 18 01:20:16 2012 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-#!/usr/bin/env python
-"""
-Tests the behaviour of filelog w.r.t. data starting with '\1\n'
-"""
-from mercurial import ui, hg
-from mercurial.node import nullid, hex
-
-myui = ui.ui()
-repo = hg.repository(myui, path='.', create=True)
-
-fl = repo.file('foobar')
-
-def addrev(text, renamed=False):
-    if renamed:
-        # data doesnt matter. Just make sure filelog.renamed() returns True
-        meta = dict(copyrev=hex(nullid), copy='bar')
-    else:
-        meta = {}
-
-    lock = t = None
-    try:
-        lock = repo.lock()
-        t = repo.transaction('commit')
-        node = fl.add(text, meta, t, 0, nullid, nullid)
-        return node
-    finally:
-        if t:
-            t.close()
-        if lock:
-            lock.release()
-
-def error(text):
-    print 'ERROR: ' + text
-
-textwith = '\1\nfoo'
-without = 'foo'
-
-node = addrev(textwith)
-if not textwith == fl.read(node):
-    error('filelog.read for data starting with \\1\\n')
-if fl.cmp(node, textwith) or not fl.cmp(node, without):
-    error('filelog.cmp for data starting with \\1\\n')
-if fl.size(0) != len(textwith):
-    error('FIXME: This is a known failure of filelog.size for data starting '
-        'with \\1\\n')
-
-node = addrev(textwith, renamed=True)
-if not textwith == fl.read(node):
-    error('filelog.read for a renaming + data starting with \\1\\n')
-if fl.cmp(node, textwith) or not fl.cmp(node, without):
-    error('filelog.cmp for a renaming + data starting with \\1\\n')
-if fl.size(1) != len(textwith):
-    error('filelog.size for a renaming + data starting with \\1\\n')
-
-print 'OK.'
--- a/tests/test-filelog.out	Wed Apr 18 01:20:16 2012 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-ERROR: FIXME: This is a known failure of filelog.size for data starting with \1\n
-OK.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-filelog.py	Wed May 02 12:55:44 2012 +0200
@@ -0,0 +1,55 @@
+#!/usr/bin/env python
+"""
+Tests the behaviour of filelog w.r.t. data starting with '\1\n'
+"""
+from mercurial import ui, hg
+from mercurial.node import nullid, hex
+
+myui = ui.ui()
+repo = hg.repository(myui, path='.', create=True)
+
+fl = repo.file('foobar')
+
+def addrev(text, renamed=False):
+    if renamed:
+        # data doesnt matter. Just make sure filelog.renamed() returns True
+        meta = dict(copyrev=hex(nullid), copy='bar')
+    else:
+        meta = {}
+
+    lock = t = None
+    try:
+        lock = repo.lock()
+        t = repo.transaction('commit')
+        node = fl.add(text, meta, t, 0, nullid, nullid)
+        return node
+    finally:
+        if t:
+            t.close()
+        if lock:
+            lock.release()
+
+def error(text):
+    print 'ERROR: ' + text
+
+textwith = '\1\nfoo'
+without = 'foo'
+
+node = addrev(textwith)
+if not textwith == fl.read(node):
+    error('filelog.read for data starting with \\1\\n')
+if fl.cmp(node, textwith) or not fl.cmp(node, without):
+    error('filelog.cmp for data starting with \\1\\n')
+if fl.size(0) != len(textwith):
+    error('FIXME: This is a known failure of filelog.size for data starting '
+        'with \\1\\n')
+
+node = addrev(textwith, renamed=True)
+if not textwith == fl.read(node):
+    error('filelog.read for a renaming + data starting with \\1\\n')
+if fl.cmp(node, textwith) or not fl.cmp(node, without):
+    error('filelog.cmp for a renaming + data starting with \\1\\n')
+if fl.size(1) != len(textwith):
+    error('filelog.size for a renaming + data starting with \\1\\n')
+
+print 'OK.'
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-filelog.py.out	Wed May 02 12:55:44 2012 +0200
@@ -0,0 +1,2 @@
+ERROR: FIXME: This is a known failure of filelog.size for data starting with \1\n
+OK.
--- a/tests/test-globalopts.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-globalopts.t	Wed May 02 12:55:44 2012 +0200
@@ -339,10 +339,10 @@
    dates         Date Formats
    diffs         Diff Formats
    environment   Environment Variables
-   extensions    Using additional features
+   extensions    Using Additional Features
    filesets      Specifying File Sets
    glossary      Glossary
-   hgignore      syntax for Mercurial ignore files
+   hgignore      Syntax for Mercurial Ignore Files
    hgweb         Configuring hgweb
    merge-tools   Merge Tools
    multirevs     Specifying Multiple Revisions
@@ -423,10 +423,10 @@
    dates         Date Formats
    diffs         Diff Formats
    environment   Environment Variables
-   extensions    Using additional features
+   extensions    Using Additional Features
    filesets      Specifying File Sets
    glossary      Glossary
-   hgignore      syntax for Mercurial ignore files
+   hgignore      Syntax for Mercurial Ignore Files
    hgweb         Configuring hgweb
    merge-tools   Merge Tools
    multirevs     Specifying Multiple Revisions
--- a/tests/test-glog.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-glog.t	Wed May 02 12:55:44 2012 +0200
@@ -1428,7 +1428,7 @@
   >     | sed 's/.*nodetag/nodetag/' > log.nodes
   >   hg log -G --template 'nodetag {rev}\n' "$@" | grep nodetag \
   >     | sed 's/.*nodetag/nodetag/' > glog.nodes
-  >   diff -u log.nodes glog.nodes
+  >   diff -u log.nodes glog.nodes | grep '^[-+@ ]' || :
   > }
 
 glog always reorders nodes which explains the difference with log
@@ -1448,7 +1448,6 @@
   +nodetag 27
   +nodetag 25
   +nodetag 21
-  [1]
   $ testlog -u test -u not-a-user
   []
   (group
@@ -1975,7 +1974,6 @@
    nodetag 8
    nodetag 7
   +nodetag 6
-  [1]
 
 Test --follow-first and forward --rev
 
@@ -1992,7 +1990,6 @@
    nodetag 8
    nodetag 7
   +nodetag 6
-  [1]
 
 Test --follow and backward --rev
 
--- a/tests/test-graft.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-graft.t	Wed May 02 12:55:44 2012 +0200
@@ -132,14 +132,11 @@
    b: local copied/moved to a -> m
   preserving b for resolve of b
   updating: b 1/1 files (100.00%)
-  b
-   b: searching for copy revision for a
-   b: copy a:b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3
   grafting revision 5
     searching for copies back to rev 1
   resolving manifests
    overwrite: False, partial: False
-   ancestor: 4c60f11aa304, local: 6f5ea6ac8b70+, remote: 97f8bfe72746
+   ancestor: 4c60f11aa304, local: d2e44c99fd3f+, remote: 97f8bfe72746
    e: remote is newer -> g
   updating: e 1/1 files (100.00%)
   getting e
@@ -148,7 +145,7 @@
     searching for copies back to rev 1
   resolving manifests
    overwrite: False, partial: False
-   ancestor: 4c60f11aa304, local: 77eb504366ab+, remote: 9c233e8e184d
+   ancestor: 4c60f11aa304, local: 839a7e8fcf80+, remote: 9c233e8e184d
    e: versions differ -> m
    d: remote is newer -> g
   preserving e for resolve of e
@@ -157,7 +154,7 @@
   updating: e 2/2 files (100.00%)
   picked tool 'internal:merge' for e (binary False symlink False)
   merging e
-  my e@77eb504366ab+ other e@9c233e8e184d ancestor e@68795b066622
+  my e@839a7e8fcf80+ other e@9c233e8e184d ancestor e@68795b066622
   warning: conflicts during merge.
   merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
   abort: unresolved conflicts, can't continue
@@ -203,13 +200,11 @@
 View graph:
 
   $ hg --config extensions.graphlog= log -G --template '{author}@{rev}.{phase}: {desc}\n'
-  @  test@11.draft: 3
-  |
-  o  test@10.draft: 4
+  @  test@10.draft: 3
   |
-  o  test@9.draft: 5
+  o  test@9.draft: 4
   |
-  o  bar@8.draft: 1
+  o  test@8.draft: 5
   |
   o  foo@7.draft: 2
   |
@@ -242,12 +237,12 @@
   2:5c095ad7e90f871700f02dd1fa5012cb4498a2d4
 
   $ hg log --debug -r tip
-  changeset:   13:39bb1d13572759bd1e6fc874fed1b12ece047a18
+  changeset:   12:95adbe5de6b10f376b699ece9ed5a57cd7b4b0f6
   tag:         tip
   phase:       draft
-  parent:      12:b592ea63bb0c19a6c5c44685ee29a2284f9f1b8f
+  parent:      11:b592ea63bb0c19a6c5c44685ee29a2284f9f1b8f
   parent:      -1:0000000000000000000000000000000000000000
-  manifest:    13:0780e055d8f4cd12eadd5a2719481648f336f7a9
+  manifest:    12:9944044f82a462bbaccc9bdf7e0ac5b811db7d1b
   user:        foo
   date:        Thu Jan 01 00:00:00 1970 +0000
   files+:      b
@@ -265,7 +260,7 @@
   [255]
 
 Disallow grafting already grafted csets with the same origin onto each other
-  $ hg up -q 13
+  $ hg up -q 12
   $ hg graft 2
   skipping already grafted revision 2
   [255]
@@ -278,5 +273,5 @@
   skipping already grafted revision 2
   [255]
   $ hg graft tip
-  skipping already grafted revision 13 (same origin 2)
+  skipping already grafted revision 12 (same origin 2)
   [255]
--- a/tests/test-help.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-help.t	Wed May 02 12:55:44 2012 +0200
@@ -111,10 +111,10 @@
    dates         Date Formats
    diffs         Diff Formats
    environment   Environment Variables
-   extensions    Using additional features
+   extensions    Using Additional Features
    filesets      Specifying File Sets
    glossary      Glossary
-   hgignore      syntax for Mercurial ignore files
+   hgignore      Syntax for Mercurial Ignore Files
    hgweb         Configuring hgweb
    merge-tools   Merge Tools
    multirevs     Specifying Multiple Revisions
@@ -189,10 +189,10 @@
    dates         Date Formats
    diffs         Diff Formats
    environment   Environment Variables
-   extensions    Using additional features
+   extensions    Using Additional Features
    filesets      Specifying File Sets
    glossary      Glossary
-   hgignore      syntax for Mercurial ignore files
+   hgignore      Syntax for Mercurial Ignore Files
    hgweb         Configuring hgweb
    merge-tools   Merge Tools
    multirevs     Specifying Multiple Revisions
@@ -685,10 +685,10 @@
    dates         Date Formats
    diffs         Diff Formats
    environment   Environment Variables
-   extensions    Using additional features
+   extensions    Using Additional Features
    filesets      Specifying File Sets
    glossary      Glossary
-   hgignore      syntax for Mercurial ignore files
+   hgignore      Syntax for Mercurial Ignore Files
    hgweb         Configuring hgweb
    merge-tools   Merge Tools
    multirevs     Specifying Multiple Revisions
--- a/tests/test-hgignore.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-hgignore.t	Wed May 02 12:55:44 2012 +0200
@@ -48,7 +48,7 @@
   [255]
 
   $ echo ".*\.o" > .hgignore
-  $  hg status
+  $ hg status
   A dir/b.o
   ? .hgignore
   ? a.c
--- a/tests/test-hgweb-raw.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-hgweb-raw.t	Wed May 02 12:55:44 2012 +0200
@@ -20,7 +20,7 @@
   $ cat hg.pid >> $DAEMON_PIDS
   $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/?f=a23bf1310f6e;file=sub/some%20%22text%22.txt;style=raw' content-type content-length content-disposition) >getoutput.txt
 
-  $ while kill `cat hg.pid` 2>/dev/null; do true; done
+  $ while kill `cat hg.pid` 2>/dev/null; do sleep 0; done
 
   $ cat getoutput.txt
   200 Script output follows
@@ -41,7 +41,7 @@
 
   $ cat hg.pid >> $DAEMON_PIDS
   $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/?f=a23bf1310f6e;file=sub/some%20%22text%22.txt;style=raw' content-type content-length content-disposition) >getoutput.txt
-  $ while kill `cat hg.pid` 2>/dev/null; do true; done
+  $ while kill `cat hg.pid` 2>/dev/null; do sleep 0; done
 
   $ cat getoutput.txt
   200 Script output follows
--- a/tests/test-http-proxy.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-http-proxy.t	Wed May 02 12:55:44 2012 +0200
@@ -9,7 +9,7 @@
   $ cat hg.pid >> $DAEMON_PIDS
   $ cd ..
   $ "$TESTDIR/tinyproxy.py" $HGPORT1 localhost >proxy.log 2>&1 </dev/null &
-  $ while [ ! -f proxy.pid ]; do true; done
+  $ while [ ! -f proxy.pid ]; do sleep 0; done
   $ cat proxy.pid >> $DAEMON_PIDS
 
 url for proxy, stream
--- a/tests/test-https.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-https.t	Wed May 02 12:55:44 2012 +0200
@@ -233,12 +233,12 @@
   $ hg -R copy-pull id https://127.0.0.1:$HGPORT/
   5fed3813f7f5
 
-  $ while kill `cat hg1.pid` 2>/dev/null; do true; done
+  $ while kill `cat hg1.pid` 2>/dev/null; do sleep 0; done
 
 Prepare for connecting through proxy
 
   $ "$TESTDIR/tinyproxy.py" $HGPORT1 localhost >proxy.log </dev/null 2>&1 &
-  $ while [ ! -f proxy.pid ]; do true; done
+  $ while [ ! -f proxy.pid ]; do sleep 0; done
   $ cat proxy.pid >> $DAEMON_PIDS
 
   $ echo "[http_proxy]" >> copy-pull/.hg/hgrc
--- a/tests/test-impexp-branch.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-impexp-branch.t	Wed May 02 12:55:44 2012 +0200
@@ -1,3 +1,6 @@
+  $ echo '[extensions]' >> $HGRCPATH
+  $ echo 'mq =' >> $HGRCPATH
+
   $ cat >findbranch.py <<EOF
   > import re, sys
   > 
@@ -55,3 +58,14 @@
   applying ../r0.patch
   $ hg import --exact ../r1.patch
   applying ../r1.patch
+
+Test --exact and patch header separators (issue3356)
+
+  $ hg strip --no-backup .
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  >>> import re
+  >>> p = file('../r1.patch', 'rb').read()
+  >>> p = re.sub(r'Parent\s+', 'Parent ', p)
+  >>> file('../r1-ws.patch', 'wb').write(p)
+  $ hg import --exact ../r1-ws.patch
+  applying ../r1-ws.patch
--- a/tests/test-import-git.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-import-git.t	Wed May 02 12:55:44 2012 +0200
@@ -362,6 +362,77 @@
   A binary2
     text2
   R text2
+
+Invalid base85 content
+
+  $ hg rollback
+  repository tip rolled back to revision 15 (undo import)
+  working directory now based on revision 15
+  $ hg revert -aq
+  $ hg import -d "1000000 0" -m invalid-binary - <<"EOF"
+  > diff --git a/text2 b/binary2
+  > rename from text2
+  > rename to binary2
+  > index 78981922613b2afb6025042ff6bd878ac1994e85..10efcb362e9f3b3420fcfbfc0e37f3dc16e29757
+  > GIT binary patch
+  > literal 5
+  > Mc$`b*O.$Pw00T?_*Z=?k
+  > 
+  > EOF
+  applying patch from stdin
+  abort: could not decode "binary2" binary patch: bad base85 character at position 6
+  [255]
+
+  $ hg revert -aq
+  $ hg import -d "1000000 0" -m rename-as-binary - <<"EOF"
+  > diff --git a/text2 b/binary2
+  > rename from text2
+  > rename to binary2
+  > index 78981922613b2afb6025042ff6bd878ac1994e85..10efcb362e9f3b3420fcfbfc0e37f3dc16e29757
+  > GIT binary patch
+  > literal 6
+  > Mc$`b*O5$Pw00T?_*Z=?k
+  > 
+  > EOF
+  applying patch from stdin
+  abort: "binary2" length is 5 bytes, should be 6
+  [255]
+
+  $ hg revert -aq
+  $ hg import -d "1000000 0" -m rename-as-binary - <<"EOF"
+  > diff --git a/text2 b/binary2
+  > rename from text2
+  > rename to binary2
+  > index 78981922613b2afb6025042ff6bd878ac1994e85..10efcb362e9f3b3420fcfbfc0e37f3dc16e29757
+  > GIT binary patch
+  > Mc$`b*O5$Pw00T?_*Z=?k
+  > 
+  > EOF
+  applying patch from stdin
+  abort: could not extract "binary2" binary data
+  [255]
+
+Simulate a copy/paste turning LF into CRLF (issue2870)
+
+  $ hg revert -aq
+  $ cat > binary.diff <<"EOF"
+  > diff --git a/text2 b/binary2
+  > rename from text2
+  > rename to binary2
+  > index 78981922613b2afb6025042ff6bd878ac1994e85..10efcb362e9f3b3420fcfbfc0e37f3dc16e29757
+  > GIT binary patch
+  > literal 5
+  > Mc$`b*O5$Pw00T?_*Z=?k
+  > 
+  > EOF
+  >>> fp = file('binary.diff', 'rb')
+  >>> data = fp.read()
+  >>> fp.close()
+  >>> file('binary.diff', 'wb').write(data.replace('\n', '\r\n'))
+  $ rm binary2
+  $ hg import --no-commit binary.diff
+  applying binary.diff
+
   $ cd ..
 
 Consecutive import with renames (issue2459)
@@ -483,4 +554,28 @@
   ? b.rej
   ? linkb.rej
 
+Test corner case involving copies and multiple hunks (issue3384)
+
+  $ hg revert -qa
+  $ hg import --no-commit - <<EOF
+  > diff --git a/a b/c
+  > copy from a
+  > copy to c
+  > --- a/a
+  > +++ b/c
+  > @@ -1,1 +1,2 @@
+  >  a
+  > +a
+  > @@ -2,1 +2,2 @@
+  >  a
+  > +a
+  > diff --git a/a b/a
+  > --- a/a
+  > +++ b/a
+  > @@ -1,1 +1,2 @@
+  >  a
+  > +b
+  > EOF
+  applying patch from stdin
+
   $ cd ..
--- a/tests/test-init.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-init.t	Wed May 02 12:55:44 2012 +0200
@@ -61,7 +61,7 @@
 
 init+push to remote2
 
-  $ hg init -e 'python "$TESTDIR/dummyssh"' ssh://user@dummy/remote2
+  $ hg init -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote2
   $ hg incoming -R remote2 local
   comparing with local
   changeset:   0:08b9e9f63b32
@@ -71,7 +71,7 @@
   summary:     init
   
 
-  $ hg push -R local -e 'python "$TESTDIR/dummyssh"' ssh://user@dummy/remote2
+  $ hg push -R local -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote2
   pushing to ssh://user@dummy/remote2
   searching for changes
   remote: adding changesets
@@ -81,7 +81,7 @@
 
 clone to remote1
 
-  $ hg clone -e 'python "$TESTDIR/dummyssh"' local ssh://user@dummy/remote1
+  $ hg clone -e "python \"$TESTDIR/dummyssh\"" local ssh://user@dummy/remote1
   searching for changes
   remote: adding changesets
   remote: adding manifests
@@ -90,14 +90,14 @@
 
 init to existing repo
 
-  $ hg init -e 'python "$TESTDIR/dummyssh"' ssh://user@dummy/remote1
+  $ hg init -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote1
   abort: repository remote1 already exists!
   abort: could not create remote repo!
   [255]
 
 clone to existing repo
 
-  $ hg clone -e 'python "$TESTDIR/dummyssh"' local ssh://user@dummy/remote1
+  $ hg clone -e "python \"$TESTDIR/dummyssh\"" local ssh://user@dummy/remote1
   abort: repository remote1 already exists!
   abort: could not create remote repo!
   [255]
@@ -186,7 +186,7 @@
   $ hg -R local bookmark test
   $ hg -R local bookmarks
    * test                      0:08b9e9f63b32
-  $ hg clone -e 'python "$TESTDIR/dummyssh"' local ssh://user@dummy/remote-bookmarks
+  $ hg clone -e "python \"$TESTDIR/dummyssh\"" local ssh://user@dummy/remote-bookmarks
   searching for changes
   remote: adding changesets
   remote: adding manifests
--- a/tests/test-largefiles.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-largefiles.t	Wed May 02 12:55:44 2012 +0200
@@ -815,7 +815,7 @@
 
 Test --normal flag
 
-  $ dd if=/dev/urandom bs=2k count=11k > new-largefile 2> /dev/null
+  $ dd if=/dev/zero bs=2k count=11k > new-largefile 2> /dev/null
   $ hg add --normal --large new-largefile
   abort: --normal cannot be used with --large
   [255]
@@ -881,7 +881,7 @@
   $ "$TESTDIR/killdaemons.py"
 
 vanilla clients locked out from largefiles ssh repos
-  $ hg --config extensions.largefiles=! clone -e 'python "$TESTDIR/dummyssh"' ssh://user@dummy/r4 r5
+  $ hg --config extensions.largefiles=! clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/r4 r5
   abort: remote error:
   
   This repository uses the largefiles extension.
@@ -945,7 +945,7 @@
   $ cd alice
   $ hg init pubrepo
   $ cd pubrepo
-  $ dd if=/dev/urandom bs=1k count=11k > a-large-file 2> /dev/null
+  $ dd if=/dev/zero bs=1k count=11k > a-large-file 2> /dev/null
   $ hg add --large a-large-file
   $ hg commit -m "Add a large file"
   Invoking status precommit hook
@@ -1050,5 +1050,50 @@
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     add files
   
-
+verify that large files in subrepos handled properly
+  $ hg init subrepo
+  $ echo "subrepo = subrepo" > .hgsub
+  $ hg add .hgsub
+  $ hg ci -m "add subrepo"
+  Invoking status precommit hook
+  A .hgsub
+  ? .hgsubstate
+  $ echo "rev 1" > subrepo/large.txt
+  $ hg -R subrepo add --large subrepo/large.txt
+  $ hg sum
+  parent: 1:8ee150ea2e9c tip
+   add subrepo
+  branch: default
+  commit: 1 subrepos
+  update: (current)
+  $ hg st
+  $ hg st -S
+  A subrepo/large.txt
+  $ hg ci -S -m "commit top repo"
+  committing subrepository subrepo
+  Invoking status precommit hook
+  A large.txt
+  Invoking status precommit hook
+  M .hgsubstate
+# No differences
+  $ hg st -S
+  $ hg sum
+  parent: 2:ce4cd0c527a6 tip
+   commit top repo
+  branch: default
+  commit: (clean)
+  update: (current)
+  $ echo "rev 2" > subrepo/large.txt
+  $ hg st -S
+  M subrepo/large.txt
+  $ hg sum
+  parent: 2:ce4cd0c527a6 tip
+   commit top repo
+  branch: default
+  commit: 1 subrepos
+  update: (current)
+  $ hg ci -m "this commit should fail without -S"
+  abort: uncommitted changes in subrepo subrepo
+  (use --subrepos for recursive commit)
+  [255]
   $ cd ..
--- a/tests/test-merge4.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-merge4.t	Wed May 02 12:55:44 2012 +0200
@@ -16,5 +16,10 @@
   (branch merge, don't forget to commit)
   $ rm b
   $ echo This is file c22 > c
+
+Test hg behaves when committing with a missing file added by a merge
+
   $ hg commit -m "commit #3"
+  abort: cannot commit merge with missing files
+  [255]
 
--- a/tests/test-mq-qnew.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-mq-qnew.t	Wed May 02 12:55:44 2012 +0200
@@ -111,7 +111,7 @@
   abort: "#" cannot be used in the name of a patch
   abort: ":" cannot be used in the name of a patch
   % qnew with name containing slash
-  abort: path ends in directory separator: foo/
+  abort: path ends in directory separator: foo/ (glob)
   abort: "foo" already exists as a directory
   foo/bar.patch
   popping foo/bar.patch
@@ -178,7 +178,7 @@
   abort: "#" cannot be used in the name of a patch
   abort: ":" cannot be used in the name of a patch
   % qnew with name containing slash
-  abort: path ends in directory separator: foo/
+  abort: path ends in directory separator: foo/ (glob)
   abort: "foo" already exists as a directory
   foo/bar.patch
   popping foo/bar.patch
--- a/tests/test-notify.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-notify.t	Wed May 02 12:55:44 2012 +0200
@@ -23,7 +23,7 @@
   are being pushed, from the sending or receiving side.
   
   First, enable the extension as explained in "hg help extensions", and register
-  the hook you want to run. "incoming" and "outgoing" hooks are run by the
+  the hook you want to run. "incoming" and "changegroup" hooks are run by the
   changesets receiver while the "outgoing" one is for the sender:
   
     [hooks]
--- a/tests/test-phases-exchange.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-phases-exchange.t	Wed May 02 12:55:44 2012 +0200
@@ -1,3 +1,5 @@
+  $ "$TESTDIR/hghave" serve || exit 80
+
   $ cat >> $HGRCPATH <<EOF
   > [extensions]
   > graphlog=
@@ -833,12 +835,20 @@
   o  0 public a-A - 054250a37db4
   
 
-pushing a locally public and draft changesets remotly secret should make them appear on the remote side
+pushing a locally public and draft changesets remotly secret should make them
+appear on the remote side.
+
 
   $ hg -R ../mu phase --secret --force 967b449fbc94
   $ hg push -r 435b5d83910c ../mu
   pushing to ../mu
   searching for changes
+  abort: push creates new remote head 435b5d83910c!
+  (did you forget to merge? use push -f to force)
+  [255]
+  $ hg push -fr 435b5d83910c ../mu # because the push will create new visible head
+  pushing to ../mu
+  searching for changes
   adding changesets
   adding manifests
   adding file changes
--- a/tests/test-phases.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-phases.t	Wed May 02 12:55:44 2012 +0200
@@ -135,6 +135,39 @@
   2 1 C
   1 0 B
   0 0 A
+
+(Issue3303)
+Check that remote secret changeset are ignore when checking creation of remote heads
+
+We add a secret head into the push destination.  This secreat head shadow a
+visible shared between the initial repo and the push destination.
+
+  $ hg up -q 4 # B'
+  $ mkcommit Z --config phases.new-commit=secret
+  $ hg phase .
+  5: secret
+
+# We now try to push a new public changeset that descend from the common public
+# head shadowed by the remote secret head.
+
+  $ cd ../initialrepo
+  $ hg up -q 6 #B'
+  $ mkcommit I
+  created new head
+  $ hg push ../push-dest
+  pushing to ../push-dest
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+
+:note: The "(+1 heads)" is wrong as we do not had any visible head
+
+
+Restore condition prior extra insertion.
+  $ hg -q --config extensions.mq= strip .
+  $ hg up -q 7
   $ cd ..
 
 Test secret changeset are not pull
--- a/tests/test-pull-pull-corruption.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-pull-pull-corruption.t	Wed May 02 12:55:44 2012 +0200
@@ -37,26 +37,27 @@
 
 start a pull...
 
-  $ hg pull ../source1 &
+  $ hg pull ../source1 > pull.out 2>&1 &
 
 ... and start another pull before the first one has finished
 
   $ sleep 1
-  pulling from ../source1
-  requesting all changes
   $ hg pull ../source2 2>/dev/null
   pulling from ../source2
-  adding changesets
-  adding manifests
-  adding file changes
-  added 10 changesets with 10 changes to 1 files
-  (run 'hg update' to get a working copy)
   searching for changes
   adding changesets
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
   (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ cat pull.out
+  pulling from ../source1
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 10 changesets with 10 changes to 1 files
+  (run 'hg update' to get a working copy)
 
 see the result
 
--- a/tests/test-pull-pull-corruption2.t	Wed Apr 18 01:20:16 2012 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-Corrupt an hg repo with two pulls.
-create one repo with a long history
-
-  $ hg init source1
-  $ cd source1
-  $ touch foo
-  $ hg add foo
-  $ for i in 1 2 3 4 5 6 7 8 9 10; do
-  >     echo $i >> foo
-  >     hg ci -m $i
-  > done
-  $ cd ..
-
-create a third repo to pull both other repos into it
-
-  $ hg init version2
-  $ hg -R version2 pull source1 &
-  $ sleep 1
-  pulling from source1
-  requesting all changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 10 changesets with 10 changes to 1 files
-  (run 'hg update' to get a working copy)
-  $ hg clone --pull -U version2 corrupted
-  requesting all changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 10 changesets with 10 changes to 1 files
-  $ wait
-  $ hg -R corrupted verify
-  checking changesets
-  checking manifests
-  crosschecking files in changesets and manifests
-  checking files
-  1 files, 10 changesets, 10 total revisions
-  $ hg -R version2 verify
-  checking changesets
-  checking manifests
-  crosschecking files in changesets and manifests
-  checking files
-  1 files, 10 changesets, 10 total revisions
--- a/tests/test-rebase-collapse.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-rebase-collapse.t	Wed May 02 12:55:44 2012 +0200
@@ -541,3 +541,52 @@
   @@ -0,0 +1,2 @@
   +d
   +blah
+
+  $ cd ..
+
+Rebase, collapse and copies
+
+  $ hg init copies
+  $ cd copies
+  $ hg unbundle "$TESTDIR/bundles/renames.hg"
+  adding changesets
+  adding manifests
+  adding file changes
+  added 4 changesets with 11 changes to 7 files (+1 heads)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg up -q tip
+  $ hg tglog
+  @  3: 'move2'
+  |
+  o  2: 'move1'
+  |
+  | o  1: 'change'
+  |/
+  o  0: 'add'
+  
+  $ hg rebase --collapse -d 1
+  merging a and d to d
+  merging b and e to e
+  merging c and f to f
+  merging e and g to g
+  merging f and c to c
+  saved backup bundle to $TESTTMP/copies/.hg/strip-backup/*-backup.hg (glob)
+  $ hg st
+  $ hg st --copies --change .
+  A d
+    a
+  A g
+    b
+  R b
+  $ cat c
+  c
+  c
+  $ cat d
+  a
+  a
+  $ cat g
+  b
+  b
+  $ hg log -r . --template "{file_copies}\n"
+  d (a)g (b)
+  $ cd ..
--- a/tests/test-rebase-detach.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-rebase-detach.t	Wed May 02 12:55:44 2012 +0200
@@ -380,9 +380,7 @@
   $ hg rebase -c
   saved backup bundle to $TESTTMP/a7/.hg/strip-backup/6215fafa5447-backup.hg (glob)
   $ hg  log -G --template "{rev}:{phase} '{desc}' {branches}\n"
-  @  8:secret 'H2'
-  |
-  o  7:draft 'H'
+  @  7:draft 'H'
   |
   | o  6:draft 'G'
   |/|
@@ -398,4 +396,3 @@
   |/
   o  0:draft 'A'
   
-
--- a/tests/test-rebase-mq-skip.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-rebase-mq-skip.t	Wed May 02 12:55:44 2012 +0200
@@ -117,9 +117,7 @@
   saved backup bundle to $TESTTMP/b/.hg/strip-backup/*-backup.hg (glob)
 
   $ hg tglog
-  @  9: 'r5' tags: 5.diff qtip tip
-  |
-  o  8: 'r4' tags: 4.diff
+  @  8: 'r5' tags: 5.diff qtip tip
   |
   o  7: 'r2' tags: 2.diff qbase
   |
--- a/tests/test-rebase-mq.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-rebase-mq.t	Wed May 02 12:55:44 2012 +0200
@@ -247,30 +247,41 @@
 Create mq repo with guarded patches foo and bar and empty patch:
 
   $ hg qinit
-  $ hg qnew foo
-  $ hg qguard foo +baz
+  $ echo guarded > guarded
+  $ hg add guarded
+  $ hg qnew guarded
+  $ hg qnew empty-important -m 'important commit message'
+  $ echo bar > bar
+  $ hg add bar
+  $ hg qnew bar
   $ echo foo > foo
   $ hg add foo
-  $ hg qref
-  $ hg qpop
+  $ hg qnew foo
+  $ hg qpop -a
   popping foo
+  popping bar
+  popping empty-important
+  popping guarded
   patch queue now empty
-
-  $ hg qnew empty-important -m 'important commit message'
-
-  $ hg qnew bar
+  $ hg qguard guarded +guarded
   $ hg qguard bar +baz
-  $ echo bar > bar
-  $ hg add bar
-  $ hg qref
+  $ hg qguard foo +baz
+  $ hg qselect baz
+  number of unguarded, unapplied patches has changed from 1 to 3
+  $ hg qpush bar
+  applying empty-important
+  patch empty-important is empty
+  applying bar
+  now at: bar
 
   $ hg qguard -l
+  guarded: +guarded
   empty-important: unguarded
   bar: +baz
   foo: +baz
 
   $ hg tglog
-  @  2: '[mq]: bar' tags: bar qtip tip
+  @  2: 'imported patch bar' tags: bar qtip tip
   |
   o  1: 'important commit message' tags: empty-important qbase
   |
@@ -303,18 +314,21 @@
 removed from the series):
 
   $ hg qseries
+  guarded
   empty-important
   bar
   foo
   $ [ -f .hg/patches/empty-important ]
   $ hg -q rebase -d 2
   $ hg qseries
+  guarded
   bar
   foo
   $ [ -f .hg/patches/empty-important ]
   [1]
 
   $ hg qguard -l
+  guarded: +guarded
   bar: +baz
   foo: +baz
 
--- a/tests/test-rebase-parameters.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-rebase-parameters.t	Wed May 02 12:55:44 2012 +0200
@@ -73,6 +73,13 @@
   abort: cannot specify both a source and a base
   [255]
 
+  $ hg rebase --rev 5 --source 4
+  abort: cannot specify both a revision and a source
+  [255]
+  $ hg rebase --base 5 --rev 4
+  abort: cannot specify both a revision and a base
+  [255]
+
   $ hg rebase
   nothing to rebase
   [1]
@@ -186,7 +193,7 @@
   $ hg clone -q -u . a a4
   $ cd a4
 
-  $ hg rebase --source 2
+  $ hg rebase --source 'desc("C")'
   saved backup bundle to $TESTTMP/a4/.hg/strip-backup/*-backup.hg (glob)
 
   $ hg tglog
@@ -246,7 +253,7 @@
   $ hg clone -q -u . a a6
   $ cd a6
 
-  $ hg rebase --base 3
+  $ hg rebase --base 'desc("D")'
   saved backup bundle to $TESTTMP/a6/.hg/strip-backup/*-backup.hg (glob)
 
   $ hg tglog
@@ -330,6 +337,36 @@
   
   $ cd ..
 
+
+Specify only revs (from 2 onto 8)
+
+  $ hg clone -q -u . a a9
+  $ cd a9
+
+  $ hg rebase --rev 'desc("C")::'
+  saved backup bundle to $TESTTMP/a9/.hg/strip-backup/*-backup.hg (glob)
+
+  $ hg tglog
+  @  8: 'D'
+  |
+  o    7: 'C'
+  |\
+  | o  6: 'I'
+  | |
+  | o  5: 'H'
+  | |
+  | | o  4: 'G'
+  | |/|
+  | o |  3: 'F'
+  | | |
+  | | o  2: 'E'
+  | |/
+  o |  1: 'B'
+  |/
+  o  0: 'A'
+  
+  $ cd ..
+
 Test --tool parameter:
 
   $ hg init b
--- a/tests/test-rebase-scenario-global.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-rebase-scenario-global.t	Wed May 02 12:55:44 2012 +0200
@@ -286,25 +286,25 @@
 Check rebasing mutable changeset
 Source phase greater or equal to destination phase: new changeset get the phase of source:
   $ hg rebase -s9 -d0
-  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2b23e52411f4-backup.hg
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2b23e52411f4-backup.hg (glob)
   $ hg log --template "{phase}\n" -r 9
   draft
   $ hg rebase -s9 -d1
-  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2cb10d0cfc6c-backup.hg
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2cb10d0cfc6c-backup.hg (glob)
   $ hg log --template "{phase}\n" -r 9
   draft
   $ hg phase --force --secret 9
   $ hg rebase -s9 -d0
-  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/c5b12b67163a-backup.hg
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/c5b12b67163a-backup.hg (glob)
   $ hg log --template "{phase}\n" -r 9
   secret
   $ hg rebase -s9 -d1
-  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2a0524f868ac-backup.hg
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2a0524f868ac-backup.hg (glob)
   $ hg log --template "{phase}\n" -r 9
   secret
 Source phase lower than destination phase: new changeset get the phase of destination:
   $ hg rebase -s7 -d9
-  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/c9659aac0000-backup.hg
+  saved backup bundle to $TESTTMP/a7/.hg/strip-backup/c9659aac0000-backup.hg (glob)
   $ hg log --template "{phase}\n" -r 9
   secret
 
--- a/tests/test-revset.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-revset.t	Wed May 02 12:55:44 2012 +0200
@@ -305,6 +305,13 @@
   6
   $ log 'modifies(b)'
   4
+  $ log 'modifies("path:b")'
+  4
+  $ log 'modifies("*")'
+  4
+  6
+  $ log 'modifies("set:modified()")'
+  4
   $ log 'id(5)'
   2
   $ log 'outgoing()'
--- a/tests/test-serve.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-serve.t	Wed May 02 12:55:44 2012 +0200
@@ -28,9 +28,9 @@
   $ hg serve -a localhost -p $HGPORT -d --pid-file=hg.pid -E errors.log
   $ cat hg.pid >> "$DAEMON_PIDS"
   $ if [ -f access.log ]; then
-  $     echo 'access log created - .hg/hgrc respected'
+  >     echo 'access log created - .hg/hgrc respected'
+  > fi
   access log created - .hg/hgrc respected
-  $ fi
 
 errors
 
--- a/tests/test-ssh-clone-r.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-ssh-clone-r.t	Wed May 02 12:55:44 2012 +0200
@@ -17,7 +17,7 @@
 clone remote via stream
 
   $ for i in 0 1 2 3 4 5 6 7 8; do
-  >    hg clone -e 'python "$TESTDIR/dummyssh"' --uncompressed -r "$i" ssh://user@dummy/remote test-"$i"
+  >    hg clone -e "python \"$TESTDIR/dummyssh\"" --uncompressed -r "$i" ssh://user@dummy/remote test-"$i"
   >    if cd test-"$i"; then
   >       hg verify
   >       cd ..
@@ -139,7 +139,7 @@
   4 files, 9 changesets, 7 total revisions
   $ cd ..
   $ cd test-1
-  $ hg pull -e 'python "$TESTDIR/dummyssh"' -r 4 ssh://user@dummy/remote
+  $ hg pull -e "python \"$TESTDIR/dummyssh\"" -r 4 ssh://user@dummy/remote
   pulling from ssh://user@dummy/remote
   searching for changes
   adding changesets
@@ -153,7 +153,7 @@
   crosschecking files in changesets and manifests
   checking files
   1 files, 3 changesets, 2 total revisions
-  $ hg pull -e 'python "$TESTDIR/dummyssh"' ssh://user@dummy/remote
+  $ hg pull -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote
   pulling from ssh://user@dummy/remote
   searching for changes
   adding changesets
@@ -163,7 +163,7 @@
   (run 'hg update' to get a working copy)
   $ cd ..
   $ cd test-2
-  $ hg pull -e 'python "$TESTDIR/dummyssh"' -r 5 ssh://user@dummy/remote
+  $ hg pull -e "python \"$TESTDIR/dummyssh\"" -r 5 ssh://user@dummy/remote
   pulling from ssh://user@dummy/remote
   searching for changes
   adding changesets
@@ -177,7 +177,7 @@
   crosschecking files in changesets and manifests
   checking files
   1 files, 5 changesets, 3 total revisions
-  $ hg pull -e 'python "$TESTDIR/dummyssh"' ssh://user@dummy/remote
+  $ hg pull -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote
   pulling from ssh://user@dummy/remote
   searching for changes
   adding changesets
--- a/tests/test-ssh.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-ssh.t	Wed May 02 12:55:44 2012 +0200
@@ -20,21 +20,21 @@
 
 repo not found error
 
-  $ hg clone -e 'python "$TESTDIR/dummyssh"' ssh://user@dummy/nonexistent local
+  $ hg clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/nonexistent local
   remote: abort: There is no Mercurial repository here (.hg not found)!
   abort: no suitable response from remote hg!
   [255]
 
 non-existent absolute path
 
-  $ hg clone -e 'python "$TESTDIR/dummyssh"' ssh://user@dummy//`pwd`/nonexistent local
+  $ hg clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy//`pwd`/nonexistent local
   remote: abort: There is no Mercurial repository here (.hg not found)!
   abort: no suitable response from remote hg!
   [255]
 
 clone remote via stream
 
-  $ hg clone -e 'python "$TESTDIR/dummyssh"' --uncompressed ssh://user@dummy/remote local-stream
+  $ hg clone -e "python \"$TESTDIR/dummyssh\"" --uncompressed ssh://user@dummy/remote local-stream
   streaming all changes
   4 files to transfer, 392 bytes of data
   transferred 392 bytes in * seconds (*/sec) (glob)
@@ -51,7 +51,7 @@
 
 clone remote via pull
 
-  $ hg clone -e 'python "$TESTDIR/dummyssh"' ssh://user@dummy/remote local
+  $ hg clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote local
   requesting all changes
   adding changesets
   adding manifests
@@ -76,7 +76,7 @@
 
   $ hg paths
   default = ssh://user@dummy/remote
-  $ hg pull -e 'python "$TESTDIR/dummyssh"'
+  $ hg pull -e "python \"$TESTDIR/dummyssh\""
   pulling from ssh://user@dummy/remote
   searching for changes
   no changes found
@@ -90,7 +90,7 @@
 
   $ echo "default-push = ssh://user@dummy/remote" >> .hg/hgrc
   $ echo "[ui]" >> .hg/hgrc
-  $ echo 'ssh = python "$TESTDIR/dummyssh"' >> .hg/hgrc
+  $ echo "ssh = python \"$TESTDIR/dummyssh\"" >> .hg/hgrc
 
 find outgoing
 
@@ -106,7 +106,7 @@
 
 find incoming on the remote side
 
-  $ hg incoming -R ../remote -e 'python "$TESTDIR/dummyssh"' ssh://user@dummy/local
+  $ hg incoming -R ../remote -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/local
   comparing with ssh://user@dummy/local
   searching for changes
   changeset:   1:a28a9d1a809c
@@ -118,7 +118,7 @@
 
 find incoming on the remote side (using absolute path)
 
-  $ hg incoming -R ../remote -e 'python "$TESTDIR/dummyssh"' "ssh://user@dummy/`pwd`"
+  $ hg incoming -R ../remote -e "python \"$TESTDIR/dummyssh\"" "ssh://user@dummy/`pwd`"
   comparing with ssh://user@dummy/$TESTTMP/local
   searching for changes
   changeset:   1:a28a9d1a809c
@@ -163,7 +163,7 @@
 test pushkeys and bookmarks
 
   $ cd ../local
-  $ hg debugpushkey --config ui.ssh='python "$TESTDIR/dummyssh"' ssh://user@dummy/remote namespaces
+  $ hg debugpushkey --config ui.ssh="python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote namespaces
   bookmarks	
   phases	
   namespaces	
@@ -178,7 +178,7 @@
   no changes found
   exporting bookmark foo
   [1]
-  $ hg debugpushkey --config ui.ssh='python "$TESTDIR/dummyssh"' ssh://user@dummy/remote bookmarks
+  $ hg debugpushkey --config ui.ssh="python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote bookmarks
   foo	1160648e36cec0054048a7edc4110c6f84fde594
   $ hg book -f foo
   $ hg push --traceback
@@ -249,7 +249,7 @@
   $ hg -R ../remote bookmark test
   $ hg -R ../remote bookmarks
    * test                      2:6c0482d977a3
-  $ hg clone -e 'python "$TESTDIR/dummyssh"' ssh://user@dummy/remote local-bookmarks
+  $ hg clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote local-bookmarks
   requesting all changes
   adding changesets
   adding manifests
@@ -273,9 +273,9 @@
 
 Test remote paths with spaces (issue2983):
 
-  $ hg init --ssh 'python "$TESTDIR/dummyssh"' "ssh://user@dummy/a repo"
+  $ hg init --ssh "python \"$TESTDIR/dummyssh\"" "ssh://user@dummy/a repo"
   $ hg -R 'a repo' tag tag
-  $ hg id --ssh 'python "$TESTDIR/dummyssh"' "ssh://user@dummy/a repo"
+  $ hg id --ssh "python \"$TESTDIR/dummyssh\"" "ssh://user@dummy/a repo"
   3fb238f49e8c
 
 Test hg-ssh:
@@ -283,7 +283,7 @@
   $ SSH_ORIGINAL_COMMAND="'hg' -R 'a repo' serve --stdio" hg id --ssh "python \"$TESTDIR\"/../contrib/hg-ssh \"$TESTTMP/a repo\"" "ssh://user@dummy/a repo"
   3fb238f49e8c
   $ SSH_ORIGINAL_COMMAND="'hg' -R 'a repo' serve --stdio" hg id --ssh "python \"$TESTDIR\"/../contrib/hg-ssh \"$TESTTMP\"" "ssh://user@dummy/a repo"
-  remote: Illegal repository '$TESTTMP/a repo'
+  remote: Illegal repository '$TESTTMP/a repo' (glob)
   abort: no suitable response from remote hg!
   [255]
   $ SSH_ORIGINAL_COMMAND="'hg' -R 'a'repo' serve --stdio" hg id --ssh "python \"$TESTDIR\"/../contrib/hg-ssh \"$TESTTMP\"" "ssh://user@dummy/a repo"
--- a/tests/test-subrepo-git.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-subrepo-git.t	Wed May 02 12:55:44 2012 +0200
@@ -507,3 +507,8 @@
   da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7
   $ cd ..
 
+Test forgetting files, not implemented in git subrepo, used to
+traceback
+  $ hg forget 'notafile*'
+  notafile*: No such file or directory
+  [1]
--- a/tests/test-subrepo-recursion.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-subrepo-recursion.t	Wed May 02 12:55:44 2012 +0200
@@ -197,7 +197,7 @@
   $ hg status -S
   ? foo/bar/z2.txt
   $ hg forget foo/bar/z2.txt
-  not removing foo/bar/z2.txt: file is already untracked
+  not removing foo/bar/z2.txt: file is already untracked (glob)
   [1]
   $ hg status -S
   ? foo/bar/z2.txt
--- a/tests/test-subrepo-svn.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-subrepo-svn.t	Wed May 02 12:55:44 2012 +0200
@@ -120,6 +120,15 @@
    source   file://*/svn-repo/src (glob)
    revision 2
 
+missing svn file, commit should fail
+
+  $ rm s/alpha
+  $ hg commit --subrepos -m 'abort on missing file'
+  committing subrepository s
+  abort: cannot commit missing svn entries
+  [255]
+  $ svn revert s/alpha > /dev/null
+
 add an unrelated revision in svn and update the subrepo to without
 bringing any changes.
 
@@ -272,13 +281,13 @@
   Checked out revision 3.
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ cd t/s
-  $ svn status
+  $ svn status | sort
+  
   ? *    a (glob)
-  X *    externals (glob)
   ? *    f1 (glob)
   ? *    f2 (glob)
-  
   Performing status on external item at 'externals'* (glob)
+  X *    externals (glob)
 
 Sticky subrepositories, no changes
   $ cd $TESTTMP/sub/t
@@ -548,3 +557,49 @@
   archiving (s): 2/2 files (100.00%)
   archiving (recreated): 0/1 files (0.00%)
   archiving (recreated): 1/1 files (100.00%)
+
+Test forgetting files, not implemented in svn subrepo, used to
+traceback
+
+  $ hg forget 'notafile*'
+  notafile*: No such file or directory
+  [1]
+
+Test a subrepo referencing a just moved svn path. Last commit rev will
+be different from the revision, and the path will be different as
+well.
+
+  $ cd $WCROOT
+  $ svn up > /dev/null
+  $ mkdir trunk/subdir branches
+  $ echo a > trunk/subdir/a
+  $ svn add trunk/subdir branches
+  A         trunk/subdir
+  A         trunk/subdir/a
+  A         branches
+  $ svn ci -m addsubdir
+  Adding         branches
+  Adding         trunk/subdir
+  Adding         trunk/subdir/a
+  Transmitting file data .
+  Committed revision 14.
+  $ svn cp -m branchtrunk $SVNREPO/trunk $SVNREPO/branches/somebranch
+  
+  Committed revision 15.
+  $ cd ..
+
+  $ hg init repo2
+  $ cd repo2
+  $ svn co $SVNREPO/branches/somebranch/subdir
+  A    subdir/a
+  Checked out revision 15.
+  $ echo "subdir = [svn] $SVNREPO/branches/somebranch/subdir" > .hgsub
+  $ hg add .hgsub
+  $ hg ci -m addsub
+  $ hg up null
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg up
+  A    *subdir/a (glob)
+  Checked out revision 15.
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd ..
--- a/tests/test-subrepo.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-subrepo.t	Wed May 02 12:55:44 2012 +0200
@@ -43,7 +43,7 @@
   $ echo b > s/a
   $ hg revert "set:subrepo('glob:s*')"
   reverting subrepo s
-  reverting s/a
+  reverting s/a (glob)
   $ rm s/a.orig
 
 Revert subrepo with no backup. The "reverting s/a" line is gone since
--- a/tests/test-transplant.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-transplant.t	Wed May 02 12:55:44 2012 +0200
@@ -212,7 +212,9 @@
   > baz
   > EOF
   $ echo toremove > toremove
+  $ echo baz > baz
   $ hg ci -Amfoo
+  adding baz
   adding foo
   adding toremove
   $ cat <<EOF > foo
@@ -226,17 +228,22 @@
   adding added
   removing toremove
   $ echo bar > bar
+  $ cat > baz <<EOF
+  > before baz
+  > baz
+  > after baz
+  > EOF
   $ hg ci -Ambar
   adding bar
   $ echo bar2 >> bar
   $ hg ci -mbar2
   $ hg up 0
-  2 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  3 files updated, 0 files merged, 2 files removed, 0 files unresolved
   $ echo foobar > foo
   $ hg ci -mfoobar
   created new head
   $ hg transplant 1:3
-  applying a1e30dd1b8e7
+  applying 46ae92138f3c
   patching file foo
   Hunk #1 FAILED at 0
   1 out of 1 hunks FAILED -- saving rejects to file foo.rej
@@ -250,7 +257,7 @@
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ rm added
   $ hg transplant 1
-  applying a1e30dd1b8e7
+  applying 46ae92138f3c
   patching file foo
   Hunk #1 FAILED at 0
   1 out of 1 hunks FAILED -- saving rejects to file foo.rej
@@ -258,17 +265,41 @@
   abort: fix up the merge and run hg transplant --continue
   [255]
   $ hg transplant --continue
-  a1e30dd1b8e7 transplanted as f1563cf27039
+  46ae92138f3c transplanted as 9159dada197d
   $ hg transplant 1:3
-  skipping already applied revision 1:a1e30dd1b8e7
-  applying 1739ac5f6139
-  1739ac5f6139 transplanted to d649c221319f
-  applying 0282d5fbbe02
-  0282d5fbbe02 transplanted to 77418277ccb3
+  skipping already applied revision 1:46ae92138f3c
+  applying 9d6d6b5a8275
+  9d6d6b5a8275 transplanted to 2d17a10c922f
+  applying 1dab759070cf
+  1dab759070cf transplanted to e06a69927eb0
   $ hg locate
   added
   bar
+  baz
   foo
+
+test multiple revisions and --continue
+
+  $ hg up -qC 0
+  $ echo bazbaz > baz
+  $ hg ci -Am anotherbaz baz
+  created new head
+  $ hg transplant 1:3
+  applying 46ae92138f3c
+  46ae92138f3c transplanted to 1024233ea0ba
+  applying 9d6d6b5a8275
+  patching file baz
+  Hunk #1 FAILED at 0
+  1 out of 1 hunks FAILED -- saving rejects to file baz.rej
+  patch failed to apply
+  abort: fix up the merge and run hg transplant --continue
+  [255]
+  $ echo fixed > baz
+  $ hg transplant --continue
+  9d6d6b5a8275 transplanted as d80c49962290
+  applying 1dab759070cf
+  1dab759070cf transplanted to aa0ffe6bd5ae
+
   $ cd ..
 
 Issue1111: Test transplant --merge
--- a/tests/test-update-branches.t	Wed Apr 18 01:20:16 2012 +0300
+++ b/tests/test-update-branches.t	Wed May 02 12:55:44 2012 +0200
@@ -15,6 +15,11 @@
   $ hg init
   $ echo foo > foo
   $ echo zero > a
+  $ hg init sub
+  $ echo suba > sub/suba
+  $ hg --cwd sub ci -Am addsuba
+  adding suba
+  $ echo 'sub = sub' > .hgsub
   $ hg ci -qAm0
   $ echo one > a ; hg ci -m1
   $ echo two > a ; hg ci -m2
@@ -29,44 +34,46 @@
 
   $ hg --config 'extensions.graphlog=' \
   >    glog --template '{rev}:{node|short} {parents} {branches}\n'
-  @  5:e1bb631146ca  b1
+  @  5:ff252e8273df  b1
   |
-  o  4:a4fdb3b883c4 0:b608b9236435  b1
+  o  4:d047485b3896 0:60829823a42a  b1
   |
-  | o  3:4b57d2520816 1:44592833ba9f
+  | o  3:6efa171f091b 1:0786582aa4b1
   | |
-  | | o  2:063f31070f65
+  | | o  2:bd10386d478c
   | |/
-  | o  1:44592833ba9f
+  | o  1:0786582aa4b1
   |/
-  o  0:b608b9236435
+  o  0:60829823a42a
   
 
 Test helper functions:
 
   $ revtest () {
   >     msg=$1
-  >     dirtyflag=$2   # 'clean' or 'dirty'
+  >     dirtyflag=$2   # 'clean', 'dirty' or 'dirtysub'
   >     startrev=$3
   >     targetrev=$4
   >     opt=$5
   >     hg up -qC $startrev
   >     test $dirtyflag = dirty && echo dirty > foo
+  >     test $dirtyflag = dirtysub && echo dirty > sub/suba
   >     hg up $opt $targetrev
   >     hg parent --template 'parent={rev}\n'
-  >     hg stat
+  >     hg stat -S
   > }    
 
   $ norevtest () {
   >     msg=$1
-  >     dirtyflag=$2   # 'clean' or 'dirty'
+  >     dirtyflag=$2   # 'clean', 'dirty' or 'dirtysub'
   >     startrev=$3
   >     opt=$4
   >     hg up -qC $startrev
   >     test $dirtyflag = dirty && echo dirty > foo
+  >     test $dirtyflag = dirtysub && echo dirty > sub/suba
   >     hg up $opt
   >     hg parent --template 'parent={rev}\n'
-  >     hg stat
+  >     hg stat -S
   > }    
 
 Test cases are documented in a table in the update function of merge.py.
@@ -99,16 +106,30 @@
   parent=2
   M foo
 
+  $ revtest 'none dirtysub linear' dirtysub 1 2
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  parent=2
+  M sub/suba
+
   $ revtest 'none dirty same'   dirty 2 3
   abort: crosses branches (merge branches or use --clean to discard changes)
   parent=2
   M foo
 
+  $ revtest 'none dirtysub same'   dirtysub 2 3
+  abort: crosses branches (merge branches or use --clean to discard changes)
+  parent=2
+  M sub/suba
+
   $ revtest 'none dirty cross'  dirty 3 4
   abort: crosses branches (merge branches or use --clean to discard changes)
   parent=3
   M foo
 
+  $ revtest 'none dirtysub cross'  dirtysub 3 4
+  abort: crosses branches (merge branches or use --clean to discard changes)
+  parent=3
+  M sub/suba
 
   $ revtest '-C dirty linear'   dirty 1 2 -C
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -119,6 +140,11 @@
   parent=1
   M foo
 
+  $ revtest '-c dirtysub linear'   dirtysub 1 2 -c
+  abort: uncommitted local changes
+  parent=1
+  M sub/suba
+
   $ norevtest '-c clean same'   clean 2 -c
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   parent=3