changeset 15402:f437967f9f80

merge with stable, reopen default branch
author Matt Mackall <mpm@selenic.com>
date Tue, 01 Nov 2011 16:49:30 -0500
parents 872f06c342ff (current diff) a708b65baeb9 (diff)
children e27561eb4a76
files hgext/largefiles/design.txt hgext/largefiles/usage.txt
diffstat 100 files changed, 7724 insertions(+), 2794 deletions(-) [+]
line wrap: on
line diff
--- a/.hgsigs	Wed Oct 26 22:35:15 2011 +0200
+++ b/.hgsigs	Tue Nov 01 16:49:30 2011 -0500
@@ -43,3 +43,5 @@
 4a43e23b8c55b4566b8200bf69fe2158485a2634 0 iD8DBQBONzIMywK+sNU5EO8RAj5SAJ0aPS3+JHnyI6bHB2Fl0LImbDmagwCdGbDLp1S7TFobxXudOH49bX45Iik=
 d629f1e89021103f1753addcef6b310e4435b184 0 iD8DBQBOWAsBywK+sNU5EO8RAht4AJwJl9oNFopuGkj5m8aKuf7bqPkoAQCeNrEm7UhFsZKYT5iUOjnMV7s2LaM=
 351a9292e430e35766c552066ed3e87c557b803b 0 iD8DBQBOh3zUywK+sNU5EO8RApFMAKCD3Y/u3avDFndznwqfG5UeTHMlvACfUivPIVQZyDZnhZMq0UhC6zhCEQg=
+384082750f2c51dc917d85a7145748330fa6ef4d 0 iD8DBQBOmd+OywK+sNU5EO8RAgDgAJ9V/X+G7VLwhTpHrZNiOHabzSyzYQCdE2kKfIevJUYB9QLAWCWP6DPwrwI=
+41453d55b481ddfcc1dacb445179649e24ca861d 0 iD8DBQBOsFhpywK+sNU5EO8RAqM6AKCyfxUae3/zLuiLdQz+JR78690eMACfQ6JTBQib4AbE+rUDdkeFYg9K/+4=
--- a/.hgtags	Wed Oct 26 22:35:15 2011 +0200
+++ b/.hgtags	Tue Nov 01 16:49:30 2011 -0500
@@ -55,3 +55,5 @@
 4a43e23b8c55b4566b8200bf69fe2158485a2634 1.9.1
 d629f1e89021103f1753addcef6b310e4435b184 1.9.2
 351a9292e430e35766c552066ed3e87c557b803b 1.9.3
+384082750f2c51dc917d85a7145748330fa6ef4d 2.0-rc
+41453d55b481ddfcc1dacb445179649e24ca861d 2.0
--- a/Makefile	Wed Oct 26 22:35:15 2011 +0200
+++ b/Makefile	Tue Nov 01 16:49:30 2011 -0500
@@ -18,7 +18,7 @@
 	@echo '  install-home - install with setup.py install --home=HOME ($(HOME))'
 	@echo '  local        - build for inplace usage'
 	@echo '  tests        - run all tests in the automatic test suite'
-	@echo '  test-foo     - run only specified tests (e.g. test-merge1)'
+	@echo '  test-foo     - run only specified tests (e.g. test-merge1.t)'
 	@echo '  dist         - run all tests and create a source tarball in dist/'
 	@echo '  clean        - remove files created by other targets'
 	@echo '                 (except installed files or dist source tarball)'
--- a/contrib/check-code.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/contrib/check-code.py	Tue Nov 01 16:49:30 2011 -0500
@@ -13,7 +13,7 @@
 
 def repquote(m):
     t = re.sub(r"\w", "x", m.group('text'))
-    t = re.sub(r"[^\sx]", "o", t)
+    t = re.sub(r"[^\s\nx]", "o", t)
     return m.group('quote') + t + m.group('quote')
 
 def reppython(m):
@@ -44,14 +44,15 @@
 testpats = [
   [
     (r'(pushd|popd)', "don't use 'pushd' or 'popd', use 'cd'"),
-    (r'\W\$?\(\([^\)]*\)\)', "don't use (()) or $(()), use 'expr'"),
+    (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"),
     (r'echo.*\\n', "don't use 'echo \\n', use printf"),
     (r'echo -n', "don't use 'echo -n', use printf"),
     (r'^diff.*-\w*N', "don't use 'diff -N'"),
-    (r'(^| )wc[^|]*$', "filter wc output"),
+    (r'(^| )wc[^|]*$\n(?!.*\(re\))', "filter wc output"),
     (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\d\d', "don't use 'printf \NNN', use Python"),
     (r'printf.*\\x', "don't use printf \\x, use Python"),
@@ -63,12 +64,12 @@
     (r'\$PWD', "don't use $PWD, use `pwd`"),
     (r'[^\n]\Z', "no trailing newline"),
     (r'export.*=', "don't export and assign at once"),
-    ('^([^"\']|("[^"]*")|(\'[^\']*\'))*\\^', "^ 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\s+[^|-]+\s+-', "options to 'ls' must come before filenames"),
-    (r'[^>]>\s*\$HGRCPATH', "don't overwrite $HGRCPATH, append to it"),
-    (r'stop\(\)', "don't use 'stop' as a shell function name"),
+    (r'ls +[^|\n-]+ +-', "options to 'ls' must come before filenames"),
+    (r'[^>\n]>\s*\$HGRCPATH', "don't overwrite $HGRCPATH, append to it"),
+    (r'^stop\(\)', "don't use 'stop' as a shell function name"),
     (r'(\[|\btest\b).*-e ', "don't use 'test -e', use 'test -f'"),
   ],
   # warnings
@@ -84,7 +85,7 @@
 uprefixc = r"^  > "
 utestpats = [
   [
-    (r'^(\S|  $ ).*(\S\s+|^\s+)\n', "trailing whitespace on non-output"),
+    (r'^(\S|  $ ).*(\S[ \t]+|^[ \t]+)\n', "trailing whitespace on non-output"),
     (uprefix + r'.*\|\s*sed', "use regex test output patterns instead of sed"),
     (uprefix + r'(true|exit 0)', "explicit zero exit unnecessary"),
     (uprefix + r'.*\$\?', "explicit exit code checks unnecessary"),
@@ -99,10 +100,10 @@
 
 for i in [0, 1]:
     for p, m in testpats[i]:
-        if p.startswith('^'):
+        if p.startswith(r'^'):
             p = uprefix + p[1:]
         else:
-            p = uprefix + p
+            p = uprefix + ".*" + p
         utestpats[i].append((p, m))
 
 utestfilters = [
@@ -122,16 +123,19 @@
     (r'\S;\s*\n', "semicolon"),
     (r'\w,\w', "missing whitespace after ,"),
     (r'\w[+/*\-<>]\w', "missing whitespace in expression"),
-    (r'^\s+\w+=\w+[^,)]$', "missing whitespace in assignment"),
+    (r'^\s+\w+=\w+[^,)\n]$', "missing whitespace in assignment"),
+    (r'(\s+)try:\n((?:\n|\1\s.*\n)+?)\1except.*?:\n'
+     r'((?:\n|\1\s.*\n)+?)\1finally:', 'no try/except/finally in Py2.4'),
     (r'.{85}', "line too long"),
+    (r' x+[xo][\'"]\n\s+[\'"]x', 'string join across lines with no space'),
     (r'[^\n]\Z', "no trailing newline"),
-    (r'(\S\s+|^\s+)\n', "trailing whitespace"),
-#    (r'^\s+[^_ ][^_. ]+_[^_]+\s*=', "don't use underbars in identifiers"),
+    (r'(\S[ \t]+|^[ \t]+)\n', "trailing whitespace"),
+#    (r'^\s+[^_ \n][^_. \n]+_[^_\n]+\s*=', "don't use underbars in identifiers"),
 #    (r'\w*[a-z][A-Z]\w*\s*=', "don't use camelcase in identifiers"),
-    (r'^\s*(if|while|def|class|except|try)\s[^[]*:\s*[^\]#\s]+',
+    (r'^\s*(if|while|def|class|except|try)\s[^[\n]*:\s*[^\\n]#\s]+',
      "linebreak after :"),
-    (r'class\s[^( ]+:', "old-style class, use class foo(object)"),
-    (r'class\s[^( ]+\(\):',
+    (r'class\s[^( \n]+:', "old-style class, use class foo(object)"),
+    (r'class\s[^( \n]+\(\):',
      "class foo() not available in Python 2.4, use class foo(object)"),
     (r'\b(%s)\(' % '|'.join(keyword.kwlist),
      "Python keyword is not a function"),
@@ -153,7 +157,7 @@
     (r'if\s.*\selse', "if ... else form not available in Python 2.4"),
     (r'^\s*(%s)\s\s' % '|'.join(keyword.kwlist),
      "gratuitous whitespace after Python keyword"),
-    (r'([\(\[]\s\S)|(\S\s[\)\]])', "gratuitous whitespace in () or []"),
+    (r'([\(\[][ \t]\S)|(\S[ \t][\)\]])', "gratuitous whitespace in () or []"),
 #    (r'\s\s=', "gratuitous whitespace before ="),
     (r'[^>< ](\+=|-=|!=|<>|<=|>=|<<=|>>=)\S',
      "missing whitespace around operator"),
@@ -173,6 +177,8 @@
      'hasattr(foo, bar) is broken, use util.safehasattr(foo, bar) instead'),
     (r'opener\([^)]*\).read\(',
      "use opener.read() instead"),
+    (r'BaseException', 'not in Py2.4, use Exception'),
+    (r'os\.path\.relpath', 'os.path.relpath is not in Py2.5'),
     (r'opener\([^)]*\).write\(',
      "use opener.write() instead"),
     (r'[\s\(](open|file)\([^)]*\)\.read\(',
@@ -207,7 +213,7 @@
     (r'//', "don't use //-style comments"),
     (r'^  ', "don't use spaces to indent"),
     (r'\S\t', "don't use tabs except for indent"),
-    (r'(\S\s+|^\s+)\n', "trailing whitespace"),
+    (r'(\S[ \t]+|^[ \t]+)\n', "trailing whitespace"),
     (r'.{85}', "line too long"),
     (r'(while|if|do|for)\(', "use space after while/if/do/for"),
     (r'return\(', "return is not a function"),
@@ -332,32 +338,63 @@
         else:
             pats = pats[0]
         # print post # uncomment to show filtered version
-        z = enumerate(zip(pre.splitlines(), post.splitlines(True)))
+
         if debug:
             print "Checking %s for %s" % (name, f)
-        for n, l in z:
-            if "check-code" + "-ignore" in l[0]:
-                if debug:
-                    print "Skipping %s for %s:%s (check-code -ignore)" % (
-                           name, f, n)
-                continue
-            for p, msg in pats:
-                if re.search(p, l[1]):
-                    bd = ""
-                    if blame:
-                        bd = 'working directory'
-                        if not blamecache:
-                            blamecache = getblame(f)
-                        if n < len(blamecache):
-                            bl, bu, br = blamecache[n]
-                            if bl == l[0]:
-                                bd = '%s@%s' % (bu, br)
-                    logfunc(f, n + 1, l[0], msg, bd)
-                    fc += 1
-                    result = False
+
+        prelines = None
+        errors = []
+        for p, msg in pats:
+            # fix-up regexes for multiline searches
+            po = p
+            # \s doesn't match \n
+            p = re.sub(r'(?<!\\)\\s', r'[ \\t]', p)
+            # [^...] doesn't match newline
+            p = re.sub(r'(?<!\\)\[\^', r'[^\\n', p)
+
+            #print po, '=>', p
+
+            pos = 0
+            n = 0
+            for m in re.finditer(p, post, re.MULTILINE):
+                if prelines is None:
+                    prelines = pre.splitlines()
+                    postlines = post.splitlines(True)
+
+                start = m.start()
+                while n < len(postlines):
+                    step = len(postlines[n])
+                    if pos + step > start:
+                        break
+                    pos += step
+                    n += 1
+                l = prelines[n]
+
+                if "check-code" + "-ignore" in l:
+                    if debug:
+                        print "Skipping %s for %s:%s (check-code -ignore)" % (
+                            name, f, n)
+                    continue
+                bd = ""
+                if blame:
+                    bd = 'working directory'
+                    if not blamecache:
+                        blamecache = getblame(f)
+                    if n < len(blamecache):
+                        bl, bu, br = blamecache[n]
+                        if bl == l:
+                            bd = '%s@%s' % (bu, br)
+                errors.append((f, n + 1, l, msg, bd))
+                result = False
+
+        errors.sort()
+        for e in errors:
+            logfunc(*e)
+            fc += 1
             if maxerr is not None and fc >= maxerr:
                 print " (too many errors, giving up)"
                 break
+
     return result
 
 if __name__ == "__main__":
--- a/doc/runrst	Wed Oct 26 22:35:15 2011 +0200
+++ b/doc/runrst	Tue Nov 01 16:49:30 2011 -0500
@@ -20,6 +20,8 @@
 except ImportError:
     sys.stderr.write("abort: couldn't generate documentation: docutils "
                      "module is missing\n")
+    sys.stderr.write("please install python-docutils or see "
+                     "http://docutils.sourceforge.net/\n")
     sys.exit(-1)
 
 def role_hg(name, rawtext, text, lineno, inliner,
--- a/hgext/convert/__init__.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/convert/__init__.py	Tue Nov 01 16:49:30 2011 -0500
@@ -146,8 +146,8 @@
         converting from and to Mercurial. Default is False.
 
     :convert.hg.saverev: store original revision ID in changeset
-        (forces target IDs to change). It takes and boolean argument
-        and defaults to False.
+        (forces target IDs to change). It takes a boolean argument and
+        defaults to False.
 
     :convert.hg.startrev: convert start revision and its descendants.
         It takes a hg revision identifier and defaults to 0.
--- a/hgext/convert/transport.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/convert/transport.py	Tue Nov 01 16:49:30 2011 -0500
@@ -18,6 +18,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
+from mercurial import util
 from svn.core import SubversionException, Pool
 import svn.ra
 import svn.client
--- a/hgext/keyword.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/keyword.py	Tue Nov 01 16:49:30 2011 -0500
@@ -237,7 +237,7 @@
 
     def iskwfile(self, cand, ctx):
         '''Returns subset of candidates which are configured for keyword
-        expansion are not symbolic links.'''
+        expansion but are not symbolic links.'''
         return [f for f in cand if self.match(f) and not 'l' in ctx.flags(f)]
 
     def overwrite(self, ctx, candidates, lookup, expand, rekw=False):
--- a/hgext/largefiles/__init__.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/largefiles/__init__.py	Tue Nov 01 16:49:30 2011 -0500
@@ -29,7 +29,7 @@
 of large files when you clone or pull.
 
 To start a new repository or add new large binary files, just add
---large to your ``hg add`` command. For example::
+--large to your :hg:`add` command. For example::
 
   $ dd if=/dev/urandom of=randomdata count=2000
   $ hg add --large randomdata
@@ -49,24 +49,24 @@
 
 If you already have large files tracked by Mercurial without the
 largefiles extension, you will need to convert your repository in
-order to benefit from largefiles. This is done with the 'hg lfconvert'
-command::
+order to benefit from largefiles. This is done with the
+:hg:`lfconvert` command::
 
   $ hg lfconvert --size 10 oldrepo newrepo
 
 In repositories that already have largefiles in them, any new file
 over 10MB will automatically be added as a largefile. To change this
-threshhold, set ``largefiles.size`` in your Mercurial config file to
-the minimum size in megabytes to track as a largefile, or use the
+threshold, set ``largefiles.minsize`` in your Mercurial config file
+to the minimum size in megabytes to track as a largefile, or use the
 --lfsize option to the add command (also in megabytes)::
 
   [largefiles]
-  size = 2           XXX wouldn't minsize be a better name?
+  minsize = 2
 
   $ hg add --lfsize 2
 
 The ``largefiles.patterns`` config option allows you to specify a list
-of filename patterns (see ``hg help patterns``) that should always be
+of filename patterns (see :hg:`help patterns`) that should always be
 tracked as largefiles::
 
   [largefiles]
--- a/hgext/largefiles/basestore.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/largefiles/basestore.py	Tue Nov 01 16:49:30 2011 -0500
@@ -74,13 +74,13 @@
             at += 1
             ui.note(_('getting %s:%s\n') % (filename, hash))
 
-            cachefilename = lfutil.cachepath(self.repo, hash)
-            cachedir = os.path.dirname(cachefilename)
+            storefilename = lfutil.storepath(self.repo, hash)
+            storedir = os.path.dirname(storefilename)
 
             # No need to pass mode='wb' to fdopen(), since mkstemp() already
             # opened the file in binary mode.
             (tmpfd, tmpfilename) = tempfile.mkstemp(
-                dir=cachedir, prefix=os.path.basename(filename))
+                dir=storedir, prefix=os.path.basename(filename))
             tmpfile = os.fdopen(tmpfd, 'w')
 
             try:
@@ -98,10 +98,10 @@
                 missing.append(filename)
                 continue
 
-            if os.path.exists(cachefilename): # Windows
-                os.remove(cachefilename)
-            os.rename(tmpfilename, cachefilename)
-            lfutil.linktosystemcache(self.repo, hash)
+            if os.path.exists(storefilename): # Windows
+                os.remove(storefilename)
+            os.rename(tmpfilename, storefilename)
+            lfutil.linktousercache(self.repo, hash)
             success.append((filename, hhash))
 
         ui.progress(_('getting largefiles'), None)
@@ -121,7 +121,7 @@
             cctx = self.repo[rev]
             cset = "%d:%s" % (cctx.rev(), node.short(cctx.node()))
 
-            failed = lfutil.any_(self._verifyfile(
+            failed = util.any(self._verifyfile(
                 cctx, cset, contents, standin, verified) for standin in cctx)
 
         num_revs = len(verified)
@@ -199,4 +199,4 @@
         except lfutil.storeprotonotcapable:
             pass
 
-    raise util.Abort(_('%s does not appear to be a largefile store'), path)
+    raise util.Abort(_('%s does not appear to be a largefile store') % path)
--- a/hgext/largefiles/design.txt	Wed Oct 26 22:35:15 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-= largefiles - manage large binary files =
-This extension is based off of Greg Ward's bfiles extension which can be found
-at http://mercurial.selenic.com/wiki/BfilesExtension.
-
-== The largefile store ==
-
-largefile stores are, in the typical use case, centralized servers that have
-every past revision of a given binary file.  Each largefile is identified by
-its sha1 hash, and all interactions with the store take one of the following
-forms.
-
--Download a bfile with this hash
--Upload a bfile with this hash
--Check if the store has a bfile with this hash
-
-largefiles stores can take one of two forms:
-
--Directories on a network file share
--Mercurial wireproto servers, either via ssh or http (hgweb)
-
-== The Local Repository ==
-
-The local repository has a largefile cache in .hg/largefiles which holds a
-subset of the largefiles needed. On a clone only the largefiles at tip are
-downloaded. When largefiles are downloaded from the central store, a copy is
-saved in this store.
-
-== The Global Cache ==
-
-largefiles in a local repository cache are hardlinked to files in the global
-cache. Before a file is downloaded we check if it is in the global cache.
-
-== Implementation Details ==
-
-Each largefile has a standin which is in .hglf. The standin is tracked by
-Mercurial.  The standin contains the SHA1 hash of the largefile. When a
-largefile is added/removed/copied/renamed/etc the same operation is applied to
-the standin. Thus the history of the standin is the history of the largefile.
-
-For performance reasons, the contents of a standin are only updated before a
-commit.  Standins are added/removed/copied/renamed from add/remove/copy/rename
-Mercurial commands but their contents will not be updated. The contents of a
-standin will always be the hash of the largefile as of the last commit. To
-support some commands (revert) some standins are temporarily updated but will
-be changed back after the command is finished.
-
-A Mercurial dirstate object tracks the state of the largefiles. The dirstate
-uses the last modified time and current size to detect if a file has changed
-(without reading the entire contents of the file).
--- a/hgext/largefiles/lfcommands.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/largefiles/lfcommands.py	Tue Nov 01 16:49:30 2011 -0500
@@ -35,34 +35,23 @@
     largefiles is enabled anywhere you intend to push the new
     repository.
 
-    Use --tonormal to convert largefiles back to normal files; after
+    Use --to-normal to convert largefiles back to normal files; after
     this, the DEST repository can be used without largefiles at all.'''
 
-    if opts['tonormal']:
+    if opts['to_normal']:
         tolfile = False
     else:
         tolfile = True
         size = lfutil.getminsize(ui, True, opts.get('size'), default=None)
-    try:
-        rsrc = hg.repository(ui, src)
-        if not rsrc.local():
-            raise util.Abort(_('%s is not a local Mercurial repo') % src)
-    except error.RepoError, err:
-        ui.traceback()
-        raise util.Abort(err.args[0])
-    if os.path.exists(dest):
-        if not os.path.isdir(dest):
-            raise util.Abort(_('destination %s already exists') % dest)
-        elif os.listdir(dest):
-            raise util.Abort(_('destination %s is not empty') % dest)
-    try:
-        ui.status(_('initializing destination %s\n') % dest)
-        rdst = hg.repository(ui, dest, create=True)
-        if not rdst.local():
-            raise util.Abort(_('%s is not a local Mercurial repo') % dest)
-    except error.RepoError:
-        ui.traceback()
-        raise util.Abort(_('%s is not a repo') % dest)
+
+    if not hg.islocal(src):
+        raise util.Abort(_('%s is not a local Mercurial repo') % src)
+    if not hg.islocal(dest):
+        raise util.Abort(_('%s is not a local Mercurial repo') % dest)
+
+    rsrc = hg.repository(ui, src)
+    ui.status(_('initializing destination %s\n') % dest)
+    rdst = hg.repository(ui, dest, create=True)
 
     success = False
     try:
@@ -109,6 +98,11 @@
                 except OSError:
                     pass
 
+            # If there were any files converted to largefiles, add largefiles
+            # to the destination repository's requirements.
+            if lfiles:
+                rdst.requirements.add('largefiles')
+                rdst._writerequirements()
         else:
             for ctx in ctxs:
                 ui.progress(_('converting revisions'), ctx.rev(),
@@ -233,7 +227,7 @@
                 if 'l' in fctx.flags():
                     if renamedlfile:
                         raise util.Abort(
-                            _('Renamed/copied largefile %s becomes symlink')
+                            _('renamed/copied largefile %s becomes symlink')
                             % f)
                     islfile = False
             if islfile:
@@ -251,7 +245,7 @@
 
                 # largefile was modified, update standins
                 fullpath = rdst.wjoin(f)
-                lfutil.createdir(os.path.dirname(fullpath))
+                util.makedirs(os.path.dirname(fullpath))
                 m = util.sha1('')
                 m.update(ctx[f].data())
                 hash = m.hexdigest()
@@ -286,7 +280,7 @@
                 # doesn't change after rename or copy
                 renamed = lfutil.standin(renamed[0])
 
-            return context.memfilectx(f, lfiletohash[srcfname], 'l' in
+            return context.memfilectx(f, lfiletohash[srcfname] + '\n', 'l' in
                 fctx.flags(), 'x' in fctx.flags(), renamed)
         else:
             try:
@@ -331,9 +325,7 @@
 def uploadlfiles(ui, rsrc, rdst, files):
     '''upload largefiles to the central store'''
 
-    # Don't upload locally. All largefiles are in the system wide cache
-    # so the other repo can just get them from there.
-    if not files or rdst.local():
+    if not files:
         return
 
     store = basestore._openstore(rsrc, rdst, put=True)
@@ -474,7 +466,7 @@
                     _('minimum size (MB) for files to be converted '
                       'as largefiles'),
                     'SIZE'),
-                  ('', 'tonormal', False,
+                  ('', 'to-normal', False,
                    _('convert from a largefiles repo to a normal repo')),
                   ],
                   _('hg lfconvert SOURCE DEST [FILE ...]')),
--- a/hgext/largefiles/lfutil.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/largefiles/lfutil.py	Tue Nov 01 16:49:30 2011 -0500
@@ -10,9 +10,10 @@
 
 import os
 import errno
+import platform
 import shutil
 import stat
-import hashlib
+import tempfile
 
 from mercurial import dirstate, httpconnection, match as match_, util, scmutil
 from mercurial.i18n import _
@@ -61,7 +62,7 @@
 def getminsize(ui, assumelfiles, opt, default=10):
     lfsize = opt
     if not lfsize and assumelfiles:
-        lfsize = ui.config(longname, 'size', default=default)
+        lfsize = ui.config(longname, 'minsize', default=default)
     if lfsize:
         try:
             lfsize = float(lfsize)
@@ -80,31 +81,39 @@
         shutil.copyfile(src, dest)
         os.chmod(dest, os.stat(src).st_mode)
 
-def systemcachepath(ui, hash):
-    path = ui.config(longname, 'systemcache', None)
+def usercachepath(ui, hash):
+    path = ui.configpath(longname, 'usercache', None)
     if path:
         path = os.path.join(path, hash)
     else:
         if os.name == 'nt':
             appdata = os.getenv('LOCALAPPDATA', os.getenv('APPDATA'))
             path = os.path.join(appdata, longname, hash)
+        elif platform.system() == 'Darwin':
+            path = os.path.join(os.getenv('HOME'), 'Library', 'Caches',
+                                longname, hash)
         elif os.name == 'posix':
-            path = os.path.join(os.getenv('HOME'), '.' + longname, hash)
+            path = os.getenv('XDG_CACHE_HOME')
+            if path:
+                path = os.path.join(path, longname, hash)
+            else:
+                path = os.path.join(os.getenv('HOME'), '.cache', longname, hash)
         else:
             raise util.Abort(_('unknown operating system: %s\n') % os.name)
     return path
 
-def insystemcache(ui, hash):
-    return os.path.exists(systemcachepath(ui, hash))
+def inusercache(ui, hash):
+    return os.path.exists(usercachepath(ui, hash))
 
 def findfile(repo, hash):
-    if incache(repo, hash):
-        repo.ui.note(_('Found %s in cache\n') % hash)
-        return cachepath(repo, hash)
-    if insystemcache(repo.ui, hash):
+    if instore(repo, hash):
+        repo.ui.note(_('Found %s in store\n') % hash)
+    elif inusercache(repo.ui, hash):
         repo.ui.note(_('Found %s in system cache\n') % hash)
-        return systemcachepath(repo.ui, hash)
-    return None
+        link(usercachepath(repo.ui, hash), storepath(repo, hash))
+    else:
+        return None
+    return storepath(repo, hash)
 
 class largefiles_dirstate(dirstate.dirstate):
     def __getitem__(self, key):
@@ -127,11 +136,8 @@
     '''
     admin = repo.join(longname)
     opener = scmutil.opener(admin)
-    if util.safehasattr(repo.dirstate, '_validate'):
-        lfdirstate = largefiles_dirstate(opener, ui, repo.root,
-            repo.dirstate._validate)
-    else:
-        lfdirstate = largefiles_dirstate(opener, ui, repo.root)
+    lfdirstate = largefiles_dirstate(opener, ui, repo.root,
+                                     repo.dirstate._validate)
 
     # If the largefiles dirstate does not exist, populate and create
     # it. This ensures that we create it on the first meaningful
@@ -188,14 +194,10 @@
             for f in repo[rev].walk(matcher)
             if rev is not None or repo.dirstate[f] != '?']
 
-def incache(repo, hash):
-    return os.path.exists(cachepath(repo, hash))
+def instore(repo, hash):
+    return os.path.exists(storepath(repo, hash))
 
-def createdir(dir):
-    if not os.path.exists(dir):
-        os.makedirs(dir)
-
-def cachepath(repo, hash):
+def storepath(repo, hash):
     return repo.join(os.path.join(longname, hash))
 
 def copyfromcache(repo, hash, filename):
@@ -211,24 +213,24 @@
     shutil.copy(path, repo.wjoin(filename))
     return True
 
-def copytocache(repo, rev, file, uploaded=False):
+def copytostore(repo, rev, file, uploaded=False):
     hash = readstandin(repo, file)
-    if incache(repo, hash):
+    if instore(repo, hash):
         return
-    copytocacheabsolute(repo, repo.wjoin(file), hash)
+    copytostoreabsolute(repo, repo.wjoin(file), hash)
 
-def copytocacheabsolute(repo, file, hash):
-    createdir(os.path.dirname(cachepath(repo, hash)))
-    if insystemcache(repo.ui, hash):
-        link(systemcachepath(repo.ui, hash), cachepath(repo, hash))
+def copytostoreabsolute(repo, file, hash):
+    util.makedirs(os.path.dirname(storepath(repo, hash)))
+    if inusercache(repo.ui, hash):
+        link(usercachepath(repo.ui, hash), storepath(repo, hash))
     else:
-        shutil.copyfile(file, cachepath(repo, hash))
-        os.chmod(cachepath(repo, hash), os.stat(file).st_mode)
-        linktosystemcache(repo, hash)
+        shutil.copyfile(file, storepath(repo, hash))
+        os.chmod(storepath(repo, hash), os.stat(file).st_mode)
+        linktousercache(repo, hash)
 
-def linktosystemcache(repo, hash):
-    createdir(os.path.dirname(systemcachepath(repo.ui, hash)))
-    link(cachepath(repo, hash), systemcachepath(repo.ui, hash))
+def linktousercache(repo, hash):
+    util.makedirs(os.path.dirname(usercachepath(repo.ui, hash)))
+    link(storepath(repo, hash), usercachepath(repo.ui, hash))
 
 def getstandinmatcher(repo, pats=[], opts={}):
     '''Return a match object that applies pats to the standin directory'''
@@ -421,7 +423,7 @@
 def hexsha1(data):
     """hexsha1 returns the hex-encoded sha1 sum of the data in the file-like
     object data"""
-    h = hashlib.sha1()
+    h = util.sha1()
     for chunk in util.filechunkiter(data):
         h.update(chunk)
     return h.hexdigest()
@@ -435,14 +437,15 @@
 
 def islfilesrepo(repo):
     return ('largefiles' in repo.requirements and
-            any_(shortname + '/' in f[0] for f in repo.store.datafiles()))
+            util.any(shortname + '/' in f[0] for f in repo.store.datafiles()))
 
-def any_(gen):
-    for x in gen:
-        if x:
-            return True
-    return False
+def mkstemp(repo, prefix):
+    '''Returns a file descriptor and a filename corresponding to a temporary
+    file in the repo's largefiles store.'''
+    path = repo.join(longname)
+    util.makedirs(path)
+    return tempfile.mkstemp(prefix=prefix, dir=path)
 
-class storeprotonotcapable(BaseException):
+class storeprotonotcapable(Exception):
     def __init__(self, storetypes):
         self.storetypes = storetypes
--- a/hgext/largefiles/localstore.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/largefiles/localstore.py	Tue Nov 01 16:49:30 2011 -0500
@@ -17,27 +17,38 @@
 import basestore
 
 class localstore(basestore.basestore):
-    '''Because there is a system-wide cache, the local store always
-    uses that cache. Since the cache is updated elsewhere, we can
-    just read from it here as if it were the store.'''
+    '''localstore first attempts to grab files out of the store in the remote
+    Mercurial repository.  Failling that, it attempts to grab the files from
+    the user cache.'''
 
     def __init__(self, ui, repo, remote):
         url = os.path.join(remote.path, '.hg', lfutil.longname)
         super(localstore, self).__init__(ui, repo, util.expandpath(url))
+        self.remote = remote
 
-    def put(self, source, filename, hash):
-        '''Any file that is put must already be in the system-wide
-        cache so do nothing.'''
-        return
+    def put(self, source, hash):
+        util.makedirs(os.path.dirname(lfutil.storepath(self.remote, hash)))
+        if lfutil.instore(self.remote, hash):
+            return
+        lfutil.link(lfutil.storepath(self.repo, hash),
+                lfutil.storepath(self.remote, hash))
 
     def exists(self, hash):
-        return lfutil.insystemcache(self.repo.ui, hash)
+        return lfutil.instore(self.remote, hash)
 
     def _getfile(self, tmpfile, filename, hash):
-        if lfutil.insystemcache(self.ui, hash):
-            return lfutil.systemcachepath(self.ui, hash)
-        raise basestore.StoreError(filename, hash, '',
-            _("Can't get file locally"))
+        if lfutil.instore(self.remote, hash):
+            path = lfutil.storepath(self.remote, hash)
+        elif lfutil.inusercache(self.ui, hash):
+            path = lfutil.usercachepath(self.ui, hash)
+        else:
+            raise basestore.StoreError(filename, hash, '',
+                _("Can't get file locally"))
+        fd = open(path, 'rb')
+        try:
+            return lfutil.copyandhash(fd, tmpfile)
+        finally:
+            fd.close()
 
     def _verifyfile(self, cctx, cset, contents, standin, verified):
         filename = lfutil.splitstandin(standin)
@@ -50,7 +61,7 @@
 
         expecthash = fctx.data()[0:40]
         verified.add(key)
-        if not lfutil.insystemcache(self.ui, expecthash):
+        if not lfutil.instore(self.remote, expecthash):
             self.ui.warn(
                 _('changeset %s: %s missing\n'
                   '  (looked for hash %s)\n')
@@ -58,7 +69,7 @@
             return True                 # failed
 
         if contents:
-            storepath = lfutil.systemcachepath(self.ui, expecthash)
+            storepath = lfutil.storepath(self.remote, expecthash)
             actualhash = lfutil.hashfile(storepath)
             if actualhash != expecthash:
                 self.ui.warn(
--- a/hgext/largefiles/overrides.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/largefiles/overrides.py	Tue Nov 01 16:49:30 2011 -0500
@@ -11,17 +11,11 @@
 import os
 import copy
 
-from mercurial import hg, commands, util, cmdutil, match as match_, node, \
-        archival, error, merge
+from mercurial import hg, commands, util, cmdutil, scmutil, match as match_, \
+    node, archival, error, merge
 from mercurial.i18n import _
 from mercurial.node import hex
 from hgext import rebase
-import lfutil
-
-try:
-    from mercurial import scmutil
-except ImportError:
-    pass
 
 import lfutil
 import lfcommands
@@ -30,9 +24,9 @@
     '''overrides scmutil.match so that the matcher it returns will ignore all
     largefiles'''
     oldmatch = None # for the closure
-    def override_match(repo, pats=[], opts={}, globbed=False,
+    def override_match(ctx, pats=[], opts={}, globbed=False,
             default='relpath'):
-        match = oldmatch(repo, pats, opts, globbed, default)
+        match = oldmatch(ctx, pats, opts, globbed, default)
         m = copy.copy(match)
         notlfile = lambda f: not (lfutil.isstandin(f) or lfutil.standin(f) in
                 manifest)
@@ -93,7 +87,7 @@
 
         if exact or not exists:
             abovemin = (lfsize and
-                        os.path.getsize(repo.wjoin(f)) >= lfsize * 1024 * 1024)
+                        os.lstat(repo.wjoin(f)).st_size >= lfsize * 1024 * 1024)
             if large or abovemin or (lfmatcher and lfmatcher(f)):
                 lfnames.append(f)
                 if ui.verbose or not exact:
@@ -151,18 +145,18 @@
 
     def warn(files, reason):
         for f in files:
-            ui.warn(_('not removing %s: file %s (use -f to force removal)\n')
+            ui.warn(_('not removing %s: %s (use -f to force removal)\n')
                     % (m.rel(f), reason))
 
     if force:
         remove, forget = modified + deleted + clean, added
     elif after:
         remove, forget = deleted, []
-        warn(modified + added + clean, _('still exists'))
+        warn(modified + added + clean, _('file still exists'))
     else:
         remove, forget = deleted + clean, []
-        warn(modified, _('is modified'))
-        warn(added, _('has been marked for add'))
+        warn(modified, _('file is modified'))
+        warn(added, _('file has been marked for add'))
 
     for f in sorted(remove + forget):
         if ui.verbose or not m.exact(f):
@@ -304,8 +298,7 @@
 
     def makestandin(relpath):
         path = scmutil.canonpath(repo.root, repo.getcwd(), relpath)
-        return os.path.join(os.path.relpath('.', repo.getcwd()),
-            lfutil.standin(path))
+        return os.path.join(repo.wjoin(lfutil.standin(path)))
 
     fullpats = scmutil.expandpats(pats)
     dest = fullpats[-1]
@@ -320,14 +313,15 @@
     nonormalfiles = False
     nolfiles = False
     try:
-        installnormalfilesmatchfn(repo[None].manifest())
-        result = orig(ui, repo, pats, opts, rename)
-    except util.Abort, e:
-        if str(e) != 'no files to copy':
-            raise e
-        else:
-            nonormalfiles = True
-        result = 0
+        try:
+            installnormalfilesmatchfn(repo[None].manifest())
+            result = orig(ui, repo, pats, opts, rename)
+        except util.Abort, e:
+            if str(e) != 'no files to copy':
+                raise e
+            else:
+                nonormalfiles = True
+            result = 0
     finally:
         restorematchfn()
 
@@ -339,80 +333,79 @@
         return result
 
     try:
-        # When we call orig below it creates the standins but we don't add them
-        # to the dir state until later so lock during that time.
-        wlock = repo.wlock()
+        try:
+            # When we call orig below it creates the standins but we don't add them
+            # to the dir state until later so lock during that time.
+            wlock = repo.wlock()
 
-        manifest = repo[None].manifest()
-        oldmatch = None # for the closure
-        def override_match(repo, pats=[], opts={}, globbed=False,
-                default='relpath'):
-            newpats = []
-            # The patterns were previously mangled to add the standin
-            # directory; we need to remove that now
+            manifest = repo[None].manifest()
+            oldmatch = None # for the closure
+            def override_match(ctx, pats=[], opts={}, globbed=False,
+                    default='relpath'):
+                newpats = []
+                # The patterns were previously mangled to add the standin
+                # directory; we need to remove that now
+                for pat in pats:
+                    if match_.patkind(pat) is None and lfutil.shortname in pat:
+                        newpats.append(pat.replace(lfutil.shortname, ''))
+                    else:
+                        newpats.append(pat)
+                match = oldmatch(ctx, newpats, opts, globbed, default)
+                m = copy.copy(match)
+                lfile = lambda f: lfutil.standin(f) in manifest
+                m._files = [lfutil.standin(f) for f in m._files if lfile(f)]
+                m._fmap = set(m._files)
+                orig_matchfn = m.matchfn
+                m.matchfn = lambda f: (lfutil.isstandin(f) and
+                                    lfile(lfutil.splitstandin(f)) and
+                                    orig_matchfn(lfutil.splitstandin(f)) or
+                                    None)
+                return m
+            oldmatch = installmatchfn(override_match)
+            listpats = []
             for pat in pats:
-                if match_.patkind(pat) is None and lfutil.shortname in pat:
-                    newpats.append(pat.replace(lfutil.shortname, ''))
+                if match_.patkind(pat) is not None:
+                    listpats.append(pat)
                 else:
-                    newpats.append(pat)
-            match = oldmatch(repo, newpats, opts, globbed, default)
-            m = copy.copy(match)
-            lfile = lambda f: lfutil.standin(f) in manifest
-            m._files = [lfutil.standin(f) for f in m._files if lfile(f)]
-            m._fmap = set(m._files)
-            orig_matchfn = m.matchfn
-            m.matchfn = lambda f: (lfutil.isstandin(f) and
-                                   lfile(lfutil.splitstandin(f)) and
-                                   orig_matchfn(lfutil.splitstandin(f)) or
-                                   None)
-            return m
-        oldmatch = installmatchfn(override_match)
-        listpats = []
-        for pat in pats:
-            if match_.patkind(pat) is not None:
-                listpats.append(pat)
-            else:
-                listpats.append(makestandin(pat))
+                    listpats.append(makestandin(pat))
 
-        try:
-            origcopyfile = util.copyfile
-            copiedfiles = []
-            def override_copyfile(src, dest):
-                if lfutil.shortname in src and lfutil.shortname in dest:
-                    destlfile = dest.replace(lfutil.shortname, '')
-                    if not opts['force'] and os.path.exists(destlfile):
-                        raise IOError('',
-                            _('destination largefile already exists'))
-                copiedfiles.append((src, dest))
-                origcopyfile(src, dest)
+            try:
+                origcopyfile = util.copyfile
+                copiedfiles = []
+                def override_copyfile(src, dest):
+                    if lfutil.shortname in src and lfutil.shortname in dest:
+                        destlfile = dest.replace(lfutil.shortname, '')
+                        if not opts['force'] and os.path.exists(destlfile):
+                            raise IOError('',
+                                _('destination largefile already exists'))
+                    copiedfiles.append((src, dest))
+                    origcopyfile(src, dest)
 
-            util.copyfile = override_copyfile
-            result += orig(ui, repo, listpats, opts, rename)
-        finally:
-            util.copyfile = origcopyfile
+                util.copyfile = override_copyfile
+                result += orig(ui, repo, listpats, opts, rename)
+            finally:
+                util.copyfile = origcopyfile
 
-        lfdirstate = lfutil.openlfdirstate(ui, repo)
-        for (src, dest) in copiedfiles:
-            if lfutil.shortname in src and lfutil.shortname in dest:
-                srclfile = src.replace(lfutil.shortname, '')
-                destlfile = dest.replace(lfutil.shortname, '')
-                destlfiledir = os.path.dirname(destlfile) or '.'
-                if not os.path.isdir(destlfiledir):
-                    os.makedirs(destlfiledir)
-                if rename:
-                    os.rename(srclfile, destlfile)
-                    lfdirstate.remove(os.path.relpath(srclfile,
-                        repo.root))
-                else:
-                    util.copyfile(srclfile, destlfile)
-                lfdirstate.add(os.path.relpath(destlfile,
-                    repo.root))
-        lfdirstate.write()
-    except util.Abort, e:
-        if str(e) != 'no files to copy':
-            raise e
-        else:
-            nolfiles = True
+            lfdirstate = lfutil.openlfdirstate(ui, repo)
+            for (src, dest) in copiedfiles:
+                if lfutil.shortname in src and lfutil.shortname in dest:
+                    srclfile = src.replace(lfutil.shortname, '')
+                    destlfile = dest.replace(lfutil.shortname, '')
+                    destlfiledir = os.path.dirname(destlfile) or '.'
+                    if not os.path.isdir(destlfiledir):
+                        os.makedirs(destlfiledir)
+                    if rename:
+                        os.rename(srclfile, destlfile)
+                        lfdirstate.remove(repo.wjoin(srclfile))
+                    else:
+                        util.copyfile(srclfile, destlfile)
+                    lfdirstate.add(repo.wjoin(destlfile))
+            lfdirstate.write()
+        except util.Abort, e:
+            if str(e) != 'no files to copy':
+                raise e
+            else:
+                nolfiles = True
     finally:
         restorematchfn()
         wlock.release()
@@ -447,16 +440,12 @@
         try:
             ctx = repo[opts.get('rev')]
             oldmatch = None # for the closure
-            def override_match(ctxorrepo, pats=[], opts={}, globbed=False,
+            def override_match(ctx, pats=[], opts={}, globbed=False,
                     default='relpath'):
-                if util.safehasattr(ctxorrepo, 'match'):
-                    ctx0 = ctxorrepo
-                else:
-                    ctx0 = ctxorrepo[None]
-                match = oldmatch(ctxorrepo, pats, opts, globbed, default)
+                match = oldmatch(ctx, pats, opts, globbed, default)
                 m = copy.copy(match)
                 def tostandin(f):
-                    if lfutil.standin(f) in ctx0 or lfutil.standin(f) in ctx:
+                    if lfutil.standin(f) in ctx or lfutil.standin(f) in ctx:
                         return lfutil.standin(f)
                     elif lfutil.standin(f) in repo[None]:
                         return None
@@ -828,3 +817,8 @@
             lfdirstate.add(file)
     lfdirstate.write()
     return result
+
+def override_transplant(orig, ui, repo, *revs, **opts):
+    result = orig(ui, repo, *revs, **opts)
+    lfcommands.updatelfiles(repo.ui, repo)
+    return result
--- a/hgext/largefiles/proto.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/largefiles/proto.py	Tue Nov 01 16:49:30 2011 -0500
@@ -4,7 +4,6 @@
 # GNU General Public License version 2 or any later version.
 
 import os
-import tempfile
 import urllib2
 
 from mercurial import error, httprepo, util, wireproto
@@ -17,25 +16,27 @@
                            'file.\n')
 
 def putlfile(repo, proto, sha):
-    '''Put a largefile into a repository's local cache and into the
-    system cache.'''
-    f = None
+    '''Put a largefile into a repository's local store and into the
+    user cache.'''
     proto.redirect()
+
+    fd, tmpname = lfutil.mkstemp(repo, prefix='hg-putlfile')
+    tmpfp = os.fdopen(fd, 'wb+')
     try:
         try:
-            f = tempfile.NamedTemporaryFile(mode='wb+', prefix='hg-putlfile-')
-            proto.getfile(f)
-            f.seek(0)
-            if sha != lfutil.hexsha1(f):
+            proto.getfile(tmpfp)
+            tmpfp.seek(0)
+            if sha != lfutil.hexsha1(tmpfp):
                 return wireproto.pushres(1)
-            lfutil.copytocacheabsolute(repo, f.name, sha)
-        except IOError:
-            repo.ui.warn(
-                _('error: could not put received data into largefile store'))
+            tmpfp.close()
+            lfutil.copytostoreabsolute(repo, tmpname, sha)
+        except IOError, e:
+            repo.ui.warn(_('largefiles: failed to put %s (%s) into store: %s') %
+                         (sha, tmpname, e.strerror))
             return wireproto.pushres(1)
     finally:
-        if f:
-            f.close()
+        tmpfp.close()
+        os.unlink(tmpname)
 
     return wireproto.pushres(0)
 
--- a/hgext/largefiles/reposetup.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/largefiles/reposetup.py	Tue Nov 01 16:49:30 2011 -0500
@@ -12,8 +12,7 @@
 import os
 import re
 
-from mercurial import context, error, manifest, match as match_, \
-        node, util
+from mercurial import context, error, manifest, match as match_, node, util
 from mercurial.i18n import _
 
 import lfcommands
@@ -229,7 +228,7 @@
             for filename in ctx.files():
                 if lfutil.isstandin(filename) and filename in ctx.manifest():
                     realfile = lfutil.splitstandin(filename)
-                    lfutil.copytocache(self, ctx.node(), realfile)
+                    lfutil.copytostore(self, ctx.node(), realfile)
 
             return node
 
@@ -347,7 +346,7 @@
                         fstandin += os.sep
 
                     # prevalidate matching standin directories
-                    if lfutil.any_(st for st in match._files
+                    if util.any(st for st in match._files
                                    if st.startswith(fstandin)):
                         continue
                     actualfiles.append(f)
@@ -401,16 +400,10 @@
     repo.__class__ = lfiles_repo
 
     def checkrequireslfiles(ui, repo, **kwargs):
-        if 'largefiles' not in repo.requirements and lfutil.any_(
+        if 'largefiles' not in repo.requirements and util.any(
                 lfutil.shortname+'/' in f[0] for f in repo.store.datafiles()):
-            # workaround bug in Mercurial 1.9 whereby requirements is
-            # a list on newly-cloned repos
-            repo.requirements = set(repo.requirements)
-
-            repo.requirements |= set(['largefiles'])
+            repo.requirements.add('largefiles')
             repo._writerequirements()
 
-    checkrequireslfiles(ui, repo)
-
     ui.setconfig('hooks', 'changegroup.lfiles', checkrequireslfiles)
     ui.setconfig('hooks', 'commit.lfiles', checkrequireslfiles)
--- a/hgext/largefiles/uisetup.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/largefiles/uisetup.py	Tue Nov 01 16:49:30 2011 -0500
@@ -9,7 +9,7 @@
 '''setup for largefiles extension: uisetup'''
 
 from mercurial import archival, cmdutil, commands, extensions, filemerge, hg, \
-    httprepo, localrepo, sshrepo, sshserver, util, wireproto
+    httprepo, localrepo, sshrepo, sshserver, wireproto
 from mercurial.i18n import _
 from mercurial.hgweb import hgweb_mod, protocol
 
@@ -23,7 +23,7 @@
     entry = extensions.wrapcommand(commands.table, 'add',
                                    overrides.override_add)
     addopt = [('', 'large', None, _('add as largefile')),
-            ('', 'lfsize', '', _('add all files above this size (in megabytes)'
+            ('', 'lfsize', '', _('add all files above this size (in megabytes) '
                                  'as largefiles (default: 10)'))]
     entry[1].extend(addopt)
 
@@ -82,12 +82,8 @@
     extensions.wrapfunction(hg, 'merge', overrides.hg_merge)
 
     extensions.wrapfunction(archival, 'archive', overrides.override_archive)
-    if util.safehasattr(cmdutil, 'bailifchanged'):
-        extensions.wrapfunction(cmdutil, 'bailifchanged',
-            overrides.override_bailifchanged)
-    else:
-        extensions.wrapfunction(cmdutil, 'bail_if_changed',
-            overrides.override_bailifchanged)
+    extensions.wrapfunction(cmdutil, 'bailifchanged',
+                            overrides.override_bailifchanged)
 
     # create the new wireproto commands ...
     wireproto.commands['putlfile'] = (proto.putlfile, 'sha')
@@ -136,3 +132,6 @@
         if name == 'rebase':
             extensions.wrapcommand(getattr(module, 'cmdtable'), 'rebase',
                 overrides.override_rebase)
+        if name == 'transplant':
+            extensions.wrapcommand(getattr(module, 'cmdtable'), 'transplant',
+                overrides.override_transplant)
--- a/hgext/largefiles/usage.txt	Wed Oct 26 22:35:15 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-Largefiles allows for tracking large, incompressible binary files in Mercurial
-without requiring excessive bandwidth for clones and pulls.  Files added as
-largefiles are not tracked directly by Mercurial; rather, their revisions are
-identified by a checksum, and Mercurial tracks these checksums.  This way, when
-you clone a repository or pull in changesets, the large files in older
-revisions of the repository are not needed, and only the ones needed to update
-to the current version are downloaded.  This saves both disk space and
-bandwidth.
-
-If you are starting a new repository or adding new large binary files, using
-largefiles for them is as easy as adding '--large' to your hg add command.  For
-example:
-
-$ dd if=/dev/urandom of=thisfileislarge count=2000
-$ hg add --large thisfileislarge
-$ hg commit -m 'add thisfileislarge, which is large, as a largefile'
-
-When you push a changeset that affects largefiles to a remote repository, its
-largefile revisions will be uploaded along with it.  Note that the remote
-Mercurial must also have the largefiles extension enabled for this to work.
-
-When you pull a changeset that affects largefiles from a remote repository,
-nothing different from Mercurial's normal behavior happens.  However, when you
-update to such a revision, any largefiles needed by that revision are
-downloaded and cached if they have never been downloaded before.  This means
-that network access is required to update to revision you have not yet updated
-to.
-
-If you already have large files tracked by Mercurial without the largefiles
-extension, you will need to convert your repository in order to benefit from
-largefiles.  This is done with the 'hg lfconvert' command:
-
-$ hg lfconvert --size 10 oldrepo newrepo
-
-By default, in repositories that already have largefiles in them, any new file
-over 10MB will automatically be added as largefiles.  To change this
-threshhold, set [largefiles].size in your Mercurial config file to the minimum
-size in megabytes to track as a largefile, or use the --lfsize option to the
-add command (also in megabytes):
-
-[largefiles]
-size = 2
-
-$ hg add --lfsize 2
-
-The [largefiles].patterns config option allows you to specify specific
-space-separated filename patterns (in shell glob syntax) that should always be
-tracked as largefiles:
-
-[largefiles]
-pattens = *.jpg *.{png,bmp} library.zip content/audio/*
--- a/hgext/mq.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/mq.py	Tue Nov 01 16:49:30 2011 -0500
@@ -2614,8 +2614,6 @@
                 r.dirstate.drop(patch)
                 r.dirstate.add(name)
             else:
-                if r.dirstate[name] == 'r':
-                    wctx.undelete([name])
                 wctx.copy(patch, name)
                 wctx.forget([patch])
         finally:
--- a/hgext/rebase.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/hgext/rebase.py	Tue Nov 01 16:49:30 2011 -0500
@@ -162,10 +162,10 @@
                 raise util.Abort(_('cannot specify both a '
                                    'source and a base'))
             if revf and basef:
-                raise util.Abort(_('cannot specify both a'
+                raise util.Abort(_('cannot specify both a '
                                    'revision and a base'))
             if revf and srcf:
-                raise util.Abort(_('cannot specify both a'
+                raise util.Abort(_('cannot specify both a '
                                    'revision and a source'))
             if detachf:
                 if not srcf:
--- a/i18n/ja.po	Wed Oct 26 22:35:15 2011 +0200
+++ b/i18n/ja.po	Tue Nov 01 16:49:30 2011 -0500
@@ -30,6 +30,7 @@
 #
 # abort                 中断
 # add                   (構成管理への)追加登録
+# alias                 別名
 # apply                 適用
 # archive               アーカイブ
 # argument(, with no)   引数(指定が無い場合)
@@ -58,6 +59,7 @@
 # entry                 エントリ
 # extend(ed)            拡張
 # extension             (Mercurialの)エクステンション
+# glob(, rooted at ...) (... を起点とする)ワイルドカード形式
 # hash identifier(s)    ハッシュ値
 # head                  ヘッド
 # head changeset(s)     ヘッド
@@ -67,6 +69,7 @@
 # interrupt             中断
 # list of ....          列挙された..../.... の一覧
 # local (repo)          手元(のリポジトリ)
+# lock                  ロック
 # manifest              マニフェスト or 管理対象(一覧)
 # merge                 マージ
 # node                  リビジョン
@@ -104,7 +107,7 @@
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2011-09-21 15:49+0900\n"
+"POT-Creation-Date: 2011-10-30 23:25+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"
@@ -378,9 +381,15 @@
 msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")"
 msgstr ""
 
-#, python-format
-msgid "acl: access denied for changeset %s"
-msgstr "acl: チェンジセット %s のアクセスは拒否されました"
+#, fuzzy, python-format
+msgid "acl: user \"%s\" denied on \"%s\" (changeset \"%s\")"
+msgstr ""
+"acl: ユーザ \"%s\" はブランチ \"%s\" で拒否されました(リビジョン \"%s\")"
+
+#, fuzzy, python-format
+msgid "acl: user \"%s\" not allowed on \"%s\" (changeset \"%s\")"
+msgstr ""
+"acl: ユーザ \"%s\" はブランチ \"%s\" で拒否されました(リビジョン \"%s\")"
 
 msgid "hooks for integrating with the Bugzilla bug tracker"
 msgstr ""
@@ -915,7 +924,7 @@
 
 #, python-format
 msgid "skipping malformed alias: %s\n"
-msgstr "不正な形式のエイリアスは無視します: %s\n"
+msgstr "不正な形式の別名は無視します: %s\n"
 
 msgid "count rate for the specified revision or range"
 msgstr "処理対象とする特定リビジョン/範囲の指定"
@@ -1028,6 +1037,11 @@
 msgstr ""
 
 msgid ""
+"  tags.normal = green\n"
+"  tags.local = black bold"
+msgstr ""
+
+msgid ""
 "The available effects in terminfo mode are 'blink', 'bold', 'dim',\n"
 "'inverse', 'invisible', 'italic', 'standout', and 'underline'; in\n"
 "ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and\n"
@@ -1289,8 +1303,8 @@
 
 msgid ""
 "    :convert.hg.saverev: store original revision ID in changeset\n"
-"        (forces target IDs to change). It takes and boolean argument\n"
-"        and defaults to False."
+"        (forces target IDs to change). It takes a boolean argument and\n"
+"        defaults to False."
 msgstr ""
 
 msgid ""
@@ -2128,9 +2142,10 @@
 msgstr ""
 
 msgid ""
-"The extension uses an optional ``[eol]`` section in your hgrc file\n"
-"(not the ``.hgeol`` file) for settings that control the overall\n"
-"behavior. There are two settings:"
+"The extension uses an optional ``[eol]`` section read from both the\n"
+"normal Mercurial configuration files and the ``.hgeol`` file, with the\n"
+"latter overriding the former. You can use that section to control the\n"
+"overall behavior. There are three settings:"
 msgstr ""
 
 msgid ""
@@ -2149,6 +2164,12 @@
 msgstr ""
 
 msgid ""
+"- ``eol.fix-trailing-newline`` (default False) can be set to True to\n"
+"  ensure that converted files end with a EOL character (either ``\\n``\n"
+"  or ``\\r\\n`` as per the configured patterns)."
+msgstr ""
+
+msgid ""
 "The extension provides ``cleverencode:`` and ``cleverdecode:`` filters\n"
 "like the deprecated win32text extension does. This means that you can\n"
 "disable win32text and enable eol and your filters will still work. You\n"
@@ -2280,7 +2301,7 @@
 msgstr "%d 個のファイルのスナップショットを作業領域から生成中\n"
 
 msgid "cannot specify --rev and --change at the same time"
-msgstr "--rev と --change は同時には指定出来ません"
+msgstr "--rev と --change は同時には指定できません"
 
 msgid "cleaning up temp directory\n"
 msgstr "一時ディレクトリの整理をしています\n"
@@ -2385,7 +2406,7 @@
 
 msgid ""
 "working dir not at branch tip (use \"hg update\" to check out branch tip)"
-msgstr "作業領域はブランチの最新ではありません(:hg:`update` で最新に更新可能)"
+msgstr "作業領域はブランチの最新ではありません(\"hg update\" で最新に更新可能)"
 
 msgid "outstanding uncommitted merge"
 msgstr "マージが未コミットです"
@@ -2399,7 +2420,8 @@
 msgid ""
 "multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
 msgstr ""
-"ブランチに複数のヘッドがあります(:hg:`heads .` で確認、 :hg:`merge` でマージ)"
+"ブランチに複数のヘッドがあります(\"hg heads .\" で確認、\"hg merge\" でマー"
+"ジ)"
 
 #, python-format
 msgid "pulling from %s\n"
@@ -2408,14 +2430,15 @@
 msgid ""
 "Other repository doesn't support revision lookup, so a rev cannot be "
 "specified."
-msgstr "連携先でリビジョンが特定出来ないため、 リビジョンは指定できません"
+msgstr "連携先でリビジョンが特定できないため、 リビジョンは指定できません"
 
 #, python-format
 msgid ""
 "not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge"
 "\" to merge them)\n"
 msgstr ""
-"新規ヘッド %d 個はマージ未実施(:hg:`heads .` で確認、 :hg:`merge` でマージ)\n"
+"新規ヘッド %d 個はマージ未実施(\"hg heads .\" で確認、\"hg merge\" でマー"
+"ジ)\n"
 
 #, python-format
 msgid "updating to %d:%s\n"
@@ -2554,10 +2577,10 @@
 
 #, python-format
 msgid "-G/--graph option is incompatible with --%s"
-msgstr "-G/--graph と --%s は併用出来ません"
+msgstr "-G/--graph と --%s は併用できません"
 
 msgid "-G/--graph option is incompatible with --follow with file argument"
-msgstr "-G/--graph と、ファイル名指定付きの --follow は併用出来ません"
+msgstr "-G/--graph と、ファイル名指定付きの --follow は併用できません"
 
 msgid "NUM"
 msgstr "数値"
@@ -2753,6 +2776,7 @@
 msgid "hg debug-merge-base REV REV"
 msgstr "hg debug-merge-base REV REV"
 
+#. i18n: bisect changeset status
 msgid "ignored"
 msgstr "無視しました"
 
@@ -3320,6 +3344,415 @@
 "    指定されたファイルに未コミット変更がある場合、 実行は中断されます。\n"
 "    "
 
+#, fuzzy
+msgid "track large binary files"
+msgstr "これはバイナリファイルです\n"
+
+msgid ""
+"Large binary files tend to be not very compressible, not very\n"
+"diffable, and not at all mergeable. Such files are not handled\n"
+"efficiently by Mercurial's storage format (revlog), which is based on\n"
+"compressed binary deltas; storing large binary files as regular\n"
+"Mercurial files wastes bandwidth and disk space and increases\n"
+"Mercurial's memory usage. The largefiles extension addresses these\n"
+"problems by adding a centralized client-server layer on top of\n"
+"Mercurial: largefiles live in a *central store* out on the network\n"
+"somewhere, and you only fetch the revisions that you need when you\n"
+"need them."
+msgstr ""
+
+msgid ""
+"largefiles works by maintaining a \"standin file\" in .hglf/ for each\n"
+"largefile. The standins are small (41 bytes: an SHA-1 hash plus\n"
+"newline) and are tracked by Mercurial. Largefile revisions are\n"
+"identified by the SHA-1 hash of their contents, which is written to\n"
+"the standin. largefiles uses that revision ID to get/put largefile\n"
+"revisions from/to the central store. This saves both disk space and\n"
+"bandwidth, since you don't need to retrieve all historical revisions\n"
+"of large files when you clone or pull."
+msgstr ""
+
+msgid ""
+"To start a new repository or add new large binary files, just add\n"
+"--large to your :hg:`add` command. For example::"
+msgstr ""
+
+msgid ""
+"  $ dd if=/dev/urandom of=randomdata count=2000\n"
+"  $ hg add --large randomdata\n"
+"  $ hg commit -m 'add randomdata as a largefile'"
+msgstr ""
+
+msgid ""
+"When you push a changeset that adds/modifies largefiles to a remote\n"
+"repository, its largefile revisions will be uploaded along with it.\n"
+"Note that the remote Mercurial must also have the largefiles extension\n"
+"enabled for this to work."
+msgstr ""
+
+msgid ""
+"When you pull a changeset that affects largefiles from a remote\n"
+"repository, Mercurial behaves as normal. However, when you update to\n"
+"such a revision, any largefiles needed by that revision are downloaded\n"
+"and cached (if they have never been downloaded before). This means\n"
+"that network access may be required to update to changesets you have\n"
+"not previously updated to."
+msgstr ""
+
+msgid ""
+"If you already have large files tracked by Mercurial without the\n"
+"largefiles extension, you will need to convert your repository in\n"
+"order to benefit from largefiles. This is done with the\n"
+":hg:`lfconvert` command::"
+msgstr ""
+
+msgid "  $ hg lfconvert --size 10 oldrepo newrepo"
+msgstr ""
+
+msgid ""
+"In repositories that already have largefiles in them, any new file\n"
+"over 10MB will automatically be added as a largefile. To change this\n"
+"threshold, set ``largefiles.minsize`` in your Mercurial config file\n"
+"to the minimum size in megabytes to track as a largefile, or use the\n"
+"--lfsize option to the add command (also in megabytes)::"
+msgstr ""
+
+msgid ""
+"  [largefiles]\n"
+"  minsize = 2"
+msgstr ""
+
+msgid "  $ hg add --lfsize 2"
+msgstr ""
+
+msgid ""
+"The ``largefiles.patterns`` config option allows you to specify a list\n"
+"of filename patterns (see :hg:`help patterns`) that should always be\n"
+"tracked as largefiles::"
+msgstr ""
+
+msgid ""
+"  [largefiles]\n"
+"  patterns =\n"
+"    *.jpg\n"
+"    re:.*\\.(png|bmp)$\n"
+"    library.zip\n"
+"    content/audio/*"
+msgstr ""
+
+msgid ""
+"Files that match one of these patterns will be added as largefiles\n"
+"regardless of their size.\n"
+msgstr ""
+
+#, fuzzy
+msgid "convert a normal repository to a largefiles repository"
+msgstr "別 SCM のリポジトリから Mercurial リポジトリへの変換"
+
+msgid ""
+"    Convert repository SOURCE to a new repository DEST, identical to\n"
+"    SOURCE except that certain files will be converted as largefiles:\n"
+"    specifically, any file that matches any PATTERN *or* whose size is\n"
+"    above the minimum size threshold is converted as a largefile. The\n"
+"    size used to determine whether or not to track a file as a\n"
+"    largefile is the size of the first version of the file. The\n"
+"    minimum size can be specified either with --size or in\n"
+"    configuration as ``largefiles.size``."
+msgstr ""
+
+msgid ""
+"    After running this command you will need to make sure that\n"
+"    largefiles is enabled anywhere you intend to push the new\n"
+"    repository."
+msgstr ""
+
+msgid ""
+"    Use --to-normal to convert largefiles back to normal files; after\n"
+"    this, the DEST repository can be used without largefiles at all."
+msgstr ""
+
+#, fuzzy
+msgid "getting largefiles"
+msgstr "ファイルの取得中"
+
+#, fuzzy, python-format
+msgid "getting %s:%s\n"
+msgstr "%s を取得しています\n"
+
+#, python-format
+msgid "%s: data corruption (expected %s, got %s)\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "searching %d changesets for largefiles\n"
+msgstr "類似ファイルを探索中"
+
+#, python-format
+msgid "verified contents of %d revisions of %d largefiles\n"
+msgstr ""
+
+#, python-format
+msgid "verified existence of %d revisions of %d largefiles\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "unsupported URL scheme %r"
+msgstr "URL 要素 \"%s\" は未サポートです"
+
+#, fuzzy, python-format
+msgid "%s does not appear to be a largefile store"
+msgstr "'%s' は Mercurial リポジトリ形式とは思われません"
+
+#, fuzzy, python-format
+msgid "%s is not a local Mercurial repo"
+msgstr "%s はローカルの Mercurial リポジトリではありません"
+
+#, fuzzy, python-format
+msgid "initializing destination %s\n"
+msgstr "変換先リポジトリ %s の初期化中\n"
+
+#, fuzzy
+msgid "converting revisions"
+msgstr "リビジョンの表示"
+
+#, python-format
+msgid "Renamed/copied largefile %s becomes symlink"
+msgstr ""
+
+#, python-format
+msgid "largefile %s becomes symlink"
+msgstr ""
+
+msgid "uploading largefiles"
+msgstr ""
+
+#, python-format
+msgid "largefile %s missing from store (needs to be uploaded)"
+msgstr ""
+
+#, fuzzy
+msgid "getting changed largefiles\n"
+msgstr "ファイルの取得中"
+
+#, python-format
+msgid "%d largefiles updated, %d removed\n"
+msgstr ""
+
+msgid "minimum size (MB) for files to be converted as largefiles"
+msgstr ""
+
+msgid "convert from a largefiles repo to a normal repo"
+msgstr ""
+
+#, fuzzy
+msgid "hg lfconvert SOURCE DEST [FILE ...]"
+msgstr "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+
+#, python-format
+msgid "largefiles: size must be number (not %s)\n"
+msgstr ""
+
+msgid "minimum size for largefiles must be specified"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "unknown operating system: %s\n"
+msgstr "未知のパッチです: %s\n"
+
+#, fuzzy, python-format
+msgid "Found %s in store\n"
+msgstr "%s が %r にありました\n"
+
+#, python-format
+msgid "Found %s in system cache\n"
+msgstr ""
+
+#, python-format
+msgid "bad hash in '%s' (only %d bytes long)"
+msgstr ""
+
+msgid "Can't get file locally"
+msgstr ""
+
+#, python-format
+msgid ""
+"changeset %s: %s missing\n"
+"  (looked for hash %s)\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"changeset %s: %s: contents differ\n"
+"  (%s:\n"
+"  expected hash %s,\n"
+"  but got %s)\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "%s already a largefile\n"
+msgstr "%s は登録済です!\n"
+
+#, fuzzy, python-format
+msgid "adding %s as a largefile\n"
+msgstr "パッチ %s を追加中\n"
+
+msgid "no files specified"
+msgstr "ファイル名指定がありません"
+
+#, fuzzy, python-format
+msgid "not removing %s: %s (use -f to force removal)\n"
+msgstr ""
+"%s は削除されません: ファイルは改変されています(削除の強行は -f を指定)\n"
+
+#, fuzzy
+msgid "file still exists"
+msgstr "ファイル %s は既に存在します\n"
+
+#, fuzzy
+msgid "file is modified"
+msgstr "変更ファイル数     %d"
+
+#, fuzzy
+msgid "file has been marked for add"
+msgstr "%s: コピー失敗 - 削除予定のファイルです\n"
+
+#, python-format
+msgid "removing %s\n"
+msgstr "%s を登録除外中\n"
+
+msgid "uncommitted local changes"
+msgstr "作業領域に未コミットの変更があります"
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr "%s と %s を %s にマージ中\n"
+
+#, python-format
+msgid "merging %s\n"
+msgstr "%s をマージ中\n"
+
+#, fuzzy, python-format
+msgid ""
+"largefile %s has a merge conflict\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+" %s のマージに適切なツールが見つかりません\n"
+"どちらの内容を採用しますか? 作業領域:(l)ocal マージ対象:(o)ther"
+
+msgid "&Local"
+msgstr "&Local"
+
+msgid "&Other"
+msgstr "&Other"
+
+#, fuzzy
+msgid "destination largefile already exists"
+msgstr "複製先 '%s' は既に存在します"
+
+msgid "no files to copy"
+msgstr "コピーするファイルがありません"
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr "未知のアーカイブ種別 '%s'"
+
+msgid "cannot give prefix when archiving to files"
+msgstr "アーカイブにファイルを追加するときは接頭辞を指定できません"
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr "%s は削除されません: 既に構成管理対象ではありません\n"
+
+#, fuzzy
+msgid "largefiles: No remote repo\n"
+msgstr "ローカルリポジトリ以外は検証できません"
+
+msgid "largefiles to upload:\n"
+msgstr ""
+
+#, python-format
+msgid "largefiles: %d to upload\n"
+msgstr ""
+
+msgid "addremove cannot be run on a repo with largefiles"
+msgstr ""
+
+msgid "error: could not put received data into largefile store"
+msgstr ""
+
+#, python-format
+msgid "requested largefile %s not present in cache"
+msgstr ""
+
+#, fuzzy
+msgid "putlfile failed:"
+msgstr "フィルターに失敗"
+
+#, fuzzy
+msgid "putlfile failed (unexpected response):"
+msgstr "履歴反映に失敗(未知のレスポンス):"
+
+msgid "unexpected response:"
+msgstr "未知の応答:"
+
+#, python-format
+msgid "remotestore: could not put %s to remote store %s"
+msgstr ""
+
+#, python-format
+msgid "remotestore: put %s to remote store %s"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "remotestore: could not open file %s: %s"
+msgstr "変換ファイル %r を開くことができません: %s"
+
+#, python-format
+msgid "remotestore: largefile %s is invalid"
+msgstr ""
+
+#, python-format
+msgid "remotestore: largefile %s is missing"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "changeset %s: %s: contents differ\n"
+msgstr "リビジョン %d:%s: %s\n"
+
+#, fuzzy, python-format
+msgid "changeset %s: %s missing\n"
+msgstr "リビジョン %d:%s: %s\n"
+
+#, python-format
+msgid ""
+"largefiles: repo method %r appears to have already been wrapped by another "
+"extension: largefiles may behave incorrectly\n"
+msgstr ""
+
+#, python-format
+msgid "file \"%s\" is a largefile standin"
+msgstr ""
+
+msgid "add as largefile"
+msgstr ""
+
+msgid ""
+"add all files above this size (in megabytes) as largefiles (default: 10)"
+msgstr ""
+
+msgid "verify largefiles"
+msgstr ""
+
+msgid "verify all revisions of largefiles not just current"
+msgstr ""
+
+msgid "verify largefile contents not just existence"
+msgstr ""
+
+#, fuzzy
+msgid "display outgoing largefiles"
+msgstr "当該スタイルで表示をカスタマイズ"
+
 msgid "manage a stack of patches"
 msgstr "パッチ併用の管理"
 
@@ -3565,11 +3998,11 @@
 
 #, python-format
 msgid "patch name cannot begin with \"%s\""
-msgstr "パッチ名の最初の文字に \"%s\" は使用出来ません"
+msgstr "パッチ名の最初の文字に \"%s\" は使用できません"
 
 #, python-format
 msgid "\"%s\" cannot be used in the name of a patch"
-msgstr "\"%s\" を含む名前はパッチ名に使用出来ません"
+msgstr "\"%s\" を含む名前はパッチ名に使用できません"
 
 #, python-format
 msgid "\"%s\" already exists as a directory"
@@ -4487,6 +4920,11 @@
 msgid "copy %s to %s\n"
 msgstr "%s から %s に複製します\n"
 
+msgid ""
+"strip specified revision (optional, can specify revisions without this "
+"option)"
+msgstr "指定リビジョンの削除 (本オプション無しでもリビジョン指定可能)"
+
 msgid "force removal of changesets, discard uncommitted changes (no backup)"
 msgstr "リビジョンを強制的に削除し、 未コミット変更内容を破棄(保存無し)"
 
@@ -4715,6 +5153,9 @@
 msgid "list all available queues"
 msgstr "有効なキューの一覧表示"
 
+msgid "print name of active queue"
+msgstr "アクティブなキュー名の表示"
+
 msgid "create new queue"
 msgstr "新規キューの作成"
 
@@ -4745,12 +5186,15 @@
 "registered\n"
 "    queues - by default the \"normal\" patches queue is registered. The "
 "currently\n"
-"    active queue will be marked with \"(active)\"."
+"    active queue will be marked with \"(active)\". Specifying --active will "
+"print\n"
+"    only the name of the active queue."
 msgstr ""
 "    キュー名称を指定しないか、 -l/--list が指定された場合、 登録済みの\n"
 "    キューの一覧が表示されます - 通常は \"normal\" パッチキューが登録\n"
 "    済みです。 当該時点でアクティブなキューには \"(アクティブ)\" が表示\n"
-"    されます。"
+"    されます。 --active が指定された場合、 表示対象となるキューは、\n"
+"    アクティブなキューのみです"
 
 msgid ""
 "    To create a new queue, use -c/--create. The queue is automatically made\n"
@@ -4851,94 +5295,179 @@
 msgid "operate on patch repository"
 msgstr "パッチ管理リポジトリへの操作"
 
-msgid "hooks for sending email notifications at commit/push time"
+#, fuzzy
+msgid "hooks for sending email push notifications"
 msgstr "commit/push 契機でのメール通知用フック集"
 
 msgid ""
-"Subscriptions can be managed through a hgrc file. Default mode is to\n"
-"print messages to stdout, for testing and configuring."
-msgstr ""
-
-msgid ""
-"To use, configure the notify extension and enable it in hgrc like\n"
-"this::"
-msgstr ""
-
-msgid ""
-"  [extensions]\n"
-"  notify ="
+"This extension let you run hooks sending email notifications when\n"
+"changesets are being pushed, from the sending or receiving side."
+msgstr ""
+
+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"
+"are run by the changesets receiver while the ``outgoing`` one is for\n"
+"the sender::"
 msgstr ""
 
 msgid ""
 "  [hooks]\n"
 "  # one email for each incoming changeset\n"
 "  incoming.notify = python:hgext.notify.hook\n"
-"  # batch emails when many changesets incoming at one time\n"
-"  changegroup.notify = python:hgext.notify.hook\n"
-"  # batch emails when many changesets outgoing at one time (client side)\n"
+"  # one email for all incoming changesets\n"
+"  changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+
+msgid ""
+"  # one email for all outgoing changesets\n"
 "  outgoing.notify = python:hgext.notify.hook"
 msgstr ""
 
 msgid ""
-"  [notify]\n"
-"  # config items go here"
-msgstr ""
-
-msgid "Required configuration items::"
-msgstr ""
-
-msgid "  config = /path/to/file # file containing subscriptions"
-msgstr ""
-
-msgid "Optional configuration items::"
-msgstr ""
-
-msgid ""
-"  test = True            # print messages to stdout for testing\n"
-"  strip = 3              # number of slashes to strip for url paths\n"
-"  domain = example.com   # domain to use if committer missing domain\n"
-"  style = ...            # style file to use when formatting email\n"
-"  template = ...         # template to use when formatting email\n"
-"  incoming = ...         # template to use when run as incoming hook\n"
-"  outgoing = ...         # template to use when run as outgoing hook\n"
-"  changegroup = ...      # template to use when run as changegroup hook\n"
-"  maxdiff = 300          # max lines of diffs to include (0=none, -1=all)\n"
-"  maxsubject = 67        # truncate subject line longer than this\n"
-"  diffstat = True        # add a diffstat before the diff content\n"
-"  sources = serve        # notify if source of incoming changes in this "
-"list\n"
-"                         # (serve == ssh or http, push, pull, bundle)\n"
-"  merge = False          # send notification for merges (default True)\n"
-"  [email]\n"
-"  from = user@host.com   # email address to send as if none given\n"
-"  [web]\n"
-"  baseurl = http://hgserver/... # root of hg web site for browsing commits"
-msgstr ""
-
-msgid ""
-"The notify config file has same format as a regular hgrc file. It has\n"
-"two sections so you can express subscriptions in whatever way is\n"
-"handier for you."
+"Now the hooks are running, subscribers must be assigned to\n"
+"repositories. Use the ``[usersubs]`` section to map repositories to a\n"
+"given email or the ``[reposubs]`` section to map emails to a single\n"
+"repository::"
 msgstr ""
 
 msgid ""
 "  [usersubs]\n"
-"  # key is subscriber email, value is \",\"-separated list of glob patterns\n"
+"  # key is subscriber email, value is a comma-separated list of glob\n"
+"  # patterns\n"
 "  user@host = pattern"
 msgstr ""
 
 msgid ""
 "  [reposubs]\n"
-"  # key is glob pattern, value is \",\"-separated list of subscriber emails\n"
+"  # key is glob pattern, value is a comma-separated list of subscriber\n"
+"  # emails\n"
 "  pattern = user@host"
 msgstr ""
 
-msgid "Glob patterns are matched against path to repository root."
-msgstr ""
-
-msgid ""
-"If you like, you can put notify config file in repository that users\n"
-"can push changes to, they can manage their own subscriptions.\n"
+msgid ""
+"Glob patterns are matched against absolute path to repository\n"
+"root. The subscriptions can be defined in their own file and\n"
+"referenced with::"
+msgstr ""
+
+msgid ""
+"  [notify]\n"
+"  config = /path/to/subscriptionsfile"
+msgstr ""
+
+msgid ""
+"Alternatively, they can be added to Mercurial configuration files by\n"
+"setting the previous entry to an empty value."
+msgstr ""
+
+msgid ""
+"At this point, notifications should be generated but will not be sent until "
+"you\n"
+"set the ``notify.test`` entry to ``False``."
+msgstr ""
+
+msgid ""
+"Notifications content can be tweaked with the following configuration "
+"entries:"
+msgstr ""
+
+msgid ""
+"notify.test\n"
+"  If ``True``, print messages to stdout instead of sending them. Default: "
+"True."
+msgstr ""
+
+msgid ""
+"notify.sources\n"
+"  Space separated list of change sources. Notifications are sent only\n"
+"  if it includes the incoming or outgoing changes source. Incoming\n"
+"  sources can be ``serve`` for changes coming from http or ssh,\n"
+"  ``pull`` for pulled changes, ``unbundle`` for changes added by\n"
+"  :hg:`unbundle` or ``push`` for changes being pushed\n"
+"  locally. Outgoing sources are the same except for ``unbundle`` which\n"
+"  is replaced by ``bundle``. Default: serve."
+msgstr ""
+
+msgid ""
+"notify.strip\n"
+"  Number of leading slashes to strip from url paths. By default, "
+"notifications\n"
+"  references repositories with their absolute path. ``notify.strip`` let "
+"you\n"
+"  turn them into relative paths. For example, ``notify.strip=3`` will "
+"change\n"
+"  ``/long/path/repository`` into ``repository``. Default: 0."
+msgstr ""
+
+msgid ""
+"notify.domain\n"
+"  If subscribers emails or the from email have no domain set, complete them\n"
+"  with this value."
+msgstr ""
+
+msgid ""
+"notify.style\n"
+"  Style file to use when formatting emails."
+msgstr ""
+
+msgid ""
+"notify.template\n"
+"  Template to use when formatting emails."
+msgstr ""
+
+msgid ""
+"notify.incoming\n"
+"  Template to use when run as incoming hook, override ``notify.template``."
+msgstr ""
+
+msgid ""
+"notify.outgoing\n"
+"  Template to use when run as outgoing hook, override ``notify.template``."
+msgstr ""
+
+msgid ""
+"notify.changegroup\n"
+"  Template to use when running as changegroup hook, override\n"
+"  ``notify.template``."
+msgstr ""
+
+msgid ""
+"notify.maxdiff\n"
+"  Maximum number of diff lines to include in notification email. Set to 0\n"
+"  to disable the diff, -1 to include all of it. Default: 300."
+msgstr ""
+
+msgid ""
+"notify.maxsubject\n"
+"  Maximum number of characters in emails subject line. Default: 67."
+msgstr ""
+
+msgid ""
+"notify.diffstat\n"
+"  Set to True to include a diffstat before diff content. Default: True."
+msgstr ""
+
+msgid ""
+"notify.merge\n"
+"  If True, send notifications for merge changesets. Default: True."
+msgstr ""
+
+msgid ""
+"If set, the following entries will also be used to customize the "
+"notifications:"
+msgstr ""
+
+msgid ""
+"email.from\n"
+"  Email ``From`` address to use if none can be found in generated email "
+"content."
+msgstr ""
+
+msgid ""
+"web.baseurl\n"
+"  Root repository browsing URL to combine with repository paths when making\n"
+"  references. See also ``notify.strip``."
 msgstr ""
 
 #, python-format
@@ -5121,14 +5650,8 @@
 "互換のメール送信プログラムを指定することもできれば、 [smtp] セクションに\n"
 "必要な情報を記述することで、 外部プログラムの助けを借りずに Mercurial から\n"
 "直接パッチ爆弾を送信することも可能です。 これらのセクションに関する詳細は\n"
-"設定ファイルに関するドキュメント(hgrc(5))を参照してください。\n"
-
-#, python-format
-msgid "%s Please enter a valid value"
-msgstr "%s 適切な値を入力してください"
-
-msgid "Please enter a valid value.\n"
-msgstr "適切な値を入力してください。\n"
+"設定ファイルに関するドキュメント (hgrc(5)) を参照してください。\n"
+"(訳注: :hg:`help config` でも参照可能)\n"
 
 msgid "send patches as attachments"
 msgstr "添付ファイルとしてパッチを送信"
@@ -5300,7 +5823,7 @@
 "    送信されるメールの内容が表示されます。\n"
 "    PAGER 環境変数が設定されている場合、 パッチ爆弾を構成する\n"
 "    メールごとに、 環境変数に設定されたプログラムが起動されますので、\n"
-"    内容を確認することが出来ます。"
+"    内容を確認することができます。"
 
 msgid ""
 "    In case email sending fails, you will find a backup of your series\n"
@@ -5364,8 +5887,8 @@
 "    "
 msgstr ""
 "    本コマンドを使用する前に、 設定ファイルに電子メール関連設定を記述する\n"
-"    必要があります。 設定ファイルに関するドキュメント(hgrc(5))を参照して\n"
-"    ください。\n"
+"    必要があります。 設定ファイルに関するドキュメント (hgrc(5))\n"
+"    を参照してください。 (訳注: :hg:`help config` でも参照可能)\n"
 "    "
 
 #, python-format
@@ -5398,6 +5921,9 @@
 msgid "This patch series consists of %d patches."
 msgstr "一連のパッチは %d 個のパッチから構成されています。"
 
+msgid "no recipient addresses provided"
+msgstr ""
+
 msgid ""
 "\n"
 "Final summary:"
@@ -5448,6 +5974,9 @@
 msgid ""
 "  [progress]\n"
 "  delay = 3 # number of seconds (float) before showing the progress bar\n"
+"  changedelay = 1 # changedelay: minimum delay before showing a new topic.\n"
+"                  # If set to less than 3 * refresh, that value will\n"
+"                  # be used instead.\n"
 "  refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
 "  format = topic bar number estimate # format of the progress bar\n"
 "  width = <none> # if set, the maximum width of the progress information\n"
@@ -5598,6 +6127,10 @@
 "ancestor of base and dest)"
 msgstr "指定リビジョンの先祖から移動 (移動先との共通祖先まで遡ります)"
 
+#, fuzzy
+msgid "rebase these revisions"
+msgstr "指定リビジョンの解析"
+
 msgid "rebase onto the specified changeset"
 msgstr "複製先リビジョン"
 
@@ -5607,6 +6140,9 @@
 msgid "use text as collapse commit message"
 msgstr "指定テキストを要約コミットメッセージとして使用"
 
+msgid "invoke editor on commit messages"
+msgstr "コミットメッセージ入力にエディタを起動"
+
 msgid "read collapse commit message from file"
 msgstr "要約コミットメッセージをファイルから読み込み"
 
@@ -5749,14 +6285,29 @@
 msgid "tool option will be ignored\n"
 msgstr ""
 
+#, fuzzy
+msgid "cannot specify both a source and a base"
+msgstr "--soruce と --base は併用できません"
+
 msgid "cannot specify both a revision and a base"
 msgstr "--soruce と --base は併用できません"
 
+#, fuzzy
+msgid "cannot specify both a revision and a source"
+msgstr "--soruce と --base は併用できません"
+
 msgid "detach requires a revision to be specified"
 msgstr "--detach にはリビジョン指定が必要です"
 
 msgid "cannot specify a base with detach"
-msgstr "--base と --detach は同時には指定出来ません"
+msgstr "--base と --detach は同時には指定できません"
+
+msgid "can't remove original changesets with unrebased descendants"
+msgstr ""
+
+#, fuzzy
+msgid "use --keep to keep original changesets"
+msgstr "元リビジョンを維持"
 
 msgid "nothing to rebase\n"
 msgstr "リベースの必要はありません\n"
@@ -5809,14 +6360,18 @@
 msgid "cannot rebase onto an applied mq patch"
 msgstr "MQ パッチ上へのリベースはできません"
 
+#, fuzzy
+msgid "no matching revisions"
+msgstr "合致するガードはありません"
+
+msgid "can't rebase multiple roots"
+msgstr ""
+
 msgid "source is ancestor of destination"
 msgstr "移動元は移動先の先祖です"
 
-msgid "source is descendant of destination"
-msgstr "移動元は移動先の子孫です"
-
 msgid "--tool can only be used with --rebase"
-msgstr "--tool は --rebase 指定時にしか使用出来ません"
+msgstr "--tool は --rebase 指定時にしか使用できません"
 
 msgid "rebase working directory to branch head"
 msgstr "作業領域をブランチヘッドにリベース"
@@ -6143,6 +6698,19 @@
 "    "
 msgstr ""
 
+#, fuzzy
+msgid "convert a shared repository to a normal one"
+msgstr "別 SCM のリポジトリから Mercurial リポジトリへの変換"
+
+msgid ""
+"    Copy the store data to the repo and remove the sharedpath data.\n"
+"    "
+msgstr ""
+
+#, fuzzy
+msgid "this is not a shared repo"
+msgstr "%s は %s の親リビジョンではありません"
+
 msgid "do not create a working copy"
 msgstr "作業領域の更新を抑止します"
 
@@ -6621,17 +7189,14 @@
 msgid "archive prefix contains illegal components"
 msgstr "アーカイブの接頭辞が不正なコンポーネントを含みます"
 
-msgid "cannot give prefix when archiving to files"
-msgstr "アーカイブにファイルを追加するときは接頭辞を指定できません"
-
-#, python-format
-msgid "unknown archive type '%s'"
-msgstr "未知のアーカイブ種別 '%s'"
-
 msgid "archiving"
 msgstr "アーカイブ中"
 
 #, python-format
+msgid "malformed line in .hg/bookmarks: %r\n"
+msgstr ""
+
+#, python-format
 msgid "bookmark '%s' contains illegal character"
 msgstr "ブックマーク '%s' は不正な文字を含んでいます"
 
@@ -6690,6 +7255,10 @@
 msgid "the name '%s' is reserved"
 msgstr "タグ名 '%s' はシステムで予約されています"
 
+#, python-format
+msgid "uncommitted changes in subrepo %s"
+msgstr "副リポジトリ %s に未コミット変更があります"
+
 msgid "options --message and --logfile are mutually exclusive"
 msgstr "--message と --logfile は同時に指定できません"
 
@@ -6708,10 +7277,10 @@
 msgstr "出力ファイル名に不正なフォーマット '%%%s' 指定"
 
 msgid "cannot specify --changelog and --manifest at the same time"
-msgstr "--changelog と --manifest は同時には指定出来ません"
+msgstr "--changelog と --manifest は同時には指定できません"
 
 msgid "cannot specify filename with --changelog or --manifest"
-msgstr "--changelog ないし --manifest とファイル名は同時に指定出来ません"
+msgstr "--changelog ないし --manifest とファイル名は同時に指定できません"
 
 msgid "cannot specify --changelog or --manifest without a repository"
 msgstr "--changelog ないし --manifest の指定はリポジトリ指定が必要です"
@@ -6776,9 +7345,6 @@
 msgid "destination %s is not a directory"
 msgstr "作業先 %s はディレクトリではありません"
 
-msgid "no files to copy"
-msgstr "コピーするファイルがありません"
-
 msgid "(consider using --after)\n"
 msgstr "(--after を使ってみては?)\n"
 
@@ -7240,6 +7806,21 @@
 "    アーカイブ種別は、 出力先ファイルの拡張子から自動的に判定されますが\n"
 "    -t/--type で強制することも可能です。"
 
+msgid "      Examples:"
+msgstr "      例:"
+
+msgid "      - create a zip file containing the 1.0 release::"
+msgstr "      - 1.0 版時点のファイルを格納した zip ファイルの生成::"
+
+msgid "          hg archive -r 1.0 project-1.0.zip"
+msgstr "          hg archive -r 1.0 project-1.0.zip"
+
+msgid "      - create a tarball excluding .hg files::"
+msgstr "      - .hg で始まるファイルを除外した tar ファイルの生成::"
+
+msgid "          hg archive project.tar.gz -X \".hg*\""
+msgstr "          hg archive project.tar.gz -X \".hg*\""
+
 msgid "    Valid types are:"
 msgstr "    有効種別一覧:"
 
@@ -7289,8 +7870,8 @@
 msgid "merge with old dirstate parent after backout"
 msgstr "打ち消しリビジョンを現親リビジョンとマージ"
 
-msgid "parent to choose when backing out merge"
-msgstr "打ち消しリビジョンとのマージ対象"
+msgid "parent to choose when backing out merge (DEPRECATED)"
+msgstr "打ち消しリビジョンとのマージ対象 (非推奨)"
 
 msgid "revision to backout"
 msgstr "打ち消し対象リビジョン"
@@ -7319,32 +7900,41 @@
 "    マージ結果はコミットされません。"
 
 msgid ""
-"    By default, the pending changeset will have one parent,\n"
-"    maintaining a linear history. With --merge, the pending changeset\n"
-"    will instead have two parents: the old parent of the working\n"
-"    directory and a new child of REV that simply undoes REV."
-msgstr ""
-"    特に指定が無い場合、 打ち消しリビジョンは、\n"
-"    単一の親リビジョンしか持たない、\n"
-"    一直線の履歴となるように作成されます。\n"
-"    --merge を指定した場合は、 2つの親リビジョンを持つようになります。\n"
-"    一方の親は作業領域の親リビジョン、\n"
-"    もう一方は、 打ち消しリビジョン (= 打ち消し対象の新規子リビジョン)\n"
-"    です。"
-
-msgid ""
-"    Before version 1.7, the behavior without --merge was equivalent to\n"
-"    specifying --merge followed by :hg:`update --clean .` to cancel\n"
-"    the merge and leave the child of REV as a head to be merged\n"
-"    separately."
-msgstr ""
-"    1.8 版より前の本コマンドの --merge 無し時挙動は、\n"
-"    打消しを --merge 付きで実行した後で、\n"
-"    :hg:`update --clean .` を実行した場合と等価です。\n"
-"    ここでの :hg:`update --clean .` 実行は、\n"
-"    マージの実施をキャンセルし、\n"
-"    打ち消しリビジョンを後から別途マージできるように、\n"
-"    ヘッドのまま残す働きをします。"
+"    .. note::\n"
+"      backout cannot be used to fix either an unwanted or\n"
+"      incorrect merge."
+msgstr ""
+"    .. note::\n"
+"      :hg:`backout` による打消し機能は、マージ実施リビジョンに対しては、\n"
+"      適用できません。"
+
+msgid ""
+"      By default, the pending changeset will have one parent,\n"
+"      maintaining a linear history. With --merge, the pending\n"
+"      changeset will instead have two parents: the old parent of the\n"
+"      working directory and a new child of REV that simply undoes REV."
+msgstr ""
+"      特に指定が無い場合、 打ち消しリビジョンは、\n"
+"      単一の親リビジョンしか持たない、\n"
+"      一直線の履歴となるように作成されます。\n"
+"      --merge を指定した場合は、 2つの親リビジョンを持つようになります。\n"
+"      一方の親は作業領域の親リビジョン、\n"
+"      もう一方は、 打ち消しリビジョン (= 打ち消し対象の新規子リビジョン)\n"
+"      です。"
+
+msgid ""
+"      Before version 1.7, the behavior without --merge was equivalent\n"
+"      to specifying --merge followed by :hg:`update --clean .` to\n"
+"      cancel the merge and leave the child of REV as a head to be\n"
+"      merged separately."
+msgstr ""
+"      1.8 版より前の本コマンドの --merge 無し時挙動は、\n"
+"      打消しを --merge 付きで実行した後で、\n"
+"      :hg:`update --clean .` を実行した場合と等価です。\n"
+"      ここでの :hg:`update --clean .` 実行は、\n"
+"      マージの実施をキャンセルし、\n"
+"      打ち消しリビジョンを後から別途マージできるように、\n"
+"      ヘッドのまま残す働きをします。"
 
 msgid "please specify just one revision"
 msgstr "リビジョン指定は1つだけです"
@@ -7358,8 +7948,8 @@
 msgid "cannot backout a change with no parents"
 msgstr "親の無いリビジョンを打ち消すことはできません"
 
-msgid "cannot backout a merge changeset without --parent"
-msgstr "マージリビジョンの打消しには --parent 指定が必要です"
+msgid "cannot backout a merge changeset"
+msgstr "マージ実施リビジョンは打ち消し対象にできません"
 
 #, python-format
 msgid "%s is not a parent of %s"
@@ -7425,8 +8015,8 @@
 "    As a shortcut, you can also use the revision argument to mark a\n"
 "    revision as good or bad without checking it out first."
 msgstr ""
-"    てみじかな手順としては、 作業領域を更新せずに、 リビジョン指定を使用\n"
-"    してリビジョンを good ないし bad にマークすることもできます。"
+"    簡便な手順としては、 作業領域を更新せず、 リビジョン指定を使用して、\n"
+"    リビジョンを good ないし bad にマークすることもできます。"
 
 msgid ""
 "    If you supply a command, it will be used for automatic bisection.\n"
@@ -7441,6 +8031,95 @@
 "    127(コマンドが見つからない場合)は分割探索中断、 それ以外の 0 より\n"
 "    大きい終了コードは bad のマーク付けとみなされます。"
 
+msgid "      Some examples:"
+msgstr "      例:"
+
+msgid ""
+"      - start a bisection with known bad revision 12, and good revision 34::"
+msgstr ""
+"      - 既知の bad なリビジョン 12 と good なリビジョン 34 から検索開始::"
+
+msgid ""
+"          hg bisect --bad 34\n"
+"          hg bisect --good 12"
+msgstr ""
+"          hg bisect --bad 34\n"
+"          hg bisect --good 12"
+
+msgid ""
+"      - advance the current bisection by marking current revision as good "
+"or\n"
+"        bad::"
+msgstr "      - 現リビジョンを good ないし bad 化して検索状態を進める::"
+
+msgid ""
+"          hg bisect --good\n"
+"          hg bisect --bad"
+msgstr ""
+"          hg bisect --good\n"
+"          hg bisect --bad"
+
+msgid ""
+"      - mark the current revision, or a known revision, to be skipped (eg. "
+"if\n"
+"        that revision is not usable because of another issue)::"
+msgstr ""
+"      - 現ビジョンないし特定のリビジョンをスキップ (例: 別な問題により、\n"
+"        当該リビジョンの検証ができない)::"
+
+msgid ""
+"          hg bisect --skip\n"
+"          hg bisect --skip 23"
+msgstr ""
+"          hg bisect --skip\n"
+"          hg bisect --skip 23"
+
+msgid "      - forget the current bisection::"
+msgstr "      - 現行の検索状態をクリア::"
+
+msgid "          hg bisect --reset"
+msgstr "          hg bisect --reset"
+
+msgid ""
+"      - use 'make && make tests' to automatically find the first broken\n"
+"        revision::"
+msgstr ""
+"      - 最初の問題リビジョン探索の自動化に 'make && make tests' を利用::"
+
+msgid ""
+"          hg bisect --reset\n"
+"          hg bisect --bad 34\n"
+"          hg bisect --good 12\n"
+"          hg bisect --command 'make && make tests'"
+msgstr ""
+"          hg bisect --reset\n"
+"          hg bisect --bad 34\n"
+"          hg bisect --good 12\n"
+"          hg bisect --command 'make && make tests'"
+
+msgid ""
+"      - see all changesets whose states are already known in the current\n"
+"        bisection::"
+msgstr "      - 現在の検索において、 状態の判明しているリビジョン全てを表示::"
+
+msgid "          hg log -r \"bisect(pruned)\""
+msgstr "          hg log -r \"bisect(pruned)\""
+
+msgid "      - see all changesets that took part in the current bisection::"
+msgstr "      - 現在の検索対象になっているリビジョン全てを表示::"
+
+msgid "          hg log -r \"bisect(range)\""
+msgstr "          hg log -r \"bisect(range)\""
+
+msgid "      - with the graphlog extension, you can even get a nice graph::"
+msgstr "      - graphlog エクステンション有効時は、グラフ表示も可能::"
+
+msgid "          hg log --graph -r \"bisect(range)\""
+msgstr "          hg log --graph -r \"bisect(range)\""
+
+msgid "      See :hg:`help revsets` for more about the `bisect()` keyword."
+msgstr "    `bisect()` キーワードの詳細は :hg:`help revsets` を参照のこと。"
+
 msgid "The first good revision is:\n"
 msgstr "最初の good なリビジョンは:\n"
 
@@ -7464,10 +8143,10 @@
 msgstr "検証省略により、 最初の bad なリビジョンは以下から選択可能です:\n"
 
 msgid "cannot bisect (no known good revisions)"
-msgstr "分割探索出来ません(good リビジョンが未指定です)"
+msgstr "分割探索できません(good リビジョンが未指定です)"
 
 msgid "cannot bisect (no known bad revisions)"
-msgstr "分割探索出来ません(bad リビジョンが未指定です)"
+msgstr "分割探索できません(bad リビジョンが未指定です)"
 
 msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
 msgstr "('hg bisect <cmd>' 形式の実行は推奨されません)\n"
@@ -7630,14 +8309,13 @@
 "    使用してください。 現ブランチを閉鎖する場合は\n"
 "    :hg:`commit --close-branch` を使用してください。"
 
-msgid "    .. note::"
-msgstr "    .. note::"
-
-msgid ""
+msgid ""
+"    .. note::\n"
 "       Branch names are permanent. Use :hg:`bookmark` to create a\n"
 "       light-weight bookmark instead. See :hg:`help glossary` for more\n"
 "       information about named branches and bookmarks."
 msgstr ""
+"    .. note::\n"
 "       ブランチ名は永続的なものです。軽量な名前付けをする場合は、\n"
 "       :hg:`bookmark` でブックマークを作成してください。\n"
 "       名前付きブランチとブックマークの詳細に関しては、\n"
@@ -7732,8 +8410,8 @@
 "    Generate a compressed changegroup file collecting changesets not\n"
 "    known to be in another repository."
 msgstr ""
-"    連携対象リポジトリに存在しないリビジョンの情報をまとめて、 圧縮\n"
-"    付きバンドルファイルを生成します。"
+"    連携対象リポジトリに存在しないリビジョンの情報をまとめて、\n"
+"    圧縮形式のバンドルファイルを生成します。"
 
 msgid ""
 "    If you omit the destination repository, then hg assumes the\n"
@@ -7741,18 +8419,18 @@
 "    parameters. To create a bundle containing all changesets, use\n"
 "    -a/--all (or --base null)."
 msgstr ""
-"    連携対象リポジトリが指定されない場合、 1つ以上の --base で指定\n"
-"    されたリビジョンを持つリポジトリが想定されます。 全てのリビジョンを\n"
-"    含むバンドルファイルを生成するには、 -a/--all (ないし --base null)を\n"
-"    指定します。"
+"    連携対象リポジトリが無指定の場合、 --base 指定されたリビジョンが、\n"
+"    連携対象リポジトリ側に存在するものと仮定します。\n"
+"    -a/--all (ないし --base null) 指定により、\n"
+"    全リビジョンを含むバンドルファイルが生成できます。"
 
 msgid ""
 "    You can change compression method with the -t/--type option.\n"
 "    The available compression methods are: none, bzip2, and\n"
 "    gzip (by default, bundles are compressed using bzip2)."
 msgstr ""
-"    圧縮方式を変更する場合は -t/--type を使用します。 利用可能な圧縮\n"
-"    形式は none(無圧縮), bzip2, gzip です(無指定時は bzip2 圧縮)。"
+"    圧縮形式は -t/--type で指定可能です。 利用可能な圧縮形式は\n"
+"    none (無圧縮), bzip2, gzip です (無指定時は bzip2 圧縮)。"
 
 msgid ""
 "    The bundle file can then be transferred using conventional means\n"
@@ -7760,17 +8438,17 @@
 "    command. This is useful when direct push and pull are not\n"
 "    available or when exporting an entire repository is undesirable."
 msgstr ""
-"    任意の方法で転送したバンドルファイルは、 他のリポジトリ上で\n"
-"    'hg unbundle' ないし 'hg pull' により適用可能です。 バンドルによる\n"
-"    伝播は、  'hg push/pull' による直接転送ができない場合や、 リポジトリ\n"
-"    全体の公開が望ましく無い場合に有用です。"
+"    バンドルファイルは :hg:`unbundle` ないし :hg:`pull` によって、\n"
+"    他リポジトリに取り込めるので、 変更内容を任意の方法で伝播できます。\n"
+"    バンドルファイルによる伝播は、 :hg:`push`/:hg:`pull` での直接転送や、\n"
+"    リポジトリ全体の公開が、 できない/望ましく無い場合に有用です。"
 
 msgid ""
 "    Applying bundles preserves all changeset contents including\n"
 "    permissions, copy/rename information, and revision history."
 msgstr ""
-"    バンドルの適用では、 権限設定、 複製/改名、 変更履歴といった情報を\n"
-"    含む全ての更新内容が取り込まれます。"
+"    バンドルファイルによる取り込みでは、 権限設定、 複製/改名、\n"
+"    変更履歴等を含む全ての更新内容が取り込まれます。"
 
 msgid ""
 "    Returns 0 on success, 1 if no changes found.\n"
@@ -7814,9 +8492,9 @@
 "    given using a format string. The formatting rules are the same as\n"
 "    for the export command, with the following additions:"
 msgstr ""
-"    出力先指定(置換指定可能)がある場合、 出力はファイルに保存されます。\n"
-"    置換指定には 'hg export' で指定可能なものに加えて以下のものを指定\n"
-"    できます:"
+"    出力先指定がある場合、 出力はファイルに保存されます。\n"
+"    出力先指定では、 :hg:`export` で指定可能なものに加えて、\n"
+"    以下の置換指定が利用可能です:"
 
 msgid ""
 "    :``%s``: basename of file being printed\n"
@@ -7853,124 +8531,163 @@
 "    If no destination directory name is specified, it defaults to the\n"
 "    basename of the source."
 msgstr ""
-"    複製先ディレクトリが指定されない場合、 複製元のベース名(パス名の\n"
-"    末尾要素)を使用します。"
+"    複製先ディレクトリが指定されない場合、 複製元のベース名\n"
+"    (パス名の末尾要素) を使用します。"
 
 msgid ""
 "    The location of the source is added to the new repository's\n"
 "    ``.hg/hgrc`` file, as the default to be used for future pulls."
 msgstr ""
-"    将来的な :hg:`pull` 実施に備えて、 複製先リポジトリの ``.hg/hgrc``\n"
+"    後々の :hg:`pull` 実施に備えて、 複製先リポジトリの ``.hg/hgrc``\n"
 "    ファイルには、 複製元リポジトリ位置が default 名義で記録されます。"
 
-msgid "    See :hg:`help urls` for valid source format details."
-msgstr "    リポジトリ位置指定の詳細は、 :hg:`help urls` を参照してください。"
-
-msgid ""
-"    It is possible to specify an ``ssh://`` URL as the destination, but no\n"
-"    ``.hg/hgrc`` and working directory will be created on the remote side.\n"
-"    Please see :hg:`help urls` for important details about ``ssh://`` URLs."
-msgstr ""
-"    複製先として ``ssh://`` URL 形式を指定することも可能ですが、\n"
-"    遠隔ホスト上では、 ``.hg/hgrc`` の作成も、\n"
-"    作業領域の更新も行われません。\n"
-"    ``ssh://`` URL 形式の詳細は、 :hg:`help urls` を参照してください。"
-
-msgid ""
-"    A set of changesets (tags, or branch names) to pull may be specified\n"
-"    by listing each changeset (tag, or branch name) with -r/--rev.\n"
-"    If -r/--rev is used, the cloned repository will contain only a subset\n"
-"    of the changesets of the source repository. Only the set of changesets\n"
-"    defined by all -r/--rev options (including all their ancestors)\n"
-"    will be pulled into the destination repository.\n"
-"    No subsequent changesets (including subsequent tags) will be present\n"
-"    in the destination."
-msgstr ""
-"    複製先に取り込む一連のリビジョンは、 -r/--rev を使用してリビジョン\n"
-"    (タグ名やブランチ名も可)を列挙することで指定します。\n"
-"    -r/--rev によるリビジョン指定複製を行なう場合、 複製先リポジトリは\n"
-"    複製元リポジトリの持つリビジョンの一部のみが取り込まれます。\n"
-"    -r/--rev によって指定されたリビジョン(およびその祖先となるリビジョン)\n"
-"    が取り込み対象となります。\n"
-"    複製先リポジトリには、 指定リビジョン以後のリビジョンは取り込まれません\n"
-"    (後続のタグ付けリビジョンも除外されます)。"
-
-msgid ""
-"    Using -r/--rev (or 'clone src#rev dest') implies --pull, even for\n"
-"    local source repositories."
-msgstr ""
-"    -r/--rev 指定付き(ないしは 'hg clone 複製元#リビジョン' 形式)\n"
-"    複製の場合、 同一ファイルシステム上での複製であっても、\n"
-"    暗黙的に --pull 指定を伴います。"
-
-msgid ""
-"    For efficiency, hardlinks are used for cloning whenever the source\n"
-"    and destination are on the same filesystem (note this applies only\n"
-"    to the repository data, not to the working directory). Some\n"
-"    filesystems, such as AFS, implement hardlinking incorrectly, but\n"
-"    do not report errors. In these cases, use the --pull option to\n"
-"    avoid hardlinking."
-msgstr ""
-"    複製元/複製先が同一ファイルシステム上にある場合、 資源効率等の\n"
-"    理由から(リポジトリの内部管理データに対してのみ)ハードリンクが使用\n"
-"    されます。 AFS を含む幾つかのファイルシステムは、 ハードリンク実装が\n"
-"    不適切であるにも関わらず、 エラー通知がありません。 このような場合には\n"
-"    --pull を指定することで、 ハードリンクを抑止します。"
-
-msgid ""
-"    In some cases, you can clone repositories and the working directory\n"
-"    using full hardlinks with ::"
-msgstr ""
-"    リポジトリの内部管理データと作業領域中のファイル全てに対する、\n"
-"    ハードリンクによる複製の作成には、 以下の方法が使えるかも知れません::"
-
-msgid "      $ cp -al REPO REPOCLONE"
-msgstr "      $ cp -al REPO REPOCLONE"
-
-msgid ""
-"    This is the fastest way to clone, but it is not always safe. The\n"
-"    operation is not atomic (making sure REPO is not modified during\n"
-"    the operation is up to you) and you have to make sure your editor\n"
-"    breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,\n"
-"    this is not compatible with certain extensions that place their\n"
-"    metadata under the .hg directory, such as mq."
-msgstr ""
-"    この方法は最速の複製方法かもしれませんが、 常に安全とは限りません。\n"
-"    操作の単一性は保障されません(リポジトリの複製中改変の防止は利用者\n"
-"    責務)し、 利用するエディタのファイル改変時の振る舞いが、 ハードリンク\n"
-"    を破棄するものである必要があります(Emacs および多くの Linux 系\n"
-"    ツールはそのように振舞います)。 この制約は .hg ディレクトリ配下に\n"
-"    メタデータを配置する、 MQ などのエクステンションとは相容れません。"
-
-msgid ""
-"    Mercurial will update the working directory to the first applicable\n"
-"    revision from this list:"
-msgstr ""
-"    Mercurial は、 以下の一覧中で最初に利用可能なリビジョンを用いて\n"
-"    作業領域を更新します:"
-
-msgid ""
-"    a) null if -U or the source repository has no changesets\n"
-"    b) if -u . and the source repository is local, the first parent of\n"
-"       the source repository's working directory\n"
-"    c) the changeset specified with -u (if a branch name, this means the\n"
-"       latest head of that branch)\n"
-"    d) the changeset specified with -r\n"
-"    e) the tipmost head specified with -b\n"
-"    f) the tipmost head specified with the url#branch source syntax\n"
-"    g) the tipmost head of the default branch\n"
-"    h) tip"
-msgstr ""
-"    a) -U が指定されるか、 元リポジトリ履歴が空の場合は null リビジョン\n"
-"    b) -u . が指定され、 且つ元リポジトリが同一ホストの場合、\n"
-"       元リポジトリの作業領域の第1親リビジョン\n"
-"    c) -u で指定されたリビジョン(ブランチ名が指定された場合、\n"
-"       当該ブランチの最新ヘッドリビジョン)\n"
-"    d) -r で指定されたリビジョン\n"
-"    e) -b で指定sれたブランチの最新ヘッドリビジョン\n"
-"    f) url#branch 形式で指定されたブランチの最新ヘッドリビジョン\n"
-"    g) default ブランチの最新ヘッドリビジョン\n"
-"    h) tip"
+msgid ""
+"    Only local paths and ``ssh://`` URLs are supported as\n"
+"    destinations. For ``ssh://`` destinations, no working directory or\n"
+"    ``.hg/hgrc`` will be created on the remote side."
+msgstr ""
+"    複製先に指定可能なのは、 ローカルファイルシステム上のパスと、\n"
+"    ``ssh://`` 形式 URL のみです。 ``ssh://`` 形式 URL を指定した場合、\n"
+"    作業領域の更新や、 ``.hg/hgrc`` の生成は行われません。"
+
+msgid ""
+"    To pull only a subset of changesets, specify one or more revisions\n"
+"    identifiers with -r/--rev or branches with -b/--branch. The\n"
+"    resulting clone will contain only the specified changesets and\n"
+"    their ancestors. These options (or 'clone src#rev dest') imply\n"
+"    --pull, even for local source repositories. Note that specifying a\n"
+"    tag will include the tagged changeset but not the changeset\n"
+"    containing the tag."
+msgstr ""
+"    -r/--rev でのリビジョン指定や、 -b/--branch でのブランチ指定により、\n"
+"    一部のリビジョンのみを取り込むことができます。 複製先のリポジトリは、\n"
+"    指定リビジョンと、 その祖先のみを保持します。 これらのオプション指定\n"
+"    (あるいは :hg:`clone src#rev dest` 形式での複製) がある場合、\n"
+"    同一ファイルシステム上のリポジトリの複製でも、 --pull 指定時と、\n"
+"    同様に振舞います。 タグ名でリビジョンを指定した場合、\n"
+"    タグ「対処」リビジョンは、 複製先に取り込まれますが、\n"
+"    タグ「実施」リビジョンは、 複製先に取り込まれません。"
+
+msgid ""
+"    To check out a particular version, use -u/--update, or\n"
+"    -U/--noupdate to create a clone with no working directory."
+msgstr ""
+"    特定のリビジョンで、 作業領域を更新する場合は -u/--update を、\n"
+"    作業領域にデータを持ちたくない場合は -U/--noupdate を指定します。"
+
+msgid ""
+"      For efficiency, hardlinks are used for cloning whenever the\n"
+"      source and destination are on the same filesystem (note this\n"
+"      applies only to the repository data, not to the working\n"
+"      directory). Some filesystems, such as AFS, implement hardlinking\n"
+"      incorrectly, but do not report errors. In these cases, use the\n"
+"      --pull option to avoid hardlinking."
+msgstr ""
+"      複製元/複製先が、 同一ファイルシステム上にある場合、\n"
+"      資源効率の点から、 (リポジトリの内部管理データに対してのみ)\n"
+"      ハードリンクが使用されます。 ハードリンク実装が不適切な、 \n"
+"      ファイルシステム (例: AFS) は、 ハードリンク使用時に、\n"
+"      エラー通知がありません。 このような場合には --pull\n"
+"      を指定することで、 ハードリンク使用を抑止してください。"
+
+msgid ""
+"      In some cases, you can clone repositories and the working\n"
+"      directory using full hardlinks with ::"
+msgstr ""
+"      リポジトリの内部管理データと作業領域中のファイル全てに対する、\n"
+"      ハードリンクによる複製の作成には、 以下の方法が使えるかも知れません::"
+
+msgid "        $ cp -al REPO REPOCLONE"
+msgstr "        $ cp -al REPO REPOCLONE"
+
+msgid ""
+"      This is the fastest way to clone, but it is not always safe. The\n"
+"      operation is not atomic (making sure REPO is not modified during\n"
+"      the operation is up to you) and you have to make sure your\n"
+"      editor breaks hardlinks (Emacs and most Linux Kernel tools do\n"
+"      so). Also, this is not compatible with certain extensions that\n"
+"      place their metadata under the .hg directory, such as mq."
+msgstr ""
+"      この方法は最速の複製方法かもしれませんが、 常に安全とは限りません。\n"
+"      操作の単一性は保障されません (リポジトリの複製中改変の防止は、 \n"
+"      利用者責務) し、 利用するエディタのファイル改変時の振る舞いが、\n"
+"      ハードリンクを破棄するものである必要があります (Emacs および多くの\n"
+"      Linux 系ツールは、 そのように振舞います)。 この制約は、\n"
+"      MQ エクステンションのように、 .hg ディレクトリ配下に、\n"
+"      管理情報を格納するツールとは相容れません。"
+
+msgid ""
+"      Mercurial will update the working directory to the first applicable\n"
+"      revision from this list:"
+msgstr ""
+"      Mercurial は、 以下の一覧中で最初に利用可能なリビジョンを用いて、\n"
+"      作業領域を更新します:"
+
+msgid ""
+"      a) null if -U or the source repository has no changesets\n"
+"      b) if -u . and the source repository is local, the first parent of\n"
+"         the source repository's working directory\n"
+"      c) the changeset specified with -u (if a branch name, this means the\n"
+"         latest head of that branch)\n"
+"      d) the changeset specified with -r\n"
+"      e) the tipmost head specified with -b\n"
+"      f) the tipmost head specified with the url#branch source syntax\n"
+"      g) the tipmost head of the default branch\n"
+"      h) tip"
+msgstr ""
+"      a) -U が指定されるか、 元リポジトリ履歴が空の場合は null リビジョン\n"
+"      b) -u . が指定され、 且つ元リポジトリが同一ホストの場合、\n"
+"         元リポジトリの作業領域の第1親リビジョン\n"
+"      c) -u で指定されたリビジョン (ブランチ名が指定された場合、\n"
+"         当該ブランチの最新ヘッドリビジョン)\n"
+"      d) -r で指定されたリビジョン\n"
+"      e) -b で指定sれたブランチの最新ヘッドリビジョン\n"
+"      f) url#branch 形式で指定されたブランチの最新ヘッドリビジョン\n"
+"      g) default ブランチの最新ヘッドリビジョン\n"
+"      h) tip"
+
+msgid "      - clone a remote repository to a new directory named hg/::"
+msgstr "      - 遠隔リポジトリを、 新規 hg/ ディレクトリ配下に複製::"
+
+msgid "          hg clone http://selenic.com/hg"
+msgstr "          hg clone http://selenic.com/hg"
+
+msgid "      - create a lightweight local clone::"
+msgstr "      - 同一ホスト上のリポジトリを軽量複製::"
+
+msgid "          hg clone project/ project-feature/"
+msgstr "          hg clone project/ project-feature/"
+
+msgid ""
+"      - clone from an absolute path on an ssh server (note double-slash)::"
+msgstr "      - SSH 接続先から絶対パス指定で複製 (ダブルスラッシュに注意)::"
+
+msgid "          hg clone ssh://user@server//home/projects/alpha/"
+msgstr "          hg clone ssh://user@server//home/projects/alpha/"
+
+msgid ""
+"      - do a high-speed clone over a LAN while checking out a\n"
+"        specified version::"
+msgstr "      - LAN 経由での高速複製と、 特定リビジョンでの作業領域更新::"
+
+msgid "          hg clone --uncompressed http://server/repo -u 1.5"
+msgstr "          hg clone --uncompressed http://server/repo -u 1.5"
+
+msgid ""
+"      - create a repository without changesets after a particular revision::"
+msgstr "      - 特定リビジョンまでしか含まないリポジトリの生成::"
+
+msgid "          hg clone -r 04e544 experimental/ good/"
+msgstr "          hg clone -r 04e544 experimental/ good/"
+
+msgid "      - clone (and track) a particular named branch::"
+msgstr "      - 特定の名前付きブランチ限定での複製::"
+
+msgid "          hg clone http://selenic.com/hg#stable"
+msgstr "          hg clone http://selenic.com/hg#stable"
+
+msgid "    See :hg:`help urls` for details on specifying URLs."
+msgstr "    URL 記述の詳細は :hg:`help urls` を参照してください。"
 
 msgid "cannot specify both --noupdate and --updaterev"
 msgstr "--noupdate と --updaterev は併用できません"
@@ -7992,8 +8709,7 @@
 "    指定されたファイルの変更内容を、 管理領域に記録 (コミット) します。\n"
 "    中央集権的な構成管理ツールと異なり、\n"
 "    この操作で変更が記録されるのは、 手元の管理領域に対してのみです。\n"
-"    変更を能動的に公開する方法に関しては、\n"
-"    :hg:`help push` を参照してください。"
+"    能動的な変更伝播に関しては、 :hg:`help push` を参照してください。"
 
 msgid ""
 "    If a list of files is omitted, all changes reported by :hg:`status`\n"
@@ -8006,8 +8722,8 @@
 "    If you are committing the result of a merge, do not provide any\n"
 "    filenames or -I/-X filters."
 msgstr ""
-"    'hg merge' 結果をコミットする場合、 ファイル名ないし -I/-X のいずれも\n"
-"    指定しないでください。"
+"    :hg:`merge` 結果をコミットする場合、 ファイル名ないし -I/-X の、\n"
+"    いずれも指定しないでください。"
 
 msgid ""
 "    If no commit message is specified, Mercurial starts your\n"
@@ -8350,8 +9066,9 @@
 msgid " (check that you compiled the extensions)\n"
 msgstr " (エクステンションのコンパイル状況を確認してください)\n"
 
-msgid "Checking templates...\n"
-msgstr "テンプレートの検証中...\n"
+#, python-format
+msgid "Checking templates (%s)...\n"
+msgstr "テンプレート (%s) の検証中...\n"
 
 msgid " (templates seem to have been installed incorrectly)\n"
 msgstr " (テンプレートのインストールが不適切なようです)\n"
@@ -8532,6 +9249,43 @@
 "    git 拡張差分形式で表示するには -g/--git を指定します。 詳細は\n"
 "    :hg:`help diffs` を参照してください。"
 
+msgid "      - compare a file in the current working directory to its parent::"
+msgstr "      - 作業領域のファイルを親リビジョンと比較::"
+
+msgid "          hg diff foo.c"
+msgstr "          hg diff foo.c"
+
+msgid ""
+"      - compare two historical versions of a directory, with rename info::"
+msgstr "      - 2つのリビジョン時点でのディレクトリ内容を比較 (改名情報付き)::"
+
+msgid "          hg diff --git -r 1.0:1.2 lib/"
+msgstr "          hg diff --git -r 1.0:1.2 lib/"
+
+msgid "      - get change stats relative to the last change on some date::"
+msgstr "      - 指定日時時点からの差分の統計情報を表示::"
+
+msgid "          hg diff --stat -r \"date('may 2')\""
+msgstr "          hg diff --stat -r \"date('may 2')\""
+
+msgid "      - diff all newly-added files that contain a keyword::"
+msgstr "      - 指定キーワードを含む全新規追加ファイルの差分を表示::"
+
+msgid "          hg diff \"set:added() and grep(GNU)\""
+msgstr "          hg diff \"set:added() and grep(GNU)\""
+
+msgid "      - compare a revision and its parents::"
+msgstr "      - 指定リビジョンとその親を比較::"
+
+msgid ""
+"          hg diff -c 9353         # compare against first parent\n"
+"          hg diff -r 9353^:9353   # same using revset syntax\n"
+"          hg diff -r 9353^2:9353  # compare against the second parent"
+msgstr ""
+"          hg diff -c 9353         # 第1親との比較\n"
+"          hg diff -r 9353^:9353   # 上記と等価な revset 文法記述\n"
+"          hg diff -r 9353^2:9353  # 第2親との比較"
+
 msgid "diff against the second parent"
 msgstr "第2親との差分を使用"
 
@@ -8581,6 +9335,8 @@
 "    :``%R``: changeset revision number\n"
 "    :``%b``: basename of the exporting repository\n"
 "    :``%h``: short-form changeset hash (12 hexadecimal digits)\n"
+"    :``%m``: first line of the commit message (only alphanumeric "
+"characters)\n"
 "    :``%n``: zero-padded sequence number, starting at 1\n"
 "    :``%r``: zero-padded changeset revision number"
 msgstr ""
@@ -8590,6 +9346,7 @@
 "    :``%R``: リビジョン番号\n"
 "    :``%b``: 対象リポジトリのベース名\n"
 "    :``%h``: 短縮形式ハッシュ値(12 桁 16 進数)\n"
+"    :``%m``: コミットログの1行目 (英数字限定)\n"
 "    :``%n``: 1から始まるゼロ詰めの通し番号\n"
 "    :``%r``: ゼロ詰めのリビジョン番号"
 
@@ -8616,6 +9373,30 @@
 "    --switch-parent を指定することで、 比較対象が第2親になります。\n"
 "    これはマージのレビューの際などに有効です。"
 
+msgid ""
+"      - use export and import to transplant a bugfix to the current\n"
+"        branch::"
+msgstr "      - export と import の併用による現ブランチ上への変更の移植::"
+
+msgid "          hg export -r 9353 | hg import -"
+msgstr "          hg export -r 9353 | hg import -"
+
+msgid ""
+"      - export all the changesets between two revisions to a file with\n"
+"        rename information::"
+msgstr "      - 指定リビジョン間の全変更 (改名情報付き) をファイルに出力::"
+
+msgid "          hg export --git -r 123:150 > changes.txt"
+msgstr "          hg export --git -r 123:150 > changes.txt"
+
+msgid ""
+"      - split outgoing changes into a series of patches with\n"
+"        descriptive names::"
+msgstr "      - 可読性ある名前の一連のファイルに変更内容を分割格納::"
+
+msgid "          hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+msgstr "          hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+
 msgid "export requires at least one changeset"
 msgstr "最低1つのリビジョン指定が必要です"
 
@@ -8646,16 +9427,116 @@
 "    登録除外操作のコミット前取り消しは、 :hg:`help add` を参照して\n"
 "    ください。"
 
-msgid "no files specified"
-msgstr "ファイル名指定がありません"
-
-#, python-format
-msgid "not removing %s: file is already untracked\n"
-msgstr "%s は削除されません: 既に構成管理対象ではありません\n"
-
-#, python-format
-msgid "removing %s\n"
-msgstr "%s を登録除外中\n"
+msgid "      - forget newly-added binary files::"
+msgstr "      - 新規追加のバイナリファイルを登録除外::"
+
+msgid "          hg forget \"set:added() and binary()\""
+msgstr "          hg forget \"set:added() and binary()\""
+
+msgid "      - forget files that would be excluded by .hgignore::"
+msgstr "      - .hgignore による無視対象ファイルを登録除外::"
+
+msgid "          hg forget \"set:hgignore()\""
+msgstr "          hg forget \"set:hgignore()\""
+
+msgid "resume interrupted graft"
+msgstr "中断された移植を再開"
+
+msgid "record the current date as commit date"
+msgstr "現時刻をコミット日時として記録"
+
+msgid "record the current user as committer"
+msgstr "現ユーザをコミットユーザとして記録"
+
+msgid "[OPTION]... REVISION..."
+msgstr "[OPTION]... REVISION..."
+
+msgid "copy changes from other branches onto the current branch"
+msgstr "別ブランチ上から現行ブランチへの指定リビジョンの複製"
+
+msgid ""
+"    This command uses Mercurial's merge logic to copy individual\n"
+"    changes from other branches without merging branches in the\n"
+"    history graph. This is sometimes known as 'backporting' or\n"
+"    'cherry-picking'. By default, graft will copy user, date, and\n"
+"    description from the source changesets."
+msgstr ""
+
+msgid ""
+"    Changesets that are ancestors of the current revision, that have\n"
+"    already been grafted, or that are merges will be skipped."
+msgstr ""
+
+msgid ""
+"    If a graft merge results in conflicts, the graft process is\n"
+"    aborted so that the current merge can be manually resolved. Once\n"
+"    all conflicts are addressed, the graft process can be continued\n"
+"    with the -c/--continue option."
+msgstr ""
+
+msgid ""
+"    .. note::\n"
+"      The -c/--continue option does not reapply earlier options."
+msgstr ""
+
+msgid ""
+"      - copy a single change to the stable branch and edit its description::"
+msgstr ""
+
+msgid ""
+"          hg update stable\n"
+"          hg graft --edit 9393"
+msgstr ""
+
+msgid ""
+"      - graft a range of changesets with one exception, updating dates::"
+msgstr ""
+
+msgid "          hg graft -D \"2085::2093 and not 2091\""
+msgstr ""
+
+msgid "      - continue a graft after resolving conflicts::"
+msgstr ""
+
+msgid "          hg graft -c"
+msgstr ""
+
+msgid "      - show the source of a grafted changeset::"
+msgstr ""
+
+msgid "          hg log --debug -r tip"
+msgstr ""
+
+msgid ""
+"    Returns 0 on successful completion.\n"
+"    "
+msgstr ""
+"    成功時のコマンド終了値は 0 です。\n"
+"    "
+
+msgid "can't specify --continue and revisions"
+msgstr "--continue とリビジョンは同時に指定できません"
+
+msgid "no graft state found, can't continue"
+msgstr "移植状態が記録されていないため再開できません"
+
+#, python-format
+msgid "skipping ungraftable merge revision %s\n"
+msgstr "移植できないマージリビジョン %s を飛ばしています\n"
+
+#, python-format
+msgid "skipping ancestor revision %s\n"
+msgstr "祖先ビジョン %s を飛ばしています\n"
+
+#, python-format
+msgid "skipping already grafted revision %s\n"
+msgstr "すでに移植したりビジョン %s を飛ばしています\n"
+
+msgid "unresolved conflicts, can't continue"
+msgstr "衝突が未解消のため、継続できません"
+
+msgid "use hg resolve and hg graft --continue"
+msgstr "hg resolve と hg graft --continue を使用してください"
 
 msgid "end fields with NUL"
 msgstr "各フィールドの区切りにNUL文字(0x00)を使用"
@@ -8837,6 +9718,19 @@
 "    成功時のコマンド終了値は 0 です。\n"
 "    "
 
+msgid "VALUE"
+msgstr "値"
+
+msgid "DEPRECATED"
+msgstr "非推奨"
+
+msgid ""
+"\n"
+"[+] marked option can be specified multiple times\n"
+msgstr ""
+"\n"
+"[+] 印付きのオプションは複数回指定可能です\n"
+
 msgid "global options:"
 msgstr "グローバルオプション:"
 
@@ -8856,11 +9750,8 @@
 msgstr "組み込み別名およびグローバルオプションの表示は \"hg -v help%s\""
 
 #, python-format
-msgid "use \"hg -v help %s\" to show global options"
-msgstr "グローバルオプションは \"hg -v help %s\" で表示されます"
-
-msgid "list of commands:"
-msgstr "コマンド一覧:"
+msgid "use \"hg -v help %s\" to show more info"
+msgstr "より詳細な情報は \"hg -v help %s\" で表示されます"
 
 #, python-format
 msgid ""
@@ -8890,23 +9781,44 @@
 msgstr "%s"
 
 #, python-format
-msgid ""
-"\n"
-"use \"hg -v help %s\" to show verbose help\n"
-msgstr ""
-"\n"
-"\"hg -v help %s\" で詳細なヘルプが表示されます\n"
-
-msgid "options:\n"
-msgstr "オプション:\n"
-
-#, python-format
 msgid "use \"hg help -e %s\" to show help for the %s extension"
 msgstr "\"hg help -e %s\" によってエクステンション %s のヘルプが表示されます"
 
+#, python-format
+msgid ""
+"\n"
+"use \"hg help %s\" to show the full help text\n"
+msgstr ""
+"\n"
+"\"hg help %s\" で詳細なヘルプが表示されます\n"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show more info\n"
+msgstr ""
+"\n"
+"\"hg -v help %s\" で詳細な情報が表示されます\n"
+
+msgid "basic commands:"
+msgstr "基本コマンド:"
+
+msgid "list of commands:"
+msgstr "コマンド一覧:"
+
 msgid "no commands defined\n"
 msgstr "コマンドが定義されていません\n"
 
+msgid "enabled extensions:"
+msgstr "有効化されているエクステンション:"
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"追加のヘルプトピック:"
+
 #, python-format
 msgid ""
 "\n"
@@ -8932,32 +9844,6 @@
 msgid "Mercurial Distributed SCM\n"
 msgstr "Mercurial - 分散構成管理ツール\n"
 
-msgid "basic commands:"
-msgstr "基本コマンド:"
-
-msgid "enabled extensions:"
-msgstr "有効化されているエクステンション:"
-
-msgid "VALUE"
-msgstr "値"
-
-msgid "DEPRECATED"
-msgstr "非推奨"
-
-msgid ""
-"\n"
-"[+] marked option can be specified multiple times"
-msgstr ""
-"\n"
-"[+] 印付きのオプションは複数回指定可能です"
-
-msgid ""
-"\n"
-"additional help topics:"
-msgstr ""
-"\n"
-"追加のヘルプトピック:"
-
 msgid "identify the specified revision"
 msgstr "当該リビジョンの識別情報を表示"
 
@@ -9009,6 +9895,24 @@
 "    パス指定有りでの起動の際には、 他のリポジトリないしバンドルファイルの\n"
 "    状態を表示します。"
 
+msgid "      - generate a build identifier for the working directory::"
+msgstr ""
+
+msgid "          hg id --id > build-id.dat"
+msgstr ""
+
+msgid "      - find the revision corresponding to a tag::"
+msgstr ""
+
+msgid "          hg id -n -r 1.3"
+msgstr ""
+
+msgid "      - check the most recent revision of a remote repository::"
+msgstr ""
+
+msgid "          hg id -r tip http://selenic.com/hg/"
+msgstr ""
+
 msgid "can't query remote revision number, branch, or tags"
 msgstr "リビジョン番号/ブランチ/タグは遠隔問い合わせできません"
 
@@ -9049,13 +9953,13 @@
 "    --no-commit is specified)."
 msgstr ""
 "    列挙されたパッチの取り込みおよびコミットを\n"
-"    (--no-commit 指定が無い限り)個別に行います。"
+"    (--no-commit 指定が無い限り) 個別に行います。"
 
 msgid ""
 "    If there are outstanding changes in the working directory, import\n"
 "    will abort unless given the -f/--force flag."
 msgstr ""
-"    作業領域に未コミットの変更がある場合、 -f/--force が指定されない限り\n"
+"    作業領域に未コミット変更がある場合、 -f/--force が指定されない限り、\n"
 "    取り込みは実施されません。"
 
 msgid ""
@@ -9066,12 +9970,11 @@
 "    text/plain body parts before first diff are added to commit\n"
 "    message."
 msgstr ""
-"    電子メールから直接パッチを取り込むことも可能です。 添付ファイル\n"
-"    形式のパッチであっても取り込み可能です(但し、 text/plain ないし\n"
-"    text/x-patch 型でなければなりません)。 作成者およびコミットログが無い\n"
-"    場合、 電子メールの From および Subject ヘッダ値が使用されます。\n"
-"    最初のパッチデータに先立つ text/plain ボディは、 コミットログに追記\n"
-"    されます。"
+"    添付ファイル形式 (但し text/plain ないし text/x-patch 型限定)\n"
+"    を含めて、 電子メールからもパッチを取り込めます。\n"
+"    作成者/コミットログが無い場合、 電子メールの From および Subject\n"
+"    ヘッダ値を使用します。 差分データに先立つ text/plain パートは、\n"
+"    コミットログに追記されます。"
 
 msgid ""
 "    If the imported patch was generated by :hg:`export`, user and\n"
@@ -9081,8 +9984,8 @@
 msgstr ""
 "    :hg:`export` により生成されたパッチを取り込む場合、 電子メールの\n"
 "    ヘッダやボディの情報よりも、 パッチに含まれる情報の方が優先します。\n"
-"    コマンドラインでの -m/--message ないし -u/--user 指定はこれらよりも\n"
-"    更に優先します。"
+"    コマンドラインでの -m/--message ないし -u/--user 指定は、\n"
+"    これらよりも更に優先します。"
 
 msgid ""
 "    If --exact is specified, import will set the working directory to\n"
@@ -9091,11 +9994,11 @@
 "    the patch. This may happen due to character set problems or other\n"
 "    deficiencies in the text patch format."
 msgstr ""
-"    --exact が指定された場合、 作業領域をパッチの親リビジョンに更新して\n"
-"    からパッチを適用しますが、 作成されたリビジョンのハッシュ値が、 パッチ\n"
-"    に記録された値と異なる場合、 取り込みは実施されません。 この現象は、\n"
-"    利用する文字符号化の問題や、 パッチのテキスト部分の不足などが原因で\n"
-"    発生する可能性があります。"
+"    --exact 指定時には、 作業領域をパッチの親リビジョンに更新してから、\n"
+"    パッチを適用しますが、 パッチにより作成されたリビジョンのハッシュ値が、\n"
+"    パッチに記録された値と異なる場合、 パッチの取り込みは中断されます。\n"
+"    この問題の原因として考えられるのは、 文字符号化形式の不一致や、\n"
+"    パッチ内容の欠損などです。"
 
 msgid ""
 "    Use --bypass to apply and commit patches directly to the\n"
@@ -9103,16 +10006,14 @@
 "    patches will be applied on top of the working directory parent\n"
 "    revision."
 msgstr ""
-"    --bypass 指定することで、 作業領域を改変せずに、\n"
-"    リポジトリへ変更内容を直接反映させることが出来ます。\n"
-"    --exact 指定が無い場合、 変更内容の適用対象は、\n"
-"    作業領域の親リビジョンになります。"
+"    --bypass 指定時は、 作業領域の改変無しに変更内容を反映します。\n"
+"    --exact 指定が無い場合、 変更は作業領域の親リビジョンに適用されます。"
 
 msgid ""
 "    With -s/--similarity, hg will attempt to discover renames and\n"
 "    copies in the patch in the same way as 'addremove'."
 msgstr ""
-"    -s/--similarity が指定された場合、 'hg addremove' と同様な方針で、\n"
+"    -s/--similarity が指定された場合、 :hg:`addremove` と同様な方針で、\n"
 "    パッチによる変更結果から、 改名や複製を検出します。"
 
 msgid ""
@@ -9124,30 +10025,61 @@
 "    URL が指定された場合、 パッチを当該 URL からダウンロードします。\n"
 "    -d/--date での日時表記は :hg:`help dates` を参照してください。"
 
+msgid "      - import a traditional patch from a website and detect renames::"
+msgstr ""
+
+msgid "          hg import -s 80 http://example.com/bugfix.patch"
+msgstr ""
+
+msgid "      - import a changeset from an hgweb server::"
+msgstr ""
+
+msgid "          hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+msgstr ""
+
+msgid "      - import all the patches in an Unix-style mbox::"
+msgstr ""
+
+msgid "          hg import incoming-patches.mbox"
+msgstr ""
+
+msgid ""
+"      - attempt to exactly restore an exported changeset (not always\n"
+"        possible)::"
+msgstr ""
+
+msgid "          hg import --exact proposed-fix.patch"
+msgstr ""
+
+msgid "need at least one patch to import"
+msgstr "取り込みには最低1つのパッチ名指定が必要です"
+
 msgid "cannot use --no-commit with --bypass"
-msgstr "--no-commit と --bypass は併用出来ません"
+msgstr "--no-commit と --bypass は併用できません"
 
 msgid "cannot use --similarity with --bypass"
-msgstr "--similarity と --bypass は併用出来ません"
+msgstr "--similarity と --bypass は併用できません"
 
 msgid "patch is damaged or loses information"
 msgstr "パッチには破損ないし情報の欠落があります"
 
-msgid "to working directory"
-msgstr "作業領域"
+msgid "applied to working directory"
+msgstr "作業領域への適用"
 
 msgid "not a Mercurial patch"
 msgstr "Mercurial 向けのパッチではありません"
 
+#. i18n: refers to a short changeset id
+#, python-format
+msgid "created %s"
+msgstr "%s を作成"
+
 msgid "applying patch from stdin\n"
 msgstr "標準入力からのパッチを適用中\n"
 
 #, python-format
-msgid "applied %s\n"
-msgstr "%s に対して適用\n"
-
-msgid "no diffs found"
-msgstr "差分がありません"
+msgid "%s: no diffs found"
+msgstr "%s: 差分がありません"
 
 msgid "run even if remote repository is unrelated"
 msgstr "連携先が無関係なリポジトリでも実行"
@@ -9178,16 +10110,17 @@
 "    pull location. These are the changesets that would have been pulled\n"
 "    if a pull at the time you issued this command."
 msgstr ""
-"    ファイルパスや URL、 'hg pull' の default 取り込み対象により指定\n"
-"    されるリポジトリ中の、 未取り込みリビジョンを検索します。\n"
-"    これらは、 'hg pull' を実行した際の取り込み対象リビジョンです。"
+"    ファイルパス、 URL ないし :hg:`pull` の無指定時連携先リポジトリ中の、\n"
+"    未取り込みリビジョンを検索します。 これらのリビジョンは\n"
+"    :hg:`pull` を実行した際に、 取り込み対象となります。"
 
 msgid ""
 "    For remote repository, using --bundle avoids downloading the\n"
 "    changesets twice if the incoming is followed by a pull."
 msgstr ""
-"    遠隔ホストのリポジトリの場合、 --bundle を使用することで、 本コマンド\n"
-"    実行後の 'hg pull' 実施の際に、 再度のリビジョン検索を抑止できます。"
+"    --bundle での書き出し結果を利用した :hg:`pull` の実施は、\n"
+"    :hg:`pull` での再度のデータ転送を抑止できるため、\n"
+"    (データ転送コストの高い) 遠隔ホストとの連携では特に有用です。"
 
 msgid "    See pull for valid source format details."
 msgstr "    対象リポジトリの指定形式は :hg:`help pull` を参照してください。"
@@ -9322,29 +10255,25 @@
 msgstr "    特定のファイルないしリポジトリ全体の変更履歴を表示します。"
 
 msgid ""
+"    If no revision range is specified, the default is ``tip:0`` unless\n"
+"    --follow is set, in which case the working directory parent is\n"
+"    used as the starting revision."
+msgstr ""
+"    特に指定されない場合、 対象となるリビジョンの範囲は ``tip:0``\n"
+"    とみなされますが、 --follow が指定された場合は、 作業領域の\n"
+"    親リビジョンが開始リビジョンとみなされます。"
+
+msgid ""
 "    File history is shown without following rename or copy history of\n"
 "    files. Use -f/--follow with a filename to follow history across\n"
 "    renames and copies. --follow without a filename will only show\n"
-"    ancestors or descendants of the starting revision. --follow-first\n"
-"    only follows the first parent of merge revisions."
+"    ancestors or descendants of the starting revision."
 msgstr ""
 "    ファイルの履歴表示では、 改名/複製時の元ファイルにまでさかのぼった\n"
 "    履歴は表示しません。 元ファイルの履歴をさかのぼる場合は、 ファイル名\n"
 "    と一緒に -f/--follow を使用します。 --follow 指定の際にファイル名が\n"
 "    指定されない場合は、 開始リビジョンに連なるリビジョンのみを表示\n"
-"    します。 --follow-first 指定は、 マージリビジョンにおいて第1親の履歴\n"
-"    のみをさかのぼります。"
-
-msgid ""
-"    If no revision range is specified, the default is ``tip:0`` unless\n"
-"    --follow is set, in which case the working directory parent is\n"
-"    used as the starting revision. You can specify a revision set for\n"
-"    log, see :hg:`help revsets` for more information."
-msgstr ""
-"    特に指定されない場合、 対象となるリビジョンの範囲は ``tip:0``\n"
-"    とみなされますが、 --follow が指定された場合は、 作業領域の\n"
-"    親リビジョンが開始リビジョンとみなされます。 複数のリビジョンの\n"
-"    ログを一括して表示させる方法は :hg:`help revsets` を参照してください。"
+"    します。"
 
 msgid ""
 "    By default this command prints revision number and changeset id,\n"
@@ -9371,6 +10300,78 @@
 "       固定されているためです。 ファイル一覧が予期せぬ内容となるのは、\n"
 "       親同士で内容が異なるファイルのみが列挙されるためです。"
 
+msgid ""
+"    .. note::\n"
+"       for performance reasons, log FILE may omit duplicate changes\n"
+"       made on branches and will not show deletions. To see all\n"
+"       changes including duplicates and deletions, use the --removed\n"
+"       switch."
+msgstr ""
+
+msgid "      - changesets with full descriptions and file lists::"
+msgstr ""
+
+msgid "          hg log -v"
+msgstr ""
+
+msgid "      - changesets ancestral to the working directory::"
+msgstr ""
+
+msgid "          hg log -f"
+msgstr ""
+
+msgid "      - last 10 commits on the current branch::"
+msgstr ""
+
+msgid "          hg log -l 10 -b ."
+msgstr ""
+
+msgid ""
+"      - changesets showing all modifications of a file, including removals::"
+msgstr ""
+
+msgid "          hg log --removed file.c"
+msgstr ""
+
+msgid ""
+"      - all changesets that touch a directory, with diffs, excluding merges::"
+msgstr ""
+
+msgid "          hg log -Mp lib/"
+msgstr ""
+
+msgid "      - all revision numbers that match a keyword::"
+msgstr ""
+
+msgid "          hg log -k bug --template \"{rev}\\n\""
+msgstr ""
+
+msgid "      - check if a given changeset is included is a tagged release::"
+msgstr ""
+
+msgid "          hg log -r \"a21ccf and ancestor(1.9)\""
+msgstr ""
+
+msgid "      - find all changesets by some user in a date range::"
+msgstr ""
+
+msgid "          hg log -k alice -d \"may 2008 to jul 2008\""
+msgstr ""
+
+msgid "      - summary of all changesets after the last tag::"
+msgstr ""
+
+msgid ""
+"          hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+msgstr ""
+
+msgid ""
+"    See :hg:`help revisions` and :hg:`help revsets` for more about\n"
+"    specifying revisions."
+msgstr ""
+"    リビジョン指定の詳細は :hg:`help revisions` および :hg:`help revsets`\n"
+"    を参照してください。"
+
 msgid "revision to display"
 msgstr "表示対象リビジョン"
 
@@ -9409,7 +10410,7 @@
 "    この場合、 削除/改名対象ファイルも含まれます。"
 
 msgid "can't specify a revision with --all"
-msgstr "リビジョン指定と --all は併用出来ません"
+msgstr "リビジョン指定と --all は併用できません"
 
 msgid "force a merge with outstanding changes"
 msgstr "作業領域中の未コミット変更ごとマージを実施"
@@ -9489,14 +10490,14 @@
 msgstr "ブランチ '%s' には %d 個のヘッドあります - 対象を明示してください"
 
 msgid "run 'hg heads .' to see heads"
-msgstr "'hg heads .' によりヘッドを一覧表示出来ます"
+msgstr "'hg heads .' によりヘッドを一覧表示できます"
 
 #, python-format
 msgid "branch '%s' has one head - please merge with an explicit rev"
 msgstr "ブランチ '%s' は単一ヘッドです - 対象を明示してください"
 
 msgid "run 'hg heads' to see all heads"
-msgstr "'hg heads' によりヘッドを一覧表示出来ます"
+msgstr "'hg heads' によりヘッドを一覧表示できます"
 
 msgid "there is nothing to merge"
 msgstr "マージの必要がありません"
@@ -9528,9 +10529,10 @@
 "    or the default push location. These are the changesets that would\n"
 "    be pushed if a push was requested."
 msgstr ""
-"    指定された連携先リポジトリ(ないし、 無指定時の hg push 先リポジトリ)に\n"
-"    含まれないチェンジセットを表示します。 ここで表示されるチェンジセットは\n"
-"    hg push 実施の際に、 連携先リポジトリへと反映されるチェンジセットです。"
+"    指定された連携先リポジトリ (ないし、 無指定時の :hg:`push`\n"
+"    先リポジトリ) に含まれないチェンジセットを表示します。\n"
+"    ここで表示されるチェンジセットは、\n"
+"    :hg:`push` 実施の際に、 連携先へと反映されるチェンジセットです。"
 
 msgid "    See pull for details of valid destination formats."
 msgstr "    有効なリポジトリ指定形式は :hg:`pull` を参照してください。"
@@ -9711,7 +10713,7 @@
 msgid ""
 "other repository doesn't support revision lookup, so a rev cannot be "
 "specified."
-msgstr "連携先でリビジョンが特定出来ないため、 リビジョンは指定できません"
+msgstr "連携先でリビジョンが特定できないため、 リビジョンは指定できません"
 
 #, python-format
 msgid "importing bookmark %s\n"
@@ -9842,65 +10844,70 @@
 msgid "remove the specified files on the next commit"
 msgstr "次回コミットにおける指定ファイルの登録除外"
 
-msgid "    Schedule the indicated files for removal from the repository."
-msgstr "    構成管理対象からの指定ファイルの登録除外を予約します。"
-
-msgid ""
-"    This only removes files from the current branch, not from the\n"
-"    entire project history. -A/--after can be used to remove only\n"
-"    files that have already been deleted, -f/--force can be used to\n"
-"    force deletion, and -Af can be used to remove files from the next\n"
-"    revision without deleting them from the working directory."
-msgstr ""
-"    現行ブランチにおける登録除外であり、\n"
-"    リポジトリ履歴から抹消されるわけではありません。\n"
-"    手動で削除したファイルを登録除外するには -A/--after を、\n"
-"    強制的に登録除外するには -f/--force を、\n"
-"    登録除外の際に、作業領域中のファイルを削除しない場合には\n"
-"    -Af を指定します。"
-
-msgid ""
-"    The following table details the behavior of remove for different\n"
-"    file states (columns) and option combinations (rows). The file\n"
-"    states are Added [A], Clean [C], Modified [M] and Missing [!] (as\n"
-"    reported by :hg:`status`). The actions are Warn, Remove (from\n"
-"    branch) and Delete (from disk)::"
-msgstr ""
-"    ファイルの状態(横)と、 オプション指定(縦)の組み合わせにおける挙動は、\n"
-"    以下の一覧を参照してください。\n"
-"    ファイルの状態は、 :hg:`status` の表示に倣い、\n"
-"    追加(Added)[A]、 改変無し(Clean)[C]、 改変有り(Modified)[M]\n"
-"    および不在(Missing)[!] で表します。\n"
-"    挙動は、 警告(Warn)[W]、 構成管理からの登録除外(Remove)[R] および\n"
-"    作業領域からの削除(Delete)[D] で表します::"
-
-msgid ""
-"             A  C  M  !\n"
-"      none   W  RD W  R\n"
-"      -f     R  RD RD R\n"
-"      -A     W  W  W  R\n"
-"      -Af    R  R  R  R"
-msgstr ""
-"             A  C  M  !\n"
-"      無指定 W  RD W  R\n"
-"      -f     R  RD RD R\n"
-"      -A     W  W  W  R\n"
-"      -Af    R  R  R  R"
-
-msgid ""
-"    Note that remove never deletes files in Added [A] state from the\n"
-"    working directory, not even if option --force is specified."
-msgstr ""
-"    作業領域における追加 [A] 状態のファイルに関しては、\n"
-"    --force を指定しなくても、\n"
-"    登録除外操作によって破棄されることはありません。"
+msgid "    Schedule the indicated files for removal from the current branch."
+msgstr "    現ブランチでの、 構成管理対象からのファイルの除外を予約します。"
 
 msgid ""
 "    This command schedules the files to be removed at the next commit.\n"
-"    To undo a remove before that, see :hg:`revert`."
-msgstr ""
-"    指定ファイルは、 次回のコミットの際に登録除外されます。 登録除外の\n"
-"    コミット前取り消しは :hg:`help revert` を参照してください。"
+"    To undo a remove before that, see :hg:`revert`. To undo added\n"
+"    files, see :hg:`forget`."
+msgstr ""
+"    指定ファイルは、 次回のコミットで登録除外されます。 コミット前に、\n"
+"    登録除外の取り消しは :hg:`help revert` を、 構成管理登録の取り消しは\n"
+"    :hg:`forget` を参照してください。"
+
+msgid ""
+"      -A/--after can be used to remove only files that have already\n"
+"      been deleted, -f/--force can be used to force deletion, and -Af\n"
+"      can be used to remove files from the next revision without\n"
+"      deleting them from the working directory."
+msgstr ""
+"      手動で削除したファイルを登録除外するには -A/--after を、\n"
+"      強制的に登録除外するには -f/--force を、\n"
+"      登録除外の際に、作業領域中のファイルを削除しない場合には\n"
+"      -Af を指定します。"
+
+msgid ""
+"      The following table details the behavior of remove for different\n"
+"      file states (columns) and option combinations (rows). The file\n"
+"      states are Added [A], Clean [C], Modified [M] and Missing [!]\n"
+"      (as reported by :hg:`status`). The actions are Warn, Remove\n"
+"      (from branch) and Delete (from disk):"
+msgstr ""
+"      ファイルの状態 (横) と、 オプション指定 (縦) の組み合わせと挙動は、\n"
+"      以下の一覧を参照してください。\n"
+"      ファイルの状態は、 :hg:`status` の表示に倣い、\n"
+"      追加 (Added) [A]、 改変無し (Clean) [C]、 改変有り (Modified) [M]\n"
+"      および不在 (Missing) [!] で表します。\n"
+"      挙動は、 警告 (Warn) [W]、 構成管理からの登録除外 (Remove) [R]\n"
+"      および作業領域からの削除 (Delete) [D] で表します::"
+
+msgid ""
+"      ======= == == == ==\n"
+"              A  C  M  !\n"
+"      ======= == == == ==\n"
+"      none    W  RD W  R\n"
+"      -f      R  RD RD R\n"
+"      -A      W  W  W  R\n"
+"      -Af     R  R  R  R\n"
+"      ======= == == == =="
+msgstr ""
+"      ======= == == == ==\n"
+"              A  C  M  !\n"
+"      ======= == == == ==\n"
+"      無指定  W  RD W  R\n"
+"      -f      R  RD RD R\n"
+"      -A      W  W  W  R\n"
+"      -Af     R  R  R  R\n"
+"      ======= == == == =="
+
+msgid ""
+"      Note that remove never deletes files in Added [A] state from the\n"
+"      working directory, not even if option --force is specified."
+msgstr ""
+"      作業領域における追加 [A] 状態のファイルに関しては、\n"
+"      --force を指定しなくても、\n"
+"      登録除外操作によって破棄されることはありません。"
 
 msgid ""
 "    Returns 0 on success, 1 if any warnings encountered.\n"
@@ -9923,10 +10930,8 @@
 "%s は削除されません: ファイルは改変されています(削除の強行は -f を指定)\n"
 
 #, python-format
-msgid ""
-"not removing %s: file has been marked for add (use -f to force removal)\n"
-msgstr ""
-"%s は削除されません: ファイルは追加登録対象です(削除の強行は -f を指定)\n"
+msgid "not removing %s: file has been marked for add (use forget to undo)\n"
+msgstr "%s は削除されません: 追加登録対象ファイルです (取り消しは forget)\n"
 
 msgid "record a rename that has already occurred"
 msgstr "手動で改名済みのファイルに対して、 改名の旨を記録"
@@ -9994,7 +10999,8 @@
 "      performed for files already marked as resolved. Use ``--all/-a``\n"
 "      to select all unresolved files. ``--tool`` can be used to specify\n"
 "      the merge tool used for the given files. It overrides the HGMERGE\n"
-"      environment variable and your configuration files."
+"      environment variable and your configuration files.  Previous file\n"
+"      contents are saved with a ``.orig`` suffix."
 msgstr ""
 "    - :hg:`resolve [--tool TOOL] FILE...`: 指定ファイルのマージを\n"
 "      再度実施します。 この際には、 直前までの変更内容は破棄されます。\n"
@@ -10002,7 +11008,8 @@
 "      全ての未解消ファイルに適用する場合は ``--all/-a`` を指定します。\n"
 "      ``--tool`` を使用することで、 ファイルのマージに使用するコマンドを\n"
 "      指定可能です。 このオプションによる指定は、 HGMERGE 環境変数や\n"
-"      設定ファイルによる指定を上書きします。"
+"      設定ファイルによる指定を上書きします。 以前のファイルの内容は、\n"
+"      ``.orig`` 拡張子のフィルに保存されます。"
 
 msgid ""
 "    - :hg:`resolve -m [FILE]`: mark a file as having been resolved\n"
@@ -10048,7 +11055,7 @@
 msgstr "オプション指定が過剰です"
 
 msgid "can't specify --all and patterns"
-msgstr "--all とパターンは同時に指定出来ません"
+msgstr "--all とパターンは同時に指定できません"
 
 msgid "no files or directories specified; use --all to remerge all files"
 msgstr "再マージには、 ファイル/ディレクトリか、 --all を指定してください"
@@ -10120,7 +11127,7 @@
 "    ファイルに保存されます。 この保存は --no-backup で無効化されます。"
 
 msgid "you can't specify a revision and a date"
-msgstr "リビジョンと日時は同時には指定出来ません"
+msgstr "リビジョンと日時は同時には指定できません"
 
 msgid "uncommitted merge with no revision specified"
 msgstr "マージが未コミットな上に、対象リビジョンが明示されていません"
@@ -10181,6 +11188,9 @@
 msgid "no changes needed to %s\n"
 msgstr "%s には改変の必要がありません\n"
 
+msgid "ignore safety measures"
+msgstr ""
+
 msgid "roll back the last transaction (dangerous)"
 msgstr "直前のトランザクションの巻き戻し(要注意)"
 
@@ -10221,6 +11231,14 @@
 "    - unbundle"
 
 msgid ""
+"    It's possible to lose data with rollback: commit, update back to\n"
+"    an older changeset, and then rollback. The update removes the\n"
+"    changes you committed from the working directory, and rollback\n"
+"    removes them from history. To avoid data loss, you must pass\n"
+"    --force in this case."
+msgstr ""
+
+msgid ""
 "    This command is not intended for use on public repositories. Once\n"
 "    changes are visible for pull by other users, rolling a transaction\n"
 "    back locally is ineffective (someone else may already have pulled\n"
@@ -10325,8 +11343,8 @@
 "    stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
 "    files."
 msgstr ""
-"    特に指定が無い場合、 サーバはアクセスログを標準出力に、 エラーを\n"
-"    標準エラー出力に表示します。 ログをファイルに記録する場合は、\n"
+"    特に指定が無い場合、 サーバはアクセスログを標準出力に、\n"
+"    エラーを標準エラー出力に表示します。 ログをファイルに記録する場合は、\n"
 "    -A/--accesslog や -E/--errorlog で指定します。"
 
 msgid ""
@@ -10491,6 +11509,24 @@
 "      I = 無視(Ignored)\n"
 "        = 直前に表示される新規登録予定ファイル(A)の複製元"
 
+msgid "      - show changes in the working directory relative to a changeset:"
+msgstr ""
+
+msgid "          hg status --rev 9353"
+msgstr ""
+
+msgid "      - show all changes including copies in an existing changeset::"
+msgstr ""
+
+msgid "          hg status --copies --change 9353"
+msgstr ""
+
+msgid "      - get a NUL separated list of added files, suitable for xargs::"
+msgstr ""
+
+msgid "          hg status -an0"
+msgstr ""
+
 msgid "check for push and pull"
 msgstr "push/pull 実施結果の確認"
 
@@ -10525,6 +11561,9 @@
 msgid "branch: %s\n"
 msgstr "ブランチ        : %s\n"
 
+msgid "bookmarks:"
+msgstr "ブックマーク    :"
+
 #, python-format
 msgid "%d modified"
 msgstr "変更ファイル数     %d"
@@ -10649,8 +11688,8 @@
 msgstr ""
 "    タグの用途は、 リポジトリ中の特定リビジョンへの名前付けであり、\n"
 "    リビジョン間での比較や、 重要なリビジョンの参照、\n"
-"    リリース時の分岐点に対する目印、 などの用途に使用出来ます。\n"
-"    既存タグの改変は、 通常では出来ません。 -f/--force の指定が必要です"
+"    リリース時の分岐点に対する目印、 などの用途に使用できます。\n"
+"    既存タグの改変は、 通常ではできません。 -f/--force の指定が必要です"
 
 msgid ""
 "    If no revision is given, the parent of the working directory is\n"
@@ -10876,9 +11915,6 @@
 msgid "cannot specify both -c/--check and -C/--clean"
 msgstr "-c/--check と -C/--clean は併用できません"
 
-msgid "uncommitted local changes"
-msgstr "作業領域に未コミットの変更があります"
-
 msgid "verify the integrity of the repository"
 msgstr "リポジトリの整合性検証"
 
@@ -11268,20 +12304,6 @@
 " %s のマージに適切なツールが見つかりません\n"
 "どちらの内容を採用しますか? 作業領域:(l)ocal マージ対象:(o)ther"
 
-msgid "&Local"
-msgstr "&Local"
-
-msgid "&Other"
-msgstr "&Other"
-
-#, python-format
-msgid "merging %s and %s to %s\n"
-msgstr "%s と %s を %s にマージ中\n"
-
-#, python-format
-msgid "merging %s\n"
-msgstr "%s をマージ中\n"
-
 #, python-format
 msgid "%s.premerge not valid ('%s' is neither boolean nor %s)"
 msgstr "%s.premerge は無効です('%s' は真偽ないし %s のいずれでもありません)"
@@ -11546,6 +12568,33 @@
 msgid "unknown bisect kind %s"
 msgstr "未知の分岐種類 %s"
 
+msgid "invalid bisect state"
+msgstr ""
+
+#. i18n: bisect changeset status
+msgid "good"
+msgstr ""
+
+#. i18n: bisect changeset status
+msgid "bad"
+msgstr ""
+
+#. i18n: bisect changeset status
+msgid "skipped"
+msgstr ""
+
+#. i18n: bisect changeset status
+msgid "untested"
+msgstr ""
+
+#. i18n: bisect changeset status
+msgid "good (implicit)"
+msgstr ""
+
+#. i18n: bisect changeset status
+msgid "bad (implicit)"
+msgstr ""
+
 msgid "disabled extensions:"
 msgstr "無効化されているエクステンション:"
 
@@ -11613,9 +12662,9 @@
 "by ``name = value`` entries::"
 msgstr ""
 "Mercurial の設定ファイルは、 いわゆる ini ファイル形式で記述されます。\n"
-"設定ファイルは、\n"
-"``[セクション名]`` 形式のヘッダによって始まるセクションから構成され、\n"
-"セクションには ``名前 = 値`` 形式の要素が列挙されます::"
+"設定ファイルは、 「セクション」から構成され、\n"
+"各セクションは ``[セクション名]`` 形式のヘッダで始まり、\n"
+"``名前 = 値`` 形式の要素が列挙されます::"
 
 msgid ""
 "  [ui]\n"
@@ -11639,7 +12688,7 @@
 "-----"
 msgstr ""
 "ファイル\n"
-"-----"
+"--------"
 
 msgid ""
 "Mercurial reads configuration data from several files, if they exist.\n"
@@ -11649,6 +12698,13 @@
 "``%USERPROFILE%\\mercurial.ini`` or ``$HOME/.hgrc`` and local\n"
 "configuration is put into the per-repository ``<repo>/.hg/hgrc`` file."
 msgstr ""
+"Mercurial は複数のファイルから設定情報を読み込みます。\n"
+"読み込み対象となるファイルは、 事前に存在しませんので、\n"
+"適切な位置にファイルを作成するのは、 利用者の責任となります。\n"
+"ユーザ名設定のような、 広範囲に渡る設定は、\n"
+"``%USERPROFILE%\\mercurial.ini`` や ``$HOME/.hgrc`` に、\n"
+"もっと狭い範囲に関する設定は、 各リポジトリ毎の ``<リポジトリ>/.hg/hgrc``\n"
+"において記述するのが一般的です。"
 
 msgid ""
 "The names of these files depend on the system on which Mercurial is\n"
@@ -11657,9 +12713,14 @@
 "paths are given below, settings from earlier paths override later\n"
 "ones."
 msgstr ""
+"設定ファイルの名前 (パス) は、 Mercurial の稼動環境に依存します。\n"
+"単一ディレクトリ直下の ``*.rc`` ファイルを読み込む場合、\n"
+"ファイル名のアルファベット順で読み込まれ、 先に読み込んだ設定よりも、\n"
+"後から読み込んだ設定の方が優先されます。 以下に列挙されるパスにおいて、\n"
+"複数から設定が読み込まれた場合は、 列挙順の早い方の設定が優先されます。"
 
 msgid "| (Unix, Windows) ``<repo>/.hg/hgrc``"
-msgstr ""
+msgstr "| (Unix, Windows) ``<リポジトリ>/.hg/hgrc``"
 
 msgid ""
 "    Per-repository configuration options that only apply in a\n"
@@ -11670,6 +12731,13 @@
 "    trusted user or to a trusted group. See the documentation for the\n"
 "    ``[trusted]`` section below for more details."
 msgstr ""
+"    個々のリポジトリにのみ適用される、 リポジトリ毎設定。\n"
+"    本ファイルは構成管理対象外であり、 :hg:`clone` \n"
+"    によって伝播することもありません。 本ファイルでの設定は、\n"
+"    以下に述べる全ての設定ファイルに優先します。 Unix 環境において、\n"
+"    本ファイルの所有者/グループが、 信頼できるものでない場合、\n"
+"    本ファイル中の設定の大半は無視されます。 詳細に関しては、\n"
+"    後述する ``trusted`` セクションの説明を参照してください。"
 
 msgid ""
 "| (Unix) ``$HOME/.hgrc``\n"
@@ -11678,6 +12746,11 @@
 "| (Windows) ``%HOME%\\.hgrc``\n"
 "| (Windows) ``%HOME%\\Mercurial.ini``"
 msgstr ""
+"| (Unix) ``$HOME/.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
+"| (Windows) ``%HOME%\\.hgrc``\n"
+"| (Windows) ``%HOME%\\Mercurial.ini``"
 
 msgid ""
 "    Per-user configuration file(s), for the user running Mercurial. On\n"
@@ -11687,11 +12760,18 @@
 "installation\n"
 "    options."
 msgstr ""
+"    Mercurial を実行するユーザのための、 ユーザ毎設定。\n"
+"    Windows 9x 環境での ``%HOME%`` は ``%APPDATA%`` に相当します。\n"
+"    本ファイルでの設定は、 当該ユーザの全ての Mercurial\n"
+"    コマンド実行に適用されます。 本ファイルでの設定は、\n"
+"    システム毎/インストール毎の設定より優先されます。"
 
 msgid ""
 "| (Unix) ``/etc/mercurial/hgrc``\n"
 "| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
 msgstr ""
+"| (Unix) ``/etc/mercurial/hgrc``\n"
+"| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
 
 msgid ""
 "    Per-system configuration files, for the system on which Mercurial\n"
@@ -11699,11 +12779,17 @@
 "    executed by any user in any directory. Options in these files\n"
 "    override per-installation options."
 msgstr ""
+"    Mercurial の稼動環境におけるシステム毎設定。\n"
+"    本ファイルでの設定は、 実行ユーザ/実行位置に関わらず、\n"
+"    全ての Mercurial コマンド実行に適用されます。\n"
+"    本ファイルでの設定は、 インストール毎設定より優先されます。"
 
 msgid ""
 "| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
 "| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
 msgstr ""
+"| (Unix) ``<インストール先>/etc/mercurial/hgrc``\n"
+"| (Unix) ``<インストール先>/etc/mercurial/hgrc.d/*.rc``"
 
 msgid ""
 "    Per-installation configuration files, searched for in the\n"
@@ -11713,12 +12799,22 @@
 "    in ``/shared/tools/etc/mercurial/hgrc``. Options in these files apply\n"
 "    to all Mercurial commands executed by any user in any directory."
 msgstr ""
+"    Mercurial のインストール先から読み込まれる、 インストール毎設定。\n"
+"    ``<インストール先>`` は、 実行される **hg** コマンド\n"
+"    (ないしシンボリックリンク) の親ディレクトリを意味します。\n"
+"    例えば、 ``/shared/tools/bin/hg`` が実行される場合、\n"
+"    ``/shared/tools/etc/mercurial/hgrc`` が読み込まれます。\n"
+"    本ファイルでの設定は、 実行ユーザ/実行位置に関わらず、\n"
+"    当該 Mercurial コマンドの実行の全て対して適用されます。"
 
 msgid ""
 "| (Windows) ``<install-dir>\\Mercurial.ini`` **or**\n"
 "| (Windows) ``<install-dir>\\hgrc.d\\*.rc`` **or**\n"
 "| (Windows) ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``"
 msgstr ""
+"| (Windows) ``<インストール先>\\Mercurial.ini`` **or**\n"
+"| (Windows) ``<インストール先>\\hgrc.d\\*.rc`` **or**\n"
+"| (Windows) ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``"
 
 msgid ""
 "    Per-installation/system configuration files, for the system on\n"
@@ -11731,23 +12827,33 @@
 "    pywin32 extensions are not installed, Mercurial will only look for\n"
 "    site-wide configuration in ``C:\\Mercurial\\Mercurial.ini``."
 msgstr ""
+"    Mercurial の稼動環境における、 インストール毎/システム毎設定。\n"
+"    本ファイルでの設定は、 実行ユーザ/実行位置に関わらず、\n"
+"    当該 Mercurial コマンドの全ての実行に対して適用されます。\n"
+"    レジストリキーは PATH 環境変数的な値を保持し、\n"
+"    値の各要素は、 ファイル ``Mercurial.ini`` を参照するか、\n"
+"    ``*.rc`` ファイルを格納するディレクトリでなければなりません。\n"
+"    1つ以上の設定ファイルが検出されるまで、\n"
+"    Mercurial は記述順序通りに、 各位置のファイル所在確認を行います。\n"
+"    pywin32 拡張が未インストールの場合、\n"
+"    Mercurial はシステム毎設定の ``C:\\Mercurial\\Mercurial.ini``\n"
+"    のみを読み込みます。"
 
 msgid ""
 "Syntax\n"
 "------"
 msgstr ""
 "文法\n"
-"------"
+"----"
 
 msgid ""
 "A configuration file consists of sections, led by a ``[section]`` header\n"
 "and followed by ``name = value`` entries (sometimes called\n"
 "``configuration keys``)::"
 msgstr ""
-"設定ファイルは、\n"
-"``[セクション名]`` 形式のヘッダによって始まるセクションから構成され、\n"
-"セクションには ``名前 = 値`` 形式の要素 (``設定キー`` と呼称される事も)\n"
-"が列挙されます::"
+"設定ファイルは、 「セクション」から構成され、\n"
+"各セクションは ``[セクション名]`` 形式のヘッダで始まり、\n"
+"``名前 = 値`` 形式の要素 (``設定キー`` と呼称される事も) が列挙されます::"
 
 msgid ""
 "    [spam]\n"
@@ -11755,6 +12861,10 @@
 "    green=\n"
 "       eggs"
 msgstr ""
+"    [spam]\n"
+"    eggs=ham\n"
+"    green=\n"
+"       eggs"
 
 msgid ""
 "Each line contains one entry. If the lines that follow are indented,\n"
@@ -11762,11 +12872,19 @@
 "removed from values. Empty lines are skipped. Lines beginning with\n"
 "``#`` or ``;`` are ignored and may be used to provide comments."
 msgstr ""
+"設定記述は一行一エントリです。 但し、 後続行が字下げされている場合は、\n"
+"エントリ記述が継続しているものとみなされます。\n"
+"値記述の先頭の (半角) 空白文字は除外されます。\n"
+"空行は無視されます。 ``#`` ないし ``;`` で始まる行は、\n"
+"コメント行として無視されます。"
 
 msgid ""
 "Configuration keys can be set multiple times, in which case Mercurial\n"
 "will use the value that was configured last. As an example::"
 msgstr ""
+"同一設定キーに対して、 複数回の記述が可能ですが、\n"
+"Mercurial は最後に設定された値を使用します。\n"
+"例えば::"
 
 msgid ""
 "    [spam]\n"
@@ -11774,15 +12892,24 @@
 "    ham=serrano\n"
 "    eggs=small"
 msgstr ""
+"    [spam]\n"
+"    eggs=large\n"
+"    ham=serrano\n"
+"    eggs=small"
 
 msgid "This would set the configuration key named ``eggs`` to ``small``."
 msgstr ""
+"上記記述の場合、 設定キー ``eggs`` の値として採用されるのは\n"
+"``small`` です。"
 
 msgid ""
 "It is also possible to define a section multiple times. A section can\n"
 "be redefined on the same and/or on different configuration files. For\n"
 "example::"
 msgstr ""
+"同一セクションを複数回記述することも可能です。 複数回の記述場所は、\n"
+"同一ファイル中でも、 異なる設定ファイル間でも構いません。\n"
+"例えば::"
 
 msgid ""
 "    [foo]\n"
@@ -11790,6 +12917,10 @@
 "    ham=serrano\n"
 "    eggs=small"
 msgstr ""
+"    [foo]\n"
+"    eggs=large\n"
+"    ham=serrano\n"
+"    eggs=small"
 
 msgid ""
 "    [bar]\n"
@@ -11797,6 +12928,10 @@
 "    green=\n"
 "       eggs"
 msgstr ""
+"    [bar]\n"
+"    eggs=ham\n"
+"    green=\n"
+"       eggs"
 
 msgid ""
 "    [foo]\n"
@@ -11804,6 +12939,10 @@
 "    eggs=medium\n"
 "    bread=toasted"
 msgstr ""
+"    [foo]\n"
+"    ham=prosciutto\n"
+"    eggs=medium\n"
+"    bread=toasted"
 
 msgid ""
 "This would set the ``eggs``, ``ham``, and ``bread`` configuration keys\n"
@@ -11811,6 +12950,11 @@
 "respectively. As you can see there only thing that matters is the last\n"
 "value that was set for each of the configuration keys."
 msgstr ""
+"上記の設定記述の場合、\n"
+"``foo`` セクションの\n"
+"``eggs``、 ``ham`` および ``bread`` 設定キーの値はそれぞれ\n"
+"``medium``、 ``prosciutto`` および ``toasted`` となります。\n"
+"各設定キー毎に、 最後に設定された値が有効になるのです。"
 
 msgid ""
 "If a configuration key is set multiple times in different\n"
@@ -11819,6 +12963,9 @@
 "paths overriding later ones as described on the ``Files`` section\n"
 "above."
 msgstr ""
+"同一設定キーに対して、 異なるファイルでそれぞれ設定が記述された場合、\n"
+"「最後の設定値」はファイルの読み込み順序に依存します。\n"
+"先の ``ファイル`` セクションでのパスの列挙順が、 より早い方が優先されます。"
 
 msgid ""
 "A line of the form ``%include file`` will include ``file`` into the\n"
@@ -11828,17 +12975,25 @@
 "Environment variables and ``~user`` constructs are expanded in\n"
 "``file``. This lets you do something like::"
 msgstr ""
+"``%include file`` 形式の記述によって、 当該設定ファイルにおいて\n"
+"``file`` が読み込まれます。 読み込みは再帰的に実施されるため、\n"
+"読み込み対象ファイルから、 他のファイルを読み込むことも可能です。\n"
+"ファイル名は、 ``%include`` 記述のあるファイルに対して、\n"
+"相対的なものとみなされます。 ``file`` における環境変数や ``~user``\n"
+"形式の記述は展開されます。 そのため、 以下のような記述によって::"
 
 msgid "  %include ~/.hgrc.d/$HOST.rc"
-msgstr ""
+msgstr "  %include ~/.hgrc.d/$HOST.rc"
 
 msgid "to include a different configuration file on each computer you use."
-msgstr ""
+msgstr "ホスト毎に異なる設定ファイルを読み込む事が可能です。"
 
 msgid ""
 "A line with ``%unset name`` will remove ``name`` from the current\n"
 "section, if it has been set previously."
 msgstr ""
+"当該セクションにおいて、 既に ``name`` が設定されている場合、\n"
+"``%unset name`` 形式の記述によって、 設定を破棄する事が可能です。"
 
 msgid ""
 "The values are either free-form text strings, lists of text strings,\n"
@@ -11847,36 +13002,51 @@
 "\"off\"\n"
 "(all case insensitive)."
 msgstr ""
+"設定する値には、 自由形式の文字列、 文字列の列挙、ないし真偽値の、\n"
+"いずれでも指定可能です。 真偽値の設定では、 \"1\"、 \"yes\"、\n"
+"\"true\" ないし \"on\" のいずれもが真値、 \"0\"、 \"no\"、 \"false\"\n"
+"ないし \"off\" のいずれもが偽値とみなされます。 (文字大小は無視されます)"
 
 msgid ""
 "List values are separated by whitespace or comma, except when values are\n"
 "placed in double quotation marks::"
 msgstr ""
+"列挙における各値は、 空白文字ないしコンマで区切られますが、\n"
+"二重引用符 (\") で囲まれた部位は分割されません::"
 
 msgid "  allow_read = \"John Doe, PhD\", brian, betty"
-msgstr ""
+msgstr "  allow_read = \"John Doe, PhD\", brian, betty"
 
 msgid ""
 "Quotation marks can be escaped by prefixing them with a backslash. Only\n"
 "quotation marks at the beginning of a word is counted as a quotation\n"
 "(e.g., ``foo\"bar baz`` is the list of ``foo\"bar`` and ``baz``)."
 msgstr ""
+"バックスラッシュを前に付ける事で、 引用符自体を記述する事が可能です。\n"
+"語の冒頭位置以外の引用符は、 引用符とはみなされません。\n"
+"(例: ``foo\"bar baz`` は ``foo\"bar`` と ``baz`` の列挙とみなされます)"
 
 msgid ""
 "Sections\n"
 "--------"
 msgstr ""
+"セクション\n"
+"----------"
 
 msgid ""
 "This section describes the different sections that may appear in a\n"
 "Mercurial configuration file, the purpose of each section, its possible\n"
 "keys, and their possible values."
 msgstr ""
+"Mercurial の設定ファイルで記述可能な各セクション毎の、\n"
+"用途、 設定キー、 および設定可能な値について以下で述べます。"
 
 msgid ""
 "``alias``\n"
 "\"\"\"\"\"\"\"\"\""
 msgstr ""
+"``alias``\n"
+"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "Defines command aliases.\n"
@@ -11887,54 +13057,72 @@
 "already used by ``$N`` in the definition are put at the end of the\n"
 "command to be executed."
 msgstr ""
+"コマンドの別名 (エイリアス) 定義。\n"
+"別名は、 他のコマンド (ないしエイリアス) や、 付加的な引数を使って、\n"
+"自分独自のコマンドの定義を可能にします。\n"
+"別名定義における ``$1`` や ``$2`` のような位置指定引数は、\n"
+"実行前に Mercurial によって置換されます。\n"
+"別名定義中で ``$N`` 形式による参照の無かった全ての引数は、\n"
+"実行されるコマンドの末尾に付与されます。"
 
 msgid "Alias definitions consist of lines of the form::"
-msgstr ""
+msgstr "別名定義では、 以下の形式の行を記述します::"
 
 msgid "    <alias> = <command> [<argument>]..."
-msgstr ""
+msgstr "    <別名> = <コマンド> [<引数>]..."
 
 msgid "For example, this definition::"
-msgstr ""
+msgstr "例えば、 以下の定義では::"
 
 msgid "    latest = log --limit 5"
-msgstr ""
+msgstr "    latest = log --limit 5"
 
 msgid ""
 "creates a new command ``latest`` that shows only the five most recent\n"
 "changesets. You can define subsequent aliases using earlier ones::"
 msgstr ""
+"最新の 5 リビジョンのみを表示する ``latest`` コマンドが定義されます。\n"
+"定義済みの別名を用いて、 違う別名を定義することも可能です::"
 
 msgid "    stable5 = latest -b stable"
-msgstr ""
+msgstr "    stable5 = latest -b stable"
 
 msgid ""
 ".. note:: It is possible to create aliases with the same names as\n"
 "   existing commands, which will then override the original\n"
 "   definitions. This is almost always a bad idea!"
 msgstr ""
+".. note:: 既存コマンドと同名の別名定義は、 既存コマンドを上書きします。\n"
+"   このような別名定義は、 大概悲惨な結果を招きます!"
 
 msgid ""
 "An alias can start with an exclamation point (``!``) to make it a\n"
 "shell alias. A shell alias is executed with the shell and will let you\n"
 "run arbitrary commands. As an example, ::"
 msgstr ""
+"感嘆符 (``!``) から始まる別名定義は、 シェル別名を意味します。\n"
+"シェル別名はシェルによって解釈され、 任意のコマンド実行が可能です。\n"
+"例えば以下の定義によって::"
 
 msgid "   echo = !echo"
-msgstr ""
+msgstr "   echo = !echo"
 
 msgid ""
 "will let you do ``hg echo foo`` to have ``foo`` printed in your\n"
 "terminal. A better example might be::"
 msgstr ""
+"``hg echo foo`` 実行は、 端末に ``foo`` を表示します。\n"
+"より実践的な例としては::"
 
 msgid "   purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
-msgstr ""
+msgstr "   purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
 
 msgid ""
 "which will make ``hg purge`` delete all unknown files in the\n"
 "repository in the same manner as the purge extension."
 msgstr ""
+"``hg purge`` 実行は、 作業領域中の全ての未知のファイルを、\n"
+"purge エクステンションと同じ作法で削除します。"
 
 msgid ""
 "Shell aliases are executed in an environment where ``$HG`` expand to\n"
@@ -11944,11 +13132,29 @@
 "``$HG_ARGS`` expand to the arguments given to Mercurial. In the ``hg\n"
 "echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``."
 msgstr ""
+"シェル別名では、 環境変数 ``$HG`` が、 別名コマンドを実行する\n"
+"Mercurial のパスに置換されます。\n"
+"この仕様は、 先の purge 別名のように、 シェル別名において\n"
+"Mercurial を実行する場合に有用です。\n"
+"更に、 環境変数 ``$HG_ARGS`` は Mercurial への引数に置換されますので、\n"
+"先述した ``hg echo foo`` では、\n"
+"``$HG_ARGS`` は ``echo foo`` に置換されます。"
+
+msgid ""
+".. note:: Some global configuration options such as ``-R`` are\n"
+"   processed before shell aliases and will thus not be passed to\n"
+"   aliases."
+msgstr ""
+".. note:: 幾つかのグローバルオプション (例: ``-R``) の処理は、\n"
+"   シェル別名の解釈前に実施されるため、 シェル別名に対して、\n"
+"   これらを指定することはできません。"
 
 msgid ""
 "``auth``\n"
 "\"\"\"\"\"\"\"\""
 msgstr ""
+"``auth``\n"
+"\"\"\"\"\"\"\"\""
 
 msgid ""
 "Authentication credentials for HTTP authentication. This section\n"
@@ -11956,17 +13162,22 @@
 "*into* HTTP servers. See the ``[web]`` configuration section if\n"
 "you want to configure *who* can login to your HTTP server."
 msgstr ""
+"HTTP 認証のための認証情報。 本セクションでは、 HTTP \n"
+"サーバへのログインで使用される、 ユーザ名/パスワードを記述します。\n"
+"HTTP サーバ側において、 ログイン可能ユーザを制御する場合の詳細は、\n"
+"``[web]`` セクションを参照してください。"
 
 msgid "Each line has the following format::"
-msgstr ""
+msgstr "設定は以下の形式で記述されます::"
 
 msgid "    <name>.<argument> = <value>"
-msgstr ""
+msgstr "    <名前>.<引数> = <値>"
 
 msgid ""
 "where ``<name>`` is used to group arguments into authentication\n"
 "entries. Example::"
 msgstr ""
+"``<名前>`` は引数群を1つの認証情報エントリに束ねる働きをします。 例えば::"
 
 msgid ""
 "    foo.prefix = hg.intevation.org/mercurial\n"
@@ -11974,6 +13185,10 @@
 "    foo.password = bar\n"
 "    foo.schemes = http https"
 msgstr ""
+"    foo.prefix = hg.intevation.org/mercurial\n"
+"    foo.username = foo\n"
+"    foo.password = bar\n"
+"    foo.schemes = http https"
 
 msgid ""
 "    bar.prefix = secure.example.org\n"
@@ -11981,9 +13196,13 @@
 "    bar.cert = path/to/file.cert\n"
 "    bar.schemes = https"
 msgstr ""
+"    bar.prefix = secure.example.org\n"
+"    bar.key = path/to/file.key\n"
+"    bar.cert = path/to/file.cert\n"
+"    bar.schemes = https"
 
 msgid "Supported arguments:"
-msgstr ""
+msgstr "利用可能な引数を以下に示します:"
 
 msgid ""
 "``prefix``\n"
@@ -11994,6 +13213,13 @@
 "    against the URI with its scheme stripped as well, and the schemes\n"
 "    argument, q.v., is then subsequently consulted."
 msgstr ""
+"``prefix``\n"
+"    ``*`` ないし URI (scheme 部分の記述は任意)。\n"
+"    最長マッチする prefix 指定を持つ認証情報が使用されます。\n"
+"    (``*`` は全てにマッチし、 マッチ長は 1 とみなされます)\n"
+"    prefix 指定が scheme 部分を持たない場合、 \n"
+"    scheme 部分を取り除いた URI に対する prefix のマッチングの後で、\n"
+"    (後述する) scheme 引数によるマッチングが行われます。"
 
 msgid ""
 "``username``\n"
@@ -12004,6 +13230,12 @@
 "    includes a username, only ``[auth]`` entries with a matching\n"
 "    username or without a username will be considered."
 msgstr ""
+"``username``\n"
+"    省略可。 認証におけるユーザ名。 本引数の指定が無く、 且つログイン時に\n"
+"    basic ないし digest 認証が要求された場合、 対話的入力が要求されます。\n"
+"    ``foo.username = $USER`` 形式の記述では、 環境変数が置換されます。\n"
+"    URI がユーザ名を含む場合、 選択対象となる ``[auth]`` のエントリは、\n"
+"    ユーザ名が合致するものか、 ユーザ名が無いものだけです。"
 
 msgid ""
 "``password``\n"
@@ -12011,18 +13243,28 @@
 "    remote site requires basic or digest authentication, the user\n"
 "    will be prompted for it."
 msgstr ""
+"``password``\n"
+"    省略可。 認証におけるパスワード。 本引数の指定が無く、\n"
+"    且つログイン時に basic ないし digest 認証が要求された場合、\n"
+"    対話的入力が要求されます。"
 
 msgid ""
 "``key``\n"
 "    Optional. PEM encoded client certificate key file. Environment\n"
 "    variables are expanded in the filename."
 msgstr ""
+"``key``\n"
+"    省略可能。 PEM 符号化されたクライアント証明書鍵ファイル。\n"
+"    ファイル名指定では、 環境変数の置換が実施されます。"
 
 msgid ""
 "``cert``\n"
 "    Optional. PEM encoded client certificate chain file. Environment\n"
 "    variables are expanded in the filename."
 msgstr ""
+"``cert``\n"
+"    省略可能。 PEM 符号化されたクライアント証明書連鎖ファイル。\n"
+"    ファイル名指定では、 環境変数の置換が実施されます。"
 
 msgid ""
 "``schemes``\n"
@@ -12032,23 +13274,35 @@
 "    static-http and static-https respectively, as well.\n"
 "    Default: https."
 msgstr ""
+"``schemes``\n"
+"    省略可能。 空白で区切った、 認証で使用される URI scheme の一覧。\n"
+"    prefix 引数に scheme が含まれない場合にのみ使用されます。\n"
+"    http および https が指定可能です。 それぞれ static-http および\n"
+"    static-https にもマッチします。 デフォルト値: https"
 
 msgid ""
 "If no suitable authentication entry is found, the user is prompted\n"
 "for credentials as usual if required by the remote."
 msgstr ""
+"ログイン時に認証が要求され、 且つ適切な認証情報記述が無い場合、\n"
+"認証情報に関する対話的入力が要求されます。"
 
 msgid ""
 "\n"
 "``decode/encode``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``decode/encode``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "Filters for transforming files on checkout/checkin. This would\n"
 "typically be used for newline processing or other\n"
 "localization/canonicalization of files."
 msgstr ""
+"リポジトリ/作業領域間の入出力における、 ファイル変換フィルタの指定。\n"
+"改行形式の変換に代表される、 ファイルの地域化/正規化に使用されます。"
 
 msgid ""
 "Filters consist of a filter pattern followed by a filter command.\n"
@@ -12058,19 +13312,30 @@
 "in ``.c`` anywhere in the repository, use the pattern ``**.c``.\n"
 "For each file only the first matching filter applies."
 msgstr ""
+"フィルタは、 フィルタコマンドを伴ったフィルタパターンで指定されます。\n"
+"特に指定が無い場合、 フィルタパターンは、 リポジトリルートを起点とする\n"
+"ワイルドカード形式とみなされます。 例えば、 ルート直下の ``.txt``\n"
+"拡張子を持つファイルにのみ合致させるパターンは ``*.txt`` となります。\n"
+"リポジトリ配下の全ての ``.c`` 拡張子のファイルに合致させるパターンは\n"
+"``**.c`` となります。 それぞれのファイルに適用されるフィルタは、\n"
+"最初にマッチしたパターンのものだけです。"
 
 msgid ""
 "The filter command can start with a specifier, either ``pipe:`` or\n"
 "``tempfile:``. If no specifier is given, ``pipe:`` is used by default."
 msgstr ""
+"フィルタコマンドの記述は ``pipe:``  ないし ``tempfile:`` で開始可能です。\n"
+"特に指定が無い場合は、 ``pipe:`` 指定相当とみなされます。"
 
 msgid ""
 "A ``pipe:`` command must accept data on stdin and return the transformed\n"
 "data on stdout."
 msgstr ""
+"``pipe:`` 指定のフィルタコマンドは、 標準入力からデータを読み込み、\n"
+"変換済みデータを標準出力に書き出さなければなりません。"
 
 msgid "Pipe example::"
-msgstr ""
+msgstr "pipe フィルタ例を以下に示します::"
 
 msgid ""
 "  [encode]\n"
@@ -12078,6 +13343,10 @@
 "  # note: not necessarily a good idea, just an example\n"
 "  *.gz = pipe: gunzip"
 msgstr ""
+"  [encode]\n"
+"  # 差分記録の圧縮効果向上のため、コミット時に gzip ファイルを解凍。\n"
+"  # 備考: あくまで例示であり、この方式自体はあまり良い案ではありません\n"
+"  *.gz = pipe: gunzip"
 
 msgid ""
 "  [decode]\n"
@@ -12085,6 +13354,10 @@
 "  # can safely omit \"pipe:\", because it's the default)\n"
 "  *.gz = gzip"
 msgstr ""
+"  [decode]\n"
+"  # 作業領域への取り出しの際に gzip ファイルを再圧縮\n"
+"  # (デフォルトである \"pipe:\" 指定は省略可能)\n"
+"  *.gz = gzip"
 
 msgid ""
 "A ``tempfile:`` command is a template. The string ``INFILE`` is replaced\n"
@@ -12093,126 +13366,179 @@
 "of an empty temporary file, where the filtered data must be written by\n"
 "the command."
 msgstr ""
+"``tempfile:`` 指定のフィルタコマンドは、 テンプレート形式で記述します。\n"
+"``INFILE`` 記述は、 処理対象データが格納された一時ファイルのパスに、\n"
+"``OUTFILE`` 記述は、 処理結果を格納する (空の) 一時ファイルのパスに、\n"
+"それぞれ置換されます。"
 
 msgid ""
 ".. note:: The tempfile mechanism is recommended for Windows systems,\n"
 "   where the standard shell I/O redirection operators often have\n"
 "   strange effects and may corrupt the contents of your files."
 msgstr ""
+".. note:: 標準的なシェルの I/O リダイレクトが、 予期せぬ結果や、\n"
+"   ファイル内容の破壊に繋がる  Windows のような環境では、\n"
+"   tempfile 機構の使用がお勧めです。"
 
 msgid ""
 "This filter mechanism is used internally by the ``eol`` extension to\n"
 "translate line ending characters between Windows (CRLF) and Unix (LF)\n"
 "format. We suggest you use the ``eol`` extension for convenience."
 msgstr ""
+"Windows (CRLF) と Unix (LF) 環境間における改行形式の変換を行う\n"
+"``eol`` エクステンションは、 内部的にフィルタ機構を使用しています。\n"
+"改行形式変更には、 ``eol`` エクステンションの利用をお勧めします。"
 
 msgid ""
 "\n"
 "``defaults``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``defaults``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid "(defaults are deprecated. Don't use them. Use aliases instead)"
-msgstr ""
+msgstr "(defaults の使用は非推奨です。 alias を使用してください)"
 
 msgid ""
 "Use the ``[defaults]`` section to define command defaults, i.e. the\n"
 "default options/arguments to pass to the specified commands."
 msgstr ""
+"``[defaults]`` セクションは、 指定コマンドに対する、\n"
+"デフォルトのオプション/引数指定の記述に使用します。"
 
 msgid ""
 "The following example makes :hg:`log` run in verbose mode, and\n"
 ":hg:`status` show only the modified files, by default::"
 msgstr ""
+"以下の記述は、 :hg:`log` の常時 verbose モード実行と、\n"
+":hg:`status` の変更ファイル限定表示化の例です::"
 
 msgid ""
 "  [defaults]\n"
 "  log = -v\n"
 "  status = -m"
 msgstr ""
+"  [defaults]\n"
+"  log = -v\n"
+"  status = -m"
 
 msgid ""
 "The actual commands, instead of their aliases, must be used when\n"
 "defining command defaults. The command defaults will also be applied\n"
 "to the aliases of the commands defined."
 msgstr ""
+"alias 定義で上書きされたコマンドでも、 元々のコマンドの方が\n"
+"defaults 定義対象となります。 alias 定義コマンドも\n"
+"defaults 定義対象となります。"
 
 msgid ""
 "\n"
 "``diff``\n"
 "\"\"\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``diff``\n"
+"\"\"\"\"\"\"\"\""
 
 msgid ""
 "Settings used when displaying diffs. Everything except for ``unified`` is a\n"
 "Boolean and defaults to False."
 msgstr ""
+"差分表示の設定。 ``unified`` 以外の全ての設定は真偽値で、 デフォルト値は\n"
+"False です。"
 
 msgid ""
 "``git``\n"
 "    Use git extended diff format."
 msgstr ""
+"``git``\n"
+"    git 拡張 diff 形式使用の有無。"
 
 msgid ""
 "``nodates``\n"
 "    Don't include dates in diff headers."
 msgstr ""
+"``nodates``\n"
+"    差分ヘッダ部分からの日付情報除外の有無。"
 
 msgid ""
 "``showfunc``\n"
 "    Show which function each change is in."
 msgstr ""
+"``showfunc``\n"
+"    変更が生じた関数の名前表示の有無。"
 
 msgid ""
 "``ignorews``\n"
 "    Ignore white space when comparing lines."
 msgstr ""
+"``ignorews``\n"
+"    差分検出における空白文字無視の有無。"
 
 msgid ""
 "``ignorewsamount``\n"
 "    Ignore changes in the amount of white space."
 msgstr ""
+"``ignorewsamount``\n"
+"    差分検出における空白文字数増減無視の有無。"
 
 msgid ""
 "``ignoreblanklines``\n"
 "    Ignore changes whose lines are all blank."
 msgstr ""
+"``ignoreblanklines``\n"
+"    差分検出における空行増減無視の有無。"
 
 msgid ""
 "``unified``\n"
 "    Number of lines of context to show."
 msgstr ""
+"``unified``\n"
+"    差分出力におけるコンテキスト行の行数。"
 
 msgid ""
 "``email``\n"
 "\"\"\"\"\"\"\"\"\""
 msgstr ""
+"``email``\n"
+"\"\"\"\"\"\"\"\"\""
 
 msgid "Settings for extensions that send email messages."
-msgstr ""
+msgstr "電子メールを送信するエクステンション向けの設定。"
 
 msgid ""
 "``from``\n"
 "    Optional. Email address to use in \"From\" header and SMTP envelope\n"
 "    of outgoing messages."
 msgstr ""
+"``from``\n"
+"    省略可能。 送信するメールの \"From\" ヘッダと SMTP\n"
+"    エンベロープに使用する電子メールアドレス。"
 
 msgid ""
 "``to``\n"
 "    Optional. Comma-separated list of recipients' email addresses."
 msgstr ""
+"``to``\n"
+"    省略可能。 宛先電子メールアドレスのカンマ区切り。"
 
 msgid ""
 "``cc``\n"
 "    Optional. Comma-separated list of carbon copy recipients'\n"
 "    email addresses."
 msgstr ""
+"``cc``\n"
+"    省略可能。 CC 宛先電子メールアドレスのカンマ区切り。"
 
 msgid ""
 "``bcc``\n"
 "    Optional. Comma-separated list of blind carbon copy recipients'\n"
 "    email addresses."
 msgstr ""
+"``bcc``\n"
+"    省略可能。 BCC 宛先電子メールアドレスのカンマ区切り。"
 
 msgid ""
 "``method``\n"
@@ -12223,6 +13549,16 @@
 "    message on stdin). Normally, setting this to ``sendmail`` or\n"
 "    ``/usr/sbin/sendmail`` is enough to use sendmail to send messages."
 msgstr ""
+"``method``\n"
+"    省略可能。 電子メールの送信方式。 ``smtp`` (デフォルト値)\n"
+"    が設定された場合、 直接 SMTP を使用して送信します。\n"
+"    (設定詳細は ``[smtp]`` セクション詳細を参照)\n"
+"    それ以外の値の場合は、 sendmail と同様に振舞う\n"
+"    (``-f`` オプションで送信元を指定、 コマンド行で宛先一覧を指定、\n"
+"    標準入力で送信内容の受け取り)\n"
+"    電子メール送信プログラムとみなします。\n"
+"    ``sendmail`` でのメール送信では、 通常は ``sendmail`` ないし\n"
+"    ``/usr/sbin/sendmail`` と設定すれば十分です。"
 
 msgid ""
 "``charsets``\n"
@@ -12234,9 +13570,16 @@
 "    conversion fails, the text in question is sent as is. Defaults to\n"
 "    empty (explicit) list."
 msgstr ""
+"``charsets``\n"
+"    省略可能。 宛先において都合の良い文字符号化方式のカンマ区切り。\n"
+"    電子メールのアドレス指定、 ヘッダ群、 およびパッチ 「以外」\n"
+"    のマルチパート部分は、 ローカル符号化方式 (``$HGENCODING`` ないし\n"
+"    ``ui.fallbackencoding`` で指定) からの変換に成功した、\n"
+"    「最初の」符号化方式で符号化されます。 変換に失敗した場合、\n"
+"    そのままのデータが送信されます。 デフォルトの設定は空のリストです。"
 
 msgid "    Order of outgoing email character sets:"
-msgstr ""
+msgstr "    電子メールの文字符号化方式は以下の順序で確定します:"
 
 msgid ""
 "    1. ``us-ascii``: always first, regardless of settings\n"
@@ -12245,9 +13588,14 @@
 "    4. ``$HGENCODING``: if not in email.charsets\n"
 "    5. ``utf-8``: always last, regardless of settings"
 msgstr ""
+"    1. ``us-ascii``: 設定に関わらず常に最初\n"
+"    2. ``email.charsets``: ユーザ指定の順序通り\n"
+"    3. ``ui.fallbackencoding``: email.charsets で指定されていない場合。\n"
+"    4. ``$HGENCODING``: email.charsets で指定されていない場合。\n"
+"    5. ``utf-8``: 設定に関わらず常に最後"
 
 msgid "Email example::"
-msgstr ""
+msgstr "email セクションの設定例を以下に示します::"
 
 msgid ""
 "  [email]\n"
@@ -12257,38 +13605,58 @@
 "  # us-ascii, utf-8 omitted, as they are tried first and last\n"
 "  charsets = iso-8859-1, iso-8859-15, windows-1252"
 msgstr ""
+"  [email]\n"
+"  from = Joseph User <joe.user@example.com>\n"
+"  method = /usr/sbin/sendmail\n"
+"  # 西欧圏向けの文字符号化設定\n"
+"  # 最初と最後に確認される us-ascii と utf-8 の記述は省略\n"
+"  charsets = iso-8859-1, iso-8859-15, windows-1252"
 
 msgid ""
 "\n"
 "``extensions``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``extensions``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "Mercurial has an extension mechanism for adding new features. To\n"
 "enable an extension, create an entry for it in this section."
 msgstr ""
+"Mercurial には、 機能追加のための、 エクステンション機構が備わっています。\n"
+"個々のエクステンションを有効にするには、 本セクションにおいて、\n"
+"対応するエントリを記述する必要があります。"
 
 msgid ""
 "If you know that the extension is already in Python's search path,\n"
 "you can give the name of the module, followed by ``=``, with nothing\n"
 "after the ``=``."
 msgstr ""
+"エクステンションの実装が、 Python の検索パス上にある場合、\n"
+"モジュール名に続けて ``=`` を記述するだけ (右辺値は不要) です。"
 
 msgid ""
 "Otherwise, give a name that you choose, followed by ``=``, followed by\n"
 "the path to the ``.py`` file (including the file name extension) that\n"
 "defines the extension."
 msgstr ""
+"それ以外の場合、 任意の名前に続けて ``=`` を記述した後ろに、\n"
+"エクステンションを実装した ``.py`` ファイルへのパス (ファイル名含む)\n"
+"を記述してください。"
 
 msgid ""
 "To explicitly disable an extension that is enabled in an hgrc of\n"
 "broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``\n"
 "or ``foo = !`` when path is not supplied."
 msgstr ""
+"先に読み込まれた設定ファイルにおいて、 有効化済みのエクステンションを、\n"
+"明示的に無効化したい場合は、 ``foo = !/ext/path`` あるいは ``foo = !``\n"
+"のように、 値の先頭に ``!`` が来るような設定を記述してください。"
 
 msgid "Example for ``~/.hgrc``::"
-msgstr ""
+msgstr "``~/.hgrc`` 記述例を以下に示します::"
 
 msgid ""
 "  [extensions]\n"
@@ -12297,12 +13665,20 @@
 "  # (this extension will get loaded from the file specified)\n"
 "  myfeature = ~/.hgext/myfeature.py"
 msgstr ""
+"  [extensions]\n"
+"  # (mq エクステンションは Mercurial 同梱のものが読み込まれます)\n"
+"  mq =\n"
+"  # (以下のエクステンションは指定のパスから読み込まれます)\n"
+"  myfeature = ~/.hgext/myfeature.py"
 
 msgid ""
 "\n"
 "``hostfingerprints``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``hostfingerprints``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "Fingerprints of the certificates of known HTTPS servers.\n"
@@ -12312,24 +13688,37 @@
 "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 ""
+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 ""
+msgstr "本機能は、 Python 2.6 以降でのみ使用可能です。"
 
 msgid ""
 "\n"
 "``format``\n"
 "\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``format``\n"
+"\"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "``usestore``\n"
@@ -12340,6 +13729,13 @@
 "    compatibility and ensures that the on-disk format of newly created\n"
 "    repositories will be compatible with Mercurial before version 0.9.4."
 msgstr ""
+"``usestore``\n"
+"    ファイル名の文字大小を認識しないようなファイルシステムへの、\n"
+"    適応性を向上させる、 \"store\" 形式リポジトリの使用可否。\n"
+"    デフォルトでは有効化されています。 この設定を無効化した場合、\n"
+"    新規作成したリポジトリは、 0.9.4 以前の Mercurial と、\n"
+"    ディスク記録形式で互換性が保たれますが、 状況次第では、\n"
+"    長いファイル名での保存が必要になります。"
 
 msgid ""
 "``usefncache``\n"
@@ -12350,6 +13746,14 @@
 "    option ensures that the on-disk format of newly created\n"
 "    repositories will be compatible with Mercurial before version 1.1."
 msgstr ""
+"``usefncache``\n"
+"    \"store\" 形式リポジトリ (本設定の有効化に必須) において、\n"
+"    長いファイル名を使用するための機能向上や、 \"nul\" のような Windows\n"
+"    予約名利用を回避可能にする、 \"fncache\"\n"
+"    形式リポジトリの使用可否。\n"
+"    デフォルトでは有効化されています。 この設定を無効化した場合、\n"
+"    新規作成したリポジトリは、 1.1 以前の Mercurial と、\n"
+"    ディスク記録形式で互換性が保たれます。"
 
 msgid ""
 "``dotencode``\n"
@@ -12360,11 +13764,20 @@
 "    option ensures that the on-disk format of newly created\n"
 "    repositories will be compatible with Mercurial before version 1.7."
 msgstr ""
+"``dotencode``\n"
+"    \"fncache\" 形式リポジトリ (本設定の有効化に必須) において、\n"
+"    Mac OS X および Windows で生じる、 ドットと空白文字 (``. ``)\n"
+"    で始まるファイル名の問題を回避するための、 \"dotencode\"\n"
+"    形式リポジトリの使用可否。 デフォルトでは有効化されています。\n"
+"    この設定を無効化した場合、 新規作成したリポジトリは、 1.7 以前の\n"
+"    Mercurial と、 ディスク記録形式で互換性が保たれます。"
 
 msgid ""
 "``merge-patterns``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"``merge-patterns``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "This section specifies merge tools to associate with particular file\n"
@@ -12372,25 +13785,34 @@
 "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 ""
+msgstr "ファイル単位のマージを行う外部マージツールの設定。"
 
 msgid "Example ``~/.hgrc``::"
-msgstr ""
+msgstr "``~/.hgrc`` での設定例を以下に示します::"
 
 msgid ""
 "  [merge-tools]\n"
@@ -12401,6 +13823,13 @@
 "  # 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"
@@ -12408,12 +13837,18 @@
 "  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"
@@ -12421,6 +13856,10 @@
 "  the path can use environment variables with ${ProgramFiles} syntax.\n"
 "  Default: the tool name."
 msgstr ""
+"``executable``\n"
+"  実行可能ファイル名ないしパス名。 Windows 環境では、\n"
+"  ${ProgramFiles} 環境変数を併用した記述が使用可能です。\n"
+"  デフォルト値: ツール名が自動的に設定"
 
 msgid ""
 "``args``\n"
@@ -12429,6 +13868,10 @@
 "  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"
@@ -12437,23 +13880,38 @@
 "  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"
@@ -12464,29 +13922,47 @@
 "  ``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"
@@ -12495,6 +13971,11 @@
 "  ``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"
@@ -12504,12 +13985,21 @@
 "  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"
@@ -12517,12 +14007,19 @@
 "  the executable name of the tool.\n"
 "  Default: None"
 msgstr ""
+"``regappend``\n"
+"  当該レジストリキーからの読み出し値に付加する値。 典型的な設定値は、\n"
+"  ツールの実行可能ファイル名です。\n"
+"  デフォルト値: None"
 
 msgid ""
 "\n"
 "``hooks``\n"
 "\"\"\"\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``hooks``\n"
+"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "Commands or Python functions that get automatically executed by\n"
@@ -12531,9 +14028,15 @@
 "action. Overriding a site-wide hook can be done by changing its\n"
 "value or setting it to an empty string."
 msgstr ""
+"commit の開始/終了といった様々な処理契機において、\n"
+"自動実行されるコマンド、ないし Python 関数。 \n"
+"処理契機名に接尾辞 (suffix) を追加した記述をする事で、\n"
+"同一処理契機に複数のフックを実行可能です。\n"
+"先に読み込まれた設定 (例: ホスト毎設定) におけるフック設定は、\n"
+"別な値を設定するか、 空値の設定により、 上書き可能です。"
 
 msgid "Example ``.hg/hgrc``::"
-msgstr ""
+msgstr "``.hg/hgrc`` 設定例を以下に示します::"
 
 msgid ""
 "  [hooks]\n"
@@ -12544,12 +14047,22 @@
 "  incoming.email = /my/email/hook\n"
 "  incoming.autobuild = /my/build/hook"
 msgstr ""
+"  [hooks]\n"
+"  # 更新の取り込み毎に作業領域を更新\n"
+"  changegroup.update = hg update\n"
+"  # ホスト毎設定の無効化\n"
+"  incoming =\n"
+"  \n"
+"  incoming.email = /my/email/hook\n"
+"  incoming.autobuild = /my/build/hook"
 
 msgid ""
 "Most hooks are run with environment variables set that give useful\n"
 "additional information. For each hook below, the environment\n"
 "variables it is passed are listed with names of the form ``$HG_foo``."
 msgstr ""
+"殆どのフックは、 有用な付加情報を持つ環境変数設定と共に実行されます。\n"
+"以下に示すフック群に渡される環境変数は ``$HG_foo`` 形式の名前を持ちます。"
 
 msgid ""
 "``changegroup``\n"
@@ -12557,6 +14070,12 @@
 "  ID of the first new changeset is in ``$HG_NODE``. URL from which\n"
 "  changes came is in ``$HG_URL``."
 msgstr ""
+"``changegroup``\n"
+"  push、 pull、 unbundle によるリビジョン群の追加完了時に実行されます。\n"
+"  新規追加リビジョン群の最初の ID が ``$HG_NODE`` に、\n"
+"  追加リビジョン群の取り込み元 URL が ``$HG_URL`` に設定されます。\n"
+"  (訳注: 複数リビジョン一括追加時の ``changegroup`` フック実行は1回ですが、\n"
+"  ``incoming`` フックはリビジョン毎に実行されます)"
 
 msgid ""
 "``commit``\n"
@@ -12564,6 +14083,10 @@
 "  of the newly created changeset is in ``$HG_NODE``. Parent changeset\n"
 "  IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
 msgstr ""
+"``commit``\n"
+"  手元のリポジトリにおける新規リビジョン作成完了時に実行されます。\n"
+"  新規作成リビジョンの ID が ``$HG_NODE`` に、親リビジョンの ID が\n"
+"  ``$HG_PARENT1`` および ``$HG_PARENT2`` に設定されます。"
 
 msgid ""
 "``incoming``\n"
@@ -12571,6 +14094,12 @@
 "  the local repository. The ID of the newly arrived changeset is in\n"
 "  ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``."
 msgstr ""
+"``incoming``\n"
+"  push、 pull、 unbundle によるリビジョンの追加完了時に実行されます。\n"
+"  新規追加リビジョンの最初の ID が ``$HG_NODE`` に、\n"
+"  追加リビジョンの取り込み元 URL が ``$HG_URL`` に設定されます。\n"
+"  (訳注: 複数リビジョン一括追加時の ``changegroup`` フック実行は1回ですが、\n"
+"  ``incoming`` フックはリビジョン毎に実行されます)"
 
 msgid ""
 "``outgoing``\n"
@@ -12578,6 +14107,11 @@
 "  first changeset sent is in ``$HG_NODE``. Source of operation is in\n"
 "  ``$HG_SOURCE``; see \"preoutgoing\" hook for description."
 msgstr ""
+"``outgoing``\n"
+"  他リポジトリへの変更反映完了後に実行されます。\n"
+"  新規追加リビジョン群の最初の ID が ``$HG_NODE`` に、\n"
+"  操作実施契機が ``$HG_SOURCE`` に設定されます。\n"
+"  \"preoutgoing\" フックの説明も参照してください。"
 
 msgid ""
 "``post-<command>``\n"
@@ -12589,6 +14123,16 @@
 "  dictionary of options (with unspecified options set to their defaults).\n"
 "  ``$HG_PATS`` is a list of arguments. Hook failure is ignored."
 msgstr ""
+"``post-<コマンド名>``\n"
+"  指定コマンドが正常終了した際に実行されます。\n"
+"  当該コマンド実行の引数が ``$HG_ARGS`` に、\n"
+"  終了コードが ``$HG_RESULT`` にに設定されます。\n"
+"  当該コマンドの内部処理に渡される、 コマンド実行時引数の解析結果が、\n"
+"   ``$HG_PATS`` および ``$HG_OPTS`` に設定されますが、\n"
+"  これらに設定される値は、 内部的な Python データ形式の文字列です。\n"
+"  ``$HG_OPTS`` はオプションの辞書形式 (無指定オプションは、\n"
+"  デフォルト値が設定された状態)、 ``$HG_PATS`` は引数のリストです。\n"
+"  フック自身の実行失敗は無視されます。"
 
 msgid ""
 "``pre-<command>``\n"
@@ -12601,6 +14145,16 @@
 "  failure, the command doesn't execute and Mercurial returns the failure\n"
 "  code."
 msgstr ""
+"``pre-<コマンド名>``\n"
+"  指定コマンドの実行前に実行されます。\n"
+"  当該コマンド実行の引数が ``$HG_ARGS`` に設定されます。\n"
+"  当該コマンドの内部処理に渡される、 コマンド実行時引数の解析結果が、\n"
+"   ``$HG_PATS`` および ``$HG_OPTS`` に設定されますが、\n"
+"  これらに設定される値は、 内部的な Python データ形式の文字列です。\n"
+"  ``$HG_OPTS`` はオプションの辞書形式 (無指定オプションは、\n"
+"  デフォルト値が設定された状態)、 ``$HG_PATS`` は引数のリストです。\n"
+"  フック実行が失敗した場合、 当該コマンドは実行されず、\n"
+"  Mercurial は実行失敗の終了コードを返します。"
 
 msgid ""
 "``prechangegroup``\n"
@@ -12609,6 +14163,11 @@
 "  cause the push, pull or unbundle to fail. URL from which changes\n"
 "  will come is in ``$HG_URL``."
 msgstr ""
+"``prechangegroup``\n"
+"  push、 pull、 unbundle によるリビジョン群の追加前に実行されます。\n"
+"  終了コード 0 は、 処理の継続を意味します。\n"
+"  非 0 の終了コードは、 push、 pull、 unbundle の中断を意味します。\n"
+"  追加リビジョン群の取り込み元 URL が ``$HG_URL`` に設定されます。"
 
 msgid ""
 "``precommit``\n"
@@ -12616,6 +14175,12 @@
 "  commit to proceed. Non-zero status will cause the commit to fail.\n"
 "  Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
 msgstr ""
+"``precommit``\n"
+"  手元のリポジトリにおける新規リビジョン作成前に実行されます。\n"
+"  終了コード 0 は、 処理の継続を意味します。\n"
+"  非 0 の終了コードは、 commit の中断を意味します。\n"
+"  親リビジョンの ID が\n"
+"  ``$HG_PARENT1`` および ``$HG_PARENT2`` に設定されます。"
 
 msgid ""
 "``prelistkeys``\n"
@@ -12623,6 +14188,10 @@
 "  repository. Non-zero status will cause failure. The key namespace is\n"
 "  in ``$HG_NAMESPACE``."
 msgstr ""
+"``prelistkeys``\n"
+"  pushkey (bookmark のようなもの) の一覧取得前に実行されます。\n"
+"  非 0 の終了コードは、 処理の中断を意味します。\n"
+"  キーの名前空間が ``$HG_NAMESPACE`` に設定されます。"
 
 msgid ""
 "``preoutgoing``\n"
@@ -12635,6 +14204,18 @@
 "  SSH or HTTP repository. If \"push\", \"pull\" or \"bundle\", operation\n"
 "  is happening on behalf of repository on same system."
 msgstr ""
+"``preoutgoing``\n"
+"  他リポジトリへの変更反映において、 対象リビジョン確定前に実行されます。\n"
+"  非 0 の終了コードは、 処理の中断を意味します。\n"
+"  本フックによって、 HTTP や SSH 経由での変更反映を抑止可能です。\n"
+"  ローカルホスト上のリポジトリ間での pull や push ないし bundle\n"
+"  コマンドも抑止可能ですが、 ファイルそのもののコピーが可能ですから、\n"
+"  実質的な抑止効果はありません。\n"
+"  操作実施契機が ``$HG_SOURCE`` に設定されます。\n"
+"  この環境変数に \"serve\" が設定されている場合、\n"
+"  SSH なり HTTP を経由した遠隔ホスト側が、 処理契機となっています。\n"
+"  \"push\"、 \"pull\" ないし \"bundle\" が設定されている場合、\n"
+"  同一ホスト上のリポジトリが処理契機となっています。"
 
 msgid ""
 "``prepushkey``\n"
@@ -12644,6 +14225,13 @@
 "  the old value (if any) is in ``$HG_OLD``, and the new value is in\n"
 "  ``$HG_NEW``."
 msgstr ""
+"``prepushkey``\n"
+"  pushkey (bookmark のようなもの) の取り込み前に実行されます。\n"
+"  非 0 の終了コードは、 取り込み拒否を意味します。\n"
+"  キーの名前空間が ``$HG_NAMESPACE`` に、\n"
+"  キーが ``$HG_KEY`` に、\n"
+"  (更新の場合は) 旧値が ``$HG_OLD`` に、\n"
+"  新値が ``$HG_NEW`` に設定されます。"
 
 msgid ""
 "``pretag``\n"
@@ -12653,6 +14241,14 @@
 "is\n"
 "  local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``."
 msgstr ""
+"``pretag``\n"
+"  タグの新規生成前に実行されます。\n"
+"  終了コードが 0 の場合、 タグの生成が許可されます。\n"
+"  非 0 の終了コードは、 タグ生成を中断します。\n"
+"  タグ付け対象リビジョンの ID が  ``$HG_NODE`` に、\n"
+"  タグ名が ``$HG_TAG`` に設定されます。\n"
+"  ローカルタグの場合は ``$HG_LOCAL=1`` に、\n"
+"  通常のタグの場合は ``$HG_LOCAL=0`` になります。"
 
 msgid ""
 "``pretxnchangegroup``\n"
@@ -12665,6 +14261,16 @@
 "  pull or unbundle will fail. URL that was source of changes is in\n"
 "  ``$HG_URL``."
 msgstr ""
+"``pretxnchangegroup``\n"
+"  push、 pull、 unbundle によるリビジョン群の追加完了の際に、\n"
+"  トランザクションが完了する前に実行されます。\n"
+"  追加されるリビジョン群は、 フックから参照可能です。\n"
+"  そのため、 追加が確定する前に、 対象リビジョン群の内容を検証可能です。\n"
+"  新規追加リビジョン群の最初の ID が ``$HG_NODE`` に設定されます。\n"
+"  終了コードが 0 の場合、 トランザクションが確定します。\n"
+"  非 0 の終了コードの場合、 トランザクションが巻き戻され、\n"
+"  push、 pull、 unbundle は中断されます。\n"
+"  追加リビジョンの取り込み元 URL は ``$HG_URL`` に設定されます。"
 
 msgid ""
 "``pretxncommit``\n"
@@ -12675,6 +14281,16 @@
 "  be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset\n"
 "  IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
 msgstr ""
+"``pretxncommit``\n"
+"  新規リビジョン作成の際に、\n"
+"  トランザクションが完了する前に実行されます。\n"
+"  追加されるリビジョンは、 フックから参照可能です。\n"
+"  そのため、 コミットログや、 変更内容の検証が可能です。\n"
+"  終了コードが 0 の場合、 トランザクションが確定します。\n"
+"  非 0 の終了コードの場合、 トランザクションが巻き戻されます。\n"
+"  新規追加リビジョンの ID が ``$HG_NODE`` に、\n"
+"  親リビジョンの ID が\n"
+"  ``$HG_PARENT1`` および ``$HG_PARENT2`` に設定されます。"
 
 msgid ""
 "``preupdate``\n"
@@ -12683,6 +14299,13 @@
 "  Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID\n"
 "  of second new parent is in ``$HG_PARENT2``."
 msgstr ""
+"``preupdate``\n"
+"  作業領域の更新前に実行されます。\n"
+"  終了コードが 0 の場合、 更新処理が実施されます。\n"
+"  非 0 の終了コードの場合、 更新処理は実施されません。\n"
+"  更新対象リビジョンの ID が ``$HG_PARENT1`` に設定されます。\n"
+"  マージ契機の更新処理の場合、 第2親リビジョンの ID が\n"
+"  ``$HG_PARENT2`` に設定されます。"
 
 msgid ""
 "``listkeys``\n"
@@ -12690,6 +14313,10 @@
 "  key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a\n"
 "  dictionary containing the keys and values."
 msgstr ""
+"``listkeys``\n"
+"  pushkey (bookmark のようなもの) の一覧取得後に実行されます。\n"
+"  キーの名前空間が ``$HG_NAMESPACE`` に設定されます。\n"
+"  ``$HG_VALUES`` には、 キーと値からなる辞書情報が設定されます。"
 
 msgid ""
 "``pushkey``\n"
@@ -12698,6 +14325,12 @@
 "  ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new\n"
 "  value is in ``$HG_NEW``."
 msgstr ""
+"``pushkey``\n"
+"  pushkey (bookmark のようなもの) の取り込み後に実行されます。\n"
+"  キーの名前空間が ``$HG_NAMESPACE`` に、\n"
+"  キーが ``$HG_KEY`` に、\n"
+"  (更新の場合は) 旧値が ``$HG_OLD`` に、\n"
+"  新値が ``$HG_NEW`` に設定されます。"
 
 msgid ""
 "``tag``\n"
@@ -12705,6 +14338,12 @@
 "  Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in\n"
 "  repository if ``$HG_LOCAL=0``."
 msgstr ""
+"``tag``\n"
+"  タグの新規生成後に実行されます。\n"
+"  タグ付け対象リビジョンの ID が  ``$HG_NODE`` に、\n"
+"  タグ名が ``$HG_TAG`` に設定されます。\n"
+"  ローカルタグの場合は ``$HG_LOCAL=1`` に、\n"
+"  通常のタグの場合は ``$HG_LOCAL=0`` になります。"
 
 msgid ""
 "``update``\n"
@@ -12713,6 +14352,13 @@
 "  in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the\n"
 "  update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``."
 msgstr ""
+"``update``\n"
+"  作業領域の更新後に実行されます。\n"
+"  更新対象リビジョンの ID が ``$HG_PARENT1`` に設定されます。\n"
+"  マージ契機の更新処理の場合、 第2親リビジョンの ID が\n"
+"  ``$HG_PARENT2`` に設定されます。\n"
+"  更新処理が成功した場合は ``$HG_ERROR=0`` に、\n"
+"  失敗した場合 (例: 衝突解消の失敗等) は ``$HG_ERROR=1`` が設定されます。"
 
 msgid ""
 ".. note:: It is generally better to use standard hooks rather than the\n"
@@ -12721,6 +14367,11 @@
 "   Also, hooks like \"commit\" will be called in all contexts that\n"
 "   generate a commit (e.g. tag) and not just the commit command."
 msgstr ""
+".. note:: コマンド実行に対する pre- ないし post- 付きの汎用フックは、\n"
+"   トランザクション確定の成否に影響しない状況で呼ばれるため、\n"
+"   汎用フックを使用する方がお勧めです。\n"
+"   \"commit\" のようなフックは、 :hg:`commit` 実行以外にも、\n"
+"   リビジョンを作成する契機 (例: :hg:`tag`) 全てにおいて呼ばれます。"
 
 msgid ""
 ".. note:: Environment variables with empty values may not be passed to\n"
@@ -12728,14 +14379,20 @@
 "   will have an empty value under Unix-like platforms for non-merge\n"
 "   changesets, while it will not be available at all under Windows."
 msgstr ""
+".. note:: Windows のような環境では、 空値の環境変数が、\n"
+"   引き渡されない場合があります。 例えば、 非マージリビジョンの場合、\n"
+"   Unix 系環境では空値の ``$HG_PARENT2`` が引き渡されますが、\n"
+"   Windows 環境では、 環境変数自身の引渡しがありません。"
 
 msgid "The syntax for Python hooks is as follows::"
-msgstr ""
+msgstr "Python 関数のフック指定文法を以下に示します::"
 
 msgid ""
 "  hookname = python:modulename.submodule.callable\n"
 "  hookname = python:/path/to/python/module.py:callable"
 msgstr ""
+"  フック名 = python:モジュール名.サブモジュール名.関数名\n"
+"  フック名 = python:/モジュール/ファイル/への/パス.py:関数名"
 
 msgid ""
 "Python hooks are run within the Mercurial process. Each hook is\n"
@@ -12745,68 +14402,102 @@
 "environment variables above are passed as keyword arguments, with no\n"
 "``HG_`` prefix, and names in lower case."
 msgstr ""
+"Python 関数のフックは、 Mercurial プロセス内部で実行されます。\n"
+"各フックの起動では、 最低でも3つのキーワード引数が渡されます。\n"
+"ui オブジェクト (``ui`` キーワード)、\n"
+"repository オブジェクト (``repo`` キーワード)、\n"
+"フック起動種別を示す ``hooktype`` キーワードの3つです。\n"
+"フックの説明で示した環境変数は、\n"
+"``HG_`` 無しで、 且つ小文字表記のキーワードを使用した、\n"
+"キーワード引数として渡されます。"
 
 msgid ""
 "If a Python hook returns a \"true\" value or raises an exception, this\n"
 "is treated as a failure."
 msgstr ""
+"Python 関数フックの戻り値が \"true\" 相当値か、\n"
+"実行中に例外が発生した場合、 処理失敗とみなされます。\n"
+"(訳注: 失敗の場合に \"true\" である点に注意)"
 
 msgid ""
 "\n"
 "``http_proxy``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``http_proxy``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "Used to access web-based Mercurial repositories through a HTTP\n"
 "proxy."
 msgstr ""
+"ウェブベースの Mercurial リポジトリアクセスで使用される\n"
+"HTTP プロキシ設定。"
 
 msgid ""
 "``host``\n"
 "    Host name and (optional) port of the proxy server, for example\n"
 "    \"myproxy:8000\"."
 msgstr ""
+"``host``\n"
+"    プロキシサーバのホスト名と (省略可能な) ポート番号。\n"
+"    設定例: \"myproxy:8000\""
 
 msgid ""
 "``no``\n"
 "    Optional. Comma-separated list of host names that should bypass\n"
 "    the proxy."
 msgstr ""
+"``no``\n"
+"    省略可能。 プロキシを使用「しない」ホスト名一覧 (カンマ区切り)"
 
 msgid ""
 "``passwd``\n"
 "    Optional. Password to authenticate with at the proxy server."
 msgstr ""
+"``passwd``\n"
+"    省略可能。 プロキシサーバの認証用パスワード。"
 
 msgid ""
 "``user``\n"
 "    Optional. User name to authenticate with at the proxy server."
 msgstr ""
+"``user``\n"
+"    省略可能。 プロキシサーバの認証用ユーザ名。"
 
 msgid ""
 "``always``\n"
 "    Optional. Always use the proxy, even for localhost and any entries\n"
 "    in ``http_proxy.no``. True or False. Default: False."
 msgstr ""
+"``always``\n"
+"    省略可能。 ``http_proxy.no`` を無視して、 プロキシを常用するか否か。\n"
+"    真偽値。 デフォルト値: False"
 
 msgid ""
 "``smtp``\n"
 "\"\"\"\"\"\"\"\""
 msgstr ""
+"``smtp``\n"
+"\"\"\"\"\"\"\"\""
 
 msgid "Configuration for extensions that need to send email messages."
-msgstr ""
+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"
@@ -12814,12 +14505,18 @@
 "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"
@@ -12827,23 +14524,36 @@
 "    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"
 "``patch``\n"
 "\"\"\"\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``patch``\n"
+"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "Settings used when applying patches, for instance through the 'import'\n"
 "command or with Mercurial Queues extension."
 msgstr ""
+":hg:`import` や Mercurial Queues (MQ) エクステンション等による、\n"
+"パッチ適用に関する設定。"
 
 msgid ""
 "``eol``\n"
@@ -12857,12 +14567,27 @@
 "    of line, patch line endings are preserved.\n"
 "    Default: strict."
 msgstr ""
+"``eol``\n"
+"    'strict' が設定された場合、 パッチファイルと、\n"
+"    パッチ対象ファイルは、 行末形式がそのまま維持されます。\n"
+"    ``lf`` ないし ``crlf`` が設定された場合、\n"
+"    パッチファイルとパッチ対象ファイルは、 行末形式が無視され、\n"
+"    LF (Unix 形式) ないし CRLF (Windows 形式) に正規化されます。\n"
+"    ``auto`` が設定された場合、\n"
+"    パッチファイルの行末形式は無視されますが、\n"
+"    パッチ対象ファイルの行末形式は、 ファイル毎の設定で正規化されます。\n"
+"    対象ファイルが存在しないか、 改行を含まない場合、\n"
+"    パッチファイルの行末形式がそのまま維持されます。\n"
+"    デフォルト値: strict"
 
 msgid ""
 "\n"
 "``paths``\n"
 "\"\"\"\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``paths``\n"
+"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "Assigns symbolic names to repositories. The left side is the\n"
@@ -12870,6 +14595,13 @@
 "location of the repository. Default paths can be declared by setting\n"
 "the following entries."
 msgstr ""
+"リポジトリへのシンボリックな名前の割り当て設定。\n"
+"設定記述の左辺にシンボル名を、\n"
+"右辺にリポジトリ位置のディレクトリ、\n"
+"ないし URL を記述します。\n"
+"連携先リポジトリ指定が無い場合でも、\n"
+"以下のシンボルを設定することで、\n"
+"パス指定が可能です。 (訳注: :hg:`help urls` も参照のこと)"
 
 msgid ""
 "``default``\n"
@@ -12877,18 +14609,29 @@
 "    Default is set to repository from which the current repository was\n"
 "    cloned."
 msgstr ""
+"``default``\n"
+"    連携先指定が無い場合に、 :hg:`pull` に類するコマンドの、\n"
+"    連携対象となるリポジトリのディレクトリ、 ないし URL。\n"
+"    当該リポジトリが :hg:`clone` で生成された場合、\n"
+"    複製元リポジトリの URL が自動的に設定されます。"
 
 msgid ""
 "``default-push``\n"
 "    Optional. Directory or URL to use when pushing if no destination\n"
 "    is specified."
 msgstr ""
+"``default-push``\n"
+"    連携先指定が無い場合に、 :hg:`push` に類するコマンドの、\n"
+"    連携対象となるリポジトリのディレクトリ、 ないし URL。"
 
 msgid ""
 "\n"
 "``profiling``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``profiling``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "Specifies profiling format and file output. In this section\n"
@@ -12897,12 +14640,19 @@
 "text report generated from the profiling data. The profiling is done\n"
 "using lsprof."
 msgstr ""
+"プロファイルの形式と、 出力ファイルに関する設定。\n"
+"以下の説明では、 プロファイル期間に採取される生データの事を\n"
+"'プロファイルデータ'、 プロファイルデータを元にした、\n"
+"テキスト形式の統計報告を 'プロファイル報告' と呼称します。\n"
+"プロファイル採取には、 lsprof が用いられます。"
 
 msgid ""
 "``format``\n"
 "    Profiling format.\n"
 "    Default: text."
 msgstr ""
+"``format``\n"
+"    プロファイル形式。 デフォルト値: text"
 
 msgid ""
 "    ``text``\n"
@@ -12914,6 +14664,12 @@
 "      file, the generated file can directly be loaded into\n"
 "      kcachegrind."
 msgstr ""
+"    ``text``\n"
+"      プロファイル報告を生成。 プロファイル報告をファイルに保存する場合、\n"
+"      プロファイルデータは保存されない点に注意してください。\n"
+"    ``kcachegrind``\n"
+"      プロファイルデータを kcachegrind 形式化。 ファイルに保存する場合、\n"
+"      当該ファイルは直接 kcachegrind で読み込めます。"
 
 msgid ""
 "``output``\n"
@@ -12921,22 +14677,32 @@
 "    file exists, it is replaced. Default: None, data is printed on\n"
 "    stderr"
 msgstr ""
+"``output``\n"
+"    プロファイルデータ、 ないし統計報告の保存先。\n"
+"    既存ファイルが指定された場合、 ファイルは上書きされます。\n"
+"    デフォルト値: None (結果は標準エラー出力から出力)"
 
 msgid ""
 "``revsetalias``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"``revsetalias``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid "Alias definitions for revsets. See :hg:`help revsets` for details."
 msgstr ""
+"revsets 機能の別名定義。\n"
+"詳細は :hg:`help revsets` を参照してください。"
 
 msgid ""
 "``server``\n"
 "\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"``server``\n"
+"\"\"\"\"\"\"\"\"\"\""
 
 msgid "Controls generic server settings."
-msgstr ""
+msgstr "一般的なサーバ機能の設定。"
 
 msgid ""
 "``uncompressed``\n"
@@ -12951,6 +14717,17 @@
 "    the write lock while determining what data to transfer.\n"
 "    Default is True."
 msgstr ""
+"``uncompressed``\n"
+"    クライアントからの、非圧縮プロトコルでの :hg:`clone` 要求に対する、\n"
+"    許可の可否。 通常の転送と比較して、 データ量が 40% 程度増加しますが、\n"
+"    サーバ/クライアント双方で、 メモリや CPU の消費が低減します。\n"
+"    LAN (100 Mbps ないしそれ以上) や高速 WAN 経由であれば、\n"
+"    通常形式よりも高速 (最大 10 倍程度) です。\n"
+"    転送データ量が増加することから、 一般的な WAN 接続 (概ね 6 Mbps 以下)\n"
+"    では、 非圧縮形式の方が低速です。\n"
+"    転送データが確定するまでの間は、 非圧縮形式であっても、\n"
+"    一時的な書き込みロックが保持されます。\n"
+"    デフォルト値: True"
 
 msgid ""
 "``validate``\n"
@@ -12958,17 +14735,23 @@
 "    checking that all new file revisions specified in manifests are\n"
 "    present. Default is False."
 msgstr ""
+"``validate``\n"
+"    反映対象チェンジセットの完全性検証の要否。\n"
+"    マニフェスト中の全ての更新情報が、 転送内容に含まれているか否かで、\n"
+"    データの完全性を確認します。 デフォルト値: False"
 
 msgid ""
 "``subpaths``\n"
 "\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"``subpaths``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid "Defines subrepositories source locations rewriting rules of the form::"
-msgstr ""
+msgstr "副リポジトリの元位置情報を書き換える、 以下の形式の設定::"
 
 msgid "    <pattern> = <replacement>"
-msgstr ""
+msgstr "    <パターン> = <置換結果>"
 
 msgid ""
 "Where ``pattern`` is a regular expression matching the source and\n"
@@ -12976,20 +14759,28 @@
 "can be matched in ``pattern`` and referenced in ``replacements``. For\n"
 "instance::"
 msgstr ""
+"``パターン`` には元位置情報に対する正規表現を、\n"
+"``置換結果`` には元位置情報の書き換え内容を記述します。\n"
+"``パターン`` におけるグループ表記は ``置換結果`` で参照可能です。\n"
+"記述例を以下に示します::"
 
 msgid "    http://server/(.*)-hg/ = http://hg.server/\\1/"
-msgstr ""
+msgstr "    http://server/(.*)-hg/ = http://hg.server/\\1/"
 
 msgid "rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``."
 msgstr ""
+"上記設定によって、 ``http://server/foo-hg/`` は\n"
+"``http://hg.server/foo/`` に書き換えられます。"
 
 msgid "All patterns are applied in definition order."
-msgstr ""
+msgstr "記述順序に従い、 全てのパターン記述が適用されます。"
 
 msgid ""
 "``trusted``\n"
 "\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"``trusted``\n"
+"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "Mercurial will not use the settings in the\n"
@@ -13000,6 +14791,13 @@
 "the web interface will use some safe settings from the ``[web]``\n"
 "section."
 msgstr ""
+"Mercurial の設定ファイルは、 任意のコマンド実行を可能にできることから、\n"
+"信頼できるユーザ/グループに属さない設定ファイルは、\n"
+"その記述内容が無視されます。 共有リポジトリや、 リポジトリサーバの\n"
+"``.hg/hgrc`` におけるフックやエクステンション設定では、\n"
+"しばしばこの問題が顕在化します。\n"
+"但し、 web インタフェースに関しては、\n"
+"``[web]`` セクションにおける、 安全な設定記述が使用されます。"
 
 msgid ""
 "This section specifies what users and groups are trusted. The\n"
@@ -13008,25 +14806,42 @@
 "*already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the\n"
 "user or service running Mercurial."
 msgstr ""
+"設定ファイルの所有者ないしグループが、\n"
+"本セクションで記述した、 ユーザないしグループと合致する場合、\n"
+"その設定ファイルは *信頼* されます。\n"
+"実効ユーザ (訳注: 対象リポジトリ上で実行される\n"
+"「プロセス」 の実効ユーザ) は常に信頼対象になります。\n"
+"全てのファイルを信頼する場合は、 ユーザ/グループ設定のいずれかで\n"
+"``*`` を列挙してください。 本セクションの記述が有効になるためには、\n"
+"*既に信頼されているファイル* において記述する必要が有ります。\n"
+"例えば、 Mercurial プロセスを実行しているユーザやサービスの\n"
+"``$HOME/.hgrc`` ファイルなどが該当します。"
 
 msgid ""
 "``users``\n"
 "  Comma-separated list of trusted users."
 msgstr ""
+"``users``\n"
+"  信頼できるユーザの一覧 (カンマ区切り)"
 
 msgid ""
 "``groups``\n"
 "  Comma-separated list of trusted groups."
 msgstr ""
+"``groups``\n"
+"  信頼できるグループの一覧 (カンマ区切り)"
 
 msgid ""
 "\n"
 "``ui``\n"
 "\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``ui``\n"
+"\"\"\"\"\"\""
 
 msgid "User interface controls."
-msgstr ""
+msgstr "ユーザインタフェースに関する設定。"
 
 msgid ""
 "``archivemeta``\n"
@@ -13035,6 +14850,11 @@
 "    by the :hg:`archive` command or downloaded via hgweb.\n"
 "    Default is True."
 msgstr ""
+"``archivemeta``\n"
+"    :hg:`archive` コマンドないし hgweb 経由のダウンロードで得られる\n"
+"    アーカイブファイルへの、 メタデータ (リポジトリの初期リビジョンと、\n"
+"    アーカイブ対象リビジョンのハッシュ値) を保持する .hg_archival.txt\n"
+"    ファイル格納の有無。 デフォルト値: True"
 
 msgid ""
 "``askusername``\n"
@@ -13045,30 +14865,48 @@
 "    default ``USER@HOST`` is used instead.\n"
 "    Default is False."
 msgstr ""
+"``askusername``\n"
+"    コミットにおけるユーザ名問い合わせの有無。 True の場合、\n"
+"    ``$HGUSER`` も ``$EMAIL`` も設定されていなければ、\n"
+"    ユーザ名の問い合わせを行います。\n"
+"    ユーザ名が入力されない場合、 ``ユーザ名@ホスト名`` が使用されます。\n"
+"    デフォルト値: False"
 
 msgid ""
 "``commitsubrepos``\n"
 "    Whether to commit modified subrepositories when committing the\n"
 "    parent repository. If False and one subrepository has uncommitted\n"
 "    changes, abort the commit.\n"
-"    Default is True."
-msgstr ""
+"    Default is False."
+msgstr ""
+"``commitsubrepos``\n"
+"    親リポジトリのコミットにおける、 副リポジトリ変更のコミットの要否。\n"
+"    False の場合に、 未コミット変更の副リポジトリがあれば、\n"
+"    コミット処理は中断されます。 デフォルト値: False"
 
 msgid ""
 "``debug``\n"
 "    Print debugging information. True or False. Default is False."
 msgstr ""
+"``debug``\n"
+"    デバッグ情報表示要否の真偽値。 デフォルト値: False"
 
 msgid ""
 "``editor``\n"
 "    The editor to use during a commit. Default is ``$EDITOR`` or ``vi``."
 msgstr ""
+"``editor``\n"
+"    コミットログ入力用エディタ。 無指定の場合、 ``$EDITOR`` ないし\n"
+"    ``vi`` が使用されます。"
 
 msgid ""
 "``fallbackencoding``\n"
 "    Encoding to try if it's not possible to decode the changelog using\n"
 "    UTF-8. Default is ISO-8859-1."
 msgstr ""
+"``fallbackencoding``\n"
+"    UTF-8 によるコミットログの変換が失敗した場合に使用する符号化形式。\n"
+"    デフォルト値: ISO-8859-1"
 
 msgid ""
 "``ignore``\n"
@@ -13079,16 +14917,28 @@
 "    ``ignore.other = ~/.hgignore2``. For details of the ignore file\n"
 "    format, see the ``hgignore(5)`` man page."
 msgstr ""
+"``ignore``\n"
+"    ユーザ毎の無視対象パターンファイルの読み込み設定。\n"
+"    対象ファイルの形式は、 リポジトリ毎の .hgignore ファイルと同じです。\n"
+"    本指定には、 フック指定の文法が適用可能です。\n"
+"    複数の無視指定ファイルの読み込みは、 ``ignore.other = ~/.hgignore2``\n"
+"    のように記述します。 無視指定ファイル記述の詳細は、\n"
+"    ``hgignore(5)`` マニュアルを参照してください。\n"
+"    (訳注: :hg:`help ignore` でも参照可能)"
 
 msgid ""
 "``interactive``\n"
 "    Allow to prompt the user. True or False. Default is True."
 msgstr ""
+"``interactive``\n"
+"    ユーザへの問い合わせ可否の真偽値。 デフォルト値: True"
 
 msgid ""
 "``logtemplate``\n"
 "    Template string for commands that print changesets."
 msgstr ""
+"``logtemplate``\n"
+"    リビジョン表示系コマンドが使用するテンプレート文字列。"
 
 msgid ""
 "``merge``\n"
@@ -13096,6 +14946,11 @@
 "    For more information on merge tools see :hg:`help merge-tools`.\n"
 "    For configuring merge tools see the ``[merge-tools]`` section."
 msgstr ""
+"``merge``\n"
+"    手動マージの際に衝突解消を行うプログラム。\n"
+"    マージツールに関する詳細は :hg:`help merge-tools` を、\n"
+"    マージツールの設定に関する詳細は ``[merge-tools]``\n"
+"    セクションの説明を参照してください。"
 
 msgid ""
 "``portablefilenames``\n"
@@ -13112,22 +14967,42 @@
 "    If set to ``abort``, the command is aborted.\n"
 "    On Windows, this configuration option is ignored and the command aborted."
 msgstr ""
+"``portablefilenames``\n"
+"    ファイル名可搬性確認の要否。\n"
+"    ``warn``、 ``ignore`` ないし ``abort`` のいずれか。\n"
+"    デフォルト値は ``warn``。\n"
+"    POSIX 環境における ``warn`` (ないし ``true``) 設定では、\n"
+"    可搬性の無い名前 (例: ``AUX`` のような予約語や、 ``:``\n"
+"    のような特殊文字を含んだり、 文字大小の問題で、\n"
+"    既存ファイルと衝突するような、 Windows 環境で利用できないファイル名)\n"
+"    を持つファイルが、 構成管理対象として追加された際に、\n"
+"    警告を発します。\n"
+"    ``ignore`` (ないし ``false``) 設定では、 警告が発せられません。\n"
+"    ``abort`` 設定では、 コマンドの実行が中断されます。\n"
+"    Windows 環境では、 本設定は無視され、 コマンド実行は常に中断されます。"
 
 msgid ""
 "``quiet``\n"
 "    Reduce the amount of output printed. True or False. Default is False."
 msgstr ""
+"``quiet``\n"
+"    コマンド実行時のメッセージ表示抑止要否の真偽値。 デフォルト値: False"
 
 msgid ""
 "``remotecmd``\n"
 "    remote command to use for clone/push/pull operations. Default is ``hg``."
 msgstr ""
+"``remotecmd``\n"
+"    clone/push/pull 処理における遠隔実行コマンド。 デフォルト値: ``hg``"
 
 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."
 msgstr ""
+"``report_untrusted``\n"
+"    信頼できるユーザ/グループ下に無い ``.hg/hgrc``\n"
+"    の無視に対する、 警告要否の真偽値。 デフォルト値: True"
 
 msgid ""
 "``slash``\n"
@@ -13137,28 +15012,43 @@
 "    backslash character (``\\``)).\n"
 "    Default is False."
 msgstr ""
+"``slash``\n"
+"    パス区切りでのスラッシュ (``/``) 使用の要否。\n"
+"    パス区切りがスラッシュではない環境 (例: バックスラッシュ (``\\``)\n"
+"    を使用する Windows 環境) でのみ意味を持ちます。\n"
+"    デフォルト値: False"
 
 msgid ""
 "``ssh``\n"
 "    command to use for SSH connections. Default is ``ssh``."
 msgstr ""
+"``ssh``\n"
+"    SSH 接続に使用するコマンド。 デフォルト値: ``ssh``"
 
 msgid ""
 "``strict``\n"
 "    Require exact command names, instead of allowing unambiguous\n"
 "    abbreviations. True or False. Default is False."
 msgstr ""
+"``strict``\n"
+"    コマンド名指定の厳密性要否 (= 省略指定の禁止) の真偽値。\n"
+"    デフォルト値: False"
 
 msgid ""
 "``style``\n"
 "    Name of style to use for command output."
 msgstr ""
+"``style``\n"
+"    コマンド出力に使用するスタイル名指定。"
 
 msgid ""
 "``timeout``\n"
 "    The timeout used when a lock is held (in seconds), a negative value\n"
 "    means no timeout. Default is 600."
 msgstr ""
+"``timeout``\n"
+"    ロック解放待ちにおけるタイムアウト時間指定 (単位: 秒)。\n"
+"    負値はタイムアウト無しを意味します。 デフォルト値: 600"
 
 msgid ""
 "``traceback``\n"
@@ -13167,6 +15057,11 @@
 "    on all exceptions, even those recognized by Mercurial (such as\n"
 "    IOError or MemoryError). Default is False."
 msgstr ""
+"``traceback``\n"
+"    Mercurial は未知の例外のみ、 トレースバックを表示します。\n"
+"    本設定が True の際は、 Mercurial の既知の例外 (IOError や\n"
+"    MemoryError) であっても、トレースバックを表示します。\n"
+"    デフォルト値: False"
 
 msgid ""
 "``username``\n"
@@ -13179,17 +15074,32 @@
 "    ``username =``  in the system hgrc). Environment variables in the\n"
 "    username are expanded."
 msgstr ""
+"``username``\n"
+"    :hg:`commit` での新規リビジョン作成で記録されるユーザ名。\n"
+"    個人名と電子メールアドレスを使用するのが一般的です。\n"
+"    (例: ``Fred Widget <fred@example.com>``)\n"
+"    無指定の場合、 ``$EMAIL`` 指定値、 ないし ``ユーザ名@ホスト名``\n"
+"    が使用されます。 設定ファイルで username に空値が指定された場合、\n"
+"    (Mercurial の問い合わせを契機に) 手動で指定するか、\n"
+"    他の設定ファイル (例: システム毎設定ファイルで ``username =``\n"
+"    が記述された場合は ``$HOME/.hgrc``) での設定が必要です。\n"
+"    username 指定値では、 環境変数の置換が実施されます。"
 
 msgid ""
 "``verbose``\n"
 "    Increase the amount of output printed. True or False. Default is False."
 msgstr ""
+"``verbose``\n"
+"    出力情報量増加要否の真偽値。 デフォルト値: False"
 
 msgid ""
 "\n"
 "``web``\n"
 "\"\"\"\"\"\"\""
 msgstr ""
+"\n"
+"``web``\n"
+"\"\"\"\"\"\"\""
 
 msgid ""
 "Web interface configuration. The settings in this section apply to\n"
@@ -13197,6 +15107,9 @@
 "run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI\n"
 "and WSGI)."
 msgstr ""
+"ウェブインタフェース設定。 本セクションでの設定は、 組み込みウェブサーバ\n"
+"(:hg:`serve` での実行) と、 ウェブサーバ上でのスクリプト (FastCGI や WSGI\n"
+"向けの ``hgweb.cgi`` およびその派生) の実行の、両方に適用されます。"
 
 msgid ""
 "The Mercurial webserver does no authentication (it does not prompt for\n"
@@ -13206,39 +15119,56 @@
 "webserver to do authentication for you, or disable the authorization\n"
 "checks."
 msgstr ""
+"Mercurial の組み込みウェブサーバは、 認証 (authentication) を行いません\n"
+"(ユーザを確認するための、 ユーザ名やパスワードの入力を求めません) が、\n"
+"承認 (authorization) の機能はあります (本セクションでの設定を元にした、\n"
+"認証済みユーザに対する、 アクセス可否の制御)。 利用するウェブサーバの、\n"
+"認証機能を Mercurial 向けに正しく設定するか、 Mercurial の承認機能を、\n"
+"無効化してください。"
 
 msgid ""
 "For a quick setup in a trusted environment, e.g., a private LAN, where\n"
 "you want it to accept pushes from anybody, you can use the following\n"
 "command line::"
 msgstr ""
+"信頼できる環境 (例: 私的な LAN 配下で、 全ての利用者に :hg:`push` 許可)\n"
+"において、 素早くサーバを立ち上げたい場合、 以下の起動形式が良いでしょう::"
 
 msgid "    $ hg --config web.allow_push=* --config web.push_ssl=False serve"
-msgstr ""
+msgstr "    $ hg --config web.allow_push=* --config web.push_ssl=False serve"
 
 msgid ""
 "Note that this will allow anybody to push anything to the server and\n"
 "that this should not be used for public servers."
 msgstr ""
+"この設定は、 全ての利用者に、 サーバへの :hg:`push` を許可しますので、\n"
+"公開サーバで使用してはいけません。"
 
 msgid "The full set of options is:"
-msgstr ""
+msgstr "本セクションで指定可能な設定項目を、 以下に示します:"
 
 msgid ""
 "``accesslog``\n"
 "    Where to output the access log. Default is stdout."
 msgstr ""
+"``accesslog``\n"
+"    アクセスログの書き出し先。 無指定時は標準出力に出力。"
 
 msgid ""
 "``address``\n"
 "    Interface address to bind to. Default is all."
 msgstr ""
+"``address``\n"
+"    サーバの待ちうけアドレス。 無指定時はホストの持つ全アドレス。"
 
 msgid ""
 "``allow_archive``\n"
 "    List of archive format (bz2, gz, zip) allowed for downloading.\n"
 "    Default is empty."
 msgstr ""
+"``allow_archive``\n"
+"    利用可能なダウンロード向けのアーカイブ形式 (bz2, gz, zip) 一覧。\n"
+"    デフォルト値: 空(ダウンロード不可)"
 
 msgid ""
 "``allowbz2``\n"
@@ -13246,6 +15176,9 @@
 "    revisions.\n"
 "    Default is False."
 msgstr ""
+"``allowbz2``\n"
+"    (非推奨) .tar.bz2 形式でのアーカイブダウンロードの可否。\n"
+"    デフォルト値: False"
 
 msgid ""
 "``allowgz``\n"
@@ -13253,11 +15186,16 @@
 "    revisions.\n"
 "    Default is False."
 msgstr ""
+"``allowgz``\n"
+"    (非推奨) .tar.gz 形式でのアーカイブダウンロードの可否。\n"
+"    デフォルト値: False"
 
 msgid ""
 "``allowpull``\n"
 "    Whether to allow pulling from the repository. Default is True."
 msgstr ""
+"``allowpull``\n"
+"    :hg:`pull` 要求への応答の可否。 デフォルト値: True"
 
 msgid ""
 "``allow_push``\n"
@@ -13268,6 +15206,13 @@
 "    be present in this list. The contents of the allow_push list are\n"
 "    examined after the deny_push list."
 msgstr ""
+"``allow_push``\n"
+"    :hg:`push` 要求への応答の可否。 空ないし未設定の場合、 :hg:`push`\n"
+"    要求は受理されません。 ``*`` が設定された場合、 未認証ユーザを含む、\n"
+"    全てのユーザが :hg:`push` できます。 他の値が設定された場合、\n"
+"    認証されたユーザのうち、 本項目で名前が列挙されたユーザのみが、\n"
+"    :hg:`push` できます。 本設定の確認実施は、 ``deny_push``\n"
+"    確認の後です。"
 
 msgid ""
 "``guessmime``\n"
@@ -13277,6 +15222,12 @@
 "    allow cross-site scripting attacks when serving untrusted\n"
 "    repositories. Default is False."
 msgstr ""
+"``guessmime``\n"
+"    ファイル内容の直接ダウンロードにおける、 MIME 種別の制御。\n"
+"    True 設定の場合、 ファイルの拡張子を元に MIME 種別を推測します。\n"
+"    例えば、 HTML ファイルでは ``text/html`` が使用されますが、\n"
+"    信用できないリポジトリを公開した場合、 cross site scripting\n"
+"    攻撃の原因となる可能性があります。 デフォルト値: False"
 
 msgid ""
 "``allow_read``\n"
@@ -13290,12 +15241,23 @@
 "    is permitted to all users). The contents of the allow_read list are\n"
 "    examined after the deny_read list."
 msgstr ""
+"``allow_read``\n"
+"    アクセス元ユーザが ``deny_read`` による制限を受けていない場合の、\n"
+"    当該ユーザのアクセス可否の制御。 本設定が空の場合、 未認証ユーザや、\n"
+"    本設定で名前が列挙されていないユーザは、 アクセスが拒否されます。\n"
+"    本設定が空、 ないし未設定の場合、 全てのユーザがアクセス可能です。\n"
+"    ``allow_read`` を ``*`` に設定するのは、 未設定 (= 全ユーザへの許可)\n"
+"    と等価です。 本設定の確認実施は、 ``deny_read`` 確認の後です。"
 
 msgid ""
 "``allowzip``\n"
 "    (DEPRECATED) Whether to allow .zip downloading of repository\n"
 "    revisions. Default is False. This feature creates temporary files."
 msgstr ""
+"``allowzip``\n"
+"    (非推奨) .zip 形式でのアーカイブダウンロードの可否。\n"
+"    本機能を有効にした場合、 一時ファイルが作成されます。\n"
+"    デフォルト値: False"
 
 msgid ""
 "``baseurl``\n"
@@ -13303,6 +15265,11 @@
 "    third-party tools like email notification hooks can construct\n"
 "    URLs. Example: ``http://hgserver/repos/``."
 msgstr ""
+"``baseurl``\n"
+"    外部への URL 公開で使用するベース URL。\n"
+"    電子メール通知フック等の、 サードパーティツールにける、\n"
+"    公開用 URL の構築を可能にします。\n"
+"    設定例: ``http://hgserver/repos/``"
 
 msgid ""
 "``cacerts``\n"
@@ -13312,6 +15279,11 @@
 "    client, then it will verify the identity of remote HTTPS servers\n"
 "    with these certificates. The form must be as follows::"
 msgstr ""
+"``cacerts``\n"
+"    PEM 符号化形式の証明書認証局証明書一覧格納ファイルへのパス。\n"
+"    ファイル名記述における環境変数および ``~user`` 記述は置換されます。\n"
+"    本項目が、 クライアント側で記述された場合、 指定された証明書により、\n"
+"    HTTPS サーバが認証されます。 ファイルの形式例を以下に示します::"
 
 msgid ""
 "        -----BEGIN CERTIFICATE-----\n"
@@ -13321,6 +15293,12 @@
 "        ... (certificate in base64 PEM encoding) ...\n"
 "        -----END CERTIFICATE-----"
 msgstr ""
+"        -----BEGIN CERTIFICATE-----\n"
+"        ... (base64 PEM 符号化形式の証明書) ...\n"
+"        -----END CERTIFICATE-----\n"
+"        -----BEGIN CERTIFICATE-----\n"
+"        ... (base64 PEM 符号化形式の証明書) ...\n"
+"        -----END CERTIFICATE-----"
 
 msgid ""
 "    This feature is only supported when using Python 2.6 or later. If you "
@@ -13329,6 +15307,9 @@
 "    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"
@@ -13336,22 +15317,33 @@
 "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 ""
+"``cache``\n"
+"    hgweb におけるキャッシュ利用の可否。 デフォルト値: True"
 
 msgid ""
 "``contact``\n"
 "    Name or email address of the person in charge of the repository.\n"
 "    Defaults to ui.username or ``$EMAIL`` or \"unknown\" if unset or empty."
 msgstr ""
+"``contact``\n"
+"    リポジトリ管理者の名前ないし電子メールアドレス。\n"
+"    無指定の場合、 ui.username 設定値、 ``$EMAIL`` 設定値が、\n"
+"    それらも未設定/空値の場合は \"unknown\" が使用されます。"
 
 msgid ""
 "``deny_push``\n"
@@ -13361,6 +15353,12 @@
 "    any authenticated user name present in this list is also denied. The\n"
 "    contents of the deny_push list are examined before the allow_push list."
 msgstr ""
+"``deny_push``\n"
+"    :hg:`push` 要求拒否の要否。 空ないし未設定の場合、 :hg:`push` は、\n"
+"    拒否されません。 ``*`` の場合、 :hg:`push` は全て拒否されます。\n"
+"    それ以外では、 未認証ユーザと、 本設定で名前が列挙されたユーザは、\n"
+"    :hg:`push` が拒否されます。 本設定の確認実施は、 ``allow_push``\n"
+"    確認の前です。"
 
 msgid ""
 "``deny_read``\n"
@@ -13378,6 +15376,17 @@
 "    priority over (are examined before) the contents of the allow_read\n"
 "    list."
 msgstr ""
+"``deny_read``\n"
+"    リポジトリへのアクセス拒否の要否。 空値以外が設定された場合、\n"
+"    未認証ユーザと、 本設定で名前が列挙されたユーザは、\n"
+"    リポジトリへのアクセスが全て拒否されます。 ``*`` が設定された場合、\n"
+"    全てのアクセスが拒否されます (この設定が必要なケースは無いでしょう)。\n"
+"    空ないし未設定の場合、 アクセス可否は ``allow_read`` 設定次第です。\n"
+"    (説明を参照してください)  ``deny_read`` と ``allow_read`` が、\n"
+"    両方とも空ないし未設定の場合、 全てのユーザがアクセス可能となります。\n"
+"    hgwebdir 経由で公開する場合、 アクセス拒否対処ユーザからは、\n"
+"    一覧中の当該リポジトリは見えません。 ``deny_read`` での設定は、\n"
+"    ``allow_read`` での設定に優先します。"
 
 msgid ""
 "``descend``\n"
@@ -13393,66 +15402,107 @@
 "    Textual description of the repository's purpose or contents.\n"
 "    Default is \"unknown\"."
 msgstr ""
+"``description``\n"
+"    リポジトリ内容/用途に関する説明テキスト。 デフォルト値: \"unknown\""
 
 msgid ""
 "``encoding``\n"
 "    Character encoding name. Default is the current locale charset.\n"
 "    Example: \"UTF-8\""
 msgstr ""
+"``encoding``\n"
+"    文字符号化形式。 無指定の場合、 サーバ実行時のロケール設定を元に、\n"
+"    符号化形式が決定されます。 設定例: \"UTF-8\""
 
 msgid ""
 "``errorlog``\n"
 "    Where to output the error log. Default is stderr."
 msgstr ""
+"``errorlog``\n"
+"    エラーログの書き出し先。 無指定時は標準エラー出力に出力。"
 
 msgid ""
 "``hidden``\n"
 "    Whether to hide the repository in the hgwebdir index.\n"
 "    Default is False."
 msgstr ""
+"``hidden``\n"
+"    hgwebdir インデックスにおけるリポジトリ隠蔽の要否。 デフォルト値: False"
 
 msgid ""
 "``ipv6``\n"
 "    Whether to use IPv6. Default is False."
 msgstr ""
+"``ipv6``\n"
+"    IPv6 利用の要否。 デフォルト値: False"
+
+msgid ""
+"``logoimg``\n"
+"    File name of the logo image that some templates display on each page.\n"
+"    The file name is relative to ``staticurl``. That is, the full path to\n"
+"    the logo image is \"staticurl/logoimg\".\n"
+"    If unset, ``hglogo.png`` will be used."
+msgstr ""
+"``logoimg``\n"
+"    幾つかの表示テンプレートにおいて、 各ページで表示されるロゴの、\n"
+"    画像ファイル名。 ``staticurl`` に対する相対パスで指定します。\n"
+"    ロゴ画像ファイルのフルパスは、 \"staticurl/logoimg\" となります。\n"
+"    デフォルト値: ``hglogo.png``"
 
 msgid ""
 "``logourl``\n"
 "    Base URL to use for logos. If unset, ``http://mercurial.selenic.com/``\n"
 "    will be used."
 msgstr ""
+"``logourl``\n"
+"    ロゴ表示に使用するベース URL。 無指定時は\n"
+"    ``http://mercurial.selenic.com/``"
 
 msgid ""
 "``name``\n"
 "    Repository name to use in the web interface. Default is current\n"
 "    working directory."
 msgstr ""
+"``name``\n"
+"    ウェブインタフェースで使用するリポジトリ名。 無指定の場合、\n"
+"    当該作業領域のディレクトリ。"
 
 msgid ""
 "``maxchanges``\n"
 "    Maximum number of changes to list on the changelog. Default is 10."
 msgstr ""
+"``maxchanges``\n"
+"    changelog 画面における最大表示リビジョン数。 デフォルト値: 10"
 
 msgid ""
 "``maxfiles``\n"
 "    Maximum number of files to list per changeset. Default is 10."
 msgstr ""
+"``maxfiles``\n"
+"    リビジョンあたりの最大一覧表示ファイル数。 デフォルト値: 10"
 
 msgid ""
 "``port``\n"
 "    Port to listen on. Default is 8000."
 msgstr ""
+"``port``\n"
+"    待ち受けポート番号。 デフォルト値: 8000"
 
 msgid ""
 "``prefix``\n"
 "    Prefix path to serve from. Default is '' (server root)."
 msgstr ""
+"``prefix``\n"
+"    サービス提供時の前置パス。 デフォルト値: '' (サーバールート)"
 
 msgid ""
 "``push_ssl``\n"
 "    Whether to require that inbound pushes be transported over SSL to\n"
 "    prevent password sniffing. Default is True."
 msgstr ""
+"``push_ssl``\n"
+"    :hg:`push` における SSL 接続要求 (パスワード盗聴防止 ) の要否。\n"
+"    デフォルト値: True"
 
 msgid ""
 "``staticurl``\n"
@@ -13461,22 +15511,34 @@
 "    this setting to serve them directly with the HTTP server.\n"
 "    Example: ``http://hgserver/static/``."
 msgstr ""
+"``staticurl``\n"
+"    静的ファイル利用のベース URL。 未設定の場合、 静的ファイル (例:\n"
+"    アイコン画像 hgicon.png) は CGI スクリプト自身が提供します。\n"
+"    本項目を設定することで、 静的ファイルは HTTP サーバが直接扱います。\n"
+"    設定例: ``http://hgserver/static/``"
 
 msgid ""
 "``stripes``\n"
 "    How many lines a \"zebra stripe\" should span in multiline output.\n"
 "    Default is 1; set to 0 to disable."
 msgstr ""
+"``stripes``\n"
+"    複数行出力における \"シマウマ模様\" の行数。 デフォルト値: 1\n"
+"    (0 指定で機能無効化)"
 
 msgid ""
 "``style``\n"
 "    Which template map style to use."
 msgstr ""
+"``style``\n"
+"    使用するテンプレートスタイル。"
 
 msgid ""
 "``templates``\n"
 "    Where to find the HTML templates. Default is install path.\n"
 msgstr ""
+"``templates``\n"
+"    HTML テンプレートの検索先。 無指定時はインストール先。\n"
 
 msgid "Some commands allow the user to specify a date, e.g.:"
 msgstr "以下のコマンドで日時指定が可能です:"
@@ -13653,7 +15715,7 @@
 "    Mercurial によるロケール自動検出の上書き。 この設定は、 ユーザ名、\n"
 "    コミットメッセージ、 タグ名およびブランチ名を内部データ形式に変換する\n"
 "    際に使用されます。 この環境変数設定は、 コマンドラインでの --encoding\n"
-"    使用により、 更に上書きすることが出来ます。"
+"    使用により、 更に上書きすることができます。"
 
 msgid ""
 "HGENCODINGMODE\n"
@@ -13670,8 +15732,8 @@
 "    「指定の符号化と合致しない場合は処理中断」を意味する \"strict\" が指定\n"
 "    されたものとみなします。 他には、 「未知の文字の置き換え」を意味する\n"
 "    \"replace\" と、 「未知の文字の切り捨て」を意味する \"ignore\" が指定\n"
-"    出来ます。 この環境変数設定は、 コマンドラインでの --encodingmode\n"
-"    使用により、 更に上書きすることが出来ます。"
+"    できます。 この環境変数設定は、 コマンドラインでの --encodingmode\n"
+"    使用により、 更に上書きすることができます。"
 
 msgid ""
 "HGENCODINGAMBIGUOUS\n"
@@ -13738,7 +15800,7 @@
 "    この環境変数が設定された場合、 Mercurial の表示設定を変更し得る\n"
 "    設定ファイル中の記述が全て無視されます。\n"
 "    encoding や defaults の指定、 verbose モード、 debug モード、\n"
-"    quiet モード、 tracebacks や各国語設定が対象となります。\n"
+"    quiet モード、 トレースバック表示設定や各国語設定が対象となります。\n"
 "    ユーザ設定を温存したままで、\n"
 "    ツール等から Mercurial を使用する場合に有用です。"
 
@@ -14695,7 +16757,7 @@
 "--------"
 msgstr ""
 "概要\n"
-"--------"
+"----"
 
 msgid ""
 "The Mercurial system uses a file called ``.hgignore`` in the root\n"
@@ -14711,7 +16773,7 @@
 "-----------"
 msgstr ""
 "詳細\n"
-"-----------"
+"----"
 
 msgid ""
 "The working directory of a Mercurial repository will often contain\n"
@@ -14841,7 +16903,7 @@
 "-------"
 msgstr ""
 "記述例\n"
-"-------"
+"------"
 
 msgid "Here is an example ignore file. ::"
 msgstr "無視設定ファイルの記述例を以下に示します。 ::"
@@ -14943,7 +17005,7 @@
 msgstr ""
 
 msgid "To merge files Mercurial uses merge tools."
-msgstr ""
+msgstr "Mercurial での更新内容マージには、 マージツールを使用します。"
 
 msgid ""
 "A merge tool combines two different versions of a file into a merged\n"
@@ -14951,11 +17013,18 @@
 "ancestor of the two file versions, so they can determine the changes\n"
 "made on both branches."
 msgstr ""
+"マージツールは、 2つの異なるリビジョンにおけるファイルの内容を、\n"
+"1つのファイルに統合します。 マージツール実行時には、\n"
+"統合対象となる2つのリビジョン時点の内容を持つファイルに加えて、\n"
+"2つの共通の祖先となるリビジョン時点の内容を持つファイルが与えられ、\n"
+"双方のリビジョンにおける変更内容が特定されます。"
 
 msgid ""
 "Merge tools are used both for :hg:`resolve`, :hg:`merge`, :hg:`update`,\n"
 ":hg:`backout` and in several extensions."
 msgstr ""
+"マージツールは、 :hg:`resolve`、 :hg:`merge`、 :hg:`update` や\n"
+":hg:`backout` および幾つかのエクステンションの実行時に起動されます。"
 
 msgid ""
 "Usually, the merge tool tries to automatically reconcile the files by\n"
@@ -14967,17 +17036,32 @@
 "conflict markers. Mercurial does not include any interactive merge\n"
 "programs but relies on external tools for that."
 msgstr ""
+"一般的なマージツールは、 統合対象となるリビジョンに至る過程で、\n"
+"共通の祖先を元に独立して実施された、 異なる部位への変更に関しては、\n"
+"それぞれが両立できるように、 自動的に双方の変更を取り込みます。\n"
+"それに加えて、 近接箇所への異なる変更によって、\n"
+"衝突 (conflict) が生じる場合には、\n"
+"グラフィカルな UI での対話的な衝突の解消や、\n"
+"衝突マークを結果ファイルに埋め込んだりします。\n"
+"Mercurial 自身は対話的なマージツールを提供せずに、\n"
+"外部ツールと連携するようになっています。"
 
 msgid ""
 "Available merge tools\n"
 "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"利用可能なマージツール\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid ""
 "External merge tools and their properties are configured in the\n"
 "merge-tools configuration section - see hgrc(5) - but they can often just\n"
 "be named by their executable."
 msgstr ""
+"外部のマージツールとその実行に関する設定は、 設定ファイルの\n"
+"merge-tools セクションに記述されますが、 設定記述の際の名前には、\n"
+"外部ツールのコマンド名そのものを使用するが通例です - hgrc(5) 参照のこと\n"
+"(訳注: :hg:`help config` でも参照可能)"
 
 msgid ""
 "A merge tool is generally usable if its executable can be found on the\n"
@@ -14988,11 +17072,21 @@
 "symlink, if it can handle binary files if the file is binary, and if a\n"
 "GUI is available if the tool requires a GUI."
 msgstr ""
+"マージツール設定は、 システム上に実行可能ファイルが存在し、\n"
+"且つマージ処理が可能である場合に意味を持ちます。\n"
+"実行可能ファイルの指定は、 絶対ないし相対パスで指定されるか、\n"
+"コマンドサーチパス設定上に、\n"
+"同名の実行可能ファイルが存在する場合に有効となります。\n"
+"マージツールはマージ処理が可能であるものと仮定されます。\n"
+"対象がシンボリックリンクで シンボリックリンクが扱える (設定の) 場合、\n"
+"対象がバイナリファイルで バイナリファイルが扱える (設定の) 場合、\n"
+"あるいは GUI が必要な設定で GUI が利用可能な場合は、\n"
+"それぞれ適切に機能することが要求されます。"
 
 msgid ""
 "There are some internal merge tools which can be used. The internal\n"
 "merge tools are:"
-msgstr ""
+msgstr "以下のような内部マージツールも利用可能です:"
 
 msgid ""
 "``internal:merge``\n"
@@ -15000,6 +17094,10 @@
 "   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"
@@ -15007,22 +17105,30 @@
 "   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 ""
+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"
@@ -15033,20 +17139,32 @@
 "   ``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 ""
 "Internal tools are always available and do not require a GUI but will by "
 "default\n"
 "not handle symlinks or binary files."
 msgstr ""
+"内部マージツールは、 常に利用可能で GUI も必要としませんが、\n"
+"シンボリックリンクやバイナリファイルには対応しません。"
 
 msgid ""
 "Choosing a merge tool\n"
 "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 msgstr ""
+"マージツールの選択\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid "Mercurial uses these rules when deciding which merge tool to use:"
-msgstr ""
+msgstr "Mercurial で使用されるマージツールは以下の順序で決定されます:"
 
 msgid ""
 "1. If a tool has been specified with the --tool option to merge or resolve, "
@@ -15057,12 +17175,19 @@
 "by\n"
 "   the shell."
 msgstr ""
+"1. :hg:`merge` や :hg:`resolve` で --tool オプションが指定された場合、\n"
+"   指定されたツールが使用されます。\n"
+"   merge-tools 設定に記述された名前が指定された場合、\n"
+"   設定内容が適用されます。 それ以外の場合、 指定されたツールは、\n"
+"   実行可能ファイルでなければなりません。"
 
 msgid ""
 "2. If the ``HGMERGE`` environment variable is present, its value is used "
 "and\n"
 "   must be executable by the shell."
 msgstr ""
+"2. ``HGMERGE`` 環境変数が設定されている場合、 その内容が適用されますが、\n"
+"   実行可能ファイルが指定されている必要があります。"
 
 msgid ""
 "3. If the filename of the file to be merged matches any of the patterns in "
@@ -15072,6 +17197,10 @@
 "the\n"
 "   merge tool are not considered."
 msgstr ""
+"3. merge-patterns セクションに記述されたパターンに、\n"
+"   マージ対象ファイルの名前が合致した場合、\n"
+"   合致したパターンに対応する最初のマージツールが使用されます。\n"
+"   バイナリファイルへの適用可否設定は考慮されません。"
 
 msgid ""
 "4. If ui.merge is set it will be considered next. If the value is not the "
@@ -15080,25 +17209,36 @@
 "by\n"
 "   the shell. Otherwise the named tool is used if it is usable."
 msgstr ""
+"4. ui セクションの merge 設定はこの段階で考慮されます。\n"
+"   指定内容が merge-tools 設定に記述された名前では無い場合、\n"
+"   実行可能ファイルが指定されなければなりません。\n"
+"   それ以外の場合は、 利用可能な設定内容が適用されます。"
 
 msgid ""
 "5. If any usable merge tools are present in the merge-tools configuration\n"
 "   section, the one with the highest priority is used."
 msgstr ""
+"5. merge-tools 設定に何らかの記述がある場合、\n"
+"   優先度の最も高いツールが使用されます。"
 
 msgid ""
 "6. If a program named ``hgmerge`` can be found on the system, it is used - "
 "but\n"
 "   it will by default not be used for symlinks and binary files."
 msgstr ""
+"6. ``hgmerge`` という名前のツールが利用可能な場合はこれが利用されます。\n"
+"   但しシンボリックリンクやバイナリファイルには適用されません。"
 
 msgid ""
 "7. If the file to be merged is not binary and is not a symlink, then\n"
 "   ``internal:merge`` is used."
 msgstr ""
+"7. マージ対象ファイルがシンボリックリンクやバイナリファイルでない場合、\n"
+"   ``internal:merge`` が使用されます。"
 
 msgid "8. The merge of the file fails and must be resolved before commit."
 msgstr ""
+"8. ファイルのマージは失敗とみなされ、 手動での :hg:`resolve` が必要です。"
 
 msgid ""
 ".. note::\n"
@@ -15112,11 +17252,21 @@
 "by\n"
 "   default unless the file is binary or a symlink."
 msgstr ""
+".. note::\n"
+"   マージツールの選択が完了したなら、\n"
+"   まず最初に Mercurial は単純マージ処理を実施します。\n"
+"   この際に衝突が検出されて、 マージに失敗した場合に限り\n"
+"   Mercurial は選択したマージツールによるマージを行います。\n"
+"   最初に単純マージ処理を実施するか否かは premerge 設定で制御できます。\n"
+"   シンボリックリンクやバイナリファイル以外に関しては、\n"
+"   premerge のデフォルト値は有効になっています。"
 
 msgid ""
 "See the merge-tools and ui sections of hgrc(5) for details on the\n"
 "configuration of merge tools.\n"
 msgstr ""
+"マージツールの設定詳細に関しては、 hgrc(5) における merge-tools や\n"
+"ui セクションを参照してください。 (訳注: :hg:`help config` でも参照可能)\n"
 
 msgid ""
 "When Mercurial accepts more than one revision, they may be specified\n"
@@ -15501,8 +17651,12 @@
 msgid ""
 "Subrepositories let you nest external repositories or projects into a\n"
 "parent Mercurial repository, and make commands operate on them as a\n"
-"group. External Mercurial and Subversion projects are currently\n"
-"supported."
+"group."
+msgstr ""
+
+msgid ""
+"Mercurial currently supports Mercurial, Git, and Subversion\n"
+"subrepositories."
 msgstr ""
 
 msgid "Subrepositories are made of three components:"
@@ -15510,8 +17664,7 @@
 
 msgid ""
 "1. Nested repository checkouts. They can appear anywhere in the\n"
-"   parent working directory, and are Mercurial clones or Subversion\n"
-"   checkouts."
+"   parent working directory."
 msgstr ""
 
 msgid ""
@@ -15523,14 +17676,19 @@
 msgid "     path/to/nested = https://example.com/nested/repo/path"
 msgstr ""
 
+msgid "   Git and Subversion subrepos are also supported:"
+msgstr ""
+
+msgid ""
+"     path/to/nested = [git]git://example.com/nested/repo/path\n"
+"     path/to/nested = [svn]https://example.com/nested/trunk/path"
+msgstr ""
+
 msgid ""
 "   where ``path/to/nested`` is the checkout location relatively to the\n"
 "   parent Mercurial root, and ``https://example.com/nested/repo/path``\n"
 "   is the source repository path. The source can also reference a\n"
-"   filesystem path. Subversion repositories are defined with:"
-msgstr ""
-
-msgid "     path/to/nested = [svn]https://example.com/nested/trunk/path"
+"   filesystem path."
 msgstr ""
 
 msgid ""
@@ -15737,7 +17895,7 @@
 "log 的なコマンドでのテンプレート利用の際には常に使用可能です:"
 
 msgid ".. keywordsmarker"
-msgstr ""
+msgstr ".. keywordsmarker"
 
 msgid ""
 "The \"date\" keyword does not produce human-readable output. If you\n"
@@ -15765,7 +17923,7 @@
 msgstr "フィルター一覧(入力と、 それに対する出力):"
 
 msgid ".. filtersmarker\n"
-msgstr ""
+msgstr ".. filtersmarker\n"
 
 msgid "Valid URLs are of the form::"
 msgstr "有効な URL 指定は以下の形式です::"
@@ -15799,7 +17957,7 @@
 "revisions`."
 msgstr ""
 "連携先リポジトリ指定において、 '#' 記号に続けて識別子を指定することで、\n"
-"特定のブランチ、 タグないしチェンジセットを指定することが出来ます。\n"
+"特定のブランチ、 タグないしチェンジセットを指定することができます。\n"
 ":hg:`help revisions` も参照してください。"
 
 msgid ""
@@ -15867,7 +18025,7 @@
 "aliases under the [paths] section like so::"
 msgstr ""
 "連携先 URL は、 設定ファイルの [paths] セクションで、\n"
-"別名を付けて記述することが出来ます::"
+"別名を付けて記述することができます::"
 
 msgid ""
 "  [paths]\n"
@@ -15884,7 +18042,7 @@
 "You can then use the alias for any command that uses a URL (for\n"
 "example :hg:`pull alias1` will be treated as :hg:`pull URL1`)."
 msgstr ""
-"URL 指定が必要なコマンドに対しては、 別名を指定することが出来ます\n"
+"URL 指定が必要なコマンドに対しては、 別名を指定することができます\n"
 "(例えば、 :hg:`pull alias1` は :hg:`pull URL1` と同義です)。"
 
 msgid ""
@@ -15902,9 +18060,9 @@
 "  pull-like commands (including incoming and outgoing)."
 msgstr ""
 "default:\n"
-"  'hg clone' によって複製した場合、 新規リポジトリの 'default' として\n"
+"  :hg:`clone` によって複製した場合、 新規リポジトリの 'default' として\n"
 "  複製元リポジトリの URL が保存されます。\n"
-"  以後、 連携先を省略して 'hg push' や 'hg pull' に類するコマンドを\n"
+"  以後、 連携先を省略して :hg:`push` や :hg:`pull` に類するコマンドを\n"
 "  実行した際には、 この URL が連携先として使用されます。"
 
 msgid ""
@@ -15913,7 +18071,7 @@
 "  prefer it over 'default' if both are defined.\n"
 msgstr ""
 "default-push:\n"
-"  'hg push' は、 'default-push' の別名で定義される URL を探します。\n"
+"  :hg:`push` は、 'default-push' の別名で定義される URL を探します。\n"
 "  'default' が定義されている場合でも、 'default-push' が定義されていれば\n"
 "  こちらが優先されます。\n"
 
@@ -16104,9 +18262,6 @@
 msgid "'%s' uses newer protocol %s"
 msgstr "'%s' は新しいプロトコル %s を使います"
 
-msgid "unexpected response:"
-msgstr "未知の応答:"
-
 #, python-format
 msgid "push failed: %s"
 msgstr "履歴反映に失敗: %s"
@@ -16169,6 +18324,9 @@
 msgid "no interrupted transaction available\n"
 msgstr "中断されたトランザクションはありません\n"
 
+msgid "no rollback information available\n"
+msgstr "利用可能なロールバック情報がありません\n"
+
 #, python-format
 msgid "repository tip rolled back to revision %s (undo %s: %s)\n"
 msgstr "tip をリビジョン %s に巻き戻しました (取り消し %s: %s)\n"
@@ -16180,9 +18338,15 @@
 msgid "rolling back unknown transaction\n"
 msgstr "未知のトランザクションの巻き戻し中\n"
 
-#, python-format
-msgid "named branch could not be reset, current branch is still: %s\n"
-msgstr "名前つきブランチはリセットできませんので、 %s のままです\n"
+msgid "rollback of last commit while not checked out may lose data"
+msgstr "作業領域と無関係のコミットの巻き戻しは、コミットデータを喪失します"
+
+msgid "use -f to force"
+msgstr "-f 指定で強制実行"
+
+#, python-format
+msgid "named branch could not be reset: current branch is still '%s'\n"
+msgstr "名前つきブランチはリセットできませんので、 '%s' のままです\n"
 
 #, python-format
 msgid "working directory now based on revisions %d and %d\n"
@@ -16192,9 +18356,6 @@
 msgid "working directory now based on revision %d\n"
 msgstr "%d が作業領域の親リビジョンになりました\n"
 
-msgid "no rollback information available\n"
-msgstr "利用可能なロールバック情報がありません\n"
-
 #, python-format
 msgid "waiting for lock on %s held by %r\n"
 msgstr "%s のロック (%rが保持) の解放を待っています\n"
@@ -16217,9 +18378,8 @@
 msgid "can't commit subrepos without .hgsub"
 msgstr ".hgsub の無い副リポジトリはコミットできません"
 
-#, python-format
-msgid "uncommitted changes in subrepo %s"
-msgstr "副リポジトリ %s に未コミット変更があります"
+msgid "use --subrepos for recursive commit"
+msgstr "--subrepos 指定で再帰コミット"
 
 msgid "file not found!"
 msgstr "ファイルが見つかりません!"
@@ -16525,7 +18685,7 @@
 
 #, python-format
 msgid "cannot patch %s: file is not tracked"
-msgstr "%s にパッチ適用出来ません: 構成管理対象ではありません"
+msgstr "%s にパッチ適用できません: 構成管理対象ではありません"
 
 #, python-format
 msgid "unable to find '%s' for patching\n"
@@ -16717,16 +18877,22 @@
 msgstr "author 指定は文字列でなければなりません"
 
 msgid ""
-"``bisected(string)``\n"
-"    Changesets marked in the specified bisect state (good, bad, skip)."
+"``bisect(string)``\n"
+"    Changesets marked in the specified bisect status:"
+msgstr ""
+
+msgid ""
+"    - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip\n"
+"    - ``goods``, ``bads``      : csets topologicaly good/bad\n"
+"    - ``range``              : csets taking part in the bisection\n"
+"    - ``pruned``             : csets that are goods, bads or skipped\n"
+"    - ``untested``           : csets whose fate is yet unknown\n"
+"    - ``ignored``            : csets ignored due to DAG topology"
 msgstr ""
 
 msgid "bisect requires a string"
 msgstr "bisect 指定は文字列でなければなりません"
 
-msgid "invalid bisect state"
-msgstr ""
-
 msgid ""
 "``bookmark([name])``\n"
 "    The named bookmark or all bookmarks."
@@ -16803,6 +18969,11 @@
 msgstr "filelog 指定はパターンでなければなりません"
 
 msgid ""
+"``first(set, [n])``\n"
+"    An alias for limit()."
+msgstr ""
+
+msgid ""
 "``follow([file])``\n"
 "    An alias for ``::.`` (ancestors of the working copy's first parent).\n"
 "    If a filename is specified, the history of the given file is followed,\n"
@@ -16878,13 +19049,13 @@
 msgstr "keyword 指定は文字列でなければなりません"
 
 msgid ""
-"``limit(set, n)``\n"
-"    First n members of set."
+"``limit(set, [n])``\n"
+"    First n members of set, defaulting to 1."
 msgstr ""
 
 #. i18n: "limit" is a keyword
-msgid "limit requires two arguments"
-msgstr "limit 指定には2つの引数が必要です"
+msgid "limit requires one or two arguments"
+msgstr "limit 指定には1個ないし2個の引数が必要です"
 
 #. i18n: "limit" is a keyword
 msgid "limit requires a number"
@@ -16895,13 +19066,13 @@
 msgstr "limit 指定は数値でなければなりません"
 
 msgid ""
-"``last(set, n)``\n"
-"    Last n members of set."
+"``last(set, [n])``\n"
+"    Last n members of set, defaulting to 1."
 msgstr ""
 
 #. i18n: "last" is a keyword
-msgid "last requires two arguments"
-msgstr "last 指定には2つの引数が必要です"
+msgid "last requires one or two arguments"
+msgstr "last 指定には1個ないし2個の引数が必要です"
 
 #. i18n: "last" is a keyword
 msgid "last requires a number"
@@ -17180,6 +19351,9 @@
 msgid "push refused: %s"
 msgstr "履歴反映が拒否されました: %s"
 
+msgid "Python SSL support not found"
+msgstr "Python の SSL サポート機能が使用できません"
+
 msgid "certificate checking requires Python 2.6"
 msgstr "証明書検証には Python 2.6 が必要です"
 
@@ -17218,11 +19392,11 @@
 
 #, python-format
 msgid "host fingerprint for %s can't be verified (Python too old)"
-msgstr "ホスト %s のフィンガープリントが検証出来ません (Python が古いため)"
+msgstr "ホスト %s のフィンガープリントが検証できません (Python が古いため)"
 
 #, python-format
 msgid "warning: certificate for %s can't be verified (Python too old)\n"
-msgstr "警告: %s の証明書は検証出来ません (Python が古いため)\n"
+msgstr "警告: %s の証明書は検証できません (Python が古いため)\n"
 
 #, python-format
 msgid "'%s' does not appear to be an hg repository"
@@ -17246,13 +19420,13 @@
 msgid "subrepo spec file %s not found"
 msgstr "副リポジトリの spec ファイル %s が見つかりません"
 
-msgid "missing ] in subrepo source"
-msgstr "副リポジトリ元指定に ] がありません"
-
 #, python-format
 msgid "bad subrepository pattern in %s: %s"
 msgstr "%s における副リポジトリ指定の不正: %s"
 
+msgid "missing ] in subrepo source"
+msgstr "副リポジトリ元指定に ] がありません"
+
 #, python-format
 msgid ""
 " subrepository sources for %s differ\n"
@@ -17328,8 +19502,12 @@
 msgid "pushing subrepo %s to %s\n"
 msgstr "副リポジトリ %s から %s へ反映中\n"
 
+#, python-format
+msgid "'svn' executable not found for subrepo '%s'"
+msgstr ""
+
 msgid "cannot retrieve svn tool version"
-msgstr "svn ツールのバージョンが取得出来ません"
+msgstr "svn ツールのバージョンが取得できません"
 
 msgid "cannot commit svn externals"
 msgstr "svn 外部リポジトリに commit できません"
@@ -17509,6 +19687,17 @@
 "    i.e. a 12 hexadecimal digit string."
 msgstr ":short: リビジョンハッシュ 値。 12 桁程度の短縮形式にします。"
 
+msgid ""
+":shortbisect: Any text. Treats `text` as a bisection status, and\n"
+"    returns a single-character representing the status (G: good, B: bad,\n"
+"    S: skipped, U: untested, I: ignored). Returns single space if `text`\n"
+"    is not a valid bisection status."
+msgstr ""
+":shortbisect: 文字列。 `文字列` を2分探索 (bisect) 状態とみなし、\n"
+"    状態に見合った1文字 (G: good, B: bad, S: skipped, U: untested, I:\n"
+"    ignored) を返します。 `文字列` が2分探索状態として不適切な場合、\n"
+"    空白文字を返します。"
+
 msgid ":shortdate: Date. Returns a date like \"2006-09-18\"."
 msgstr ":shortdate: 日時情報。 \"2006-09-18\" 形式で可読化します。"
 
@@ -17546,6 +19735,9 @@
 msgid ":author: String. The unmodified author of the changeset."
 msgstr ":author: 文字列。 リビジョンの作者名(記録情報そのまま)。"
 
+msgid ":bisect: String. The changeset bisection status."
+msgstr ":bisect: 文字列。 当該リビジョンの2分探索状態。"
+
 msgid ""
 ":branch: String. The name of the branch on which the changeset was\n"
 "    committed."
@@ -17848,7 +20040,7 @@
 msgstr "サービス '%s' 用のポート番号が不明"
 
 msgid "file:// URLs can only refer to localhost"
-msgstr "file:// URL が参照出来るのはローカルホストのみです"
+msgstr "file:// URL が参照できるのはローカルホストのみです"
 
 msgid "cannot verify bundle or remote repos"
 msgstr "ローカルリポジトリ以外は検証できません"
@@ -18028,3 +20220,78 @@
 
 msgid "push failed:"
 msgstr "履歴反映に失敗:"
+
+#~ msgid "acl: access denied for changeset %s"
+#~ msgstr "acl: チェンジセット %s のアクセスは拒否されました"
+
+#~ msgid "%s Please enter a valid value"
+#~ msgstr "%s 適切な値を入力してください"
+
+#~ msgid "Please enter a valid value.\n"
+#~ msgstr "適切な値を入力してください。\n"
+
+#~ msgid "source is descendant of destination"
+#~ msgstr "移動元は移動先の子孫です"
+
+#~ msgid "cannot backout a merge changeset without --parent"
+#~ msgstr "マージリビジョンの打消しには --parent 指定が必要です"
+
+#~ msgid "    .. note::"
+#~ msgstr "    .. note::"
+
+#~ msgid "    See :hg:`help urls` for valid source format details."
+#~ msgstr ""
+#~ "    リポジトリ位置指定の詳細は、 :hg:`help urls` を参照してください。"
+
+#~ msgid ""
+#~ "    It is possible to specify an ``ssh://`` URL as the destination, but "
+#~ "no\n"
+#~ "    ``.hg/hgrc`` and working directory will be created on the remote "
+#~ "side.\n"
+#~ "    Please see :hg:`help urls` for important details about ``ssh://`` "
+#~ "URLs."
+#~ msgstr ""
+#~ "    複製先として ``ssh://`` URL 形式を指定することも可能ですが、\n"
+#~ "    遠隔ホスト上では、 ``.hg/hgrc`` の作成も、\n"
+#~ "    作業領域の更新も行われません。\n"
+#~ "    ``ssh://`` URL 形式の詳細は、 :hg:`help urls` を参照してください。"
+
+#~ msgid ""
+#~ "    A set of changesets (tags, or branch names) to pull may be specified\n"
+#~ "    by listing each changeset (tag, or branch name) with -r/--rev.\n"
+#~ "    If -r/--rev is used, the cloned repository will contain only a "
+#~ "subset\n"
+#~ "    of the changesets of the source repository. Only the set of "
+#~ "changesets\n"
+#~ "    defined by all -r/--rev options (including all their ancestors)\n"
+#~ "    will be pulled into the destination repository.\n"
+#~ "    No subsequent changesets (including subsequent tags) will be present\n"
+#~ "    in the destination."
+#~ msgstr ""
+#~ "    複製先に取り込む一連のリビジョンは、 -r/--rev によりリビジョン\n"
+#~ "    (タグ名やブランチ名も可) を列挙することで指定します。\n"
+#~ "    -r/--rev でのリビジョン指定複製を行なう場合、 複製先リポジトリには、\n"
+#~ "    複製元リポジトリの持つリビジョンの、 一部のみが取り込まれます。\n"
+#~ "    取り込み対象は、 -r/--rev での指定リビジョン (およびその祖先) です。\n"
+#~ "    指定リビジョン以後のリビジョンは、 複製先に取り込まれません\n"
+#~ "    (後続のタグ付けリビジョンも除外されます)。"
+
+#~ msgid ""
+#~ "    Using -r/--rev (or 'clone src#rev dest') implies --pull, even for\n"
+#~ "    local source repositories."
+#~ msgstr ""
+#~ "    -r/--rev 指定付き (ないしは :hg:`clone 複製元#リビジョン` 形式)\n"
+#~ "    複製の場合、 同一ファイルシステム上での複製であっても、\n"
+#~ "    暗黙的に --pull 指定を伴います。"
+
+#~ msgid "options:\n"
+#~ msgstr "オプション:\n"
+
+#~ msgid "applied %s\n"
+#~ msgstr "%s に対して適用\n"
+
+#~ msgid "limit requires two arguments"
+#~ msgstr "limit 指定には2つの引数が必要です"
+
+#~ msgid "last requires two arguments"
+#~ msgstr "last 指定には2つの引数が必要です"
--- a/i18n/polib.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/i18n/polib.py	Tue Nov 01 16:49:30 2011 -0500
@@ -5,113 +5,48 @@
 # vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4:
 
 """
-**polib** allows you to manipulate, create, modify gettext files (pot, po
-and mo files).  You can load existing files, iterate through it's entries,
-add, modify entries, comments or metadata, etc... or create new po files
-from scratch.
-
-**polib** provides a simple and pythonic API, exporting only three
-convenience functions (*pofile*, *mofile* and *detect_encoding*), and the
-four core classes, *POFile*, *MOFile*, *POEntry* and *MOEntry* for creating
-new files/entries.
-
-**Basic example**:
+**polib** allows you to manipulate, create, modify gettext files (pot, po and
+mo files).  You can load existing files, iterate through it's entries, add,
+modify entries, comments or metadata, etc. or create new po files from scratch.
 
->>> import polib
->>> # load an existing po file
->>> po = polib.pofile('tests/test_utf8.po')
->>> for entry in po:
-...     # do something with entry...
-...     pass
->>> # add an entry
->>> entry = polib.POEntry(msgid='Welcome', msgstr='Bienvenue')
->>> entry.occurrences = [('welcome.py', '12'), ('anotherfile.py', '34')]
->>> po.append(entry)
->>> # to save our modified po file:
->>> # po.save()
->>> # or you may want to compile the po file
->>> # po.save_as_mofile('tests/test_utf8.mo')
+**polib** provides a simple and pythonic API via the :func:`~polib.pofile` and
+:func:`~polib.mofile` convenience functions.
 """
 
-__author__    = 'David JEAN LOUIS <izimobil@gmail.com>'
-__version__   = '0.5.2'
+__author__    = 'David Jean Louis <izimobil@gmail.com>'
+__version__   = '0.6.4'
 __all__       = ['pofile', 'POFile', 'POEntry', 'mofile', 'MOFile', 'MOEntry',
                  'detect_encoding', 'escape', 'unescape', 'detect_encoding',]
 
+import array
 import codecs
+import os
+import re
 import struct
+import sys
 import textwrap
 import types
-import re
+
 
+# the default encoding to use when encoding cannot be detected
 default_encoding = 'utf-8'
 
-# function pofile() {{{
-
-def pofile(fpath, **kwargs):
-    """
-    Convenience function that parse the po/pot file *fpath* and return
-    a POFile instance.
-
-    **Keyword arguments**:
-      - *fpath*: string, full or relative path to the po/pot file to parse
-      - *wrapwidth*: integer, the wrap width, only useful when -w option was
-        passed to xgettext (optional, default to 78)
-      - *autodetect_encoding*: boolean, if set to False the function will
-        not try to detect the po file encoding (optional, default to True)
-      - *encoding*: string, an encoding, only relevant if autodetect_encoding
-        is set to False
-      - *check_for_duplicates*: whether to check for duplicate entries when
-        adding entries to the file, default: False (optional)
-
-    **Example**:
+# _pofile_or_mofile {{{
 
-    >>> import polib
-    >>> po = polib.pofile('tests/test_weird_occurrences.po',
-    ...     check_for_duplicates=True)
-    >>> po #doctest: +ELLIPSIS
-    <POFile instance at ...>
-    >>> import os, tempfile
-    >>> all_attrs = ('msgctxt', 'msgid', 'msgstr', 'msgid_plural', 
-    ...              'msgstr_plural', 'obsolete', 'comment', 'tcomment', 
-    ...              'occurrences', 'flags', 'previous_msgctxt', 
-    ...              'previous_msgid', 'previous_msgid_plural')
-    >>> for fname in ['test_iso-8859-15.po', 'test_utf8.po']:
-    ...     orig_po = polib.pofile('tests/'+fname)
-    ...     tmpf = tempfile.NamedTemporaryFile().name
-    ...     orig_po.save(tmpf)
-    ...     try:
-    ...         new_po = polib.pofile(tmpf)
-    ...         for old, new in zip(orig_po, new_po):
-    ...             for attr in all_attrs:
-    ...                 if getattr(old, attr) != getattr(new, attr):
-    ...                     getattr(old, attr)
-    ...                     getattr(new, attr)
-    ...     finally:
-    ...         os.unlink(tmpf)
-    >>> po_file = polib.pofile('tests/test_save_as_mofile.po')
-    >>> tmpf = tempfile.NamedTemporaryFile().name
-    >>> po_file.save_as_mofile(tmpf)
-    >>> try:
-    ...     mo_file = polib.mofile(tmpf)
-    ...     for old, new in zip(po_file, mo_file):
-    ...         if po_file._encode(old.msgid) != mo_file._encode(new.msgid):
-    ...             'OLD: ', po_file._encode(old.msgid)
-    ...             'NEW: ', mo_file._encode(new.msgid)
-    ...         if po_file._encode(old.msgstr) != mo_file._encode(new.msgstr):
-    ...             'OLD: ', po_file._encode(old.msgstr)
-    ...             'NEW: ', mo_file._encode(new.msgstr)
-    ...             print new.msgstr
-    ... finally:
-    ...     os.unlink(tmpf)
+def _pofile_or_mofile(f, type, **kwargs):
+    """
+    Internal function used by :func:`polib.pofile` and :func:`polib.mofile` to
+    honor the DRY concept.
     """
-    if kwargs.get('autodetect_encoding', True):
-        enc = detect_encoding(fpath)
-    else:
-        enc = kwargs.get('encoding', default_encoding)
-    check_for_duplicates = kwargs.get('check_for_duplicates', False)
-    parser = _POFileParser(
-        fpath,
+    # get the file encoding
+    enc = kwargs.get('encoding')
+    if enc is None:
+        enc = detect_encoding(f, type == 'mofile')
+
+    # parse the file
+    kls = type == 'pofile' and _POFileParser or _MOFileParser
+    parser = kls(
+        f,
         encoding=enc,
         check_for_duplicates=kwargs.get('check_for_duplicates', False)
     )
@@ -120,95 +55,108 @@
     return instance
 
 # }}}
+# function pofile() {{{
+
+def pofile(pofile, **kwargs):
+    """
+    Convenience function that parses the po or pot file ``pofile`` and returns
+    a :class:`~polib.POFile` instance.
+
+    Arguments:
+
+    ``pofile``
+        string, full or relative path to the po/pot file or its content (data).
+
+    ``wrapwidth``
+        integer, the wrap width, only useful when the ``-w`` option was passed
+        to xgettext (optional, default: ``78``).
+
+    ``encoding``
+        string, the encoding to use (e.g. "utf-8") (default: ``None``, the
+        encoding will be auto-detected).
+
+    ``check_for_duplicates``
+        whether to check for duplicate entries when adding entries to the
+        file (optional, default: ``False``).
+    """
+    return _pofile_or_mofile(pofile, 'pofile', **kwargs)
+
+# }}}
 # function mofile() {{{
 
-def mofile(fpath, **kwargs):
+def mofile(mofile, **kwargs):
     """
-    Convenience function that parse the mo file *fpath* and return
-    a MOFile instance.
+    Convenience function that parses the mo file ``mofile`` and returns a
+    :class:`~polib.MOFile` instance.
 
-    **Keyword arguments**:
-      - *fpath*: string, full or relative path to the mo file to parse
-      - *wrapwidth*: integer, the wrap width, only useful when -w option was
-        passed to xgettext to generate the po file that was used to format
-        the mo file (optional, default to 78)
-      - *autodetect_encoding*: boolean, if set to False the function will
-        not try to detect the po file encoding (optional, default to True)
-      - *encoding*: string, an encoding, only relevant if autodetect_encoding
-        is set to False
-      - *check_for_duplicates*: whether to check for duplicate entries when
-        adding entries to the file, default: False (optional)
+    Arguments:
 
-    **Example**:
+    ``mofile``
+        string, full or relative path to the mo file or its content (data).
 
-    >>> import polib
-    >>> mo = polib.mofile('tests/test_utf8.mo', check_for_duplicates=True)
-    >>> mo #doctest: +ELLIPSIS
-    <MOFile instance at ...>
-    >>> import os, tempfile
-    >>> for fname in ['test_iso-8859-15.mo', 'test_utf8.mo']:
-    ...     orig_mo = polib.mofile('tests/'+fname)
-    ...     tmpf = tempfile.NamedTemporaryFile().name
-    ...     orig_mo.save(tmpf)
-    ...     try:
-    ...         new_mo = polib.mofile(tmpf)
-    ...         for old, new in zip(orig_mo, new_mo):
-    ...             if old.msgid != new.msgid:
-    ...                 old.msgstr
-    ...                 new.msgstr
-    ...     finally:
-    ...         os.unlink(tmpf)
+    ``wrapwidth``
+        integer, the wrap width, only useful when the ``-w`` option was passed
+        to xgettext to generate the po file that was used to format the mo file
+        (optional, default: ``78``).
+
+    ``encoding``
+        string, the encoding to use (e.g. "utf-8") (default: ``None``, the
+        encoding will be auto-detected).
+
+    ``check_for_duplicates``
+        whether to check for duplicate entries when adding entries to the
+        file (optional, default: ``False``).
     """
-    if kwargs.get('autodetect_encoding', True):
-        enc = detect_encoding(fpath, True)
-    else:
-        enc = kwargs.get('encoding', default_encoding)
-    parser = _MOFileParser(
-        fpath,
-        encoding=enc,
-        check_for_duplicates=kwargs.get('check_for_duplicates', False)
-    )
-    instance = parser.parse()
-    instance.wrapwidth = kwargs.get('wrapwidth', 78)
-    return instance
+    return _pofile_or_mofile(mofile, 'mofile', **kwargs)
 
 # }}}
 # function detect_encoding() {{{
 
-def detect_encoding(fpath, binary_mode=False):
+def detect_encoding(file, binary_mode=False):
     """
-    Try to detect the encoding used by the file *fpath*. The function will
-    return polib default *encoding* if it's unable to detect it.
+    Try to detect the encoding used by the ``file``. The ``file`` argument can
+    be a PO or MO file path or a string containing the contents of the file.
+    If the encoding cannot be detected, the function will return the value of
+    ``default_encoding``.
 
-    **Keyword argument**:
-      - *fpath*: string, full or relative path to the mo file to parse.
+    Arguments:
+
+    ``file``
+        string, full or relative path to the po/mo file or its content.
 
-    **Examples**:
+    ``binary_mode``
+        boolean, set this to True if ``file`` is a mo file.
+    """
+    rx = re.compile(r'"?Content-Type:.+? charset=([\w_\-:\.]+)')
 
-    >>> print(detect_encoding('tests/test_noencoding.po'))
-    utf-8
-    >>> print(detect_encoding('tests/test_utf8.po'))
-    UTF-8
-    >>> print(detect_encoding('tests/test_utf8.mo', True))
-    UTF-8
-    >>> print(detect_encoding('tests/test_iso-8859-15.po'))
-    ISO_8859-15
-    >>> print(detect_encoding('tests/test_iso-8859-15.mo', True))
-    ISO_8859-15
-    """
-    import re
-    rx = re.compile(r'"?Content-Type:.+? charset=([\w_\-:\.]+)')
-    if binary_mode:
-        mode = 'rb'
+    def charset_exists(charset):
+        """Check whether ``charset`` is valid or not."""
+        try:
+            codecs.lookup(charset)
+        except LookupError:
+            return False
+        return True
+
+    if not os.path.exists(file):
+        match = rx.search(file)
+        if match:
+            enc = match.group(1).strip()
+            if charset_exists(enc):
+                return enc
     else:
-        mode = 'r'
-    f = open(fpath, mode)
-    for l in f.readlines():
-        match = rx.search(l)
-        if match:
-            f.close()
-            return match.group(1).strip()
-    f.close()
+        if binary_mode:
+            mode = 'rb'
+        else:
+            mode = 'r'
+        f = open(file, mode)
+        for l in f.readlines():
+            match = rx.search(l)
+            if match:
+                f.close()
+                enc = match.group(1).strip()
+                if charset_exists(enc):
+                    return enc
+        f.close()
     return default_encoding
 
 # }}}
@@ -216,12 +164,8 @@
 
 def escape(st):
     """
-    Escape special chars and return the given string *st*.
-
-    **Examples**:
-
-    >>> escape('\\t and \\n and \\r and " and \\\\')
-    '\\\\t and \\\\n and \\\\r and \\\\" and \\\\\\\\'
+    Escapes the characters ``\\\\``, ``\\t``, ``\\n``, ``\\r`` and ``"`` in
+    the given string ``st`` and returns it.
     """
     return st.replace('\\', r'\\')\
              .replace('\t', r'\t')\
@@ -234,18 +178,8 @@
 
 def unescape(st):
     """
-    Unescape special chars and return the given string *st*.
-
-    **Examples**:
-
-    >>> unescape('\\\\t and \\\\n and \\\\r and \\\\" and \\\\\\\\')
-    '\\t and \\n and \\r and " and \\\\'
-    >>> unescape(r'\\n')
-    '\\n'
-    >>> unescape(r'\\\\n')
-    '\\\\n'
-    >>> unescape(r'\\\\n\\n')
-    '\\\\n\\n'
+    Unescapes the characters ``\\\\``, ``\\t``, ``\\n``, ``\\r`` and ``"`` in
+    the given string ``st`` and returns it.
     """
     def unescape_repl(m):
         m = m.group(1)
@@ -265,27 +199,36 @@
 
 class _BaseFile(list):
     """
-    Common parent class for POFile and MOFile classes.
-    This class must **not** be instanciated directly.
+    Common base class for the :class:`~polib.POFile` and :class:`~polib.MOFile`
+    classes. This class should **not** be instanciated directly.
     """
 
     def __init__(self, *args, **kwargs):
         """
-        Constructor.
+        Constructor, accepts the following keyword arguments:
+
+        ``pofile``
+            string, the path to the po or mo file, or its content as a string.
 
-        **Keyword arguments**:
-          - *fpath*: string, path to po or mo file
-          - *wrapwidth*: integer, the wrap width, only useful when -w option
-            was passed to xgettext to generate the po file that was used to
-            format the mo file, default to 78 (optional),
-          - *encoding*: string, the encoding to use, defaults to
-            "default_encoding" global variable (optional),
-          - *check_for_duplicates*: whether to check for duplicate entries
-            when adding entries to the file, default: False (optional).
+        ``wrapwidth``
+            integer, the wrap width, only useful when the ``-w`` option was
+            passed to xgettext (optional, default: ``78``).
+
+        ``encoding``
+            string, the encoding to use, defaults to ``default_encoding``
+            global variable (optional).
+
+        ``check_for_duplicates``
+            whether to check for duplicate entries when adding entries to the
+            file, (optional, default: ``False``).
         """
         list.__init__(self)
         # the opened file handle
-        self.fpath = kwargs.get('fpath')
+        pofile = kwargs.get('pofile', None)
+        if pofile and os.path.exists(pofile):
+            self.fpath = pofile
+        else:
+            self.fpath = kwargs.get('fpath')
         # the width at which lines should be wrapped
         self.wrapwidth = kwargs.get('wrapwidth', 78)
         # the file encoding
@@ -298,66 +241,56 @@
         self.metadata = {}
         self.metadata_is_fuzzy = 0
 
-    def __str__(self):
+    def __unicode__(self):
         """
-        String representation of the file.
+        Returns the unicode representation of the file.
         """
         ret = []
         entries = [self.metadata_as_entry()] + \
                   [e for e in self if not e.obsolete]
         for entry in entries:
-            ret.append(entry.__str__(self.wrapwidth))
+            ret.append(entry.__unicode__(self.wrapwidth))
         for entry in self.obsolete_entries():
-            ret.append(entry.__str__(self.wrapwidth))
-        return '\n'.join(ret)
+            ret.append(entry.__unicode__(self.wrapwidth))
+        ret = '\n'.join(ret)
+
+        if type(ret) != types.UnicodeType:
+            return unicode(ret, self.encoding)
+        return ret
+
+    def __str__(self):
+        """
+        Returns the string representation of the file.
+        """
+        return unicode(self).encode(self.encoding)
 
     def __contains__(self, entry):
         """
-        Overriden method to implement the membership test (in and not in).
-        The method considers that an entry is in the file if it finds an 
-        entry that has the same msgid (case sensitive).
-
-        **Keyword argument**:
-          - *entry*: an instance of polib._BaseEntry
+        Overriden ``list`` method to implement the membership test (in and
+        not in).
+        The method considers that an entry is in the file if it finds an entry
+        that has the same msgid (the test is **case sensitive**).
 
-        **Tests**:
-        >>> po = POFile()
-        >>> e1 = POEntry(msgid='foobar', msgstr='spam')
-        >>> e2 = POEntry(msgid='barfoo', msgstr='spam')
-        >>> e3 = POEntry(msgid='foobar', msgstr='eggs')
-        >>> e4 = POEntry(msgid='spameggs', msgstr='eggs')
-        >>> po.append(e1)
-        >>> po.append(e2)
-        >>> e1 in po
-        True
-        >>> e2 not in po
-        False
-        >>> e3 in po
-        True
-        >>> e4 in po
-        False
+        Argument:
+
+        ``entry``
+            an instance of :class:`~polib._BaseEntry`.
         """
         return self.find(entry.msgid, by='msgid') is not None
+    
+    def __eq__(self, other):
+        return unicode(self) == unicode(other)
 
     def append(self, entry):
         """
         Overriden method to check for duplicates entries, if a user tries to
-        add an entry that already exists, the method will raise a ValueError
-        exception.
-
-        **Keyword argument**:
-          - *entry*: an instance of polib._BaseEntry
+        add an entry that is already in the file, the method will raise a
+        ``ValueError`` exception.
 
-        **Tests**:
-        >>> e1 = POEntry(msgid='foobar', msgstr='spam')
-        >>> e2 = POEntry(msgid='foobar', msgstr='eggs')
-        >>> po = POFile(check_for_duplicates=True)
-        >>> po.append(e1)
-        >>> try:
-        ...     po.append(e2)
-        ... except ValueError, e:
-        ...     unicode(e)
-        u'Entry "foobar" already exists'
+        Argument:
+
+        ``entry``
+            an instance of :class:`~polib._BaseEntry`.
         """
         if self.check_for_duplicates and entry in self:
             raise ValueError('Entry "%s" already exists' % entry.msgid)
@@ -366,70 +299,50 @@
     def insert(self, index, entry):
         """
         Overriden method to check for duplicates entries, if a user tries to
-        insert an entry that already exists, the method will raise a ValueError
-        exception.
+        add an entry that is already in the file, the method will raise a
+        ``ValueError`` exception.
 
-        **Keyword arguments**:
-          - *index*: index at which the entry should be inserted
-          - *entry*: an instance of polib._BaseEntry
+        Arguments:
 
-        **Tests**:
-        >>> import polib
-        >>> polib.check_for_duplicates = True
-        >>> e1 = POEntry(msgid='foobar', msgstr='spam')
-        >>> e2 = POEntry(msgid='barfoo', msgstr='eggs')
-        >>> e3 = POEntry(msgid='foobar', msgstr='eggs')
-        >>> po = POFile(check_for_duplicates=True)
-        >>> po.insert(0, e1)
-        >>> po.insert(1, e2)
-        >>> try:
-        ...     po.insert(0, e3)
-        ... except ValueError, e:
-        ...     unicode(e)
-        u'Entry "foobar" already exists'
+        ``index``
+            index at which the entry should be inserted.
+
+        ``entry``
+            an instance of :class:`~polib._BaseEntry`.
         """
         if self.check_for_duplicates and entry in self:
             raise ValueError('Entry "%s" already exists' % entry.msgid)
         super(_BaseFile, self).insert(index, entry)
 
-    def __repr__(self):
-        """Return the official string representation of the object."""
-        return '<%s instance at %x>' % (self.__class__.__name__, id(self))
-
     def metadata_as_entry(self):
         """
-        Return the metadata as an entry:
-
-        >>> import polib
-        >>> po = polib.pofile('tests/test_fuzzy_header.po')
-        >>> unicode(po) == unicode(open('tests/test_fuzzy_header.po').read())
-        True
+        Returns the file metadata as a :class:`~polib.POFile` instance.
         """
         e = POEntry(msgid='')
         mdata = self.ordered_metadata()
         if mdata:
             strs = []
-            e._multiline_str['msgstr'] = ''
             for name, value in mdata:
                 # Strip whitespace off each line in a multi-line entry
                 strs.append('%s: %s' % (name, value))
             e.msgstr = '\n'.join(strs) + '\n'
-            e._multiline_str['msgstr'] = '__POLIB__NL__'.join(
-                    [s + '\n' for s in strs])
         if self.metadata_is_fuzzy:
             e.flags.append('fuzzy')
         return e
 
     def save(self, fpath=None, repr_method='__str__'):
         """
-        Save the po file to file *fpath* if no file handle exists for
-        the object. If there's already an open file and no fpath is
-        provided, then the existing file is rewritten with the modified
-        data.
+        Saves the po file to ``fpath``.
+        If it is an existing file and no ``fpath`` is provided, then the
+        existing file is rewritten with the modified data.
+
+        Keyword arguments:
 
-        **Keyword arguments**:
-          - *fpath*: string, full or relative path to the file.
-          - *repr_method*: string, the method to use for output.
+        ``fpath``
+            string, full or relative path to the file.
+
+        ``repr_method``
+            string, the method to use for output.
         """
         if self.fpath is None and fpath is None:
             raise IOError('You must provide a file path to save() method')
@@ -444,38 +357,47 @@
                 contents = contents.decode(self.encoding)
         fhandle.write(contents)
         fhandle.close()
-
-    def find(self, st, by='msgid'):
-        """
-        Find entry which msgid (or property identified by the *by*
-        attribute) matches the string *st*.
+        # set the file path if not set
+        if self.fpath is None and fpath:
+            self.fpath = fpath
 
-        **Keyword arguments**:
-          - *st*: string, the string to search for
-          - *by*: string, the comparison attribute
+    def find(self, st, by='msgid', include_obsolete_entries=False,
+             msgctxt=False):
+        """
+        Find the entry which msgid (or property identified by the ``by``
+        argument) matches the string ``st``.
 
-        **Examples**:
+        Keyword arguments:
+
+        ``st``
+            string, the string to search for.
 
-        >>> po = pofile('tests/test_utf8.po')
-        >>> entry = po.find('Thursday')
-        >>> entry.msgstr
-        u'Jueves'
-        >>> entry = po.find('Some unexistant msgid')
-        >>> entry is None
-        True
-        >>> entry = po.find('Jueves', 'msgstr')
-        >>> entry.msgid
-        u'Thursday'
+        ``by``
+            string, the property to use for comparison (default: ``msgid``).
+
+        ``include_obsolete_entries``
+            boolean, whether to also search in entries that are obsolete.
+
+        ``msgctxt``
+            string, allows to specify a specific message context for the
+            search.
         """
-        for e in self:
+        if include_obsolete_entries:
+            entries = self[:]
+        else:
+            entries = [e for e in self if not e.obsolete]
+        for e in entries:
             if getattr(e, by) == st:
+                if msgctxt and e.msgctxt != msgctxt:
+                    continue
                 return e
         return None
 
     def ordered_metadata(self):
         """
-        Convenience method that return the metadata ordered. The return
-        value is list of tuples (metadata name, metadata_value).
+        Convenience method that returns an ordered version of the metadata
+        dictionnary. The return value is list of tuples (metadata name,
+        metadata_value).
         """
         # copy the dict first
         metadata = self.metadata.copy()
@@ -497,9 +419,10 @@
                 ordered_data.append((data, value))
             except KeyError:
                 pass
-        # the rest of the metadata won't be ordered there are no specs for this
+        # the rest of the metadata will be alphabetically ordered since there
+        # are no specs for this AFAIK
         keys = metadata.keys()
-        list(keys).sort()
+        keys.sort()
         for data in keys:
             value = metadata[data]
             ordered_data.append((data, value))
@@ -507,45 +430,51 @@
 
     def to_binary(self):
         """
-        Return the mofile binary representation.
+        Return the binary representation of the file.
         """
-        import array
-        import struct
-        import types
         offsets = []
         entries = self.translated_entries()
         # the keys are sorted in the .mo file
         def cmp(_self, other):
-            if _self.msgid > other.msgid:
+            # msgfmt compares entries with msgctxt if it exists
+            self_msgid = _self.msgctxt and _self.msgctxt or _self.msgid
+            other_msgid = other.msgctxt and other.msgctxt or other.msgid
+            if self_msgid > other_msgid:
                 return 1
-            elif _self.msgid < other.msgid:
+            elif self_msgid < other_msgid:
                 return -1
             else:
                 return 0
         # add metadata entry
         entries.sort(cmp)
         mentry = self.metadata_as_entry()
-        mentry.msgstr = mentry.msgstr.replace('\\n', '').lstrip()
+        #mentry.msgstr = mentry.msgstr.replace('\\n', '').lstrip()
         entries = [mentry] + entries
         entries_len = len(entries)
         ids, strs = '', ''
         for e in entries:
             # For each string, we need size and file offset.  Each string is
             # NUL terminated; the NUL does not count into the size.
+            msgid = ''
+            if e.msgctxt:
+                # Contexts are stored by storing the concatenation of the
+                # context, a <EOT> byte, and the original string
+                msgid = self._encode(e.msgctxt + '\4')
             if e.msgid_plural:
                 indexes = e.msgstr_plural.keys()
                 indexes.sort()
                 msgstr = []
                 for index in indexes:
                     msgstr.append(e.msgstr_plural[index])
-                msgid = self._encode(e.msgid + '\0' + e.msgid_plural)
+                msgid += self._encode(e.msgid + '\0' + e.msgid_plural)
                 msgstr = self._encode('\0'.join(msgstr))
             else:
-                msgid = self._encode(e.msgid)
+                msgid += self._encode(e.msgid)
                 msgstr = self._encode(e.msgstr)
             offsets.append((len(ids), len(msgid), len(strs), len(msgstr)))
             ids  += msgid  + '\0'
             strs += msgstr + '\0'
+
         # The header is 7 32-bit unsigned integers.
         keystart = 7*4+16*entries_len
         # and the values start after the keys
@@ -558,22 +487,31 @@
             koffsets += [l1, o1+keystart]
             voffsets += [l2, o2+valuestart]
         offsets = koffsets + voffsets
-        output  = struct.pack("IIIIIII",
-                             0x950412de,        # Magic number
-                             0,                 # Version
-                             entries_len,       # # of entries
-                             7*4,               # start of key index
-                             7*4+entries_len*8, # start of value index
-                             0, 0)              # size and offset of hash table
-        output += array.array("I", offsets).tostring()
+        # check endianness for magic number
+        if struct.pack('@h', 1) == struct.pack('<h', 1):
+            magic_number = MOFile.LITTLE_ENDIAN
+        else:
+            magic_number = MOFile.BIG_ENDIAN
+
+        output = struct.pack(
+            "Iiiiiii",
+            magic_number,      # Magic number
+            0,                 # Version
+            entries_len,       # # of entries
+            7*4,               # start of key index
+            7*4+entries_len*8, # start of value index
+            0, keystart        # size and offset of hash table
+                               # Important: we don't use hash tables
+        )              
+        output += array.array("i", offsets).tostring()
         output += ids
         output += strs
         return output
 
     def _encode(self, mixed):
         """
-        Encode the given argument with the file encoding if the type is unicode
-        and return the encoded string.
+        Encodes the given ``mixed`` argument with the file encoding if and
+        only if it's an unicode string and returns the encoded string.
         """
         if type(mixed) == types.UnicodeType:
             return mixed.encode(self.encoding)
@@ -583,88 +521,43 @@
 # class POFile {{{
 
 class POFile(_BaseFile):
-    '''
+    """
     Po (or Pot) file reader/writer.
-    POFile objects inherit the list objects methods.
-
-    **Example**:
+    This class inherits the :class:`~polib._BaseFile` class and, by extension,
+    the python ``list`` type.
+    """
 
-    >>> po = POFile()
-    >>> entry1 = POEntry(
-    ...     msgid="Some english text",
-    ...     msgstr="Un texte en anglais"
-    ... )
-    >>> entry1.occurrences = [('testfile', 12),('another_file', 1)]
-    >>> entry1.comment = "Some useful comment"
-    >>> entry2 = POEntry(
-    ...     msgid="Peace in some languages",
-    ...     msgstr="Pace سلام שלום Hasîtî 和平"
-    ... )
-    >>> entry2.occurrences = [('testfile', 15),('another_file', 5)]
-    >>> entry2.comment = "Another useful comment"
-    >>> entry3 = POEntry(
-    ...     msgid='Some entry with quotes " \\"',
-    ...     msgstr='Un message unicode avec des quotes " \\"'
-    ... )
-    >>> entry3.comment = "Test string quoting"
-    >>> po.append(entry1)
-    >>> po.append(entry2)
-    >>> po.append(entry3)
-    >>> po.header = "Some Header"
-    >>> print(po)
-    # Some Header
-    msgid ""
-    msgstr ""
-    <BLANKLINE>
-    #. Some useful comment
-    #: testfile:12 another_file:1
-    msgid "Some english text"
-    msgstr "Un texte en anglais"
-    <BLANKLINE>
-    #. Another useful comment
-    #: testfile:15 another_file:5
-    msgid "Peace in some languages"
-    msgstr "Pace سلام שלום Hasîtî 和平"
-    <BLANKLINE>
-    #. Test string quoting
-    msgid "Some entry with quotes \\" \\""
-    msgstr "Un message unicode avec des quotes \\" \\""
-    <BLANKLINE>
-    '''
-
-    def __str__(self):
-        """Return the string representation of the po file"""
+    def __unicode__(self):
+        """
+        Returns the unicode representation of the po file.
+        """
         ret, headers = '', self.header.split('\n')
         for header in headers:
             if header[:1] in [',', ':']:
                 ret += '#%s\n' % header
             else:
                 ret += '# %s\n' % header
-        return ret + _BaseFile.__str__(self)
+
+        if type(ret) != types.UnicodeType:
+            ret = unicode(ret, self.encoding)
+
+        return ret + _BaseFile.__unicode__(self)
 
     def save_as_mofile(self, fpath):
         """
-        Save the binary representation of the file to *fpath*.
+        Saves the binary representation of the file to given ``fpath``.
 
-        **Keyword arguments**:
-          - *fpath*: string, full or relative path to the file.
+        Keyword argument:
+
+        ``fpath``
+            string, full or relative path to the mo file.
         """
         _BaseFile.save(self, fpath, 'to_binary')
 
     def percent_translated(self):
         """
-        Convenience method that return the percentage of translated
+        Convenience method that returns the percentage of translated
         messages.
-
-        **Example**:
-
-        >>> import polib
-        >>> po = polib.pofile('tests/test_pofile_helpers.po')
-        >>> po.percent_translated()
-        50
-        >>> po = POFile()
-        >>> po.percent_translated()
-        100
         """
         total = len([e for e in self if not e.obsolete])
         if total == 0:
@@ -674,91 +567,52 @@
 
     def translated_entries(self):
         """
-        Convenience method that return a list of translated entries.
-
-        **Example**:
-
-        >>> import polib
-        >>> po = polib.pofile('tests/test_pofile_helpers.po')
-        >>> len(po.translated_entries())
-        6
+        Convenience method that returns the list of translated entries.
         """
         return [e for e in self if e.translated()]
 
     def untranslated_entries(self):
         """
-        Convenience method that return a list of untranslated entries.
-
-        **Example**:
-
-        >>> import polib
-        >>> po = polib.pofile('tests/test_pofile_helpers.po')
-        >>> len(po.untranslated_entries())
-        4
+        Convenience method that returns the list of untranslated entries.
         """
         return [e for e in self if not e.translated() and not e.obsolete \
                 and not 'fuzzy' in e.flags]
 
     def fuzzy_entries(self):
         """
-        Convenience method that return the list of 'fuzzy' entries.
-
-        **Example**:
-
-        >>> import polib
-        >>> po = polib.pofile('tests/test_pofile_helpers.po')
-        >>> len(po.fuzzy_entries())
-        2
+        Convenience method that returns the list of fuzzy entries.
         """
         return [e for e in self if 'fuzzy' in e.flags]
 
     def obsolete_entries(self):
         """
-        Convenience method that return the list of obsolete entries.
-
-        **Example**:
-
-        >>> import polib
-        >>> po = polib.pofile('tests/test_pofile_helpers.po')
-        >>> len(po.obsolete_entries())
-        4
+        Convenience method that returns the list of obsolete entries.
         """
         return [e for e in self if e.obsolete]
 
     def merge(self, refpot):
         """
-        XXX this could not work if encodings are different, needs thinking
-        and general refactoring of how polib handles encoding...
-
-        Convenience method that merge the current pofile with the pot file
+        Convenience method that merges the current pofile with the pot file
         provided. It behaves exactly as the gettext msgmerge utility:
 
-          - comments of this file will be preserved, but extracted comments
-            and occurrences will be discarded
-          - any translations or comments in the file will be discarded,
-            however dot comments and file positions will be preserved
-
-        **Keyword argument**:
-          - *refpot*: object POFile, the reference catalog.
+        * comments of this file will be preserved, but extracted comments and
+          occurrences will be discarded;
+        * any translations or comments in the file will be discarded, however,
+          dot comments and file positions will be preserved;
+        * the fuzzy flags are preserved.
 
-        **Example**:
+        Keyword argument:
 
-        >>> import polib
-        >>> refpot = polib.pofile('tests/test_merge.pot')
-        >>> po = polib.pofile('tests/test_merge_before.po')
-        >>> po.merge(refpot)
-        >>> expected_po = polib.pofile('tests/test_merge_after.po')
-        >>> unicode(po) == unicode(expected_po)
-        True
+        ``refpot``
+            object POFile, the reference catalog.
         """
         for entry in refpot:
-            e = self.find(entry.msgid)
+            e = self.find(entry.msgid, include_obsolete_entries=True)
             if e is None:
                 e = POEntry()
                 self.append(e)
             e.merge(entry)
-        # ok, now we must "obsolete" entries that are not in the refpot
-        # anymore
+        # ok, now we must "obsolete" entries that are not in the refpot anymore
         for entry in self:
             if refpot.find(entry.msgid) is None:
                 entry.obsolete = True
@@ -767,48 +621,18 @@
 # class MOFile {{{
 
 class MOFile(_BaseFile):
-    '''
+    """
     Mo file reader/writer.
-    MOFile objects inherit the list objects methods.
-
-    **Example**:
-
-    >>> mo = MOFile()
-    >>> entry1 = POEntry(
-    ...     msgid="Some english text",
-    ...     msgstr="Un texte en anglais"
-    ... )
-    >>> entry2 = POEntry(
-    ...     msgid="I need my dirty cheese",
-    ...     msgstr="Je veux mon sale fromage"
-    ... )
-    >>> entry3 = MOEntry(
-    ...     msgid='Some entry with quotes " \\"',
-    ...     msgstr='Un message unicode avec des quotes " \\"'
-    ... )
-    >>> mo.append(entry1)
-    >>> mo.append(entry2)
-    >>> mo.append(entry3)
-    >>> print(mo)
-    msgid ""
-    msgstr ""
-    <BLANKLINE>
-    msgid "Some english text"
-    msgstr "Un texte en anglais"
-    <BLANKLINE>
-    msgid "I need my dirty cheese"
-    msgstr "Je veux mon sale fromage"
-    <BLANKLINE>
-    msgid "Some entry with quotes \\" \\""
-    msgstr "Un message unicode avec des quotes \\" \\""
-    <BLANKLINE>
-    '''
+    This class inherits the :class:`~polib._BaseFile` class and, by
+    extension, the python ``list`` type.
+    """
+    BIG_ENDIAN    = 0xde120495
+    LITTLE_ENDIAN = 0x950412de
 
     def __init__(self, *args, **kwargs):
         """
-        MOFile constructor. Mo files have two other properties:
-            - magic_number: the magic_number of the binary file,
-            - version: the version of the mo spec.
+        Constructor, accepts all keywords arguments accepted by 
+        :class:`~polib._BaseFile` class.
         """
         _BaseFile.__init__(self, *args, **kwargs)
         self.magic_number = None
@@ -816,19 +640,23 @@
 
     def save_as_pofile(self, fpath):
         """
-        Save the string representation of the file to *fpath*.
+        Saves the mofile as a pofile to ``fpath``.
 
-        **Keyword argument**:
-          - *fpath*: string, full or relative path to the file.
+        Keyword argument:
+
+        ``fpath``
+            string, full or relative path to the file.
         """
         _BaseFile.save(self, fpath)
 
-    def save(self, fpath):
+    def save(self, fpath=None):
         """
-        Save the binary representation of the file to *fpath*.
+        Saves the mofile to ``fpath``.
 
-        **Keyword argument**:
-          - *fpath*: string, full or relative path to the file.
+        Keyword argument:
+
+        ``fpath``
+            string, full or relative path to the file.
         """
         _BaseFile.save(self, fpath, 'to_binary')
 
@@ -867,29 +695,47 @@
 
 class _BaseEntry(object):
     """
-    Base class for POEntry or MOEntry objects.
-    This class must *not* be instanciated directly.
+    Base class for :class:`~polib.POEntry` and :class:`~polib.MOEntry` classes.
+    This class should **not** be instanciated directly.
     """
 
     def __init__(self, *args, **kwargs):
-        """Base Entry constructor."""
+        """
+        Constructor, accepts the following keyword arguments:
+
+        ``msgid``
+            string, the entry msgid.
+
+        ``msgstr``
+            string, the entry msgstr.
+
+        ``msgid_plural``
+            string, the entry msgid_plural.
+
+        ``msgstr_plural``
+            list, the entry msgstr_plural lines.
+
+        ``msgctxt``
+            string, the entry context (msgctxt).
+
+        ``obsolete``
+            bool, whether the entry is "obsolete" or not.
+
+        ``encoding``
+            string, the encoding to use, defaults to ``default_encoding``
+            global variable (optional).
+        """
         self.msgid = kwargs.get('msgid', '')
         self.msgstr = kwargs.get('msgstr', '')
         self.msgid_plural = kwargs.get('msgid_plural', '')
         self.msgstr_plural = kwargs.get('msgstr_plural', {})
+        self.msgctxt = kwargs.get('msgctxt', None)
         self.obsolete = kwargs.get('obsolete', False)
         self.encoding = kwargs.get('encoding', default_encoding)
-        self.msgctxt = kwargs.get('msgctxt', None)
-        self._multiline_str = {}
 
-    def __repr__(self):
-        """Return the official string representation of the object."""
-        return '<%s instance at %x>' % (self.__class__.__name__, id(self))
-
-    def __str__(self, wrapwidth=78):
+    def __unicode__(self, wrapwidth=78):
         """
-        Common string representation of the POEntry and MOEntry
-        objects.
+        Returns the unicode representation of the entry.
         """
         if self.obsolete:
             delflag = '#~ '
@@ -898,12 +744,12 @@
         ret = []
         # write the msgctxt if any
         if self.msgctxt is not None:
-            ret += self._str_field("msgctxt", delflag, "", self.msgctxt)
+            ret += self._str_field("msgctxt", delflag, "", self.msgctxt, wrapwidth)
         # write the msgid
-        ret += self._str_field("msgid", delflag, "", self.msgid)
+        ret += self._str_field("msgid", delflag, "", self.msgid, wrapwidth)
         # write the msgid_plural if any
         if self.msgid_plural:
-            ret += self._str_field("msgid_plural", delflag, "", self.msgid_plural)
+            ret += self._str_field("msgid_plural", delflag, "", self.msgid_plural, wrapwidth)
         if self.msgstr_plural:
             # write the msgstr_plural if any
             msgstrs = self.msgstr_plural
@@ -912,23 +758,51 @@
             for index in keys:
                 msgstr = msgstrs[index]
                 plural_index = '[%s]' % index
-                ret += self._str_field("msgstr", delflag, plural_index, msgstr)
+                ret += self._str_field("msgstr", delflag, plural_index, msgstr, wrapwidth)
         else:
             # otherwise write the msgstr
-            ret += self._str_field("msgstr", delflag, "", self.msgstr)
+            ret += self._str_field("msgstr", delflag, "", self.msgstr, wrapwidth)
         ret.append('')
-        return '\n'.join(ret)
+        ret = '\n'.join(ret)
+
+        if type(ret) != types.UnicodeType:
+            return unicode(ret, self.encoding)
+        return ret
+
+    def __str__(self):
+        """
+        Returns the string representation of the entry.
+        """
+        return unicode(self).encode(self.encoding)
+    
+    def __eq__(self, other):
+        return unicode(self) == unicode(other)
 
-    def _str_field(self, fieldname, delflag, plural_index, field):
-        if (fieldname + plural_index) in self._multiline_str:
-            field = self._multiline_str[fieldname + plural_index]
-            lines = [''] + field.split('__POLIB__NL__')
+    def _str_field(self, fieldname, delflag, plural_index, field, wrapwidth=78):
+        lines = field.splitlines(True)
+        if len(lines) > 1:
+            lines = [''] + lines # start with initial empty line
         else:
-            lines = field.splitlines(True)
-            if len(lines) > 1:
-                lines = ['']+lines # start with initial empty line
+            escaped_field = escape(field)
+            specialchars_count = 0
+            for c in ['\\', '\n', '\r', '\t', '"']:
+                specialchars_count += field.count(c)
+            # comparison must take into account fieldname length + one space 
+            # + 2 quotes (eg. msgid "<string>")
+            flength = len(fieldname) + 3
+            if plural_index:
+                flength += len(plural_index)
+            real_wrapwidth = wrapwidth - flength + specialchars_count
+            if wrapwidth > 0 and len(field) > real_wrapwidth:
+                # Wrap the line but take field name into account
+                lines = [''] + [unescape(item) for item in wrap(
+                    escaped_field,
+                    wrapwidth - 2, # 2 for quotes ""
+                    drop_whitespace=False,
+                    break_long_words=False
+                )]
             else:
-                lines = [field] # needed for the empty string case
+                lines = [field]
         if fieldname.startswith('previous_'):
             # quick and dirty trick to get the real field name
             fieldname = fieldname[9:]
@@ -945,50 +819,33 @@
 class POEntry(_BaseEntry):
     """
     Represents a po file entry.
-
-    **Examples**:
-
-    >>> entry = POEntry(msgid='Welcome', msgstr='Bienvenue')
-    >>> entry.occurrences = [('welcome.py', 12), ('anotherfile.py', 34)]
-    >>> print(entry)
-    #: welcome.py:12 anotherfile.py:34
-    msgid "Welcome"
-    msgstr "Bienvenue"
-    <BLANKLINE>
-    >>> entry = POEntry()
-    >>> entry.occurrences = [('src/some-very-long-filename-that-should-not-be-wrapped-even-if-it-is-larger-than-the-wrap-limit.c', 32), ('src/eggs.c', 45)]
-    >>> entry.comment = 'A plural translation. This is a very very very long line please do not wrap, this is just for testing comment wrapping...'
-    >>> entry.tcomment = 'A plural translation. This is a very very very long line please do not wrap, this is just for testing comment wrapping...'
-    >>> entry.flags.append('c-format')
-    >>> entry.previous_msgctxt = '@somecontext'
-    >>> entry.previous_msgid = 'I had eggs but no spam !'
-    >>> entry.previous_msgid_plural = 'I had eggs and %d spam !'
-    >>> entry.msgctxt = '@somenewcontext'
-    >>> entry.msgid = 'I have spam but no egg !'
-    >>> entry.msgid_plural = 'I have spam and %d eggs !'
-    >>> entry.msgstr_plural[0] = "J'ai du jambon mais aucun oeuf !"
-    >>> entry.msgstr_plural[1] = "J'ai du jambon et %d oeufs !"
-    >>> print(entry)
-    #. A plural translation. This is a very very very long line please do not
-    #. wrap, this is just for testing comment wrapping...
-    # A plural translation. This is a very very very long line please do not wrap,
-    # this is just for testing comment wrapping...
-    #: src/some-very-long-filename-that-should-not-be-wrapped-even-if-it-is-larger-than-the-wrap-limit.c:32
-    #: src/eggs.c:45
-    #, c-format
-    #| msgctxt "@somecontext"
-    #| msgid "I had eggs but no spam !"
-    #| msgid_plural "I had eggs and %d spam !"
-    msgctxt "@somenewcontext"
-    msgid "I have spam but no egg !"
-    msgid_plural "I have spam and %d eggs !"
-    msgstr[0] "J'ai du jambon mais aucun oeuf !"
-    msgstr[1] "J'ai du jambon et %d oeufs !"
-    <BLANKLINE>
     """
 
     def __init__(self, *args, **kwargs):
-        """POEntry constructor."""
+        """
+        Constructor, accepts the following keyword arguments:
+
+        ``comment``
+            string, the entry comment.
+
+        ``tcomment``
+            string, the entry translator comment.
+
+        ``occurrences``
+            list, the entry occurrences.
+
+        ``flags``
+            list, the entry flags.
+
+        ``previous_msgctxt``
+            string, the entry previous context.
+
+        ``previous_msgid``
+            string, the entry previous msgid.
+
+        ``previous_msgid_plural``
+            string, the entry previous msgid_plural.
+        """
         _BaseEntry.__init__(self, *args, **kwargs)
         self.comment = kwargs.get('comment', '')
         self.tcomment = kwargs.get('tcomment', '')
@@ -998,33 +855,31 @@
         self.previous_msgid = kwargs.get('previous_msgid', None)
         self.previous_msgid_plural = kwargs.get('previous_msgid_plural', None)
 
-    def __str__(self, wrapwidth=78):
+    def __unicode__(self, wrapwidth=78):
         """
-        Return the string representation of the entry.
+        Returns the unicode representation of the entry.
         """
         if self.obsolete:
-            return _BaseEntry.__str__(self)
+            return _BaseEntry.__unicode__(self, wrapwidth)
+
         ret = []
-        # comment first, if any (with text wrapping as xgettext does)
-        if self.comment != '':
-            for comment in self.comment.split('\n'):
-                if wrapwidth > 0 and len(comment) > wrapwidth-3:
-                    ret += textwrap.wrap(comment, wrapwidth,
-                                         initial_indent='#. ',
-                                         subsequent_indent='#. ',
-                                         break_long_words=False)
-                else:
-                    ret.append('#. %s' % comment)
-        # translator comment, if any (with text wrapping as xgettext does)
-        if self.tcomment != '':
-            for tcomment in self.tcomment.split('\n'):
-                if wrapwidth > 0 and len(tcomment) > wrapwidth-2:
-                    ret += textwrap.wrap(tcomment, wrapwidth,
-                                         initial_indent='# ',
-                                         subsequent_indent='# ',
-                                         break_long_words=False)
-                else:
-                    ret.append('# %s' % tcomment)
+        # comments first, if any (with text wrapping as xgettext does)
+        comments = [('comment', '#. '), ('tcomment', '# ')]
+        for c in comments:
+            val = getattr(self, c[0])
+            if val:
+                for comment in val.split('\n'):
+                    if wrapwidth > 0 and len(comment) + len(c[1]) > wrapwidth:
+                        ret += wrap(
+                            comment,
+                            wrapwidth,
+                            initial_indent=c[1],
+                            subsequent_indent=c[1],
+                            break_long_words=False
+                        )
+                    else:
+                        ret.append('%s%s' % (c[1], comment))
+
         # occurrences (with text wrapping as xgettext does)
         if self.occurrences:
             filelist = []
@@ -1034,79 +889,43 @@
                 else:
                     filelist.append(fpath)
             filestr = ' '.join(filelist)
-            if wrapwidth > 0 and len(filestr)+3 > wrapwidth:
-                # XXX textwrap split words that contain hyphen, this is not 
+            if wrapwidth > 0 and len(filestr) + 3 > wrapwidth:
+                # textwrap split words that contain hyphen, this is not 
                 # what we want for filenames, so the dirty hack is to 
                 # temporally replace hyphens with a char that a file cannot 
                 # contain, like "*"
-                lines = textwrap.wrap(filestr.replace('-', '*'),
-                                      wrapwidth,
-                                      initial_indent='#: ',
-                                      subsequent_indent='#: ',
-                                      break_long_words=False)
-                # end of the replace hack
-                for line in lines:
-                    ret.append(line.replace('*', '-'))
+                ret += [l.replace('*', '-') for l in wrap(
+                    filestr.replace('-', '*'),
+                    wrapwidth,
+                    initial_indent='#: ',
+                    subsequent_indent='#: ',
+                    break_long_words=False
+                )]
             else:
-                ret.append('#: '+filestr)
-        # flags
+                ret.append('#: ' + filestr)
+
+        # flags (TODO: wrapping ?)
         if self.flags:
-            flags = []
-            for flag in self.flags:
-                flags.append(flag)
-            ret.append('#, %s' % ', '.join(flags))
+            ret.append('#, %s' % ', '.join(self.flags))
 
         # previous context and previous msgid/msgid_plural
-        if self.previous_msgctxt:
-            ret += self._str_field("previous_msgctxt", "#| ", "",
-                                   self.previous_msgctxt)
-        if self.previous_msgid:
-            ret += self._str_field("previous_msgid", "#| ", "", 
-                                   self.previous_msgid)
-        if self.previous_msgid_plural:
-            ret += self._str_field("previous_msgid_plural", "#| ", "", 
-                                   self.previous_msgid_plural)
+        fields = ['previous_msgctxt', 'previous_msgid', 'previous_msgid_plural']
+        for f in fields:
+            val = getattr(self, f)
+            if val:
+                ret += self._str_field(f, "#| ", "", val, wrapwidth)
 
-        ret.append(_BaseEntry.__str__(self))
-        return '\n'.join(ret)
+        ret.append(_BaseEntry.__unicode__(self, wrapwidth))
+        ret = '\n'.join(ret)
+
+        if type(ret) != types.UnicodeType:
+            return unicode(ret, self.encoding)
+        return ret
 
     def __cmp__(self, other):
-        '''
+        """
         Called by comparison operations if rich comparison is not defined.
-
-        **Tests**:
-        >>> a  = POEntry(msgid='a', occurrences=[('b.py', 1), ('b.py', 3)])
-        >>> b  = POEntry(msgid='b', occurrences=[('b.py', 1), ('b.py', 3)])
-        >>> c1 = POEntry(msgid='c1', occurrences=[('a.py', 1), ('b.py', 1)])
-        >>> c2 = POEntry(msgid='c2', occurrences=[('a.py', 1), ('a.py', 3)])
-        >>> po = POFile()
-        >>> po.append(a)
-        >>> po.append(b)
-        >>> po.append(c1)
-        >>> po.append(c2)
-        >>> po.sort()
-        >>> print(po)
-        # 
-        msgid ""
-        msgstr ""
-        <BLANKLINE>
-        #: a.py:1 a.py:3
-        msgid "c2"
-        msgstr ""
-        <BLANKLINE>
-        #: a.py:1 b.py:1
-        msgid "c1"
-        msgstr ""
-        <BLANKLINE>
-        #: b.py:1 b.py:3
-        msgid "a"
-        msgstr ""
-        <BLANKLINE>
-        #: b.py:1 b.py:3
-        msgid "b"
-        msgstr ""
-        <BLANKLINE>
-        '''
+        """
         def compare_occurrences(a, b):
             """
             Compare an entry occurrence with another one.
@@ -1153,7 +972,8 @@
 
     def translated(self):
         """
-        Return True if the entry has been translated or False.
+        Returns ``True`` if the entry has been translated or ``False``
+        otherwise.
         """
         if self.obsolete or 'fuzzy' in self.flags:
             return False
@@ -1170,11 +990,19 @@
         """
         Merge the current entry with the given pot entry.
         """
-        self.msgid        = other.msgid
-        self.occurrences  = other.occurrences
-        self.comment      = other.comment
-        self.flags        = other.flags
+        self.msgid = other.msgid
+        self.msgctxt = other.msgctxt
+        self.occurrences = other.occurrences
+        self.comment = other.comment
+        fuzzy = 'fuzzy' in self.flags
+        self.flags = other.flags[:]  # clone flags
+        if fuzzy:
+            self.flags.append('fuzzy')
         self.msgid_plural = other.msgid_plural
+        self.obsolete = other.obsolete
+        self.previous_msgctxt = other.previous_msgctxt
+        self.previous_msgid = other.previous_msgid
+        self.previous_msgid_plural = other.previous_msgid_plural
         if other.msgstr_plural:
             for pos in other.msgstr_plural:
                 try:
@@ -1189,23 +1017,8 @@
 class MOEntry(_BaseEntry):
     """
     Represents a mo file entry.
-
-    **Examples**:
-
-    >>> entry = MOEntry()
-    >>> entry.msgid  = 'translate me !'
-    >>> entry.msgstr = 'traduisez moi !'
-    >>> print(entry)
-    msgid "translate me !"
-    msgstr "traduisez moi !"
-    <BLANKLINE>
     """
-
-    def __str__(self, wrapwidth=78):
-        """
-        Return the string representation of the entry.
-        """
-        return _BaseEntry.__str__(self, wrapwidth)
+    pass
 
 # }}}
 # class _POFileParser {{{
@@ -1216,28 +1029,37 @@
     file format.
     """
 
-    def __init__(self, fpath, *args, **kwargs):
+    def __init__(self, pofile, *args, **kwargs):
         """
         Constructor.
 
-        **Arguments**:
-          - *fpath*: string, path to the po file
-          - *encoding*: string, the encoding to use, defaults to
-            "default_encoding" global variable (optional),
-          - *check_for_duplicates*: whether to check for duplicate entries
-            when adding entries to the file, default: False (optional).
+        Keyword arguments:
+
+        ``pofile``
+            string, path to the po file or its content
+
+        ``encoding``
+            string, the encoding to use, defaults to ``default_encoding``
+            global variable (optional).
+
+        ``check_for_duplicates``
+            whether to check for duplicate entries when adding entries to the
+            file (optional, default: ``False``).
         """
         enc = kwargs.get('encoding', default_encoding)
-        check_dup = kwargs.get('check_for_duplicates', False)
-        try:
-            self.fhandle = codecs.open(fpath, 'rU', enc)
-        except LookupError:
-            enc = default_encoding
-            self.fhandle = codecs.open(fpath, 'rU', enc)
+        if os.path.exists(pofile):
+            try:
+                self.fhandle = codecs.open(pofile, 'rU', enc)
+            except LookupError:
+                enc = default_encoding
+                self.fhandle = codecs.open(pofile, 'rU', enc)
+        else:
+            self.fhandle = pofile.splitlines()
+
         self.instance = POFile(
-            fpath=fpath,
+            pofile=pofile,
             encoding=enc,
-            check_for_duplicates=check_dup
+            check_for_duplicates=kwargs.get('check_for_duplicates', False)
         )
         self.transitions = {}
         self.current_entry = POEntry()
@@ -1289,59 +1111,103 @@
         Run the state machine, parse the file line by line and call process()
         with the current matched symbol.
         """
-        i, lastlen = 1, 0
+        i = 0
+
+        keywords = {
+            'msgctxt': 'CT',
+            'msgid': 'MI',
+            'msgstr': 'MS',
+            'msgid_plural': 'MP',
+        }
+        prev_keywords = {
+            'msgid_plural': 'PP',
+            'msgid': 'PM',
+            'msgctxt': 'PC',
+        }
+
         for line in self.fhandle:
+            i += 1
             line = line.strip()
             if line == '':
-                i = i+1
                 continue
-            if line[:3] == '#~ ':
-                line = line[3:]
+
+            tokens = line.split(None, 2)
+            nb_tokens = len(tokens)
+
+            if tokens[0] == '#~' and nb_tokens > 1:
+                line = line[3:].strip()
+                tokens = tokens[1:]
+                nb_tokens -= 1
                 self.entry_obsolete = 1
             else:
                 self.entry_obsolete = 0
+
+            # Take care of keywords like
+            # msgid, msgid_plural, msgctxt & msgstr.
+            if tokens[0] in keywords and nb_tokens > 1:
+                line = line[len(tokens[0]):].lstrip()
+                self.current_token = line
+                self.process(keywords[tokens[0]], i)
+                continue
+
             self.current_token = line
-            if line[:2] == '#:':
+
+            if tokens[0] == '#:' and nb_tokens > 1:
                 # we are on a occurrences line
                 self.process('OC', i)
-            elif line[:9] == 'msgctxt "':
-                # we are on a msgctxt
-                self.process('CT', i)
-            elif line[:7] == 'msgid "':
-                # we are on a msgid
-                self.process('MI', i)
-            elif line[:8] == 'msgstr "':
-                # we are on a msgstr
-                self.process('MS', i)
-            elif line[:1] == '"' or line[:4] == '#| "':
-                # we are on a continuation line or some metadata
+
+            elif line[:1] == '"':
+                # we are on a continuation line
                 self.process('MC', i)
-            elif line[:14] == 'msgid_plural "':
-                # we are on a msgid plural
-                self.process('MP', i)
+
             elif line[:7] == 'msgstr[':
                 # we are on a msgstr plural
                 self.process('MX', i)
-            elif line[:3] == '#, ':
+
+            elif tokens[0] == '#,' and nb_tokens > 1:
                 # we are on a flags line
                 self.process('FL', i)
-            elif line[:2] == '# ' or line == '#':
-                if line == '#': line = line + ' '
+
+            elif tokens[0] == '#':
+                if line == '#': line += ' '
                 # we are on a translator comment line
                 self.process('TC', i)
-            elif line[:2] == '#.':
+
+            elif tokens[0] == '#.' and nb_tokens > 1:
                 # we are on a generated comment line
                 self.process('GC', i)
-            elif line[:15] == '#| msgid_plural':
-                # we are on a previous msgid_plural
-                self.process('PP', i)
-            elif line[:8] == '#| msgid':
-                self.process('PM', i)
-                # we are on a previous msgid
-            elif line[:10] == '#| msgctxt':
-                # we are on a previous msgctxt
-                self.process('PC', i)
-            i = i+1
+
+            elif tokens[0] == '#|':
+                if nb_tokens < 2:
+                    self.process('??', i)
+                    continue
+
+                # Remove the marker and any whitespace right after that.
+                line = line[2:].lstrip()
+                self.current_token = line
+
+                if tokens[1].startswith('"'):
+                    # Continuation of previous metadata.
+                    self.process('MC', i)
+                    continue
+
+                if nb_tokens == 2:
+                    # Invalid continuation line.
+                    self.process('??', i)
+
+                # we are on a "previous translation" comment line,
+                if tokens[1] not in prev_keywords:
+                    # Unknown keyword in previous translation comment.
+                    self.process('??', i)
+
+                # Remove the keyword and any whitespace
+                # between it and the starting quote.
+                line = line[len(tokens[1]):].lstrip()
+                self.current_token = line
+                self.process(prev_keywords[tokens[1]], i)
+
+            else:
+                self.process('??', i)
 
         if self.current_entry:
             # since entries are added when another entry is found, we must add
@@ -1363,17 +1229,24 @@
                     if key is not None:
                         self.instance.metadata[key] += '\n'+ msg.strip()
         # close opened file
-        self.fhandle.close()
+        if isinstance(self.fhandle, file):
+            self.fhandle.close()
         return self.instance
 
     def add(self, symbol, states, next_state):
         """
         Add a transition to the state machine.
+
         Keywords arguments:
 
-        symbol     -- string, the matched token (two chars symbol)
-        states     -- list, a list of states (two chars symbols)
-        next_state -- the next state the fsm will have after the action
+        ``symbol``
+            string, the matched token (two chars symbol).
+
+        ``states``
+            list, a list of states (two chars symbols).
+
+        ``next_state``
+            the next state the fsm will have after the action.
         """
         for state in states:
             action = getattr(self, 'handle_%s' % next_state.lower())
@@ -1385,8 +1258,12 @@
         symbol provided.
 
         Keywords arguments:
-        symbol  -- string, the matched token (two chars symbol)
-        linenum -- integer, the current line number of the parsed file
+
+        ``symbol``
+            string, the matched token (two chars symbol).
+
+        ``linenum``
+            integer, the current line number of the parsed file.
         """
         try:
             (action, state) = self.transitions[(symbol, self.current_state)]
@@ -1456,7 +1333,7 @@
             self.instance.append(self.current_entry)
             self.current_entry = POEntry()
         self.current_entry.previous_msgid_plural = \
-            unescape(self.current_token[17:-1])
+            unescape(self.current_token[1:-1])
         return True
 
     def handle_pm(self):
@@ -1465,7 +1342,7 @@
             self.instance.append(self.current_entry)
             self.current_entry = POEntry()
         self.current_entry.previous_msgid = \
-            unescape(self.current_token[10:-1])
+            unescape(self.current_token[1:-1])
         return True
 
     def handle_pc(self):
@@ -1474,7 +1351,7 @@
             self.instance.append(self.current_entry)
             self.current_entry = POEntry()
         self.current_entry.previous_msgctxt = \
-            unescape(self.current_token[12:-1])
+            unescape(self.current_token[1:-1])
         return True
 
     def handle_ct(self):
@@ -1482,7 +1359,7 @@
         if self.current_state in ['MC', 'MS', 'MX']:
             self.instance.append(self.current_entry)
             self.current_entry = POEntry()
-        self.current_entry.msgctxt = unescape(self.current_token[9:-1])
+        self.current_entry.msgctxt = unescape(self.current_token[1:-1])
         return True
 
     def handle_mi(self):
@@ -1491,17 +1368,17 @@
             self.instance.append(self.current_entry)
             self.current_entry = POEntry()
         self.current_entry.obsolete = self.entry_obsolete
-        self.current_entry.msgid = unescape(self.current_token[7:-1])
+        self.current_entry.msgid = unescape(self.current_token[1:-1])
         return True
 
     def handle_mp(self):
         """Handle a msgid plural."""
-        self.current_entry.msgid_plural = unescape(self.current_token[14:-1])
+        self.current_entry.msgid_plural = unescape(self.current_token[1:-1])
         return True
 
     def handle_ms(self):
         """Handle a msgstr."""
-        self.current_entry.msgstr = unescape(self.current_token[8:-1])
+        self.current_entry.msgstr = unescape(self.current_token[1:-1])
         return True
 
     def handle_mx(self):
@@ -1541,10 +1418,6 @@
             typ = 'previous_msgctxt'
             token = token[3:]
             self.current_entry.previous_msgctxt += token
-        if typ not in self.current_entry._multiline_str:
-            self.current_entry._multiline_str[typ] = token
-        else:
-            self.current_entry._multiline_str[typ] += "__POLIB__NL__" + token
         # don't change the current state
         return False
 
@@ -1555,43 +1428,41 @@
     """
     A class to parse binary mo files.
     """
-    BIG_ENDIAN    = 0xde120495
-    LITTLE_ENDIAN = 0x950412de
 
-    def __init__(self, fpath, *args, **kwargs):
+    def __init__(self, mofile, *args, **kwargs):
         """
         Constructor.
 
-        **Arguments**:
-          - *fpath*: string, path to the po file
-          - *encoding*: string, the encoding to use, defaults to
-            "default_encoding" global variable (optional),
-          - *check_for_duplicates*: whether to check for duplicate entries
-            when adding entries to the file, default: False (optional).
+        Keyword arguments:
+
+        ``mofile``
+            string, path to the mo file or its content
+
+        ``encoding``
+            string, the encoding to use, defaults to ``default_encoding``
+            global variable (optional).
+
+        ``check_for_duplicates``
+            whether to check for duplicate entries when adding entries to the
+            file (optional, default: ``False``).
         """
-        enc = kwargs.get('encoding', default_encoding)
-        check_dup = kwargs.get('check_for_duplicates', False)
-        self.fhandle = open(fpath, 'rb')
+        self.fhandle = open(mofile, 'rb')
         self.instance = MOFile(
-            fpath=fpath,
-            encoding=enc,
-            check_for_duplicates=check_dup
+            fpath=mofile,
+            encoding=kwargs.get('encoding', default_encoding),
+            check_for_duplicates=kwargs.get('check_for_duplicates', False)
         )
 
-    def parse_magicnumber(self):
-        """
-        Parse the magic number and raise an exception if not valid.
-        """
-
     def parse(self):
         """
         Build the instance with the file handle provided in the
         constructor.
         """
+        # parse magic number
         magic_number = self._readbinary('<I', 4)
-        if magic_number == self.LITTLE_ENDIAN:
+        if magic_number == MOFile.LITTLE_ENDIAN:
             ii = '<II'
-        elif magic_number == self.BIG_ENDIAN:
+        elif magic_number == MOFile.BIG_ENDIAN:
             ii = '>II'
         else:
             raise IOError('Invalid mo file, magic number is incorrect !')
@@ -1630,18 +1501,35 @@
             # test if we have a plural entry
             msgid_tokens = msgid.split('\0')
             if len(msgid_tokens) > 1:
-                entry = MOEntry(
+                entry = self._build_entry(
                     msgid=msgid_tokens[0],
                     msgid_plural=msgid_tokens[1],
-                    msgstr_plural=dict((k,v) for k,v in \
-                        enumerate(msgstr.split('\0')))
+                    msgstr_plural=dict((k,v) for k,v in enumerate(msgstr.split('\0')))
                 )
             else:
-                entry = MOEntry(msgid=msgid, msgstr=msgstr)
+                entry = self._build_entry(msgid=msgid, msgstr=msgstr)
             self.instance.append(entry)
         # close opened file
         self.fhandle.close()
         return self.instance
+    
+    def _build_entry(self, msgid, msgstr=None, msgid_plural=None,
+                     msgstr_plural=None):
+        msgctxt_msgid = msgid.split('\x04')
+        if len(msgctxt_msgid) > 1:
+            kwargs = {
+                'msgctxt': msgctxt_msgid[0],
+                'msgid'  : msgctxt_msgid[1],
+            }
+        else:
+            kwargs = {'msgid': msgid}
+        if msgstr:
+            kwargs['msgstr'] = msgstr
+        if msgid_plural:
+            kwargs['msgid_plural'] = msgid_plural
+        if msgstr_plural:
+            kwargs['msgstr_plural'] = msgstr_plural
+        return MOEntry(**kwargs)
 
     def _readbinary(self, fmt, numbytes):
         """
@@ -1655,26 +1543,97 @@
         return tup
 
 # }}}
-# __main__ {{{
+# class TextWrapper {{{
 
-if __name__ == '__main__':
+class TextWrapper(textwrap.TextWrapper):
     """
-    **Main function**::
-      - to **test** the module just run: *python polib.py [-v]*
-      - to **profile** the module: *python polib.py -p <some_pofile.po>*
+    Subclass of textwrap.TextWrapper that backport the
+    drop_whitespace option.
     """
-    import sys
-    if len(sys.argv) > 2 and sys.argv[1] == '-p':
-        def test(f):
-            if f.endswith('po'):
-                p = pofile(f)
+    def __init__(self, *args, **kwargs):
+        drop_whitespace = kwargs.pop('drop_whitespace', True) 
+        textwrap.TextWrapper.__init__(self, *args, **kwargs)
+        self.drop_whitespace = drop_whitespace
+
+    def _wrap_chunks(self, chunks):
+        """_wrap_chunks(chunks : [string]) -> [string]
+
+        Wrap a sequence of text chunks and return a list of lines of
+        length 'self.width' or less.  (If 'break_long_words' is false,
+        some lines may be longer than this.)  Chunks correspond roughly
+        to words and the whitespace between them: each chunk is
+        indivisible (modulo 'break_long_words'), but a line break can
+        come between any two chunks.  Chunks should not have internal
+        whitespace; ie. a chunk is either all whitespace or a "word".
+        Whitespace chunks will be removed from the beginning and end of
+        lines, but apart from that whitespace is preserved.
+        """
+        lines = []
+        if self.width <= 0:
+            raise ValueError("invalid width %r (must be > 0)" % self.width)
+
+        # Arrange in reverse order so items can be efficiently popped
+        # from a stack of chucks.
+        chunks.reverse()
+
+        while chunks:
+
+            # Start the list of chunks that will make up the current line.
+            # cur_len is just the length of all the chunks in cur_line.
+            cur_line = []
+            cur_len = 0
+
+            # Figure out which static string will prefix this line.
+            if lines:
+                indent = self.subsequent_indent
             else:
-                p = mofile(f)
-            s = unicode(p)
-        import profile
-        profile.run('test("'+sys.argv[2]+'")')
-    else:
-        import doctest
-        doctest.testmod()
+                indent = self.initial_indent
+
+            # Maximum width for this line.
+            width = self.width - len(indent)
+
+            # First chunk on line is whitespace -- drop it, unless this
+            # is the very beginning of the text (ie. no lines started yet).
+            if self.drop_whitespace and chunks[-1].strip() == '' and lines:
+                del chunks[-1]
+
+            while chunks:
+                l = len(chunks[-1])
+
+                # Can at least squeeze this chunk onto the current line.
+                if cur_len + l <= width:
+                    cur_line.append(chunks.pop())
+                    cur_len += l
+
+                # Nope, this line is full.
+                else:
+                    break
+
+            # The current line is full, and the next chunk is too big to
+            # fit on *any* line (not just this one).
+            if chunks and len(chunks[-1]) > width:
+                self._handle_long_word(chunks, cur_line, cur_len, width)
+
+            # If the last chunk on this line is all whitespace, drop it.
+            if self.drop_whitespace and cur_line and cur_line[-1].strip() == '':
+                del cur_line[-1]
+
+            # Convert current line back to a string and store it in list
+            # of all lines (return value).
+            if cur_line:
+                lines.append(indent + ''.join(cur_line))
+
+        return lines
 
 # }}}
+# function wrap() {{{
+
+def wrap(text, width=70, **kwargs):
+    """
+    Wrap a single paragraph of text, returning a list of wrapped lines.
+    """
+    if sys.version_info < (2, 6):
+        return TextWrapper(width=width, **kwargs).wrap(text)
+    return textwrap.wrap(text, width=width, **kwargs)
+
+#}}}
--- a/i18n/pt_BR.po	Wed Oct 26 22:35:15 2011 +0200
+++ b/i18n/pt_BR.po	Tue Nov 01 16:49:30 2011 -0500
@@ -31,18 +31,19 @@
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2011-06-20 16:55-0300\n"
+"POT-Creation-Date: 2011-10-18 09:38-0200\n"
 "PO-Revision-Date: 2011-06-28 09:55+0200\n"
 "Last-Translator: Wagner Bruna <wbruna@yahoo.com>\n"
 "Language-Team: Brazilian Portuguese\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Generated-By: pygettext.py 1.5\n"
+"Language: \n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11.4\n"
+"X-Poedit-Country: BRAZIL\n"
 "X-Poedit-Language: Portuguese\n"
-"Generated-By: pygettext.py 1.5\n"
-"X-Poedit-Country: BRAZIL\n"
-"X-Generator: KBabel 1.11.4\n"
 
 #, python-format
 msgid " (default: %s)"
@@ -57,8 +58,13 @@
 msgid "Extensions"
 msgstr "Extensões"
 
-msgid "This section contains help for extensions that are distributed together with Mercurial. Help for other extensions is available in the help system."
-msgstr "Esta seção contém texto de ajuda para extensões que são distribuídas junto com o Mercurial. A ajuda para outras extensões está disponível no sistema de ajuda."
+msgid ""
+"This section contains help for extensions that are distributed together with"
+" Mercurial. Help for other extensions is available in the help system."
+msgstr ""
+"Esta seção contém texto de ajuda para extensões que são distribuídas junto "
+"com o Mercurial. A ajuda para outras extensões está disponível no sistema de"
+" ajuda."
 
 msgid "Options:"
 msgstr "Opções:"
@@ -381,8 +387,11 @@
 msgstr "O grupo '%s' não está definido"
 
 #, python-format
-msgid "config error - hook type \"%s\" cannot stop incoming changesets nor commits"
-msgstr "erro de configuração - tipo de gancho \"%s\" não pode interromper consolidações nem revisões de entrada"
+msgid ""
+"config error - hook type \"%s\" cannot stop incoming changesets nor commits"
+msgstr ""
+"erro de configuração - tipo de gancho \"%s\" não pode interromper "
+"consolidações nem revisões de entrada"
 
 #, python-format
 msgid "acl: user \"%s\" denied on branch \"%s\" (changeset \"%s\")"
@@ -393,8 +402,12 @@
 msgstr "acl: usuário \"%s\" não tem acesso ao ramo \"%s\" (revisão \"%s\")"
 
 #, python-format
-msgid "acl: access denied for changeset %s"
-msgstr "acl: acesso negado para a revisão %s"
+msgid "acl: user \"%s\" denied on \"%s\" (changeset \"%s\")"
+msgstr "acl: o acesso do usuário \"%s\" a \"%s\" foi negado (revisão \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on \"%s\" (changeset \"%s\")"
+msgstr "acl: o acesso do usuário \"%s\" a \"%s\" não foi permitido (revisão \"%s\")"
 
 msgid "hooks for integrating with the Bugzilla bug tracker"
 msgstr "ganchos para integração com o bug tracker Bugzilla"
@@ -415,7 +428,8 @@
 msgid "Three basic modes of access to Bugzilla are provided:"
 msgstr "Três modos básicos de acesso ao Bugzilla são fornecidos:"
 
-msgid "1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later."
+msgid ""
+"1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later."
 msgstr ""
 "1. Acesso através da interface XMLRPC do Bugzilla. Exige a versão\n"
 "3.4 ou posterior do Bugzilla."
@@ -591,7 +605,8 @@
 "  em modelos como ``{hgweb}``."
 
 msgid "Configuration items common to XMLRPC+email and MySQL access modes:"
-msgstr "Itens de configuração comuns aos modos de acesso XMLRPC+email e MySQL:"
+msgstr ""
+"Itens de configuração comuns aos modos de acesso XMLRPC+email e MySQL:"
 
 msgid ""
 "bugzilla.usermap\n"
@@ -1180,7 +1195,8 @@
 "conhecidos como códigos de escape ANSI)."
 
 msgid "Default effects may be overridden from your configuration file::"
-msgstr "Os efeitos padrão podem ser redefinidos pelo seu arquivo de configuração::"
+msgstr ""
+"Os efeitos padrão podem ser redefinidos pelo seu arquivo de configuração::"
 
 msgid ""
 "  [color]\n"
@@ -1260,6 +1276,13 @@
 "  branches.inactive = none"
 
 msgid ""
+"  tags.normal = green\n"
+"  tags.local = black bold"
+msgstr ""
+"  tags.normal = green\n"
+"  tags.local = black bold"
+
+msgid ""
 "The available effects in terminfo mode are 'blink', 'bold', 'dim',\n"
 "'inverse', 'invisible', 'italic', 'standout', and 'underline'; in\n"
 "ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and\n"
@@ -1349,7 +1372,8 @@
 "desabilitará a coloração.\n"
 
 msgid "no terminfo entry for setab/setaf: reverting to ECMA-48 color\n"
-msgstr "nenhuma entrada terminfo para setab/setaf: revertendo para cores ECMA-48\n"
+msgstr ""
+"nenhuma entrada terminfo para setab/setaf: revertendo para cores ECMA-48\n"
 
 #, python-format
 msgid "warning: failed to set color mode to %s\n"
@@ -1362,7 +1386,9 @@
 #. i18n: 'always', 'auto', and 'never' are keywords and should
 #. not be translated
 msgid "when to colorize (boolean, always, auto, or never)"
-msgstr "quando colorir (booleana, ou \"always\" (sempre), \"never\" (nunca) ou \"auto\" (automaticamente))"
+msgstr ""
+"quando colorir (booleana, ou \"always\" (sempre), \"never\" (nunca) ou "
+"\"auto\" (automaticamente))"
 
 msgid "TYPE"
 msgstr "TIPO"
@@ -1645,8 +1671,8 @@
 
 msgid ""
 "    :convert.hg.saverev: store original revision ID in changeset\n"
-"        (forces target IDs to change). It takes and boolean argument\n"
-"        and defaults to False."
+"        (forces target IDs to change). It takes a boolean argument and\n"
+"        defaults to False."
 msgstr ""
 "    :convert.hg.saverev: armazena o identificador da revisão de origem\n"
 "        (forçando a mudança de IDs de etiquetas). Esta opção recebe um\n"
@@ -2013,7 +2039,9 @@
 msgstr ":svnpath: String. Caminho do projeto Subversion convertido."
 
 msgid ":svnuuid: String. Converted subversion revision repository identifier."
-msgstr ":svnuuid: String. Identificador do repositório do Subversion da revisão convertida."
+msgstr ""
+":svnuuid: String. Identificador do repositório do Subversion da revisão "
+"convertida."
 
 #, python-format
 msgid "%s does not look like a Bazaar repository"
@@ -2022,8 +2050,12 @@
 msgid "Bazaar modules could not be loaded"
 msgstr "os módulos do Bazaar não puderam ser carregados"
 
-msgid "warning: lightweight checkouts may cause conversion failures, try with a regular branch instead.\n"
-msgstr "aviso: checkouts \"lightweight\" podem causar falhas de conversão, tente com um branch comum.\n"
+msgid ""
+"warning: lightweight checkouts may cause conversion failures, try with a "
+"regular branch instead.\n"
+msgstr ""
+"aviso: checkouts \"lightweight\" podem causar falhas de conversão, tente com"
+" um branch comum.\n"
 
 msgid "bzr source type could not be determined\n"
 msgstr "o tipo de origem bzr não pôde ser determinado\n"
@@ -2158,8 +2190,12 @@
 msgstr "autenticação pserver do CVS falhou"
 
 #, python-format
-msgid "unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
-msgstr "resposta inesperada do servidor CVS (\"Valid-requests\" esperada, %r recebida)"
+msgid ""
+"unexpected response from CVS server (expected \"Valid-requests\", but got "
+"%r)"
+msgstr ""
+"resposta inesperada do servidor CVS (\"Valid-requests\" esperada, %r "
+"recebida)"
 
 #, python-format
 msgid "%d bytes missing from remote file"
@@ -2211,7 +2247,9 @@
 msgstr "revisão deve ser seguida por uma linha de data"
 
 msgid "log cache overlaps with new log entries, re-run without cache."
-msgstr "o cache do log se sobrepõe a novas entradas do log, execute novamente sem o cache."
+msgstr ""
+"o cache do log se sobrepõe a novas entradas do log, execute novamente sem o "
+"cache."
 
 #, python-format
 msgid "writing cvs log cache %s\n"
@@ -2313,8 +2351,11 @@
 msgstr "analisando versão da árvore %s...\n"
 
 #, python-format
-msgid "tree analysis stopped because it points to an unregistered archive %s...\n"
-msgstr "análise da árvore parou porque esta aponta para um arquivo não registrado %s...\n"
+msgid ""
+"tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr ""
+"análise da árvore parou porque esta aponta para um arquivo não registrado "
+"%s...\n"
 
 #, python-format
 msgid "could not parse cat-log of %s"
@@ -2407,10 +2448,16 @@
 msgstr "coletando changelists do p4\n"
 
 msgid "Mercurial failed to run itself, check hg executable is in PATH"
-msgstr "Mercurial falhou ao executar a si próprio, veja se o executável hg está no PATH"
-
-msgid "svn: cannot probe remote repository, assume it could be a subversion repository. Use --source-type if you know better.\n"
-msgstr "svn: não é possível sondar o repositório remoto; a conversão irá assumir que é um repositório remoto do Subversion. Use --source-type se necessário.\n"
+msgstr ""
+"Mercurial falhou ao executar a si próprio, veja se o executável hg está no "
+"PATH"
+
+msgid ""
+"svn: cannot probe remote repository, assume it could be a subversion "
+"repository. Use --source-type if you know better.\n"
+msgstr ""
+"svn: não é possível sondar o repositório remoto; a conversão irá assumir que"
+" é um repositório remoto do Subversion. Use --source-type se necessário.\n"
 
 #, python-format
 msgid "%s does not look like a Subversion repository"
@@ -2421,10 +2468,14 @@
 
 #, python-format
 msgid "Subversion python bindings %d.%d found, 1.4 or later required"
-msgstr "Encontrados módulos Python para o Subversion %d.%d, requerida a versão 1.4 ou posterior"
+msgstr ""
+"Encontrados módulos Python para o Subversion %d.%d, requerida a versão 1.4 "
+"ou posterior"
 
 msgid "Subversion python bindings are too old, 1.4 or later required"
-msgstr "Módulos Python para o Subversion são antigos demais, requerida a versão 1.4 ou posterior"
+msgstr ""
+"Módulos Python para o Subversion são antigos demais, requerida a versão 1.4 "
+"ou posterior"
 
 #, python-format
 msgid "svn: revision %s is not an integer"
@@ -2617,13 +2668,15 @@
 "   todos os arquivos."
 
 msgid ""
-"The extension uses an optional ``[eol]`` section in your hgrc file\n"
-"(not the ``.hgeol`` file) for settings that control the overall\n"
-"behavior. There are two settings:"
-msgstr ""
-"A extensão também usa uma seção opcional ``[eol]`` em seu arquivo\n"
-"hgrc (diferente do arquivo ``.hgeol``) para configurações que controlam\n"
-"seu comportamento geral. Há duas configurações:"
+"The extension uses an optional ``[eol]`` section read from both the\n"
+"normal Mercurial configuration files and the ``.hgeol`` file, with the\n"
+"latter overriding the former. You can use that section to control the\n"
+"overall behavior. There are three settings:"
+msgstr ""
+"A extensão também usa uma seção opcional ``[eol]`` lida tanto a partir\n"
+"dos arquivos de configuração normais do Mercurial como do arquivo\n"
+"``.hgeol``, sendo que este último sobrepõe os anteriores. Você pode usar\n"
+"essa seção para controlar o comportamento global. Há três configurações:"
 
 msgid ""
 "- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or\n"
@@ -2651,6 +2704,15 @@
 "  quebras de linha seja intencional."
 
 msgid ""
+"- ``eol.fix-trailing-newline`` (default False) can be set to True to\n"
+"  ensure that converted files end with a EOL character (either ``\\n``\n"
+"  or ``\\r\\n`` as per the configured patterns)."
+msgstr ""
+"- ``eol.fix-trailing-newline`` (padrão False) pode ser definida para True\n"
+"  para garantir que arquivos convertidos terminem com um caractere de fim\n"
+"  de linha (``\\n`` ou ``\\r\\n``, de acordo com os padrões configurados)."
+
+msgid ""
 "The extension provides ``cleverencode:`` and ``cleverdecode:`` filters\n"
 "like the deprecated win32text extension does. This means that you can\n"
 "disable win32text and enable eol and your filters will still work. You\n"
@@ -2782,7 +2844,9 @@
 "  vimdiff = gvim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)'"
 
 msgid "Tool arguments can include variables that are expanded at runtime::"
-msgstr "Parâmetros de ferramentas podem incluir variáveis que são expandidas durante a execução::"
+msgstr ""
+"Parâmetros de ferramentas podem incluir variáveis que são expandidas durante"
+" a execução::"
 
 msgid ""
 "  $parent1, $plabel1 - filename, descriptive label of first parent\n"
@@ -2967,7 +3031,9 @@
 "    "
 
 msgid "working dir not at branch tip (use \"hg update\" to check out branch tip)"
-msgstr "o diretório de trabalho não está na tip do ramo (use \"hg update\" para obter a tip do ramo)"
+msgstr ""
+"o diretório de trabalho não está na tip do ramo (use \"hg update\" para "
+"obter a tip do ramo)"
 
 msgid "outstanding uncommitted merge"
 msgstr "mesclagem não consolidada pendente"
@@ -2985,12 +3051,20 @@
 msgid "pulling from %s\n"
 msgstr "trazendo revisões de %s\n"
 
-msgid "Other repository doesn't support revision lookup, so a rev cannot be specified."
-msgstr "O outro repositório não suporta busca por revisão, portanto uma revisão não pode ser especificada."
-
-#, python-format
-msgid "not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge\" to merge them)\n"
-msgstr "não mesclando com %d outros novas cabeças de ramo (use \"hg heads .\" e \"hg merge\" para mescla-los)\n"
+msgid ""
+"Other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+"O outro repositório não suporta busca por revisão, portanto uma revisão não "
+"pode ser especificada."
+
+#, python-format
+msgid ""
+"not merging with %d other new branch heads (use \"hg heads .\" and \"hg "
+"merge\" to merge them)\n"
+msgstr ""
+"não mesclando com %d outros novas cabeças de ramo (use \"hg heads .\" e \"hg"
+" merge\" para mescla-los)\n"
 
 #, python-format
 msgid "updating to %d:%s\n"
@@ -3051,7 +3125,9 @@
 msgstr "hg sigcheck REVISÃO"
 
 msgid "verify all the signatures there may be for a particular revision"
-msgstr "verifica todas as assinaturas que podem existir para uma revisão em particular"
+msgstr ""
+"verifica todas as assinaturas que podem existir para uma revisão em "
+"particular"
 
 #, python-format
 msgid "No valid signature for %s\n"
@@ -3110,8 +3186,12 @@
 msgid "error while signing"
 msgstr "erro ao assinar"
 
-msgid "working copy of .hgsigs is changed (please commit .hgsigs manually or use --force)"
-msgstr "a cópia de trabalho de .hgsigs foi mudada (por favor consolide .hgsigs manualmente ou use --force)"
+msgid ""
+"working copy of .hgsigs is changed (please commit .hgsigs manually or use "
+"--force)"
+msgstr ""
+"a cópia de trabalho de .hgsigs foi mudada (por favor consolide .hgsigs "
+"manualmente ou use --force)"
 
 msgid "unknown signature version"
 msgstr "versão de assinatura desconhecida"
@@ -3384,6 +3464,7 @@
 msgid "hg debug-merge-base REV REV"
 msgstr "hg debug-merge-base REV REV"
 
+#. i18n: bisect changeset status
 msgid "ignored"
 msgstr "ignorado"
 
@@ -3463,7 +3544,8 @@
 msgstr "hg inserve [OPÇÃO]..."
 
 msgid "inotify-client: found dead inotify server socket; removing it\n"
-msgstr "inotify-client: encontrado socket de um servidor inotify morto; removendo\n"
+msgstr ""
+"inotify-client: encontrado socket de um servidor inotify morto; removendo\n"
 
 #, python-format
 msgid "inotify-client: could not start inotify server: %s\n"
@@ -3471,7 +3553,8 @@
 
 #, python-format
 msgid "inotify-client: could not talk to new inotify server: %s\n"
-msgstr "inotify-client: não foi possível falar com o novo servidor inotify: %s\n"
+msgstr ""
+"inotify-client: não foi possível falar com o novo servidor inotify: %s\n"
 
 #, python-format
 msgid "inotify-client: failed to contact inotify server: %s\n"
@@ -3482,7 +3565,8 @@
 
 #, python-format
 msgid "(inotify: received response from incompatible server version %d)\n"
-msgstr "(inotify: recebida resposta de uma versão de servidor incompatível %d)\n"
+msgstr ""
+"(inotify: recebida resposta de uma versão de servidor incompatível %d)\n"
 
 #, python-format
 msgid "(inotify: received '%s' response when expecting '%s')\n"
@@ -3496,7 +3580,9 @@
 msgstr "*** o limite atual por usuário do número de inotify watches é %s\n"
 
 msgid "*** this limit is too low to watch every directory in this repository\n"
-msgstr "*** este limite é muito baixo para acompanhar cada diretório neste repositório\n"
+msgstr ""
+"*** este limite é muito baixo para acompanhar cada diretório neste "
+"repositório\n"
 
 msgid "*** counting directories: "
 msgstr "*** contando diretórios: "
@@ -3515,7 +3601,9 @@
 
 #, python-format
 msgid "cannot watch %s until inotify watch limit is raised"
-msgstr "impossível observar %s até que o limite de observação do inotify seja alcançado"
+msgstr ""
+"impossível observar %s até que o limite de observação do inotify seja "
+"alcançado"
 
 #, python-format
 msgid "inotify service not available: %s"
@@ -3574,8 +3662,12 @@
 msgid "cannot start: socket is already bound"
 msgstr "não é possível iniciar: o socket já está associado"
 
-msgid "cannot start: tried linking .hg/inotify.sock to a temporary socket but .hg/inotify.sock already exists"
-msgstr "não é possível iniciar: tentou lincar .hg/inotify.sock para um socket temporário mas .hg/inotify.sock já existe"
+msgid ""
+"cannot start: tried linking .hg/inotify.sock to a temporary socket but "
+".hg/inotify.sock already exists"
+msgstr ""
+"não é possível iniciar: tentou lincar .hg/inotify.sock para um socket "
+"temporário mas .hg/inotify.sock já existe"
 
 #, python-format
 msgid "answering query for %r\n"
@@ -3949,7 +4041,8 @@
 msgstr "reverte palavras chave expandidas no diretório de trabalho"
 
 msgid "    Must be run before changing/disabling active keywords."
-msgstr "    Deve ser executado após mudar / desabilitar palavras chave ativas."
+msgstr ""
+"    Deve ser executado após mudar / desabilitar palavras chave ativas."
 
 msgid ""
 "    kwshrink refuses to run if given files contain local changes.\n"
@@ -3959,6 +4052,487 @@
 "    mudanças locais.\n"
 "    "
 
+msgid "track large binary files"
+msgstr "rastreia arquivos binários grandes"
+
+msgid ""
+"Large binary files tend to be not very compressible, not very\n"
+"diffable, and not at all mergeable. Such files are not handled\n"
+"efficiently by Mercurial's storage format (revlog), which is based on\n"
+"compressed binary deltas; storing large binary files as regular\n"
+"Mercurial files wastes bandwidth and disk space and increases\n"
+"Mercurial's memory usage. The largefiles extension addresses these\n"
+"problems by adding a centralized client-server layer on top of\n"
+"Mercurial: largefiles live in a *central store* out on the network\n"
+"somewhere, and you only fetch the revisions that you need when you\n"
+"need them."
+msgstr ""
+"Arquivos binários grandes tendem a não ser muito comprimíveis,\n"
+"não gerar diffs úteis, e não serem mescláveis. Tais arquivos não\n"
+"são gerenciados de modo eficiente pelo formato de armazenamento do\n"
+"Mercurial (revlog), que se baseia em deltas binários comprimidos;\n"
+"armazenar arquivos binários grandes como arquivos comuns no\n"
+"Mercurial desperdiça banda e espaço em disco e aumenta o uso de\n"
+"memória do Mercurial. A extensão largefiles trata esses problemas\n"
+"adicionando uma camada cliente-servidor centralizada sobre o\n"
+"Mercurial: largefiles se localiza em um *armazenamento central*\n"
+"em algum lugar da rede, e você obtém apenas as revisões necessárias\n"
+"no momento em que são necessárias."
+
+msgid ""
+"largefiles works by maintaining a \"standin file\" in .hglf/ for each\n"
+"largefile. The standins are small (41 bytes: an SHA-1 hash plus\n"
+"newline) and are tracked by Mercurial. Largefile revisions are\n"
+"identified by the SHA-1 hash of their contents, which is written to\n"
+"the standin. largefiles uses that revision ID to get/put largefile\n"
+"revisions from/to the central store. This saves both disk space and\n"
+"bandwidth, since you don't need to retrieve all historical revisions\n"
+"of large files when you clone or pull."
+msgstr ""
+"largefiles funciona mantendo um arquivo \"standin\" em .hglf/ para cada\n"
+"largefile. Os arquivos standin são pequenos (41 bytes: um hash SHA-1 e\n"
+"uma quebra de linha) e são rastreados pelo Mercurial. As revisões\n"
+"largefile são identificadas pelo hash SHA-1 de seus conteúdos, que\n"
+"são registrados no standin. largefiles usa tal ID de revisão para \n"
+"obter ou enviar revisões largefile de ou para o armazenamento central.\n"
+"Isto economiza tanto espaço em disco como banda de rede, já que não é\n"
+"necessário obter todas as revisões históricas de arquivos grandes em\n"
+"um clone ou pull."
+
+msgid ""
+"To start a new repository or add new large binary files, just add\n"
+"--large to your :hg:`add` command. For example::"
+msgstr ""
+"Para iniciar um novo repositório ou adicionar novos arquivos\n"
+"binários grandes, adicione --large ao seu comando :hg:`add`.\n"
+"Por exemplo::"
+
+msgid ""
+"  $ dd if=/dev/urandom of=randomdata count=2000\n"
+"  $ hg add --large randomdata\n"
+"  $ hg commit -m 'add randomdata as a largefile'"
+msgstr ""
+"  $ dd if=/dev/urandom of=randomdata count=2000\n"
+"  $ hg add --large randomdata\n"
+"  $ hg commit -m 'add randomdata as a largefile'"
+
+msgid ""
+"When you push a changeset that adds/modifies largefiles to a remote\n"
+"repository, its largefile revisions will be uploaded along with it.\n"
+"Note that the remote Mercurial must also have the largefiles extension\n"
+"enabled for this to work."
+msgstr ""
+"Ao enviar uma revisão que adiciona/modifica arquivos grandes para um\n"
+"repositório remoto, sua revisão largefile correspondente será também\n"
+"enviada. Note que o Mercurial remoto também deve ter a extensão\n"
+"largefiles habilitada."
+
+msgid ""
+"When you pull a changeset that affects largefiles from a remote\n"
+"repository, Mercurial behaves as normal. However, when you update to\n"
+"such a revision, any largefiles needed by that revision are downloaded\n"
+"and cached (if they have never been downloaded before). This means\n"
+"that network access may be required to update to changesets you have\n"
+"not previously updated to."
+msgstr ""
+"Ao trazer revisões de um repositório remoto que afetam largefiles, o\n"
+"Mercurial se comporta normalmente. No entanto, au atualizar para tal\n"
+"revisão, quaisquer largefiles necessárias para tal revisão serão\n"
+"baixadas e guardadas em um cache (se elas nunca foram baixadas antes)\n"
+". Isto quer dizer que acesso à rede pode ser necessário para atualizar\n"
+"para revisões que ainda não estiveram no diretório de trabalho."
+
+msgid ""
+"If you already have large files tracked by Mercurial without the\n"
+"largefiles extension, you will need to convert your repository in\n"
+"order to benefit from largefiles. This is done with the\n"
+":hg:`lfconvert` command::"
+msgstr ""
+"Se você já tiver arquivos grandes rastreados pelo Mercurial sem a\n"
+"extensão largefiles, será preciso converter seu repositório para se\n"
+"beneficiar da extensão largefiles. Isto é feito usando o comando\n"
+":hg:`lfconvert` ::"
+
+msgid "  $ hg lfconvert --size 10 oldrepo newrepo"
+msgstr "  $ hg lfconvert --size 10 oldrepo newrepo"
+
+msgid ""
+"In repositories that already have largefiles in them, any new file\n"
+"over 10MB will automatically be added as a largefile. To change this\n"
+"threshold, set ``largefiles.minsize`` in your Mercurial config file\n"
+"to the minimum size in megabytes to track as a largefile, or use the\n"
+"--lfsize option to the add command (also in megabytes)::"
+msgstr ""
+"Em repositórios que já possuem algum largefile, qualquer novo arquivo\n"
+"acima de 10MB será automaticamente adicionado como largefile. Para\n"
+"mudar esse limiar, defina ``largefiles.minsize`` em seu arquivo de\n"
+"configuração do Mercurial para o tamanho mínimo em megabytes para\n"
+"rastrear o arquivo como largefile, ou use a opção --lfsize no comando\n"
+"add (também em megabytes)::"
+
+msgid ""
+"  [largefiles]\n"
+"  minsize = 2"
+msgstr ""
+"  [largefiles]\n"
+"  minsize = 2"
+
+msgid "  $ hg add --lfsize 2"
+msgstr "  $ hg add --lfsize 2"
+
+msgid ""
+"The ``largefiles.patterns`` config option allows you to specify a list\n"
+"of filename patterns (see :hg:`help patterns`) that should always be\n"
+"tracked as largefiles::"
+msgstr ""
+"A opção de configuração ``largefiles.patterns`` permite especificar\n"
+"uma lista de padrões de nomes de arquivo (veja :hg:`help patterns`)\n"
+"que devam ser sempre tratados como largefiles::"
+
+msgid ""
+"  [largefiles]\n"
+"  patterns =\n"
+"    *.jpg\n"
+"    re:.*\\.(png|bmp)$\n"
+"    library.zip\n"
+"    content/audio/*"
+msgstr ""
+"  [largefiles]\n"
+"  patterns =\n"
+"    *.jpg\n"
+"    re:.*\\.(png|bmp)$\n"
+"    library.zip\n"
+"    content/audio/*"
+
+msgid ""
+"Files that match one of these patterns will be added as largefiles\n"
+"regardless of their size.\n"
+msgstr ""
+"Arquivos que corresponderem a um desses padrões serão adicionados\n"
+"como largefiles sem que seus tamanhos sejam considerados.\n"
+
+msgid "convert a normal repository to a largefiles repository"
+msgstr "converte um repositório normal em um repositório largefiles"
+
+msgid ""
+"    Convert repository SOURCE to a new repository DEST, identical to\n"
+"    SOURCE except that certain files will be converted as largefiles:\n"
+"    specifically, any file that matches any PATTERN *or* whose size is\n"
+"    above the minimum size threshold is converted as a largefile. The\n"
+"    size used to determine whether or not to track a file as a\n"
+"    largefile is the size of the first version of the file. The\n"
+"    minimum size can be specified either with --size or in\n"
+"    configuration as ``largefiles.size``."
+msgstr ""
+"    Converte o repositório ORIGEM em um novo repositório DEST,\n"
+"    idêntico a ORIGEM exceto por certos arquivos que serão\n"
+"    convertidos como largefiles:\n"
+"    especificamente, qualquer arquivo que combinar com qualquer\n"
+"    PADRÃO *ou* cujo tamanho esteja acima do limiar de tamanho\n"
+"    mínimo será convertido como um largefile. O tamanho usado para\n"
+"    determinar se o arquivo será rastreado como largefile será o\n"
+"    tamanho da primeira versão do arquivo. O tamanho mínimo pode\n"
+"    ser especificado usando o parâmetro --size ou a opção de\n"
+"    configuração ``largefiles.size``."
+
+msgid ""
+"    After running this command you will need to make sure that\n"
+"    largefiles is enabled anywhere you intend to push the new\n"
+"    repository."
+msgstr ""
+"    Após a execução deste comando, você deve se certificar de\n"
+"    que largefiles esteja habilitado em todos os repositórios que\n"
+"    receberão revisões do novo repositório."
+
+msgid ""
+"    Use --to-normal to convert largefiles back to normal files; after\n"
+"    this, the DEST repository can be used without largefiles at all."
+msgstr ""
+"    Use --to-normal para converter largefiles de volta a arquivos\n"
+"    normais; após essa conversão, o repositório DEST poderá ser\n"
+"    usado normalmente, sem a extensão largefiles."
+
+msgid "getting largefiles"
+msgstr "obtendo largefiles"
+
+#, python-format
+msgid "getting %s:%s\n"
+msgstr "obtendo %s:%s\n"
+
+#, python-format
+msgid "%s: data corruption (expected %s, got %s)\n"
+msgstr "%s: corrupção de dados (esperado %s, obtido %s)\n"
+
+#, python-format
+msgid "searching %d changesets for largefiles\n"
+msgstr "procurando em %d revisões por largefiles\n"
+
+#, python-format
+msgid "verified contents of %d revisions of %d largefiles\n"
+msgstr "verificado o conteúdo de %d revisões de %d largefiles\n"
+
+#, python-format
+msgid "verified existence of %d revisions of %d largefiles\n"
+msgstr "verificada a existência de %d revisões de %d largefiles\n"
+
+#, python-format
+msgid "unsupported URL scheme %r"
+msgstr "esquema URL %r não suportado"
+
+#, python-format
+msgid "%s does not appear to be a largefile store"
+msgstr "'%s' não parece ser um repositório de largefiles"
+
+#, python-format
+msgid "%s is not a local Mercurial repo"
+msgstr "%s não é um repositório local do Mercurial"
+
+#, python-format
+msgid "initializing destination %s\n"
+msgstr "iniciando destino %s\n"
+
+msgid "converting revisions"
+msgstr "convertendo revisões"
+
+#, python-format
+msgid "renamed/copied largefile %s becomes symlink"
+msgstr "o largefile %s renomeado/copiado se tornou um link simbólico"
+
+#, python-format
+msgid "largefile %s becomes symlink"
+msgstr "o largefile %s se tornou um link simbólico"
+
+msgid "uploading largefiles"
+msgstr "enviando largefiles"
+
+#, python-format
+msgid "largefile %s missing from store (needs to be uploaded)"
+msgstr "o largefile %s está faltando no repositório (deve ser enviado)"
+
+msgid "getting changed largefiles\n"
+msgstr "obtendo largefiles modificados\n"
+
+#, python-format
+msgid "%d largefiles updated, %d removed\n"
+msgstr "%d largefiles atualizados, %d removidos\n"
+
+msgid "minimum size (MB) for files to be converted as largefiles"
+msgstr "tamanho mínimo (MB) para arquivos serem convertidos em largefiles"
+
+msgid "convert from a largefiles repo to a normal repo"
+msgstr "converte um repositório largefiles em um repositório normal"
+
+msgid "hg lfconvert SOURCE DEST [FILE ...]"
+msgstr "hg lfconvert ORIGEM DEST [ARQUIVO ...]"
+
+#, python-format
+msgid "largefiles: size must be number (not %s)\n"
+msgstr "largefiles: o tamanho deve ser um número (e não %s)\n"
+
+msgid "minimum size for largefiles must be specified"
+msgstr "o tamanho mínimo para largefiles deve ser especificado"
+
+#, python-format
+msgid "unknown operating system: %s\n"
+msgstr "sistema operacional desconhecido: %s\n"
+
+#, python-format
+msgid "Found %s in store\n"
+msgstr "Encontrado %s no armazenamento\n"
+
+#, python-format
+msgid "Found %s in system cache\n"
+msgstr "Encontrado %s no cache do sistema\n"
+
+#, python-format
+msgid "bad hash in '%s' (only %d bytes long)"
+msgstr "hash ruim em '%s' (o comprimento é de apenas %d bytes)"
+
+msgid "Can't get file locally"
+msgstr "Não é possível obter o arquivo localmente"
+
+#, python-format
+msgid ""
+"changeset %s: %s missing\n"
+"  (looked for hash %s)\n"
+msgstr ""
+"revisão %s: %s faltando\n"
+"  (procurou pelo hash %s)\n"
+
+#, python-format
+msgid ""
+"changeset %s: %s: contents differ\n"
+"  (%s:\n"
+"  expected hash %s,\n"
+"  but got %s)\n"
+msgstr ""
+"revisão %s: %s: o conteúdo é diferente\n"
+"  (%s:\n"
+"  esperado hash %s,\n"
+"  mas obteve %s)\n"
+
+#, python-format
+msgid "%s already a largefile\n"
+msgstr "%s já é um largefile\n"
+
+#, python-format
+msgid "adding %s as a largefile\n"
+msgstr "adicionando %s como largefile\n"
+
+msgid "no files specified"
+msgstr "nenhum arquivo especificado"
+
+#, python-format
+msgid "not removing %s: %s (use -f to force removal)\n"
+msgstr "%s não removido: %s (use -f para forçar a remoção)\n"
+
+msgid "file still exists"
+msgstr "o arquivo já existe"
+
+msgid "file is modified"
+msgstr "o arquivo foi modificado"
+
+msgid "file has been marked for add"
+msgstr "o arquivo foi marcado para adição"
+
+#, python-format
+msgid "removing %s\n"
+msgstr "removendo %s\n"
+
+msgid "uncommitted local changes"
+msgstr "alterações locais pendentes"
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr "mesclando %s e %s para %s\n"
+
+#, python-format
+msgid "merging %s\n"
+msgstr "mesclando %s\n"
+
+#, python-format
+msgid ""
+"largefile %s has a merge conflict\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+"largefile %s tem um conflito de mesclagem\n"
+"manter (l)ocal ou usar (o)utro?"
+
+msgid "&Local"
+msgstr "&Local"
+
+msgid "&Other"
+msgstr "&Outra"
+
+msgid "destination largefile already exists"
+msgstr "largefile de destino já existe"
+
+msgid "no files to copy"
+msgstr "nenhum arquivo para copiar"
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr "tipo de arquivo '%s' desconhecido"
+
+msgid "cannot give prefix when archiving to files"
+msgstr "não é possível fornecer prefixo ao arquivar para arquivos"
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr "%s não removido: arquivo já não é rastreado\n"
+
+msgid "largefiles: No remote repo\n"
+msgstr "largefiles: Nenhum repositório remoto\n"
+
+msgid "largefiles to upload:\n"
+msgstr "largefiles a serem enviados:\n"
+
+#, python-format
+msgid "largefiles: %d to upload\n"
+msgstr "largefiles: %d a serem enviados\n"
+
+msgid "addremove cannot be run on a repo with largefiles"
+msgstr "addremove não pode ser executado em um repositório com largefiles"
+
+msgid "error: could not put received data into largefile store"
+msgstr ""
+"erro: não foi possível colocar os dados recebidos no armazenamento de "
+"largefiles"
+
+#, python-format
+msgid "requested largefile %s not present in cache"
+msgstr "largefile %s pedido não está presente no cache"
+
+msgid "putlfile failed:"
+msgstr "putlfile falhou:"
+
+msgid "putlfile failed (unexpected response):"
+msgstr "putlfile falhou (resposta inesperada):"
+
+msgid "unexpected response:"
+msgstr "resposta inesperada:"
+
+#, python-format
+msgid "remotestore: could not put %s to remote store %s"
+msgstr "remotestore: não foi possível colocar %s no armazenamento remoto %s"
+
+#, python-format
+msgid "remotestore: put %s to remote store %s"
+msgstr "remotestore: %s foi colocado no armazenamento remoto %s"
+
+#, python-format
+msgid "remotestore: could not open file %s: %s"
+msgstr "remotestore: não foi possível abrir arquivo %s: %s"
+
+#, python-format
+msgid "remotestore: largefile %s is invalid"
+msgstr "remotestore: largefile %s é inválido"
+
+#, python-format
+msgid "remotestore: largefile %s is missing"
+msgstr "remotestore: largefile %s está faltando"
+
+#, python-format
+msgid "changeset %s: %s: contents differ\n"
+msgstr "revisão %s: %s: o conteúdo está diferente\n"
+
+#, python-format
+msgid "changeset %s: %s missing\n"
+msgstr "revisão %s: %s faltando\n"
+
+#, python-format
+msgid ""
+"largefiles: repo method %r appears to have already been wrapped by another "
+"extension: largefiles may behave incorrectly\n"
+msgstr ""
+"largefiles: o método %r do repositório parece já ter sido sobreposto\n"
+"por uma outra extensão: largefiles pode se comportar incorretamente\n"
+
+#, python-format
+msgid "file \"%s\" is a largefile standin"
+msgstr "o arquivo \"%s\" é um standin largefile"
+
+msgid "add as largefile"
+msgstr "adiciona como largefile"
+
+msgid ""
+"add all files above this size (in megabytes) as largefiles (default: 10)"
+msgstr ""
+"adiciona todos os arquivos acima deste tamanho (em megabytes) como "
+"largefiles (padrão: 10)"
+
+msgid "verify largefiles"
+msgstr "verifica largefiles"
+
+msgid "verify all revisions of largefiles not just current"
+msgstr "verifica todas as revisões de largefiles, não apenas a revisão atual"
+
+msgid "verify largefile contents not just existence"
+msgstr "verifica conteúdos de largefiles, não apenas existência"
+
+msgid "display outgoing largefiles"
+msgstr "exibe largefiles a serem enviados"
+
 msgid "manage a stack of patches"
 msgstr "gerencia uma pilha de patches"
 
@@ -4311,7 +4885,8 @@
 msgstr "tentando desempilhar nó desconhecido %s"
 
 msgid "popping would remove a revision not managed by this patch queue"
-msgstr "desempilhar removeria uma revisão não gerenciada por esta fila de patches"
+msgstr ""
+"desempilhar removeria uma revisão não gerenciada por esta fila de patches"
 
 msgid "deletions found between repo revs"
 msgstr "remoções encontradas entre revisões do repositório"
@@ -4326,8 +4901,12 @@
 msgid "cannot refresh a revision with children"
 msgstr "não se pode renovar uma revisão com filhos"
 
-msgid "refresh interrupted while patch was popped! (revert --all, qpush to recover)\n"
-msgstr "renovação interrompida enquanto o patch foi desempilhado! (revert --all, qpush para recuperar)\n"
+msgid ""
+"refresh interrupted while patch was popped! (revert --all, qpush to "
+"recover)\n"
+msgstr ""
+"renovação interrompida enquanto o patch foi desempilhado! (revert --all, "
+"qpush para recuperar)\n"
 
 msgid "patch queue directory already exists"
 msgstr "o diretório de fila de patches já existe"
@@ -5130,11 +5709,23 @@
 msgid "copy %s to %s\n"
 msgstr "copia %s para %s\n"
 
+msgid ""
+"strip specified revision (optional, can specify revisions without this "
+"option)"
+msgstr ""
+"remove a revisão especificada (opcional, não é necessário especificar "
+"explicitamente esta opção para remover revisões)"
+
 msgid "force removal of changesets, discard uncommitted changes (no backup)"
-msgstr "força a remoção de revisões, descarta mudanças não consolidadas (sem backup)"
-
-msgid "bundle only changesets with local revision number greater than REV which are not descendants of REV (DEPRECATED)"
-msgstr "adiciona ao bundle apenas revisões cujo número local de revisão for maior que REV e que não forem seus descendentes (OBSOLETA)"
+msgstr ""
+"força a remoção de revisões, descarta mudanças não consolidadas (sem backup)"
+
+msgid ""
+"bundle only changesets with local revision number greater than REV which are"
+" not descendants of REV (DEPRECATED)"
+msgstr ""
+"adiciona ao bundle apenas revisões cujo número local de revisão for maior "
+"que REV e que não forem seus descendentes (OBSOLETA)"
 
 msgid "no backups"
 msgstr "nenhuma cópia de segurança"
@@ -5359,6 +5950,9 @@
 msgid "list all available queues"
 msgstr "lista todas as filas disponíveis"
 
+msgid "print name of active queue"
+msgstr "imprime o nome da fila ativa"
+
 msgid "create new queue"
 msgstr "cria uma nova fila"
 
@@ -5387,12 +5981,14 @@
 msgid ""
 "    Omitting a queue name or specifying -l/--list will show you the registered\n"
 "    queues - by default the \"normal\" patches queue is registered. The currently\n"
-"    active queue will be marked with \"(active)\"."
+"    active queue will be marked with \"(active)\". Specifying --active will print\n"
+"    only the name of the active queue."
 msgstr ""
 "    Omitir um nome de fila ou especificar -l/--list fará com que o\n"
 "    comando mostre as filas registradas - por padrão a fila de\n"
 "    patches \"normal\" é registrada. A fila ativa no momento será\n"
-"    marcada com \"(ativa)\"."
+"    marcada com \"(ativa)\". Especificar --active fará com que apenas\n"
+"    o nome da fila ativa seja imprimido."
 
 msgid ""
 "    To create a new queue, use -c/--create. The queue is automatically made\n"
@@ -5492,118 +6088,64 @@
 msgid "operate on patch repository"
 msgstr "opera no repositório de patches"
 
-msgid "hooks for sending email notifications at commit/push time"
-msgstr "gancho para enviar notificações por e-mail em commit/push"
-
-msgid ""
-"Subscriptions can be managed through a hgrc file. Default mode is to\n"
-"print messages to stdout, for testing and configuring."
-msgstr ""
-"Assinantes podem ser gerenciados através do arquivo hgrc. O modo padrão é\n"
-"imprimir as mensagens para stdout, para testes e configuração."
-
-msgid ""
-"To use, configure the notify extension and enable it in hgrc like\n"
-"this::"
-msgstr ""
-"Para usar, configure e habilite a extensão notify no hgrc da seguinte\n"
-"forma::"
-
-msgid ""
-"  [extensions]\n"
-"  notify ="
-msgstr ""
-"  [extensions]\n"
-"  notify ="
+msgid "hooks for sending email push notifications"
+msgstr "gancho para enviar notificações por e-mail em um push"
+
+msgid ""
+"This extension let you run hooks sending email notifications when\n"
+"changesets are being pushed, from the sending or receiving side."
+msgstr ""
+"Esta extensão fornece ganchos para o envio de emails de notificação do\n"
+"envio de revisões, tanto do lado que recebe como do lado que envia as\n"
+"revisões."
+
+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"
+"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"
+"as revisões::"
 
 msgid ""
 "  [hooks]\n"
 "  # one email for each incoming changeset\n"
 "  incoming.notify = python:hgext.notify.hook\n"
-"  # batch emails when many changesets incoming at one time\n"
-"  changegroup.notify = python:hgext.notify.hook\n"
-"  # batch emails when many changesets outgoing at one time (client side)\n"
-"  outgoing.notify = python:hgext.notify.hook"
+"  # one email for all incoming changesets\n"
+"  changegroup.notify = python:hgext.notify.hook"
 msgstr ""
 "  [hooks]\n"
-"  # um e-mail para cada revisão que chegar\n"
+"  # um e-mail para cada revisão recebida\n"
 "  incoming.notify = python:hgext.notify.hook\n"
-"  # e-mails em lote quando muitas revisões chegarem de uma vez\n"
-"  changegroup.notify = python:hgext.notify.hook\n"
-"  # e-mails em lote quando muitas revisões saírem de uma vez\n"
-"  # (lado do cliente)\n"
+"  # um único e-mail para todas as revisões recebidas\n"
+"  changegroup.notify = python:hgext.notify.hook"
+
+msgid ""
+"  # one email for all outgoing changesets\n"
+"  outgoing.notify = python:hgext.notify.hook"
+msgstr ""
+"  # um e-mail para todas as revisões enviadas\n"
 "  outgoing.notify = python:hgext.notify.hook"
 
 msgid ""
-"  [notify]\n"
-"  # config items go here"
-msgstr ""
-"   [notify]\n"
-"   # itens de configuração vão aqui"
-
-msgid "Required configuration items::"
-msgstr "Itens de configuração necessários::"
-
-msgid "  config = /path/to/file # file containing subscriptions"
-msgstr "  config = /caminho/arquivo # arquivo contendo assinantes"
-
-msgid "Optional configuration items::"
-msgstr "Itens de configuração opcionais::"
-
-msgid ""
-"  test = True            # print messages to stdout for testing\n"
-"  strip = 3              # number of slashes to strip for url paths\n"
-"  domain = example.com   # domain to use if committer missing domain\n"
-"  style = ...            # style file to use when formatting email\n"
-"  template = ...         # template to use when formatting email\n"
-"  incoming = ...         # template to use when run as incoming hook\n"
-"  outgoing = ...         # template to use when run as outgoing hook\n"
-"  changegroup = ...      # template to use when run as changegroup hook\n"
-"  maxdiff = 300          # max lines of diffs to include (0=none, -1=all)\n"
-"  maxsubject = 67        # truncate subject line longer than this\n"
-"  diffstat = True        # add a diffstat before the diff content\n"
-"  sources = serve        # notify if source of incoming changes in this list\n"
-"                         # (serve == ssh or http, push, pull, bundle)\n"
-"  merge = False          # send notification for merges (default True)\n"
-"  [email]\n"
-"  from = user@host.com   # email address to send as if none given\n"
-"  [web]\n"
-"  baseurl = http://hgserver/... # root of hg web site for browsing commits"
-msgstr ""
-"  test = True            # imprime mensagens para stdout para teste\n"
-"  strip = 3              # número de barras a remover de URLs\n"
-"  domain = example.com   # domínio a usar se autor não tiver domínio\n"
-"  style = ...            # arquivo de estilo para formatar o e-mail\n"
-"  template = ...         # modelo para formatar o e-mail\n"
-"  incoming = ...         # modelo ao rodar como gancho de entrada\n"
-"  outgoing = ...         # modelo ao rodar como gancho de saída\n"
-"  changegroup = ...      # modelo ao rodar como gancho changegroup\n"
-"  maxdiff = 300          # no. máximo de linhas de diff incluídas\n"
-"                         # (0=nenhuma, -1=todas)\n"
-"  maxsubject = 67        # trunca linhas de assunto maiores que isso\n"
-"  diffstat = True        # adiciona um diffstat antes do diff\n"
-"  sources = serve        # notifica se a fonte de mudanças recebidas\n"
-"                         # estiver nessa lista\n"
-"                         # (serve == ssh ou http, push, pull, bundle)\n"
-"  merge = False          # envia notificação de mesclagens (padrão: True)\n"
-"  [email]\n"
-"  from = user@host.com   # endereço de e-mail de envio se não houver\n"
-"  [web]\n"
-"  baseurl = http://hgserver/... # raiz do web site hg para\n"
-"                                # visualizar consolidações"
-
-msgid ""
-"The notify config file has same format as a regular hgrc file. It has\n"
-"two sections so you can express subscriptions in whatever way is\n"
-"handier for you."
-msgstr ""
-"O arquivo de configuração do notify tem o mesmo formato que um\n"
-"hgrc comum. Possui duas seções, com isso você pode exprimir as\n"
-"assinaturas do modo mais conveniente para você."
+"Now the hooks are running, subscribers must be assigned to\n"
+"repositories. Use the ``[usersubs]`` section to map repositories to a\n"
+"given email or the ``[reposubs]`` section to map emails to a single\n"
+"repository::"
+msgstr ""
+"Uma vez que os ganchos estejam instalados, os assinantes devem ser\n"
+"inscritos. Use a seção ``[usersubs]`` para mapear repositórios para\n"
+"um dado e-mail ou a seção ``[reposubs]`` para mapear e-mails para um\n"
+"únioco repositório::"
 
 msgid ""
 "  [usersubs]\n"
-"  # key is subscriber email, value is \",\"-separated list of glob patterns\n"
+"  # key is subscriber email, value is a comma-separated list of glob\n"
+"  # patterns\n"
 "  user@host = pattern"
 msgstr ""
 "  [usersubs]\n"
@@ -5613,7 +6155,8 @@
 
 msgid ""
 "  [reposubs]\n"
-"  # key is glob pattern, value is \",\"-separated list of subscriber emails\n"
+"  # key is glob pattern, value is a comma-separated list of subscriber\n"
+"  # emails\n"
 "  pattern = user@host"
 msgstr ""
 "  [reposubs]\n"
@@ -5621,16 +6164,189 @@
 "  # vírgulas de e-mails dos assinantes\n"
 "  padrão = user@host"
 
-msgid "Glob patterns are matched against path to repository root."
-msgstr "Padrões glob são casados com o caminho da raiz do repositório."
-
-msgid ""
-"If you like, you can put notify config file in repository that users\n"
-"can push changes to, they can manage their own subscriptions.\n"
-msgstr ""
-"Se você quiser, você pode colocar o arquivo de configuração do\n"
-"notify em um repositório com acesso de envio para os usuários,\n"
-"de modo que eles possam gerenciar suas próprias assinaturas.\n"
+msgid ""
+"Glob patterns are matched against absolute path to repository\n"
+"root. The subscriptions can be defined in their own file and\n"
+"referenced with::"
+msgstr ""
+"Os padrões glob correspondem ao caminho absoluto da raiz do\n"
+"repositório. As inscrições podem ser definidas em seu próprio\n"
+"arquivo e referenciadas com::"
+
+msgid ""
+"  [notify]\n"
+"  config = /path/to/subscriptionsfile"
+msgstr ""
+"  [notify]\n"
+"  config = /caminho/para/arquivo/de/assinantes"
+
+msgid ""
+"Alternatively, they can be added to Mercurial configuration files by\n"
+"setting the previous entry to an empty value."
+msgstr ""
+"Alternativamente, podem ser adicionados aos arquivos de configuração\n"
+"do Mercurial definindo a entrada anterior para um valor vazio."
+
+msgid ""
+"At this point, notifications should be generated but will not be sent until you\n"
+"set the ``notify.test`` entry to ``False``."
+msgstr ""
+"Neste ponto, notificações serão geradas, mas não serão enviadas\n"
+"até que você defina a entrada ``notify.test`` como ``False``."
+
+msgid ""
+"Notifications content can be tweaked with the following configuration "
+"entries:"
+msgstr ""
+"O conteúdo das notificações pode ser ajustado com as seguintes\n"
+"entradas de configuração:"
+
+msgid ""
+"notify.test\n"
+"  If ``True``, print messages to stdout instead of sending them. Default: True."
+msgstr ""
+"notify.test\n"
+"  Se ``True``, imprime as mensagens para a saída padrão, ao\n"
+"  invés de enviá-las. O padrão é True."
+
+msgid ""
+"notify.sources\n"
+"  Space separated list of change sources. Notifications are sent only\n"
+"  if it includes the incoming or outgoing changes source. Incoming\n"
+"  sources can be ``serve`` for changes coming from http or ssh,\n"
+"  ``pull`` for pulled changes, ``unbundle`` for changes added by\n"
+"  :hg:`unbundle` or ``push`` for changes being pushed\n"
+"  locally. Outgoing sources are the same except for ``unbundle`` which\n"
+"  is replaced by ``bundle``. Default: serve."
+msgstr ""
+"notify.sources\n"
+"  Lista separada por espaços de origens das mudanças. As notificações\n"
+"  são enviadas apenas se esta lista incluir a origem das mudanças\n"
+"  enviadas ou recebidas. Mudanças recebidas podem ser ``serve`` para\n"
+"  mudanças provenientes de http ou ssh, ``pull`` para mudanças trazidas\n"
+"  por :hg:`pull`, ``unbundle`` para mudanças adicionadas por\n"
+"  :hg:`unbundle` ou ``push`` para mudanças sendo enviadas localmente.\n"
+"  As origens de saída são as mesmas, exceto por ``unbundle`` que é\n"
+"  substituída por ``bundle``. Padrão: serve."
+
+msgid ""
+"notify.strip\n"
+"  Number of leading slashes to strip from url paths. By default, notifications\n"
+"  references repositories with their absolute path. ``notify.strip`` let you\n"
+"  turn them into relative paths. For example, ``notify.strip=3`` will change\n"
+"  ``/long/path/repository`` into ``repository``. Default: 0."
+msgstr ""
+"notify.strip\n"
+"  Número de barras \"/\" à esquerda a serem removidas de urls. Por\n"
+"  padrão, notificações referenciam repositórios usando caminhos\n"
+"  absolutos. ``notify.strip`` pode ser usado para suportar caminhos\n"
+"  relativos. Por exemplo, ``notify.strip=3`` mudará\n"
+"  ``/caminho/longo/repositorio`` para ``repositorio``. Padrão: 0."
+
+msgid ""
+"notify.domain\n"
+"  If subscribers emails or the from email have no domain set, complete them\n"
+"  with this value."
+msgstr ""
+"notify.domain\n"
+"  Se os e-mails de assinantes ou do endereço de envio não tiverem um\n"
+"  domínio, eles serão completados usando este valor."
+
+msgid ""
+"notify.style\n"
+"  Style file to use when formatting emails."
+msgstr ""
+"notify.style\n"
+"  O arquivo de estilo usado para formatar os e-mails."
+
+msgid ""
+"notify.template\n"
+"  Template to use when formatting emails."
+msgstr ""
+"notify.template\n"
+"  O modelo usado para formatar os e-mails."
+
+msgid ""
+"notify.incoming\n"
+"  Template to use when run as incoming hook, override ``notify.template``."
+msgstr ""
+"notify.incoming\n"
+"  O modelo usado ao executar o gancho incoming; sobrepõe\n"
+"  ``notify.template``."
+
+msgid ""
+"notify.outgoing\n"
+"  Template to use when run as outgoing hook, override ``notify.template``."
+msgstr ""
+"notify.incoming\n"
+"  O modelo usado ao executar o gancho outgoing; sobrepõe\n"
+"  ``notify.template``."
+
+msgid ""
+"notify.changegroup\n"
+"  Template to use when running as changegroup hook, override\n"
+"  ``notify.template``."
+msgstr ""
+"notify.changegroup\n"
+"  O modelo usado ao executar o gancho changegroup; sobrepõe\n"
+"  ``notify.template``."
+
+msgid ""
+"notify.maxdiff\n"
+"  Maximum number of diff lines to include in notification email. Set to 0\n"
+"  to disable the diff, -1 to include all of it. Default: 300."
+msgstr ""
+"notify.maxdiff\n"
+"  Número máximo de linhas de diff incluídas no e-mail de notificação.\n"
+"  Use 0 para desabilitar o diff, e -1 para incluir o diff completo.\n"
+"  Padrão: 300."
+
+msgid ""
+"notify.maxsubject\n"
+"  Maximum number of characters in emails subject line. Default: 67."
+msgstr ""
+"notify.maxsubject\n"
+"  Número máximo de caracteres na linha de assunto do e-mail. Padrão: 67."
+
+msgid ""
+"notify.diffstat\n"
+"  Set to True to include a diffstat before diff content. Default: True."
+msgstr ""
+"notify.diffstat\n"
+"  Use True para incluir um diffstat antes do conteúdo do diff.\n"
+"  Padrão: True."
+
+msgid ""
+"notify.merge\n"
+"  If True, send notifications for merge changesets. Default: True."
+msgstr ""
+"notify.merge\n"
+"  Se True, envia notificações para revisões de mesclagem. Padrão: True."
+
+msgid ""
+"If set, the following entries will also be used to customize the "
+"notifications:"
+msgstr ""
+"Se definidas, as seguintes entradas também serão usadas para\n"
+"modificar as notificações:"
+
+msgid ""
+"email.from\n"
+"  Email ``From`` address to use if none can be found in generated email content."
+msgstr ""
+"email.from\n"
+"  Endereço ``From`` do e-mail se um endereço não for encontrado\n"
+"  no conteúdo do e-mail gerado."
+
+msgid ""
+"web.baseurl\n"
+"  Root repository browsing URL to combine with repository paths when making\n"
+"  references. See also ``notify.strip``."
+msgstr ""
+"web.baseurl\n"
+"  URL raiz de visualização do repositório a ser combinada com\n"
+"  o caminho do repositório ao criar referências. Veja também\n"
+"  ``notify.strip``."
 
 #, python-format
 msgid "%s: %d new changesets"
@@ -5752,7 +6468,9 @@
 "auto para comportamento normal.\n"
 
 msgid "when to paginate (boolean, always, auto, or never)"
-msgstr "quando paginar (booleana, ou \"always\" (sempre), \"never\" (nunca) ou \"auto\" (automaticamente))"
+msgstr ""
+"quando paginar (booleana, ou \"always\" (sempre), \"never\" (nunca) ou "
+"\"auto\" (automaticamente))"
 
 msgid "command to send changesets as (a series of) patch emails"
 msgstr "comando para enviar revisões como uma série de e-mails de patch"
@@ -5843,13 +6561,6 @@
 "Veja as seções [email] e [smtp] na página de manual hgrc(5) para\n"
 "mais detalhes.\n"
 
-#, python-format
-msgid "%s Please enter a valid value"
-msgstr "%s Por favor forneça um valor válido"
-
-msgid "Please enter a valid value.\n"
-msgstr "Por favor, entre um valor válido.\n"
-
 msgid "send patches as attachments"
 msgstr "envia patches como anexos"
 
@@ -5916,8 +6627,10 @@
 msgid "run even when remote repository is unrelated (with -b/--bundle)"
 msgstr "executa mesmo se o repositório não for relacionado (com -b/--bundle)"
 
-msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
-msgstr "uma revisão base especificada ao invés de um destino (com -b/--bundle)"
+msgid ""
+"a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr ""
+"uma revisão base especificada ao invés de um destino (com -b/--bundle)"
 
 msgid "send an introduction email for a single patch"
 msgstr "manda um e-mail introdutório para um patch único"
@@ -6108,7 +6821,8 @@
 msgstr "especifique ao menos uma revisão com -r ou -o"
 
 msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
-msgstr "modo é sempre --outgoing com --bundle; não especifique --outgoing novamente"
+msgstr ""
+"modo é sempre --outgoing com --bundle; não especifique --outgoing novamente"
 
 msgid "too many destinations"
 msgstr "muitos destinos"
@@ -6127,6 +6841,9 @@
 msgid "This patch series consists of %d patches."
 msgstr "Esta série de patches consiste de %d patches."
 
+msgid "no recipient addresses provided"
+msgstr "nenhum endereço de destinatário fornecido"
+
 msgid ""
 "\n"
 "Final summary:"
@@ -6181,6 +6898,9 @@
 msgid ""
 "  [progress]\n"
 "  delay = 3 # number of seconds (float) before showing the progress bar\n"
+"  changedelay = 1 # changedelay: minimum delay before showing a new topic.\n"
+"                  # If set to less than 3 * refresh, that value will\n"
+"                  # be used instead.\n"
 "  refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
 "  format = topic bar number estimate # format of the progress bar\n"
 "  width = <none> # if set, the maximum width of the progress information\n"
@@ -6192,6 +6912,9 @@
 msgstr ""
 "  [progress]\n"
 "  delay = 3 # número de segundos (float) antes que a barra seja mostrada\n"
+"  changedelay = 1 # changedelay: atraso mínimo antes que um novo tópico\n"
+"                  # seja mostrado. Se for definido para menos de\n"
+"                  # 3 * refresh, tal valor será usado em seu lugar.\n"
 "  refresh = 0.1 # tempo em segundos entre atualizações da\n"
 "                # barra de progresso\n"
 "  format = topic bar number estimate # formato da barra de progresso\n"
@@ -6265,7 +6988,8 @@
 msgstr "imprime os nomes de arquivo ao invés de removê-los"
 
 msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
-msgstr "termina nomes de arquivo com NUL, para uso com xargs (implica -p/--print)"
+msgstr ""
+"termina nomes de arquivo com NUL, para uso com xargs (implica -p/--print)"
 
 msgid "hg purge [OPTION]... [DIR]..."
 msgstr "hg purge [OPÇÃO]... [DIR]..."
@@ -6362,8 +7086,15 @@
 msgid "rebase from the specified changeset"
 msgstr "rebaseia a partir da revisão especificada"
 
-msgid "rebase from the base of the specified changeset (up to greatest common ancestor of base and dest)"
-msgstr "rebaseia a partir da base da revisão especificada (até o maior ancestral comum de base e dest)"
+msgid ""
+"rebase from the base of the specified changeset (up to greatest common "
+"ancestor of base and dest)"
+msgstr ""
+"rebaseia a partir da base da revisão especificada (até o maior ancestral "
+"comum de base e dest)"
+
+msgid "rebase these revisions"
+msgstr "rebaseia estas revisões"
 
 msgid "rebase onto the specified changeset"
 msgstr "rebaseia sobre a revisão especificada"
@@ -6374,6 +7105,9 @@
 msgid "use text as collapse commit message"
 msgstr "usa o texto como mensagem de consolidação da revisão colapsada"
 
+msgid "invoke editor on commit messages"
+msgstr "chama um editor para mensagens de consolidação"
+
 msgid "read collapse commit message from file"
 msgstr "lê de um arquivo a mensagem de consolidação da revisão colapsada"
 
@@ -6527,15 +7261,29 @@
 msgid "tool option will be ignored\n"
 msgstr "a opção tool será ignorada\n"
 
+msgid "cannot specify both a source and a base"
+msgstr "não se pode especificar ao mesmo tempo uma origem e uma base"
+
 msgid "cannot specify both a revision and a base"
 msgstr "não se pode especificar ao mesmo tempo uma revisão e uma base"
 
+msgid "cannot specify both a revision and a source"
+msgstr "não se pode especificar ao mesmo tempo uma revisão e uma origem"
+
 msgid "detach requires a revision to be specified"
 msgstr "detach exige que uma revisão seja especificada"
 
 msgid "cannot specify a base with detach"
 msgstr "não se pode especificar base com detach"
 
+msgid "can't remove original changesets with unrebased descendants"
+msgstr ""
+"não é possível remover revisões originais que tenham descendentes não "
+"rebaseados"
+
+msgid "use --keep to keep original changesets"
+msgstr "use --keep para manter as revisões originais"
+
 msgid "nothing to rebase\n"
 msgstr "nada para rebasear\n"
 
@@ -6549,7 +7297,9 @@
 msgstr "revisões"
 
 msgid "unresolved conflicts (see hg resolve, then hg rebase --continue)"
-msgstr "conflitos não resolvidos (veja hg resolve, e em seguida hg rebase --continue)"
+msgstr ""
+"conflitos não resolvidos (veja hg resolve, e em seguida hg rebase "
+"--continue)"
 
 #, python-format
 msgid "no changes, revision %d skipped\n"
@@ -6559,7 +7309,8 @@
 msgstr "mesclagem de rebaseamento completada\n"
 
 msgid "warning: new changesets detected on source branch, not stripping\n"
-msgstr "aviso: novas revisões detectadas no ramo de origem, strip não realizado\n"
+msgstr ""
+"aviso: novas revisões detectadas no ramo de origem, strip não realizado\n"
 
 msgid "rebase completed\n"
 msgstr "rebaseamento completado\n"
@@ -6579,7 +7330,9 @@
 msgstr "nenhum rebaseamento em progresso"
 
 msgid "warning: new changesets detected on target branch, can't abort\n"
-msgstr "aviso: novas revisões detectadas no ramo de destino, não é possível abortar\n"
+msgstr ""
+"aviso: novas revisões detectadas no ramo de destino, não é possível "
+"abortar\n"
 
 msgid "rebase aborted\n"
 msgstr "rebaseamento abortado\n"
@@ -6587,12 +7340,15 @@
 msgid "cannot rebase onto an applied mq patch"
 msgstr "não se pode rebasear para um patch mq aplicado"
 
+msgid "no matching revisions"
+msgstr "nenhuma revisão correspondente"
+
+msgid "can't rebase multiple roots"
+msgstr "não é possível rebasear múltiplas raízes"
+
 msgid "source is ancestor of destination"
 msgstr "origem é ancestral do destino"
 
-msgid "source is descendant of destination"
-msgstr "origem é descendente do destino"
-
 msgid "--tool can only be used with --rebase"
 msgstr "--tool só pode ser usada em conjunto com --rebase"
 
@@ -6603,7 +7359,8 @@
 msgstr "especifica o utilitário de mesclagem para o rebaseamento"
 
 msgid "commands to interactively select changes for commit/qrefresh"
-msgstr "comandos para selecionar interativamente mudanças em um commit ou qrefresh"
+msgstr ""
+"comandos para selecionar interativamente mudanças em um commit ou qrefresh"
 
 msgid "ignore white space when comparing lines"
 msgstr "ignora espaços em branco ao comparar linhas"
@@ -6720,7 +7477,8 @@
 msgstr "      ? - exibe o texto de ajuda"
 
 msgid "    This command is not available when committing a merge."
-msgstr "    Este comando não está disponível para a consolidação de uma mesclagem."
+msgstr ""
+"    Este comando não está disponível para a consolidação de uma mesclagem."
 
 msgid "interactively record a new patch"
 msgstr "grava um novo patch interativamente"
@@ -6977,6 +7735,20 @@
 "       exista (por exemplo, a tip).\n"
 "    "
 
+msgid "convert a shared repository to a normal one"
+msgstr "converte um repositório compartilhado para um repositório normal"
+
+msgid ""
+"    Copy the store data to the repo and remove the sharedpath data.\n"
+"    "
+msgstr ""
+"    Copia os dados armazenados na origem e remove os dados\n"
+"    de compartilhamento de repositório.\n"
+"    "
+
+msgid "this is not a shared repo"
+msgstr "este não é um repositório compartilhado"
+
 msgid "do not create a working copy"
 msgstr "não cria uma cópia de trabalho"
 
@@ -7098,7 +7870,8 @@
 msgstr "filtra revisões através do comando"
 
 msgid "hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
-msgstr "hg transplant [-s REPOSITÓRIO] [-b RAMO [-a]] [-p REV] [-m REV] [REV]..."
+msgstr ""
+"hg transplant [-s REPOSITÓRIO] [-b RAMO [-a]] [-p REV] [-m REV] [REV]..."
 
 msgid "transplant changesets from another branch"
 msgstr "transplanta revisões de outro ramo"
@@ -7295,7 +8068,8 @@
 " encoding = sjis"
 
 msgid "It is useful for the users who want to commit with UTF-8 log message.\n"
-msgstr "Isto é útil para usuários que preferem mensagens de consolidação em UTF-8.\n"
+msgstr ""
+"Isto é útil para usuários que preferem mensagens de consolidação em UTF-8.\n"
 
 #, python-format
 msgid "[win32mbcs] filename conversion failed with %s encoding\n"
@@ -7350,7 +8124,9 @@
 "  ** = cleverdecode:\n"
 "  # or ** = macdecode:"
 
-msgid "If not doing conversion, to make sure you do not commit CRLF/CR by accident::"
+msgid ""
+"If not doing conversion, to make sure you do not commit CRLF/CR by "
+"accident::"
 msgstr ""
 "Se a conversão não estiver sendo feita, para garantir que você não\n"
 "consolide CRLF/CR acidentalmente::"
@@ -7395,7 +8171,9 @@
 
 #, python-format
 msgid "Attempt to commit or push text file(s) using %s line endings\n"
-msgstr "Tentativa de consolidação ou push de arquivo(s) texto usando quebras de linha %s\n"
+msgstr ""
+"Tentativa de consolidação ou push de arquivo(s) texto usando quebras de "
+"linha %s\n"
 
 #, python-format
 msgid "in %s: %s\n"
@@ -7439,8 +8217,11 @@
 "[decode]\n"
 "** = %sdecode:\n"
 
-msgid "win32text is deprecated: http://mercurial.selenic.com/wiki/Win32TextExtension\n"
-msgstr "win32text é obsoleta: http://mercurial.selenic.com/wiki/Win32TextExtension\n"
+msgid ""
+"win32text is deprecated: "
+"http://mercurial.selenic.com/wiki/Win32TextExtension\n"
+msgstr ""
+"win32text é obsoleta: http://mercurial.selenic.com/wiki/Win32TextExtension\n"
 
 msgid "discover and advertise repositories on the local network"
 msgstr "descobre e anuncia repositórios na rede local"
@@ -7485,17 +8266,14 @@
 msgid "archive prefix contains illegal components"
 msgstr "prefixo de arquivo contém componentes ilegais"
 
-msgid "cannot give prefix when archiving to files"
-msgstr "não é possível fornecer prefixo ao arquivar para arquivos"
-
-#, python-format
-msgid "unknown archive type '%s'"
-msgstr "tipo de arquivo '%s' desconhecido"
-
 msgid "archiving"
 msgstr "empacotando"
 
 #, python-format
+msgid "malformed line in .hg/bookmarks: %r\n"
+msgstr "linha malformada em .hg/bookmarks: %r\n"
+
+#, python-format
 msgid "bookmark '%s' contains illegal character"
 msgstr "o marcador '%s' contém um caractere ilegal"
 
@@ -7529,7 +8307,8 @@
 
 #, python-format
 msgid "stream ended unexpectedly (got %d bytes, expected %d)"
-msgstr "dados recebidos terminaram inesperadamente (%d bytes obtidos, %d esperados)"
+msgstr ""
+"dados recebidos terminaram inesperadamente (%d bytes obtidos, %d esperados)"
 
 #, python-format
 msgid "invalid chunk length %d"
@@ -7554,6 +8333,10 @@
 msgid "the name '%s' is reserved"
 msgstr "o nome '%s' é reservado"
 
+#, python-format
+msgid "uncommitted changes in subrepo %s"
+msgstr "mudanças não consolidadas no sub-repositório %s"
+
 msgid "options --message and --logfile are mutually exclusive"
 msgstr "opções --message e --logfile são mutuamente exclusivas"
 
@@ -7575,10 +8358,12 @@
 msgstr "não é possível especificar simultaneamente --changelog e --manifest"
 
 msgid "cannot specify filename with --changelog or --manifest"
-msgstr "não é possível especificar um nome de arquivo com --changelog ou --manifest"
+msgstr ""
+"não é possível especificar um nome de arquivo com --changelog ou --manifest"
 
 msgid "cannot specify --changelog or --manifest without a repository"
-msgstr "não é possível especificar --changelog ou --manifest sem um repositório"
+msgstr ""
+"não é possível especificar --changelog ou --manifest sem um repositório"
 
 msgid "invalid arguments"
 msgstr "argumentos inválidos"
@@ -7640,9 +8425,6 @@
 msgid "destination %s is not a directory"
 msgstr "o destino %s não é um diretório"
 
-msgid "no files to copy"
-msgstr "nenhum arquivo para copiar"
-
 msgid "(consider using --after)\n"
 msgstr "(considere usar --after)\n"
 
@@ -7725,7 +8507,9 @@
 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"
+msgstr ""
+"é possível acompanhar cópias/renomeações apenas para nomes de arquivo "
+"explícitos"
 
 #, python-format
 msgid "adding %s\n"
@@ -7777,7 +8561,8 @@
 msgstr "mensagem de consolidação vazia"
 
 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"
+msgstr ""
+"diretório raiz do repositório ou nome de arquivo de bundle para sobreposição"
 
 msgid "DIR"
 msgstr "DIR"
@@ -7786,7 +8571,9 @@
 msgstr "muda o diretório de trabalho"
 
 msgid "do not prompt, automatically pick the first choice for all prompts"
-msgstr "não consulta o usuário, usa automaticamente a primeira opção em todas as escolhas"
+msgstr ""
+"não consulta o usuário, usa automaticamente a primeira opção em todas as "
+"escolhas"
 
 msgid "suppress output"
 msgstr "suprime saída"
@@ -7843,7 +8630,9 @@
 msgstr "especifica comando hg para executar do lado remoto"
 
 msgid "do not verify server certificate (ignoring web.cacerts config)"
-msgstr "não verifica o certificado do servidor (ignorando a opção de configuração web.cacerts)"
+msgstr ""
+"não verifica o certificado do servidor (ignorando a opção de configuração "
+"web.cacerts)"
 
 msgid "PATTERN"
 msgstr "PADRÃO"
@@ -8114,6 +8903,21 @@
 "    O tipo de arquivo é detectado automaticamente com base na extensão\n"
 "    do arquivo (ou forçado através de -t/--type)."
 
+msgid "      Examples:"
+msgstr "      Exemplos::"
+
+msgid "      - create a zip file containing the 1.0 release::"
+msgstr "      - cria um arquivo zip contendo a versão 1.0::"
+
+msgid "          hg archive -r 1.0 project-1.0.zip"
+msgstr "          hg archive -r 1.0 project-1.0.zip"
+
+msgid "      - create a tarball excluding .hg files::"
+msgstr "      - cria um tarball excluindo arquivos .hg::"
+
+msgid "          hg archive project.tar.gz -X \".hg*\""
+msgstr "          hg archive project.tar.gz -X \".hg*\""
+
 msgid "    Valid types are:"
 msgstr "    Tipos válidos:"
 
@@ -8163,8 +8967,8 @@
 msgid "merge with old dirstate parent after backout"
 msgstr "mesclar com pai do dirstate anterior após o backout"
 
-msgid "parent to choose when backing out merge"
-msgstr "pai a ser escolhido ao fazer o backout de mesclagem"
+msgid "parent to choose when backing out merge (DEPRECATED)"
+msgstr "pai a ser escolhido ao fazer o backout de mesclagem (OBSOLETO)"
 
 msgid "revision to backout"
 msgstr "revisão para fazer o backout"
@@ -8193,26 +8997,35 @@
 "    manualmente."
 
 msgid ""
-"    By default, the pending changeset will have one parent,\n"
-"    maintaining a linear history. With --merge, the pending changeset\n"
-"    will instead have two parents: the old parent of the working\n"
-"    directory and a new child of REV that simply undoes REV."
-msgstr ""
-"    Por padrão, a revisão pendente terá apenas um pai, mantendo assim\n"
-"    um histórico linear. Se a opção --merge for usada, a revisão\n"
-"    pendente terá dois pais: o antigo pai do diretório de trabalho e\n"
-"    uma nova revisão filha de REV que desfaz o conteúdo de REV."
-
-msgid ""
-"    Before version 1.7, the behavior without --merge was equivalent to\n"
-"    specifying --merge followed by :hg:`update --clean .` to cancel\n"
-"    the merge and leave the child of REV as a head to be merged\n"
-"    separately."
-msgstr ""
-"    Antes da versao 1.7 do Mercurial, o comportamento do comando\n"
-"    backout sem --merge era equivalente a especificar --merge seguido por\n"
-"    :hg:`update --clean .`, cancelando a mesclagem e deixando a filha\n"
-"    de REV como uma cabeça a ser mesclada explicitamente."
+"    .. note::\n"
+"      backout cannot be used to fix either an unwanted or\n"
+"      incorrect merge."
+msgstr ""
+"    .. note::\n"
+"      backout não pode ser usado para corrigir uma mesclagem\n"
+"      incorreta ou indesejada."
+
+msgid ""
+"      By default, the pending changeset will have one parent,\n"
+"      maintaining a linear history. With --merge, the pending\n"
+"      changeset will instead have two parents: the old parent of the\n"
+"      working directory and a new child of REV that simply undoes REV."
+msgstr ""
+"      Por padrão, a revisão pendente terá apenas um pai, mantendo assim\n"
+"      um histórico linear. Se a opção --merge for usada, a revisão\n"
+"      pendente terá dois pais: o antigo pai do diretório de trabalho e\n"
+"      uma nova revisão filha de REV que desfaz o conteúdo de REV."
+
+msgid ""
+"      Before version 1.7, the behavior without --merge was equivalent\n"
+"      to specifying --merge followed by :hg:`update --clean .` to\n"
+"      cancel the merge and leave the child of REV as a head to be\n"
+"      merged separately."
+msgstr ""
+"      Antes da versao 1.7 do Mercurial, o comportamento do comando\n"
+"      backout sem --merge era equivalente a especificar --merge seguido por\n"
+"      :hg:`update --clean .`, cancelando a mesclagem e deixando a filha\n"
+"      de REV como uma cabeça a ser mesclada explicitamente."
 
 msgid "please specify just one revision"
 msgstr "por favor especifique apenas uma revisão"
@@ -8226,8 +9039,8 @@
 msgid "cannot backout a change with no parents"
 msgstr "não se pode anular uma mudança sem pais"
 
-msgid "cannot backout a merge changeset without --parent"
-msgstr "não se pode anular uma revisão de mesclagem sem --parent"
+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"
@@ -8312,6 +9125,101 @@
 "    abortará a bissecção, e qualquer outro código maior que 0\n"
 "    marcará a revisão como ruim."
 
+msgid "      Some examples:"
+msgstr "      Alguns exemplos::"
+
+msgid ""
+"      - start a bisection with known bad revision 12, and good revision 34::"
+msgstr ""
+"      - inicia uma bissecção com a revisão ruim 12, e a revisão boa 34::"
+
+msgid ""
+"          hg bisect --bad 34\n"
+"          hg bisect --good 12"
+msgstr ""
+"          hg bisect --bad 34\n"
+"          hg bisect --good 12"
+
+msgid ""
+"      - advance the current bisection by marking current revision as good or\n"
+"        bad::"
+msgstr ""
+"      - avança a bisecção atual marcando a revisão atual como\n"
+"        boa ou ruim::"
+
+msgid ""
+"          hg bisect --good\n"
+"          hg bisect --bad"
+msgstr ""
+"          hg bisect --good\n"
+"          hg bisect --bad"
+
+msgid ""
+"      - mark the current revision, or a known revision, to be skipped (eg. if\n"
+"        that revision is not usable because of another issue)::"
+msgstr ""
+"      - marca a revisão atual, ou uma revisão conhecida, para que\n"
+"        seja omitida (por exemplo, se tal revisão não for usável\n"
+"        devido a algum outro problema)::"
+
+msgid ""
+"          hg bisect --skip\n"
+"          hg bisect --skip 23"
+msgstr ""
+"          hg bisect --skip\n"
+"          hg bisect --skip 23"
+
+msgid "      - forget the current bisection::"
+msgstr "      - esquece a bisecção atual::"
+
+msgid "          hg bisect --reset"
+msgstr "          hg bisect --reset"
+
+msgid ""
+"      - use 'make && make tests' to automatically find the first broken\n"
+"        revision::"
+msgstr ""
+"      - usa 'make && make tests' para encontrar a primeira revisão\n"
+"        quebrada automaticamente::"
+
+msgid ""
+"          hg bisect --reset\n"
+"          hg bisect --bad 34\n"
+"          hg bisect --good 12\n"
+"          hg bisect --command 'make && make tests'"
+msgstr ""
+"          hg bisect --reset\n"
+"          hg bisect --bad 34\n"
+"          hg bisect --good 12\n"
+"          hg bisect --command 'make && make tests'"
+
+msgid ""
+"      - see all changesets whose states are already known in the current\n"
+"        bisection::"
+msgstr ""
+"      - mostra todas as revisões cujos estados já são conhecidos\n"
+"        na bisecção atual::"
+
+msgid "          hg log -r \"bisect(pruned)\""
+msgstr "          hg log -r \"bisect(pruned)\""
+
+msgid "      - see all changesets that took part in the current bisection::"
+msgstr "      - mostra todas as revisões que tomam parte na bisecção atual::"
+
+msgid "          hg log -r \"bisect(range)\""
+msgstr "          hg log -r \"bisect(range)\""
+
+msgid "      - with the graphlog extension, you can even get a nice graph::"
+msgstr "      - a extensão graphlog pode inclusive fornecer um grafo::"
+
+msgid "          hg log --graph -r \"bisect(range)\""
+msgstr "          hg log --graph -r \"bisect(range)\""
+
+msgid "      See :hg:`help revsets` for more about the `bisect()` keyword."
+msgstr ""
+"      Veja :hg:`help revsets` para mais informações sobre a palavra\n"
+"      chave `bisect()`."
+
 msgid "The first good revision is:\n"
 msgstr "A primeira revisão boa é:\n"
 
@@ -8329,10 +9237,14 @@
 "ancestral comum, %s.\n"
 
 msgid "Due to skipped revisions, the first good revision could be any of:\n"
-msgstr "Devido a revisões omitidas, a primeira revisão boa pode ser qualquer uma entre:\n"
+msgstr ""
+"Devido a revisões omitidas, a primeira revisão boa pode ser qualquer uma "
+"entre:\n"
 
 msgid "Due to skipped revisions, the first bad revision could be any of:\n"
-msgstr "Devido a revisões omitidas, a primeira revisão ruim pode ser qualquer uma entre:\n"
+msgstr ""
+"Devido a revisões omitidas, a primeira revisão ruim pode ser qualquer uma "
+"entre:\n"
 
 msgid "cannot bisect (no known good revisions)"
 msgstr "não é possível fazer o bisect (nenhuma revisão boa conhecida)"
@@ -8500,14 +9412,13 @@
 "    fechado.\n"
 "    "
 
-msgid "    .. note::"
-msgstr "    .. note::"
-
-msgid ""
+msgid ""
+"    .. note::\n"
 "       Branch names are permanent. Use :hg:`bookmark` to create a\n"
 "       light-weight bookmark instead. See :hg:`help glossary` for more\n"
 "       information about named branches and bookmarks."
 msgstr ""
+"    .. note::\n"
 "       Nomes de ramos são permanentes. Alternativamente, Use :hg:`bookmark`\n"
 "       para criar um marcador leve temporário. Veja :hg:`help glossary`\n"
 "       para mais informações sobre ramos nomeados e marcadores."
@@ -8734,124 +9645,169 @@
 "    repositório, como o padrão a ser usado para futuros comandos\n"
 "    pull."
 
-msgid "    See :hg:`help urls` for valid source format details."
-msgstr "    Veja :hg:`help urls` para formatos válidos da origem."
-
-msgid ""
-"    It is possible to specify an ``ssh://`` URL as the destination, but no\n"
-"    ``.hg/hgrc`` and working directory will be created on the remote side.\n"
-"    Please see :hg:`help urls` for important details about ``ssh://`` URLs."
-msgstr ""
-"    É possível especificar uma URL ``ssh://`` como destino, mas o\n"
-"    ``.hg/hgrc`` e a cópia de trabalho não serão criados do lado remoto.\n"
-"    Por favor veja :hg:`help urls` para detalhes importantes sobre\n"
-"    URLs ``ssh://`` ."
-
-msgid ""
-"    A set of changesets (tags, or branch names) to pull may be specified\n"
-"    by listing each changeset (tag, or branch name) with -r/--rev.\n"
-"    If -r/--rev is used, the cloned repository will contain only a subset\n"
-"    of the changesets of the source repository. Only the set of changesets\n"
-"    defined by all -r/--rev options (including all their ancestors)\n"
-"    will be pulled into the destination repository.\n"
-"    No subsequent changesets (including subsequent tags) will be present\n"
-"    in the destination."
-msgstr ""
-"    Um conjunto de revisões (etiquetas, ou nomes de ramo) a serem trazidas\n"
-"    pode ser especificado listando cada revisão (etiqueta, ou nome de\n"
-"    ramo) com -r/--rev. Se -r/--rev for usado, o repositório clonado irá\n"
-"    conter apenas um subconjunto das revisões do repositório de origem.\n"
-"    Apenas o conjunto de revisões definidas por todas as opções -r/--rev\n"
-"    (incluindo todos os seus ancestrais) será trazido para o repositório\n"
-"    de destino. Nenhuma revisão subsequente (incluindo etiquetas\n"
-"    subsequentes) estará presente no repositório."
-
-msgid ""
-"    Using -r/--rev (or 'clone src#rev dest') implies --pull, even for\n"
-"    local source repositories."
-msgstr ""
-"    A opção -r/--rev (ou 'clone origem#revisão destino') implica --pull,\n"
-"    mesmo em repositórios locais."
-
-msgid ""
-"    For efficiency, hardlinks are used for cloning whenever the source\n"
-"    and destination are on the same filesystem (note this applies only\n"
-"    to the repository data, not to the working directory). Some\n"
-"    filesystems, such as AFS, implement hardlinking incorrectly, but\n"
-"    do not report errors. In these cases, use the --pull option to\n"
-"    avoid hardlinking."
-msgstr ""
-"    Por eficiência, hardlinks são usados para a clonagem sempre que a\n"
-"    origem e o destino estiverem no mesmo sistema de arquivos (note\n"
-"    que isso se aplica apenas aos dados do repositório, e não aos\n"
-"    arquivos da cópia de trabalho). Alguns sistemas de arquivo, como\n"
-"    o AFS, implementam hardlinks incorretamente, mas não informam\n"
-"    erros. Nesses casos, use a opção --pull para evitar o uso de\n"
-"    hardlinks."
-
-msgid ""
-"    In some cases, you can clone repositories and the working directory\n"
-"    using full hardlinks with ::"
-msgstr ""
-"    Em alguns casos, você pode clonar repositórios e o diretório de\n"
-"    trabalho usando hardlinks completos com ::"
-
-msgid "      $ cp -al REPO REPOCLONE"
-msgstr "      $ cp -al REPO REPOCLONE"
-
-msgid ""
-"    This is the fastest way to clone, but it is not always safe. The\n"
-"    operation is not atomic (making sure REPO is not modified during\n"
-"    the operation is up to you) and you have to make sure your editor\n"
-"    breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,\n"
-"    this is not compatible with certain extensions that place their\n"
-"    metadata under the .hg directory, such as mq."
-msgstr ""
-"    Este é o jeito mais rápido de clonar, mas não é sempre seguro. A\n"
-"    operação não é atômica (garantir que REPO não seja modificado\n"
-"    durante a operação é sua responsabilidade) e você deve ter\n"
-"    certeza que seu editor quebre hardlinks (o Emacs e muitos\n"
-"    utilitários do kernel Linux fazem isso). Além disso, esse modo de\n"
-"    criar um clone não é compatível com certas extensões que colocam\n"
-"    seus metadados sob o diretório hg, como a mq."
-
-msgid ""
-"    Mercurial will update the working directory to the first applicable\n"
-"    revision from this list:"
-msgstr ""
-"    O Mercurial atualizará o diretório de trabalho para a primeira revisão\n"
-"    aplicável da seguinte lista:"
-
-msgid ""
-"    a) null if -U or the source repository has no changesets\n"
-"    b) if -u . and the source repository is local, the first parent of\n"
-"       the source repository's working directory\n"
-"    c) the changeset specified with -u (if a branch name, this means the\n"
-"       latest head of that branch)\n"
-"    d) the changeset specified with -r\n"
-"    e) the tipmost head specified with -b\n"
-"    f) the tipmost head specified with the url#branch source syntax\n"
-"    g) the tipmost head of the default branch\n"
-"    h) tip"
-msgstr ""
-"    a) null, se for passada a opção -U ou se o repositório de origem não\n"
-"       tiver revisões\n"
-"    b) o primeiro pai do diretório de trabalho do repositório de origem,\n"
-"       se for passada a opção -u e o repositório de origem for local\n"
-"    c) a revisão especificada por -u (se for um nome de ramo, é a última\n"
-"       cabeça de tal ramo)\n"
-"    d) a revisão especificada com -r\n"
-"    e) a cabeça mais recente especificada com -b\n"
-"    f) a cabeça mais recente especificada com a sintaxe de origem\n"
-"       url#ramo\n"
-"    g) a cabeça mais recente do ramo default\n"
-"    h) a tip"
+msgid ""
+"    Only local paths and ``ssh://`` URLs are supported as\n"
+"    destinations. For ``ssh://`` destinations, no working directory or\n"
+"    ``.hg/hgrc`` will be created on the remote side."
+msgstr ""
+"    Apenas caminhos locais e URLs ``ssh://`` são suportados no\n"
+"    destino. Para destinos ``ssh://``, a cópia de trabalho e arquivo\n"
+"    ``.hg/hgrc`` não serão criados no repositório remoto."
+
+msgid ""
+"    To pull only a subset of changesets, specify one or more revisions\n"
+"    identifiers with -r/--rev or branches with -b/--branch. The\n"
+"    resulting clone will contain only the specified changesets and\n"
+"    their ancestors. These options (or 'clone src#rev dest') imply\n"
+"    --pull, even for local source repositories. Note that specifying a\n"
+"    tag will include the tagged changeset but not the changeset\n"
+"    containing the tag."
+msgstr ""
+"    Para trazer apenas um subconjunto de revisões, especifique um\n"
+"    ou mais identificadores de revisão com -r/--rev ou remos com\n"
+"    -b/--branch. O clone resultante conterá apenas as revisões\n"
+"    especificadas e seus ancestrais. Estas opções (ou\n"
+"    'clone origem#rev dest') impicam --pull, mesmo para repositórios\n"
+"    locais. Note que especificar uma etiqueta incluirá a revisão\n"
+"    etiquetada mas não incluirá a revisão que define a etiqueta em si."
+
+msgid ""
+"    To check out a particular version, use -u/--update, or\n"
+"    -U/--noupdate to create a clone with no working directory."
+msgstr ""
+"    Para obter uma revisão em particular, use -u/--update, ou\n"
+"    -U/--noupdate para criar um clone sem um diretório de trabalho."
+
+msgid ""
+"      For efficiency, hardlinks are used for cloning whenever the\n"
+"      source and destination are on the same filesystem (note this\n"
+"      applies only to the repository data, not to the working\n"
+"      directory). Some filesystems, such as AFS, implement hardlinking\n"
+"      incorrectly, but do not report errors. In these cases, use the\n"
+"      --pull option to avoid hardlinking."
+msgstr ""
+"      Por eficiência, hardlinks são usados para a clonagem sempre que a\n"
+"      origem e o destino estiverem no mesmo sistema de arquivos (note\n"
+"      que isso se aplica apenas aos dados do repositório, e não aos\n"
+"      arquivos da cópia de trabalho). Alguns sistemas de arquivo, como\n"
+"      o AFS, implementam hardlinks incorretamente, mas não informam\n"
+"      erros. Nesses casos, use a opção --pull para evitar o uso de\n"
+"      hardlinks."
+
+msgid ""
+"      In some cases, you can clone repositories and the working\n"
+"      directory using full hardlinks with ::"
+msgstr ""
+"      Em alguns casos, você pode clonar repositórios e o diretório de\n"
+"      trabalho usando hardlinks completos com ::"
+
+msgid "        $ cp -al REPO REPOCLONE"
+msgstr "        $ cp -al REPO REPOCLONE"
+
+msgid ""
+"      This is the fastest way to clone, but it is not always safe. The\n"
+"      operation is not atomic (making sure REPO is not modified during\n"
+"      the operation is up to you) and you have to make sure your\n"
+"      editor breaks hardlinks (Emacs and most Linux Kernel tools do\n"
+"      so). Also, this is not compatible with certain extensions that\n"
+"      place their metadata under the .hg directory, such as mq."
+msgstr ""
+"      Este é o jeito mais rápido de clonar, mas não é sempre seguro. A\n"
+"      operação não é atômica (garantir que REPO não seja modificado\n"
+"      durante a operação é sua responsabilidade) e você deve ter\n"
+"      certeza que seu editor quebre hardlinks (o Emacs e muitos\n"
+"      utilitários do kernel Linux fazem isso). Além disso, esse modo de\n"
+"      criar um clone não é compatível com certas extensões que colocam\n"
+"      seus metadados sob o diretório hg, como a mq."
+
+msgid ""
+"      Mercurial will update the working directory to the first applicable\n"
+"      revision from this list:"
+msgstr ""
+"      O Mercurial atualizará o diretório de trabalho para a primeira revisão\n"
+"      aplicável da seguinte lista:"
+
+msgid ""
+"      a) null if -U or the source repository has no changesets\n"
+"      b) if -u . and the source repository is local, the first parent of\n"
+"         the source repository's working directory\n"
+"      c) the changeset specified with -u (if a branch name, this means the\n"
+"         latest head of that branch)\n"
+"      d) the changeset specified with -r\n"
+"      e) the tipmost head specified with -b\n"
+"      f) the tipmost head specified with the url#branch source syntax\n"
+"      g) the tipmost head of the default branch\n"
+"      h) tip"
+msgstr ""
+"      a) null, se for passada a opção -U ou se o repositório de origem não\n"
+"         tiver revisões\n"
+"      b) o primeiro pai do diretório de trabalho do repositório de origem,\n"
+"         se for passada a opção -u e o repositório de origem for local\n"
+"      c) a revisão especificada por -u (se for um nome de ramo, é a última\n"
+"         cabeça de tal ramo)\n"
+"      d) a revisão especificada com -r\n"
+"      e) a cabeça mais recente especificada com -b\n"
+"      f) a cabeça mais recente especificada com a sintaxe de origem\n"
+"         url#ramo\n"
+"      g) a cabeça mais recente do ramo default\n"
+"      h) a tip"
+
+msgid "      - clone a remote repository to a new directory named hg/::"
+msgstr ""
+"      - clona um repositório remoto para um novo diretório chamado hg/::"
+
+msgid "          hg clone http://selenic.com/hg"
+msgstr "          hg clone http://selenic.com/hg"
+
+msgid "      - create a lightweight local clone::"
+msgstr "      - cria um clone leve local::"
+
+msgid "          hg clone project/ project-feature/"
+msgstr "          hg clone project/ project-feature/"
+
+msgid ""
+"      - clone from an absolute path on an ssh server (note double-slash)::"
+msgstr ""
+"      - clona um caminho absoluto em um servidor ssh (note as barras\n"
+"        duplicadas)::"
+
+msgid "          hg clone ssh://user@server//home/projects/alpha/"
+msgstr "          hg clone ssh://user@server//home/projects/alpha/"
+
+msgid ""
+"      - do a high-speed clone over a LAN while checking out a\n"
+"        specified version::"
+msgstr ""
+"      - faz um clone em alta velocidade em uma LAN e obtém uma\n"
+"        revisão específica::"
+
+msgid "          hg clone --uncompressed http://server/repo -u 1.5"
+msgstr "          hg clone --uncompressed http://server/repo -u 1.5"
+
+msgid ""
+"      - create a repository without changesets after a particular revision::"
+msgstr ""
+"      - cria um repositório sem revisões após uma revisão em particular::"
+
+msgid "          hg clone -r 04e544 experimental/ good/"
+msgstr "          hg clone -r 04e544 experimental/ good/"
+
+msgid "      - clone (and track) a particular named branch::"
+msgstr "      - clona (e rastreia) um ramo nomeado em particular::"
+
+msgid "          hg clone http://selenic.com/hg#stable"
+msgstr "          hg clone http://selenic.com/hg#stable"
+
+msgid "    See :hg:`help urls` for details on specifying URLs."
+msgstr "    Veja :hg:`help urls` para detalhes sobre a especificação de URLs."
 
 msgid "cannot specify both --noupdate and --updaterev"
 msgstr "não se pode especificar ao mesmo tempo ---noupdate e --updaterev"
 
 msgid "mark new/missing files as added/removed before committing"
-msgstr "marca arquivos novos/ausentes como adicionados/removidos antes da consolidação"
+msgstr ""
+"marca arquivos novos/ausentes como adicionados/removidos antes da "
+"consolidação"
 
 msgid "mark a branch as closed, hiding it from the branch list"
 msgstr "marca um ramo como fechado, escondendo-o da lista de ramos"
@@ -8988,7 +9944,9 @@
 msgstr "[OPÇÃO]... [TEXTO]"
 
 msgid "builds a repo with a given DAG from scratch in the current empty repo"
-msgstr "constrói um repositório do zero com um DAG dado em um repositório vazio existente"
+msgstr ""
+"constrói um repositório do zero com um DAG dado em um repositório vazio "
+"existente"
 
 msgid ""
 "    The description of the DAG is read from stdin if not given on the\n"
@@ -9119,7 +10077,8 @@
 msgstr "[OPÇÃO]... [ARQUIVO [REVISÃO]...]"
 
 msgid "format the changelog or an index DAG as a concise textual description"
-msgstr "formata o changelog ou um índice DAG como uma representação textual concisa"
+msgstr ""
+"formata o changelog ou um índice DAG como uma representação textual concisa"
 
 msgid ""
 "    If you pass a revlog index, the revlog's DAG is emitted. If you list\n"
@@ -9248,8 +10207,9 @@
 msgid " (check that you compiled the extensions)\n"
 msgstr " (verifique se você compilou as extensões)\n"
 
-msgid "Checking templates...\n"
-msgstr "Verificando modelos...\n"
+#, python-format
+msgid "Checking templates (%s)...\n"
+msgstr "Verificando modelos (%s)...\n"
 
 msgid " (templates seem to have been installed incorrectly)\n"
 msgstr " (modelos parecem ter sido instalados incorretamente)\n"
@@ -9258,10 +10218,13 @@
 msgstr "Verificando editor para consolidação...\n"
 
 msgid " No commit editor set and can't find vi in PATH\n"
-msgstr " Nenhum editor para consolidação configurado, e não foi possível encontrar 'vi' no PATH\n"
+msgstr ""
+" Nenhum editor para consolidação configurado, e não foi possível encontrar "
+"'vi' no PATH\n"
 
 msgid " (specify a commit editor in your configuration file)\n"
-msgstr " (especifique um editor para consolidação em seu arquivo de configuração)\n"
+msgstr ""
+" (especifique um editor para consolidação em seu arquivo de configuração)\n"
 
 #, python-format
 msgid " Can't find editor '%s' in PATH\n"
@@ -9439,6 +10402,51 @@
 "    Use a opção -g/--git para gerar diffs no formato estendido\n"
 "    \"git diff\". Leia :hg:`help diffs` para mais informações."
 
+msgid ""
+"      - compare a file in the current working directory to its parent::"
+msgstr ""
+"      - compara um arquivo no diretório de trabalho atual com seu pai::"
+
+msgid "          hg diff foo.c"
+msgstr "          hg diff foo.c"
+
+msgid ""
+"      - compare two historical versions of a directory, with rename info::"
+msgstr ""
+"      - compara duas versões históricas de um diretório, com\n"
+"        informações de renomeação::"
+
+msgid "          hg diff --git -r 1.0:1.2 lib/"
+msgstr "          hg diff --git -r 1.0:1.2 lib/"
+
+msgid "      - get change stats relative to the last change on some date::"
+msgstr ""
+"      - obtém estatísticas de modificações relativas à última\n"
+"        mudança em alguma data::"
+
+msgid "          hg diff --stat -r \"date('may 2')\""
+msgstr "          hg diff --stat -r \"date('may 2')\""
+
+msgid "      - diff all newly-added files that contain a keyword::"
+msgstr ""
+"      - faz diff de todos os arquivos recém-adicionados que\n"
+"        contenham uma palavra chave::"
+
+msgid "          hg diff \"set:added() and grep(GNU)\""
+msgstr "          hg diff \"set:added() and grep(GNU)\""
+
+msgid "      - compare a revision and its parents::"
+msgstr "      - compara uma revisão com seus pais::"
+
+msgid ""
+"          hg diff -c 9353         # compare against first parent\n"
+"          hg diff -r 9353^:9353   # same using revset syntax\n"
+"          hg diff -r 9353^2:9353  # compare against the second parent"
+msgstr ""
+"          hg diff -c 9353         # compara com o primeiro pai\n"
+"          hg diff -r 9353^:9353   # o mesmo, usando sintaxe revset\n"
+"          hg diff -r 9353^2:9353  # compara com o segundo pai"
+
 msgid "diff against the second parent"
 msgstr "faz o diff com o segundo pai"
 
@@ -9491,6 +10499,7 @@
 "    :``%R``: changeset revision number\n"
 "    :``%b``: basename of the exporting repository\n"
 "    :``%h``: short-form changeset hash (12 hexadecimal digits)\n"
+"    :``%m``: first line of the commit message (only alphanumeric characters)\n"
 "    :``%n``: zero-padded sequence number, starting at 1\n"
 "    :``%r``: zero-padded changeset revision number"
 msgstr ""
@@ -9500,6 +10509,7 @@
 "    :``%R``: número de ordem da revisão\n"
 "    :``%b``: nome base do repositório onde o export é realizado\n"
 "    :``%h``: hash de forma curta da revisão (12 bytes hexadecimais)\n"
+"    :``%m``: primeira linha da mensagem de consolidação (apenas caracteres alfanuméricos)\n"
 "    :``%n``: número sequencial completado com zeros, começando em 1\n"
 "    :``%r``: número de ordem da revisão completado com zeros"
 
@@ -9526,6 +10536,36 @@
 "    Com a opção --switch-parent, o diff será feito em relação ao\n"
 "    segundo pai. Isso pode ser útil para avaliar uma mesclagem."
 
+msgid ""
+"      - use export and import to transplant a bugfix to the current\n"
+"        branch::"
+msgstr ""
+"      - usa export e import para transplantar uma correção para o ramo\n"
+"        atual::"
+
+msgid "          hg export -r 9353 | hg import -"
+msgstr "          hg export -r 9353 | hg import -"
+
+msgid ""
+"      - export all the changesets between two revisions to a file with\n"
+"        rename information::"
+msgstr ""
+"      - exporta todas as revisões entre duas revisões específicas para\n"
+"        um arquivo com informações de renomeação::"
+
+msgid "          hg export --git -r 123:150 > changes.txt"
+msgstr "          hg export --git -r 123:150 > changes.txt"
+
+msgid ""
+"      - split outgoing changes into a series of patches with\n"
+"        descriptive names::"
+msgstr ""
+"      - separa mudanças a serem enviadas em uma série de patches com\n"
+"        nomes descritivos::"
+
+msgid "          hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+msgstr "          hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+
 msgid "export requires at least one changeset"
 msgstr "export exige ao menos uma revisão"
 
@@ -9554,18 +10594,139 @@
 "    histórico do projeto, nem os apaga do diretório de trabalho."
 
 msgid "    To undo a forget before the next commit, see :hg:`add`."
-msgstr "    Para desfazer um forget antes da próxima consolidação, veja :hg:`add`."
-
-msgid "no files specified"
-msgstr "nenhum arquivo especificado"
-
-#, python-format
-msgid "not removing %s: file is already untracked\n"
-msgstr "%s não removido: arquivo já não é rastreado\n"
-
-#, python-format
-msgid "removing %s\n"
-msgstr "removendo %s\n"
+msgstr ""
+"    Para desfazer um forget antes da próxima consolidação, veja :hg:`add`."
+
+msgid "      - forget newly-added binary files::"
+msgstr "      - esquece arquivos binários recém adicionados::"
+
+msgid "          hg forget \"set:added() and binary()\""
+msgstr "          hg forget \"set:added() and binary()\""
+
+msgid "      - forget files that would be excluded by .hgignore::"
+msgstr "      - esquece arquivos que seriam excluídos por .hgignore::"
+
+msgid "          hg forget \"set:hgignore()\""
+msgstr "          hg forget \"set:hgignore()\""
+
+msgid "resume interrupted graft"
+msgstr "continua um enxerto interrompido"
+
+msgid "record the current date as commit date"
+msgstr "grava a data atual como data da consolidação"
+
+msgid "record the current user as committer"
+msgstr "grava o usuário atual como autor da consolidação"
+
+msgid "[OPTION]... REVISION..."
+msgstr "[OPÇÃO]... REVISÃO..."
+
+msgid "copy changes from other branches onto the current branch"
+msgstr "copia mudanças de outros ramos para o ramo atual"
+
+msgid ""
+"    This command uses Mercurial's merge logic to copy individual\n"
+"    changes from other branches without merging branches in the\n"
+"    history graph. This is sometimes known as 'backporting' or\n"
+"    'cherry-picking'. By default, graft will copy user, date, and\n"
+"    description from the source changesets."
+msgstr ""
+"    Este comando usa a lógica de mesclagens do Mercurial para\n"
+"    copiar mudanças individuais de outros ramos sem mesclar\n"
+"    os ramos no grafo de histórico. Isto é por vezes chamado de\n"
+"    'backporting' ou 'cherry-picking'. Por padrão, graft\n"
+"    copiará o usuário, data e descrição das revisões de\n"
+"    origem."
+
+msgid ""
+"    Changesets that are ancestors of the current revision, that have\n"
+"    already been grafted, or that are merges will be skipped."
+msgstr ""
+"    Serão omitidas revisões ancestrais da revisão atual, já\n"
+"    enxertadas ou mesclagens."
+
+msgid ""
+"    If a graft merge results in conflicts, the graft process is\n"
+"    aborted so that the current merge can be manually resolved. Once\n"
+"    all conflicts are addressed, the graft process can be continued\n"
+"    with the -c/--continue option."
+msgstr ""
+"    Se a mesclagem de enxerto resultar em conflitos, o processo de\n"
+"    enxerto será abortado para que a mesclagem atual possa ser\n"
+"    resolvida manualmente. Uma vez que todos os conflitos estejam\n"
+"    resolvidos, o processo de enxerto pode ser retomado usando a\n"
+"    opção -c/--continue."
+
+msgid ""
+"    .. note::\n"
+"      The -c/--continue option does not reapply earlier options."
+msgstr ""
+"    .. note::\n"
+"      A opção -c/--continue não reaplica opções anteriores."
+
+msgid ""
+"      - copy a single change to the stable branch and edit its description::"
+msgstr ""
+"      - copia uma única mudança para o ramo stable e edita sua descrição::"
+
+msgid ""
+"          hg update stable\n"
+"          hg graft --edit 9393"
+msgstr ""
+"          hg update stable\n"
+"          hg graft --edit 9393"
+
+msgid ""
+"      - graft a range of changesets with one exception, updating dates::"
+msgstr ""
+"      - enxerta uma faixa de revisões com uma exceção, atualizando as "
+"datas::"
+
+msgid "          hg graft -D \"2085::2093 and not 2091\""
+msgstr "          hg graft -D \"2085::2093 and not 2091\""
+
+msgid "      - continue a graft after resolving conflicts::"
+msgstr "      - continua um processo de enxerto após resolver conflitos::"
+
+msgid "          hg graft -c"
+msgstr "          hg graft -c"
+
+msgid "      - show the source of a grafted changeset::"
+msgstr "      - mostra a origem de uma revisão enxertada::"
+
+msgid "          hg log --debug -r tip"
+msgstr "          hg log --debug -r tip"
+
+msgid ""
+"    Returns 0 on successful completion.\n"
+"    "
+msgstr ""
+"    Devolve 0 para indicar sucesso.\n"
+"    "
+
+msgid "can't specify --continue and revisions"
+msgstr "não é possível especificar --continue e revisões"
+
+msgid "no graft state found, can't continue"
+msgstr "estado de graft não encontrado, não é possível continuar"
+
+#, python-format
+msgid "skipping ungraftable merge revision %s\n"
+msgstr "omitindo revisão de mesclagem %s que não pode ser enxertada\n"
+
+#, python-format
+msgid "skipping ancestor revision %s\n"
+msgstr "omitindo revisão ancestral %s\n"
+
+#, python-format
+msgid "skipping already grafted revision %s\n"
+msgstr "omitindo revisão %s já enxertada\n"
+
+msgid "unresolved conflicts, can't continue"
+msgstr "conflitos não resolvidos, não é possível continuar"
+
+msgid "use hg resolve and hg graft --continue"
+msgstr "use hg resolve e hg graft --continue"
 
 msgid "end fields with NUL"
 msgstr "termina campos com NUL"
@@ -9574,7 +10735,9 @@
 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"
+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"
@@ -9729,7 +10892,8 @@
 msgid "show help for a given topic or a help overview"
 msgstr "exibe o texto de ajuda geral ou de um tópico pedido"
 
-msgid "    With no arguments, print a list of commands with short help messages."
+msgid ""
+"    With no arguments, print a list of commands with short help messages."
 msgstr ""
 "    Sem argumentos, imprime uma lista de comandos com textos curtos\n"
 "    de ajuda."
@@ -9748,6 +10912,19 @@
 "    Devolve 0 para indicar sucesso.\n"
 "    "
 
+msgid "VALUE"
+msgstr "VALOR"
+
+msgid "DEPRECATED"
+msgstr "OBSOLETO"
+
+msgid ""
+"\n"
+"[+] marked option can be specified multiple times\n"
+msgstr ""
+"\n"
+"opções marcadas com [+] podem ser especificadas múltiplas vezes\n"
+
 msgid "global options:"
 msgstr "opções globais:"
 
@@ -9763,14 +10940,13 @@
 
 #, python-format
 msgid "use \"hg -v help%s\" to show builtin aliases and global options"
-msgstr "use \"hg -v help%s\" para mostrar apelidos pré-definidos de comandos e opções globais"
-
-#, python-format
-msgid "use \"hg -v help %s\" to show global options"
-msgstr "use \"hg -v help %s\" para mostrar opções globais"
-
-msgid "list of commands:"
-msgstr "lista de comandos:"
+msgstr ""
+"use \"hg -v help%s\" para mostrar apelidos pré-definidos de comandos e "
+"opções globais"
+
+#, python-format
+msgid "use \"hg -v help %s\" to show more info"
+msgstr "use \"hg -v help %s\" para mostrar mais informações"
 
 #, python-format
 msgid ""
@@ -9800,23 +10976,44 @@
 msgstr "%s"
 
 #, python-format
-msgid ""
-"\n"
-"use \"hg -v help %s\" to show verbose help\n"
-msgstr ""
-"\n"
-"use \"hg -v help %s\" para mostrar ajuda verbosa\n"
-
-msgid "options:\n"
-msgstr "opções:\n"
-
-#, python-format
 msgid "use \"hg help -e %s\" to show help for the %s extension"
 msgstr "use \"hg help -e %s\" para mostrar a ajuda para a extensão %s"
 
+#, python-format
+msgid ""
+"\n"
+"use \"hg help %s\" to show the full help text\n"
+msgstr ""
+"\n"
+"use \"hg help %s\" para mostrar o texto completo de ajuda\n"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show more info\n"
+msgstr ""
+"\n"
+"use \"hg -v help %s\" para mostrar mais informações\n"
+
+msgid "basic commands:"
+msgstr "comandos básicos:"
+
+msgid "list of commands:"
+msgstr "lista de comandos:"
+
 msgid "no commands defined\n"
 msgstr "nenhum comando definido\n"
 
+msgid "enabled extensions:"
+msgstr "extensões habilitadas:"
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"tópicos adicionais de ajuda:"
+
 #, python-format
 msgid ""
 "\n"
@@ -9833,7 +11030,8 @@
 msgstr "extensão %s - %s"
 
 msgid "use \"hg help extensions\" for information on enabling extensions\n"
-msgstr "use \"hg help extensions\" para informações sobre como habilitar extensões\n"
+msgstr ""
+"use \"hg help extensions\" para informações sobre como habilitar extensões\n"
 
 #, python-format
 msgid "'%s' is provided by the following extension:"
@@ -9842,32 +11040,6 @@
 msgid "Mercurial Distributed SCM\n"
 msgstr "Sistema de controle de versão distribuído Mercurial\n"
 
-msgid "basic commands:"
-msgstr "comandos básicos:"
-
-msgid "enabled extensions:"
-msgstr "extensões habilitadas:"
-
-msgid "VALUE"
-msgstr "VALOR"
-
-msgid "DEPRECATED"
-msgstr "OBSOLETO"
-
-msgid ""
-"\n"
-"[+] marked option can be specified multiple times"
-msgstr ""
-"\n"
-"opções marcadas com [+] podem ser especificadas múltiplas vezes"
-
-msgid ""
-"\n"
-"additional help topics:"
-msgstr ""
-"\n"
-"tópicos adicionais de ajuda:"
-
 msgid "identify the specified revision"
 msgstr "identifica a revisão especificada"
 
@@ -9919,11 +11091,34 @@
 "    arquivo bundle do Mercurial faz com que a busca opere em tal\n"
 "    repositório ou bundle."
 
+msgid "      - generate a build identifier for the working directory::"
+msgstr "      - gera um identificador de build para o diretório de trabalho::"
+
+msgid "          hg id --id > build-id.dat"
+msgstr "          hg id --id > build-id.dat"
+
+msgid "      - find the revision corresponding to a tag::"
+msgstr "      - encontra a revisão que corresponde a uma etiqueta::"
+
+msgid "          hg id -n -r 1.3"
+msgstr "          hg id -n -r 1.3"
+
+msgid "      - check the most recent revision of a remote repository::"
+msgstr "      - verifica a revisão mais recente de um repositório remoto::"
+
+msgid "          hg id -r tip http://selenic.com/hg/"
+msgstr "          hg id -r tip http://selenic.com/hg/"
+
 msgid "can't query remote revision number, branch, or tags"
-msgstr "não é possível consultar o número de revisão, ramo ou etiquetas remotos"
-
-msgid "directory strip option for patch. This has the same meaning as the corresponding patch option"
-msgstr "opção de remoção de diretório para o patch. Tem o mesmo significado da opção correspondente do utilitário patch"
+msgstr ""
+"não é possível consultar o número de revisão, ramo ou etiquetas remotos"
+
+msgid ""
+"directory strip option for patch. This has the same meaning as the "
+"corresponding patch option"
+msgstr ""
+"opção de remoção de diretório para o patch. Tem o mesmo significado da opção"
+" correspondente do utilitário patch"
 
 msgid "PATH"
 msgstr "CAMINHO"
@@ -10035,6 +11230,39 @@
 "    para -d/--date.\n"
 "    "
 
+msgid "      - import a traditional patch from a website and detect renames::"
+msgstr ""
+"      - importa um patch traditional de um servidor web e detecta\n"
+"        renomeações::"
+
+msgid "          hg import -s 80 http://example.com/bugfix.patch"
+msgstr "          hg import -s 80 http://example.com/bugfix.patch"
+
+msgid "      - import a changeset from an hgweb server::"
+msgstr "      - importa uma revisão de um servidor hgweb::"
+
+msgid "          hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+msgstr "          hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+
+msgid "      - import all the patches in an Unix-style mbox::"
+msgstr "      - importa todos os patches em uma mbox estilo Unix::"
+
+msgid "          hg import incoming-patches.mbox"
+msgstr "          hg import incoming-patches.mbox"
+
+msgid ""
+"      - attempt to exactly restore an exported changeset (not always\n"
+"        possible)::"
+msgstr ""
+"      - tenta restaurar com exatidão uma revisão exportada (nem sempre\n"
+"        possível)::"
+
+msgid "          hg import --exact proposed-fix.patch"
+msgstr "          hg import --exact proposed-fix.patch"
+
+msgid "need at least one patch to import"
+msgstr "é necessário ao menos um nome de patch para importar"
+
 msgid "cannot use --no-commit with --bypass"
 msgstr "não se pode usar --no-commit com --bypass"
 
@@ -10044,21 +11272,23 @@
 msgid "patch is damaged or loses information"
 msgstr "o patch está danificado ou perde informação"
 
-msgid "to working directory"
-msgstr "para o diretório de trabalho"
+msgid "applied to working directory"
+msgstr "aplicado no diretório de trabalho"
 
 msgid "not a Mercurial patch"
 msgstr "não é um patch do Mercurial"
 
+#. i18n: refers to a short changeset id
+#, python-format
+msgid "created %s"
+msgstr "revisão %s criada"
+
 msgid "applying patch from stdin\n"
 msgstr "aplicando patch da entrada padrão\n"
 
 #, python-format
-msgid "applied %s\n"
-msgstr "aplicado %s\n"
-
-msgid "no diffs found"
-msgstr "nenhum diff encontrado"
+msgid "%s: no diffs found"
+msgstr "%s: nenhum diff encontrado"
 
 msgid "run even if remote repository is unrelated"
 msgstr "execute mesmo se o repositório remoto não for relacionado"
@@ -10239,30 +11469,25 @@
 "    projeto como um todo."
 
 msgid ""
+"    If no revision range is specified, the default is ``tip:0`` unless\n"
+"    --follow is set, in which case the working directory parent is\n"
+"    used as the starting revision."
+msgstr ""
+"    Se um intervalo de revisões não for pedido, o padrão é ``tip:0``,\n"
+"    a não ser que --follow seja pedido; nesse caso, o pai do\n"
+"    diretório de trabalho será usado como revisão inicial."
+
+msgid ""
 "    File history is shown without following rename or copy history of\n"
 "    files. Use -f/--follow with a filename to follow history across\n"
 "    renames and copies. --follow without a filename will only show\n"
-"    ancestors or descendants of the starting revision. --follow-first\n"
-"    only follows the first parent of merge revisions."
+"    ancestors or descendants of the starting revision."
 msgstr ""
 "    O histórico de arquivos é mostrado sem que informações de cópia e\n"
 "    renomeação sejam seguidas. Use -f/--follow para seguir o\n"
 "    histórico através de renomeações e cópias. --follow sem um nome\n"
 "    de arquivo irá mostrar apenas ancestrais ou descendentes da\n"
-"    revisão de início. --follow-first segue apenas o primeiro pai em\n"
-"    revisões de mesclagem."
-
-msgid ""
-"    If no revision range is specified, the default is ``tip:0`` unless\n"
-"    --follow is set, in which case the working directory parent is\n"
-"    used as the starting revision. You can specify a revision set for\n"
-"    log, see :hg:`help revsets` for more information."
-msgstr ""
-"    Se um intervalo de revisões não for pedido, o padrão é ``tip:0``,\n"
-"    a não ser que --follow seja pedido; nesse caso, o pai do\n"
-"    diretório de trabalho será usado como revisão inicial. Você\n"
-"    também pode especificar um conjunto de revisões: veja\n"
-"    :hg:`help revsets` para mais informações."
+"    revisão de início."
 
 msgid ""
 "    By default this command prints revision number and changeset id,\n"
@@ -10289,6 +11514,92 @@
 "       com seu primeiro pai. Além disso, apenas arquivos diferentes\n"
 "       de AMBOS os pais aparecerão na lista de arquivos."
 
+msgid ""
+"    .. note::\n"
+"       for performance reasons, log FILE may omit duplicate changes\n"
+"       made on branches and will not show deletions. To see all\n"
+"       changes including duplicates and deletions, use the --removed\n"
+"       switch."
+msgstr ""
+"    .. note::\n"
+"       por razões de desempenho, log ARQUIVO pode omitir mudanças\n"
+"       duplicadas feitas em outros ramos, e não mostra remoções.\n"
+"       Para ver todas as mudanças incluindo duplicatas e remoções,\n"
+"       use a opção --removed."
+
+msgid "      - changesets with full descriptions and file lists::"
+msgstr "      - revisões com descrições completas e lista de arquivos::"
+
+msgid "          hg log -v"
+msgstr "          hg log -v"
+
+msgid "      - changesets ancestral to the working directory::"
+msgstr "      - revisões ancestrais do diretório de trabalho::"
+
+msgid "          hg log -f"
+msgstr "          hg log -f"
+
+msgid "      - last 10 commits on the current branch::"
+msgstr "      - últimas 10 revisões no ramo atual::"
+
+msgid "          hg log -l 10 -b ."
+msgstr "          hg log -l 10 -b ."
+
+msgid ""
+"      - changesets showing all modifications of a file, including removals::"
+msgstr ""
+"      - revisões mostrando todas as modificações feitas em um\n"
+"        arquivo, incluindo remoções::"
+
+msgid "          hg log --removed file.c"
+msgstr "          hg log --removed file.c"
+
+msgid ""
+"      - all changesets that touch a directory, with diffs, excluding "
+"merges::"
+msgstr ""
+"      - todas as revisões que modificam um diretório, com diffs,\n"
+"        excluindo mesclagens::"
+
+msgid "          hg log -Mp lib/"
+msgstr "          hg log -Mp lib/"
+
+msgid "      - all revision numbers that match a keyword::"
+msgstr ""
+"      - todos os números de revisões que combinarem com uma palavra chave::"
+
+msgid "          hg log -k bug --template \"{rev}\\n\""
+msgstr "          hg log -k bug --template \"{rev}\\n\""
+
+msgid "      - check if a given changeset is included is a tagged release::"
+msgstr ""
+"      - verifica se uma revisão dada foi incluída em um\n"
+"        release etiquetado::"
+
+msgid "          hg log -r \"a21ccf and ancestor(1.9)\""
+msgstr "          hg log -r \"a21ccf and ancestor(1.9)\""
+
+msgid "      - find all changesets by some user in a date range::"
+msgstr ""
+"      - encontra todas as revisões feitas por um usuário em\n"
+"        uma faixa de datas::"
+
+msgid "          hg log -k alice -d \"may 2008 to jul 2008\""
+msgstr "          hg log -k alice -d \"may 2008 to jul 2008\""
+
+msgid "      - summary of all changesets after the last tag::"
+msgstr "      - sumário de todas as revisões após a última etiqueta::"
+
+msgid "          hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+msgstr "          hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+
+msgid ""
+"    See :hg:`help revisions` and :hg:`help revsets` for more about\n"
+"    specifying revisions."
+msgstr ""
+"    Veja :hg:`help revisions` e :hg:`help revsets` para mais\n"
+"    informações sobre a especificação de revisões."
+
 msgid "revision to display"
 msgstr "revisão a ser exibida"
 
@@ -10386,7 +11697,8 @@
 "    explicitamente."
 
 msgid "    :hg:`resolve` must be used to resolve unresolved files."
-msgstr "    :hg:`resolve` deve ser usado para resolver arquivos não resolvidos."
+msgstr ""
+"    :hg:`resolve` deve ser usado para resolver arquivos não resolvidos."
 
 msgid ""
 "    To undo an uncommitted merge, use :hg:`update --clean .` which\n"
@@ -10406,14 +11718,17 @@
 
 #, python-format
 msgid "branch '%s' has %d heads - please merge with an explicit rev"
-msgstr "o ramo '%s' tem %d cabeças - por favor mescle com uma revisão explícita"
+msgstr ""
+"o ramo '%s' tem %d cabeças - por favor mescle com uma revisão explícita"
 
 msgid "run 'hg heads .' to see heads"
 msgstr "execute 'hg heads .' para ver as cabeças"
 
 #, python-format
 msgid "branch '%s' has one head - please merge with an explicit rev"
-msgstr "o ramo '%s' tem apenas uma cabeça - por favor mescle com uma revisão explícita"
+msgstr ""
+"o ramo '%s' tem apenas uma cabeça - por favor mescle com uma revisão "
+"explícita"
 
 msgid "run 'hg heads' to see all heads"
 msgstr "execute 'hg heads' para ver todas as cabeças"
@@ -10628,8 +11943,12 @@
 msgid "remote bookmark %s not found!"
 msgstr "marcador remoto %s não encontrado!"
 
-msgid "other repository doesn't support revision lookup, so a rev cannot be specified."
-msgstr "o outro repositório não suporta busca por revisão, portanto uma revisão não pode ser especificada."
+msgid ""
+"other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+"o outro repositório não suporta busca por revisão, portanto uma revisão não "
+"pode ser especificada."
 
 #, python-format
 msgid "importing bookmark %s\n"
@@ -10765,64 +12084,70 @@
 msgid "remove the specified files on the next commit"
 msgstr "remove os arquivos pedidos na próxima consolidação"
 
-msgid "    Schedule the indicated files for removal from the repository."
-msgstr "    Agenda os arquivos indicados para remoção do repositório."
-
-msgid ""
-"    This only removes files from the current branch, not from the\n"
-"    entire project history. -A/--after can be used to remove only\n"
-"    files that have already been deleted, -f/--force can be used to\n"
-"    force deletion, and -Af can be used to remove files from the next\n"
-"    revision without deleting them from the working directory."
-msgstr ""
-"    Isto apenas remove arquivos do ramo atual, e não de todo o\n"
-"    histórico do projeto. -A/--after pode ser usado para remover\n"
+msgid "    Schedule the indicated files for removal from the current branch."
+msgstr "    Agenda os arquivos indicados para remoção do ramo atual."
+
+msgid ""
+"    This command schedules the files to be removed at the next commit.\n"
+"    To undo a remove before that, see :hg:`revert`. To undo added\n"
+"    files, see :hg:`forget`."
+msgstr ""
+"    Este comando agenda os arquivos para serem removidos na próxima\n"
+"    consolidação. Para desfazer uma remoção antes disso, veja\n"
+"    :hg:`revert`. Para desfazer uma adição de arquivos, veja\n"
+"    :hg:`forget`."
+
+msgid ""
+"      -A/--after can be used to remove only files that have already\n"
+"      been deleted, -f/--force can be used to force deletion, and -Af\n"
+"      can be used to remove files from the next revision without\n"
+"      deleting them from the working directory."
+msgstr ""
+"    -A/--after pode ser usado para remover\n"
 "    apenas arquivos já removidos do diretório de trabalho,\n"
 "    -f/--force pode ser usado para forçar a remoção, e -Af pode ser\n"
 "    usado para remover os arquivos da próxima revisão sem removê-los\n"
 "    do diretório de trabalho."
 
 msgid ""
-"    The following table details the behavior of remove for different\n"
-"    file states (columns) and option combinations (rows). The file\n"
-"    states are Added [A], Clean [C], Modified [M] and Missing [!] (as\n"
-"    reported by :hg:`status`). The actions are Warn, Remove (from\n"
-"    branch) and Delete (from disk)::"
-msgstr ""
-"    A seguinte tabela detalha o comportamento do comando remove para\n"
-"    diferentes estados dos arquivos (colunas) e combinações de opções\n"
-"    (linhas). Os estados dos arquivos são: adicionados [A],\n"
-"    limpos [C], modificados [M] ou faltando [!] (conforme informado\n"
-"    por :hg:`status`). As ações são W (aviso), R (remove do ramo) e D\n"
-"    (remove do diretório de trabalho)::"
-
-msgid ""
-"             A  C  M  !\n"
-"      none   W  RD W  R\n"
-"      -f     R  RD RD R\n"
-"      -A     W  W  W  R\n"
-"      -Af    R  R  R  R"
-msgstr ""
-"             A  C  M  !\n"
-"      none   W  RD W  R\n"
-"      -f     R  RD RD R\n"
-"      -A     W  W  W  R\n"
-"      -Af    R  R  R  R"
-
-msgid ""
-"    Note that remove never deletes files in Added [A] state from the\n"
-"    working directory, not even if option --force is specified."
-msgstr ""
-"    Note que remove nunca apaga do diretório de trabalho arquivos no\n"
-"    estado adicionado [A], nem mesmo se a opção --force for especificada."
-
-msgid ""
-"    This command schedules the files to be removed at the next commit.\n"
-"    To undo a remove before that, see :hg:`revert`."
-msgstr ""
-"    Este comando agenda os arquivos para serem removidos na próxima\n"
-"    consolidação. Para desfazer uma remoção antes disso, veja\n"
-"    :hg:`revert`."
+"      The following table details the behavior of remove for different\n"
+"      file states (columns) and option combinations (rows). The file\n"
+"      states are Added [A], Clean [C], Modified [M] and Missing [!]\n"
+"      (as reported by :hg:`status`). The actions are Warn, Remove\n"
+"      (from branch) and Delete (from disk):"
+msgstr ""
+"      A seguinte tabela detalha o comportamento do comando remove para\n"
+"      diferentes estados dos arquivos (colunas) e combinações de opções\n"
+"      (linhas). Os estados dos arquivos são: adicionados [A],\n"
+"      limpos [C], modificados [M] ou faltando [!] (conforme informado\n"
+"      por :hg:`status`). As ações são W (aviso), R (remove do ramo) e D\n"
+"      (remove do diretório de trabalho):"
+
+msgid ""
+"      ======= == == == ==\n"
+"              A  C  M  !\n"
+"      ======= == == == ==\n"
+"      none    W  RD W  R\n"
+"      -f      R  RD RD R\n"
+"      -A      W  W  W  R\n"
+"      -Af     R  R  R  R\n"
+"      ======= == == == =="
+msgstr ""
+"      ======= == == == ==\n"
+"              A  C  M  !\n"
+"      ======= == == == ==\n"
+"      nenhum  W  RD W  R\n"
+"      -f      R  RD RD R\n"
+"      -A      W  W  W  R\n"
+"      -Af     R  R  R  R\n"
+"      ======= == == == =="
+
+msgid ""
+"      Note that remove never deletes files in Added [A] state from the\n"
+"      working directory, not even if option --force is specified."
+msgstr ""
+"      Note que remove nunca apaga do diretório de trabalho arquivos no\n"
+"      estado adicionado [A], nem mesmo se a opção --force for especificada."
 
 msgid ""
 "    Returns 0 on success, 1 if any warnings encountered.\n"
@@ -10837,15 +12162,19 @@
 
 #, python-format
 msgid "not removing %s: file still exists (use -f to force removal)\n"
-msgstr "%s não removido: o arquivo ainda existe (use -f para forçar a remoção)\n"
+msgstr ""
+"%s não removido: o arquivo ainda existe (use -f para forçar a remoção)\n"
 
 #, python-format
 msgid "not removing %s: file is modified (use -f to force removal)\n"
-msgstr "%s não removido: o arquivo foi modificado (use -f para forçar a remoção)\n"
-
-#, python-format
-msgid "not removing %s: file has been marked for add (use -f to force removal)\n"
-msgstr "%s não removido: o arquivo foi marcado para adição (use -f para forçar a remoção)\n"
+msgstr ""
+"%s não removido: o arquivo foi modificado (use -f para forçar a remoção)\n"
+
+#, python-format
+msgid "not removing %s: file has been marked for add (use forget to undo)\n"
+msgstr ""
+"%s não removido: o arquivo foi marcado para adição (use forget para "
+"desfazer)\n"
 
 msgid "record a rename that has already occurred"
 msgstr "grava uma renomeação que já ocorreu"
@@ -10916,7 +12245,8 @@
 "      performed for files already marked as resolved. Use ``--all/-a``\n"
 "      to select all unresolved files. ``--tool`` can be used to specify\n"
 "      the merge tool used for the given files. It overrides the HGMERGE\n"
-"      environment variable and your configuration files."
+"      environment variable and your configuration files.  Previous file\n"
+"      contents are saved with a ``.orig`` suffix."
 msgstr ""
 "    - :hg:`resolve [--tool] ARQUIVO...`: tenta refazer a mesclagem\n"
 "      dos arquivos especificados, descartando qualquer tentativa de\n"
@@ -10925,7 +12255,9 @@
 "      indicar todos os arquivos não resolvidos. ``--tool`` pode ser\n"
 "      usado para especificar o utilitário de mesclagem usado para os\n"
 "      arquivos pedidos. Esta opção sobrepõe a variável de ambiente\n"
-"      HGMERGE e os valores especificados nos arquivos de configuração."
+"      HGMERGE e os valores especificados nos arquivos de configuração.\n"
+"      Os conteúdos anteriores dos arquivos são gravados usando um\n"
+"      sufixo ``.orig``."
 
 msgid ""
 "    - :hg:`resolve -m [FILE]`: mark a file as having been resolved\n"
@@ -10976,7 +12308,9 @@
 msgstr "não é possível especificar --all e padrões"
 
 msgid "no files or directories specified; use --all to remerge all files"
-msgstr "nenhum arquivo ou diretório especificado; use --all para refazer a mesclagem de todos os arquivos"
+msgstr ""
+"nenhum arquivo ou diretório especificado; use --all para refazer a mesclagem"
+" de todos os arquivos"
 
 msgid "revert all changes when no arguments given"
 msgstr "se parâmetros não forem fornecidos, reverte todas as mudanças"
@@ -10994,7 +12328,8 @@
 msgstr "[OPÇÃO]... [-r REV] [NOME]..."
 
 msgid "restore files to their checkout state"
-msgstr "restaura arquivos para o estado correspondente a uma cópia de trabalho"
+msgstr ""
+"restaura arquivos para o estado correspondente a uma cópia de trabalho"
 
 msgid ""
 "    .. note::\n"
@@ -11055,19 +12390,30 @@
 msgid "no files or directories specified"
 msgstr "nenhum arquivo ou diretório especificados"
 
-msgid "uncommitted merge, use --all to discard all changes, or 'hg update -C .' to abort the merge"
-msgstr "mesclagem não consolidada, use --all para descartar todas as mudanças locais, ou 'hg update -C .' para abortar a mesclagem"
-
-#, python-format
-msgid "uncommitted changes, use --all to discard all changes, or 'hg update %s' to update"
-msgstr "mudanças não consolidadas, use --all para descartar todas as mudanças locais, ou 'hg update %s' para atualizar"
+msgid ""
+"uncommitted merge, use --all to discard all changes, or 'hg update -C .' to "
+"abort the merge"
+msgstr ""
+"mesclagem não consolidada, use --all para descartar todas as mudanças "
+"locais, ou 'hg update -C .' para abortar a mesclagem"
+
+#, python-format
+msgid ""
+"uncommitted changes, use --all to discard all changes, or 'hg update %s' to "
+"update"
+msgstr ""
+"mudanças não consolidadas, use --all para descartar todas as mudanças "
+"locais, ou 'hg update %s' para atualizar"
 
 #, python-format
 msgid "use --all to revert all files, or 'hg update %s' to update"
-msgstr "use --all para reverter todos os arquivos, ou 'hg update %s' para atualizar a revisão"
+msgstr ""
+"use --all para reverter todos os arquivos, ou 'hg update %s' para atualizar "
+"a revisão"
 
 msgid "uncommitted changes, use --all to discard all changes"
-msgstr "mudanças não consolidadas, use --all para descartar todas as mudanças locais"
+msgstr ""
+"mudanças não consolidadas, use --all para descartar todas as mudanças locais"
 
 msgid "use --all to revert all files"
 msgstr "use --all para reverter todos os arquivos"
@@ -11096,6 +12442,9 @@
 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"
+
 msgid "roll back the last transaction (dangerous)"
 msgstr "desfaz a última transação (perigoso)"
 
@@ -11137,6 +12486,19 @@
 "    - unbundle"
 
 msgid ""
+"    It's possible to lose data with rollback: commit, update back to\n"
+"    an older changeset, and then rollback. The update removes the\n"
+"    changes you committed from the working directory, and rollback\n"
+"    removes them from history. To avoid data loss, you must pass\n"
+"    --force in this case."
+msgstr ""
+"    É possível perder dados com o comando rollback: se for feito um\n"
+"    commit, update para uma revisão antiga, e em seguida rollback.\n"
+"    O update remove as mudanças recém gravadas na última consolidação,\n"
+"    e o rollback as remove do histórico. Para evitar perda de dados,\n"
+"    você deve passar --force neste caso."
+
+msgid ""
 "    This command is not intended for use on public repositories. Once\n"
 "    changes are visible for pull by other users, rolling a transaction\n"
 "    back locally is ineffective (someone else may already have pulled\n"
@@ -11412,6 +12774,28 @@
 "      I = ignorado\n"
 "        = origem do arquivo anterior listado como A (adicionado)"
 
+msgid "      - show changes in the working directory relative to a changeset:"
+msgstr ""
+"      - mostra mudanças no diretório de trabalho relativs a uma revisão:"
+
+msgid "          hg status --rev 9353"
+msgstr "          hg status --rev 9353"
+
+msgid "      - show all changes including copies in an existing changeset::"
+msgstr ""
+"      - mostra todas as mudanças incluindo cópias em uma revisão existente::"
+
+msgid "          hg status --copies --change 9353"
+msgstr "          hg status --copies --change 9353"
+
+msgid "      - get a NUL separated list of added files, suitable for xargs::"
+msgstr ""
+"      - gera uma lista separada por NUL de arquivos adicionados,\n"
+"        adequada para o comando xargs::"
+
+msgid "          hg status -an0"
+msgstr "          hg status -an0"
+
 msgid "check for push and pull"
 msgstr "verifica push e pull"
 
@@ -11447,6 +12831,9 @@
 msgid "branch: %s\n"
 msgstr "ramo: %s\n"
 
+msgid "bookmarks:"
+msgstr "marcadores:"
+
 #, python-format
 msgid "%d modified"
 msgstr "%d modificados"
@@ -11689,7 +13076,8 @@
 "    revisão."
 
 msgid "update to new branch head if changesets were unbundled"
-msgstr "atualiza para nova cabeça de ramo se revisões forem extraídas do bundle"
+msgstr ""
+"atualiza para nova cabeça de ramo se revisões forem extraídas do bundle"
 
 msgid "[-u] FILE..."
 msgstr "[-u] ARQUIVO..."
@@ -11810,9 +13198,6 @@
 msgid "cannot specify both -c/--check and -C/--clean"
 msgstr "não se pode especificar ao mesmo tempo -c/--check e -C/--clean"
 
-msgid "uncommitted local changes"
-msgstr "alterações locais pendentes"
-
 msgid "verify the integrity of the repository"
 msgstr "verifica a integridade do repositório"
 
@@ -11886,7 +13271,9 @@
 
 #, python-format
 msgid "%s not added: only files and symlinks supported currently\n"
-msgstr "%s não adicionado: apenas arquivos e links simbólicos suportados no momento\n"
+msgstr ""
+"%s não adicionado: apenas arquivos e links simbólicos suportados no "
+"momento\n"
 
 #, python-format
 msgid "%s already tracked!\n"
@@ -12001,7 +13388,9 @@
 msgstr "hg: erro de análise da entrada: %s\n"
 
 msgid "entering debugger - type c to continue starting hg or h for help\n"
-msgstr "entrando no depurador - digite c para continuar iniciando o hg ou h para ajuda\n"
+msgstr ""
+"entrando no depurador - digite c para continuar iniciando o hg ou h para "
+"ajuda\n"
 
 #, python-format
 msgid ""
@@ -12080,7 +13469,9 @@
 msgstr "abortado: sem memória\n"
 
 msgid "** unknown exception encountered, please report by visiting\n"
-msgstr "** exceção desconhecida encontrada, por favor informe sobre esse erro visitando\n"
+msgstr ""
+"** exceção desconhecida encontrada, por favor informe sobre esse erro "
+"visitando\n"
 
 msgid "**  http://mercurial.selenic.com/wiki/BugTracker\n"
 msgstr "**  http://mercurial.selenic.com/wiki/BugTracker\n"
@@ -12102,8 +13493,12 @@
 msgstr "nenhuma definição para o apelido '%s'\n"
 
 #, python-format
-msgid "error in definition for alias '%s': %s may only be given on the command line\n"
-msgstr "erro na definição do apelido '%s': %s pode ser passado apenas na linha de comando\n"
+msgid ""
+"error in definition for alias '%s': %s may only be given on the command "
+"line\n"
+msgstr ""
+"erro na definição do apelido '%s': %s pode ser passado apenas na linha de "
+"comando\n"
 
 #, python-format
 msgid "alias '%s' resolves to unknown command '%s'\n"
@@ -12131,8 +13526,12 @@
 msgid "option --cwd may not be abbreviated!"
 msgstr "a opção --cwd não pode ser abreviada!"
 
-msgid "Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!"
-msgstr "A opção -R deve ser separada de outras opções (por exemplo, não usar -qR) e --repository pode ser abreviada apenas como --repo!"
+msgid ""
+"Option -R has to be separated from other options (e.g. not -qR) and "
+"--repository may only be abbreviated as --repo!"
+msgstr ""
+"A opção -R deve ser separada de outras opções (por exemplo, não usar -qR) e "
+"--repository pode ser abreviada apenas como --repo!"
 
 #, python-format
 msgid "Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
@@ -12153,8 +13552,12 @@
 msgid "unrecognized profiling format '%s' - Ignored\n"
 msgstr "formato de profiling '%s' não reconhecido - Ignorado\n"
 
-msgid "lsprof not available - install from http://codespeak.net/svn/user/arigo/hack/misc/lsprof/"
-msgstr "lsprof não disponível - instale de http://codespeak.net/svn/user/arigo/hack/misc/lsprof/"
+msgid ""
+"lsprof not available - install from "
+"http://codespeak.net/svn/user/arigo/hack/misc/lsprof/"
+msgstr ""
+"lsprof não disponível - instale de "
+"http://codespeak.net/svn/user/arigo/hack/misc/lsprof/"
 
 #, python-format
 msgid "*** failed to import extension %s from %s: %s\n"
@@ -12192,20 +13595,6 @@
 " nenhuma ferramenta encontrada para mesclar %s\n"
 "manter (l)ocal ou usar (o)utro?"
 
-msgid "&Local"
-msgstr "&Local"
-
-msgid "&Other"
-msgstr "&Outra"
-
-#, python-format
-msgid "merging %s and %s to %s\n"
-msgstr "mesclando %s e %s para %s\n"
-
-#, python-format
-msgid "merging %s\n"
-msgstr "mesclando %s\n"
-
 #, 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)"
@@ -12470,6 +13859,33 @@
 msgid "unknown bisect kind %s"
 msgstr "tipo desconhecido de bisect %s"
 
+msgid "invalid bisect state"
+msgstr "estado de bisecção inválido"
+
+#. i18n: bisect changeset status
+msgid "good"
+msgstr "boa"
+
+#. i18n: bisect changeset status
+msgid "bad"
+msgstr "ruim"
+
+#. i18n: bisect changeset status
+msgid "skipped"
+msgstr "omitida"
+
+#. i18n: bisect changeset status
+msgid "untested"
+msgstr "não testada"
+
+#. i18n: bisect changeset status
+msgid "good (implicit)"
+msgstr "boa (implicitamente)"
+
+#. i18n: bisect changeset status
+msgid "bad (implicit)"
+msgstr "ruim (implicitamente)"
+
 msgid "disabled extensions:"
 msgstr "extensões desabilitadas:"
 
@@ -13021,6 +14437,15 @@
 "acima, ``$HG_ARGS`` expandiria para ``echo foo``."
 
 msgid ""
+".. note:: Some global configuration options such as ``-R`` are\n"
+"   processed before shell aliases and will thus not be passed to\n"
+"   aliases."
+msgstr ""
+".. note:: Algumas opções globais de configuração, como ``-R``,\n"
+"   são procesadas antes de apelidos de shell, e portanto não serão\n"
+"   passadas para os apelidos."
+
+msgid ""
 "``auth``\n"
 "\"\"\"\"\"\"\"\""
 msgstr ""
@@ -13601,7 +15026,8 @@
 "    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."
+msgstr ""
+"Esta funcionalidade só é suportada nas versões do Python 2.6 ou posteriores."
 
 msgid ""
 "\n"
@@ -14644,7 +16070,8 @@
 "\"\"\"\"\"\"\"\"\"\"\"\""
 
 msgid "Defines subrepositories source locations rewriting rules of the form::"
-msgstr "Define regras de reescrita de localização de subrepositórios da forma::"
+msgstr ""
+"Define regras de reescrita de localização de subrepositórios da forma::"
 
 msgid "    <pattern> = <replacement>"
 msgstr "    <padrao> = <substituicao>"
@@ -14767,14 +16194,14 @@
 "    Whether to commit modified subrepositories when committing the\n"
 "    parent repository. If False and one subrepository has uncommitted\n"
 "    changes, abort the commit.\n"
-"    Default is True."
+"    Default is False."
 msgstr ""
 "``commitsubrepos``\n"
 "    Determina se sub-repositórios modificados serão automaticamente\n"
 "    consolidados ao consolidar o repositório pai. Se for False e\n"
 "    algum sub-repositório tiver mudanças não consolidadas, aborta a\n"
 "    consolidação do repositório pai.\n"
-"    O padrão é True."
+"    O padrão é False."
 
 msgid ""
 "``debug``\n"
@@ -15359,6 +16786,20 @@
 "    Determina se IPv6 deve ser usado. O padrão é False."
 
 msgid ""
+"``logoimg``\n"
+"    File name of the logo image that some templates display on each page.\n"
+"    The file name is relative to ``staticurl``. That is, the full path to\n"
+"    the logo image is \"staticurl/logoimg\".\n"
+"    If unset, ``hglogo.png`` will be used."
+msgstr ""
+"``logoimg``\n"
+"    Nome do arquivo contendo a imagem de logotipo que alguns modelos\n"
+"    exibem em cada página. O nome de arquivo é relativo a ``staticurl``.\n"
+"    Isto é, o caminho completo para a imagem de logo é\n"
+"    \"staticurl/logoimg\".\n"
+"    Se não definido, ``hglogo.png`` será usado."
+
+msgid ""
 "``logourl``\n"
 "    Base URL to use for logos. If unset, ``http://mercurial.selenic.com/``\n"
 "    will be used."
@@ -15979,7 +17420,8 @@
 msgid "Some sample queries:"
 msgstr "Alguns exemplos de consultas:"
 
-msgid "- Show status of files that appear to be binary in the working directory::"
+msgid ""
+"- Show status of files that appear to be binary in the working directory::"
 msgstr ""
 "- Exibe o status de arquivos que parecem ser binários no diretório\n"
 "de trabalho::"
@@ -17898,31 +19340,39 @@
 "- Revisões mencionando \"bug\" ou \"issue\" que não descendem\n"
 "  de revisões etiquetadas::"
 
-msgid "    hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged())\"\n"
-msgstr "    hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged())\"\n"
+msgid ""
+"    hg log -r \"(keyword(bug) or keyword(issue)) and not "
+"ancestors(tagged())\"\n"
+msgstr ""
+"    hg log -r \"(keyword(bug) or keyword(issue)) and not "
+"ancestors(tagged())\"\n"
 
 msgid ""
 "Subrepositories let you nest external repositories or projects into a\n"
 "parent Mercurial repository, and make commands operate on them as a\n"
-"group. External Mercurial and Subversion projects are currently\n"
-"supported."
+"group."
 msgstr ""
 "O suporte a sub-repositórios possibilita o aninhamento de\n"
 "repositórios externos ou projetos em um repositório pai do\n"
 "Mercurial, fornecendo suporte para a operação de diversos\n"
-"comandos no conjunto como um todo. No momento são suportados\n"
-"repositórios externos do Mercurial e do Subversion."
+"comandos no conjunto como um todo."
+
+msgid ""
+"Mercurial currently supports Mercurial, Git, and Subversion\n"
+"subrepositories."
+msgstr ""
+"No momento o Mercurial suporta sub-repositórios do próprio\n"
+"Mercurial, do Git e do Subversion."
 
 msgid "Subrepositories are made of three components:"
 msgstr "Sub-repositórios são constituídos de três componentes:"
 
 msgid ""
 "1. Nested repository checkouts. They can appear anywhere in the\n"
-"   parent working directory, and are Mercurial clones or Subversion\n"
-"   checkouts."
-msgstr ""
-"1. Cópias locais aninhadas. São clones do Mercurial ou checkouts\n"
-"   do Subversion, e podem aparecer em qualquer ponto do diretório\n"
+"   parent working directory."
+msgstr ""
+"1. Cópias locais aninhadas.\n"
+"   Podem aparecer em qualquer ponto do diretório\n"
 "   de trabalho pai."
 
 msgid ""
@@ -17938,21 +19388,27 @@
 msgid "     path/to/nested = https://example.com/nested/repo/path"
 msgstr "     caminho/aninhado = https://exemplo.com/aninhado/repo/caminho"
 
+msgid "   Git and Subversion subrepos are also supported:"
+msgstr "   Subrepositórios do Git e do Subversion também são suportados:"
+
+msgid ""
+"     path/to/nested = [git]git://example.com/nested/repo/path\n"
+"     path/to/nested = [svn]https://example.com/nested/trunk/path"
+msgstr ""
+"     caminho/aninhado = [git]git://exemplo.com/aninhado/repo/caminho\n"
+"     caminho/aninhado = [svn]https://exemplo.com/aninhado/trunk/caminho"
+
 msgid ""
 "   where ``path/to/nested`` is the checkout location relatively to the\n"
 "   parent Mercurial root, and ``https://example.com/nested/repo/path``\n"
 "   is the source repository path. The source can also reference a\n"
-"   filesystem path. Subversion repositories are defined with:"
+"   filesystem path."
 msgstr ""
 "   onde ``caminho/aninhado`` é a localização da cópia local relativa\n"
 "   à raiz do repositório pai do Mercurial, e\n"
 "   ``https://exemplo.com/aninhado/repo/caminho`` é o caminho do\n"
 "   repositório de origem. A origem também pode ser um caminho no\n"
-"   sistema de arquivos. Sub-repositórios do Subversion são definidos\n"
-"   com:"
-
-msgid "     path/to/nested = [svn]https://example.com/nested/trunk/path"
-msgstr "     caminho/aninhado = [svn]https://exemplo.com/aninhado/trunk/caminho"
+"   sistema de arquivos."
 
 msgid ""
 "   Note that ``.hgsub`` does not exist by default in Mercurial\n"
@@ -18477,8 +19933,12 @@
 msgid "destination '%s' is not empty"
 msgstr "o destino '%s' não está vazio"
 
-msgid "src repository does not support revision lookup and so doesn't support clone by revision"
-msgstr "repositório de origem não suporta busca de revisões, portanto não suporta clonar por revisão"
+msgid ""
+"src repository does not support revision lookup and so doesn't support clone"
+" by revision"
+msgstr ""
+"repositório de origem não suporta busca de revisões, portanto não suporta "
+"clonar por revisão"
 
 msgid "clone from remote to remote not supported"
 msgstr "clone de origem remota para destino remoto não suportado"
@@ -18488,14 +19948,21 @@
 msgstr "atualizando para o ramo %s\n"
 
 #, python-format
-msgid "%d files updated, %d files merged, %d files removed, %d files unresolved\n"
-msgstr "%d arquivos atualizados, %d arquivos mesclados, %d arquivos removidos, %d arquivos não resolvidos\n"
+msgid ""
+"%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr ""
+"%d arquivos atualizados, %d arquivos mesclados, %d arquivos removidos, %d "
+"arquivos não resolvidos\n"
 
 msgid "use 'hg resolve' to retry unresolved file merges\n"
 msgstr "use 'hg resolve' para mesclar novamente arquivos não resolvidos\n"
 
-msgid "use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon\n"
-msgstr "use 'hg resolve' para mesclar novamente arquivos não resolvidos ou 'hg update -C .' para abandonar\n"
+msgid ""
+"use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to "
+"abandon\n"
+msgstr ""
+"use 'hg resolve' para mesclar novamente arquivos não resolvidos ou 'hg "
+"update -C .' para abandonar\n"
 
 msgid "(branch merge, don't forget to commit)\n"
 msgstr "(mesclagem de ramo, não esqueça de consolidar)\n"
@@ -18627,9 +20094,6 @@
 msgid "'%s' uses newer protocol %s"
 msgstr "'%s' usa protocolo mais novo %s"
 
-msgid "unexpected response:"
-msgstr "resposta inesperada:"
-
 #, python-format
 msgid "push failed: %s"
 msgstr "o push falhou: %s"
@@ -18673,7 +20137,9 @@
 msgstr "aviso: a etiqueta %s conflita com um nome de ramo existente\n"
 
 msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
-msgstr "a cópia de trabalho de .hgtags foi modificada (por favor consolide .hgtags manualmente)"
+msgstr ""
+"a cópia de trabalho de .hgtags foi modificada (por favor consolide .hgtags "
+"manualmente)"
 
 #, python-format
 msgid "working directory has unknown parent '%s'!"
@@ -18692,20 +20158,34 @@
 msgid "no interrupted transaction available\n"
 msgstr "nenhuma transação interrompida disponível\n"
 
+msgid "no rollback information available\n"
+msgstr "nenhuma informação de desfazimento disponível\n"
+
 #, python-format
 msgid "repository tip rolled back to revision %s (undo %s: %s)\n"
-msgstr "executando rollback da tip do repositório para a revisão %s (desfazimento de %s: %s)\n"
+msgstr ""
+"executando rollback da tip do repositório para a revisão %s (desfazimento de"
+" %s: %s)\n"
 
 #, python-format
 msgid "repository tip rolled back to revision %s (undo %s)\n"
-msgstr "executando rollback da tip do repositório para a revisão %s (desfazimento de %s)\n"
+msgstr ""
+"executando rollback da tip do repositório para a revisão %s (desfazimento de"
+" %s)\n"
 
 msgid "rolling back unknown transaction\n"
 msgstr "desfazendo transação desconhecida\n"
 
-#, python-format
-msgid "named branch could not be reset, current branch is still: %s\n"
-msgstr "o ramo nomeado não pôde ser redefinido, o ramo atual ainda é: %s\n"
+msgid "rollback of last commit while not checked out may lose data"
+msgstr ""
+"rollback do último commit pode perder dados se a revisão não for a atual"
+
+msgid "use -f to force"
+msgstr "use -f para forçar"
+
+#, python-format
+msgid "named branch could not be reset: current branch is still '%s'\n"
+msgstr "o ramo nomeado não pôde ser redefinido: o ramo atual ainda é %s\n"
 
 #, python-format
 msgid "working directory now based on revisions %d and %d\n"
@@ -18715,9 +20195,6 @@
 msgid "working directory now based on revision %d\n"
 msgstr "o diretório de trabalho está agora baseado na revisão %d\n"
 
-msgid "no rollback information available\n"
-msgstr "nenhuma informação de desfazimento disponível\n"
-
 #, python-format
 msgid "waiting for lock on %s held by %r\n"
 msgstr "esperando pelo bloqueio em %s feito por %r\n"
@@ -18732,17 +20209,20 @@
 
 #, python-format
 msgid "warning: can't find ancestor for '%s' copied from '%s'!\n"
-msgstr "aviso: não é possível encontrar o ancestral de '%s' copiado a partir de '%s'!\n"
+msgstr ""
+"aviso: não é possível encontrar o ancestral de '%s' copiado a partir de "
+"'%s'!\n"
 
 msgid "cannot partially commit a merge (do not specify files or patterns)"
-msgstr "não é possível consolidar parcialmente uma mesclagem (não especifique arquivos ou padrões)"
+msgstr ""
+"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 "uncommitted changes in subrepo %s"
-msgstr "mudanças não consolidadas no sub-repositório %s"
+msgid "use --subrepos for recursive commit"
+msgstr "use --subrepos para um commit recursivo"
 
 msgid "file not found!"
 msgstr "arquivo não encontrado!"
@@ -18771,8 +20251,12 @@
 msgid "requesting all changes\n"
 msgstr "pedindo todas as mudanças\n"
 
-msgid "partial pull cannot be done because other repository doesn't support changegroupsubset."
-msgstr "pull parcial não pode ser feito porque o outro repositório não suporta 'changegroupsubset'."
+msgid ""
+"partial pull cannot be done because other repository doesn't support "
+"changegroupsubset."
+msgstr ""
+"pull parcial não pode ser feito porque o outro repositório não suporta "
+"'changegroupsubset'."
 
 #, python-format
 msgid "%d changesets found\n"
@@ -18866,11 +20350,14 @@
 msgstr "enviando e-mail: %s\n"
 
 msgid "smtp specified as email transport, but no smtp host configured"
-msgstr "smtp especificado como transporte de e-mail, mas o servidor smtp não foi configurado"
+msgstr ""
+"smtp especificado como transporte de e-mail, mas o servidor smtp não foi "
+"configurado"
 
 #, python-format
 msgid "%r specified as email transport, but not in PATH"
-msgstr "%r especificado como um transporte de e-mail, mas não encontrado no PATH"
+msgstr ""
+"%r especificado como um transporte de e-mail, mas não encontrado no PATH"
 
 #, python-format
 msgid "ignoring invalid sendcharset: %s\n"
@@ -18908,8 +20395,12 @@
 msgstr "o número de linhas de contexto de diff deve ser um inteiro, e não %r"
 
 #, python-format
-msgid "untracked file in working directory differs from file in requested revision: '%s'"
-msgstr "arquivo não versionado no diretório de trabalho difere do arquivo na revisão pedida: '%s'"
+msgid ""
+"untracked file in working directory differs from file in requested revision:"
+" '%s'"
+msgstr ""
+"arquivo não versionado no diretório de trabalho difere do arquivo na revisão"
+" pedida: '%s'"
 
 #, python-format
 msgid "case-folding collision between %s and %s"
@@ -18980,23 +20471,29 @@
 msgstr "nota: possível conflito - %s foi renomeado múltiplas vezes para:\n"
 
 msgid "merging with a working directory ancestor has no effect"
-msgstr "mesclar com um ancestral do diretório de trabalho não tem nenhum efeito"
+msgstr ""
+"mesclar com um ancestral do diretório de trabalho não tem nenhum efeito"
 
 msgid "nothing to merge (use 'hg update' or check 'hg heads')"
 msgstr "nada para mesclar (use 'hg update' ou verifique 'hg heads')"
 
 msgid "outstanding uncommitted changes (use 'hg status' to list changes)"
-msgstr "alterações não consolidadas pendentes (use 'hg status' para listar as mudanças)"
+msgstr ""
+"alterações não consolidadas pendentes (use 'hg status' para listar as "
+"mudanças)"
 
 #, python-format
 msgid "outstanding uncommitted changes in subrepository '%s'"
 msgstr "mudanças não consolidadas pendentes no sub-repositório '%s'"
 
 msgid "crosses branches (merge branches or use --clean to discard changes)"
-msgstr "atravessa ramos (mescle os ramos ou use --clean para descartar mudanças)"
+msgstr ""
+"atravessa ramos (mescle os ramos ou use --clean para descartar mudanças)"
 
 msgid "crosses branches (merge branches or update --check to force update)"
-msgstr "atravessa ramos (mescle os ramos ou use update --check para forçar a atualização)"
+msgstr ""
+"atravessa ramos (mescle os ramos ou use update --check para forçar a "
+"atualização)"
 
 msgid "Attention:"
 msgstr "Atenção:"
@@ -19067,7 +20564,9 @@
 
 #, python-format
 msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
-msgstr "Trecho #%d aplicado com sucesso em %d com indistinção %d (distância %d linhas).\n"
+msgstr ""
+"Trecho #%d aplicado com sucesso em %d com indistinção %d (distância %d "
+"linhas).\n"
 
 #, python-format
 msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
@@ -19243,18 +20742,30 @@
 msgstr "author requer uma string"
 
 msgid ""
-"``bisected(string)``\n"
-"    Changesets marked in the specified bisect state (good, bad, skip)."
+"``bisect(string)``\n"
+"    Changesets marked in the specified bisect status:"
 msgstr ""
 "``bisected(string)``\n"
-"    Revisões marcadas com o estado de bissecção especificado (good, bad, skip)."
+"    Revisões marcadas com o estado de bissecção especificado:"
+
+msgid ""
+"    - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip\n"
+"    - ``goods``, ``bads``      : csets topologicaly good/bad\n"
+"    - ``range``              : csets taking part in the bisection\n"
+"    - ``pruned``             : csets that are goods, bads or skipped\n"
+"    - ``untested``           : csets whose fate is yet unknown\n"
+"    - ``ignored``            : csets ignored due to DAG topology"
+msgstr ""
+"    - ``good``, ``bad``, ``skip``: revs explicitamente marcadas como boas, ruins ou omitidas\n"
+"    - ``goods``, ``bads``      : revs topologicamente boas ou ruins\n"
+"    - ``range``              : revs participando da bisecção\n"
+"    - ``pruned``             : revs goods, bads ou skipped\n"
+"    - ``untested``           : revs que ainda não foram testadas\n"
+"    - ``ignored``            : revs ignoradas pela topologia do DAG"
 
 msgid "bisect requires a string"
 msgstr "bisect requer uma string"
 
-msgid "invalid bisect state"
-msgstr "estado de bisecção inválido"
-
 msgid ""
 "``bookmark([name])``\n"
 "    The named bookmark or all bookmarks."
@@ -19351,6 +20862,13 @@
 msgstr "filelog requer um padrão"
 
 msgid ""
+"``first(set, [n])``\n"
+"    An alias for limit()."
+msgstr ""
+"``first(conjunto, [n])``\n"
+"    Um apelido para limit()."
+
+msgid ""
 "``follow([file])``\n"
 "    An alias for ``::.`` (ancestors of the working copy's first parent).\n"
 "    If a filename is specified, the history of the given file is followed,\n"
@@ -19447,15 +20965,15 @@
 msgstr "keyword requer uma string"
 
 msgid ""
-"``limit(set, n)``\n"
-"    First n members of set."
-msgstr ""
-"``limit(conjunto, n)``\n"
-"    Os primeiros n membros do conjunto."
+"``limit(set, [n])``\n"
+"    First n members of set, defaulting to 1."
+msgstr ""
+"``limit(conjunto, [n])``\n"
+"    Os primeiros n membros do conjunto. O valor padrão de n é 1."
 
 #. i18n: "limit" is a keyword
-msgid "limit requires two arguments"
-msgstr "limit requer dois argumentos"
+msgid "limit requires one or two arguments"
+msgstr "limit exige um ou dois argumentos"
 
 #. i18n: "limit" is a keyword
 msgid "limit requires a number"
@@ -19466,15 +20984,15 @@
 msgstr "limit espera um número"
 
 msgid ""
-"``last(set, n)``\n"
-"    Last n members of set."
-msgstr ""
-"``last(conjunto, n)``\n"
-"    Os últimos n membros do conjunto."
+"``last(set, [n])``\n"
+"    Last n members of set, defaulting to 1."
+msgstr ""
+"``last(conjunto, [n])``\n"
+"    Os últimos n membros do conjunto. O valor padrão de n é 1."
 
 #. i18n: "last" is a keyword
-msgid "last requires two arguments"
-msgstr "last requer dois argumentos"
+msgid "last requires one or two arguments"
+msgstr "last exige um ou dois argumentos"
 
 #. i18n: "last" is a keyword
 msgid "last requires a number"
@@ -19739,14 +21257,18 @@
 
 #, python-format
 msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
-msgstr "%s ainda não foi consolidado, então dados de cópia não serão guardados para %s.\n"
+msgstr ""
+"%s ainda não foi consolidado, então dados de cópia não serão guardados para "
+"%s.\n"
 
 msgid ".hg/requires file is corrupt"
 msgstr "arquivo .hg/requires corrompido"
 
 #, python-format
 msgid "unknown repository format: requires features '%s' (upgrade Mercurial)"
-msgstr "formato de repositório desconhecido: requer as funcionalidades '%s' (atualize o Mercurial)"
+msgstr ""
+"formato de repositório desconhecido: requer as funcionalidades '%s' "
+"(atualize o Mercurial)"
 
 msgid "searching for changes\n"
 msgstr "procurando por mudanças\n"
@@ -19799,6 +21321,9 @@
 msgid "push refused: %s"
 msgstr "envio recusado: %s"
 
+msgid "Python SSL support not found"
+msgstr "suporte do Python a SSL não instalado"
+
 msgid "certificate checking requires Python 2.6"
 msgstr "verificação de certificado exige Python 2.6"
 
@@ -19821,23 +21346,33 @@
 
 #, python-format
 msgid "%s certificate error: %s (use --insecure to connect insecurely)"
-msgstr "erro no certificado de %s: %s (use --insecure para conectar de modo inseguro)"
+msgstr ""
+"erro no certificado de %s: %s (use --insecure para conectar de modo "
+"inseguro)"
 
 #, python-format
 msgid "invalid certificate for %s with fingerprint %s"
 msgstr "certificado inválido para %s com impressão digital %s"
 
 #, python-format
-msgid "warning: %s certificate with fingerprint %s not verified (check hostfingerprints or web.cacerts config setting)\n"
-msgstr "aviso: o certificado %s com impressão digital %s não foi verificado (verifique as opções de configuração hostfingerprints e web.cacerts)\n"
+msgid ""
+"warning: %s certificate with fingerprint %s not verified (check "
+"hostfingerprints or web.cacerts config setting)\n"
+msgstr ""
+"aviso: o certificado %s com impressão digital %s não foi verificado "
+"(verifique as opções de configuração hostfingerprints e web.cacerts)\n"
 
 #, python-format
 msgid "host fingerprint for %s can't be verified (Python too old)"
-msgstr "a impressão digital do host para %s não pode ser verificada (versão do Python muito antiga)"
+msgstr ""
+"a impressão digital do host para %s não pode ser verificada (versão do "
+"Python muito antiga)"
 
 #, python-format
 msgid "warning: certificate for %s can't be verified (Python too old)\n"
-msgstr "aviso: certificado %s não pode ser verificado (versão do Python muito antiga)\n"
+msgstr ""
+"aviso: certificado %s não pode ser verificado (versão do Python muito "
+"antiga)\n"
 
 #, python-format
 msgid "'%s' does not appear to be an hg repository"
@@ -19861,13 +21396,13 @@
 msgid "subrepo spec file %s not found"
 msgstr "arquivo spec de sub-repositório %s não encontrado"
 
-msgid "missing ] in subrepo source"
-msgstr "faltando ] na origem do sub-repositório"
-
 #, python-format
 msgid "bad subrepository pattern in %s: %s"
 msgstr "padrão ruim de sub-repositório em %s: %s"
 
+msgid "missing ] in subrepo source"
+msgstr "faltando ] na origem do sub-repositório"
+
 #, python-format
 msgid ""
 " subrepository sources for %s differ\n"
@@ -19943,6 +21478,10 @@
 msgid "pushing subrepo %s to %s\n"
 msgstr "enviando sub-repositório %s para %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'"
+
 msgid "cannot retrieve svn tool version"
 msgstr "não é possível obter a versão da ferramenta svn"
 
@@ -20142,6 +21681,18 @@
 ":short: Hash da revisão. Devolve a forma curta do hash de\n"
 "    uma revisão, ou seja, uma string hexadecimal de 12 dígitos."
 
+msgid ""
+":shortbisect: Any text. Treats `text` as a bisection status, and\n"
+"    returns a single-character representing the status (G: good, B: bad,\n"
+"    S: skipped, U: untested, I: ignored). Returns single space if `text`\n"
+"    is not a valid bisection status."
+msgstr ""
+":shortbisect: Qualquer texto. Trata o texto como um estado de\n"
+"    bissecção, e devolve um caractere único representando o estado\n"
+"    (G: boa, B: ruim, S: omitida, U: não testada, I: ignorada).\n"
+"    Devolve um único espaço se o texto não for um estado de bisecção\n"
+"    válido."
+
 msgid ":shortdate: Date. Returns a date like \"2006-09-18\"."
 msgstr ":shortdate: Data. Devolve uma data como \"2006-09-18\"."
 
@@ -20181,11 +21732,15 @@
 "    \"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."
+msgstr ""
+":user: 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."
 
+msgid ":bisect: String. The changeset bisection status."
+msgstr ":bisect: String. O estado de bissecção da revisão."
+
 msgid ""
 ":branch: String. The name of the branch on which the changeset was\n"
 "    committed."
@@ -20202,7 +21757,8 @@
 msgid ""
 ":bookmarks: List of strings. Any bookmarks associated with the\n"
 "    changeset."
-msgstr ":bookmarks: Lista de strings. Quaisquer marcadores associados à revisão."
+msgstr ""
+":bookmarks: Lista de strings. Quaisquer marcadores associados à revisão."
 
 msgid ":children: List of strings. The children of the changeset."
 msgstr ":children: Lista de strings. As revisões filhas da revisão."
--- a/mercurial/commands.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/commands.py	Tue Nov 01 16:49:30 2011 -0500
@@ -1143,7 +1143,7 @@
      _('mark new/missing files as added/removed before committing')),
     ('', 'close-branch', None,
      _('mark a branch as closed, hiding it from the branch list')),
-    ] + walkopts + commitopts + commitopts2,
+    ] + walkopts + commitopts + commitopts2 + subrepoopts,
     _('[OPTION]... [FILE]...'))
 def commit(ui, repo, *pats, **opts):
     """commit the specified files or all outstanding changes
@@ -1167,6 +1167,10 @@
 
     Returns 0 on success, 1 if nothing changed.
     """
+    if opts.get('subrepos'):
+        # Let --subrepos on the command line overide config setting.
+        ui.setconfig('ui', 'commitsubrepos', True)
+
     extra = {}
     if opts.get('close_branch'):
         if repo['.'].node() not in repo.branchheads():
@@ -2544,19 +2548,20 @@
         return -1
 
     # check ancestors for earlier grafts
-    ui.debug('scanning for existing transplants')
+    ui.debug('scanning for duplicate grafts\n')
     for ctx in repo.set("::. - ::%ld", revs):
         n = ctx.extra().get('source')
         if n and n in repo:
             r = repo[n].rev()
-            ui.warn(_('skipping already grafted revision %s\n') % r)
-            revs.remove(r)
+            if r in revs:
+                ui.warn(_('skipping already grafted revision %s\n') % r)
+                revs.remove(r)
     if not revs:
         return -1
 
     for pos, ctx in enumerate(repo.set("%ld", revs)):
         current = repo['.']
-        ui.status('grafting revision %s', ctx.rev())
+        ui.status('grafting revision %s\n' % ctx.rev())
 
         # we don't merge the first commit when continuing
         if not cont:
@@ -2660,7 +2665,7 @@
             mstart, mend = match.span()
             linenum += body.count('\n', begin, mstart) + 1
             lstart = body.rfind('\n', begin, mstart) + 1 or begin
-            begin = body.find('\n', mend) + 1 or len(body)
+            begin = body.find('\n', mend) + 1 or len(body) + 1
             lend = begin - 1
             yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
 
@@ -3352,7 +3357,7 @@
      _('use any branch information in patch (implied by --exact)'))] +
     commitopts + commitopts2 + similarityopts,
     _('[OPTION]... PATCH...'))
-def import_(ui, repo, patch1, *patches, **opts):
+def import_(ui, repo, patch1=None, *patches, **opts):
     """import an ordered set of patches
 
     Import a list of patches and commit them individually (unless
@@ -3414,6 +3419,10 @@
 
     Returns 0 on success.
     """
+
+    if not patch1:
+        raise util.Abort(_('need at least one patch to import'))
+
     patches = (patch1,) + patches
 
     date = opts.get('date')
@@ -3537,49 +3546,51 @@
                 finally:
                     store.close()
             if n:
+                # i18n: refers to a short changeset id
                 msg = _('created %s') % short(n)
             return (msg, n)
         finally:
             os.unlink(tmpname)
 
     try:
-        wlock = repo.wlock()
-        lock = repo.lock()
-        tr = repo.transaction('import')
-        parents = repo.parents()
-        for patchurl in patches:
-            if patchurl == '-':
-                ui.status(_('applying patch from stdin\n'))
-                patchfile = ui.fin
-                patchurl = 'stdin'      # for error message
-            else:
-                patchurl = os.path.join(base, patchurl)
-                ui.status(_('applying %s\n') % patchurl)
-                patchfile = url.open(ui, patchurl)
-
-            haspatch = False
-            for hunk in patch.split(patchfile):
-                (msg, node) = tryone(ui, hunk, parents)
-                if msg:
-                    haspatch = True
-                    ui.note(msg + '\n')
-                if update or opts.get('exact'):
-                    parents = repo.parents()
+        try:
+            wlock = repo.wlock()
+            lock = repo.lock()
+            tr = repo.transaction('import')
+            parents = repo.parents()
+            for patchurl in patches:
+                if patchurl == '-':
+                    ui.status(_('applying patch from stdin\n'))
+                    patchfile = ui.fin
+                    patchurl = 'stdin'      # for error message
                 else:
-                    parents = [repo[node]]
-
-            if not haspatch:
-                raise util.Abort(_('%s: no diffs found') % patchurl)
-
-        tr.close()
-        if msgs:
-            repo.savecommitmessage('\n* * *\n'.join(msgs))
-    except:
-        # wlock.release() indirectly calls dirstate.write(): since
-        # we're crashing, we do not want to change the working dir
-        # parent after all, so make sure it writes nothing
-        repo.dirstate.invalidate()
-        raise
+                    patchurl = os.path.join(base, patchurl)
+                    ui.status(_('applying %s\n') % patchurl)
+                    patchfile = url.open(ui, patchurl)
+
+                haspatch = False
+                for hunk in patch.split(patchfile):
+                    (msg, node) = tryone(ui, hunk, parents)
+                    if msg:
+                        haspatch = True
+                        ui.note(msg + '\n')
+                    if update or opts.get('exact'):
+                        parents = repo.parents()
+                    else:
+                        parents = [repo[node]]
+
+                if not haspatch:
+                    raise util.Abort(_('%s: no diffs found') % patchurl)
+
+            tr.close()
+            if msgs:
+                repo.savecommitmessage('\n* * *\n'.join(msgs))
+        except:
+            # wlock.release() indirectly calls dirstate.write(): since
+            # we're crashing, we do not want to change the working dir
+            # parent after all, so make sure it writes nothing
+            repo.dirstate.invalidate()
+            raise
     finally:
         if tr:
             tr.release()
@@ -4745,15 +4756,14 @@
                     # only need parent manifest in this unlikely case,
                     # so do not read by default
                     pmf = repo[parent].manifest()
-                if abs in pmf:
-                    if mfentry:
-                        # if version of file is same in parent and target
-                        # manifests, do nothing
-                        if (pmf[abs] != mfentry or
-                            pmf.flags(abs) != mf.flags(abs)):
-                            handle(revert, False)
-                    else:
-                        handle(remove, False)
+                if abs in pmf and mfentry:
+                    # if version of file is same in parent and target
+                    # manifests, do nothing
+                    if (pmf[abs] != mfentry or
+                        pmf.flags(abs) != mf.flags(abs)):
+                        handle(revert, False)
+                else:
+                    handle(remove, False)
 
         if not opts.get('dry_run'):
             def checkout(f):
--- a/mercurial/context.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/context.py	Tue Nov 01 16:49:30 2011 -0500
@@ -632,6 +632,42 @@
     def __contains__(self, key):
         return self._repo.dirstate[key] not in "?r"
 
+    def _buildflagfunc(self):
+        # Create a fallback function for getting file flags when the
+        # filesystem doesn't support them
+
+        copiesget = self._repo.dirstate.copies().get
+
+        if len(self._parents) < 2:
+            # when we have one parent, it's easy: copy from parent
+            man = self._parents[0].manifest()
+            def func(f):
+                f = copiesget(f, f)
+                return man.flags(f)
+        else:
+            # merges are tricky: we try to reconstruct the unstored
+            # result from the merge (issue1802)
+            p1, p2 = self._parents
+            pa = p1.ancestor(p2)
+            m1, m2, ma = p1.manifest(), p2.manifest(), pa.manifest()
+
+            def func(f):
+                f = copiesget(f, f) # may be wrong for merges with copies
+                fl1, fl2, fla = m1.flags(f), m2.flags(f), ma.flags(f)
+                if fl1 == fl2:
+                    return fl1
+                if fl1 == fla:
+                    return fl2
+                if fl2 == fla:
+                    return fl1
+                return '' # punt for conflicts
+
+        return func
+
+    @propertycache
+    def _flagfunc(self):
+        return self._repo.dirstate.flagfunc(self._buildflagfunc)
+
     @propertycache
     def _manifest(self):
         """generate a manifest corresponding to the working directory"""
@@ -640,7 +676,6 @@
             self.status(unknown=True)
 
         man = self._parents[0].manifest().copy()
-        copied = self._repo.dirstate.copies()
         if len(self._parents) > 1:
             man2 = self.p2().manifest()
             def getman(f):
@@ -649,10 +684,9 @@
                 return man2
         else:
             getman = lambda f: man
-        def cf(f):
-            f = copied.get(f, f)
-            return getman(f).flags(f)
-        ff = self._repo.dirstate.flagfunc(cf)
+
+        copied = self._repo.dirstate.copies()
+        ff = self._flagfunc
         modified, added, removed, deleted = self._status
         unknown = self._unknown
         for i, l in (("a", added), ("m", modified), ("u", unknown)):
@@ -767,23 +801,10 @@
             except KeyError:
                 return ''
 
-        orig = self._repo.dirstate.copies().get(path, path)
-
-        def findflag(ctx):
-            mnode = ctx.changeset()[0]
-            node, flag = self._repo.manifest.find(mnode, orig)
-            ff = self._repo.dirstate.flagfunc(lambda x: flag or '')
-            try:
-                return ff(path)
-            except OSError:
-                pass
-
-        flag = findflag(self._parents[0])
-        if flag is None and len(self.parents()) > 1:
-            flag = findflag(self._parents[1])
-        if flag is None or self._repo.dirstate[path] == 'r':
+        try:
+            return self._flagfunc(path)
+        except OSError:
             return ''
-        return flag
 
     def filectx(self, path, filelog=None):
         """get a file context from the working directory"""
--- a/mercurial/dirstate.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/dirstate.py	Tue Nov 01 16:49:30 2011 -0500
@@ -131,17 +131,19 @@
         # it's safe because f is always a relative path
         return self._rootdir + f
 
-    def flagfunc(self, fallback):
+    def flagfunc(self, buildfallback):
+        if self._checklink and self._checkexec:
+            def f(x):
+                p = self._join(x)
+                if os.path.islink(p):
+                    return 'l'
+                if util.isexec(p):
+                    return 'x'
+                return ''
+            return f
+
+        fallback = buildfallback()
         if self._checklink:
-            if self._checkexec:
-                def f(x):
-                    p = self._join(x)
-                    if os.path.islink(p):
-                        return 'l'
-                    if util.isexec(p):
-                        return 'x'
-                    return ''
-                return f
             def f(x):
                 if os.path.islink(self._join(x)):
                     return 'l'
@@ -157,7 +159,8 @@
                     return 'x'
                 return ''
             return f
-        return fallback
+        else:
+            return fallback
 
     def getcwd(self):
         cwd = os.getcwd()
@@ -367,9 +370,10 @@
 
     def drop(self, f):
         '''Drop a file from the dirstate'''
-        self._dirty = True
-        self._droppath(f)
-        del self._map[f]
+        if f in self._map:
+            self._dirty = True
+            self._droppath(f)
+            del self._map[f]
 
     def _normalize(self, path, isknown):
         normed = os.path.normcase(path)
--- a/mercurial/discovery.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/discovery.py	Tue Nov 01 16:49:30 2011 -0500
@@ -161,7 +161,7 @@
             if len(newhs) > len(oldhs):
                 dhs = list(newhs - oldhs)
                 if error is None:
-                    if branch != 'default':
+                    if branch not in ('default', None):
                         error = _("push creates new remote head %s "
                                   "on branch '%s'!") % (short(dhs[0]), branch)
                     else:
@@ -173,7 +173,8 @@
                     else:
                         hint = _("did you forget to merge? "
                                  "use push -f to force")
-                repo.ui.note("new remote heads on branch '%s'\n" % branch)
+                if branch is not None:
+                    repo.ui.note("new remote heads on branch '%s'\n" % branch)
                 for h in dhs:
                     repo.ui.note("new remote head %s\n" % short(h))
         if error:
--- a/mercurial/hbisect.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/hbisect.py	Tue Nov 01 16:49:30 2011 -0500
@@ -226,20 +226,27 @@
 
     # Try explicit sets
     if rev in get(repo, 'good'):
+        # i18n: bisect changeset status
         return _('good')
     if rev in get(repo, 'bad'):
+        # i18n: bisect changeset status
         return _('bad')
     if rev in get(repo, 'skip'):
+        # i18n: bisect changeset status
         return _('skipped')
     if rev in get(repo, 'untested'):
+        # i18n: bisect changeset status
         return _('untested')
     if rev in get(repo, 'ignored'):
+        # i18n: bisect changeset status
         return _('ignored')
 
     # Try implicit sets
     if rev in get(repo, 'goods'):
+        # i18n: bisect changeset status
         return _('good (implicit)')
     if rev in get(repo, 'bads'):
+        # i18n: bisect changeset status
         return _('bad (implicit)')
 
     return None
--- a/mercurial/help/config.txt	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/help/config.txt	Tue Nov 01 16:49:30 2011 -0500
@@ -1010,7 +1010,7 @@
     Whether to commit modified subrepositories when committing the
     parent repository. If False and one subrepository has uncommitted
     changes, abort the commit.
-    Default is True.
+    Default is False.
 
 ``debug``
     Print debugging information. True or False. Default is False.
--- a/mercurial/httpconnection.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/httpconnection.py	Tue Nov 01 16:49:30 2011 -0500
@@ -70,7 +70,11 @@
         gdict[setting] = val
 
     # Find the best match
-    scheme, hostpath = uri.split('://', 1)
+    if '://' in uri:
+        scheme, hostpath = uri.split('://', 1)
+    else:
+        # py2.4.1 doesn't provide the full URI
+        scheme, hostpath = 'http', uri
     bestuser = None
     bestlen = 0
     bestauth = None
--- a/mercurial/localrepo.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/localrepo.py	Tue Nov 01 16:49:30 2011 -0500
@@ -1062,11 +1062,12 @@
                     '.hgsubstate' not in changes[0] + changes[1] + changes[2]):
                     changes[2].insert(0, '.hgsubstate')
 
-            if subs and not self.ui.configbool('ui', 'commitsubrepos', True):
+            if subs and not self.ui.configbool('ui', 'commitsubrepos', False):
                 changedsubs = [s for s in subs if wctx.sub(s).dirty(True)]
                 if changedsubs:
                     raise util.Abort(_("uncommitted changes in subrepo %s")
-                                     % changedsubs[0])
+                                     % changedsubs[0],
+                                     hint=_("use --subrepos for recursive commit"))
 
             # make sure all explicit patterns are matched
             if not force and match.files():
@@ -1353,6 +1354,22 @@
                     added.append(fn)
             removed = mf1.keys()
 
+        if working and modified and not self.dirstate._checklink:
+            # Symlink placeholders may get non-symlink-like contents
+            # via user error or dereferencing by NFS or Samba servers,
+            # so we filter out any placeholders that don't look like a
+            # symlink
+            sane = []
+            for f in modified:
+                if ctx2.flags(f) == 'l':
+                    d = ctx2[f].data()
+                    if len(d) >= 1024 or '\n' in d or util.binary(d):
+                        self.ui.debug('ignoring suspect symlink placeholder'
+                                      ' "%s"\n' % f)
+                        continue
+                sane.append(f)
+            modified = sane
+
         r = modified, added, removed, deleted, unknown, ignored, clean
 
         if listsubrepos:
--- a/mercurial/minirst.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/minirst.py	Tue Nov 01 16:49:30 2011 -0500
@@ -23,9 +23,27 @@
 from i18n import _
 
 def replace(text, substs):
+    '''
+    Apply a list of (find, replace) pairs to a text.
+
+    >>> replace("foo bar", [('f', 'F'), ('b', 'B')])
+    'Foo Bar'
+    >>> encoding.encoding = 'latin1'
+    >>> replace('\\x81\\\\', [('\\\\', '/')])
+    '\\x81/'
+    >>> encoding.encoding = 'shiftjis'
+    >>> replace('\\x81\\\\', [('\\\\', '/')])
+    '\\x81\\\\'
+    '''
+
+    # some character encodings (cp932 for Japanese, at least) use
+    # ASCII characters other than control/alphabet/digit as a part of
+    # multi-bytes characters, so direct replacing with such characters
+    # on strings in local encoding causes invalid byte sequences.
+    utext = text.decode(encoding.encoding)
     for f, t in substs:
-        text = text.replace(f, t)
-    return text
+        utext = utext.replace(f, t)
+    return utext.encode(encoding.encoding)
 
 _blockre = re.compile(r"\n(?:\s*\n)+")
 
--- a/mercurial/patch.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/patch.py	Tue Nov 01 16:49:30 2011 -0500
@@ -1787,18 +1787,17 @@
     diffre = re.compile('^diff .*-r [a-z0-9]+\s(.*)$')
 
     results = []
-    filename, adds, removes = None, 0, 0
+    filename, adds, removes, isbinary = None, 0, 0, False
 
     def addresult():
         if filename:
-            isbinary = adds == 0 and removes == 0
             results.append((filename, adds, removes, isbinary))
 
     for line in lines:
         if line.startswith('diff'):
             addresult()
             # set numbers to 0 anyway when starting new file
-            adds, removes = 0, 0
+            adds, removes, isbinary = 0, 0, False
             if line.startswith('diff --git'):
                 filename = gitre.search(line).group(1)
             elif line.startswith('diff -r'):
@@ -1808,6 +1807,9 @@
             adds += 1
         elif line.startswith('-') and not line.startswith('---'):
             removes += 1
+        elif (line.startswith('GIT binary patch') or
+              line.startswith('Binary file')):
+            isbinary = True
     addresult()
     return results
 
@@ -1832,7 +1834,7 @@
         return max(i * graphwidth // maxtotal, int(bool(i)))
 
     for filename, adds, removes, isbinary in stats:
-        if git and isbinary:
+        if isbinary:
             count = 'Bin'
         else:
             count = adds + removes
--- a/mercurial/posix.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/posix.py	Tue Nov 01 16:49:30 2011 -0500
@@ -199,6 +199,14 @@
             return fcntl.fcntl(fd, F_GETPATH, '\0' * 1024).rstrip('\0')
         finally:
             os.close(fd)
+elif sys.version_info < (2, 4, 2, 'final'):
+    # Workaround for http://bugs.python.org/issue1213894 (os.path.realpath
+    # didn't resolve symlinks that were the first component of the path.)
+    def realpath(path):
+        if os.path.isabs(path):
+            return os.path.realpath(path)
+        else:
+            return os.path.realpath('./' + path)
 else:
     # Fallback to the likely inadequate Python builtin function.
     realpath = os.path.realpath
--- a/mercurial/repair.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/repair.py	Tue Nov 01 16:49:30 2011 -0500
@@ -11,8 +11,9 @@
 from mercurial.i18n import _
 import os
 
-def _bundle(repo, cg, node, suffix, compress=True):
+def _bundle(repo, bases, heads, node, suffix, compress=True):
     """create a bundle with the specified revisions as a backup"""
+    cg = repo.changegroupsubset(bases, heads, 'strip')
     backupdir = repo.join("strip-backup")
     if not os.path.isdir(backupdir):
         os.mkdir(backupdir)
@@ -82,9 +83,11 @@
             saveheads.add(r)
     saveheads = [cl.node(r) for r in saveheads]
 
-    # compute common nodes
-    savecommon = set(cl.node(p) for r in saverevs for p in cl.parentrevs(r)
-                     if p not in saverevs and p not in tostrip)
+    # compute base nodes
+    if saverevs:
+        descendants = set(cl.descendants(*saverevs))
+        saverevs.difference_update(descendants)
+    savebases = [cl.node(r) for r in saverevs]
 
     bm = repo._bookmarks
     updatebm = []
@@ -96,14 +99,12 @@
     # create a changegroup for all the branches we need to keep
     backupfile = None
     if backup == "all":
-        allnodes=[cl.node(r) for r in xrange(striprev, len(cl))]
-        cg = repo._changegroup(allnodes, 'strip')
-        backupfile = _bundle(repo, cg, node, 'backup')
+        backupfile = _bundle(repo, [node], cl.heads(), node, 'backup')
         repo.ui.status(_("saved backup bundle to %s\n") % backupfile)
-    if saveheads or savecommon:
+    if saveheads or savebases:
         # do not compress partial bundle if we remove it from disk later
-        cg = repo.getbundle('strip', common=savecommon, heads=saveheads)
-        chgrpfile = _bundle(repo, cg, node, 'temp', compress=keeppartialbundle)
+        chgrpfile = _bundle(repo, savebases, saveheads, node, 'temp',
+                            compress=keeppartialbundle)
 
     mfst = repo.manifest
 
@@ -127,7 +128,7 @@
             tr.abort()
             raise
 
-        if saveheads or savecommon:
+        if saveheads or savebases:
             ui.note(_("adding branch\n"))
             f = open(chgrpfile, "rb")
             gen = changegroup.readbundle(f, chgrpfile)
--- a/mercurial/revset.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/revset.py	Tue Nov 01 16:49:30 2011 -0500
@@ -6,7 +6,8 @@
 # GNU General Public License version 2 or any later version.
 
 import re
-import parser, util, error, discovery, hbisect, node
+import parser, util, error, discovery, hbisect
+import node as nodemod
 import bookmarks as bookmarksmod
 import match as matchmod
 from i18n import _
@@ -1068,6 +1069,8 @@
     '(10 or 11):: and ((this()) or (that()))'
     >>> formatspec('%d:: and not %d::', 10, 20)
     '10:: and not 20::'
+    >>> formatspec('%ld or %ld', [], [1])
+    '(0-0) or (1)'
     >>> formatspec('keyword(%s)', 'foo\\xe9')
     "keyword('foo\\\\xe9')"
     >>> b = lambda: 'default'
@@ -1090,7 +1093,7 @@
             parse(arg) # make sure syntax errors are confined
             return '(%s)' % arg
         elif c == 'n':
-            return quote(node.hex(arg))
+            return quote(nodemod.hex(arg))
         elif c == 'b':
             return quote(arg.branch())
 
@@ -1111,7 +1114,10 @@
                 # a list of some type
                 pos += 1
                 d = expr[pos]
-                lv = ' or '.join(argtype(d, e) for e in args[arg])
+                if args[arg]:
+                    lv = ' or '.join(argtype(d, e) for e in args[arg])
+                else:
+                    lv = '0-0' # a minimal way to represent an empty set
                 ret += '(%s)' % lv
                 arg += 1
             else:
--- a/mercurial/subrepo.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/subrepo.py	Tue Nov 01 16:49:30 2011 -0500
@@ -418,6 +418,7 @@
                                % (inst, subrelpath(self)))
 
     def archive(self, ui, archiver, prefix):
+        self._get(self._state + ('hg',))
         abstractsubrepo.archive(self, ui, archiver, prefix)
 
         rev = self._state[1]
@@ -466,7 +467,7 @@
                 self._repo.ui.status(_('cloning subrepo %s from %s\n')
                                      % (subrelpath(self), srcurl))
                 parentrepo = self._repo._subparent
-                shutil.rmtree(self._repo.root)
+                shutil.rmtree(self._repo.path)
                 other, self._repo = hg.clone(self._repo._subparent.ui, {}, other,
                                          self._repo.root, update=False)
                 self._initrepo(parentrepo, source, create=True)
--- a/mercurial/templates/coal/map	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/coal/map	Tue Nov 01 16:49:30 2011 -0500
@@ -199,7 +199,7 @@
     <td><a href="{url}{sessionvars%urlparameter}">{name|escape}</a></td>
     <td>{description}</td>
     <td>{contact|obfuscate}</td>
-    <td class="age">{lastchange|date}</td>
+    <td class="age">{lastchange|rfc822date}</td>
     <td class="indexlinks">{archives%indexarchiveentry}</td>
   </tr>\n'
 indexarchiveentry = '<a href="{url}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}</a>'
--- a/mercurial/templates/gitweb/changelogentry.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/gitweb/changelogentry.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -1,5 +1,5 @@
 <div>
-<a class="title" href="{url}rev/{node|short}{sessionvars%urlparameter}"><span class="age">{date|date}</span>{desc|strip|firstline|escape|nonempty}<span class="logtags"> {inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span></a>
+<a class="title" href="{url}rev/{node|short}{sessionvars%urlparameter}"><span class="age">{date|rfc822date}</span>{desc|strip|firstline|escape|nonempty}<span class="logtags"> {inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span></a>
 </div>
 <div class="title_text">
 <div class="log_link">
--- a/mercurial/templates/gitweb/changeset.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/gitweb/changeset.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -32,7 +32,7 @@
 <div class="title_text">
 <table cellspacing="0">
 <tr><td>author</td><td>{author|obfuscate}</td></tr>
-<tr><td></td><td class="date age">{date|date}</td></tr>
+<tr><td></td><td class="date age">{date|rfc822date}</td></tr>
 {branch%changesetbranch}
 <tr><td>changeset {rev}</td><td style="font-family:monospace">{node|short}</td></tr>
 {parent%changesetparent}
--- a/mercurial/templates/gitweb/fileannotate.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/gitweb/fileannotate.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -40,7 +40,7 @@
  <td>{author|obfuscate}</td></tr>
 <tr>
  <td></td>
- <td class="date age">{date|date}</td></tr>
+ <td class="date age">{date|rfc822date}</td></tr>
 {branch%filerevbranch}
 <tr>
  <td>changeset {rev}</td>
--- a/mercurial/templates/gitweb/filerevision.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/gitweb/filerevision.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -40,7 +40,7 @@
  <td>{author|obfuscate}</td></tr>
 <tr>
  <td></td>
- <td class="date age">{date|date}</td></tr>
+ <td class="date age">{date|rfc822date}</td></tr>
 {branch%filerevbranch}
 <tr>
  <td>changeset {rev}</td>
--- a/mercurial/templates/gitweb/map	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/gitweb/map	Tue Nov 01 16:49:30 2011 -0500
@@ -162,7 +162,7 @@
 tags = tags.tmpl
 tagentry = '
   <tr class="parity{parity}">
-    <td class="age"><i class="age">{date|date}</i></td>
+    <td class="age"><i class="age">{date|rfc822date}</i></td>
     <td><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}"><b>{tag|escape}</b></a></td>
     <td class="link">
       <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
@@ -173,7 +173,7 @@
 bookmarks = bookmarks.tmpl
 bookmarkentry = '
   <tr class="parity{parity}">
-    <td class="age"><i class="age">{date|date}</i></td>
+    <td class="age"><i class="age">{date|rfc822date}</i></td>
     <td><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}"><b>{bookmark|escape}</b></a></td>
     <td class="link">
       <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
@@ -184,7 +184,7 @@
 branches = branches.tmpl
 branchentry = '
   <tr class="parity{parity}">
-    <td class="age"><i class="age">{date|date}</i></td>
+    <td class="age"><i class="age">{date|rfc822date}</i></td>
     <td><a class="list" href="{url}shortlog/{node|short}{sessionvars%urlparameter}"><b>{node|short}</b></a></td>
     <td class="{status}">{branch|escape}</td>
     <td class="link">
@@ -228,7 +228,7 @@
 bookmarktag = '<span class="bookmarktag" title="{name}">{name}</span> '
 shortlogentry = '
   <tr class="parity{parity}">
-    <td class="age"><i class="age">{date|date}</i></td>
+    <td class="age"><i class="age">{date|rfc822date}</i></td>
     <td><i>{author|person}</i></td>
     <td>
       <a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">
@@ -243,7 +243,7 @@
   </tr>'
 filelogentry = '
   <tr class="parity{parity}">
-    <td class="age"><i class="age">{date|date}</i></td>
+    <td class="age"><i class="age">{date|rfc822date}</i></td>
     <td>
       <a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">
         <b>{desc|strip|firstline|escape|nonempty}</b>
@@ -262,7 +262,7 @@
     </td>
     <td>{description}</td>
     <td>{contact|obfuscate}</td>
-    <td class="age">{lastchange|date}</td>
+    <td class="age">{lastchange|rfc822date}</td>
     <td class="indexlinks">{archives%indexarchiveentry}</td>
     <td><div class="rss_logo"><a href="{url}rss-log">RSS</a> <a href="{url}atom-log">Atom</a></div></td>
   </tr>\n'
--- a/mercurial/templates/monoblue/changelogentry.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/monoblue/changelogentry.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -1,6 +1,6 @@
 <h3 class="changelog"><a class="title" href="{url}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}<span class="logtags"> {inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span></a></h3>
 <ul class="changelog-entry">
-    <li class="age">{date|date}</li>
+    <li class="age">{date|rfc822date}</li>
     <li>by <span class="name">{author|obfuscate}</span> <span class="revdate">[{date|rfc822date}] rev {rev}</span></li>
     <li class="description">{desc|strip|escape|addbreaks|nonempty}</li>
 </ul>
--- a/mercurial/templates/monoblue/changeset.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/monoblue/changeset.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -38,13 +38,13 @@
     <h2 class="no-link no-border">changeset</h2>
 
     <h3 class="changeset"><a href="{url}raw-rev/{node|short}">{desc|strip|escape|firstline|nonempty} <span class="logtags">{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span></a></h3>
-    <p class="changeset-age age">{date|date}</p>
+    <p class="changeset-age age">{date|rfc822date}</p>
 
     <dl class="overview">
         <dt>author</dt>
         <dd>{author|obfuscate}</dd>
         <dt>date</dt>
-        <dd>{date|date}</dd>
+        <dd>{date|rfc822date}</dd>
         {branch%changesetbranch}
         <dt>changeset {rev}</dt>
         <dd>{node|short}</dd>
--- a/mercurial/templates/monoblue/fileannotate.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/monoblue/fileannotate.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -40,13 +40,13 @@
 
     <h2 class="no-link no-border">{file|escape}@{node|short} (annotated)</h2>
     <h3 class="changeset">{file|escape}</h3>
-    <p class="changeset-age age">{date|date}</p>
+    <p class="changeset-age age">{date|rfc822date}</p>
 
     <dl class="overview">
         <dt>author</dt>
         <dd>{author|obfuscate}</dd>
         <dt>date</dt>
-        <dd>{date|date}</dd>
+        <dd>{date|rfc822date}</dd>
         {branch%filerevbranch}
         <dt>changeset {rev}</dt>
         <dd><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></dd>
--- a/mercurial/templates/monoblue/filerevision.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/monoblue/filerevision.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -40,13 +40,13 @@
 
     <h2 class="no-link no-border">{file|escape}@{node|short}</h2>
     <h3 class="changeset">{file|escape}</h3>
-    <p class="changeset-age age">{date|date}</p>
+    <p class="changeset-age age">{date|rfc822date}</p>
 
     <dl class="overview">
         <dt>author</dt>
         <dd>{author|obfuscate}</dd>
         <dt>date</dt>
-        <dd>{date|date}</dd>
+        <dd>{date|rfc822date}</dd>
         {branch%filerevbranch}
         <dt>changeset {rev}</dt>
         <dd><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></dd>
--- a/mercurial/templates/monoblue/map	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/monoblue/map	Tue Nov 01 16:49:30 2011 -0500
@@ -141,7 +141,7 @@
 tags = tags.tmpl
 tagentry = '
   <tr class="parity{parity}">
-    <td class="nowrap age">{date|date}</td>
+    <td class="nowrap age">{date|rfc822date}</td>
     <td><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{tag|escape}</a></td>
     <td class="nowrap">
       <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
@@ -152,7 +152,7 @@
 bookmarks = bookmarks.tmpl
 bookmarkentry = '
   <tr class="parity{parity}">
-    <td class="nowrap date">{date|date}</td>
+    <td class="nowrap date">{date|rfc822date}</td>
     <td><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{bookmark|escape}</a></td>
     <td class="nowrap">
       <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
@@ -163,7 +163,7 @@
 branches = branches.tmpl
 branchentry = '
   <tr class="parity{parity}">
-    <td class="nowrap age">{date|date}</td>
+    <td class="nowrap age">{date|rfc822date}</td>
     <td><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
     <td class="{status}">{branch|escape}</td>
     <td class="nowrap">
@@ -196,7 +196,7 @@
 bookmarktag = '<span class="bookmarktag" title="{name}">{name}</span> '
 shortlogentry = '
   <tr class="parity{parity}">
-    <td class="nowrap age">{date|date}</td>
+    <td class="nowrap age">{date|rfc822date}</td>
     <td>{author|person}</td>
     <td>
       <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
@@ -211,7 +211,7 @@
   </tr>'
 filelogentry = '
   <tr class="parity{parity}">
-    <td class="nowrap age">{date|date}</td>
+    <td class="nowrap age">{date|rfc822date}</td>
     <td><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a></td>
     <td class="nowrap">
       <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a>&nbsp;|&nbsp;<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>&nbsp;|&nbsp;<a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
@@ -224,7 +224,7 @@
     <td><a href="{url}{sessionvars%urlparameter}">{name|escape}</a></td>
     <td>{description}</td>
     <td>{contact|obfuscate}</td>
-    <td class="age">{lastchange|date}</td>
+    <td class="age">{lastchange|rfc822date}</td>
     <td class="indexlinks">{archives%indexarchiveentry}</td>
     <td>
       <div class="rss_logo">
--- a/mercurial/templates/paper/changeset.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/paper/changeset.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -49,7 +49,7 @@
 </tr>
 <tr>
  <th class="date">date</th>
- <td class="date age">{date|date}</td></tr>
+ <td class="date age">{date|rfc822date}</td></tr>
 <tr>
  <th class="author">parents</th>
  <td class="author">{parent%changesetparent}</td>
--- a/mercurial/templates/paper/fileannotate.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/paper/fileannotate.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -54,7 +54,7 @@
 </tr>
 <tr>
  <th class="date">date</th>
- <td class="date age">{date|date}</td>
+ <td class="date age">{date|rfc822date}</td>
 </tr>
 <tr>
  <th class="author">parents</th>
--- a/mercurial/templates/paper/filediff.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/paper/filediff.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -53,7 +53,7 @@
 </tr>
 <tr>
  <th>date</th>
- <td class="date age">{date|date}</td>
+ <td class="date age">{date|rfc822date}</td>
 </tr>
 <tr>
  <th>parents</th>
--- a/mercurial/templates/paper/filelogentry.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/paper/filelogentry.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -1,5 +1,5 @@
  <tr class="parity{parity}">
-  <td class="age">{date|date}</td>
+  <td class="age">{date|rfc822date}</td>
   <td class="author">{author|person}</td>
   <td class="description"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags%changelogtag}{rename%filelogrename}</td>
  </tr>
--- a/mercurial/templates/paper/filerevision.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/paper/filerevision.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -52,7 +52,7 @@
 </tr>
 <tr>
  <th class="date">date</th>
- <td class="date age">{date|date}</td>
+ <td class="date age">{date|rfc822date}</td>
 </tr>
 <tr>
  <th class="author">parents</th>
--- a/mercurial/templates/paper/map	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/paper/map	Tue Nov 01 16:49:30 2011 -0500
@@ -198,7 +198,7 @@
     <td><a href="{url}{sessionvars%urlparameter}">{name|escape}</a></td>
     <td>{description}</td>
     <td>{contact|obfuscate}</td>
-    <td class="age">{lastchange|date}</td>
+    <td class="age">{lastchange|rfc822date}</td>
     <td class="indexlinks">{archives%indexarchiveentry}</td>
   </tr>\n'
 indexarchiveentry = '<a href="{url}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}</a>'
--- a/mercurial/templates/paper/shortlogentry.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/paper/shortlogentry.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -1,5 +1,5 @@
  <tr class="parity{parity}">
-  <td class="age">{date|date}</td>
+  <td class="age">{date|rfc822date}</td>
   <td class="author">{author|person}</td>
   <td class="description"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags % '<span class="tag">{name|escape}</span> '}{bookmarks % '<span class="tag">{name|escape}</span> '}</td>
  </tr>
--- a/mercurial/templates/spartan/changelogentry.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/spartan/changelogentry.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -1,6 +1,6 @@
 <table class="logEntry parity{parity}">
  <tr>
-  <th><span class="age">{date|date}</span>:</th>
+  <th><span class="age">{date|rfc822date}</span>:</th>
   <th class="firstline">{desc|strip|firstline|escape|nonempty}</th>
  </tr>
  <tr>
@@ -16,7 +16,7 @@
  </tr>
  <tr>
   <th class="date">date:</th>
-  <td class="date">{date|date}</td>
+  <td class="date">{date|rfc822date}</td>
  </tr>
  <tr>
   <th class="files"><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>:</th>
--- a/mercurial/templates/spartan/changeset.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/spartan/changeset.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -31,7 +31,7 @@
 </tr>
 <tr>
  <th class="date">date:</th>
- <td class="date age">{date|date}</td>
+ <td class="date age">{date|rfc822date}</td>
 </tr>
 <tr>
  <th class="files">files:</th>
--- a/mercurial/templates/spartan/fileannotate.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/spartan/fileannotate.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -30,7 +30,7 @@
  <td>{author|obfuscate}</td></tr>
 <tr>
  <td class="metatag">date:</td>
- <td class="date age">{date|date}</td>
+ <td class="date age">{date|rfc822date}</td>
 </tr>
 <tr>
  <td class="metatag">permissions:</td>
--- a/mercurial/templates/spartan/filelogentry.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/spartan/filelogentry.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -1,6 +1,6 @@
 <table class="logEntry parity{parity}">
  <tr>
-  <th><span class="age">{date|date}</span>:</th>
+  <th><span class="age">{date|rfc822date}</span>:</th>
   <th class="firstline"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a></th>
  </tr>
  <tr>
@@ -18,7 +18,7 @@
  </tr>
  <tr>
   <th class="date">date:</th>
-  <td class="date">{date|date}</td>
+  <td class="date">{date|rfc822date}</td>
  </tr>
 </table>
 
--- a/mercurial/templates/spartan/filerevision.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/spartan/filerevision.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -30,7 +30,7 @@
  <td>{author|obfuscate}</td></tr>
 <tr>
  <td class="metatag">date:</td>
- <td class="date age">{date|date}</td></tr>
+ <td class="date age">{date|rfc822date}</td></tr>
 <tr>
  <td class="metatag">permissions:</td>
  <td>{permissions|permissions}</td></tr>
--- a/mercurial/templates/spartan/map	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/spartan/map	Tue Nov 01 16:49:30 2011 -0500
@@ -168,7 +168,7 @@
     <td><a href="{url}{sessionvars%urlparameter}">{name|escape}</a></td>
     <td>{description}</td>
     <td>{contact|obfuscate}</td>
-    <td class="age">{lastchange|date}</td>
+    <td class="age">{lastchange|rfc822date}</td>
     <td class="indexlinks">
       <a href="{url}rss-log">RSS</a>
       <a href="{url}atom-log">Atom</a>
--- a/mercurial/templates/spartan/shortlogentry.tmpl	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/templates/spartan/shortlogentry.tmpl	Tue Nov 01 16:49:30 2011 -0500
@@ -1,6 +1,6 @@
 <table class="slogEntry parity{parity}">
  <tr>
-  <td class="age">{date|date}</td>
+  <td class="age">{date|rfc822date}</td>
   <td class="author">{author|person}</td>
   <td class="node"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a></td>
  </tr>
--- a/mercurial/util.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/mercurial/util.py	Tue Nov 01 16:49:30 2011 -0500
@@ -73,14 +73,24 @@
 
 # Python compatibility
 
-def sha1(s):
+def sha1(s=''):
+    '''
+    Low-overhead wrapper around Python's SHA support
+
+    >>> f = _fastsha1
+    >>> a = sha1()
+    >>> a = f()
+    >>> a.hexdigest()
+    'da39a3ee5e6b4b0d3255bfef95601890afd80709'
+    '''
+
     return _fastsha1(s)
 
 _notset = object()
 def safehasattr(thing, attr):
     return getattr(thing, attr, _notset) is not _notset
 
-def _fastsha1(s):
+def _fastsha1(s=''):
     # This function will import sha1 from hashlib or sha (whichever is
     # available) and overwrite itself with it on the first call.
     # Subsequent calls will go directly to the imported function.
@@ -514,6 +524,7 @@
     "filename contains '\\\\x07', which is invalid on Windows"
     >>> checkwinfilename("foo/bar/bla ")
     "filename ends with ' ', which is not allowed on Windows"
+    >>> checkwinfilename("../bar")
     '''
     for n in path.replace('\\', '/').split('/'):
         if not n:
@@ -530,7 +541,7 @@
             return _("filename contains '%s', which is reserved "
                      "on Windows") % base
         t = n[-1]
-        if t in '. ':
+        if t in '. ' and n not in '..':
             return _("filename ends with '%s', which is not allowed "
                      "on Windows") % t
 
--- a/setup.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/setup.py	Tue Nov 01 16:49:30 2011 -0500
@@ -133,21 +133,22 @@
 
 version = ''
 
+# Execute hg out of this directory with a custom environment which
+# includes the pure Python modules in mercurial/pure. We also take
+# care to not use any hgrc files and do no localization.
+pypath = ['mercurial', os.path.join('mercurial', 'pure')]
+env = {'PYTHONPATH': os.pathsep.join(pypath),
+       'HGRCPATH': '',
+       'LANGUAGE': 'C'}
+if 'LD_LIBRARY_PATH' in os.environ:
+    env['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
+if 'SystemRoot' in os.environ:
+    # Copy SystemRoot into the custom environment for Python 2.6
+    # under Windows. Otherwise, the subprocess will fail with
+    # error 0xc0150004. See: http://bugs.python.org/issue3440
+    env['SystemRoot'] = os.environ['SystemRoot']
+
 if os.path.isdir('.hg'):
-    # Execute hg out of this directory with a custom environment which
-    # includes the pure Python modules in mercurial/pure. We also take
-    # care to not use any hgrc files and do no localization.
-    pypath = ['mercurial', os.path.join('mercurial', 'pure')]
-    env = {'PYTHONPATH': os.pathsep.join(pypath),
-           'HGRCPATH': '',
-           'LANGUAGE': 'C'}
-    if 'LD_LIBRARY_PATH' in os.environ:
-        env['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
-    if 'SystemRoot' in os.environ:
-        # Copy SystemRoot into the custom environment for Python 2.6
-        # under Windows. Otherwise, the subprocess will fail with
-        # error 0xc0150004. See: http://bugs.python.org/issue3440
-        env['SystemRoot'] = os.environ['SystemRoot']
     cmd = [sys.executable, 'hg', 'id', '-i', '-t']
     l = runhg(cmd, env).split()
     while len(l) > 1 and l[-1][0].isalpha(): # remove non-numbered tags
--- a/tests/heredoctest.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/heredoctest.py	Tue Nov 01 16:49:30 2011 -0500
@@ -1,6 +1,9 @@
 import doctest, tempfile, os, sys
 
 if __name__ == "__main__":
+    if 'TERM' in os.environ:
+        del os.environ['TERM']
+
     fd, name = tempfile.mkstemp(suffix='hg-tst')
 
     try:
--- a/tests/hghave	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/hghave	Tue Nov 01 16:49:30 2011 -0500
@@ -140,6 +140,9 @@
 def has_svn15():
     return getsvnversion() >= (1, 5)
 
+def has_svn13():
+    return getsvnversion() >= (1, 3)
+
 def has_svn():
     return matchoutput('svn --version 2>&1', r'^svn, version') and \
         matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
@@ -230,6 +233,7 @@
     "pygments": (has_pygments, "Pygments source highlighting library"),
     "ssl": (has_ssl, "python >= 2.6 ssl module and python OpenSSL"),
     "svn": (has_svn, "subversion client and admin tools"),
+    "svn13": (has_svn13, "subversion client and admin tools >= 1.3"),
     "svn15": (has_svn15, "subversion client and admin tools >= 1.5"),
     "svn-bindings": (has_svn_bindings, "subversion python bindings"),
     "symlink": (has_symlink, "symbolic links"),
--- a/tests/run-tests.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/run-tests.py	Tue Nov 01 16:49:30 2011 -0500
@@ -1129,6 +1129,8 @@
     os.environ['COLUMNS'] = '80'
     os.environ['GREP_OPTIONS'] = ''
     os.environ['http_proxy'] = ''
+    os.environ['no_proxy'] = ''
+    os.environ['NO_PROXY'] = ''
 
     # unset env related to hooks
     for k in os.environ.keys():
--- a/tests/test-check-code.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-check-code.t	Tue Nov 01 16:49:30 2011 -0500
@@ -26,6 +26,23 @@
   > # Do not complain about our own definition
   > def any(x):
   >     pass
+  > 
+  > # try/except/finally block does not exist in Python 2.4
+  >     try:
+  >         pass
+  >     except StandardError, inst:
+  >         pass
+  >     finally:
+  >         pass
+  > 
+  > # nested try/finally+try/except is allowed
+  >     try:
+  >         try:
+  >             pass
+  >         except StandardError, inst:
+  >             pass
+  >     finally:
+  >         pass
   > EOF
   $ cat > classstyle.py <<EOF
   > class newstyle_class(object):
@@ -50,8 +67,8 @@
    Python keyword is not a function
   ./wrong.py:3:
    >     return ( 5+6, 9)
+   gratuitous whitespace in () or []
    missing whitespace in expression
-   gratuitous whitespace in () or []
   ./quote.py:5:
    > '"""', 42+1, """and
    missing whitespace in expression
@@ -64,6 +81,9 @@
   ./non-py24.py:4:
    >     y = format(x)
    any/all/format not available in Python 2.4
+  ./non-py24.py:11:
+   >     try:
+   no try/except/finally in Py2.4
   ./classstyle.py:4:
    > class oldstyle_class:
    old-style class, use class foo(object)
--- a/tests/test-check-pyflakes.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-check-pyflakes.t	Tue Nov 01 16:49:30 2011 -0500
@@ -1,5 +1,5 @@
   $ "$TESTDIR/hghave" pyflakes || exit 80
-  $ cd $(dirname $TESTDIR)
+  $ cd `dirname $TESTDIR`
   $ pyflakes mercurial hgext 2>&1 | $TESTDIR/filterpyflakes.py
   hgext/inotify/linux/__init__.py:*: 'from _inotify import *' used; unable to detect undefined names (glob)
   
--- a/tests/test-convert-darcs.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-convert-darcs.t	Tue Nov 01 16:49:30 2011 -0500
@@ -48,7 +48,7 @@
   $ darcs record -a -l -m p1.2
   Finished recording patch 'p1.2'
 
-  $ darcs pull -a ../darcs-clone
+  $ darcs pull -a --no-set-default ../darcs-clone
   Backing up ./a(-darcs-backup0)
   We have conflicts in the following files:
   ./a
@@ -74,41 +74,6 @@
   $ darcs record -a -l -m p3
   Finished recording patch 'p3'
 
-test utf-8 commit message and author
-
-  $ echo g > g
-
-darcs is encoding agnostic, so it takes whatever bytes it's given
-
-  $ darcs record -a -l -m 'p4: desc ñ' -A 'author ñ'
-  Finished recording patch 'p4: desc \xc3\xb1' (esc)
-
-Test latin-1 commit message
-
-  $ echo h > h
-  $ printf "p5: desc " > ../p5
-  $ python -c 'print "".join([chr(i) for i in range(128, 256)])' >> ../p5
-  $ darcs record -a -l --logfile ../p5
-  Finished recording patch 'p5: desc \x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff' (esc)
- 
-  $ glog()
-  > {
-  >     HGENCODING=utf-8 hg glog --template '{rev} "{desc|firstline}" ({author}) files: {files}\n' "$@"
-  > }
-  $ cd ..
-  $ hg convert darcs-repo darcs-repo-hg
-  initializing destination darcs-repo-hg repository
-  scanning source...
-  sorting...
-  converting...
-  6 p0
-  5 p1.2
-  4 p1.1
-  3 p2
-  2 p3
-  1 p4: desc ?
-  0 p5: desc ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
-
 The converter does not currently handle patch conflicts very well.
 When they occur, it reverts *all* changes and moves forward,
 letting the conflict resolving patch fix collisions.
@@ -116,22 +81,23 @@
 "c" file in p1.1 patch are reverted too.
 Just to say that manifest not listing "c" here is a bug.
 
-  $ HGENCODING=latin-1 glog -R darcs-repo-hg -r 6
-  o  6 "p5: desc \xc2\x80\xc2\x81\xc2\x82\xc2\x83\xc2\x84\xc2\x85\xc2\x86\xc2\x87\xc2\x88\xc2\x89\xc2\x8a\xc2\x8b\xc2\x8c\xc2\x8d\xc2\x8e\xc2\x8f\xc2\x90\xc2\x91\xc2\x92\xc2\x93\xc2\x94\xc2\x95\xc2\x96\xc2\x97\xc2\x98\xc2\x99\xc2\x9a\xc2\x9b\xc2\x9c\xc2\x9d\xc2\x9e\xc2\x9f\xc2\xa0\xc2\xa1\xc2\xa2\xc2\xa3\xc2\xa4\xc2\xa5\xc2\xa6\xc2\xa7\xc2\xa8\xc2\xa9\xc2\xaa\xc2\xab\xc2\xac\xc2\xad\xc2\xae\xc2\xaf\xc2\xb0\xc2\xb1\xc2\xb2\xc2\xb3\xc2\xb4\xc2\xb5\xc2\xb6\xc2\xb7\xc2\xb8\xc2\xb9\xc2\xba\xc2\xbb\xc2\xbc\xc2\xbd\xc2\xbe\xc2\xbf\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x97\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9e\xc3\x9f\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb7\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbe\xc3\xbf" (test@example.org) files: h (esc)
-  |
-  $ HGENCODING=utf-8 glog -R darcs-repo-hg -r 0:5
-  o  5 "p4: desc \xc3\xb1" (author \xc3\xb1) files: g (esc)
-  |
-  o  4 "p3" (test@example.org) files: dir/d dir/d2 dir2/d f ff
-  |
-  o  3 "p2" (test@example.org) files: a dir/d dir/d2 f
-  |
-  o  2 "p1.1" (test@example.org) files:
-  |
-  o  1 "p1.2" (test@example.org) files: a b
-  |
-  o  0 "p0" (test@example.org) files: a
-  
+  $ cd ..
+  $ hg convert darcs-repo darcs-repo-hg
+  initializing destination darcs-repo-hg repository
+  scanning source...
+  sorting...
+  converting...
+  4 p0
+  3 p1.2
+  2 p1.1
+  1 p2
+  0 p3
+  $ hg log -R darcs-repo-hg -g --template '{rev} "{desc|firstline}" ({author}) files: {files}\n' "$@"
+  4 "p3" (test@example.org) files: dir/d dir/d2 dir2/d f ff
+  3 "p2" (test@example.org) files: a dir/d dir/d2 f
+  2 "p1.1" (test@example.org) files: 
+  1 "p1.2" (test@example.org) files: a b
+  0 "p0" (test@example.org) files: a
 
   $ hg up -q -R darcs-repo-hg
   $ hg -R darcs-repo-hg manifest --debug
@@ -139,5 +105,3 @@
   1e88685f5ddec574a34c70af492f95b6debc8741 644   b
   37406831adc447ec2385014019599dfec953c806 644   dir2/d
   b783a337463792a5c7d548ad85a7d3253c16ba8c 644   ff
-  0973eb1b2ecc4de7fafe7447ce1b7462108b4848 644   g
-  fe6f8b4f507fe3eb524c527192a84920a4288dac 644   h
--- a/tests/test-convert-svn-sink.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-convert-svn-sink.t	Tue Nov 01 16:49:30 2011 -0500
@@ -1,5 +1,5 @@
 
-  $ "$TESTDIR/hghave" svn no-outer-repo || exit 80
+  $ "$TESTDIR/hghave" svn13 no-outer-repo || exit 80
 
   $ fixpath()
   > {
--- a/tests/test-convert.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-convert.t	Tue Nov 01 16:49:30 2011 -0500
@@ -132,7 +132,7 @@
                   Mercurial. Default is False.
       convert.hg.saverev
                   store original revision ID in changeset (forces target IDs to
-                  change). It takes and boolean argument and defaults to False.
+                  change). It takes a boolean argument and defaults to False.
       convert.hg.startrev
                   convert start revision and its descendants. It takes a hg
                   revision identifier and defaults to 0.
--- a/tests/test-debugcomplete.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-debugcomplete.t	Tue Nov 01 16:49:30 2011 -0500
@@ -191,7 +191,7 @@
   add: include, exclude, subrepos, dry-run
   annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, include, exclude
   clone: noupdate, updaterev, rev, branch, pull, uncompressed, ssh, remotecmd, insecure
-  commit: addremove, close-branch, include, exclude, message, logfile, date, user
+  commit: addremove, close-branch, include, exclude, message, logfile, date, user, subrepos
   diff: rev, change, text, git, nodates, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, include, exclude, subrepos
   export: output, switch-parent, rev, text, git, nodates
   forget: include, exclude
--- a/tests/test-diffstat.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-diffstat.t	Tue Nov 01 16:49:30 2011 -0500
@@ -36,19 +36,21 @@
   $ hg ci -m appenda
 
   $ printf '\0' > c
-  $ hg add c
+  $ touch d
+  $ hg add c d
 
 Binary diffstat:
 
   $ hg diff --stat
-   c |    0 
+   c |  Bin 
    1 files changed, 0 insertions(+), 0 deletions(-)
 
 Binary git diffstat:
 
   $ hg diff --stat --git
    c |  Bin 
-   1 files changed, 0 insertions(+), 0 deletions(-)
+   d |    0 
+   2 files changed, 0 insertions(+), 0 deletions(-)
 
   $ hg ci -m createb
 
@@ -58,7 +60,7 @@
 Filename with spaces diffstat:
 
   $ hg diff --stat
-   file with spaces |    0 
+   file with spaces |  Bin 
    1 files changed, 0 insertions(+), 0 deletions(-)
 
 Filename with spaces git diffstat:
--- a/tests/test-doctest.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-doctest.py	Tue Nov 01 16:49:30 2011 -0500
@@ -4,6 +4,9 @@
     del os.environ['TERM']
 import doctest
 
+import mercurial.util
+doctest.testmod(mercurial.util)
+
 import mercurial.changelog
 doctest.testmod(mercurial.changelog)
 
@@ -22,9 +25,6 @@
 import mercurial.url
 doctest.testmod(mercurial.url)
 
-import mercurial.util
-doctest.testmod(mercurial.util)
-
 import mercurial.encoding
 doctest.testmod(mercurial.encoding)
 
@@ -36,3 +36,6 @@
 
 import mercurial.revset
 doctest.testmod(mercurial.revset)
+
+import mercurial.minirst
+doctest.testmod(mercurial.minirst)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-graft.t	Tue Nov 01 16:49:30 2011 -0500
@@ -0,0 +1,227 @@
+Create a repo with some stuff in it:
+
+  $ hg init a
+  $ cd a
+  $ echo a > a
+  $ echo a > d
+  $ echo a > e
+  $ hg ci -qAm0
+  $ echo b > a
+  $ hg ci -m1 -u bar
+  $ hg mv a b
+  $ hg ci -m2
+  $ hg cp b c
+  $ hg ci -m3 -u baz
+  $ echo b > d
+  $ echo f > e
+  $ hg ci -m4
+  $ hg up -q 3
+  $ echo b > e
+  $ hg branch -q stable
+  $ hg ci -m5
+  $ hg merge -q default --tool internal:local
+  $ hg branch -q default
+  $ hg ci -m6
+
+Need to specify a rev:
+
+  $ hg graft
+  abort: no revisions specified
+  [255]
+
+Can't graft ancestor:
+
+  $ hg graft 1 2
+  skipping ancestor revision 1
+  skipping ancestor revision 2
+  [255]
+
+Can't graft with dirty wd:
+
+  $ hg up -q 0
+  $ echo foo > a
+  $ hg graft 1
+  abort: outstanding uncommitted changes
+  [255]
+  $ hg revert a
+
+Graft a rename:
+
+  $ hg graft 2 -u foo
+  grafting revision 2
+  merging a and b to b
+  $ hg export tip --git
+  # HG changeset patch
+  # User foo
+  # Date 0 0
+  # Node ID d2e44c99fd3f31c176ea4efb9eca9f6306c81756
+  # Parent  68795b066622ca79a25816a662041d8f78f3cd9e
+  2
+  
+  diff --git a/a b/b
+  rename from a
+  rename to b
+  --- a/a
+  +++ b/b
+  @@ -1,1 +1,1 @@
+  -a
+  +b
+
+Look for extra:source
+
+  $ hg log --debug -r tip
+  changeset:   7:d2e44c99fd3f31c176ea4efb9eca9f6306c81756
+  tag:         tip
+  parent:      0:68795b066622ca79a25816a662041d8f78f3cd9e
+  parent:      -1:0000000000000000000000000000000000000000
+  manifest:    7:5d59766436fd8fbcd38e7bebef0f6eaf3eebe637
+  user:        foo
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  files+:      b
+  files-:      a
+  extra:       branch=default
+  extra:       source=5c095ad7e90f871700f02dd1fa5012cb4498a2d4
+  description:
+  2
+  
+  
+
+Graft out of order, skipping a merge and a duplicate
+
+  $ hg graft 1 5 4 3 'merge()' 2 --debug
+  skipping ungraftable merge revision 6
+  scanning for duplicate grafts
+  skipping already grafted revision 2
+  grafting revision 1
+    searching for copies back to rev 1
+    unmatched files in local:
+     a.orig
+     b
+    all copies found (* = to merge, ! = divergent):
+     b -> a *
+    checking for directory renames
+  resolving manifests
+   overwrite False partial False
+   ancestor 68795b066622 local d2e44c99fd3f+ remote 5d205f8b35b6
+   b: local copied/moved to a -> m
+  preserving b for resolve of b
+  updating: b 1/1 files (100.00%)
+    searching for copies back to rev 1
+    unmatched files in local:
+     a
+    unmatched files in other:
+     b
+    all copies found (* = to merge, ! = divergent):
+     b -> a *
+    checking for directory renames
+  b
+   b: searching for copy revision for a
+   b: copy a:b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3
+  grafting revision 5
+    searching for copies back to rev 1
+    unmatched files in local:
+     a.orig
+  resolving manifests
+   overwrite False partial False
+   ancestor 4c60f11aa304 local 6f5ea6ac8b70+ remote 97f8bfe72746
+   e: remote is newer -> g
+  updating: e 1/1 files (100.00%)
+  getting e
+    searching for copies back to rev 1
+    unmatched files in local:
+     c
+    all copies found (* = to merge, ! = divergent):
+     c -> b *
+    checking for directory renames
+  e
+  grafting revision 4
+    searching for copies back to rev 1
+    unmatched files in local:
+     a.orig
+  resolving manifests
+   overwrite False partial False
+   ancestor 4c60f11aa304 local 77eb504366ab+ remote 9c233e8e184d
+   e: versions differ -> m
+   d: remote is newer -> g
+  preserving e for resolve of e
+  updating: d 1/2 files (50.00%)
+  getting d
+  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
+  warning: conflicts during merge.
+  merging e failed!
+    searching for copies back to rev 1
+    unmatched files in local:
+     c
+    all copies found (* = to merge, ! = divergent):
+     c -> b *
+    checking for directory renames
+  abort: unresolved conflicts, can't continue
+  (use hg resolve and hg graft --continue)
+  [255]
+
+Continue without resolve should fail:
+
+  $ hg graft -c
+  grafting revision 4
+  abort: unresolved merge conflicts (see hg help resolve)
+  [255]
+
+Fix up:
+
+  $ echo b > e
+  $ hg resolve -m e
+
+Continue with a revision should fail:
+
+  $ hg graft -c 6
+  abort: can't specify --continue and revisions
+  [255]
+
+Continue for real, clobber usernames
+
+  $ hg graft -c -U
+  grafting revision 4
+  grafting revision 3
+
+Compare with original:
+
+  $ hg diff -r 6
+  $ hg status --rev 0:. -C
+  M d
+  M e
+  A b
+    a
+  A c
+    a
+  R a
+
+View graph:
+
+  $ hg --config extensions.graphlog= log -G --template '{author}@rev: {desc}\n'
+  @  test@rev: 3
+  |
+  o  test@rev: 4
+  |
+  o  test@rev: 5
+  |
+  o  bar@rev: 1
+  |
+  o  foo@rev: 2
+  |
+  | o    test@rev: 6
+  | |\
+  | | o  test@rev: 5
+  | | |
+  | o |  test@rev: 4
+  | |/
+  | o  baz@rev: 3
+  | |
+  | o  test@rev: 2
+  | |
+  | o  bar@rev: 1
+  |/
+  o  test@rev: 0
+  
--- a/tests/test-grep.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-grep.t	Tue Nov 01 16:49:30 2011 -0500
@@ -106,12 +106,8 @@
   $ python -c 'fp = open("noeol", "wb"); fp.write("no infinite loop"); fp.close();'
   $ hg ci -Amnoeol
   adding noeol
-
-last character omitted in output to avoid infinite loop
-
   $ hg grep loop
-  noeol:4:no infinite loo
-
+  noeol:4:no infinite loop
 
   $ cd ..
 
--- a/tests/test-hgrc.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-hgrc.t	Tue Nov 01 16:49:30 2011 -0500
@@ -3,13 +3,19 @@
   $ HGRCPATH=`pwd`/hgrc
   $ export HGRCPATH
 
+Use an alternate var for scribbling on hgrc to keep check-code from
+complaining about the important settings we may be overwriting:
+
+  $ HGRC=`pwd`/hgrc
+  $ export HGRC
+
 Basic syntax error
 
-  $ echo "invalid" > $HGRCPATH
+  $ echo "invalid" > $HGRC
   $ hg version
   hg: parse error at $TESTTMP/hgrc:1: invalid
   [255]
-  $ echo "" > $HGRCPATH
+  $ echo "" > $HGRC
 
 Issue1199: Can't use '%' in hgrc (eg url encoded username)
 
@@ -30,21 +36,21 @@
 
 issue1829: wrong indentation
 
-  $ echo '[foo]' > $HGRCPATH
-  $ echo '  x = y' >> $HGRCPATH
+  $ echo '[foo]' > $HGRC
+  $ echo '  x = y' >> $HGRC
   $ hg version
   hg: parse error at $TESTTMP/hgrc:2:   x = y
   [255]
 
   $ python -c "print '[foo]\nbar = a\n b\n c \n  de\n fg \nbaz = bif cb \n'" \
-  > > $HGRCPATH
+  > > $HGRC
   $ hg showconfig foo
   foo.bar=a\nb\nc\nde\nfg
   foo.baz=bif cb
 
   $ FAKEPATH=/path/to/nowhere
   $ export FAKEPATH
-  $ echo '%include $FAKEPATH/no-such-file' > $HGRCPATH
+  $ echo '%include $FAKEPATH/no-such-file' > $HGRC
   $ hg version
   Mercurial Distributed SCM (version *) (glob)
   (see http://mercurial.selenic.com for more information)
@@ -75,8 +81,8 @@
 
   $ FAKEUSER='John Doe'
   $ export FAKEUSER
-  $ echo '[ui]' > $HGRCPATH
-  $ echo 'username = $FAKEUSER' >> $HGRCPATH
+  $ echo '[ui]' > $HGRC
+  $ echo 'username = $FAKEUSER' >> $HGRC
 
   $ hg init usertest
   $ cd usertest
@@ -95,10 +101,10 @@
 
 showconfig with multiple arguments
 
-  $ echo "[alias]" > $HGRCPATH
-  $ echo "log = log -g" >> $HGRCPATH
-  $ echo "[defaults]" >> $HGRCPATH
-  $ echo "identify = -n" >> $HGRCPATH
+  $ echo "[alias]" > $HGRC
+  $ echo "log = log -g" >> $HGRC
+  $ echo "[defaults]" >> $HGRC
+  $ echo "identify = -n" >> $HGRC
   $ hg showconfig alias defaults
   alias.log=log -g
   defaults.identify=-n
@@ -113,19 +119,19 @@
 
   $ cd ..
   $ p=`pwd`
-  $ echo "[ui]" > $HGRCPATH
-  $ echo "debug=true" >> $HGRCPATH
-  $ echo "fallbackencoding=ASCII" >> $HGRCPATH
-  $ echo "quiet=true" >> $HGRCPATH
-  $ echo "slash=true" >> $HGRCPATH
-  $ echo "traceback=true" >> $HGRCPATH
-  $ echo "verbose=true" >> $HGRCPATH
-  $ echo "style=~/.hgstyle" >> $HGRCPATH
-  $ echo "logtemplate={node}" >> $HGRCPATH
-  $ echo "[defaults]" >> $HGRCPATH
-  $ echo "identify=-n" >> $HGRCPATH
-  $ echo "[alias]" >> $HGRCPATH
-  $ echo "log=log -g" >> $HGRCPATH
+  $ echo "[ui]" > $HGRC
+  $ echo "debug=true" >> $HGRC
+  $ echo "fallbackencoding=ASCII" >> $HGRC
+  $ echo "quiet=true" >> $HGRC
+  $ echo "slash=true" >> $HGRC
+  $ echo "traceback=true" >> $HGRC
+  $ echo "verbose=true" >> $HGRC
+  $ echo "style=~/.hgstyle" >> $HGRC
+  $ echo "logtemplate={node}" >> $HGRC
+  $ echo "[defaults]" >> $HGRC
+  $ echo "identify=-n" >> $HGRC
+  $ echo "[alias]" >> $HGRC
+  $ echo "log=log -g" >> $HGRC
 
 customized hgrc
 
@@ -158,8 +164,8 @@
   > def uisetup(ui):
   >     ui.write('plain: %r\n' % ui.plain())
   > EOF
-  $ echo "[extensions]" >> $HGRCPATH
-  $ echo "plain=./plain.py" >> $HGRCPATH
+  $ echo "[extensions]" >> $HGRC
+  $ echo "plain=./plain.py" >> $HGRC
   $ HGPLAINEXCEPT=; export HGPLAINEXCEPT
   $ hg showconfig --config ui.traceback=True --debug
   plain: True
--- a/tests/test-hgweb-commands.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-hgweb-commands.t	Tue Nov 01 16:49:30 2011 -0500
@@ -246,17 +246,17 @@
     <th class="description">description</th>
    </tr>
    <tr class="parity0">
-    <td class="age">Thu Jan 01 00:00:00 1970 +0000</td>
+    <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
     <td class="author">test</td>
     <td class="description"><a href="/rev/1d22e65f027e">branch</a><span class="branchhead">stable</span> <span class="tag">tip</span> <span class="tag">something</span> </td>
    </tr>
    <tr class="parity1">
-    <td class="age">Thu Jan 01 00:00:00 1970 +0000</td>
+    <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
     <td class="author">test</td>
     <td class="description"><a href="/rev/a4f92ed23982">Added tag 1.0 for changeset 2ef0ac749a14</a><span class="branchhead">default</span> </td>
    </tr>
    <tr class="parity0">
-    <td class="age">Thu Jan 01 00:00:00 1970 +0000</td>
+    <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
     <td class="author">test</td>
     <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> <span class="tag">anotherthing</span> </td>
    </tr>
@@ -339,7 +339,7 @@
   </tr>
   <tr>
    <th class="date">date</th>
-   <td class="date age">Thu Jan 01 00:00:00 1970 +0000</td></tr>
+   <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
   <tr>
    <th class="author">parents</th>
    <td class="author"></td>
@@ -476,7 +476,7 @@
     <th class="description">description</th>
    </tr>
    <tr class="parity0">
-    <td class="age">Thu Jan 01 00:00:00 1970 +0000</td>
+    <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
     <td class="author">test</td>
     <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> <span class="tag">anotherthing</span> </td>
    </tr>
@@ -586,7 +586,7 @@
   </tr>
   <tr>
    <th class="date">date</th>
-   <td class="date age">Thu Jan 01 00:00:00 1970 +0000</td>
+   <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
   </tr>
   <tr>
    <th class="author">parents</th>
@@ -701,7 +701,7 @@
   <table cellspacing="0">
   
   <tr class="parity0">
-  <td class="age"><i class="age">Thu Jan 01 00:00:00 1970 +0000</i></td>
+  <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
   <td><i>test</i></td>
   <td>
   <a class="list" href="/rev/1d22e65f027e?style=gitweb">
@@ -715,7 +715,7 @@
   </td>
   </tr>
   <tr class="parity1">
-  <td class="age"><i class="age">Thu Jan 01 00:00:00 1970 +0000</i></td>
+  <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
   <td><i>test</i></td>
   <td>
   <a class="list" href="/rev/a4f92ed23982?style=gitweb">
@@ -729,7 +729,7 @@
   </td>
   </tr>
   <tr class="parity0">
-  <td class="age"><i class="age">Thu Jan 01 00:00:00 1970 +0000</i></td>
+  <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
   <td><i>test</i></td>
   <td>
   <a class="list" href="/rev/2ef0ac749a14?style=gitweb">
@@ -749,7 +749,7 @@
   <table cellspacing="0">
   
   <tr class="parity0">
-  <td class="age"><i class="age">Thu Jan 01 00:00:00 1970 +0000</i></td>
+  <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
   <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>1.0</b></a></td>
   <td class="link">
   <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
@@ -764,7 +764,7 @@
   <table cellspacing="0">
   
   <tr class="parity0">
-  <td class="age"><i class="age">Thu Jan 01 00:00:00 1970 +0000</i></td>
+  <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
   <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>anotherthing</b></a></td>
   <td class="link">
   <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
@@ -773,7 +773,7 @@
   </td>
   </tr>
   <tr class="parity1">
-  <td class="age"><i class="age">Thu Jan 01 00:00:00 1970 +0000</i></td>
+  <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
   <td><a class="list" href="/rev/1d22e65f027e?style=gitweb"><b>something</b></a></td>
   <td class="link">
   <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
@@ -788,7 +788,7 @@
   <table cellspacing="0">
   
   <tr class="parity0">
-  <td class="age"><i class="age">Thu Jan 01 00:00:00 1970 +0000</i></td>
+  <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
   <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
   <td class="">stable</td>
   <td class="link">
@@ -798,7 +798,7 @@
   </td>
   </tr>
   <tr class="parity1">
-  <td class="age"><i class="age">Thu Jan 01 00:00:00 1970 +0000</i></td>
+  <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
   <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
   <td class="">default</td>
   <td class="link">
--- a/tests/test-hgweb-diffs.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-hgweb-diffs.t	Tue Nov 01 16:49:30 2011 -0500
@@ -81,7 +81,7 @@
   </tr>
   <tr>
    <th class="date">date</th>
-   <td class="date age">Thu Jan 01 00:00:00 1970 +0000</td></tr>
+   <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
   <tr>
    <th class="author">parents</th>
    <td class="author"></td>
@@ -240,7 +240,7 @@
   </tr>
   <tr>
    <th>date</th>
-   <td class="date age">Thu Jan 01 00:00:00 1970 +0000</td>
+   <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
   </tr>
   <tr>
    <th>parents</th>
@@ -341,7 +341,7 @@
   </tr>
   <tr>
    <th class="date">date</th>
-   <td class="date age">Thu Jan 01 00:00:00 1970 +0000</td></tr>
+   <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
   <tr>
    <th class="author">parents</th>
    <td class="author"></td>
@@ -504,7 +504,7 @@
   </tr>
   <tr>
    <th>date</th>
-   <td class="date age">Thu Jan 01 00:00:00 1970 +0000</td>
+   <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
   </tr>
   <tr>
    <th>parents</th>
--- a/tests/test-hgweb-filelog.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-hgweb-filelog.t	Tue Nov 01 16:49:30 2011 -0500
@@ -179,12 +179,12 @@
     <th class="description">description</th>
    </tr>
    <tr class="parity0">
-    <td class="age">Thu Jan 01 00:00:00 1970 +0000</td>
+    <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
     <td class="author">test</td>
     <td class="description"><a href="/rev/01de2d66a28d">second a</a></td>
    </tr>
    <tr class="parity1">
-    <td class="age">Thu Jan 01 00:00:00 1970 +0000</td>
+    <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
     <td class="author">test</td>
     <td class="description"><a href="/rev/5ed941583260">first a</a></td>
    </tr>
@@ -280,12 +280,12 @@
     <th class="description">description</th>
    </tr>
    <tr class="parity0">
-    <td class="age">Thu Jan 01 00:00:00 1970 +0000</td>
+    <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
     <td class="author">test</td>
     <td class="description"><a href="/rev/01de2d66a28d">second a</a></td>
    </tr>
    <tr class="parity1">
-    <td class="age">Thu Jan 01 00:00:00 1970 +0000</td>
+    <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
     <td class="author">test</td>
     <td class="description"><a href="/rev/5ed941583260">first a</a></td>
    </tr>
@@ -381,7 +381,7 @@
     <th class="description">description</th>
    </tr>
    <tr class="parity0">
-    <td class="age">Thu Jan 01 00:00:00 1970 +0000</td>
+    <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
     <td class="author">test</td>
     <td class="description"><a href="/rev/5ed941583260">first a</a></td>
    </tr>
@@ -477,7 +477,7 @@
     <th class="description">description</th>
    </tr>
    <tr class="parity0">
-    <td class="age">Thu Jan 01 00:00:00 1970 +0000</td>
+    <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
     <td class="author">test</td>
     <td class="description"><a href="/rev/5ed941583260">first a</a></td>
    </tr>
@@ -604,7 +604,7 @@
   
   <table class="logEntry parity0">
    <tr>
-    <th><span class="age">Thu Jan 01 00:00:00 1970 +0000</span>:</th>
+    <th><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>:</th>
     <th class="firstline"><a href="/rev/b7682196df1c?style=spartan">change c</a></th>
    </tr>
    <tr>
@@ -622,14 +622,14 @@
    </tr>
    <tr>
     <th class="date">date:</th>
-    <td class="date">Thu Jan 01 00:00:00 1970 +0000</td>
+    <td class="date">Thu, 01 Jan 1970 00:00:00 +0000</td>
    </tr>
   </table>
   
   
   <table class="logEntry parity1">
    <tr>
-    <th><span class="age">Thu Jan 01 00:00:00 1970 +0000</span>:</th>
+    <th><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>:</th>
     <th class="firstline"><a href="/rev/1a6696706df2?style=spartan">mv b</a></th>
    </tr>
    <tr>
@@ -655,7 +655,7 @@
    </tr>
    <tr>
     <th class="date">date:</th>
-    <td class="date">Thu Jan 01 00:00:00 1970 +0000</td>
+    <td class="date">Thu, 01 Jan 1970 00:00:00 +0000</td>
    </tr>
   </table>
   
--- a/tests/test-hgweb-removed.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-hgweb-removed.t	Tue Nov 01 16:49:30 2011 -0500
@@ -76,7 +76,7 @@
   </tr>
   <tr>
    <th class="date">date</th>
-   <td class="date age">Thu Jan 01 00:00:00 1970 +0000</td></tr>
+   <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
   <tr>
    <th class="author">parents</th>
    <td class="author"><a href="/rev/cb9a9f314b8b">cb9a9f314b8b</a> </td>
@@ -198,7 +198,7 @@
   </tr>
   <tr>
    <th>date</th>
-   <td class="date age">Thu Jan 01 00:00:00 1970 +0000</td>
+   <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
   </tr>
   <tr>
    <th>parents</th>
--- a/tests/test-highlight.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-highlight.t	Tue Nov 01 16:49:30 2011 -0500
@@ -121,7 +121,7 @@
   </tr>
   <tr>
    <th class="date">date</th>
-   <td class="date age">Thu Jan 01 00:00:00 1970 +0000</td>
+   <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
   </tr>
   <tr>
    <th class="author">parents</th>
@@ -251,7 +251,7 @@
   </tr>
   <tr>
    <th class="date">date</th>
-   <td class="date age">Thu Jan 01 00:00:00 1970 +0000</td>
+   <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
   </tr>
   <tr>
    <th class="author">parents</th>
--- a/tests/test-import.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-import.t	Tue Nov 01 16:49:30 2011 -0500
@@ -10,6 +10,11 @@
   $ echo line 2 >> a/a
   $ hg --cwd a ci -u someone -d '1 0' -m'second change'
 
+import with no args:
+
+  $ hg --cwd a import
+  abort: need at least one patch to import
+  [255]
 
 generate patches for the test
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-issue1802.t	Tue Nov 01 16:49:30 2011 -0500
@@ -0,0 +1,69 @@
+Create extension that can disable exec checks:
+
+  $ cat > noexec.py <<EOF
+  > from mercurial import extensions, util
+  > def setflags(orig, f, l, x):
+  >     pass
+  > def checkexec(orig, path):
+  >     return False
+  > def extsetup(ui):
+  >     extensions.wrapfunction(util, 'setflags', setflags)
+  >     extensions.wrapfunction(util, 'checkexec', checkexec)
+  > EOF
+
+  $ hg init unix-repo
+  $ cd unix-repo
+  $ touch a
+  $ hg add a
+  $ hg commit -m 'unix: add a'
+  $ hg clone . ../win-repo
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ chmod +x a
+  $ hg commit -m 'unix: chmod a'
+  $ hg manifest -v
+  755 * a
+
+  $ cd ../win-repo
+
+  $ touch b
+  $ hg add b
+  $ hg commit -m 'win: add b'
+
+  $ hg manifest -v
+  644   a
+  644   b
+
+  $ hg pull
+  pulling from $TESTTMP/unix-repo
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 0 changes to 0 files (+1 heads)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+
+  $ hg manifest -v -r tip
+  755 * a
+
+Simulate a Windows merge:
+
+  $ hg --config extensions.n=$TESTTMP/noexec.py merge --debug
+    searching for copies back to rev 1
+    unmatched files in local:
+     b
+  resolving manifests
+   overwrite None partial False
+   ancestor a03b0deabf2b local d6fa54f68ae1+ remote 2d8bcf2dda39
+   a: update permissions -> e
+  updating: a 1/1 files (100.00%)
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+
+Simulate a Windows commit:
+
+  $ hg --config extensions.n=$TESTTMP/noexec.py commit -m 'win: merge'
+
+  $ hg manifest -v
+  755 * a
+  644   b
--- a/tests/test-largefiles.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-largefiles.t	Tue Nov 01 16:49:30 2011 -0500
@@ -3,13 +3,14 @@
   > largefiles=
   > purge=
   > rebase=
+  > transplant=
   > [largefiles]
-  > size=2
+  > minsize=2
   > patterns=glob:**.dat
   > EOF
 
 Create the repo with a couple of revisions of both large and normal
-files (testing that status correctly shows largefiles.
+files, testing that status correctly shows largefiles.
 
   $ hg init a
   $ cd a
@@ -32,9 +33,7 @@
   M sub/normal2
   $ hg commit -m "edit files"
 
-Verify that committing new versions of largefiles results in correct
-largefile contents, and also that non-largefiles are not affected
-badly.
+Commit preserved largefile contents.
 
   $ cat normal1
   normal11
@@ -45,14 +44,14 @@
   $ cat sub/large2
   large22
 
-Verify removing largefiles and normal files works on largefile repos.
+Remove both largefiles and normal files.
  
   $ hg remove normal1 large1
   $ hg commit -m "remove files"
   $ ls
   sub
 
-Test copying largefiles.
+Copy both largefiles and normal files.
 
   $ hg cp sub/normal2 normal1
   $ hg cp sub/large2 large1
@@ -130,8 +129,7 @@
   $ cat sub/large4
   large22
 
-Test a separate commit corner case (specifying files to commit) and check
-that the commited files have the right value.
+Commit corner case: specify files to commit.
 
   $ cd ../a
   $ echo normal3 > normal3
@@ -148,8 +146,7 @@
   $ cat sub/large4
   large4
 
-Test one more commit corner case that has been known to break (comitting from
-a sub-directory of the repo).
+One more commit corner case: commit from a subdirectory.
 
   $ cd ../a
   $ echo normal33 > normal3
@@ -167,7 +164,7 @@
   $ cat large4
   large44
 
-Check that committing standins is not allowed.
+Committing standins is not allowed.
 
   $ cd ..
   $ echo large3 > large3
@@ -176,7 +173,7 @@
   (commit the largefile itself instead)
   [255]
 
-Test some cornercases for adding largefiles.
+Corner cases for adding largefiles.
 
   $ echo large5 > large5
   $ hg add --large large5
@@ -194,41 +191,56 @@
   A sub2/large6
   A sub2/large7
 
-Test that files get added as largefiles based on .hgrc settings
+Config settings (pattern **.dat, minsize 2 MB) are respected.
 
   $ echo testdata > test.dat
-  $ dd bs=3145728 count=1 if=/dev/zero of=reallylarge > /dev/null 2> /dev/null
+  $ dd bs=1k count=2k if=/dev/zero of=reallylarge > /dev/null 2> /dev/null
   $ hg add
   adding reallylarge as a largefile
   adding test.dat as a largefile
-  $ dd bs=1048576 count=1 if=/dev/zero of=reallylarge2 > /dev/null 2> /dev/null
+
+Test that minsize and --lfsize handle float values;
+also tests that --lfsize overrides largefiles.minsize.
+(0.250 MB = 256 kB = 262144 B)
 
-Test that specifying the --lsize command on the comand-line works
-
-  $ hg add --lfsize 1
-  adding reallylarge2 as a largefile
+  $ dd if=/dev/zero of=ratherlarge bs=1024 count=256 > /dev/null 2> /dev/null
+  $ dd if=/dev/zero of=medium bs=1024 count=128 > /dev/null 2> /dev/null
+  $ hg --config largefiles.minsize=.25 add
+  adding ratherlarge as a largefile
+  adding medium
+  $ hg forget medium
+  $ hg --config largefiles.minsize=.25 add --lfsize=.125
+  adding medium as a largefile
+  $ dd if=/dev/zero of=notlarge bs=1024 count=127 > /dev/null 2> /dev/null
+  $ hg --config largefiles.minsize=.25 add --lfsize=.125
+  adding notlarge
+  $ hg forget notlarge
 
 Test forget on largefiles.
 
-  $ hg forget large3 large5 test.dat reallylarge reallylarge2
+  $ hg forget large3 large5 test.dat reallylarge ratherlarge medium
   $ hg st
   A sub2/large6
   A sub2/large7
   R large3
   ? large5
+  ? medium
+  ? notlarge
+  ? ratherlarge
   ? reallylarge
-  ? reallylarge2
   ? test.dat
   $ hg commit -m "add/edit more largefiles"
   $ hg st
   ? large3
   ? large5
+  ? medium
+  ? notlarge
+  ? ratherlarge
   ? reallylarge
-  ? reallylarge2
   ? test.dat
 
-Test purge with largefiles (verify that largefiles get populated in the
-working copy correctly after a purge)
+Purge with largefiles: verify that largefiles are still in the working
+dir after a purge.
 
   $ hg purge --all
   $ cat sub/large4
@@ -238,7 +250,7 @@
   $ cat sub2/large7
   large7
 
-Test cloning a largefiles repo.
+Clone a largefiles repo.
 
   $ cd ..
   $ hg clone a b
@@ -247,48 +259,15 @@
   getting changed largefiles
   3 largefiles updated, 0 removed
   $ cd b
-  $ hg log
-  changeset:   7:daea875e9014
-  tag:         tip
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     add/edit more largefiles
-  
-  changeset:   6:4355d653f84f
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     edit files yet again
-  
-  changeset:   5:9d5af5072dbd
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     edit files again
-  
-  changeset:   4:74c02385b94c
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     move files
-  
-  changeset:   3:9e8fbc4bce62
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     copy files
-  
-  changeset:   2:51a0ae4d5864
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     remove files
-  
-  changeset:   1:ce8896473775
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     edit files
-  
-  changeset:   0:30d30fe6a5be
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     add files
-  
+  $ hg log --template '{rev}:{node|short}  {desc|firstline}\n'
+  7:daea875e9014  add/edit more largefiles
+  6:4355d653f84f  edit files yet again
+  5:9d5af5072dbd  edit files again
+  4:74c02385b94c  move files
+  3:9e8fbc4bce62  copy files
+  2:51a0ae4d5864  remove files
+  1:ce8896473775  edit files
+  0:30d30fe6a5be  add files
   $ cat normal3
   normal33
   $ cat sub/normal4
@@ -310,28 +289,11 @@
   getting changed largefiles
   2 largefiles updated, 0 removed
   $ cd c
-  $ hg log
-  changeset:   3:9e8fbc4bce62
-  tag:         tip
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     copy files
-  
-  changeset:   2:51a0ae4d5864
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     remove files
-  
-  changeset:   1:ce8896473775
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     edit files
-  
-  changeset:   0:30d30fe6a5be
-  user:        test
-  date:        Thu Jan 01 00:00:00 1970 +0000
-  summary:     add files
-  
+  $ hg log --template '{rev}:{node|short}  {desc|firstline}\n'
+  3:9e8fbc4bce62  copy files
+  2:51a0ae4d5864  remove files
+  1:ce8896473775  edit files
+  0:30d30fe6a5be  add files
   $ cat normal1
   normal22
   $ cat large1
@@ -341,8 +303,8 @@
   $ cat sub/large2
   large22
 
-Test that old revisions of a clone have correct largefiles content.  This also
-tsts update.
+Old revisions of a clone have correct largefiles content (this also
+tests update).
 
   $ hg update -r 1 
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -353,7 +315,7 @@
   $ cat sub/large2
   large22
 
-Test that rebasing between two repositories does not revert largefiles to old
+Rebasing between two repositories does not revert largefiles to old
 revisions (this was a very bad bug that took a lot of work to fix).
 
   $ cd ..
@@ -370,6 +332,13 @@
   $ echo large6-modified > sub2/large6
   $ echo normal4-modified > sub/normal4
   $ hg commit -m "modify normal file largefile in repo d"
+  $ cd ..
+  $ hg clone d e
+  updating to branch default
+  5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  getting changed largefiles
+  3 largefiles updated, 0 removed
+  $ cd d
   $ hg pull --rebase ../b
   pulling from ../b
   searching for changes
@@ -381,6 +350,40 @@
   1 largefiles updated, 0 removed
   saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg
   nothing to rebase
+  $ hg log --template '{rev}:{node|short}  {desc|firstline}\n'
+  9:598410d3eb9a  modify normal file largefile in repo d
+  8:a381d2c8c80e  modify normal file and largefile in repo b
+  7:daea875e9014  add/edit more largefiles
+  6:4355d653f84f  edit files yet again
+  5:9d5af5072dbd  edit files again
+  4:74c02385b94c  move files
+  3:9e8fbc4bce62  copy files
+  2:51a0ae4d5864  remove files
+  1:ce8896473775  edit files
+  0:30d30fe6a5be  add files
+  $ cat normal3
+  normal3-modified
+  $ cat sub/normal4
+  normal4-modified
+  $ cat sub/large4
+  large4-modified
+  $ cat sub2/large6
+  large6-modified
+  $ cat sub2/large7
+  large7
+  $ cd ../e
+  $ hg pull ../b
+  pulling from ../b
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 2 changes to 2 files (+1 heads)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg rebase
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  saved backup bundle to $TESTTMP/e/.hg/strip-backup/f574fb32bb45-backup.hg
   $ hg log
   changeset:   9:598410d3eb9a
   tag:         tip
@@ -443,3 +446,397 @@
   large6-modified
   $ cat sub2/large7
   large7
+
+Rollback on largefiles.
+
+  $ echo large4-modified-again > sub/large4 
+  $ hg commit -m "Modify large4 again"
+  $ hg rollback
+  repository tip rolled back to revision 9 (undo commit)
+  working directory now based on revision 9
+  $ hg st
+  M sub/large4
+  $ hg log
+  changeset:   9:598410d3eb9a
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     modify normal file largefile in repo d
+  
+  changeset:   8:a381d2c8c80e
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     modify normal file and largefile in repo b
+  
+  changeset:   7:daea875e9014
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add/edit more largefiles
+  
+  changeset:   6:4355d653f84f
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     edit files yet again
+  
+  changeset:   5:9d5af5072dbd
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     edit files again
+  
+  changeset:   4:74c02385b94c
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     move files
+  
+  changeset:   3:9e8fbc4bce62
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     copy files
+  
+  changeset:   2:51a0ae4d5864
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     remove files
+  
+  changeset:   1:ce8896473775
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     edit files
+  
+  changeset:   0:30d30fe6a5be
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add files
+  
+  $ cat sub/large4
+  large4-modified-again
+
+"update --check" refuses to update with uncommitted changes.
+  $ hg update --check 8
+  abort: uncommitted local changes
+  [255]
+
+"update --clean" leaves correct largefiles in working copy.
+
+  $ hg update --clean 
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ cat normal3
+  normal3-modified
+  $ cat sub/normal4
+  normal4-modified
+  $ cat sub/large4
+  large4-modified
+  $ cat sub2/large6
+  large6-modified
+  $ cat sub2/large7
+  large7
+
+Now "update check" is happy.
+  $ hg update --check 8
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ hg update --check
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+
+"revert" works on largefiles (and normal files too).
+  $ echo hack3 >> normal3
+  $ echo hack4 >> sub/normal4
+  $ echo hack4 >> sub/large4
+  $ hg rm sub2/large6
+  $ echo new >> sub2/large8
+  $ hg add --large sub2/large8
+# XXX we don't really want to report that we're reverting the standin;
+# that's just an implementation detail. But I don't see an obvious fix. ;-(
+  $ hg revert sub
+  reverting .hglf/sub/large4
+  reverting sub/normal4
+  $ hg status
+  M normal3
+  A sub2/large8
+  R sub2/large6
+  ? sub/large4.orig
+  ? sub/normal4.orig
+  $ cat sub/normal4
+  normal4-modified
+  $ cat sub/large4
+  large4-modified
+  $ hg revert -a --no-backup
+  undeleting .hglf/sub2/large6
+  forgetting .hglf/sub2/large8
+  reverting normal3
+  $ hg status
+  ? sub/large4.orig
+  ? sub/normal4.orig
+  ? sub2/large8
+  $ cat normal3
+  normal3-modified
+  $ cat sub2/large6
+  large6-modified
+  $ rm sub/*.orig sub2/large8
+
+revert some files to an older revision
+  $ hg revert --no-backup -r 8 sub2
+  reverting .hglf/sub2/large6
+  $ cat sub2/large6
+  large6
+  $ hg revert --no-backup sub2
+  reverting .hglf/sub2/large6
+  $ hg status
+
+"verify --large" actually verifies largefiles
+
+  $ hg verify --large
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+  10 files, 10 changesets, 28 total revisions
+  searching 1 changesets for largefiles
+  verified existence of 3 revisions of 3 largefiles
+
+Merging does not revert to old versions of largefiles (this has also
+been very problematic).
+
+  $ cd ..
+  $ hg clone -r 7 e f
+  adding changesets
+  adding manifests
+  adding file changes
+  added 8 changesets with 24 changes to 10 files
+  updating to branch default
+  5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  getting changed largefiles
+  3 largefiles updated, 0 removed
+  $ cd f
+  $ echo "large4-merge-test" > sub/large4
+  $ hg commit -m "Modify large4 to test merge"
+  $ hg pull ../e
+  pulling from ../e
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 4 changes to 4 files (+1 heads)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg merge
+  merging sub/large4
+  largefile sub/large4 has a merge conflict
+  keep (l)ocal or take (o)ther? l
+  3 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ hg commit -m "Merge repos e and f"
+  $ cat normal3
+  normal3-modified
+  $ cat sub/normal4
+  normal4-modified
+  $ cat sub/large4
+  large4-merge-test
+  $ cat sub2/large6
+  large6-modified
+  $ cat sub2/large7
+  large7
+
+Test that a normal file and a largefile with the same name and path cannot
+coexist.
+
+  $ rm sub2/large7
+  $ echo "largeasnormal" > sub2/large7
+  $ hg add sub2/large7
+  sub2/large7 already a largefile
+
+Test that transplanting a largefile change works correctly.
+
+  $ cd ..
+  $ hg clone -r 8 d g
+  adding changesets
+  adding manifests
+  adding file changes
+  added 9 changesets with 26 changes to 10 files
+  updating to branch default
+  5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  getting changed largefiles
+  3 largefiles updated, 0 removed
+  $ cd g
+  $ hg transplant -s ../d 598410d3eb9a 
+  searching for changes
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 2 changes to 2 files
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ hg log --template '{rev}:{node|short}  {desc|firstline}\n'
+  9:598410d3eb9a  modify normal file largefile in repo d
+  8:a381d2c8c80e  modify normal file and largefile in repo b
+  7:daea875e9014  add/edit more largefiles
+  6:4355d653f84f  edit files yet again
+  5:9d5af5072dbd  edit files again
+  4:74c02385b94c  move files
+  3:9e8fbc4bce62  copy files
+  2:51a0ae4d5864  remove files
+  1:ce8896473775  edit files
+  0:30d30fe6a5be  add files
+  $ cat normal3
+  normal3-modified
+  $ cat sub/normal4
+  normal4-modified
+  $ cat sub/large4
+  large4-modified
+  $ cat sub2/large6
+  large6-modified
+  $ cat sub2/large7
+  large7
+  $ cd ..
+
+vanilla clients not locked out from largefiles servers on vanilla repos
+  $ mkdir r1
+  $ cd r1
+  $ hg init
+  $ echo c1 > f1
+  $ hg add f1
+  $ hg com -m "m1"
+  $ cd ..
+  $ hg serve -R r1 -d -p $HGPORT --pid-file hg.pid
+  $ cat hg.pid >> $DAEMON_PIDS
+  $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT r2
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+largefiles clients still work with vanilla servers
+  $ hg --config extensions.largefiles=! serve -R r1 -d -p $HGPORT1 --pid-file hg.pid
+  $ cat hg.pid >> $DAEMON_PIDS
+  $ hg clone http://localhost:$HGPORT1 r3
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+vanilla clients locked out from largefiles http repos
+  $ mkdir r4
+  $ cd r4
+  $ hg init
+  $ echo c1 > f1
+  $ hg add --large f1
+  $ hg com -m "m1"
+  $ cd ..
+  $ hg serve -R r4 -d -p $HGPORT2 --pid-file hg.pid
+  $ cat hg.pid >> $DAEMON_PIDS
+  $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT2 r5
+  abort: remote error:
+  
+  This repository uses the largefiles extension.
+  
+  Please enable it in your Mercurial config file.
+  [255]
+
+used all HGPORTs, kill all daemons
+  $ "$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
+  abort: remote error:
+  
+  This repository uses the largefiles extension.
+  
+  Please enable it in your Mercurial config file.
+  [255]
+
+largefiles clients refuse to push largefiles repos to vanilla servers
+  $ mkdir r6
+  $ cd r6
+  $ hg init
+  $ echo c1 > f1
+  $ hg add f1
+  $ hg com -m "m1"
+  $ cat >> .hg/hgrc <<!
+  > [web]
+  > push_ssl = false
+  > allow_push = *
+  > !
+  $ cd ..
+  $ hg clone r6 r7
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd r7
+  $ echo c2 > f2
+  $ hg add --large f2
+  $ hg com -m "m2"
+  $ hg --config extensions.largefiles=! -R ../r6 serve -d -p $HGPORT --pid-file ../hg.pid
+  $ cat ../hg.pid >> $DAEMON_PIDS
+  $ hg push http://localhost:$HGPORT
+  pushing to http://localhost:$HGPORT/
+  searching for changes
+  abort: http://localhost:$HGPORT/ does not appear to be a largefile store
+  [255]
+  $ cd ..
+
+  $ cd ..
+
+Clone a local repository owned by another user
+We have to simulate that here by setting $HOME and removing write permissions
+  $ ORIGHOME="$HOME"
+  $ mkdir alice
+  $ HOME="`pwd`/alice"
+  $ cd alice
+  $ hg init pubrepo
+  $ cd pubrepo
+  $ dd if=/dev/urandom bs=1k count=11k > a-large-file 2> /dev/null
+  $ hg add --large a-large-file
+  $ hg commit -m "Add a large file"
+  $ cd ..
+  $ chmod -R a-w pubrepo
+  $ cd ..
+  $ mkdir bob
+  $ HOME="`pwd`/bob"
+  $ cd bob
+  $ hg clone --pull ../alice/pubrepo pubrepo
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ cd ..
+  $ HOME="$ORIGHOME"
+
+Symlink to a large largefile should behave the same as a symlink to a normal file
+  $ hg init largesymlink
+  $ cd largesymlink
+  $ dd if=/dev/zero bs=1k count=10k of=largefile 2>/dev/null
+  $ hg add --large largefile
+  $ hg commit -m "commit a large file"
+  $ ln -s largefile largelink
+  $ hg add largelink
+  $ hg commit -m "commit a large symlink"
+  $ rm -f largelink
+  $ hg up >/dev/null
+  $ test -f largelink
+  [1]
+  $ test -L largelink
+  [1]
+  $ rm -f largelink # make next part of the test independent of the previous
+  $ hg up -C >/dev/null
+  $ test -f largelink
+  $ test -L largelink
+  $ cd ..
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-lfconvert.t	Tue Nov 01 16:49:30 2011 -0500
@@ -0,0 +1,232 @@
+  $ cat >> $HGRCPATH <<EOF
+  > [extensions]
+  > largefiles =
+  > share =
+  > graphlog =
+  > [largefiles]
+  > minsize = 0.5
+  > patterns = **.dat
+  > EOF
+
+"lfconvert" works
+  $ hg init bigfile-repo
+  $ cd bigfile-repo
+  $ cat >> .hg/hgrc <<EOF
+  > [extensions]
+  > largefiles = !
+  > EOF
+  $ mkdir sub
+  $ dd if=/dev/zero bs=1k count=256 > large 2> /dev/null
+  $ echo normal > normal1
+  $ echo alsonormal > sub/normal2
+  $ dd if=/dev/zero bs=1k count=10 > sub/maybelarge.dat 2> /dev/null
+  $ hg addremove
+  adding large
+  adding normal1
+  adding sub/maybelarge.dat
+  adding sub/normal2
+  $ hg commit -m"add large, normal1" large normal1
+  $ hg commit -m"add sub/*" sub
+  $ [ -d .hg/largefiles ] && echo fail || echo pass
+  pass
+  $ cd ..
+  $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
+  initializing destination largefiles-repo
+
+"lfconvert" converts content correctly
+  $ cd largefiles-repo
+  $ hg up
+  4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  getting changed largefiles
+  2 largefiles updated, 0 removed
+  $ hg locate
+  .hglf/large
+  .hglf/sub/maybelarge.dat
+  normal1
+  sub/normal2
+  $ cat normal1
+  normal
+  $ cat sub/normal2
+  alsonormal
+  $ "$TESTDIR/md5sum.py" large sub/maybelarge.dat
+  ec87a838931d4d5d2e94a04644788a55  large
+  1276481102f218c981e0324180bafd9f  sub/maybelarge.dat
+
+"lfconvert" adds 'largefiles' to .hg/requires.
+  $ cat .hg/requires
+  largefiles
+  revlogv1
+  fncache
+  store
+  dotencode
+
+"lfconvert" includes a newline at the end of the standin files.
+  $ cat .hglf/large .hglf/sub/maybelarge.dat
+  2e000fa7e85759c7f4c254d4d9c33ef481e459a7
+  34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
+  $ cd ..
+
+add some changesets to rename/remove/merge
+  $ cd bigfile-repo
+  $ hg mv -q sub stuff
+  $ hg commit -m"rename sub/ to stuff/"
+  $ hg update -q 1
+  $ echo blah >> normal3
+  $ echo blah >> sub/normal2
+  $ echo blah >> sub/maybelarge.dat
+  $ "$TESTDIR/md5sum.py" sub/maybelarge.dat
+  1dd0b99ff80e19cff409702a1d3f5e15  sub/maybelarge.dat
+  $ hg commit -A -m"add normal3, modify sub/*"
+  adding normal3
+  created new head
+  $ hg rm large normal3
+  $ hg commit -q -m"remove large, normal3"
+  $ hg merge
+  merging sub/maybelarge.dat and stuff/maybelarge.dat to stuff/maybelarge.dat
+  warning: $TESTTMP/bigfile-repo/stuff/maybelarge.dat looks like a binary file.
+  merging stuff/maybelarge.dat failed!
+  merging sub/normal2 and stuff/normal2 to stuff/normal2
+  0 files updated, 1 files merged, 0 files removed, 1 files unresolved
+  use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+  [1]
+  $ hg cat -r . sub/maybelarge.dat > stuff/maybelarge.dat
+  $ hg resolve -m stuff/maybelarge.dat
+  $ hg commit -m"merge"
+  $ hg glog --template "{rev}:{node|short}  {desc|firstline}\n"
+  @    5:4884f215abda  merge
+  |\
+  | o  4:7285f817b77e  remove large, normal3
+  | |
+  | o  3:67e3892e3534  add normal3, modify sub/*
+  | |
+  o |  2:c96c8beb5d56  rename sub/ to stuff/
+  |/
+  o  1:020c65d24e11  add sub/*
+  |
+  o  0:117b8328f97a  add large, normal1
+  
+  $ cd ..
+
+lfconvert with rename, merge, and remove
+  $ rm -rf largefiles-repo
+  $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
+  initializing destination largefiles-repo
+  $ cd largefiles-repo
+  $ hg glog --template "{rev}:{node|short}  {desc|firstline}\n"
+  o    5:8e05f5f2b77e  merge
+  |\
+  | o  4:a5a02de7a8e4  remove large, normal3
+  | |
+  | o  3:55759520c76f  add normal3, modify sub/*
+  | |
+  o |  2:261ad3f3f037  rename sub/ to stuff/
+  |/
+  o  1:334e5237836d  add sub/*
+  |
+  o  0:d4892ec57ce2  add large, normal1
+  
+  $ hg locate -r 2
+  .hglf/large
+  .hglf/stuff/maybelarge.dat
+  normal1
+  stuff/normal2
+  $ hg locate -r 3
+  .hglf/large
+  .hglf/sub/maybelarge.dat
+  normal1
+  normal3
+  sub/normal2
+  $ hg locate -r 4
+  .hglf/sub/maybelarge.dat
+  normal1
+  sub/normal2
+  $ hg locate -r 5
+  .hglf/stuff/maybelarge.dat
+  normal1
+  stuff/normal2
+  $ hg update
+  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ cat stuff/normal2
+  alsonormal
+  blah
+  $ "$TESTDIR/md5sum.py" stuff/maybelarge.dat
+  1dd0b99ff80e19cff409702a1d3f5e15  stuff/maybelarge.dat
+  $ cat .hglf/stuff/maybelarge.dat
+  76236b6a2c6102826c61af4297dd738fb3b1de38
+  $ cd ..
+
+"lfconvert" error cases
+  $ hg lfconvert http://localhost/foo foo
+  abort: http://localhost/foo is not a local Mercurial repo
+  [255]
+  $ hg lfconvert foo ssh://localhost/foo
+  abort: ssh://localhost/foo is not a local Mercurial repo
+  [255]
+  $ hg lfconvert nosuchrepo foo
+  abort: repository nosuchrepo not found!
+  [255]
+  $ hg share -q -U bigfile-repo shared
+  $ printf 'bogus' > shared/.hg/sharedpath
+  $ hg lfconvert shared foo
+  abort: .hg/sharedpath points to nonexistent directory $TESTTMP/bogus!
+  [255]
+  $ hg lfconvert bigfile-repo largefiles-repo
+  initializing destination largefiles-repo
+  abort: repository largefiles-repo already exists!
+  [255]
+
+add another largefile to the new largefiles repo
+  $ cd largefiles-repo
+  $ dd if=/dev/zero bs=1k count=1k > anotherlarge 2> /dev/null
+  $ hg add --lfsize=1 anotherlarge
+  $ hg commit -m "add anotherlarge (should be a largefile)"
+  $ cat .hglf/anotherlarge
+  3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3
+  $ cd ..
+
+round-trip: converting back to a normal (non-largefiles) repo with
+"lfconvert --to-normal" should give the same as ../bigfile-repo
+  $ cd largefiles-repo
+  $ hg lfconvert --to-normal . ../normal-repo
+  initializing destination ../normal-repo
+  $ cd ../normal-repo
+  $ cat >> .hg/hgrc <<EOF
+  > [extensions]
+  > largefiles = !
+  > EOF
+
+# Hmmm: the changeset ID for rev 5 is different from the original
+# normal repo (../bigfile-repo), because the changelog filelist
+# differs between the two incarnations of rev 5: this repo includes
+# 'large' in the list, but ../bigfile-repo does not. Since rev 5
+# removes 'large' relative to the first parent in both repos, it seems
+# to me that lfconvert is doing a *better* job than
+# "hg remove" + "hg merge" + "hg commit".
+#  $ hg -R ../bigfile-repo debugdata -c 5
+#  $ hg debugdata -c 5
+  $ hg glog --template "{rev}:{node|short}  {desc|firstline}\n"
+  o  6:1635824e6f59  add anotherlarge (should be a largefile)
+  |
+  o    5:7215f8deeaaf  merge
+  |\
+  | o  4:7285f817b77e  remove large, normal3
+  | |
+  | o  3:67e3892e3534  add normal3, modify sub/*
+  | |
+  o |  2:c96c8beb5d56  rename sub/ to stuff/
+  |/
+  o  1:020c65d24e11  add sub/*
+  |
+  o  0:117b8328f97a  add large, normal1
+  
+  $ hg update
+  4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg locate
+  anotherlarge
+  normal1
+  stuff/maybelarge.dat
+  stuff/normal2
+  $ [ -d .hg/largefiles ] && echo fail || echo pass
+  pass
--- a/tests/test-mq-qrename.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-mq-qrename.t	Tue Nov 01 16:49:30 2011 -0500
@@ -76,8 +76,8 @@
   $ hg qrename patchb patchc
   $ hg qrename patcha patchb
   $ hg st --mq
-  M patchb
   M series
+  A patchb
   A patchc
   R patcha
   $ cd ..
@@ -94,3 +94,32 @@
   nothing changed
   [1]
   $ cd ..
+
+Test renaming to a folded patch (issue3058)
+
+  $ hg init issue3058
+  $ cd issue3058
+  $ hg init --mq
+  $ echo a > a
+  $ hg add a
+  $ hg qnew adda
+  $ echo b >> a
+  $ hg qnew addb
+  $ hg qpop
+  popping addb
+  now at: adda
+  $ hg ci --mq -m "save mq"
+  $ hg qfold addb
+  $ hg qmv addb
+  $ cat .hg/patches/addb
+  # HG changeset patch
+  # Parent 0000000000000000000000000000000000000000
+  
+  diff -r 000000000000 a
+  --- /dev/null	* (glob)
+  +++ b/a	* (glob)
+  @@ -0,0 +1,2 @@
+  +a
+  +b
+  $ cd ..
+
--- a/tests/test-mq-subrepo-svn.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-mq-subrepo-svn.t	Tue Nov 01 16:49:30 2011 -0500
@@ -1,4 +1,4 @@
-  $ "$TESTDIR/hghave" svn || exit 80
+  $ "$TESTDIR/hghave" svn13 || exit 80
 
   $ echo "[extensions]" >> $HGRCPATH
   $ echo "mq=" >> $HGRCPATH
--- a/tests/test-mq-subrepo.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-mq-subrepo.t	Tue Nov 01 16:49:30 2011 -0500
@@ -1,3 +1,5 @@
+  $ echo "[ui]" >> $HGRCPATH
+  $ echo "commitsubrepos = Yes" >> $HGRCPATH
   $ echo "[extensions]" >> $HGRCPATH
   $ echo "mq=" >> $HGRCPATH
   $ echo "record=" >> $HGRCPATH
--- a/tests/test-progress.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-progress.t	Tue Nov 01 16:49:30 2011 -0500
@@ -35,6 +35,7 @@
   > }
   > EOF
 
+  $ cp $HGRCPATH $HGRCPATH.orig
   $ echo "[extensions]" >> $HGRCPATH
   $ echo "progress=" >> $HGRCPATH
   $ echo "loop=`pwd`/loop.py" >> $HGRCPATH
@@ -162,7 +163,8 @@
   >     time.time = mocktime(int(os.environ.get('MOCKTIME', '11')))
   > EOF
 
-  $ echo "[extensions]" > $HGRCPATH
+  $ cp $HGRCPATH.orig $HGRCPATH
+  $ echo "[extensions]" >> $HGRCPATH
   $ echo "mocktime=`pwd`/mocktime.py" >> $HGRCPATH
   $ echo "progress=" >> $HGRCPATH
   $ echo "loop=`pwd`/loop.py" >> $HGRCPATH
--- a/tests/test-qrecord.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-qrecord.t	Tue Nov 01 16:49:30 2011 -0500
@@ -64,6 +64,7 @@
    -l --logfile FILE        read commit message from file
    -d --date DATE           record the specified date as commit date
    -u --user USER           record the specified user as committer
+   -S --subrepos            recurse into subrepositories
    -w --ignore-all-space    ignore white space when comparing lines
    -b --ignore-space-change ignore changes in the amount of white space
    -B --ignore-blank-lines  ignore changes whose lines are all blank
--- a/tests/test-subrepo-deep-nested-change.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-subrepo-deep-nested-change.t	Tue Nov 01 16:49:30 2011 -0500
@@ -77,7 +77,7 @@
 Modifying deeply nested 'sub2'
 
   $ echo modified > cloned/sub1/sub2/sub2
-  $ hg commit -m "deep nested modif should trigger a commit" -R cloned
+  $ hg commit --subrepos -m "deep nested modif should trigger a commit" -R cloned
   committing subrepository sub1
   committing subrepository sub1/sub2
 
--- a/tests/test-subrepo-git.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-subrepo-git.t	Tue Nov 01 16:49:30 2011 -0500
@@ -103,7 +103,7 @@
   $ echo ggg >> s/g
   $ hg status --subrepos
   M s/g
-  $ hg commit -m ggg
+  $ hg commit --subrepos -m ggg
   committing subrepository s
   $ hg debugsub
   path s
@@ -125,7 +125,7 @@
 
   $ hg status --subrepos
   A s/f
-  $ hg commit -m f
+  $ hg commit --subrepos -m f
   committing subrepository s
   $ hg debugsub
   path s
@@ -164,7 +164,7 @@
   g
   gg
   ggg
-  $ hg commit -m 'merge'
+  $ hg commit --subrepos -m 'merge'
   committing subrepository s
   $ hg status --subrepos --rev 1:5
   M .hgsubstate
@@ -294,7 +294,7 @@
   $ echo ffff >> inner/s/f
   $ hg status --subrepos
   M inner/s/f
-  $ hg commit -m nested
+  $ hg commit --subrepos -m nested
   committing subrepository inner
   committing subrepository inner/s
 
@@ -325,7 +325,7 @@
   $ hg push -q
   abort: subrepo s is missing
   [255]
-  $ hg commit -qm missing
+  $ hg commit --subrepos -qm missing
   abort: subrepo s is missing
   [255]
   $ hg update -C
--- a/tests/test-subrepo-recursion.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-subrepo-recursion.t	Tue Nov 01 16:49:30 2011 -0500
@@ -58,7 +58,14 @@
 
 Commits:
 
-  $ hg commit -m 0-0-0
+  $ hg commit -m fails
+  abort: uncommitted changes in subrepo foo
+  (use --subrepos for recursive commit)
+  [255]
+
+The --subrepos flag overwrite the config setting:
+
+  $ hg commit -m 0-0-0 --config ui.commitsubrepos=No --subrepos
   committing subrepository foo
   committing subrepository foo/bar
 
@@ -177,7 +184,7 @@
 Cleanup and final commit:
 
   $ rm -r dir
-  $ hg commit -m 2-3-2
+  $ hg commit --subrepos -m 2-3-2
   committing subrepository foo
   committing subrepository foo/bar
 
@@ -304,10 +311,63 @@
   archiving (foo/bar) [================================>] 1/1
                                                               \r (esc)
 
+Test archiving a revision that references a subrepo that is not yet
+cloned:
+
+  $ hg clone -U . ../empty
+  $ cd ../empty
+  $ hg archive --subrepos -r tip ../archive.tar.gz 2>&1 | $TESTDIR/filtercr.py
+  
+  archiving [                                           ] 0/3
+  archiving [                                           ] 0/3
+  archiving [=============>                             ] 1/3
+  archiving [=============>                             ] 1/3
+  archiving [===========================>               ] 2/3
+  archiving [===========================>               ] 2/3
+  archiving [==========================================>] 3/3
+  archiving [==========================================>] 3/3
+                                                              
+  archiving (foo) [                                     ] 0/3
+  archiving (foo) [                                     ] 0/3
+  archiving (foo) [===========>                         ] 1/3
+  archiving (foo) [===========>                         ] 1/3
+  archiving (foo) [=======================>             ] 2/3
+  archiving (foo) [=======================>             ] 2/3
+  archiving (foo) [====================================>] 3/3
+  archiving (foo) [====================================>] 3/3
+                                                              
+  archiving (foo/bar) [                                 ] 0/1
+  archiving (foo/bar) [                                 ] 0/1
+  archiving (foo/bar) [================================>] 1/1
+  archiving (foo/bar) [================================>] 1/1
+                                                              
+  cloning subrepo foo from $TESTTMP/repo/foo
+  cloning subrepo foo/bar from $TESTTMP/repo/foo/bar
+  
+The newly cloned subrepos contain no working copy:
+
+  $ hg -R foo summary
+  parent: -1:000000000000  (no revision checked out)
+  branch: default
+  commit: (clean)
+  update: 4 new changesets (update)
+
 Disable progress extension and cleanup:
 
   $ mv $HGRCPATH.no-progress $HGRCPATH
 
+Test archiving when there is a directory in the way for a subrepo
+created by archive:
+
+  $ hg clone -U . ../almost-empty
+  $ cd ../almost-empty
+  $ mkdir foo
+  $ echo f > foo/f
+  $ hg archive --subrepos -r tip archive
+  cloning subrepo foo from $TESTTMP/empty/foo
+  abort: destination '$TESTTMP/almost-empty/foo' is not empty
+  [255]
+
 Clone and test outgoing:
 
   $ cd ..
@@ -341,7 +401,7 @@
    y2
    y3
   +y4
-  $ hg commit -m 3-4-2
+  $ hg commit --subrepos -m 3-4-2
   committing subrepository foo
   $ hg outgoing -S
   comparing with $TESTTMP/repo
--- a/tests/test-subrepo-svn.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-subrepo-svn.t	Tue Nov 01 16:49:30 2011 -0500
@@ -1,4 +1,4 @@
-  $ "$TESTDIR/hghave" svn || exit 80
+  $ "$TESTDIR/hghave" svn15 || exit 80
 
   $ fix_path()
   > {
@@ -105,7 +105,7 @@
   branch: default
   commit: 1 modified, 1 subrepos
   update: (current)
-  $ hg commit -m 'Message!'
+  $ hg commit --subrepos -m 'Message!'
   committing subrepository s
   Sending*s/alpha (glob)
   Transmitting file data .
@@ -171,7 +171,7 @@
 this commit from hg will fail
 
   $ echo zzz >> s/alpha
-  $ hg ci -m 'amend alpha from hg'
+  $ hg ci --subrepos -m 'amend alpha from hg'
   committing subrepository s
   abort: svn: Commit failed (details follow):
   svn: (Out of date)?.*/src/alpha.*(is out of date)? (re)
@@ -182,7 +182,7 @@
 
   $ svn propset svn:mime-type 'text/html' s/alpha
   property 'svn:mime-type' set on 's/alpha'
-  $ hg ci -m 'amend alpha from hg'
+  $ hg ci --subrepos -m 'amend alpha from hg'
   committing subrepository s
   abort: svn: Commit failed (details follow):
   svn: (Out of date)?.*/src/alpha.*(is out of date)? (re)
@@ -192,7 +192,7 @@
 this commit fails because of externals changes
 
   $ echo zzz > s/externals/other
-  $ hg ci -m 'amend externals from hg'
+  $ hg ci --subrepos -m 'amend externals from hg'
   committing subrepository s
   abort: cannot commit svn externals
   [255]
@@ -214,7 +214,7 @@
 
   $ svn propset svn:mime-type 'text/html' s/externals/other
   property 'svn:mime-type' set on 's/externals/other'
-  $ hg ci -m 'amend externals from hg'
+  $ hg ci --subrepos -m 'amend externals from hg'
   committing subrepository s
   abort: cannot commit svn externals
   [255]
@@ -496,7 +496,7 @@
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ echo "obstruct =        [svn]       $SVNREPO/externals" >> .hgsub
   $ svn co -r5 --quiet "$SVNREPO"/externals obstruct
-  $ hg commit -m 'Start making obstructed wc'
+  $ hg commit -m 'Start making obstructed working copy'
   committing subrepository obstruct
   $ hg book other
   $ hg co -r 'p1(tip)'
@@ -523,7 +523,7 @@
 Point to a Subversion branch which has since been deleted and recreated
 First, create that condition in the repository.
 
-  $ hg ci -m cleanup
+  $ hg ci --subrepos -m cleanup
   committing subrepository obstruct
   Sending        obstruct/other
   Transmitting file data .
--- a/tests/test-subrepo.t	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-subrepo.t	Tue Nov 01 16:49:30 2011 -0500
@@ -1,3 +1,8 @@
+Let commit recurse into subrepos by default to match pre-2.0 behavior:
+
+  $ echo "[ui]" >> $HGRCPATH
+  $ echo "commitsubrepos = Yes" >> $HGRCPATH
+
   $ rm -rf sub
   $ mkdir sub
   $ cd sub
@@ -107,6 +112,7 @@
   $ echo c > s/a
   $ hg --config ui.commitsubrepos=no ci -m4
   abort: uncommitted changes in subrepo s
+  (use --subrepos for recursive commit)
   [255]
   $ hg ci -m4
   committing subrepository s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-symlink-placeholder.t	Tue Nov 01 16:49:30 2011 -0500
@@ -0,0 +1,68 @@
+Create extension that can disable symlink support:
+
+  $ cat > nolink.py <<EOF
+  > from mercurial import extensions, util
+  > def setflags(orig, f, l, x):
+  >     pass
+  > def checklink(orig, path):
+  >     return False
+  > def extsetup(ui):
+  >     extensions.wrapfunction(util, 'setflags', setflags)
+  >     extensions.wrapfunction(util, 'checklink', checklink)
+  > EOF
+
+  $ hg init unix-repo
+  $ cd unix-repo
+  $ echo foo > a
+  $ ln -s a b
+  $ hg ci -Am0
+  adding a
+  adding b
+  $ cd ..
+
+Simulate a checkout shared on NFS/Samba:
+
+  $ hg clone -q unix-repo shared
+  $ cd shared
+  $ rm b
+  $ echo foo > b
+  $ hg --config extensions.n=$TESTTMP/nolink.py status --debug
+  ignoring suspect symlink placeholder "b"
+
+Make a clone using placeholders:
+
+  $ hg --config extensions.n=$TESTTMP/nolink.py clone . ../win-repo
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cd ../win-repo
+  $ cat b
+  a (no-eol)
+  $ hg --config extensions.n=$TESTTMP/nolink.py st --debug
+
+Write binary data to the placeholder:
+
+  >>> open('b', 'w').write('this is a binary\0')
+  $ hg --config extensions.n=$TESTTMP/nolink.py st --debug
+  ignoring suspect symlink placeholder "b"
+
+Write a long string to the placeholder:
+
+  >>> open('b', 'w').write('this' * 1000)
+  $ hg --config extensions.n=$TESTTMP/nolink.py st --debug
+  ignoring suspect symlink placeholder "b"
+
+Commit shouldn't succeed:
+
+  $ hg --config extensions.n=$TESTTMP/nolink.py ci -m1
+  nothing changed
+  [1]
+
+Write a valid string to the placeholder:
+
+  >>> open('b', 'w').write('this')
+  $ hg --config extensions.n=$TESTTMP/nolink.py st --debug
+  M b
+  $ hg --config extensions.n=$TESTTMP/nolink.py ci -m1
+  $ hg manifest tip --verbose
+  644   a
+  644 @ b
--- a/tests/test-url.py	Wed Oct 26 22:35:15 2011 +0200
+++ b/tests/test-url.py	Tue Nov 01 16:49:30 2011 -0500
@@ -1,4 +1,4 @@
-import sys
+import os
 
 def check(a, b):
     if a != b:
@@ -232,4 +232,7 @@
     'foo/bar/baz'
     """
 
+if 'TERM' in os.environ:
+    del os.environ['TERM']
+
 doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)