Merge spelling fixes
authorBryan O'Sullivan <bryano@fb.com>
Tue, 11 Sep 2012 08:36:09 -0700
changeset 17537 31f32a96e1e3
parent 17475 63e45aee46d4 (diff)
parent 17536 dc6364a81e42 (current diff)
child 17538 31ca918d539a
Merge spelling fixes
contrib/vim/hgcommand.vim
contrib/vim/patchreview.vim
hgext/acl.py
hgext/bugzilla.py
hgext/convert/subversion.py
hgext/largefiles/lfcommands.py
hgext/largefiles/overrides.py
hgext/mq.py
hgext/zeroconf/Zeroconf.py
mercurial/byterange.py
mercurial/commands.py
mercurial/config.py
mercurial/discovery.py
mercurial/hbisect.py
mercurial/httpclient/__init__.py
mercurial/localrepo.py
mercurial/lock.py
mercurial/obsolete.py
mercurial/phases.py
mercurial/revlog.py
mercurial/revset.py
mercurial/util.py
mercurial/windows.py
tests/test-keyword.t
tests/test-mq-subrepo.t
--- a/.hgsigs	Fri Aug 17 13:58:19 2012 -0700
+++ b/.hgsigs	Tue Sep 11 08:36:09 2012 -0700
@@ -57,3 +57,4 @@
 85a358df5bbbe404ca25730c9c459b34263441dc 0 iD8DBQBPyZsWywK+sNU5EO8RAnpLAJ48qrGDJRT+pteS0mSQ11haqHstPwCdG4ccGbk+0JHb7aNy8/NRGAOqn9w=
 b013baa3898e117959984fc64c29d8c784d2f28b 0 iD8DBQBP8QOPywK+sNU5EO8RAqimAKCFRSx0lvG6y8vne2IhNG062Hn0dACeMLI5/zhpWpHBIVeAAquYfx2XFeA=
 7f5094bb3f423fc799e471aac2aee81a7ce57a0b 0 iD8DBQBQGiL8ywK+sNU5EO8RAq5oAJ4rMMCPx6O+OuzNXVOexogedWz/QgCeIiIxLd76I4pXO48tdXhr0hQcBuM=
+072209ae4ddb654eb2d5fd35bff358c738414432 0 iD8DBQBQQkq0ywK+sNU5EO8RArDTAJ9nk5CySnNAjAXYvqvx4uWCw9ThZwCgqmFRehH/l+oTwj3f8nw8u8qTCdc=
--- a/.hgtags	Fri Aug 17 13:58:19 2012 -0700
+++ b/.hgtags	Tue Sep 11 08:36:09 2012 -0700
@@ -70,3 +70,4 @@
 b013baa3898e117959984fc64c29d8c784d2f28b 2.2.3
 a06e2681dd1786e2354d84a5fa9c1c88dd4fa3e0 2.3-rc
 7f5094bb3f423fc799e471aac2aee81a7ce57a0b 2.3
+072209ae4ddb654eb2d5fd35bff358c738414432 2.3.1
--- a/contrib/bash_completion	Fri Aug 17 13:58:19 2012 -0700
+++ b/contrib/bash_completion	Tue Sep 11 08:36:09 2012 -0700
@@ -386,6 +386,13 @@
     fi
 }
 
+_hg_cmd_rebase() {
+   if [[ "$prev" = @(-s|--source|-d|--dest|-b|--base|-r|--rev) ]]; then
+       _hg_labels
+       return
+   fi
+}
+
 _hg_cmd_strip()
 {
     _hg_labels
--- a/contrib/check-code.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/contrib/check-code.py	Tue Sep 11 08:36:09 2012 -0700
@@ -136,7 +136,7 @@
     (r'\w[+/*\-<>]\w', "missing whitespace in expression"),
     (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'((?:\n|\1\s.*\n)+?)\1finally:', 'no try/except/finally in Python 2.4'),
     (r'.{81}', "line too long"),
     (r' x+[xo][\'"]\n\s+[\'"]x', 'string join across lines with no space'),
     (r'[^\n]\Z', "no trailing newline"),
@@ -190,8 +190,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'BaseException', 'not in Python 2.4, use Exception'),
+    (r'os\.path\.relpath', 'os.path.relpath is not in Python 2.5'),
     (r'opener\([^)]*\).write\(',
      "use opener.write() instead"),
     (r'[\s\(](open|file)\([^)]*\)\.read\(',
@@ -321,7 +321,7 @@
     :f: filepath
     :logfunc: function used to report error
               logfunc(filename, linenumber, linecontent, errormessage)
-    :maxerr: number of error to display before arborting.
+    :maxerr: number of error to display before aborting.
              Set to false (default) to report all errors
 
     return True if no error is found, False otherwise.
@@ -365,7 +365,7 @@
                 p, msg = pat
                 ignore = None
 
-            # fix-up regexes for multiline searches
+            # fix-up regexes for multi-line searches
             po = p
             # \s doesn't match \n
             p = re.sub(r'(?<!\\)\\s', r'[ \\t]', p)
--- a/contrib/mergetools.hgrc	Fri Aug 17 13:58:19 2012 -0700
+++ b/contrib/mergetools.hgrc	Tue Sep 11 08:36:09 2012 -0700
@@ -16,6 +16,7 @@
 gvimdiff.priority=-9
 
 vimdiff.args=$local $other $base
+vimdiff.check=changed
 vimdiff.priority=-10
 
 merge.checkconflicts=True
--- a/contrib/vim/hgcommand.vim	Fri Aug 17 13:58:19 2012 -0700
+++ b/contrib/vim/hgcommand.vim	Tue Sep 11 08:36:09 2012 -0700
@@ -1442,7 +1442,7 @@
 
                                                  *hgcommand-mappings-override*
 
-   The default mappings can be overriden by user-provided instead by mapping
+   The default mappings can be overridden by user-provided instead by mapping
    to <Plug>CommandName.  This is especially useful when these mappings
    collide with other existing mappings (vim will warn of this during plugin
    initialization, but will not clobber the existing mappings).
--- a/contrib/vim/patchreview.vim	Fri Aug 17 13:58:19 2012 -0700
+++ b/contrib/vim/patchreview.vim	Tue Sep 11 08:36:09 2012 -0700
@@ -55,7 +55,7 @@
 "   3) Optional (but recommended for speed)
 "
 "      Install patchutils ( http://cyberelk.net/tim/patchutils/ ) for your
-"      OS. For windows it is availble from Cygwin
+"      OS. For windows it is available from Cygwin
 "
 "         http://www.cygwin.com
 "
--- a/contrib/win32/hgwebdir_wsgi.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/contrib/win32/hgwebdir_wsgi.py	Tue Sep 11 08:36:09 2012 -0700
@@ -27,7 +27,7 @@
 #   On 64-bit systems, make sure it's assigned a 32-bit app pool.
 #
 # - In the application, setup a wildcard script handler mapping of type
-#   IpsapiModule with the shim dll as its executable. This file MUST reside
+#   IsapiModule with the shim dll as its executable. This file MUST reside
 #   in the same directory as the shim. Remove all other handlers, if you wish.
 #
 # - Make sure the ISAPI and CGI restrictions (configured globally on the
--- a/contrib/wix/dist.wxs	Fri Aug 17 13:58:19 2012 -0700
+++ b/contrib/wix/dist.wxs	Tue Sep 11 08:36:09 2012 -0700
@@ -15,7 +15,7 @@
         <File Name="mercurial.osutil.pyd" />
         <File Name="mercurial.parsers.pyd" />
         <File Name="pyexpat.pyd" />
-        <File Name="python26.dll" />
+        <File Name="python27.dll" />
         <File Name="bz2.pyd" />
         <File Name="select.pyd" />
         <File Name="unicodedata.pyd" />
--- a/contrib/wix/guids.wxi	Fri Aug 17 13:58:19 2012 -0700
+++ b/contrib/wix/guids.wxi	Tue Sep 11 08:36:09 2012 -0700
@@ -27,10 +27,10 @@
   <?define templates.root.guid = {8DF97574-33E9-412F-8414-65B48BB18783} ?>
   <?define templates.atom.guid = {AB5D2908-BC95-44BE-9D79-069EF43D93E2} ?>
   <?define templates.coal.guid = {B63CCAAB-4EAF-43b4-901E-4BD13F5B78FC} ?>
-  <?define templates.gitweb.guid = {6A33D168-F84E-45AA-912C-23CAC2D66BCA} ?>
-  <?define templates.monoblue.guid = {D27AA750-9394-4DAC-84FC-A546CE8F347A} ?>
-  <?define templates.paper.guid = {D2591E56-709E-49F9-8A5F-1359E1CCD7E0} ?>
-  <?define templates.raw.guid = {04DE03A2-FBFD-4c5f-8DEA-5436DDF4689D} ?>
+  <?define templates.gitweb.guid = {827334AF-1EFD-421B-962C-5660A068F612} ?>
+  <?define templates.monoblue.guid = {8060A1E4-BD4C-453E-92CB-9536DC44A9E3} ?>
+  <?define templates.paper.guid = {61AB1DE9-645F-46ED-8AF8-0CF02267FFBB} ?>
+  <?define templates.raw.guid = {3F88E9B6-EA3C-41EB-8D8A-3F12E7DE9933} ?>
   <?define templates.rss.guid = {36069748-1E2A-472B-A212-506CB656A9C1} ?>
   <?define templates.spartan.guid = {80222625-FA8F-44b1-86CE-1781EF375D09} ?>
   <?define templates.static.guid = {B27D7311-050A-4A96-9971-B674A0EA21D0} ?>
--- a/contrib/wix/templates.wxs	Fri Aug 17 13:58:19 2012 -0700
+++ b/contrib/wix/templates.wxs	Tue Sep 11 08:36:09 2012 -0700
@@ -33,7 +33,6 @@
           <File Name="map-cmdline.default" />
           <File Name="map-cmdline.bisect" />
           <File Name="map-cmdline.xml" />
-          <File Name="template-vars.txt" />
         </Component>
 
         <Directory Id="templates.atomdir" Name="atom">
@@ -67,6 +66,7 @@
             <File Id="gitweb.changeset.tmpl"      Name="changeset.tmpl" />
             <File Id="gitweb.error.tmpl"          Name="error.tmpl" />
             <File Id="gitweb.fileannotate.tmpl"   Name="fileannotate.tmpl" />
+            <File Id="gitweb.filecomparison.tmpl" Name="filecomparison.tmpl" />
             <File Id="gitweb.filediff.tmpl"       Name="filediff.tmpl" />
             <File Id="gitweb.filelog.tmpl"        Name="filelog.tmpl" />
             <File Id="gitweb.filerevision.tmpl"   Name="filerevision.tmpl" />
@@ -95,6 +95,7 @@
             <File Id="monoblue.changeset.tmpl"      Name="changeset.tmpl" />
             <File Id="monoblue.error.tmpl"          Name="error.tmpl" />
             <File Id="monoblue.fileannotate.tmpl"   Name="fileannotate.tmpl" />
+            <File Id="monoblue.filecomparison.tmpl" Name="filecomparison.tmpl" />
             <File Id="monoblue.filediff.tmpl"       Name="filediff.tmpl" />
             <File Id="monoblue.filelog.tmpl"        Name="filelog.tmpl" />
             <File Id="monoblue.filerevision.tmpl"   Name="filerevision.tmpl" />
@@ -122,6 +123,7 @@
             <File Id="paper.diffstat.tmpl"      Name="diffstat.tmpl" />
             <File Id="paper.error.tmpl"         Name="error.tmpl" />
             <File Id="paper.fileannotate.tmpl"  Name="fileannotate.tmpl" />
+            <File Id="paper.filecomparison.tmpl" Name="filecomparison.tmpl" />
             <File Id="paper.filediff.tmpl"      Name="filediff.tmpl" />
             <File Id="paper.filelog.tmpl"       Name="filelog.tmpl" />
             <File Id="paper.filelogentry.tmpl"  Name="filelogentry.tmpl" />
@@ -148,6 +150,9 @@
             <File Id="raw.error.tmpl"        Name="error.tmpl" />
             <File Id="raw.fileannotate.tmpl" Name="fileannotate.tmpl" />
             <File Id="raw.filediff.tmpl"     Name="filediff.tmpl" />
+            <File Id="raw.graph.tmpl"        Name="graph.tmpl" />
+            <File Id="raw.graphedge.tmpl"    Name="graphedge.tmpl" />
+            <File Id="raw.graphnode.tmpl"    Name="graphnode.tmpl" />
             <File Id="raw.index.tmpl"        Name="index.tmpl" />
             <File Id="raw.manifest.tmpl"     Name="manifest.tmpl" />
             <File Id="raw.map"               Name="map" />
--- a/contrib/zsh_completion	Fri Aug 17 13:58:19 2012 -0700
+++ b/contrib/zsh_completion	Tue Sep 11 08:36:09 2012 -0700
@@ -361,6 +361,19 @@
     'urls:URL:_hg_urls'
 }
 
+_hg_add_help_topics=(
+    config dates diffs environment extensions filesets glossary hgignore hgweb
+    merge-tools multirevs obsolescence patterns phases revisions revsets
+    subrepos templating urls
+)
+
+_hg_help_topics() {
+    local topics
+    (( $#_hg_cmd_list )) || _hg_get_commands
+    topics=($_hg_cmd_list $_hg_add_help_topics)
+    _describe -t help_topics 'help topics' topics
+}
+
 # Common options
 _hg_global_opts=(
     '(--repository -R)'{-R+,--repository}'[repository root directory]:repository:_files -/'
@@ -385,18 +398,49 @@
   '*'{-I+,--include}'[include names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/'
   '*'{-X+,--exclude}'[exclude names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/')
 
+_hg_clone_opts=(
+  $_hg_remote_opts
+  '(--noupdate -U)'{-U,--noupdate}'[do not update the new working directory]'
+  '--pull[use pull protocol to copy metadata]'
+  '--uncompressed[use uncompressed transfer (fast over LAN)]')
+
+_hg_date_user_opts=(
+  '(--currentdate -D)'{-D,--currentdate}'[record the current date as commit date]'
+  '(--currentuser -U)'{-U,--currentuser}'[record the current user as committer]'
+  '(--date -d)'{-d+,--date}'[record the specified date as commit date]:date:'
+  '(--user -u)'{-u+,--user}'[record the specified user as committer]:user:')
+
+_hg_gitlike_opts=(
+  '(--git -g)'{-g,--git}'[use git extended diff format]')
+
 _hg_diff_opts=(
+  $_hg_gitlike_opts
   '(--text -a)'{-a,--text}'[treat all files as text]'
-  '(--git -g)'{-g,--git}'[use git extended diff format]'
-  "--nodates[omit dates from diff headers]")
+  '--nodates[omit dates from diff headers]')
+
+_hg_mergetool_opts=(
+  '(--tool -t)'{-t+,--tool}'[specify merge tool]:tool:')
 
 _hg_dryrun_opts=(
   '(--dry-run -n)'{-n,--dry-run}'[do not perform actions, just print output]')
 
+_hg_ignore_space_opts=(
+  '(--ignore-all-space -w)'{-w,--ignore-all-space}'[ignore white space when comparing lines]'
+  '(--ignore-space-change -b)'{-b,--ignore-space-change}'[ignore changes in the amount of white space]'
+  '(--ignore-blank-lines -B)'{-B,--ignore-blank-lines}'[ignore changes whose lines are all blank]')
+
 _hg_style_opts=(
   '--style[display using template map file]:'
   '--template[display with template]:')
 
+_hg_log_opts=(
+  $_hg_global_opts $_hg_style_opts $_hg_gitlike_opts
+  '(--limit -l)'{-l+,--limit}'[limit number of changes displayed]:'
+  '(--no-merges -M)'{-M,--no-merges}'[do not show merges]'
+  '(--patch -p)'{-p,--patch}'[show patch]'
+  '--stat[output diffstat-style summary of changes]'
+)
+
 _hg_commit_opts=(
   '(-m --message -l --logfile --edit -e)'{-e,--edit}'[edit commit message]'
   '(-e --edit -l --logfile --message -m)'{-m+,--message}'[use <text> as commit message]:message:'
@@ -406,12 +450,20 @@
   '(--ssh -e)'{-e+,--ssh}'[specify ssh command to use]:'
   '--remotecmd[specify hg command to run on the remote side]:')
 
+_hg_branch_bmark_opts=(
+  '(--bookmark -B)'{-B+,--bookmark}'[specify bookmark(s)]:bookmark:_hg_bookmarks'
+  '(--branch -b)'{-b+,--branch}'[specify branch(es)]:branch:_hg_branches'
+)
+
+_hg_subrepos_opts=(
+  '(--subrepos -S)'{-S,--subrepos}'[recurse into subrepositories]')
+
 _hg_cmd() {
   _call_program hg HGPLAIN=1 hg "$_hg_cmd_globals[@]" "$@" 2> /dev/null
 }
 
 _hg_cmd_add() {
-  _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts $_hg_subrepos_opts \
   '*:unknown files:_hg_unknown'
 }
 
@@ -434,7 +486,7 @@
 }
 
 _hg_cmd_archive() {
-  _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_subrepos_opts \
   '--no-decode[do not pass files through decoders]' \
   '(--prefix -p)'{-p+,--prefix}'[directory prefix for files in archive]:' \
   '(--rev -r)'{-r+,--rev}'[revision to distribute]:revision:_hg_labels' \
@@ -443,7 +495,7 @@
 }
 
 _hg_cmd_backout() {
-  _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_mergetool_opts $_hg_pat_opts \
     '--merge[merge with old dirstate parent after backout]' \
     '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
     '--parent[parent to choose when backing out merge]' \
@@ -456,6 +508,7 @@
 _hg_cmd_bisect() {
   _arguments -s -w : $_hg_global_opts \
   '(-)'{-r,--reset}'[reset bisect state]' \
+  '(--extend -e)'{-e,--extend}'[extend the bisect range]' \
   '(--good -g --bad -b --skip -s --reset -r)'{-g,--good}'[mark changeset good]'::revision:_hg_labels \
   '(--good -g --bad -b --skip -s --reset -r)'{-b,--bad}'[mark changeset bad]'::revision:_hg_labels \
   '(--good -g --bad -b --skip -s --reset -r)'{-s,--skip}'[skip testing changeset]' \
@@ -466,6 +519,7 @@
 _hg_cmd_bookmarks() {
   _arguments -s -w : $_hg_global_opts \
   '(--force -f)'{-f,--force}'[force]' \
+  '(--inactive -i)'{-i,--inactive}'[mark a bookmark inactive]' \
   '(--rev -r --delete -d --rename -m)'{-r+,--rev}'[revision]:revision:_hg_labels' \
   '(--rev -r --delete -d --rename -m)'{-d,--delete}'[delete a given bookmark]' \
   '(--rev -r --delete -d --rename -m)'{-m+,--rename}'[rename a given bookmark]:bookmark:_hg_bookmarks' \
@@ -480,13 +534,17 @@
 
 _hg_cmd_branches() {
   _arguments -s -w : $_hg_global_opts \
-  '(--active -a)'{-a,--active}'[show only branches that have unmerge heads]'
+  '(--active -a)'{-a,--active}'[show only branches that have unmerge heads]' \
+  '(--closed -c)'{-c,--closed}'[show normal and closed branches]'
 }
 
 _hg_cmd_bundle() {
   _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
   '(--force -f)'{-f,--force}'[run even when remote repository is unrelated]' \
   '(2)*--base[a base changeset to specify instead of a destination]:revision:_hg_labels' \
+  '(--branch -b)'{-b+,--branch}'[a specific branch to bundle]' \
+  '(--rev -r)'{-r+,--rev}'[changeset(s) to bundle]:' \
+  '--all[bundle all changesets in the repository]' \
   ':output file:_files' \
   ':destination repository:_files -/'
 }
@@ -495,26 +553,28 @@
   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
   '(--output -o)'{-o+,--output}'[print output to file with formatted name]:filespec:' \
   '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_labels' \
+  '--decode[apply any matching decode filter]' \
   '*:file:_hg_files'
 }
 
 _hg_cmd_clone() {
-  _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
-  '(--noupdate -U)'{-U,--noupdate}'[do not update the new working directory]' \
+  _arguments -s -w : $_hg_global_opts $_hg_clone_opts \
   '(--rev -r)'{-r+,--rev}'[a changeset you would like to have after cloning]:' \
-  '--uncompressed[use uncompressed transfer (fast over LAN)]' \
+  '(--updaterev -u)'{-u+,--updaterev}'[revision, tag or branch to check out]' \
+  '(--branch -b)'{-b+,--branch}'[clone only the specified branch]' \
   ':source repository:_hg_remote' \
   ':destination:_hg_clone_dest'
 }
 
 _hg_cmd_commit() {
-  _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_subrepos_opts \
   '(--addremove -A)'{-A,--addremove}'[mark new/missing files as added/removed before committing]' \
   '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
   '(--logfile -l)'{-l+,--logfile}'[read commit message from <file>]:log file:_files -g \*.txt' \
   '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
   '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
   '--amend[amend the parent of the working dir]' \
+  '--close-branch[mark a branch as closed]' \
   '*:file:_hg_files'
 }
 
@@ -527,12 +587,15 @@
 
 _hg_cmd_diff() {
   typeset -A opt_args
-  _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_diff_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_diff_opts $_hg_ignore_space_opts \
+                     $_hg_pat_opts $_hg_subrepos_opts \
   '*'{-r,--rev}'+[revision]:revision:_hg_revrange' \
   '(--show-function -p)'{-p,--show-function}'[show which function each change is in]' \
-  '(--ignore-all-space -w)'{-w,--ignore-all-space}'[ignore white space when comparing lines]' \
-  '(--ignore-space-change -b)'{-b,--ignore-space-change}'[ignore changes in the amount of white space]' \
-  '(--ignore-blank-lines -B)'{-B,--ignore-blank-lines}'[ignore changes whose lines are all blank]' \
+  '(--change -c)'{-c,--change}'[change made by revision]' \
+  '(--text -a)'{-a,--text}'[treat all files as text]' \
+  '--reverse[produce a diff that undoes the changes]' \
+  '(--unified -U)'{-U,--unified}'[number of lines of context to show]' \
+  '--stat[output diffstat-style summary of changes]' \
   '*:file:->diff_files'
 
   if [[ $state == 'diff_files' ]]
@@ -550,20 +613,21 @@
   _arguments -s -w : $_hg_global_opts $_hg_diff_opts \
   '(--outout -o)'{-o+,--output}'[print output to file with formatted name]:filespec:' \
   '--switch-parent[diff against the second parent]' \
+  '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_labels' \
   '*:revision:_hg_labels'
 }
 
+_hg_cmd_forget() {
+  _arguments -s -w : $_hg_global_opts \
+  '*:file:_hg_files'
+}
+
 _hg_cmd_graft() {
-  _arguments -s -w : $_hg_global_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_dryrun_opts \
+                     $_hg_date_user_opts $_hg_mergetool_opts \
   '(--continue -c)'{-c,--continue}'[resume interrupted graft]' \
   '(--edit -e)'{-e,--edit}'[invoke editor on commit messages]' \
   '--log[append graft info to log message]' \
-  '(--currentdate -D)'{-D,--currentdate}'[record the current date as commit date]' \
-  '(--currentuser -U)'{-U,--currentuser}'[record the current user as committer]' \
-  '(--date -d)'{-d,--date}'[record the specified date as commit date]' \
-  '(--user -u)'{-u,--user}'[record the specified user as committer]' \
-  '(--tool -t)'{-t,--tool}'[specify merge tool]' \
-  '(--dry-run -n)'{-n,--dry-run}'[do not perform actions, just print output]' \
   '*:revision:_hg_labels'
 }
 
@@ -577,44 +641,55 @@
   '(--line-number -n)'{-n,--line-number}'[print matching line numbers]' \
   '*'{-r+,--rev}'[search in given revision range]:revision:_hg_revrange' \
   '(--user -u)'{-u,--user}'[print user who committed change]' \
+  '(--date -d)'{-d,--date}'[print date of a changeset]' \
   '1:search pattern:' \
   '*:files:_hg_files'
 }
 
 _hg_cmd_heads() {
   _arguments -s -w : $_hg_global_opts $_hg_style_opts \
+  '(--topo -t)'{-t,--topo}'[show topological heads only]' \
+  '(--closed -c)'{-c,--closed}'[show normal and closed branch heads]' \
   '(--rev -r)'{-r+,--rev}'[show only heads which are descendants of rev]:revision:_hg_labels'
 }
 
 _hg_cmd_help() {
   _arguments -s -w : $_hg_global_opts \
-  '*:mercurial command:_hg_commands'
+  '(--extension -e)'{-e,--extension}'[show only help for extensions]' \
+  '(--command -c)'{-c,--command}'[show only help for commands]' \
+  '(--keyword -k)'{-k+,--keyword}'[show topics matching keyword]' \
+  '*:mercurial help topic:_hg_help_topics'
 }
 
 _hg_cmd_identify() {
-  _arguments -s -w : $_hg_global_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
   '(--rev -r)'{-r+,--rev}'[identify the specified rev]:revision:_hg_labels' \
   '(--num -n)'{-n+,--num}'[show local revision number]' \
   '(--id -i)'{-i+,--id}'[show global revision id]' \
   '(--branch -b)'{-b+,--branch}'[show branch]' \
+  '(--bookmark -B)'{-B+,--bookmark}'[show bookmarks]' \
   '(--tags -t)'{-t+,--tags}'[show tags]'
 }
 
 _hg_cmd_import() {
-  _arguments -s -w : $_hg_global_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_commit_opts \
   '(--strip -p)'{-p+,--strip}'[directory strip option for patch (default: 1)]:count:' \
-  '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
   '(--force -f)'{-f,--force}'[skip check for outstanding uncommitted changes]' \
   '--bypass[apply patch without touching the working directory]' \
+  '--no-commit[do not commit, just update the working directory]' \
+  '--exact[apply patch to the nodes from which it was generated]' \
+  '--import-branch[use any branch information in patch (implied by --exact)]' \
+  '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
+  '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
+  '(--similarity -s)'{-s+,--similarity}'[guess renamed files by similarity (0<=s<=100)]:' \
   '*:patch:_files'
 }
 
 _hg_cmd_incoming() {
-  _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
-  '(--no-merges -M)'{-M,--no-merges}'[do not show merge revisions]' \
+  _arguments -s -w : $_hg_log_opts $_hg_branch_bmark_opts $_hg_remote_opts \
+                     $_hg_subrepos_opts \
   '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
-  '(--patch -p)'{-p,--patch}'[show patch]' \
-  '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:_hg_tags' \
+  '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:_hg_labels' \
   '(--newest-first -n)'{-n,--newest-first}'[show newest record first]' \
   '--bundle[file to store the bundles into]:bundle file:_files' \
   ':source:_hg_remote'
@@ -634,42 +709,41 @@
 }
 
 _hg_cmd_log() {
-  _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_style_opts \
+  _arguments -s -w : $_hg_log_opts $_hg_pat_opts \
   '(--follow --follow-first -f)'{-f,--follow}'[follow changeset or history]' \
   '(-f --follow)--follow-first[only follow the first parent of merge changesets]' \
   '(--copies -C)'{-C,--copies}'[show copied files]' \
   '(--keyword -k)'{-k+,--keyword}'[search for a keyword]:' \
-  '(--limit -l)'{-l+,--limit}'[limit number of changes displayed]:' \
   '*'{-r,--rev}'[show the specified revision or range]:revision:_hg_revrange' \
-  '(--no-merges -M)'{-M,--no-merges}'[do not show merges]' \
   '(--only-merges -m)'{-m,--only-merges}'[show only merges]' \
-  '(--patch -p)'{-p,--patch}'[show patch]' \
   '(--prune -P)'{-P+,--prune}'[do not display revision or any of its ancestors]:revision:_hg_labels' \
+  '(--graph -G)'{-G+,--graph}'[show the revision DAG]' \
   '(--branch -b)'{-b+,--branch}'[show changesets within the given named branch]:branch:_hg_branches' \
+  '(--user -u)'{-u+,--user}'[revisions committed by user]:user:' \
+  '(--date -d)'{-d+,--date}'[show revisions matching date spec]:date:' \
   '*:files:_hg_files'
 }
 
 _hg_cmd_manifest() {
   _arguments -s -w : $_hg_global_opts \
   '--all[list files from all revisions]' \
+  '(--rev -r)'{-r+,--rev}'[revision to display]:revision:_hg_labels' \
   ':revision:_hg_labels'
 }
 
 _hg_cmd_merge() {
-  _arguments -s -w : $_hg_global_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_mergetool_opts \
   '(--force -f)'{-f,--force}'[force a merge with outstanding changes]' \
   '(--rev -r 1)'{-r,--rev}'[revision to merge]:revision:_hg_mergerevs' \
   '(--preview -P)'{-P,--preview}'[review revisions to merge (no merge is performed)]' \
-  '(--tool -t)'{-t,--tool}'[specify merge tool]' \
   ':revision:_hg_mergerevs'
 }
 
 _hg_cmd_outgoing() {
-  _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
-  '(--no-merges -M)'{-M,--no-merges}'[do not show merge revisions]' \
+  _arguments -s -w : $_hg_log_opts $_hg_branch_bmark_opts $_hg_remote_opts \
+                     $_hg_subrepos_opts \
   '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
-  '(--patch -p)'{-p,--patch}'[show patch]' \
-  '(--rev -r)'{-r+,--rev}'[a specific revision you would like to push]' \
+  '*'{-r,--rev}'[a specific revision you would like to push]:revision:_hg_revrange' \
   '(--newest-first -n)'{-n,--newest-first}'[show newest record first]' \
   ':destination:_hg_remote'
 }
@@ -696,7 +770,7 @@
 }
 
 _hg_cmd_pull() {
-  _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_branch_bmark_opts $_hg_remote_opts \
   '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
   '(--update -u)'{-u,--update}'[update to new tip if changesets were pulled]' \
   '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:' \
@@ -704,9 +778,10 @@
 }
 
 _hg_cmd_push() {
-  _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_branch_bmark_opts $_hg_remote_opts \
   '(--force -f)'{-f,--force}'[force push]' \
   '(--rev -r)'{-r+,--rev}'[a specific revision you would like to push]:revision:_hg_labels' \
+  '--new-branch[allow pushing a new branch]' \
   ':destination:_hg_remote'
 }
 
@@ -728,7 +803,9 @@
   local context state line
   typeset -A opt_args
 
-  _arguments -s -w : $_hg_global_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_mergetool_opts $_hg_pat_opts \
+  '(--all -a)'{-a,--all}'[select all unresolved files]' \
+  '(--no-status -n)'{-n,--no-status}'[hide status prefix]' \
   '(--list -l --mark -m --unmark -u)'{-l,--list}'[list state of files needing merge]:*:merged files:->resolve_files' \
   '(--mark -m --list -l --unmark -u)'{-m,--mark}'[mark files as resolved]:*:unresolved files:_hg_unresolved' \
   '(--unmark -u --list -l --mark -m)'{-u,--unmark}'[unmark files as resolved]:*:resolved files:_hg_resolved' \
@@ -749,6 +826,7 @@
   '(--all -a :)'{-a,--all}'[revert all changes when no arguments given]' \
   '(--rev -r)'{-r+,--rev}'[revision to revert to]:revision:_hg_labels' \
   '(--no-backup -C)'{-C,--no-backup}'[do not save backup copies of files]' \
+  '(--date -d)'{-d+,--date}'[tipmost revision matching date]:date code:' \
   '*:file:->diff_files'
 
   if [[ $state == 'diff_files' ]]
@@ -764,6 +842,11 @@
   fi
 }
 
+_hg_cmd_rollback() {
+  _arguments -s -w : $_hg_global_opts $_hg_dryrun_opts \
+  '(--force -f)'{-f,--force}'[ignore safety measures]' \
+}
+
 _hg_cmd_serve() {
   _arguments -s -w : $_hg_global_opts \
   '(--accesslog -A)'{-A+,--accesslog}'[name of access log file]:log file:_files' \
@@ -771,10 +854,15 @@
   '(--daemon -d)'{-d,--daemon}'[run server in background]' \
   '(--port -p)'{-p+,--port}'[listen port]:listen port:' \
   '(--address -a)'{-a+,--address}'[interface address]:interface address:' \
+  '--prefix[prefix path to serve from]:directory:_files' \
   '(--name -n)'{-n+,--name}'[name to show in web pages]:repository name:' \
+  '--web-conf[name of the hgweb config file]:webconf_file:_files' \
+  '--pid-file[name of file to write process ID to]:pid_file:_files' \
+  '--cmdserver[cmdserver mode]:mode:' \
   '(--templates -t)'{-t,--templates}'[web template directory]:template dir:_files -/' \
   '--style[web template style]:style' \
   '--stdio[for remote clients]' \
+  '--certificate[certificate file]:cert_file:_files' \
   '(--ipv6 -6)'{-6,--ipv6}'[use IPv6 in addition to IPv4]'
 }
 
@@ -785,7 +873,7 @@
 }
 
 _hg_cmd_status() {
-  _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_subrepos_opts \
   '(--all -A)'{-A,--all}'[show status of all files]' \
   '(--modified -m)'{-m,--modified}'[show only modified files]' \
   '(--added -a)'{-a,--added}'[show only added files]' \
@@ -798,6 +886,7 @@
   '(--copies -C)'{-C,--copies}'[show source of copied files]' \
   '(--print0 -0)'{-0,--print0}'[end filenames with NUL, for use with xargs]' \
   '--rev[show difference from revision]:revision:_hg_labels' \
+  '--change[list the changed files of a revision]:revision:_hg_labels' \
   '*:files:_files'
 }
 
@@ -813,11 +902,14 @@
   '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
   '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
   '(--rev -r)'{-r+,--rev}'[revision to tag]:revision:_hg_labels' \
+  '(--force -f)'{-f,--force}'[force tag]' \
+  '--remove[remove a tag]' \
+  '(--edit -e)'{-e,--edit}'[edit commit message]' \
   ':tag name:'
 }
 
 _hg_cmd_tip() {
-  _arguments -s -w : $_hg_global_opts $_hg_style_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_gitlike_opts $_hg_style_opts \
   '(--patch -p)'{-p,--patch}'[show patch]'
 }
 
@@ -831,6 +923,8 @@
   _arguments -s -w : $_hg_global_opts \
   '(--clean -C)'{-C,--clean}'[overwrite locally modified files]' \
   '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_labels' \
+  '(--check -c)'{-c,--check}'[update across branches if no uncommitted changes]' \
+  '(--date -d)'{-d+,--date}'[tipmost revision matching date]' \
   ':revision:_hg_labels'
 }
 
@@ -893,7 +987,16 @@
   '(--summary -s)'{-s,--summary}'[print first line of patch header]')
 
 _hg_cmd_qapplied() {
-  _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
+  _arguments -s -w : $_hg_global_opts $_hg_qseries_opts \
+  '(--last -1)'{-1,--last}'[show only the preceding applied patch]' \
+  '*:patch:_hg_qapplied'
+}
+
+_hg_cmd_qclone() {
+  _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_clone_opts \
+  '(--patches -p)'{-p+,--patches}'[location of source patch repository]' \
+  ':source repository:_hg_remote' \
+  ':destination:_hg_clone_dest'
 }
 
 _hg_cmd_qdelete() {
@@ -904,7 +1007,8 @@
 }
 
 _hg_cmd_qdiff() {
-  _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_diff_opts \
+                     $_hg_ignore_space_opts \
   '*:pattern:_hg_files'
 }
 
@@ -917,12 +1021,15 @@
 _hg_cmd_qfold() {
   _arguments -s -w : $_hg_global_opts $_h_commit_opts \
   '(--keep,-k)'{-k,--keep}'[keep folded patch files]' \
+  '(--force -f)'{-f,--force}'[overwrite any local changes]' \
+  '--no-backup[do not save backup copies of files]' \
   '*:unapplied patch:_hg_qunapplied'
 }
 
 _hg_cmd_qgoto() {
   _arguments -s -w : $_hg_global_opts \
   '(--force -f)'{-f,--force}'[overwrite any local changes]' \
+  '--keep-changes[tolerate non-conflicting local changes]' \
   ':patch:_hg_qseries'
 }
 
@@ -940,17 +1047,17 @@
 }
 
 _hg_cmd_qimport() {
-  _arguments -s -w : $_hg_global_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_gitlike_opts \
   '(--existing -e)'{-e,--existing}'[import file in patch dir]' \
   '(--name -n 2)'{-n+,--name}'[patch file name]:name:' \
   '(--force -f)'{-f,--force}'[overwrite existing files]' \
   '*'{-r+,--rev}'[place existing revisions under mq control]:revision:_hg_revrange' \
+  '(--push -P)'{-P,--push}'[qpush after importing]' \
   '*:patch:_files'
 }
 
 _hg_cmd_qnew() {
-  _arguments -s -w : $_hg_global_opts $_hg_commit_opts \
-  '(--force -f)'{-f,--force}'[import uncommitted changes into patch]' \
+  _arguments -s -w : $_hg_global_opts $_hg_commit_opts $_hg_date_user_opts $_hg_gitlike_opts \
   ':patch:'
 }
 
@@ -961,8 +1068,9 @@
 _hg_cmd_qpop() {
   _arguments -s -w : $_hg_global_opts \
   '(--all -a :)'{-a,--all}'[pop all patches]' \
-  '(--name -n)'{-n+,--name}'[queue name to pop]:' \
   '(--force -f)'{-f,--force}'[forget any local changes]' \
+  '--keep-changes[tolerate non-conflicting local changes]' \
+  '--no-backup[do not save backup copies of files]' \
   ':patch:_hg_qapplied'
 }
 
@@ -974,24 +1082,23 @@
   _arguments -s -w : $_hg_global_opts \
   '(--all -a :)'{-a,--all}'[apply all patches]' \
   '(--list -l)'{-l,--list}'[list patch name in commit text]' \
-  '(--merge -m)'{-m+,--merge}'[merge from another queue]:' \
-  '(--name -n)'{-n+,--name}'[merge queue name]:' \
   '(--force -f)'{-f,--force}'[apply if the patch has rejects]' \
   '(--exact -e)'{-e,--exact}'[apply the target patch to its recorded parent]' \
   '--move[reorder patch series and apply only the patch]' \
+  '--keep-changes[tolerate non-conflicting local changes]' \
+  '--no-backup[do not save backup copies of files]' \
   ':patch:_hg_qunapplied'
 }
 
 _hg_cmd_qrefresh() {
-  _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_commit_opts \
-  '(--git -g)'{-g,--git}'[use git extended diff format]' \
+  _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_commit_opts $_hg_gitlike_opts \
   '(--short -s)'{-s,--short}'[short refresh]' \
   '*:files:_hg_files'
 }
 
 _hg_cmd_qrename() {
   _arguments -s -w : $_hg_global_opts \
-  ':patch:_hg_qseries' \
+  ':patch:_hg_qunapplied' \
   ':destination:'
 }
 
@@ -1010,7 +1117,8 @@
 }
 
 _hg_cmd_qunapplied() {
-  _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
+  _arguments -s -w : $_hg_global_opts $_hg_qseries_opts \
+  '(--first -1)'{-1,--first}'[show only the first patch]'
 }
 
 _hg_cmd_qtop() {
@@ -1019,16 +1127,17 @@
 
 _hg_cmd_strip() {
   _arguments -s -w : $_hg_global_opts \
-  '(--force -f)'{-f,--force}'[force multi-head removal]' \
-  '(--backup -b)'{-b,--backup}'[bundle unrelated changesets]' \
-  '(--nobackup -n)'{-n,--nobackup}'[no backups]' \
+  '(--force -f)'{-f,--force}'[force removal, discard uncommitted changes, no backup]' \
+  '(--no-backup -n)'{-n,--no-backup}'[no backups]' \
+  '(--keep -k)'{-k,--keep}'[do not modify working copy during strip]' \
+  '(--bookmark -B)'{-B+,--bookmark}'[remove revs only reachable from given bookmark]:bookmark:_hg_bookmarks' \
+  '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_labels' \
   ':revision:_hg_labels'
 }
 
 # Patchbomb
 _hg_cmd_email() {
-  _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
-  '(--git -g)'{-g,--git}'[use git extended diff format]' \
+  _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_gitlike_opts \
   '--plain[omit hg patch header]' \
   '--body[send patches as inline message text (default)]' \
   '(--outgoing -o)'{-o,--outgoing}'[send changes not found in the target repository]' \
@@ -1058,20 +1167,61 @@
 
 # Rebase
 _hg_cmd_rebase() {
-  _arguments -s -w : $_hg_global_opts \
+  _arguments -s -w : $_hg_global_opts $_hg_commit_opts $_hg_mergetool_opts \
   '*'{-r,--rev}'[rebase these revisions]:revision:_hg_revrange' \
-  '(--source -s)'{-s,--source}'[rebase from the specified changeset]:revision:_hg_labels' \
-  '(--base -b)'{-b,--base}'[rebase from the base of the specified changeset]:revision:_hg_labels' \
-  '(--dest -d)'{-d,--dest}'[rebase onto the specified changeset]' \
+  '(--source -s)'{-s+,--source}'[rebase from the specified changeset]:revision:_hg_labels' \
+  '(--base -b)'{-b+,--base}'[rebase from the base of the specified changeset]:revision:_hg_labels' \
+  '(--dest -d)'{-d+,--dest}'[rebase onto the specified changeset]:revision:_hg_labels' \
   '--collapse[collapse the rebased changeset]' \
-  '(--message -m)'{-m+,--message}'[use <text> as collapse commit message]:text:' \
-  '(--edit -e)'{-e,--edit}'[invoke editor on commit messages]' \
-  '(--logfile -l)'{-l+,--logfile}'[read collapse commit message from <file>]:log file:_files -g \*.txt' \
   '--keep[keep original changeset]' \
   '--keepbranches[keep original branch name]' \
-  '(--tool -t)'{-t,--tool}'[specify merge tool]' \
   '(--continue -c)'{-c,--continue}'[continue an interrupted rebase]' \
   '(--abort -a)'{-a,--abort}'[abort an interrupted rebase]' \
 }
 
+# Record
+_hg_cmd_record() {
+  _arguments -s -w : $_hg_global_opts $_hg_commit_opts $_hg_pat_opts \
+                     $_hg_ignore_space_opts $_hg_subrepos_opts \
+  '(--addremove -A)'{-A,--addremove}'[mark new/missing files as added/removed before committing]' \
+  '--close-branch[mark a branch as closed, hiding it from the branch list]' \
+  '--amend[amend the parent of the working dir]' \
+  '(--date -d)'{-d+,--date}'[record the specified date as commit date]:date:' \
+  '(--user -u)'{-u+,--user}'[record the specified user as committer]:user:'
+}
+
+_hg_cmd_qrecord() {
+  _arguments -s -w : $_hg_global_opts $_hg_commit_opts $_hg_date_user_opts $_hg_gitlike_opts \
+                     $_hg_pat_opts $_hg_ignore_space_opts $_hg_subrepos_opts
+}
+
+# Convert
+_hg_cmd_convert() {
+_arguments -s -w : $_hg_global_opts \
+  '(--source-type -s)'{-s,--source-type}'[source repository type]' \
+  '(--dest-type -d)'{-d,--dest-type}'[destination repository type]' \
+  '(--rev -r)'{-r+,--rev}'[import up to target revision]:revision:' \
+  '(--authormap -A)'{-A+,--authormap}'[remap usernames using this file]:file:_files' \
+  '--filemap[remap file names using contents of file]:file:_files' \
+  '--splicemap[splice synthesized history into place]:file:_files' \
+  '--branchmap[change branch names while converting]:file:_files' \
+  '--branchsort[try to sort changesets by branches]' \
+  '--datesort[try to sort changesets by date]' \
+  '--sourcesort[preserve source changesets order]'
+}
+
+# Graphlog
+_hg_cmd_glog() {
+  _hg_cmd_log $@
+}
+
+# Purge
+_hg_cmd_purge() {
+  _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_subrepos_opts \
+  '(--abort-on-err -a)'{-a,--abort-on-err}'[abort if an error occurs]' \
+  '--all[purge ignored files too]' \
+  '(--print -p)'{-p,--print}'[print filenames instead of deleting them]' \
+  '(--print0 -0)'{-0,--print0}'[end filenames with NUL, for use with xargs (implies -p/--print)]'
+}
+
 _hg "$@"
--- a/hgext/acl.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/acl.py	Tue Sep 11 08:36:09 2012 -0700
@@ -126,9 +126,9 @@
   # Group "hg-denied" will not have write access to any file:
   ** = @hg-denied
 
-  # Nobody will be able to change "DO-NOT-TOUCH-THIS.txt", despite
+  # Nobody will be able to change "DONT-TOUCH-THIS.txt", despite
   # everyone being able to change all other files. See below.
-  src/main/resources/DO-NOT-TOUCH-THIS.txt = *
+  src/main/resources/DONT-TOUCH-THIS.txt = *
 
   [acl.allow]
   # if acl.allow is not present, all users are allowed by default
--- a/hgext/bugzilla.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/bugzilla.py	Tue Sep 11 08:36:09 2012 -0700
@@ -53,7 +53,7 @@
 Configuration items common to all access modes:
 
 bugzilla.version
-  This access type to use. Values recognized are:
+  The access type to use. Values recognized are:
 
   :``xmlrpc``:       Bugzilla XMLRPC interface.
   :``xmlrpc+email``: Bugzilla XMLRPC and email interfaces.
@@ -516,7 +516,7 @@
             raise util.Abort(_('unknown database schema'))
         return ids[0][0]
 
-# Buzgilla via XMLRPC interface.
+# Bugzilla via XMLRPC interface.
 
 class cookietransportrequest(object):
     """A Transport request method that retains cookies over its lifetime.
--- a/hgext/convert/__init__.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/convert/__init__.py	Tue Sep 11 08:36:09 2012 -0700
@@ -74,7 +74,7 @@
 
     The authormap is a simple text file that maps each source commit
     author to a destination commit author. It is handy for source SCMs
-    that use unix logins to identify authors (eg: CVS). One line per
+    that use unix logins to identify authors (e.g.: CVS). One line per
     author mapping and the line format is::
 
       source author = destination author
--- a/hgext/convert/common.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/convert/common.py	Tue Sep 11 08:36:09 2012 -0700
@@ -5,8 +5,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
-import base64, errno
-import os
+import base64, errno, subprocess, os
 import cPickle as pickle
 from mercurial import util
 from mercurial.i18n import _
@@ -260,7 +259,7 @@
     def postrun(self):
         pass
 
-    def _cmdline(self, cmd, closestdin, *args, **kwargs):
+    def _cmdline(self, cmd, *args, **kwargs):
         cmdline = [self.command, cmd] + list(args)
         for k, v in kwargs.iteritems():
             if len(k) == 1:
@@ -276,20 +275,23 @@
                 pass
         cmdline = [util.shellquote(arg) for arg in cmdline]
         if not self.ui.debugflag:
-            cmdline += ['2>', util.nulldev]
-        if closestdin:
-            cmdline += ['<', util.nulldev]
+            cmdline += ['2>', os.devnull]
         cmdline = ' '.join(cmdline)
         return cmdline
 
     def _run(self, cmd, *args, **kwargs):
-        return self._dorun(util.popen, cmd, True, *args, **kwargs)
+        def popen(cmdline):
+            p = subprocess.Popen(cmdline, shell=True, bufsize=-1,
+                    close_fds=util.closefds,
+                    stdout=subprocess.PIPE)
+            return p
+        return self._dorun(popen, cmd, *args, **kwargs)
 
     def _run2(self, cmd, *args, **kwargs):
-        return self._dorun(util.popen2, cmd, False, *args, **kwargs)
+        return self._dorun(util.popen2, cmd, *args, **kwargs)
 
-    def _dorun(self, openfunc, cmd, closestdin, *args, **kwargs):
-        cmdline = self._cmdline(cmd, closestdin, *args, **kwargs)
+    def _dorun(self, openfunc, cmd,  *args, **kwargs):
+        cmdline = self._cmdline(cmd, *args, **kwargs)
         self.ui.debug('running: %s\n' % (cmdline,))
         self.prerun()
         try:
@@ -298,16 +300,17 @@
             self.postrun()
 
     def run(self, cmd, *args, **kwargs):
-        fp = self._run(cmd, *args, **kwargs)
-        output = fp.read()
+        p = self._run(cmd, *args, **kwargs)
+        output = p.communicate()[0]
         self.ui.debug(output)
-        return output, fp.close()
+        return output, p.returncode
 
     def runlines(self, cmd, *args, **kwargs):
-        fp = self._run(cmd, *args, **kwargs)
-        output = fp.readlines()
+        p = self._run(cmd, *args, **kwargs)
+        output = p.stdout.readlines()
+        p.wait()
         self.ui.debug(''.join(output))
-        return output, fp.close()
+        return output, p.returncode
 
     def checkexit(self, status, output=''):
         if status:
@@ -345,8 +348,8 @@
         # (and make happy Windows shells while doing this).
         return argmax // 2 - 1
 
-    def limit_arglist(self, arglist, cmd, closestdin, *args, **kwargs):
-        cmdlen = len(self._cmdline(cmd, closestdin, *args, **kwargs))
+    def _limit_arglist(self, arglist, cmd, *args, **kwargs):
+        cmdlen = len(self._cmdline(cmd, *args, **kwargs))
         limit = self.argmax - cmdlen
         bytes = 0
         fl = []
@@ -363,7 +366,7 @@
             yield fl
 
     def xargs(self, arglist, cmd, *args, **kwargs):
-        for l in self.limit_arglist(arglist, cmd, True, *args, **kwargs):
+        for l in self._limit_arglist(arglist, cmd, *args, **kwargs):
             self.run0(cmd, *(list(args) + l), **kwargs)
 
 class mapfile(dict):
--- a/hgext/convert/cvs.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/convert/cvs.py	Tue Sep 11 08:36:09 2012 -0700
@@ -202,7 +202,7 @@
     def getfile(self, name, rev):
 
         def chunkedread(fp, count):
-            # file-objects returned by socked.makefile() do not handle
+            # file-objects returned by socket.makefile() do not handle
             # large read() requests very well.
             chunksize = 65536
             output = StringIO()
--- a/hgext/convert/cvsps.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/convert/cvsps.py	Tue Sep 11 08:36:09 2012 -0700
@@ -156,8 +156,8 @@
         # The cvsps cache pickle needs a uniquified name, based on the
         # repository location. The address may have all sort of nasties
         # in it, slashes, colons and such. So here we take just the
-        # alphanumerics, concatenated in a way that does not mix up the
-        # various components, so that
+        # alphanumeric characters, concatenated in a way that does not
+        # mix up the various components, so that
         #    :pserver:user@server:/path
         # and
         #    /pserver/user/server/path
@@ -503,7 +503,7 @@
 
         # Check if log entry belongs to the current changeset or not.
 
-        # Since CVS is file centric, two different file revisions with
+        # Since CVS is file-centric, two different file revisions with
         # different branchpoints should be treated as belonging to two
         # different changesets (and the ordering is important and not
         # honoured by cvsps at this point).
--- a/hgext/convert/darcs.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/convert/darcs.py	Tue Sep 11 08:36:09 2012 -0700
@@ -104,9 +104,10 @@
         # possible, etree will still raise an exception if any
         # non-printable characters are in the XML changelog.
         parser = XMLParser(encoding='latin-1')
-        fp = self._run(cmd, **kwargs)
-        etree.parse(fp, parser=parser)
-        self.checkexit(fp.close())
+        p = self._run(cmd, **kwargs)
+        etree.parse(p.stdout, parser=parser)
+        p.wait()
+        self.checkexit(p.returncode)
         return etree.getroot()
 
     def format(self):
--- a/hgext/convert/gnuarch.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/convert/gnuarch.py	Tue Sep 11 08:36:09 2012 -0700
@@ -89,7 +89,7 @@
 
             # Get the complete list of revisions for that tree version
             output, status = self.runlines('revisions', '-r', '-f', treeversion)
-            self.checkexit(status, 'failed retrieveing revisions for %s'
+            self.checkexit(status, 'failed retrieving revisions for %s'
                            % treeversion)
 
             # No new iteration unless a revision has a continuation-of header
@@ -184,7 +184,7 @@
         cmdline = [self.execmd, cmd]
         cmdline += args
         cmdline = [util.shellquote(arg) for arg in cmdline]
-        cmdline += ['>', util.nulldev, '2>', util.nulldev]
+        cmdline += ['>', os.devnull, '2>', os.devnull]
         cmdline = util.quotecommand(' '.join(cmdline))
         self.ui.debug(cmdline, '\n')
         return os.system(cmdline)
--- a/hgext/convert/monotone.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/convert/monotone.py	Tue Sep 11 08:36:09 2012 -0700
@@ -225,7 +225,6 @@
             return [self.rev]
 
     def getchanges(self, rev):
-        #revision = self.mtncmd("get_revision %s" % rev).split("\n\n")
         revision = self.mtnrun("get_revision", rev).split("\n\n")
         files = {}
         ignoremove = {}
--- a/hgext/convert/subversion.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/convert/subversion.py	Tue Sep 11 08:36:09 2012 -0700
@@ -887,7 +887,7 @@
             io = StringIO()
             info = svn.ra.get_file(self.ra, file, revnum, io)
             data = io.getvalue()
-            # ra.get_files() seems to keep a reference on the input buffer
+            # ra.get_file() seems to keep a reference on the input buffer
             # preventing collection. Release it explicitly.
             io.close()
             if isinstance(info, list):
@@ -923,7 +923,7 @@
         # Given the repository url of this wc, say
         #   "http://server/plone/CMFPlone/branches/Plone-2_0-branch"
         # extract the "entry" portion (a relative path) from what
-        # svn log --xml says, ie
+        # svn log --xml says, i.e.
         #   "/CMFPlone/branches/Plone-2_0-branch/tests/PloneTestCase.py"
         # that is to say "tests/PloneTestCase.py"
         if path.startswith(module):
--- a/hgext/extdiff.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/extdiff.py	Tue Sep 11 08:36:09 2012 -0700
@@ -109,7 +109,7 @@
     return dirname, fns_and_mtime
 
 def dodiff(ui, repo, diffcmd, diffopts, pats, opts):
-    '''Do the actuall diff:
+    '''Do the actual diff:
 
     - copy to a temp structure if diffing 2 internal revisions
     - copy to a temp structure if diffing working revision with
--- a/hgext/hgcia.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/hgcia.py	Tue Sep 11 08:36:09 2012 -0700
@@ -22,7 +22,7 @@
   # Style to use (optional)
   #style = foo
   # The URL of the CIA notification service (optional)
-  # You can use mailto: URLs to send by email, eg
+  # You can use mailto: URLs to send by email, e.g.
   # mailto:cia@cia.vc
   # Make sure to set email.from if you do this.
   #url = http://cia.vc/
--- a/hgext/histedit.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/histedit.py	Tue Sep 11 08:36:09 2012 -0700
@@ -175,6 +175,26 @@
 #
 """)
 
+def foldchanges(ui, repo, node1, node2, opts):
+    """Produce a new changeset that represents the diff from node1 to node2."""
+    try:
+        fd, patchfile = tempfile.mkstemp(prefix='hg-histedit-')
+        fp = os.fdopen(fd, 'w')
+        diffopts = patch.diffopts(ui, opts)
+        diffopts.git = True
+        diffopts.ignorews = False
+        diffopts.ignorewsamount = False
+        diffopts.ignoreblanklines = False
+        gen = patch.diff(repo, node1, node2, opts=diffopts)
+        for chunk in gen:
+            fp.write(chunk)
+        fp.close()
+        files = set()
+        patch.patch(ui, repo, patchfile, files=files, eolmode=None)
+    finally:
+        os.unlink(patchfile)
+    return files
+
 def between(repo, old, new, keep):
     revs = [old]
     current = old
@@ -200,27 +220,12 @@
         ui.debug('node %s unchanged\n' % ha)
         return oldctx, [], [], []
     hg.update(repo, ctx.node())
-    fd, patchfile = tempfile.mkstemp(prefix='hg-histedit-')
-    fp = os.fdopen(fd, 'w')
-    diffopts = patch.diffopts(ui, opts)
-    diffopts.git = True
-    diffopts.ignorews = False
-    diffopts.ignorewsamount = False
-    diffopts.ignoreblanklines = False
-    gen = patch.diff(repo, oldctx.parents()[0].node(), ha, opts=diffopts)
-    for chunk in gen:
-        fp.write(chunk)
-    fp.close()
     try:
-        files = set()
-        try:
-            patch.patch(ui, repo, patchfile, files=files, eolmode=None)
-            if not files:
-                ui.warn(_('%s: empty changeset')
-                             % node.hex(ha))
-                return ctx, [], [], []
-        finally:
-            os.unlink(patchfile)
+        files = foldchanges(ui, repo, oldctx.p1().node() , ha, opts)
+        if not files:
+            ui.warn(_('%s: empty changeset')
+                         % node.hex(ha))
+            return ctx, [], [], []
     except Exception:
         raise util.Abort(_('Fix up the change and run '
                            'hg histedit --continue'))
@@ -232,23 +237,8 @@
 def edit(ui, repo, ctx, ha, opts):
     oldctx = repo[ha]
     hg.update(repo, ctx.node())
-    fd, patchfile = tempfile.mkstemp(prefix='hg-histedit-')
-    fp = os.fdopen(fd, 'w')
-    diffopts = patch.diffopts(ui, opts)
-    diffopts.git = True
-    diffopts.ignorews = False
-    diffopts.ignorewsamount = False
-    diffopts.ignoreblanklines = False
-    gen = patch.diff(repo, oldctx.parents()[0].node(), ha, opts=diffopts)
-    for chunk in gen:
-        fp.write(chunk)
-    fp.close()
     try:
-        files = set()
-        try:
-            patch.patch(ui, repo, patchfile, files=files, eolmode=None)
-        finally:
-            os.unlink(patchfile)
+        foldchanges(ui, repo, oldctx.p1().node() , ha, opts)
     except Exception:
         pass
     raise util.Abort(_('Make changes as needed, you may commit or record as '
@@ -258,27 +248,12 @@
 def fold(ui, repo, ctx, ha, opts):
     oldctx = repo[ha]
     hg.update(repo, ctx.node())
-    fd, patchfile = tempfile.mkstemp(prefix='hg-histedit-')
-    fp = os.fdopen(fd, 'w')
-    diffopts = patch.diffopts(ui, opts)
-    diffopts.git = True
-    diffopts.ignorews = False
-    diffopts.ignorewsamount = False
-    diffopts.ignoreblanklines = False
-    gen = patch.diff(repo, oldctx.parents()[0].node(), ha, opts=diffopts)
-    for chunk in gen:
-        fp.write(chunk)
-    fp.close()
     try:
-        files = set()
-        try:
-            patch.patch(ui, repo, patchfile, files=files, eolmode=None)
-            if not files:
-                ui.warn(_('%s: empty changeset')
-                             % node.hex(ha))
-                return ctx, [], [], []
-        finally:
-            os.unlink(patchfile)
+        files = foldchanges(ui, repo, oldctx.p1().node() , ha, opts)
+        if not files:
+            ui.warn(_('%s: empty changeset')
+                         % node.hex(ha))
+            return ctx, [], [], []
     except Exception:
         raise util.Abort(_('Fix up the change and run '
                            'hg histedit --continue'))
@@ -289,22 +264,7 @@
 def finishfold(ui, repo, ctx, oldctx, newnode, opts, internalchanges):
     parent = ctx.parents()[0].node()
     hg.update(repo, parent)
-    fd, patchfile = tempfile.mkstemp(prefix='hg-histedit-')
-    fp = os.fdopen(fd, 'w')
-    diffopts = patch.diffopts(ui, opts)
-    diffopts.git = True
-    diffopts.ignorews = False
-    diffopts.ignorewsamount = False
-    diffopts.ignoreblanklines = False
-    gen = patch.diff(repo, parent, newnode, opts=diffopts)
-    for chunk in gen:
-        fp.write(chunk)
-    fp.close()
-    files = set()
-    try:
-        patch.patch(ui, repo, patchfile, files=files, eolmode=None)
-    finally:
-        os.unlink(patchfile)
+    foldchanges(ui, repo, parent, newnode, opts)
     newmessage = '\n***\n'.join(
         [ctx.description()] +
         [repo[r].description() for r in internalchanges] +
@@ -326,23 +286,8 @@
 def message(ui, repo, ctx, ha, opts):
     oldctx = repo[ha]
     hg.update(repo, ctx.node())
-    fd, patchfile = tempfile.mkstemp(prefix='hg-histedit-')
-    fp = os.fdopen(fd, 'w')
-    diffopts = patch.diffopts(ui, opts)
-    diffopts.git = True
-    diffopts.ignorews = False
-    diffopts.ignorewsamount = False
-    diffopts.ignoreblanklines = False
-    gen = patch.diff(repo, oldctx.parents()[0].node(), ha, opts=diffopts)
-    for chunk in gen:
-        fp.write(chunk)
-    fp.close()
     try:
-        files = set()
-        try:
-            patch.patch(ui, repo, patchfile, files=files, eolmode=None)
-        finally:
-            os.unlink(patchfile)
+        foldchanges(ui, repo, oldctx.p1().node() , ha, opts)
     except Exception:
         raise util.Abort(_('Fix up the change and run '
                            'hg histedit --continue'))
--- a/hgext/inotify/linux/watcher.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/inotify/linux/watcher.py	Tue Sep 11 08:36:09 2012 -0700
@@ -282,7 +282,7 @@
         callable that takes one parameter.  It will be called each time
         a directory is about to be automatically watched.  If it returns
         True, the directory will be watched if it still exists,
-        otherwise, it will beb skipped.'''
+        otherwise, it will be skipped.'''
 
         super(autowatcher, self).__init__()
         self.addfilter = addfilter
--- a/hgext/keyword.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/keyword.py	Tue Sep 11 08:36:09 2012 -0700
@@ -7,7 +7,7 @@
 #
 # $Id$
 #
-# Keyword expansion hack against the grain of a DSCM
+# Keyword expansion hack against the grain of a Distributed SCM
 #
 # There are many good reasons why this is not needed in a distributed
 # SCM, still it may be useful in very small projects based on single
@@ -168,7 +168,7 @@
     return subfunc(r'$\1$', text)
 
 def _preselect(wstatus, changed):
-    '''Retrieves modfied and added files from a working directory state
+    '''Retrieves modified and added files from a working directory state
     and returns the subset of each contained in given changed files
     retrieved from a change context.'''
     modified, added = wstatus[:2]
--- a/hgext/largefiles/lfcommands.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/largefiles/lfcommands.py	Tue Sep 11 08:36:09 2012 -0700
@@ -65,7 +65,7 @@
         dstlock = rdst.lock()
 
         # Get a list of all changesets in the source.  The easy way to do this
-        # is to simply walk the changelog, using changelog.nodesbewteen().
+        # is to simply walk the changelog, using changelog.nodesbetween().
         # Take a look at mercurial/revlog.py:639 for more details.
         # Use a generator instead of a list to decrease memory usage
         ctxs = (rsrc[ctx] for ctx in rsrc.changelog.nodesbetween(None,
@@ -177,7 +177,7 @@
         if f not in lfiles and f not in normalfiles:
             islfile = _islfile(f, ctx, matcher, size)
             # If this file was renamed or copied then copy
-            # the lfileness of its predecessor
+            # the largefile-ness of its predecessor
             if f in ctx.manifest():
                 fctx = ctx.filectx(f)
                 renamed = fctx.renamed()
@@ -444,11 +444,13 @@
             cachelfiles(ui, repo, '.', lfiles)
 
         updated, removed = 0, 0
-        for i in map(lambda f: _updatelfile(repo, lfdirstate, f), lfiles):
-            # increment the appropriate counter according to _updatelfile's
-            # return value
-            updated += i > 0 and i or 0
-            removed -= i < 0 and i or 0
+        for f in lfiles:
+            i = _updatelfile(repo, lfdirstate, f)
+            if i:
+                if i > 0:
+                    updated += i
+                else:
+                    removed -= i
             if printmessage and (removed or updated) and not printed:
                 ui.status(_('getting changed largefiles\n'))
                 printed = True
--- a/hgext/largefiles/lfutil.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/largefiles/lfutil.py	Tue Sep 11 08:36:09 2012 -0700
@@ -296,8 +296,8 @@
     '''Return the repo-relative path to the standin for the specified big
     file.'''
     # Notes:
-    # 1) Most callers want an absolute path, but _createstandin() needs
-    #    it repo-relative so lfadd() can pass it to repoadd().  So leave
+    # 1) Some callers want an absolute path, but for instance addlargefiles
+    #    needs it repo-relative so it can be passed to repoadd().  So leave
     #    it up to the caller to use repo.wjoin() to get an absolute path.
     # 2) Join with '/' because that's what dirstate always uses, even on
     #    Windows. Change existing separator to '/' first in case we are
--- a/hgext/largefiles/localstore.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/largefiles/localstore.py	Tue Sep 11 08:36:09 2012 -0700
@@ -33,8 +33,12 @@
         lfutil.link(lfutil.storepath(self.repo, hash),
                 lfutil.storepath(self.remote, hash))
 
-    def exists(self, hash):
-        return lfutil.instore(self.remote, hash)
+    def exists(self, hashes):
+        retval = {}
+        for hash in hashes:
+            retval[hash] = lfutil.instore(self.remote, hash)
+        return retval
+
 
     def _getfile(self, tmpfile, filename, hash):
         if lfutil.instore(self.remote, hash):
--- a/hgext/largefiles/overrides.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/largefiles/overrides.py	Tue Sep 11 08:36:09 2012 -0700
@@ -155,7 +155,7 @@
             ui.status(_('removing %s\n') % m.rel(f))
 
     # Need to lock because standin files are deleted then removed from the
-    # repository and we could race inbetween.
+    # repository and we could race in-between.
     wlock = repo.wlock()
     try:
         lfdirstate = lfutil.openlfdirstate(ui, repo)
@@ -251,7 +251,7 @@
 
 # Override needs to refresh standins so that update's normal merge
 # will go through properly. Then the other update hook (overriding repo.update)
-# will get the new files. Filemerge is also overriden so that the merge
+# will get the new files. Filemerge is also overridden so that the merge
 # will merge standins correctly.
 def overrideupdate(orig, ui, repo, *pats, **opts):
     lfdirstate = lfutil.openlfdirstate(ui, repo)
@@ -912,7 +912,7 @@
             ui.status(_('removing %s\n') % m.rel(f))
 
     # Need to lock because standin files are deleted then removed from the
-    # repository and we could race inbetween.
+    # repository and we could race in-between.
     wlock = repo.wlock()
     try:
         lfdirstate = lfutil.openlfdirstate(ui, repo)
--- a/hgext/largefiles/remotestore.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/largefiles/remotestore.py	Tue Sep 11 08:36:09 2012 -0700
@@ -4,7 +4,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
-'''remote largefile store; the base class for servestore'''
+'''remote largefile store; the base class for wirestore'''
 
 import urllib2
 
--- a/hgext/largefiles/reposetup.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/largefiles/reposetup.py	Tue Sep 11 08:36:09 2012 -0700
@@ -156,7 +156,7 @@
                 # Create a function that we can use to override what is
                 # normally the ignore matcher.  We've already checked
                 # for ignored files on the first dirstate walk, and
-                # unecessarily re-checking here causes a huge performance
+                # unnecessarily re-checking here causes a huge performance
                 # hit because lfdirstate only knows about largefiles
                 def _ignoreoverride(self):
                     return False
@@ -192,7 +192,7 @@
                         (unsure, modified, added, removed, missing, unknown,
                                 ignored, clean) = s
                         # Replace the list of ignored and unknown files with
-                        # the previously caclulated lists, and strip out the
+                        # the previously calculated lists, and strip out the
                         # largefiles
                         lfiles = set(lfdirstate._map)
                         ignored = set(result[5]).difference(lfiles)
--- a/hgext/mq.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/mq.py	Tue Sep 11 08:36:09 2012 -0700
@@ -1522,7 +1522,7 @@
             #
             # this should really read:
             #   mm, dd, aa = repo.status(top, patchparent)[:3]
-            # but we do it backwards to take advantage of manifest/chlog
+            # but we do it backwards to take advantage of manifest/changelog
             # caching against the next repo.status call
             mm, aa, dd = repo.status(patchparent, top)[:3]
             changes = repo.changelog.read(top)
@@ -1535,7 +1535,7 @@
                 # if amending a patch, we start with existing
                 # files plus specified files - unfiltered
                 match = scmutil.matchfiles(repo, mm + aa + dd + matchfn.files())
-                # filter with inc/exl options
+                # filter with include/exclude options
                 matchfn = scmutil.match(repo[None], opts=opts)
             else:
                 match = scmutil.matchall(repo)
@@ -3187,7 +3187,7 @@
         ui.warn(_('warning: uncommitted changes in the working directory\n'))
     # queue.finish may changes phases but leave the responsibility to lock the
     # repo to the caller to avoid deadlock with wlock. This command code is
-    # responsability for this locking.
+    # responsibility for this locking.
     lock = repo.lock()
     try:
         q.finish(repo, revs)
--- a/hgext/record.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/record.py	Tue Sep 11 08:36:09 2012 -0700
@@ -33,7 +33,7 @@
     - ('file',    [header_lines + fromfile + tofile])
     - ('context', [context_lines])
     - ('hunk',    [hunk_lines])
-    - ('range',   (-start,len, +start,len, diffp))
+    - ('range',   (-start,len, +start,len, proc))
     """
     lr = patch.linereader(fp)
 
@@ -496,6 +496,9 @@
         raise util.Abort(_('running non-interactively, use %s instead') %
                          cmdsuggest)
 
+    # make sure username is set before going interactive
+    ui.username()
+
     def recordfunc(ui, repo, message, match, opts):
         """This is generic record driver.
 
--- a/hgext/schemes.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/schemes.py	Tue Sep 11 08:36:09 2012 -0700
@@ -61,7 +61,7 @@
         return '<ShortRepository: %s>' % self.scheme
 
     def instance(self, ui, url, create):
-        # Should this use urlmod.url(), or is manual parsing better?
+        # Should this use the util.url class, or is manual parsing better?
         url = url.split('://', 1)[1]
         parts = url.split('/', self.parts)
         if len(parts) > self.parts:
--- a/hgext/win32mbcs.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/win32mbcs.py	Tue Sep 11 08:36:09 2012 -0700
@@ -119,7 +119,7 @@
     def f(*args, **kwds):
         return wrapper(func, args, kwds)
     try:
-        f.__name__ = func.__name__                # fail with python23
+        f.__name__ = func.__name__ # fails with Python 2.3
     except Exception:
         pass
     setattr(module, name, f)
--- a/hgext/zeroconf/Zeroconf.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/hgext/zeroconf/Zeroconf.py	Tue Sep 11 08:36:09 2012 -0700
@@ -66,7 +66,7 @@
 				 using select() for socket reads
 				 tested on Debian unstable with Python 2.2.2"""
 
-"""0.05 update - ensure case insensitivty on domain names
+"""0.05 update - ensure case insensitivity on domain names
                  support for unicast DNS queries"""
 
 """0.04 update - added some unit tests
@@ -335,7 +335,7 @@
 		raise AbstractMethodException
 
 	def toString(self, other):
-		"""String representation with addtional information"""
+		"""String representation with additional information"""
 		arg = "%s/%s,%s" % (self.ttl, self.getRemainingTTL(currentTimeMillis()), other)
 		return DNSEntry.toString(self, "record", arg)
 
@@ -904,7 +904,7 @@
 	to cache information as it arrives.
 
 	It requires registration with an Engine object in order to have
-	the read() method called when a socket is availble for reading."""
+	the read() method called when a socket is available for reading."""
 
 	def __init__(self, zeroconf):
 		self.zeroconf = zeroconf
@@ -1140,7 +1140,7 @@
 		return self.port
 
 	def getPriority(self):
-		"""Pirority accessor"""
+		"""Priority accessor"""
 		return self.priority
 
 	def getWeight(self):
@@ -1259,7 +1259,7 @@
 			# SO_REUSEADDR should be equivalent to SO_REUSEPORT for
 			# multicast UDP sockets (p 731, "TCP/IP Illustrated,
 			# Volume 2"), but some BSD-derived systems require
-			# SO_REUSEPORT to be specified explicity.  Also, not all
+			# SO_REUSEPORT to be specified explicitly.  Also, not all
 			# versions of Python have SO_REUSEPORT available.  So
 			# if you're on a BSD-based system, and haven't upgraded
 			# to Python 2.3 yet, you may find this library doesn't
@@ -1272,10 +1272,8 @@
 			self.socket.bind(self.group)
 		except Exception:
 			# Some versions of linux raise an exception even though
-			# the SO_REUSE* options have been set, so ignore it
-			#
+			# SO_REUSEADDR and SO_REUSEPORT have been set, so ignore it
 			pass
-		#self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(self.intf) + socket.inet_aton('0.0.0.0'))
 		self.socket.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0'))
 
 		self.listeners = []
--- a/i18n/de.po	Fri Aug 17 13:58:19 2012 -0700
+++ b/i18n/de.po	Tue Sep 11 08:36:09 2012 -0700
@@ -15,13 +15,13 @@
 # Die Übersetzungshilfen wurden in das Wiki verlegt
 # und sind auf jeden Fall einen Blick wert!
 # http://mercurial.selenic.com/wiki/GermanTranslation
-# 
+#
 msgid ""
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2012-06-15 19:14+0200\n"
-"PO-Revision-Date: 2012-06-19 16:07+0100\n"
+"POT-Creation-Date: 2012-09-01 14:20+0200\n"
+"PO-Revision-Date: 2012-09-01 14:29+0100\n"
 "Last-Translator: Martin Schröder <martinschroeder@vcp-sh.de>\n"
 "Language-Team: \n"
 "Language: de\n"
@@ -43,13 +43,8 @@
 msgid "Extensions"
 msgstr "Erweiterungen"
 
-msgid ""
-"This section contains help for extensions that are distributed together with "
-"Mercurial. Help for other extensions is available in the help system."
-msgstr ""
-"Dieser Abschnitt enthält Hilfe für Erweiterungen, die zusammen mit Mercurial "
-"ausgeliefert werden. Hilfe für andere Erweiterungen sind über das Hilfe-"
-"System erreichbar."
+msgid "This section contains help for extensions that are distributed together with Mercurial. Help for other extensions is available in the help system."
+msgstr "Dieser Abschnitt enthält Hilfe für Erweiterungen, die zusammen mit Mercurial ausgeliefert werden. Hilfe für andere Erweiterungen sind über das Hilfe-System erreichbar."
 
 msgid "Options:"
 msgstr "Optionen:"
@@ -108,15 +103,15 @@
 "4) Erlaubnisliste für Pfade   (Abschnitt ``acl.allow``)"
 
 msgid "The allow and deny sections take key-value pairs."
-msgstr ""
-"Die Erlaubnis- und Verbotslisten werden in Schlüssel-Wert-Paaren angegeben."
-
+msgstr "Die Erlaubnis- und Verbotslisten werden in Schlüssel-Wert-Paaren angegeben."
+
+#, fuzzy
 msgid ""
 "Branch-based Access Control\n"
-"..........................."
-msgstr ""
-"Zweig-basierte Zugriffskontrolle\n"
-"................................"
+"---------------------------"
+msgstr ""
+"Synchronisieren eines Unterarchivs\n"
+"----------------------------------"
 
 msgid ""
 "Use the ``acl.deny.branches`` and ``acl.allow.branches`` sections to\n"
@@ -145,11 +140,17 @@
 "- ein Stern-Symbol, das jeden einschließt;"
 
 msgid ""
+"You can add the \"!\" prefix to a user or group name to invert the sense\n"
+"of the match."
+msgstr ""
+
+#, fuzzy
+msgid ""
 "Path-based Access Control\n"
-"........................."
-msgstr ""
-"Pfad-basierte Zugriffskontrolle\n"
-"..............................."
+"-------------------------"
+msgstr ""
+"Wie werden Phasen verwaltet?\n"
+"--------------------------"
 
 msgid ""
 "Use the ``acl.deny`` and ``acl.allow`` sections to have path-based\n"
@@ -163,12 +164,13 @@
 "entsprechenden Werte folgen derselben Syntax wie in den anderen o.g.\n"
 "Bereichen."
 
+#, fuzzy
 msgid ""
 "Groups\n"
-"......"
-msgstr ""
-"Gruppen\n"
-"......."
+"------"
+msgstr ""
+"Zusammenfassung\n"
+"-------"
 
 msgid ""
 "Group names must be prefixed with an ``@`` symbol. Specifying a group\n"
@@ -188,12 +190,13 @@
 "läuft, wird die Liste der Benutzer vom Betriebssystem abgerufen.\n"
 "Andernfalls wird ein Ausnahmefehler ausgelöst."
 
+#, fuzzy
 msgid ""
 "Example Configuration\n"
-"....................."
-msgstr ""
-"Beispielkonfiguration\n"
-"....................."
+"---------------------"
+msgstr ""
+"Löschen eines Unterarchivs\n"
+"--------------------------"
 
 msgid "::"
 msgstr "::"
@@ -232,8 +235,7 @@
 "  # Erlaubt oder verbietet den Zugriff für eingehende Änderungen nur\n"
 "  # wenn ihre Quelle hier aufgelistet ist, ansonsten wird immer Zugriff\n"
 "  # gewährt. Die Quelle ist \"serve\" für jeden entfernten Zugriff (http\n"
-"  # oder ssh), \"push\", \"pull\" oder \"bundle\" wenn die zugehörigen "
-"Befehle\n"
+"  # oder ssh), \"push\", \"pull\" oder \"bundle\" wenn die zugehörigen Befehle\n"
 "  # lokal ausgeführt werden.\n"
 "  # Voreinstellung: serve\n"
 "  sources = serve"
@@ -369,27 +371,82 @@
 msgid "  .hgtags = release_engineer"
 msgstr "  .hgtags = release_engineer"
 
+#, fuzzy
+msgid ""
+"Examples using the \"!\" prefix\n"
+"............................."
+msgstr ""
+"Beispielkonfiguration\n"
+"....................."
+
+msgid ""
+"Suppose there's a branch that only a given user (or group) should be able to\n"
+"push to, and you don't want to restrict access to any other branch that may\n"
+"be created."
+msgstr ""
+
+msgid ""
+"The \"!\" prefix allows you to prevent anyone except a given user or group to\n"
+"push changesets in a given branch or path."
+msgstr ""
+
+msgid ""
+"In the examples below, we will:\n"
+"1) Deny access to branch \"ring\" to anyone but user \"gollum\"\n"
+"2) Deny access to branch \"lake\" to anyone but members of the group \"hobbit\"\n"
+"3) Deny access to a file to anyone but user \"gollum\""
+msgstr ""
+
+#, fuzzy
+msgid ""
+"  [acl.allow.branches]\n"
+"  # Empty"
+msgstr "  [acl.allow.branches]"
+
+msgid ""
+"  # 1) only 'gollum' can commit to branch 'ring';\n"
+"  # 'gollum' and anyone else can still commit to any other branch.\n"
+"  ring = !gollum"
+msgstr ""
+
+msgid ""
+"  # 2) only members of the group 'hobbit' can commit to branch 'lake';\n"
+"  # 'hobbit' members and anyone else can still commit to any other branch.\n"
+"  lake = !@hobbit"
+msgstr ""
+
+msgid "  # You can also deny access based on file paths:"
+msgstr ""
+
+msgid ""
+"  [acl.allow]\n"
+"  # Empty"
+msgstr ""
+
+msgid ""
+"  [acl.deny]\n"
+"  # 3) only 'gollum' can change the file below;\n"
+"  # 'gollum' and anyone else can still change any other file.\n"
+"  /misty/mountains/cave/ring = !gollum"
+msgstr ""
+
 #, python-format
 msgid "group '%s' is undefined"
 msgstr "Gruppe '%s' ist undefiniert"
 
 #, python-format
-msgid ""
-"config error - hook type \"%s\" cannot stop incoming changesets nor commits"
-msgstr ""
-"Konfigurationsfehler - Hook-Typ \"%s\" kann weder eingehende "
-"Änderungssätze \n"
+msgid "config error - hook type \"%s\" cannot stop incoming changesets nor commits"
+msgstr ""
+"Konfigurationsfehler - Hook-Typ \"%s\" kann weder eingehende Änderungssätze \n"
 "noch lokales Übernehmen stoppen"
 
 #, python-format
 msgid "acl: user \"%s\" denied on branch \"%s\" (changeset \"%s\")"
-msgstr ""
-"acl: Zugriff für \"%s\" auf Zweig \"%s\" abgelehnt (Änderungssatz \"%s\")"
+msgstr "acl: Zugriff für \"%s\" auf Zweig \"%s\" abgelehnt (Änderungssatz \"%s\")"
 
 #, python-format
 msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")"
-msgstr ""
-"acl: Zugriff für \"%s\" auf Zweig \"%s\" nicht erlaubt (Änderungssatz \"%s\")"
+msgstr "acl: Zugriff für \"%s\" auf Zweig \"%s\" nicht erlaubt (Änderungssatz \"%s\")"
 
 #, python-format
 msgid "acl: user \"%s\" denied on \"%s\" (changeset \"%s\")"
@@ -397,8 +454,7 @@
 
 #, python-format
 msgid "acl: user \"%s\" not allowed on \"%s\" (changeset \"%s\")"
-msgstr ""
-"acl: Zugriff für \"%s\" auf \"%s\" nicht erlaubt (Änderungssatz \"%s\")"
+msgstr "acl: Zugriff für \"%s\" auf \"%s\" nicht erlaubt (Änderungssatz \"%s\")"
 
 msgid "hooks for integrating with the Bugzilla bug tracker"
 msgstr "Hooks zur Integration mit dem Bugzilla Bugtracker"
@@ -424,10 +480,8 @@
 msgid "Three basic modes of access to Bugzilla are provided:"
 msgstr "Drei Zugriffsmethoden auf Bugzilla werden unterstützt:"
 
-msgid ""
-"1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later."
-msgstr ""
-"1. Zugriff über die XMLRPC-Schnittstelle. Benötigt Bugzilla 3.4 oder später."
+msgid "1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later."
+msgstr "1. Zugriff über die XMLRPC-Schnittstelle. Benötigt Bugzilla 3.4 oder später."
 
 msgid ""
 "2. Check data via the Bugzilla XMLRPC interface and submit bug change\n"
@@ -457,14 +511,12 @@
 msgstr ""
 "Direktes Schreiben in die Datenbank führt leicht zu Problemen bei Schema-\n"
 "veränderungen und benötigt ein externes Bugzilla Script, um\n"
-"Benachrichtigungsemails zu versenden. Dieses Script wird mit den Rechten "
-"des\n"
+"Benachrichtigungsemails zu versenden. Dieses Script wird mit den Rechten des\n"
 "Mercurial-Benutzers ausgeführt, benötigt eine lokale Bugzilla-Installation\n"
 "sowie Leserechte an der Bugzilla-Konfigurationsdatei und MySQL-Benutzername\n"
 "und -Passwort, um vollen Zugriff auf die Bugzilla Datenbank zu haben. Aus\n"
 "diesen Gründen wird diese Zugriffsmethode als veraltet angesehen und nicht\n"
-"mehr für zukünftigen Bugzillaversionen angepasst. In diesem Zugriffsmodus "
-"ist\n"
+"mehr für zukünftigen Bugzillaversionen angepasst. In diesem Zugriffsmodus ist\n"
 "nur das Hinzufügen von Kommentaren erlaubt."
 
 msgid ""
@@ -472,13 +524,11 @@
 "in the configuration. Comments are added under that username. Since the\n"
 "configuration must be readable by all Mercurial users, it is recommended\n"
 "that the rights of that user are restricted in Bugzilla to the minimum\n"
-"necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and "
-"later."
+"necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and later."
 msgstr ""
 "Zugriff über XMLRPC benötigt einen Bugzilla-Benutzernamen und -Passwort in\n"
 "der Konfigurationsdatei. Kommentare werden unter diesem Benutzer eingefügt.\n"
-"Da es notwendig ist, dass alle Mercurial-Benutzer Lesezugriff auf diese "
-"Datei\n"
+"Da es notwendig ist, dass alle Mercurial-Benutzer Lesezugriff auf diese Datei\n"
 "haben, ist es empfohlen dieses Benutzerkonto in Bugzilla mit den minimal\n"
 "nötigen Rechten um Kommentare einzufügen auszustatten.\n"
 "Bugs als gelöst zu markieren benötigt Bugzilla 4.0 oder neuer."
@@ -495,11 +545,9 @@
 msgstr ""
 "Zugriff über XMLRPC/Email verwendet XMLRPC für Anfragen an Bugzilla, aber\n"
 "sendet Emails an die Email-Schnittstelle um Kommentare einzufügen. Die\n"
-"Adresse im 'Absender:'-Feld wird auf die Emailadresse des Mercurial-"
-"Benutzers\n"
+"Adresse im 'Absender:'-Feld wird auf die Emailadresse des Mercurial-Benutzers\n"
 "gesetzt, sodass der Kommentar als vom Mercurial-Benutzer kommend erkannt\n"
-"wird. Falls Bugzilla die Email-Adresse des Mercurial-Benutzers nicht als "
-"Bugzilla-\n"
+"wird. Falls Bugzilla die Email-Adresse des Mercurial-Benutzers nicht als Bugzilla-\n"
 "Benutzer erkennt, wird alternativ die Email mit dem Bugzilla-Benutzernamen \n"
 "verknüpft, der zum Anmelden in Bugzilla verwendet wird, und als Quelle des\n"
 "Kommentars verwendet. Bugs als gelöst zu markieren funktioniert in allen\n"
@@ -533,8 +581,7 @@
 #, fuzzy
 msgid ""
 "bugzilla.regexp\n"
-"  Regular expression to match bug IDs for update in changeset commit "
-"message.\n"
+"  Regular expression to match bug IDs for update in changeset commit message.\n"
 "  It must contain one \"()\" named group ``<ids>`` containing the bug\n"
 "  IDs separated by non-digit characters. It may also contain\n"
 "  a named group ``<hours>`` with a floating-point number giving the\n"
@@ -563,14 +610,12 @@
 msgid ""
 "bugzilla.fixregexp\n"
 "  Regular expression to match bug IDs for marking fixed in changeset\n"
-"  commit message. This must contain a \"()\" named group ``<ids>` "
-"containing\n"
+"  commit message. This must contain a \"()\" named group ``<ids>` containing\n"
 "  the bug IDs separated by non-digit characters. It may also contain\n"
 "  a named group ``<hours>`` with a floating-point number giving the\n"
 "  hours worked on the bug. If no named groups are present, the first\n"
 "  \"()\" group is assumed to contain the bug IDs, and work time is not\n"
-"  updated. The default expression matches ``Fixes 1234``, ``Fixes bug "
-"1234``,\n"
+"  updated. The default expression matches ``Fixes 1234``, ``Fixes bug 1234``,\n"
 "  ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` and\n"
 "  variations thereof, followed by an hours number prefixed by ``h`` or\n"
 "  ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
@@ -591,8 +636,7 @@
 "  The resolution to set a bug to when marking fixed. Default ``FIXED``."
 msgstr ""
 "bugzilla.fixresolution\n"
-"  Die Lösung, die für einen Bug eingestellt wird, der als \"fixed\" "
-"markiert\n"
+"  Die Lösung, die für einen Bug eingestellt wird, der als \"fixed\" markiert\n"
 "  wurde. Voreinstellung ``FIXED``."
 
 msgid ""
@@ -625,10 +669,14 @@
 
 msgid ""
 "  Default ``changeset {node|short} in repo {root} refers to bug\n"
-"  {bug}.\\ndetails:\\n\\t{desc|tabindent}``"
+"  {bug}.\\n"
+"details:\\n"
+"\\t{desc|tabindent}``"
 msgstr ""
 "  Voreinstellung: ``Änderung {node|short} in Archiv {root}\n"
-"  erwähnt Bug {bug}.\\nDetails:\\n\\t{desc|tabindent}``"
+"  erwähnt Bug {bug}.\\n"
+"Details:\\n"
+"\\t{desc|tabindent}``"
 
 msgid ""
 "bugzilla.strip\n"
@@ -640,8 +688,7 @@
 msgstr ""
 "bugzilla.strip\n"
 "  Die Anzahl von Verzeichnisebenen, die vom Anfang des Archivpfads\n"
-"  (``{root}`` in Vorlagen) abgeschnitten wird, um ``{webroot}`` zu "
-"erhalten.\n"
+"  (``{root}`` in Vorlagen) abgeschnitten wird, um ``{webroot}`` zu erhalten.\n"
 "  Zum Beispiel mit ``{root}`` als ``/var/local/mein-projekt`` und einem\n"
 "  Wert 2, wird ``{webroot}`` auf ``mein-projekt`` gesetzt. Voreinstellung 0."
 
@@ -700,8 +747,7 @@
 "  ``bugs``."
 msgstr ""
 "bugzilla.user\n"
-"  Der Benutzername für den Bugzilla-Zugriff via XMLRPC. Voreinstellung "
-"``bugs``."
+"  Der Benutzername für den Bugzilla-Zugriff via XMLRPC. Voreinstellung ``bugs``."
 
 msgid ""
 "bugzilla.password\n"
@@ -845,8 +891,10 @@
 "    password=plugh\n"
 "    version=xmlrpc\n"
 "    template=Changeset {node|short} in {root|basename}.\n"
-"             {hgweb}/{webroot}/rev/{node|short}\\n\n"
-"             {desc}\\n\n"
+"             {hgweb}/{webroot}/rev/{node|short}\\n"
+"\n"
+"             {desc}\\n"
+"\n"
 "    strip=5"
 msgstr ""
 "    [bugzilla]\n"
@@ -855,8 +903,10 @@
 "    password=plugh\n"
 "    version=xmlrpc\n"
 "    template=Änderung {node|short} in Archiv {root|basename}.\n"
-"             {hgweb}/{webroot}/rev/{node|short}\\n\n"
-"             {desc}\\n\n"
+"             {hgweb}/{webroot}/rev/{node|short}\\n"
+"\n"
+"             {desc}\\n"
+"\n"
 "    strip=5"
 
 msgid ""
@@ -890,8 +940,10 @@
 "    version=xmlrpc\n"
 "    bzemail=bugzilla@my-project.org\n"
 "    template=Changeset {node|short} in {root|basename}.\n"
-"             {hgweb}/{webroot}/rev/{node|short}\\n\n"
-"             {desc}\\n\n"
+"             {hgweb}/{webroot}/rev/{node|short}\\n"
+"\n"
+"             {desc}\\n"
+"\n"
 "    strip=5"
 msgstr ""
 "    [bugzilla]\n"
@@ -901,8 +953,10 @@
 "    version=xmlrpc\n"
 "    bzemail=bugzilla@mein-projekt.org\n"
 "    template=Änderung {node|short} in Archiv {root|basename}.\n"
-"             {hgweb}/{webroot}/rev/{node|short}\\n\n"
-"             {desc}\\n\n"
+"             {hgweb}/{webroot}/rev/{node|short}\\n"
+"\n"
+"             {desc}\\n"
+"\n"
 "    strip=5"
 
 msgid ""
@@ -920,8 +974,7 @@
 "with a collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
 "with a web interface at ``http://my-project.org/hg``. ::"
 msgstr ""
-"MySQL Beispielkonfiguration. Bugzilla 3.2 ist lokal in ``/opt/"
-"bugzilla-3.2``\n"
+"MySQL Beispielkonfiguration. Bugzilla 3.2 ist lokal in ``/opt/bugzilla-3.2``\n"
 "installiert. Die MySQL Datenbank wird per ``localhost`` angesprochen,\n"
 "der Name der Bugzilla Datenbank ist ``bugs`` und der MySQL Zugriff ist für\n"
 "enutzer ``bugs`` mit Password ``XYZZY`` erlaubt. Die Archive, deren\n"
@@ -936,8 +989,10 @@
 "    bzuser=unknown@domain.com\n"
 "    bzdir=/opt/bugzilla-3.2\n"
 "    template=Changeset {node|short} in {root|basename}.\n"
-"             {hgweb}/{webroot}/rev/{node|short}\\n\n"
-"             {desc}\\n\n"
+"             {hgweb}/{webroot}/rev/{node|short}\\n"
+"\n"
+"             {desc}\\n"
+"\n"
 "    strip=5"
 msgstr ""
 "    [bugzilla]\n"
@@ -947,8 +1002,10 @@
 "    bzuser=unbekannt@domain.com\n"
 "    bzdir=/opt/bugzilla-3.2\n"
 "    template=Änderung {node|short} in Archiv {root|basename}.\n"
-"             {hgweb}/{webroot}/rev/{node|short}\\n\n"
-"             {desc}\\n\n"
+"             {hgweb}/{webroot}/rev/{node|short}\\n"
+"\n"
+"             {desc}\\n"
+"\n"
 "    strip=5"
 
 msgid "All the above add a comment to the Bugzilla bug record of the form::"
@@ -1067,13 +1124,10 @@
 msgid ""
 "This extension is deprecated. You should use :hg:`log -r\n"
 "\"children(REV)\"` instead.\n"
-msgstr ""
-"Diese Erweiterung ist veraltet. Benutzen Sie stattdessen:hg:`log -r "
-"\"children(REV)\"`.\n"
+msgstr "Diese Erweiterung ist veraltet. Benutzen Sie stattdessen:hg:`log -r \"children(REV)\"`.\n"
 
 msgid "show the children of the given or working directory revision"
-msgstr ""
-"Zeigt die Kinder der übergebenen Revision oder des Arbeitsverzeichnisses an"
+msgstr "Zeigt die Kinder der übergebenen Revision oder des Arbeitsverzeichnisses an"
 
 msgid ""
 "    Print the children of the working directory's revisions. If a\n"
@@ -1103,8 +1157,8 @@
 msgid "command to display statistics about repository history"
 msgstr "Zeigt Statistiken über die Projekthistorie"
 
-#, python-format
-msgid "Revision %d is a merge, ignoring...\n"
+#, fuzzy, python-format
+msgid "revision %d is a merge, ignoring...\n"
 msgstr "Revision %d ist eine Zusammenführung. Ignoriere...\n"
 
 msgid "analyzing"
@@ -1258,8 +1312,7 @@
 "Effekte durch die ECMA-48 SGR Funktionen (ANSI Escape Codes) realisiert."
 
 msgid "Default effects may be overridden from your configuration file::"
-msgstr ""
-"Standardeffekte können durch die Konfigurationsdatei verändert werden::"
+msgstr "Standardeffekte können durch die Konfigurationsdatei verändert werden::"
 
 msgid ""
 "  [color]\n"
@@ -1357,8 +1410,7 @@
 "(fettgeschrieben), 'dim' (gedämmt), 'inverse' (Vorder- und Hintergrund\n"
 "getauscht), 'italic' (Schrägschrift), 'standout' (hervorstehend) und\n"
 "'underline' (unterstrichen); im ECMA-48 Modus nur 'bold', 'inverse',\n"
-"'italic' und 'underline'. Wie dies tatsächlich aussieht, hängt vom "
-"Terminal-\n"
+"'italic' und 'underline'. Wie dies tatsächlich aussieht, hängt vom Terminal-\n"
 "emulator ab. Effekte, die nicht realisiert werden können, werden ohne\n"
 "Warnung ignoriert."
 
@@ -1451,9 +1503,7 @@
 msgstr "TYP"
 
 msgid "import revisions from foreign VCS repositories into Mercurial"
-msgstr ""
-"Importiert Änderungssätze von anderen Versionsverwaltungssystemen nach "
-"Mercurial"
+msgstr "Importiert Änderungssätze von anderen Versionsverwaltungssystemen nach Mercurial"
 
 msgid "convert a foreign SCM repository to a Mercurial one."
 msgstr "Konvertiert Archive anderer VCS in ein Mercurial-Archiv."
@@ -1663,13 +1713,10 @@
 "    the \"release-1.0\" branch as the second."
 msgstr ""
 "    Die Spleißdatei erlaubt die künstliche Einführung von Vorfahrver-\n"
-"    bindungen. Die ist nützlich, wenn einer Zusammenführung unter "
-"Subversion\n"
-"    der andere Vorfahr angegeben werden soll oder zwei ansonsten "
-"unabhängige\n"
+"    bindungen. Die ist nützlich, wenn einer Zusammenführung unter Subversion\n"
+"    der andere Vorfahr angegeben werden soll oder zwei ansonsten unabhängige\n"
 "    Entwicklungslinien verbunden werden sollen. Jeder Eintrag enthält eine\n"
-"    Revisions-ID des Quellarchivs, eine Leerstelle und eine oder (mit "
-"Komma)\n"
+"    Revisions-ID des Quellarchivs, eine Leerstelle und eine oder (mit Komma)\n"
 "    zwei Revisions-IDs, die als Vorfahren der ersten angenommen werden\n"
 "    sollen. Wurde z.B. \"trunk\" mit \"release-1.0\" zusammengeführt, so\n"
 "    sollte die Revision aus \"trunk\" als erster und die aus dem Zweig\n"
@@ -1705,9 +1752,10 @@
 "    Quellcode in einem Archiv aus dem \"default\"-Zweig in einen benannten\n"
 "    Zweig zu verschieben."
 
+#, fuzzy
 msgid ""
 "    Mercurial Source\n"
-"    ''''''''''''''''"
+"    ################"
 msgstr ""
 "    Mercurial als Quelle\n"
 "    ''''''''''''''''''''"
@@ -1745,9 +1793,10 @@
 "    :convert.hg.startrev: Konvertiere Start Revision und ihre Decendants.\n"
 "        Erwartet eine hg-Revisions-ID, standardmäßig 0."
 
+#, fuzzy
 msgid ""
 "    CVS Source\n"
-"    ''''''''''"
+"    ##########"
 msgstr ""
 "    CVS als Quelle\n"
 "    ''''''''''''''"
@@ -1837,9 +1886,10 @@
 "        Log Einträgen, und kann diese Einträge in-place ändern, löschen,\n"
 "        oder neue hinzufügen."
 
+#, fuzzy
 msgid ""
 "    :hook.cvschangesets: Specify a Python function to be called after\n"
-"        the changesets are calculated from the the CVS log. The\n"
+"        the changesets are calculated from the CVS log. The\n"
 "        function is passed a list with the changeset entries, and can\n"
 "        modify the changesets in-place, or add or delete them."
 msgstr ""
@@ -1859,9 +1909,10 @@
 "    cvsps 2.1 ähnlich. Für weitere Details siehe die Hilfe zu diesem\n"
 "    Befehl."
 
+#, fuzzy
 msgid ""
 "    Subversion Source\n"
-"    '''''''''''''''''"
+"    #################"
 msgstr ""
 "    Subversion als Quelle\n"
 "    '''''''''''''''''''''"
@@ -1931,9 +1982,10 @@
 "    --config convert.svn.startrev=0              (SVN-Revisionsnummer)\n"
 "        Spezifiziert die Startrevision"
 
+#, fuzzy
 msgid ""
 "    Perforce Source\n"
-"    '''''''''''''''"
+"    ###############"
 msgstr ""
 "    Perforce als Quelle\n"
 "    '''''''''''''''''''"
@@ -1969,10 +2021,8 @@
 
 msgid ""
 "    Mercurial Destination\n"
-"    '''''''''''''''''''''"
-msgstr ""
-"    Mercurial als Ziel\n"
-"    ''''''''''''''''''"
+"    #####################"
+msgstr ""
 
 msgid "    The following options are supported:"
 msgstr "    Die folgenden Optionen werden unterstützt:"
@@ -2023,8 +2073,7 @@
 "    basierend auf übereinstimmenden Log-Einträgen und Datumsangaben."
 
 msgid "username mapping filename (DEPRECATED, use --authormap instead)"
-msgstr ""
-"Datei mit Autor-Zuweisungen (VERALTET, verwende stattdessen --authormap)"
+msgstr "Datei mit Autor-Zuweisungen (VERALTET, verwende stattdessen --authormap)"
 
 msgid "source repository type"
 msgstr "Quellarchivtyp"
@@ -2108,9 +2157,7 @@
 msgid "Bazaar modules could not be loaded"
 msgstr "Bazaar-Modul konnte nicht geladen werden"
 
-msgid ""
-"warning: lightweight checkouts may cause conversion failures, try with a "
-"regular branch instead.\n"
+msgid "warning: lightweight checkouts may cause conversion failures, try with a regular branch instead.\n"
 msgstr ""
 "Warnung: Leichte Arbeitskopien können zu Konvertierungsfehlern führen; \n"
 "erwäge einen regulären Zweig zu nutzen.\n"
@@ -2199,12 +2246,12 @@
 msgid "not all revisions were sorted"
 msgstr "Nicht alle Revisionen wurden sortiert"
 
-#, python-format
-msgid "Writing author map file %s\n"
+#, fuzzy, python-format
+msgid "writing author map file %s\n"
 msgstr "Schreibe Autoren-Abbildungsdatei %s\n"
 
-#, python-format
-msgid "Ignoring bad line in author map file %s: %s\n"
+#, fuzzy, python-format
+msgid "ignoring bad line in author map file %s: %s\n"
 msgstr "Ignoriere fehlerhafte Zeile in Autoren-Abbildungsdatei %s: %s\n"
 
 #, python-format
@@ -2261,10 +2308,8 @@
 msgstr "CVS pserver-Authentifizierung fehlgeschlagen"
 
 #, python-format
-msgid ""
-"unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
-msgstr ""
-"Unerwartete Antwort vom CVS-Server (erwartete \"Valid-requsts\", erhielt %r)"
+msgid "unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
+msgstr "Unerwartete Antwort vom CVS-Server (erwartete \"Valid-requsts\", erhielt %r)"
 
 #, python-format
 msgid "%d bytes missing from remote file"
@@ -2420,10 +2465,8 @@
 msgstr "Analysiere Baumversion %s...\n"
 
 #, python-format
-msgid ""
-"tree analysis stopped because it points to an unregistered archive %s...\n"
-msgstr ""
-"Baumanalyse gestoppt, da er ein unregistriertes Archiv %s referenziert...\n"
+msgid "tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr "Baumanalyse gestoppt, da er ein unregistriertes Archiv %s referenziert...\n"
 
 #, python-format
 msgid "could not parse cat-log of %s"
@@ -2455,12 +2498,8 @@
 msgstr "Aktualisiere Lesezeichen\n"
 
 #, fuzzy, python-format
-msgid ""
-"revision %s not found in destination repository (lookups with "
-"clonebranches=true are not implemented)"
-msgstr ""
-"Revision %s wurde im Ziel-Archiv nicht gefunden (Lookups mit "
-"clonebranches=true sind nicht implementiert)"
+msgid "revision %s not found in destination repository (lookups with clonebranches=true are not implemented)"
+msgstr "Revision %s wurde im Ziel-Archiv nicht gefunden (Lookups mit clonebranches=true sind nicht implementiert)"
 
 #, python-format
 msgid "%s is not a valid start revision"
@@ -2493,8 +2532,7 @@
 
 #, python-format
 msgid "bad mtn packet - unable to read full packet read %s of %s"
-msgstr ""
-"Fehlerhaftes mtn-Paket - Konnte Paket %s von %s nicht vollständig auslesen"
+msgstr "Fehlerhaftes mtn-Paket - Konnte Paket %s von %s nicht vollständig auslesen"
 
 #, python-format
 msgid "mtn command '%s' returned %s"
@@ -2524,6 +2562,10 @@
 msgid "collecting p4 changelists\n"
 msgstr "Sammle p4-Änderungslisten\n"
 
+#, fuzzy
+msgid "debugsvnlog could not load Subversion python bindings"
+msgstr "Subversion Python-API konnte nicht geladen werden"
+
 msgid "Mercurial failed to run itself, check hg executable is in PATH"
 msgstr ""
 "Mercurial konnte sich selbst nicht ausführen, prüfe, ob die Programmdatei\n"
@@ -2533,19 +2575,17 @@
 msgid "log stream exception '%s'"
 msgstr "Log-Stream-Ausnahme'%s'"
 
-msgid ""
-"svn: cannot probe remote repository, assume it could be a subversion "
-"repository. Use --source-type if you know better.\n"
-msgstr ""
-"SVN: Kann entferntes Projektarchiv nicht untersuchen; nehme an, es handelt "
-"sich um ein Subversion-Projektarchiv.\n"
+msgid "svn: cannot probe remote repository, assume it could be a subversion repository. Use --source-type if you know better.\n"
+msgstr ""
+"SVN: Kann entferntes Projektarchiv nicht untersuchen; nehme an, es handelt sich um ein Subversion-Projektarchiv.\n"
 "Verwende --source, wenn Sie es besser wissen.\n"
 
 #, python-format
 msgid "%s does not look like a Subversion repository"
 msgstr "%s scheint kein Subversion-Archiv zu sein"
 
-msgid "Could not load Subversion python bindings"
+#, fuzzy
+msgid "could not load Subversion python bindings"
 msgstr "Subversion Python-API konnte nicht geladen werden"
 
 #, python-format
@@ -2555,8 +2595,7 @@
 "aber 1.4 oder neuer wird benötigt"
 
 msgid "Subversion python bindings are too old, 1.4 or later required"
-msgstr ""
-"Pythons Subversion-Unterstützung ist zu alt. 1.4 oder neuer wird benötigt."
+msgstr "Pythons Subversion-Unterstützung ist zu alt. 1.4 oder neuer wird benötigt."
 
 #, python-format
 msgid "svn: revision %s is not an integer"
@@ -2634,9 +2673,7 @@
 msgstr "Schreiben von Subversion-Tags ist noch nicht implementiert\n"
 
 #, python-format
-msgid ""
-"splice map revision %s not found in subversion child map (revision lookups "
-"are not implemented)"
+msgid "splice map revision %s not found in subversion child map (revision lookups are not implemented)"
 msgstr ""
 
 msgid "automatically manage newlines in repository files"
@@ -2691,8 +2728,7 @@
 "Dateien mit dem deklarierten Format ``CRLF`` oder ``LF`` werden immer\n"
 "in diesem Format ausgecheckt; Dateien, die als binär (``BIN``) angegeben\n"
 "sind, werden nicht verändert. Zusätzlich kann ``native`` als Alias für\n"
-"die Voreinstellung des jeweiligen Systems verwendet werden: ``LF`` unter "
-"Unix\n"
+"die Voreinstellung des jeweiligen Systems verwendet werden: ``LF`` unter Unix\n"
 "(inkl. Mac OS X) und ``CRLF`` unter Windows. Beachten Sie, dass ``BIN ``\n"
 "(nichts ändern) Mercurials Standardverhalten ist; es dient nur dazu,\n"
 "um ein späteres, allgemeineres Muster zu überschreiben."
@@ -2793,12 +2829,16 @@
 
 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)."
+"  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`` (standardmäßig False) kann auf True gesetzt\n"
 "  werden um sicherzustellen, dass die konvertierten Dateien mit einem\n"
-"  konfigurierten Zeilenumbruch enden (entweder ``\\n`` oder ``\\r\\n``)."
+"  konfigurierten Zeilenumbruch enden (entweder ``\\n"
+"`` oder ``\\r\\n"
+"``)."
 
 msgid ""
 "The extension provides ``cleverencode:`` and ``cleverdecode:`` filters\n"
@@ -2921,8 +2961,7 @@
 "  vimdiff = gvim -f \"+next\" \\\n"
 "            \"+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))\""
 msgstr ""
-"  # Fügt Kommando \"vimdiff\" hinzu, welches gvimdiff mit dem DirDiff-"
-"Plugin\n"
+"  # Fügt Kommando \"vimdiff\" hinzu, welches gvimdiff mit dem DirDiff-Plugin\n"
 "  # ausführt. (http://www.vim.org/scripts/script.php?script_id=102).\n"
 "  # Die .vimrc sollte dazu \"let g:DirDiffDynamicDiffText = 1\" enthalten.\n"
 "  vimdiff = gvim -f \"+next\" \\\n"
@@ -3013,8 +3052,7 @@
 "    will be passed before the names of the directories to compare."
 msgstr ""
 "    Um ein anderes Programm zu verwenden, nutze die Option -p/--program.\n"
-"    Die zwei zu vergleichenden Verzeichnisse werden automatisch als "
-"Aufrufs-\n"
+"    Die zwei zu vergleichenden Verzeichnisse werden automatisch als Aufrufs-\n"
 "    parameter angenommen. Weitere Parameter können durch die Option\n"
 "    -o/--option hinzugefügt werden. Diese werden vor den Verzeichnisnamen\n"
 "    übergeben."
@@ -3074,22 +3112,17 @@
 
 msgid ""
 "This extension allows the factotum(4) facility on Plan 9 from Bell Labs\n"
-"platforms to provide authentication information for HTTP access. "
-"Configuration\n"
+"platforms to provide authentication information for HTTP access. Configuration\n"
 "entries specified in the auth section as well as authentication information\n"
-"provided in the repository URL are fully supported. If no prefix is "
-"specified,\n"
+"provided in the repository URL are fully supported. If no prefix is specified,\n"
 "a value of \"*\" will be assumed."
 msgstr ""
 
 msgid "By default, keys are specified as::"
 msgstr "Standardmäßig werden Schlüssel wie folgt angegeben::"
 
-msgid ""
-"  proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
-msgstr ""
-"  proto=pass service=hg prefix=<Präfix> user=<Benutzername> !"
-"password=<Passwort>"
+msgid "  proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
+msgstr "  proto=pass service=hg prefix=<Präfix> user=<Benutzername> !password=<Passwort>"
 
 msgid ""
 "If the factotum extension is unable to read the required key, one will be\n"
@@ -3133,14 +3166,10 @@
 msgstr "Factotum reagiert nicht"
 
 msgid "pull, update and merge in one command (DEPRECATED)"
-msgstr ""
-"Abrufen, Aktualisieren und Zusammenführen in einem Befehl zusammengefasst "
-"(VERALTET)"
+msgstr "Abrufen, Aktualisieren und Zusammenführen in einem Befehl zusammengefasst (VERALTET)"
 
 msgid "pull changes from a remote repository, merge new changes if needed."
-msgstr ""
-"Ruft Änderungen aus einem entfernten Projektarchiv ab und führt sie, falls "
-"nötig, zusammen."
+msgstr "Ruft Änderungen aus einem entfernten Projektarchiv ab und führt sie, falls nötig, zusammen."
 
 msgid ""
 "    This finds all changes from the repository at the specified path\n"
@@ -3172,8 +3201,7 @@
 "    --switch-parent."
 
 msgid "    See :hg:`help dates` for a list of formats valid for -d/--date."
-msgstr ""
-"    Siehe :hg:`help dates` für eine Liste gültiger Formate für -d/--date."
+msgstr "    Siehe :hg:`help dates` für eine Liste gültiger Formate für -d/--date."
 
 msgid ""
 "    Returns 0 on success.\n"
@@ -3182,8 +3210,7 @@
 "    Gibt 0 bei Erfolg zurück.\n"
 "    "
 
-msgid ""
-"working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgid "working dir not at branch tip (use \"hg update\" to check out branch tip)"
 msgstr ""
 "Arbeitsverzeichnis ist nicht Spitze des Zweiges (nutze \"hg update\" um auf\n"
 "die Zweigspitze zu wechseln)"
@@ -3197,31 +3224,23 @@
 msgid "working directory is missing some files"
 msgstr "Im Arbeitsverzeichnis fehlen Dateien"
 
-msgid ""
-"multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
-msgstr ""
-"Mehrere Kopfversionen in diesem Zweig (Nutze \"hg heads .\" und \"hg merge"
-"\"\n"
+msgid "multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr ""
+"Mehrere Kopfversionen in diesem Zweig (Nutze \"hg heads .\" und \"hg merge\"\n"
 "um zusammenzuführen)"
 
 #, python-format
 msgid "pulling from %s\n"
 msgstr "Rufe von %s ab\n"
 
-msgid ""
-"Other repository doesn't support revision lookup, so a rev cannot be "
-"specified."
-msgstr ""
-"Das andere Projektarchiv unterstützt keine Revisionsabfragen, daher kann "
+msgid "other repository doesn't support revision lookup, so a rev cannot be specified."
+msgstr ""
+"Das andere Projektarchiv unterstützt keine Revisionsabfragen, daher kann\n"
 "keine Revision angegeben werden."
 
 #, python-format
-msgid ""
-"not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge"
-"\" to merge them)\n"
-msgstr ""
-"Führe %d andere neue Zweigköpfe nicht zusammen (Nutze \"hg heads .\" und "
-"\"hg merge\" um sie zusammenzuführen)\n"
+msgid "not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge\" to merge them)\n"
+msgstr "Führe %d andere neue Zweigköpfe nicht zusammen (Nutze \"hg heads .\" und \"hg merge\" um sie zusammenzuführen)\n"
 
 #, python-format
 msgid "updating to %d:%s\n"
@@ -3233,8 +3252,7 @@
 
 #, python-format
 msgid "new changeset %d:%s merges remote changes with local\n"
-msgstr ""
-"Neuer Änderungssatz %d:%s führt entfernte Änderungen mit lokalen zusammen\n"
+msgstr "Neuer Änderungssatz %d:%s führt entfernte Änderungen mit lokalen zusammen\n"
 
 msgid "a specific revision you would like to pull"
 msgstr "Revision, die geholt werden soll"
@@ -3279,14 +3297,15 @@
 msgid "%s:%d node does not exist\n"
 msgstr "%s:%d Knoten existiert nicht\n"
 
-msgid "hg sigcheck REVISION"
+#, fuzzy
+msgid "hg sigcheck REV"
 msgstr "hg sigcheck REVISION"
 
 msgid "verify all the signatures there may be for a particular revision"
 msgstr "überprüfe alle für eine bestimmte Revision vorhandenen Signaturen"
 
-#, python-format
-msgid "No valid signature for %s\n"
+#, fuzzy, python-format
+msgid "no valid signature for %s\n"
 msgstr "Keine gültige Signatur für %s\n"
 
 msgid "make the signature local"
@@ -3310,7 +3329,8 @@
 msgid "commit message"
 msgstr "Versionsmeldung"
 
-msgid "hg sign [OPTION]... [REVISION]..."
+#, fuzzy
+msgid "hg sign [OPTION]... [REV]..."
 msgstr "hg sign [OPTION]... [REVISION]..."
 
 msgid "add a signature for the current or given revision"
@@ -3333,22 +3353,17 @@
 "    "
 
 msgid "uncommitted merge - please provide a specific revision"
-msgstr ""
-"Nicht versionierte Zusammenführung - bitte gib eine bestimmte Revision an"
-
-#, python-format
-msgid "Signing %d:%s\n"
+msgstr "Nicht versionierte Zusammenführung - bitte gib eine bestimmte Revision an"
+
+#, fuzzy, python-format
+msgid "signing %d:%s\n"
 msgstr "Signiere %d:%s\n"
 
 msgid "error while signing"
 msgstr "Fehler beim Signieren"
 
-msgid ""
-"working copy of .hgsigs is changed (please commit .hgsigs manually or use --"
-"force)"
-msgstr ""
-"Arbeitskopie der Datei .hgsigs wurde geändert (bitte manuell übernehmen oder "
-"--force verwenden)"
+msgid "working copy of .hgsigs is changed (please commit .hgsigs manually or use --force)"
+msgstr "Arbeitskopie der Datei .hgsigs wurde geändert (bitte manuell übernehmen oder --force verwenden)"
 
 msgid "unknown signature version"
 msgstr "Unbekannte Version der Signatur"
@@ -3365,26 +3380,8 @@
 "Option --graph hinzu, die, wenn sie angegeben wird, zusätzlich eine\n"
 "ASCII-Darstellung des Änderungsgraphen angezeigt.\n"
 
-#, python-format
-msgid "-G/--graph option is incompatible with --%s"
-msgstr "Option -G/--graph ist inkompatibel zu --%s"
-
-#, python-format
-msgid "cannot follow file not in parent revision: \"%s\""
-msgstr "Kann in Vorgängerrevision fehlender Datei nicht folgen: \"%s\""
-
-#, python-format
-msgid "cannot follow nonexistent file: \"%s\""
-msgstr "Kann fehlender Datei nicht folgen: \"%s\""
-
-msgid "can only follow copies/renames for explicit filenames"
-msgstr ""
-"Kopien/Umbenennungen können nur zu expliziten Dateinamen verfolgt werden"
-
 msgid "follow changeset history, or file history across copies and renames"
-msgstr ""
-"Folgt der Versionshistorie oder Dateihistorie über Kopien und Umbenennungen "
-"hinweg"
+msgstr "Folgt der Versionshistorie oder Dateihistorie über Kopien und Umbenennungen hinweg"
 
 msgid "only follow the first parent of merge changesets (DEPRECATED)"
 msgstr "Folgt nur dem ersten Vorgänger von Zusammenführungen (VERALTET)"
@@ -3447,9 +3444,6 @@
 "    Das @-Zeichen kennzeichnet die Vorgänger des Arbeitsverzeichnisses.\n"
 "    "
 
-msgid "show the revision DAG"
-msgstr "Zeigt den Revisions-DAG"
-
 msgid "hooks for integrating with the CIA.vc notification service"
 msgstr "Hooks zur Integration mit dem CIA.cv-Benachrichtigungsdienst"
 
@@ -3472,7 +3466,8 @@
 "  # Append a diffstat to the log message (optional)\n"
 "  #diffstat = False\n"
 "  # Template to use for log messages (optional)\n"
-"  #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+"  #template = {desc}\\n"
+"{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
 "  # Style to use (optional)\n"
 "  #style = foo\n"
 "  # The URL of the CIA notification service (optional)\n"
@@ -3496,7 +3491,8 @@
 "  # (optional)\n"
 "  #diffstat = False\n"
 "  # Vorlage für die Versionsmeldungen (optional)\n"
-"  #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+"  #template = {desc}\\n"
+"{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
 "  # zu verwendender Stil (optional)\n"
 "  #style = foo\n"
 "  # Die URL des CIA Benachrichtigungsdienstes (optional)\n"
@@ -3717,6 +3713,292 @@
 msgid "The default is 'colorful'.\n"
 msgstr "Die Voreinstellung ist 'colorful'.\n"
 
+#, fuzzy
+msgid "interactive history editing"
+msgstr "Startet den interaktiven Historienbetrachter"
+
+msgid ""
+"With this extension installed, Mercurial gains one new command: histedit. Usage\n"
+"is as follows, assuming the following history::"
+msgstr ""
+
+msgid ""
+" @  3[tip]   7c2fd3b9020c   2009-04-27 18:04 -0500   durin42\n"
+" |    Add delta\n"
+" |\n"
+" o  2   030b686bedc4   2009-04-27 18:04 -0500   durin42\n"
+" |    Add gamma\n"
+" |\n"
+" o  1   c561b4e977df   2009-04-27 18:04 -0500   durin42\n"
+" |    Add beta\n"
+" |\n"
+" o  0   d8d2fcd0e319   2009-04-27 18:04 -0500   durin42\n"
+"      Add alpha"
+msgstr ""
+
+msgid ""
+"If you were to run ``hg histedit c561b4e977df``, you would see the following\n"
+"file open in your editor::"
+msgstr ""
+
+msgid ""
+" pick c561b4e977df Add beta\n"
+" pick 030b686bedc4 Add gamma\n"
+" pick 7c2fd3b9020c Add delta"
+msgstr ""
+
+msgid ""
+" # Edit history between 633536316234 and 7c2fd3b9020c\n"
+" #\n"
+" # Commands:\n"
+" #  p, pick = use commit\n"
+" #  e, edit = use commit, but stop for amending\n"
+" #  f, fold = use commit, but fold into previous commit (combines N and N-1)\n"
+" #  d, drop = remove commit from history\n"
+" #  m, mess = edit message without changing commit content\n"
+" #"
+msgstr ""
+
+msgid ""
+"In this file, lines beginning with ``#`` are ignored. You must specify a rule\n"
+"for each revision in your history. For example, if you had meant to add gamma\n"
+"before beta, and then wanted to add delta in the same revision as beta, you\n"
+"would reorganize the file to look like this::"
+msgstr ""
+
+msgid ""
+" pick 030b686bedc4 Add gamma\n"
+" pick c561b4e977df Add beta\n"
+" fold 7c2fd3b9020c Add delta"
+msgstr ""
+
+msgid ""
+"At which point you close the editor and ``histedit`` starts working. When you\n"
+"specify a ``fold`` operation, ``histedit`` will open an editor when it folds\n"
+"those revisions together, offering you a chance to clean up the commit message::"
+msgstr ""
+
+msgid ""
+" Add beta\n"
+" ***\n"
+" Add delta"
+msgstr ""
+
+msgid ""
+"Edit the commit message to your liking, then close the editor. For\n"
+"this example, let's assume that the commit message was changed to\n"
+"``Add beta and delta.`` After histedit has run and had a chance to\n"
+"remove any old or temporary revisions it needed, the history looks\n"
+"like this::"
+msgstr ""
+
+msgid ""
+" @  2[tip]   989b4d060121   2009-04-27 18:04 -0500   durin42\n"
+" |    Add beta and delta.\n"
+" |\n"
+" o  1   081603921c3f   2009-04-27 18:04 -0500   durin42\n"
+" |    Add gamma\n"
+" |\n"
+" o  0   d8d2fcd0e319   2009-04-27 18:04 -0500   durin42\n"
+"      Add alpha"
+msgstr ""
+
+msgid ""
+"Note that ``histedit`` does *not* remove any revisions (even its own temporary\n"
+"ones) until after it has completed all the editing operations, so it will\n"
+"probably perform several strip operations when it's done. For the above example,\n"
+"it had to run strip twice. Strip can be slow depending on a variety of factors,\n"
+"so you might need to be a little patient. You can choose to keep the original\n"
+"revisions by passing the ``--keep`` flag."
+msgstr ""
+
+msgid ""
+"The ``edit`` operation will drop you back to a command prompt,\n"
+"allowing you to edit files freely, or even use ``hg record`` to commit\n"
+"some changes as a separate commit. When you're done, any remaining\n"
+"uncommitted changes will be committed as well. When done, run ``hg\n"
+"histedit --continue`` to finish this step. You'll be prompted for a\n"
+"new commit message, but the default commit message will be the\n"
+"original message for the ``edit`` ed revision."
+msgstr ""
+
+msgid ""
+"The ``message`` operation will give you a chance to revise a commit\n"
+"message without changing the contents. It's a shortcut for doing\n"
+"``edit`` immediately followed by `hg histedit --continue``."
+msgstr ""
+
+msgid ""
+"If ``histedit`` encounters a conflict when moving a revision (while\n"
+"handling ``pick`` or ``fold``), it'll stop in a similar manner to\n"
+"``edit`` with the difference that it won't prompt you for a commit\n"
+"message when done. If you decide at this point that you don't like how\n"
+"much work it will be to rearrange history, or that you made a mistake,\n"
+"you can use ``hg histedit --abort`` to abandon the new changes you\n"
+"have made and return to the state before you attempted to edit your\n"
+"history."
+msgstr ""
+
+msgid ""
+"If we clone the example repository above and add three more changes, such that\n"
+"we have the following history::"
+msgstr ""
+
+msgid ""
+"   @  6[tip]   038383181893   2009-04-27 18:04 -0500   stefan\n"
+"   |    Add theta\n"
+"   |\n"
+"   o  5   140988835471   2009-04-27 18:04 -0500   stefan\n"
+"   |    Add eta\n"
+"   |\n"
+"   o  4   122930637314   2009-04-27 18:04 -0500   stefan\n"
+"   |    Add zeta\n"
+"   |\n"
+"   o  3   836302820282   2009-04-27 18:04 -0500   stefan\n"
+"   |    Add epsilon\n"
+"   |\n"
+"   o  2   989b4d060121   2009-04-27 18:04 -0500   durin42\n"
+"   |    Add beta and delta.\n"
+"   |\n"
+"   o  1   081603921c3f   2009-04-27 18:04 -0500   durin42\n"
+"   |    Add gamma\n"
+"   |\n"
+"   o  0   d8d2fcd0e319   2009-04-27 18:04 -0500   durin42\n"
+"        Add alpha"
+msgstr ""
+
+msgid ""
+"If you run ``hg histedit --outgoing`` on the clone then it is the same\n"
+"as running ``hg histedit 836302820282``. If you need plan to push to a\n"
+"repository that Mercurial does not detect to be related to the source\n"
+"repo, you can add a ``--force`` option.\n"
+msgstr ""
+
+#. i18n: command names and abbreviations must remain untranslated
+#, python-format
+msgid ""
+"# Edit history between %s and %s\n"
+"#\n"
+"# Commands:\n"
+"#  p, pick = use commit\n"
+"#  e, edit = use commit, but stop for amending\n"
+"#  f, fold = use commit, but fold into previous commit (combines N and N-1)\n"
+"#  d, drop = remove commit from history\n"
+"#  m, mess = edit message without changing commit content\n"
+"#\n"
+msgstr ""
+
+msgid "cannot edit history that would orphan nodes"
+msgstr ""
+
+#, fuzzy
+msgid "can't edit history with merges"
+msgstr "--stdio und --cmdserver können nicht gleichzeitig verwendet werden"
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr "%s: leerer Änderungssatz"
+
+msgid "Fix up the change and run hg histedit --continue"
+msgstr ""
+
+msgid ""
+"Make changes as needed, you may commit or record as needed now.\n"
+"When you are finished, run hg histedit --continue to resume."
+msgstr ""
+
+#, fuzzy
+msgid "Read history edits from the specified file."
+msgstr "Verschiebe angefangen vom gegebenen Änderungssatz"
+
+#, fuzzy
+msgid "continue an edit already in progress"
+msgstr "Führt eine unterbrochene Pfropfung fort"
+
+msgid "don't strip old nodes after edit is complete"
+msgstr ""
+
+#, fuzzy
+msgid "abort an edit in progress"
+msgstr "Keine vorherige Verschiebung zur Wiederaufnahme"
+
+#, fuzzy
+msgid "changesets not found in destination"
+msgstr "Zeigt Änderungssätze, die nicht im Zielarchiv sind"
+
+#, fuzzy
+msgid "force outgoing even for unrelated repositories"
+msgstr "Zeigt Adresse für Aliasnamen von entfernten Projektarchiven an"
+
+#, fuzzy
+msgid "first revision to be edited"
+msgstr "detach benötigt eine Revision"
+
+msgid "[PARENT]"
+msgstr ""
+
+#, fuzzy
+msgid ""
+"interactively edit changeset history\n"
+"    "
+msgstr "Interaktive Auswahl der Änderungen zur Übernahme ins Archiv"
+
+msgid "source has mq patches applied"
+msgstr "Die Quelle hat angewandte mq-Patches"
+
+msgid "only one repo argument allowed with --outgoing"
+msgstr ""
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr "Vergleiche mit %s\n"
+
+msgid "--force only allowed with --outgoing"
+msgstr ""
+
+msgid "no arguments allowed with --continue"
+msgstr ""
+
+msgid "no arguments allowed with --abort"
+msgstr ""
+
+msgid "history edit already in progress, try --continue or --abort"
+msgstr ""
+
+#, fuzzy
+msgid "histedit requires exactly one parent revision"
+msgstr "'size' erwartet einen Ausdruck"
+
+msgid "histedit: Should update metadata for the following changes:\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "histedit:  %s to %s\n"
+msgstr "Status: %r %s -> %s\n"
+
+#, fuzzy, python-format
+msgid "histedit:     moving bookmarks %s\n"
+msgstr "Importierte Lesezeichen %s\n"
+
+#, fuzzy
+msgid "must specify a rule for each changeset once"
+msgstr "Mindestens ein Änderungssatz mit -r oder -o wird benötigt"
+
+#, fuzzy, python-format
+msgid "malformed line \"%s\""
+msgstr "fehlerhafte mq Statuszeile: %s\n"
+
+msgid "may not use changesets other than the ones listed"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "unknown changeset %s listed"
+msgstr "Entpacke Änderungssatz %s"
+
+#, fuzzy, python-format
+msgid "unknown action \"%s\""
+msgstr "Unbekannte Funktion '%s'"
+
 msgid "accelerate status report using Linux's inotify service"
 msgstr "Beschleunigt die Statusabfrage mit dem inotify-Dient von Linux"
 
@@ -3760,8 +4042,7 @@
 
 #, python-format
 msgid "inotify-client: could not talk to new inotify server: %s\n"
-msgstr ""
-"inotify-Client: Konnte nicht mit dem neuen inotify-Server sprechen: %s\n"
+msgstr "inotify-Client: Konnte nicht mit dem neuen inotify-Server sprechen: %s\n"
 
 #, python-format
 msgid "inotify-client: failed to contact inotify server: %s\n"
@@ -3772,8 +4053,7 @@
 
 #, python-format
 msgid "(inotify: received response from incompatible server version %d)\n"
-msgstr ""
-"(inotify: Antwort eines Servers mit inkompatibler Version %d empfangen)\n"
+msgstr "(inotify: Antwort eines Servers mit inkompatibler Version %d empfangen)\n"
 
 #, python-format
 msgid "(inotify: received '%s' response when expecting '%s')\n"
@@ -3808,8 +4088,7 @@
 
 #, python-format
 msgid "cannot watch %s until inotify watch limit is raised"
-msgstr ""
-"Kann Verzeichnis %s nicht überwachen, bis das inotify-Limit erhöht wurde."
+msgstr "Kann Verzeichnis %s nicht überwachen, bis das inotify-Limit erhöht wurde."
 
 #, python-format
 msgid "inotify service not available: %s"
@@ -3868,12 +4147,8 @@
 msgid "cannot start: socket is already bound"
 msgstr "Kann nicht starten: Socket wird bereits verwendet"
 
-msgid ""
-"cannot start: tried linking .hg/inotify.sock to a temporary socket but .hg/"
-"inotify.sock already exists"
-msgstr ""
-"Kann nicht starten: Versucht, .hg/inotify.sock auf ein temporäres Socket zu "
-"linken, aber .hg/inotify.sock existiert bereits."
+msgid "cannot start: tried linking .hg/inotify.sock to a temporary socket but .hg/inotify.sock already exists"
+msgstr "Kann nicht starten: Versucht, .hg/inotify.sock auf ein temporäres Socket zu linken, aber .hg/inotify.sock existiert bereits."
 
 #, python-format
 msgid "answering query for %r\n"
@@ -3909,14 +4184,12 @@
 msgid ""
 "  [interhg]\n"
 "  issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
-"  bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
-"i\n"
+"  bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!i\n"
 "  boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
 msgstr ""
 "  [interhg]\n"
 "  fehler = s!fehler(\\d+)!<a href=\"http://bts/issue\\1\">fehler\\1</a>!\n"
-"  bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
-"i\n"
+"  bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!i\n"
 "  fett = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
 
 #, python-format
@@ -4005,8 +4278,7 @@
 ":hg:`templates` für eine Liste verfügbarer Vorlagen und Filter."
 
 msgid "Three additional date template filters are provided:"
-msgstr ""
-"Drei weitere Filter für Datumsangaben in Vorlagen werden bereitgestellt:"
+msgstr "Drei weitere Filter für Datumsangaben in Vorlagen werden bereitgestellt:"
 
 msgid ""
 ":``utcdate``:    \"2006/09/18 15:13:13\"\n"
@@ -4256,8 +4528,7 @@
 msgstr "Nimmt Ersetzungen im aktuellen Arbeitsverzeichnis wieder zurück"
 
 msgid "    Must be run before changing/disabling active keywords."
-msgstr ""
-"    Muß vor dem Ändern/Abschalten von aktiven Keywords ausgeführt werden."
+msgstr "    Muß vor dem Ändern/Abschalten von aktiven Keywords ausgeführt werden."
 
 msgid ""
 "    kwshrink refuses to run if given files contain local changes.\n"
@@ -4336,8 +4607,7 @@
 msgstr ""
 "Wird ein Änderungssatz, welcher einen Binärriesen ändert oder hinzufügt,\n"
 "in ein entferntes Archiv übertragen, so werden gleichzeitig (asymmetrisch\n"
-"zum Abrufen per pull) auch die (neuen) Revisionen der Binärdatei "
-"übertragen.\n"
+"zum Abrufen per pull) auch die (neuen) Revisionen der Binärdatei übertragen.\n"
 "Das entfernte Mercurial muss hierfür die largefiles-Erweiterung unterstützen."
 
 msgid ""
@@ -4352,8 +4622,7 @@
 "Archiv abgerufen, verhält sich Mercurial zunächst normal. Erst wenn das\n"
 "Arbeitsverzeichnis auf eine Revision aktualisiert wird, die eine solche\n"
 "Datei enthält, wird die Binärdatei heruntergeladen. Durch permanente\n"
-"Zwischenspeicherung jeder Revision wird wiederholtes Herunterladen "
-"verhindert.\n"
+"Zwischenspeicherung jeder Revision wird wiederholtes Herunterladen verhindert.\n"
 "Das bedeutet allerdings, dass zum Zeitpunkt der Aktualisierung auf eine\n"
 "bisher unbekannte Revision, Netzwerkzugriff möglich sein muss."
 
@@ -4555,13 +4824,10 @@
 
 #, python-format
 msgid "largefile %s is not in cache and could not be downloaded"
-msgstr ""
-"Binärriese %s fehlt im Zwischenspeicher und konnte nicht heruntergeladen "
-"werden"
+msgstr "Binärriese %s fehlt im Zwischenspeicher und konnte nicht heruntergeladen werden"
 
 msgid "minimum size (MB) for files to be converted as largefiles"
-msgstr ""
-"Minimale Dateigröße in MB von Dateien, die in Binärriesen konvertiert werden"
+msgstr "Minimale Dateigröße in MB von Dateien, die in Binärriesen konvertiert werden"
 
 msgid "convert from a largefiles repo to a normal repo"
 msgstr "Konvertiert ein Binärriesen-Archiv in ein reguläres Archiv"
@@ -4580,15 +4846,16 @@
 msgid "unknown operating system: %s\n"
 msgstr "Unbekanntes Betriebssytem: %s\n"
 
-#, python-format
-msgid "Found %s in store\n"
+#, fuzzy, python-format
+msgid "found %s in store\n"
 msgstr "%s im Lager gefunden\n"
 
-#, python-format
-msgid "Found %s in system cache\n"
+#, fuzzy, python-format
+msgid "found %s in system cache\n"
 msgstr "%s im Zwischenspeicher gefunden\n"
 
-msgid "Can't get file locally"
+#, fuzzy
+msgid "can't get file locally"
 msgstr "Kann Datei nicht lokal abrufen"
 
 #, python-format
@@ -4689,12 +4956,12 @@
 msgid "&Other"
 msgstr "&Andere"
 
+msgid "no files to copy"
+msgstr "Keine Dateien zu kopieren"
+
 msgid "destination largefile already exists"
 msgstr "Ziel-Binärriese existiert bereits"
 
-msgid "no files to copy"
-msgstr "Keine Dateien zu kopieren"
-
 msgid "caching new largefiles\n"
 msgstr "Lade neue Binärriesen in den Zwischenspeicher\n"
 
@@ -4787,12 +5054,8 @@
 msgstr "Änderungssatz %s: %s fehlt\n"
 
 #, python-format
-msgid ""
-"largefiles: repo method %r appears to have already been wrapped by another "
-"extension: largefiles may behave incorrectly\n"
-msgstr ""
-"largefiles: Aktion %r scheint bereits von einer anderen Erweiterung "
-"verändert zu sein. Dadurch kann es zu Fehlern in largefiles kommen\n"
+msgid "largefiles: repo method %r appears to have already been wrapped by another extension: largefiles may behave incorrectly\n"
+msgstr "largefiles: Aktion %r scheint bereits von einer anderen Erweiterung verändert zu sein. Dadurch kann es zu Fehlern in largefiles kommen\n"
 
 #, python-format
 msgid "file \"%s\" is a largefile standin"
@@ -4804,11 +5067,8 @@
 msgid "add as normal file"
 msgstr "Füge als normale Datei hinzu"
 
-msgid ""
-"add all files above this size (in megabytes) as largefiles (default: 10)"
-msgstr ""
-"Größe in MB ab der Dateien als Binärriesen hinzugefügt werden "
-"(Voreinstellung: 10)"
+msgid "add all files above this size (in megabytes) as largefiles (default: 10)"
+msgstr "Größe in MB ab der Dateien als Binärriesen hinzugefügt werden (Voreinstellung: 10)"
 
 msgid "verify largefiles"
 msgstr "Verifiziere Binärriesen"
@@ -4922,8 +5182,7 @@
 "You will by default be managing a patch queue named \"patches\". You can\n"
 "create other, independent patch queues with the :hg:`qqueue` command."
 msgstr ""
-"Sie werden standardmäßig einen Patch-Reihe namens \"patches\" verwalten. "
-"Sie\n"
+"Sie werden standardmäßig einen Patch-Reihe namens \"patches\" verwalten. Sie\n"
 "können andere, unabhängige Warteschlangen mit :hg:`qqueue` erzeugen."
 
 msgid ""
@@ -5132,8 +5391,7 @@
 msgstr "Patch \"%s\" existiert bereits"
 
 msgid "cannot use both --force and --keep-changes"
-msgstr ""
-"Es können nicht gleichzeitig --force und --keep-changes angegeben werden"
+msgstr "Es können nicht gleichzeitig --force und --keep-changes angegeben werden"
 
 msgid "cannot manage merge changesets"
 msgstr "Zusammenführungen können nicht mit Patches verwaltet werden"
@@ -5257,12 +5515,8 @@
 msgid "cannot refresh immutable revision"
 msgstr "Kann keine unveränderbare Revision aktualisieren"
 
-msgid ""
-"refresh interrupted while patch was popped! (revert --all, qpush to "
-"recover)\n"
-msgstr ""
-"Aktualisierung während einer Rücknahme unterbrochen! Nutze \"revert --all\" "
-"und \"qpush\" zum Wiederherstellen.\n"
+msgid "refresh interrupted while patch was popped! (revert --all, qpush to recover)\n"
+msgstr "Aktualisierung während einer Rücknahme unterbrochen! Nutze \"revert --all\" und \"qpush\" zum Wiederherstellen.\n"
 
 msgid "patch queue directory already exists"
 msgstr "Verzeichnis für diese Patch-Reihe existiert bereits"
@@ -5271,7 +5525,8 @@
 msgid "patch %s is not in series file"
 msgstr "Patch %s ist nicht in der Seriendatei"
 
-msgid "No saved patch data found\n"
+#, fuzzy
+msgid "no saved patch data found\n"
 msgstr "Keine gespeicherten Patchdaten gefunden\n"
 
 #, python-format
@@ -5292,7 +5547,8 @@
 msgid "updating queue directory\n"
 msgstr "Aktualisiere Patchreihenverzeichnis\n"
 
-msgid "Unable to load queue repository\n"
+#, fuzzy
+msgid "unable to load queue repository\n"
 msgstr "Archiv für Patch-Reihen kann nicht geladen werden\n"
 
 msgid "save: no patches applied, exiting\n"
@@ -5314,6 +5570,10 @@
 msgid "option \"-r\" not valid when importing files"
 msgstr "Option \"-r\" kann nicht beim Import von Dateien verwendet werden"
 
+#, fuzzy
+msgid "no files or revisions specified"
+msgstr "Keine Revisionen angegeben"
+
 msgid "option \"-n\" not valid when importing multiple patches"
 msgstr "Option \"-n\" kann nicht beim Import mehrerer Patches verwendet werden"
 
@@ -5357,8 +5617,7 @@
 msgstr "Benenne %s in %s um\n"
 
 msgid "need --name to import a patch from -"
-msgstr ""
-"Beim Import von der Standardeingabe muss die Option --name angegeben werden"
+msgstr "Beim Import von der Standardeingabe muss die Option --name angegeben werden"
 
 #, python-format
 msgid "unable to read file %s"
@@ -5381,8 +5640,7 @@
 msgstr "Entfernt Patches aus der Patch-Reihe"
 
 msgid ""
-"    The patches must not be applied, and at least one patch is required. "
-"Exact\n"
+"    The patches must not be applied, and at least one patch is required. Exact\n"
 "    patch identifiers must be given. With -k/--keep, the patch files are\n"
 "    preserved in the patch directory."
 msgstr ""
@@ -5445,7 +5703,8 @@
 msgid "qpush after importing"
 msgstr "Führt qpush nach dem Import aus"
 
-msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE..."
+#, fuzzy
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... [FILE]..."
 msgstr "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... DATEI..."
 
 msgid "import a patch or existing changeset"
@@ -5690,14 +5949,11 @@
 "    only changes to matching files to the new patch, leaving the rest\n"
 "    as uncommitted modifications."
 msgstr ""
-"    qnew erstellt einen neuen Patch über dem aktuell angewandten Patch "
-"(wenn\n"
+"    qnew erstellt einen neuen Patch über dem aktuell angewandten Patch (wenn\n"
 "    vorhanden). Der Patch wird mit allen ausstehenden Änderungen in dem\n"
 "    Arbeitsverzeichnis initialisiert. Wenn auch -I/--include, -X/--exclude\n"
-"    und/oder eine Liste von Dateien angegeben wird, werden nur Änderungen "
-"an\n"
-"    den betreffenden Dateien in den neuen Patch übernommen, der Rest wird "
-"als\n"
+"    und/oder eine Liste von Dateien angegeben wird, werden nur Änderungen an\n"
+"    den betreffenden Dateien in den neuen Patch übernommen, der Rest wird als\n"
 "    ungespeicherte Änderung belassen."
 
 msgid ""
@@ -5705,10 +5961,8 @@
 "    date, respectively. -U/--currentuser and -D/--currentdate set user\n"
 "    to current user and date to current date."
 msgstr ""
-"    -u/--user und -d/--date können genutzt werden, um den (gegebenen) "
-"Benutzer\n"
-"    und das Datum zu setzen. -U/--currentuser und -D/--currentdate setzen "
-"den\n"
+"    -u/--user und -d/--date können genutzt werden, um den (gegebenen) Benutzer\n"
+"    und das Datum zu setzen. -U/--currentuser und -D/--currentdate setzen den\n"
 "    Benutzer auf den aktuellen Benutzer und das Datum auch entsprechend."
 
 msgid ""
@@ -5717,10 +5971,8 @@
 "    empty and the commit message is '[mq]: PATCH'."
 msgstr ""
 "    -e/--edit, -m/--message oder -l/--logfile schreiben ebenfalls die Daten\n"
-"    im Kopf sowie die Versionsmeldung des Patches. Wenn nichts angegeben "
-"wird,\n"
-"    wird der Kopf des Patches leer und die Versionsmeldung '[mq]: PATCH' "
-"sein."
+"    im Kopf sowie die Versionsmeldung des Patches. Wenn nichts angegeben wird,\n"
+"    wird der Kopf des Patches leer und die Versionsmeldung '[mq]: PATCH' sein."
 
 msgid ""
 "    Use the -g/--git option to keep the patch in the git extended diff\n"
@@ -5744,19 +5996,16 @@
 msgstr "Aktualisiert nur angegebene und bereits in Patches enthaltene Dateien"
 
 msgid "add/update author field in patch with current user"
-msgstr ""
-"Erstellt/aktualisiert das Autor-Feld im Patch mit dem aktuellen Benutzer"
+msgstr "Erstellt/aktualisiert das Autor-Feld im Patch mit dem aktuellen Benutzer"
 
 msgid "add/update author field in patch with given user"
-msgstr ""
-"Erstellt/aktualisiert das Autor-Feld im Patch mit dem angegebenen Benutzer"
+msgstr "Erstellt/aktualisiert das Autor-Feld im Patch mit dem angegebenen Benutzer"
 
 msgid "add/update date field in patch with current date"
 msgstr "Erstellt/Aktualisiert das Datumsfeld im Patch mit dem aktuellen Datum"
 
 msgid "add/update date field in patch with given date"
-msgstr ""
-"Erstellt/aktualisiert das Datumsfeld im Patch mit dem angegebenen Datum"
+msgstr "Erstellt/aktualisiert das Datumsfeld im Patch mit dem angegebenen Datum"
 
 msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
 msgstr "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l DATEI] [-s] [DATEI]..."
@@ -5769,34 +6018,26 @@
 "    contain only the modifications that match those patterns; the\n"
 "    remaining modifications will remain in the working directory."
 msgstr ""
-"    Wenn irgendein Dateimuster angegeben ist, wird der aktualisierte Patch "
-"nur\n"
-"    die Änderungen in den passenden Dateien enthalten; die restlichen "
-"Änderungen \n"
+"    Wenn irgendein Dateimuster angegeben ist, wird der aktualisierte Patch nur\n"
+"    die Änderungen in den passenden Dateien enthalten; die restlichen Änderungen \n"
 "    verbleiben im Arbeitsverzeichnis."
 
 msgid ""
 "    If -s/--short is specified, files currently included in the patch\n"
 "    will be refreshed just like matched files and remain in the patch."
 msgstr ""
-"    Wenn -s/--short angegeben wird, werden die Dateien, die im Patch "
-"enthalten\n"
-"    sind, aktualisiert, als würden sie von einem Dateimuster erfasst "
-"werden,\n"
+"    Wenn -s/--short angegeben wird, werden die Dateien, die im Patch enthalten\n"
+"    sind, aktualisiert, als würden sie von einem Dateimuster erfasst werden,\n"
 "    und verbleiben im Patch."
 
 msgid ""
-"    If -e/--edit is specified, Mercurial will start your configured editor "
-"for\n"
-"    you to enter a message. In case qrefresh fails, you will find a backup "
-"of\n"
+"    If -e/--edit is specified, Mercurial will start your configured editor for\n"
+"    you to enter a message. In case qrefresh fails, you will find a backup of\n"
 "    your message in ``.hg/last-message.txt``."
 msgstr ""
 "    Wenn -e/--edit angegeben wird, wird Mercurial den konfigurierten Editor\n"
-"    starten, in dem Sie die Versionsmeldung eintragen können. Falls "
-"qrefresh\n"
-"    fehlschlägt, wird eine Sicherheitskopie in ``.hg/last-message.txt`` "
-"abgelegt."
+"    starten, in dem Sie die Versionsmeldung eintragen können. Falls qrefresh\n"
+"    fehlschlägt, wird eine Sicherheitskopie in ``.hg/last-message.txt`` abgelegt."
 
 msgid ""
 "    hg add/remove/copy/rename work as usual, though you might want to\n"
@@ -5805,10 +6046,8 @@
 "    git diff format."
 msgstr ""
 "    hg add/remove/copy/rename funktionieren weiter wie gewohnt, obwohl Sie\n"
-"    vermutliche Patches im git-Format (-g/--git oder [diff] git=1) "
-"verwenden\n"
-"    wollen, um Umbenennungen und Kopien zu versionieren. Siehe auch die "
-"Hilfe\n"
+"    vermutliche Patches im git-Format (-g/--git oder [diff] git=1) verwenden\n"
+"    wollen, um Umbenennungen und Kopien zu versionieren. Siehe auch die Hilfe\n"
 "    zum diff-Befehl für weitere Informationen zum git-Format."
 
 msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
@@ -5826,10 +6065,8 @@
 "    last refresh (thus showing what the current patch would become\n"
 "    after a qrefresh)."
 msgstr ""
-"    Zeigt einen Diff, der den aktuellen Patch und alle nachträglichen "
-"Änderungen\n"
-"    enthält, die nach der letzten Aktualisierung getätigt wurden (und "
-"damit,\n"
+"    Zeigt einen Diff, der den aktuellen Patch und alle nachträglichen Änderungen\n"
+"    enthält, die nach der letzten Aktualisierung getätigt wurden (und damit,\n"
 "    wie der aktuelle Patch nach einem Aufruf von qrefresh aussehen würde)."
 
 msgid ""
@@ -5839,10 +6076,8 @@
 "    qrefresh."
 msgstr ""
 "    Verwenden Sie :hg:`diff`, wenn Sie nur die Änderungen seit dem letzten\n"
-"    qrefresh sehen möchten, oder :hg:`export qtip`, wenn Sie nur die "
-"Änderungen\n"
-"    des aktuellen Patches ohne die nachträglichen Änderungen seit dem "
-"letzten\n"
+"    qrefresh sehen möchten, oder :hg:`export qtip`, wenn Sie nur die Änderungen\n"
+"    des aktuellen Patches ohne die nachträglichen Änderungen seit dem letzten\n"
 "    qrefresh sehen möchten."
 
 msgid "edit patch header"
@@ -5865,15 +6100,11 @@
 "    deleted. With -k/--keep, the folded patch files will not be\n"
 "    removed afterwards."
 msgstr ""
-"    Die Patches dürfen noch nicht angewendet sein. Jeder Patch wird "
-"nacheinander\n"
-"    auf den aktuellen Patch in der gegebenen Reihenfolge angewendet. Wenn "
-"alle\n"
+"    Die Patches dürfen noch nicht angewendet sein. Jeder Patch wird nacheinander\n"
+"    auf den aktuellen Patch in der gegebenen Reihenfolge angewendet. Wenn alle\n"
 "    Patches erfolgreich angewandt wurden, wird der aktuelle Patch mit dem\n"
-"    zusammengefassten Patch aktualisiert und die zusammengelegten Patches "
-"werden\n"
-"    gelöscht. Mit -k/--keep werden die zusammengelegten Patches im "
-"Anschluss\n"
+"    zusammengefassten Patch aktualisiert und die zusammengelegten Patches werden\n"
+"    gelöscht. Mit -k/--keep werden die zusammengelegten Patches im Anschluss\n"
 "    nicht entfernt."
 
 msgid ""
@@ -5886,8 +6117,8 @@
 msgid "qfold requires at least one patch name"
 msgstr "qfold erwartet mindestens einen Patchnamen"
 
-#, python-format
-msgid "Skipping already folded patch %s\n"
+#, fuzzy, python-format
+msgid "skipping already folded patch %s\n"
 msgstr "Überspringe bereits angewandten Patch %s\n"
 
 #, python-format
@@ -5911,9 +6142,7 @@
 msgstr "hg qgoto [OPTION]... PATCH"
 
 msgid "push or pop patches until named patch is at top of stack"
-msgstr ""
-"Verschiebt (push/pop) die Patches bis der genannte Patch oben auf dem Stapel "
-"ist"
+msgstr "Verschiebt (push/pop) die Patches bis der genannte Patch oben auf dem Stapel ist"
 
 msgid "list all patches and guards"
 msgstr "Zeigt alle Patches und Wächter an"
@@ -5931,17 +6160,13 @@
 "    Guards control whether a patch can be pushed. A patch with no\n"
 "    guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
 "    pushed only if the :hg:`qselect` command has activated it. A patch with\n"
-"    a negative guard (\"-foo\") is never pushed if the :hg:`qselect` "
-"command\n"
+"    a negative guard (\"-foo\") is never pushed if the :hg:`qselect` command\n"
 "    has activated it."
 msgstr ""
-"    Wächter kontrollieren, ob ein Patch übertragen werden kann. Ein Patch "
-"ohne\n"
-"    Wächter wird immer übertragen. Ein Patch mit einem positiven Wächter "
-"(\"+foo\")\n"
+"    Wächter kontrollieren, ob ein Patch übertragen werden kann. Ein Patch ohne\n"
+"    Wächter wird immer übertragen. Ein Patch mit einem positiven Wächter (\"+foo\")\n"
 "    wird nur dann übertragen, wenn er vo :hg:`qselect` aktiviert wurde. Ein\n"
-"    Patch mit einem negativen Wächter (\"-foo\") wird niemals übertragen, "
-"wenn er\n"
+"    Patch mit einem negativen Wächter (\"-foo\") wird niemals übertragen, wenn er\n"
 "    entsprechend aktiviert wurde."
 
 msgid ""
@@ -6081,12 +6306,10 @@
 msgstr "hg qrestore [-d] [-u] REV"
 
 msgid "restore the queue state saved by a revision (DEPRECATED)"
-msgstr ""
-"Stellt den von einer Revision gespeicherten Patchstatus wieder her (VERALTET)"
+msgstr "Stellt den von einer Revision gespeicherten Patchstatus wieder her (VERALTET)"
 
 msgid "    This command is deprecated, use :hg:`rebase` instead."
-msgstr ""
-"    Dieser Befehl ist veraltet, verwenden Sie stattdessen :hg:`rebase`."
+msgstr "    Dieser Befehl ist veraltet, verwenden Sie stattdessen :hg:`rebase`."
 
 msgid "copy patch directory"
 msgstr "Kopiert das Patchverzeichnis"
@@ -6118,24 +6341,16 @@
 msgid "copy %s to %s\n"
 msgstr "Kopiert %s nach %s\n"
 
-msgid ""
-"strip specified revision (optional, can specify revisions without this "
-"option)"
-msgstr ""
-"Entfernt die gegebene Revision (optional, da schon die Argumente Revisionen "
-"sind)"
+msgid "strip specified revision (optional, can specify revisions without this option)"
+msgstr "Entfernt die gegebene Revision (optional, da schon die Argumente Revisionen sind)"
 
 msgid "force removal of changesets, discard uncommitted changes (no backup)"
 msgstr ""
 "erzwingt Entfernung von Änderungssätzen und unversionierten Änderungen\n"
 "(keine Sicherheitskopie)"
 
-msgid ""
-"bundle only changesets with local revision number greater than REV which are "
-"not descendants of REV (DEPRECATED)"
-msgstr ""
-"Bündelt nur Änderungssätze mit einer lokalen Revisionsnummer größer als REV, "
-"die nicht Nachfahren von REV sind (VERALTET)"
+msgid "bundle only changesets with local revision number greater than REV which are not descendants of REV (DEPRECATED)"
+msgstr "Bündelt nur Änderungssätze mit einer lokalen Revisionsnummer größer als REV, die nicht Nachfahren von REV sind (VERALTET)"
 
 msgid "no backups"
 msgstr "Keine Sicherheitskopien"
@@ -6151,10 +6366,10 @@
 
 #, fuzzy
 msgid "remove revs only reachable from given bookmark"
-msgstr ""
-"Entfernt Revisionen, die nur vom angegebenen Lesezeichen aus erreichbar sind"
-
-msgid "hg strip [-k] [-f] [-n] [-B bookmark] REV..."
+msgstr "Entfernt Revisionen, die nur vom angegebenen Lesezeichen aus erreichbar sind"
+
+#, fuzzy
+msgid "hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV..."
 msgstr "hg strip [-k] [-f] [-n] [-B Lesezeichen] REV..."
 
 msgid "strip changesets and all their descendants from the repository"
@@ -6190,8 +6405,7 @@
 "    restore."
 msgstr ""
 "    Jeder entfernte Änderungssatz wird in ``.hg/strip-backup`` als Bündel\n"
-"    gespeichert (siehe :hg:`help bundle` und :hg:`help unbundle`). Sie "
-"können\n"
+"    gespeichert (siehe :hg:`help bundle` und :hg:`help unbundle`). Sie können\n"
 "    über :hg:`unbundle .hg/strip-backup/BUNDLE` wiederhergestellt werden,\n"
 "    wobei BUNDLE die von strip erstellte Datei ist. Beachten Sie, dass die\n"
 "    lokalen Versionsnummern sich für gewöhnlich nach dem Wiederherstellen\n"
@@ -6204,6 +6418,12 @@
 "    Benutzen Sie den Schalter --no-backup, um die Bündel zu entfernen,\n"
 "    wenn die Operation abgeschlossen ist."
 
+msgid ""
+"    Strip is not a history-rewriting operation and can be used on\n"
+"    changesets in the public phase. But if the stripped changesets have\n"
+"    been pushed to a remote repository you will likely pull them again."
+msgstr ""
+
 #, python-format
 msgid "bookmark '%s' not found"
 msgstr "Lesezeichen '%s' wurde nicht gefunden"
@@ -6240,14 +6460,10 @@
 "    selected guard, but will not be pushed if any negative guards\n"
 "    match the current guard. For example::"
 msgstr ""
-"    Verwenden Sie :hg:`qguard`, um die Wächter von Patches zu setzen oder "
-"zu\n"
-"    ändern, und dann qselect, um mq mitzuteilen, welche Wächter genutzt "
-"werden\n"
-"    sollen. Ein Patch wird übertragen, wenn er keine Wächter hat oder "
-"irgendein\n"
-"    positiver Wächter auf den aktuell gewählten Wächter zutrifft. Er wird "
-"nicht\n"
+"    Verwenden Sie :hg:`qguard`, um die Wächter von Patches zu setzen oder zu\n"
+"    ändern, und dann qselect, um mq mitzuteilen, welche Wächter genutzt werden\n"
+"    sollen. Ein Patch wird übertragen, wenn er keine Wächter hat oder irgendein\n"
+"    positiver Wächter auf den aktuell gewählten Wächter zutrifft. Er wird nicht\n"
 "    übertragen, wenn ein negativer Wächter auf den aktuellen zutrifft. Ein\n"
 "    Beispiel::"
 
@@ -6265,8 +6481,7 @@
 "    it has a negative match) but push bar.patch (because it has a\n"
 "    positive match)."
 msgstr ""
-"    Dies aktiviert den Wächter \"stable\". mq wird foo.patch überspringen "
-"(weil\n"
+"    Dies aktiviert den Wächter \"stable\". mq wird foo.patch überspringen (weil\n"
 "    er einen negativen Treffer aufweist), aber bar.patch übertragen (da er\n"
 "    einen positiven Treffer aufweist)."
 
@@ -6282,8 +6497,7 @@
 "    When no guards are active, patches with positive guards are\n"
 "    skipped and patches with negative guards are pushed."
 msgstr ""
-"    Verwenden Sie -n/--none, um die Wächter zu deaktivieren (keine "
-"Argumente\n"
+"    Verwenden Sie -n/--none, um die Wächter zu deaktivieren (keine Argumente\n"
 "    werden benötigt). Wenn keine Wächter aktiv sind, werden Patches mit\n"
 "    positiven Wächtern übersprungen und Patches mit negativen übertragen."
 
@@ -6295,10 +6509,8 @@
 "    guarded patches."
 msgstr ""
 "    qselect kann die Wächter von angewandten Patches ändern. Standardmäßig\n"
-"    werden geschützte Patches nicht vom Stapel entfernt. Verwenden Sie --"
-"pop,\n"
-"    um bis zum letzten angewandten Patch ohne Wächter zurückzugehen. "
-"Verwenden\n"
+"    werden geschützte Patches nicht vom Stapel entfernt. Verwenden Sie --pop,\n"
+"    um bis zum letzten angewandten Patch ohne Wächter zurückzugehen. Verwenden\n"
 "    Sie --reapply (impliziert --pop), um danach bis zum aktuellen Patch den\n"
 "    Stapel wiederherzustellen (wird geschützte Patches auslassen)."
 
@@ -6306,10 +6518,8 @@
 "    Use -s/--series to print a list of all guards in the series file\n"
 "    (no other arguments needed). Use -v for more information."
 msgstr ""
-"    Verwenden Sie -s/--series, um die Liste aller Wächter in dieser "
-"Seriendatei\n"
-"    auszugeben (keine Argumente werden benötigt). Verwenden Sie -v für "
-"weitere\n"
+"    Verwenden Sie -s/--series, um die Liste aller Wächter in dieser Seriendatei\n"
+"    auszugeben (keine Argumente werden benötigt). Verwenden Sie -v für weitere\n"
 "    Informationen."
 
 msgid "guards deactivated\n"
@@ -6317,15 +6527,11 @@
 
 #, python-format
 msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
-msgstr ""
-"Die Anzahl ungeschützter, nicht angewandter Patches hat sich von %d auf %d "
-"geändert.\n"
+msgstr "Die Anzahl ungeschützter, nicht angewandter Patches hat sich von %d auf %d geändert.\n"
 
 #, python-format
 msgid "number of guarded, applied patches has changed from %d to %d\n"
-msgstr ""
-"Die Anzahl geschützter, angewandter Patches hat sich von %d auf %d "
-"geändert.\n"
+msgstr "Die Anzahl geschützter, angewandter Patches hat sich von %d auf %d geändert.\n"
 
 msgid "guards in series file:\n"
 msgstr "Wächter in der Seriendatei:\n"
@@ -6421,18 +6627,13 @@
 "    das Erstellen neuer Reihen und das Löschen bereits bestehender."
 
 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)\". Specifying --active will "
-"print\n"
+"    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)\". Specifying --active will print\n"
 "    only the name of the active queue."
 msgstr ""
-"    Wenn ein Reihenname ausgelassen wird oder -l/--list angegeben wird, "
-"werden\n"
-"    die registrierten Reihen angezeigt - standardmäßig ist die Reihe \"normal"
-"\"\n"
+"    Wenn ein Reihenname ausgelassen wird oder -l/--list angegeben wird, werden\n"
+"    die registrierten Reihen angezeigt - standardmäßig ist die Reihe \"normal\"\n"
 "    registriert. Die aktuelle Reihe ist mit \"(aktiv)\" markiert. Durch\n"
 "    Angabe von --active wird nur der Name der aktiven Reihe angezeigt."
 
@@ -6442,20 +6643,16 @@
 "    currently active queue in the repository. Then the queue will only be\n"
 "    created and switching will fail."
 msgstr ""
-"    Um eine neue Reihe zu erzeugen, verwenden Sie -c/--create. Die Reihe "
-"wird\n"
+"    Um eine neue Reihe zu erzeugen, verwenden Sie -c/--create. Die Reihe wird\n"
 "    automatisch als aktiv mariert, es sei denn, es gibt bereits angewandte\n"
-"    Patches aus der aktuell aktiven Reihe im Archiv. In diesem Fall wird "
-"die\n"
+"    Patches aus der aktuell aktiven Reihe im Archiv. In diesem Fall wird die\n"
 "    neue Reihe nur erzeugt und das Wechseln wird fehlschlagen."
 
 msgid ""
-"    To delete an existing queue, use --delete. You cannot delete the "
-"currently\n"
+"    To delete an existing queue, use --delete. You cannot delete the currently\n"
 "    active queue."
 msgstr ""
-"    Um eine bestehende Reihe zu entfernen, benutzen Sie --delete. Sie können "
-"die\n"
+"    Um eine bestehende Reihe zu entfernen, benutzen Sie --delete. Sie können die\n"
 "    aktuell aktive Reihe nicht entfernen."
 
 msgid "patches applied - cannot set new queue active"
@@ -6471,8 +6668,7 @@
 msgstr " (aktiv)\n"
 
 msgid "invalid queue name, may not contain the characters \":\\/.\""
-msgstr ""
-"Ungültiger Name für die Reihe, er darf die Zeichen \":\\/.\" nicht enthalten."
+msgstr "Ungültiger Name für die Reihe, er darf die Zeichen \":\\/.\" nicht enthalten."
 
 #, python-format
 msgid "queue \"%s\" already exists"
@@ -6492,15 +6688,12 @@
 msgid "cannot commit over an applied mq patch"
 msgstr "Kann nicht über einem angewandten mq-Patch speichern"
 
-msgid "source has mq patches applied"
-msgstr "Die Quelle hat angewandte mq-Patches"
-
 #, python-format
 msgid "mq status file refers to unknown node %s\n"
 msgstr "Die mq-Statusdatei referenziert nicht existierenden Knoten %s\n"
 
-#, python-format
-msgid "Tag %s overrides mq patch of the same name\n"
+#, fuzzy, python-format
+msgid "tag %s overrides mq patch of the same name\n"
 msgstr "Das Tag %s überschreibt den mq-Patch mit demselben Namen\n"
 
 msgid "cannot import over an applied patch"
@@ -6542,24 +6735,25 @@
 msgid "hooks for sending email push notifications"
 msgstr "Hooks zum Senden von E-Mail-Benachrichtigungen beim Übertragen"
 
-msgid ""
-"This extension let you run hooks sending email notifications when\n"
-"changesets are being pushed, from the sending or receiving side."
+#, fuzzy
+msgid ""
+"This extension implements hooks to send email notifications when\n"
+"changesets are sent from or received by the local repository."
 msgstr ""
 "Diese Erweiterung ermöglicht das Senden von Benachrichtigungsemails,\n"
 "wannimmer Änderungssätze übertragen werden. Dies kann von der über-\n"
 "tragenden oder der empfangenden Seite aus geschehen."
 
+#, fuzzy
 msgid ""
 "First, enable the extension as explained in :hg:`help extensions`, and\n"
 "register the hook you want to run. ``incoming`` and ``changegroup`` hooks\n"
-"are run by the changesets receiver while the ``outgoing`` one is for\n"
-"the sender::"
+"are run when changesets are received, while ``outgoing`` hooks are for\n"
+"changesets sent to another repository::"
 msgstr ""
 "Zunächst muss die Erweiterung aktiviert werden \n"
 "(wie in :hg:`help extensions` beschrieben) und dann \n"
-"als Hook registriert werden.Die ``incoming``- und ``changegroup``-Hooks "
-"werden\n"
+"als Hook registriert werden.Die ``incoming``- und ``changegroup``-Hooks werden\n"
 "vom Änderungssatz-Empfänger ausgeführt, der\n"
 "``outgoing``-Hook ist für den Sender::"
 
@@ -6583,19 +6777,21 @@
 "  # eine E-Mail für jeden übertragenen Änderungssatz\n"
 "  outgoing.notify = python:hgext.notify.hook"
 
-msgid ""
-"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::"
+#, fuzzy
+msgid ""
+"This registers the hooks. To enable notification, subscribers must\n"
+"be assigned to repositories. The ``[usersubs]`` section maps multiple\n"
+"repositories to a given recipient. The ``[reposubs]`` section maps\n"
+"multiple recipients to a single repository::"
 msgstr ""
 "Schliesslich müssen noch die Abonnements für die Projektarchive definiert\n"
 "werden. Im Abschnitt ``[usersubs]`` kann man mehrere Archive einer Email\n"
 "zuweisen, in ``[reposubs]`` umgekehrt mehrere Emails für ein Archiv angeben."
 
+#, fuzzy
 msgid ""
 "  [usersubs]\n"
-"  # key is subscriber email, value is a comma-separated list of glob\n"
+"  # key is subscriber email, value is a comma-separated list of repo glob\n"
 "  # patterns\n"
 "  user@host = pattern"
 msgstr ""
@@ -6615,49 +6811,45 @@
 "  # Wert ist eine kommaseparierte Liste von Abonnenten-Emails\n"
 "  muster = benutzer@rechner"
 
+#, fuzzy
 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::"
+"root."
 msgstr ""
 "Die glob-Muster müssen auf den absoluten Pfad zum Archiv passen. Alle\n"
 "Abonnements können in einer eigenen Datei gesammelt werden und folgender-\n"
 "maßen in der Konfiguration eingebunden werden::"
 
 msgid ""
+"In order to place them under direct user management, ``[usersubs]`` and\n"
+"``[reposubs]`` sections may be placed in a separate ``hgrc`` file and\n"
+"incorporated by reference::"
+msgstr ""
+
+msgid ""
 "  [notify]\n"
 "  config = /path/to/subscriptionsfile"
 msgstr ""
 "  [notify]\n"
 "  config = /pfad/zur/abonnentendatei"
 
-msgid ""
-"Alternatively, they can be added to Mercurial configuration files by\n"
-"setting the previous entry to an empty value."
-msgstr ""
-"Alternativ (mit leerem Wert für ``notify.config``) können die Abonnements\n"
-"in der Mercurial-Konfigurationsdatei angegeben werden."
-
-msgid ""
-"At this point, notifications should be generated but will not be sent until "
-"you\n"
-"set the ``notify.test`` entry to ``False``."
+#, fuzzy
+msgid ""
+"Notifications will not be sent until the ``notify.test`` value is set\n"
+"to ``False``; see below."
 msgstr ""
 "Nach dieser Konfiguration werden die Benachrichtigungen nun generiert, aber\n"
 "noch nicht gesendet, bis der Wert von ``notify.test`` auf ``False`` gesetzt\n"
 "wird."
 
-msgid ""
-"Notifications content can be tweaked with the following configuration "
-"entries:"
+msgid "Notifications content can be tweaked with the following configuration entries:"
 msgstr ""
 "Der Inhalt der Benachrichtigungen kann mit der folgenden Konfiguration\n"
 "angepasst werden:"
 
 msgid ""
 "notify.test\n"
-"  If ``True``, print messages to stdout instead of sending them. Default: "
-"True."
+"  If ``True``, print messages to stdout instead of sending them. Default: True."
 msgstr ""
 "notify.test\n"
 "  Falls ``True`` werden die Nachrichten auf die Standardausgabe und nicht\n"
@@ -6665,31 +6857,28 @@
 
 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"
-"  Kommaseparierte Liste von Quellaktionen. Benachrichtigungen werden nur\n"
-"  gesendet, wenn die Änderungen von einer solchen Aktion ausgelöst wurden.\n"
-"  Quellen für ankommende Änderungen sind ``serve`` (Änderungen via http\n"
-"  oder ssh), ``pull`` (aktiv abgerufen), ``unbundle`` (per :hg:`unbundle`\n"
-"  eingefügt) oder ``push`` (lokal übertragen). Für ausgehende Änderungen\n"
-"  gibt es die gleichen, nur mit ``unbundle`` gegen ``bundle`` getauscht.\n"
-"  Voreinstellung: serve."
-
+"  Space-separated list of change sources. Notifications are activated only\n"
+"  when a changeset's source is in this list. Sources may be:"
+msgstr ""
+
+msgid ""
+"  :``serve``: changesets received via http or ssh\n"
+"  :``pull``: changesets received via ``hg pull``\n"
+"  :``unbundle``: changesets received via ``hg unbundle``\n"
+"  :``push``: changesets sent or received via ``hg push``\n"
+"  :``bundle``: changesets sent via ``hg unbundle``"
+msgstr ""
+
+#, fuzzy
+msgid "  Default: serve."
+msgstr " (Voreinstellung: %s)"
+
+#, fuzzy
 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"
+"  Number of leading slashes to strip from url paths. By default, notifications\n"
+"  reference repositories with their absolute path. ``notify.strip`` lets 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"
@@ -6701,12 +6890,8 @@
 
 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"
-"  Falls eine Abonnementen- oder die Sender-Adresse keine Domäne haben,\n"
-"  wird dieser Wert eingefügt."
+"  Default email domain for sender or recipients with no explicit domain."
+msgstr ""
 
 msgid ""
 "notify.style\n"
@@ -6722,44 +6907,49 @@
 "notify.template\n"
 "  Vorlage für das Formatieren der Emails."
 
+#, fuzzy
 msgid ""
 "notify.incoming\n"
-"  Template to use when run as incoming hook, override ``notify.template``."
+"  Template to use when run as an incoming hook, overriding ``notify.template``."
 msgstr ""
 "notify.incoming\n"
 "  Vorlage (mit höherer Priorität als ``notify.template``), falls die Aktion\n"
 "  durch einen 'incoming'-Hook ausgelöst wurde."
 
+#, fuzzy
 msgid ""
 "notify.outgoing\n"
-"  Template to use when run as outgoing hook, override ``notify.template``."
+"  Template to use when run as an outgoing hook, overriding ``notify.template``."
 msgstr ""
 "notify.outcoming\n"
 "  Vorlage (mit höherer Priorität als ``notify.template``), falls die Aktion\n"
 "  durch einen 'outcoming'-Hook ausgelöst wurde."
 
+#, fuzzy
 msgid ""
 "notify.changegroup\n"
-"  Template to use when running as changegroup hook, override\n"
+"  Template to use when running as a changegroup hook, overriding\n"
 "  ``notify.template``."
 msgstr ""
 "notify.changegroup\n"
 "  Vorlage (mit höherer Priorität als ``notify.template``), falls die Aktion\n"
 "  durch einen 'changegroup'-Hook ausgelöst wurde."
 
+#, fuzzy
 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."
+"  to disable the diff, or -1 to include all of it. Default: 300."
 msgstr ""
 "notify.maxdiff\n"
 "  Maximale Zeilenanzahl des Diffs in der Benachrichtigungsemail. Der Wert\n"
 "  0 unterbindet die Anzeige des Diffs, -1 wird das gesamte Diff ausgeben.\n"
 "  Voreinstellung: 300."
 
+#, fuzzy
 msgid ""
 "notify.maxsubject\n"
-"  Maximum number of characters in emails subject line. Default: 67."
+"  Maximum number of characters in email's subject line. Default: 67."
 msgstr ""
 "notify.maxsubject\n"
 "  Maximale Länge der Betreffszeile. Voreinstellung: 67."
@@ -6783,40 +6973,42 @@
 "  If set, append mails to this mbox file instead of sending. Default: None."
 msgstr ""
 "notify.mbox\n"
-"  Schreibe Nachrichten in mbox Datei, anstatt sie zu versenden. "
-"Voreinstellung: None"
-
+"  Schreibe Nachrichten in mbox Datei, anstatt sie zu versenden. Voreinstellung: None"
+
+#, fuzzy
 msgid ""
 "notify.fromauthor\n"
-"  If set, use the first committer of the changegroup for the \"From\" field "
-"of\n"
-"  the notification mail. If not set, take the user from the pushing repo.\n"
-"  Default: False."
+"  If set, use the committer of the first changeset in a changegroup for\n"
+"  the \"From\" field of the notification mail. If not set, take the user\n"
+"  from the pushing repo.  Default: False."
 msgstr ""
 "notify.fromauthor\n"
 "  Verwende den Autoren der ersten Änderungsgruppe als Absender der\n"
 "  Benachrichtigungsemail. Falls nicht gesetzt, verwende den Nutzer im\n"
 "  übertragenden Archiv. Voreinstellung: False."
 
-msgid ""
-"If set, the following entries will also be used to customize the "
+#, fuzzy
+msgid ""
+"If set, the following entries will also be used to customize the\n"
 "notifications:"
 msgstr ""
 "Durch Setzen der folgenden Einträge können die Benachrichtigungen weiter\n"
 "angepasst werden:"
 
+#, fuzzy
 msgid ""
 "email.from\n"
-"  Email ``From`` address to use if none can be found in generated email "
-"content."
+"  Email ``From`` address to use if none can be found in the generated\n"
+"  email content."
 msgstr ""
 "email.from\n"
 "  Die zu verwendende Senderadresse (``From``), falls die Vorlage keinen\n"
 "  Wert setzt."
 
+#, fuzzy
 msgid ""
 "web.baseurl\n"
-"  Root repository browsing URL to combine with repository paths when making\n"
+"  Root repository URL to combine with repository paths when making\n"
 "  references. See also ``notify.strip``."
 msgstr ""
 "web.baseurl\n"
@@ -6852,16 +7044,15 @@
 msgstr "notify: unterdrücke Benachrichtigung über Zusammenführung %d:%s\n"
 
 msgid "browse command output with an external pager"
-msgstr ""
-"Verwendet einen externen Pager zum Blättern in der Ausgabe von Befehlen"
+msgstr "Verwendet einen externen Pager zum Blättern in der Ausgabe von Befehlen"
 
 msgid "To set the pager that should be used, set the application variable::"
-msgstr ""
-"Um den zu verwendenden Pager zu setzen, setzen Sie die folgende Variable::"
-
+msgstr "Um den zu verwendenden Pager zu setzen, setzen Sie die folgende Variable::"
+
+#, fuzzy
 msgid ""
 "  [pager]\n"
-"  pager = less -FRSX"
+"  pager = less -FRX"
 msgstr ""
 "  [pager]\n"
 "  pager = less -FRSX"
@@ -7086,8 +7277,7 @@
 msgstr "Eine zu sendende Revision"
 
 msgid "run even when remote repository is unrelated (with -b/--bundle)"
-msgstr ""
-"Auch ausführen, wenn das entfernte Archiv keinen Bezug hat (mit -b/--bundle)"
+msgstr "Auch ausführen, wenn das entfernte Archiv keinen Bezug hat (mit -b/--bundle)"
 
 msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
 msgstr "Eine Basisrevision anstelle eines Ziels (mit -b/--bundle)"
@@ -7129,8 +7319,7 @@
 "    über den Patch eingefügt, wenn diffstat installiert ist."
 
 msgid "    Finally, the patch itself, as generated by :hg:`export`."
-msgstr ""
-"    Zum Schluss der Patch selbst, wie er von :hg:`export` generiert wird."
+msgstr "    Zum Schluss der Patch selbst, wie er von :hg:`export` generiert wird."
 
 msgid ""
 "    With the -d/--diffstat or -c/--confirm options, you will be presented\n"
@@ -7236,12 +7425,10 @@
 msgid ""
 "      hg email -b               # send bundle of all patches not in default\n"
 "      hg email -b DEST          # send bundle of all patches not in DEST\n"
-"      hg email -b -r 3000       # bundle of all ancestors of 3000 not in "
-"default\n"
+"      hg email -b -r 3000       # bundle of all ancestors of 3000 not in default\n"
 "      hg email -b -r 3000 DEST  # bundle of all ancestors of 3000 not in DEST"
 msgstr ""
-"      hg email -b               # bündelt alle Patches nicht im default-"
-"Ziel\n"
+"      hg email -b               # bündelt alle Patches nicht im default-Ziel\n"
 "      hg email -b DEST          # bündelt alle Patches nicht im ZIEL\n"
 "      hg email -b -r 3000 ZIEL  # bündelt Vorfahren von 3000 nicht im ZIEL"
 
@@ -7249,15 +7436,13 @@
 "      hg email -o -m mbox &&    # generate an mbox file...\n"
 "        mutt -R -f mbox         # ... and view it with mutt\n"
 "      hg email -o -m mbox &&    # generate an mbox file ...\n"
-"        formail -s sendmail \\   # ... and use formail to send from the "
-"mbox\n"
+"        formail -s sendmail \\   # ... and use formail to send from the mbox\n"
 "          -bm -t < mbox         # ... using sendmail"
 msgstr ""
 "      hg email -o -m mbox &&    # erzeugt eine mbox Datei ...\n"
 "        mutt -R -f mbox         # ... und zeigt sie mit mutt an\n"
 "      hg email -o -m mbox &&    # erzeugt eine mbox Datei ...\n"
-"        formail -s sendmail \\   # ... und benutzt formail, um davon zu "
-"versenden\n"
+"        formail -s sendmail \\   # ... und benutzt formail, um davon zu versenden\n"
 "          -bm -t < mbox         # ... mit sendmail"
 
 msgid ""
@@ -7269,10 +7454,6 @@
 "    [email] der Konfiguration aktiviert sein. Siehe hgrc(5) für Details.\n"
 "    "
 
-#, python-format
-msgid "comparing with %s\n"
-msgstr "Vergleiche mit %s\n"
-
 msgid "no changes found\n"
 msgstr "Keine Änderungen gefunden\n"
 
@@ -7295,8 +7476,8 @@
 "\n"
 "Bitte eine Einführung für die Patch-Serie eingeben."
 
-#, python-format
-msgid "This patch series consists of %d patches."
+#, fuzzy, python-format
+msgid "this patch series consists of %d patches."
 msgstr "Diese Patch-Serie besteht aus %d Patches."
 
 msgid "no recipient addresses provided"
@@ -7321,11 +7502,13 @@
 msgid "patchbomb canceled"
 msgstr "patchbomb abgebrochen"
 
-msgid "Displaying "
+#, fuzzy
+msgid "displaying "
 msgstr "Zeige "
 
-msgid "Sending "
-msgstr "Sende "
+#, fuzzy
+msgid "sending "
+msgstr "Sende"
 
 msgid "sending"
 msgstr "Sende"
@@ -7438,8 +7621,7 @@
 msgstr "Zeigt Dateinamen an, statt sie zu entfernen"
 
 msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
-msgstr ""
-"Beendet Dateinamen mit NUL zur Nutzung mit xargs (implizert -p/--print)"
+msgstr "Beendet Dateinamen mit NUL zur Nutzung mit xargs (implizert -p/--print)"
 
 msgid "hg purge [OPTION]... [DIR]..."
 msgstr "hg purge [OPTION]... [DIR]..."
@@ -7507,12 +7689,12 @@
 msgid "warning: %s\n"
 msgstr "Warnung: %s\n"
 
-#, python-format
-msgid "Removing file %s\n"
+#, fuzzy, python-format
+msgid "removing file %s\n"
 msgstr "Entferne Datei %s\n"
 
-#, python-format
-msgid "Removing directory %s\n"
+#, fuzzy, python-format
+msgid "removing directory %s\n"
 msgstr "Entferne Verzeichnis %s\n"
 
 msgid "command to move sets of revisions to a different ancestor"
@@ -7536,12 +7718,8 @@
 msgid "rebase from the specified changeset"
 msgstr "Verschiebe angefangen vom gegebenen Änderungssatz"
 
-msgid ""
-"rebase from the base of the specified changeset (up to greatest common "
-"ancestor of base and dest)"
-msgstr ""
-"verschiebt von der Basis des spezifizierten Changesets (bis zum größten "
-"gemeinsamen Vorgänger von base und dest)"
+msgid "rebase from the base of the specified changeset (up to greatest common ancestor of base and dest)"
+msgstr "verschiebt von der Basis des spezifizierten Changesets (bis zum größten gemeinsamen Vorgänger von base und dest)"
 
 msgid "rebase these revisions"
 msgstr "Verschiebe diese Revisionen"
@@ -7567,8 +7745,9 @@
 msgid "keep original branch names"
 msgstr "Erhält die ursprünglichen Zweignamen"
 
-msgid "force detaching of source from its original branch"
-msgstr "erzwingt ein Abkoppeln der Quelle von ihrem ursprünglichen Zweig"
+#, fuzzy
+msgid "(DEPRECATED)"
+msgstr "VERALTET"
 
 msgid "specify merge tool"
 msgstr "Methode für das Zusammenführen"
@@ -7579,16 +7758,11 @@
 msgid "abort an interrupted rebase"
 msgstr "Bricht eine unterbrochene Pfropfung ab"
 
-msgid ""
-"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
-"hg rebase {-a|-c}"
-msgstr ""
-"hg rebase [-s REV | -b REV] [-d REV] [Optionen]\n"
-"hg rebase {-a|-c}"
+msgid "[-s REV | -b REV] [-d REV] [OPTION]"
+msgstr ""
 
 msgid "move changeset (and descendants) to a different branch"
-msgstr ""
-"Verschiebt Versionen (und ihre Nachfolger) auf einen abweichenden Zweig"
+msgstr "Verschiebt Versionen (und ihre Nachfolger) auf einen abweichenden Zweig"
 
 msgid ""
 "    Rebase uses repeated merging to graft changesets from one part of\n"
@@ -7596,8 +7770,7 @@
 "    useful for linearizing *local* changes relative to a master\n"
 "    development tree."
 msgstr ""
-"    Rebase nutzt wiederholtes Zusammenführen um Versionen von einem Teil "
-"der\n"
+"    Rebase nutzt wiederholtes Zusammenführen um Versionen von einem Teil der\n"
 "    Versionshistorie auf einen anderen zu pfropfen. Dies ist nützlich, um\n"
 "    *lokale* Änderungen in einem Hauptentwicklunszweig zu linearisieren."
 
@@ -7670,8 +7843,7 @@
 "    the intended source branch)."
 msgstr ""
 "    Als Folge der automatischen Auswahlregeln für Quelle und Ziel wird\n"
-"    (im Gegensatz zu einer Zusammenführung) keine Verschiebung "
-"durchgeführt,\n"
+"    (im Gegensatz zu einer Zusammenführung) keine Verschiebung durchgeführt,\n"
 "    wenn der jüngere von zwei Köpfen eines Zweiges aktuell ist. In diesem\n"
 "    Falle (z.B. bei lokaler Versionsübernahme nach einem Abrufen), muss\n"
 "    eine Quelle und/oder ein Ziel explizit angegeben werden. Dieser Fall\n"
@@ -7704,9 +7876,6 @@
 msgid "cannot use collapse with continue or abort"
 msgstr "collapse kann nicht mit continue oder abort genutzt werden"
 
-msgid "cannot use detach with continue or abort"
-msgstr "detach kann nicht mit continue oder abort genutzt werden"
-
 msgid "abort and continue do not allow specifying revisions"
 msgstr "abort und continue erlauben keine Angabe einer Revision"
 
@@ -7722,12 +7891,6 @@
 msgid "cannot specify both a revision and a source"
 msgstr "Revision und Quelle dürfen nicht gleichzeitig angegeben werden"
 
-msgid "detach requires a revision to be specified"
-msgstr "detach benötigt eine Revision"
-
-msgid "cannot specify a base with detach"
-msgstr "detach erwartet keine Basis"
-
 msgid "can't remove original changesets with unrebased descendants"
 msgstr "Kann Änderungssatz nicht ohne dessen Nachfahren verschieben"
 
@@ -7754,8 +7917,7 @@
 msgstr "Änderungssätze"
 
 msgid "unresolved conflicts (see hg resolve, then hg rebase --continue)"
-msgstr ""
-"ungelöste Konflikte (siehe hg resolve, fahre mit hg rebase --continue fort)"
+msgstr "ungelöste Konflikte (siehe hg resolve, fahre mit hg rebase --continue fort)"
 
 #, python-format
 msgid "no changes, revision %d skipped\n"
@@ -7775,25 +7937,21 @@
 msgstr "%d Revisionen wurden übersprungen\n"
 
 msgid "unable to collapse, there is more than one external parent"
-msgstr ""
-"Zusammenfalten nicht möglich: es gibt mehr als einen externen Vorgänger"
+msgstr "Zusammenfalten nicht möglich: es gibt mehr als einen externen Vorgänger"
 
 #, python-format
 msgid "cannot use revision %d as base, result would have 3 parents"
-msgstr ""
-"Revision %d kann nicht als Basis genutzt werden: das Ergebnis hätte 3 "
-"Vorgänger"
+msgstr "Revision %d kann nicht als Basis genutzt werden: das Ergebnis hätte 3 Vorgänger"
 
 msgid "no rebase in progress"
 msgstr "Keine vorherige Verschiebung zur Wiederaufnahme"
 
-msgid "warning: immutable rebased changeset detected, can't abort\n"
-msgstr ""
-"Warnung: Unveränderbare Änderungssätze gefunden. Kann nicht abbrechen\n"
+#, fuzzy, python-format
+msgid "can't abort rebase due to immutable changesets %s"
+msgstr "Nicht veränderbarer Änderungssatz %s kann nicht verschoben werden"
 
 msgid "warning: new changesets detected on target branch, can't abort\n"
-msgstr ""
-"Warnung: Neue Änderungssätze auf Zielzweig gefunden. Kann nicht abbrechen\n"
+msgstr "Warnung: Neue Änderungssätze auf Zielzweig gefunden. Kann nicht abbrechen\n"
 
 msgid "rebase aborted\n"
 msgstr "Verschiebung abgebrochen\n"
@@ -7846,7 +8004,7 @@
 msgstr "%d Hunks, %d Zeilen geändert\n"
 
 msgid "[Ynesfdaq?]"
-msgstr "[jnbsdfab?]"
+msgstr "[jnesdfab?]"
 
 msgid "&Yes, record this change"
 msgstr "&Ja - übernimmt diese Änderung"
@@ -7855,7 +8013,7 @@
 msgstr "&Nein, überspringt diese Änderung"
 
 msgid "&Edit the change manually"
-msgstr "Änderung manuell &bearbeiten"
+msgstr "Änderung manuell &editieren"
 
 msgid "&Skip remaining changes to this file"
 msgstr "Über&springe die restlichen Änderungen an dieser Datei"
@@ -7992,9 +8150,7 @@
 msgstr "Nicht-interaktive Ausführung, nutze stattdessen '%s'"
 
 msgid "cannot partially commit a merge (use \"hg commit\" instead)"
-msgstr ""
-"Eine Zusammenführung kann nicht teilweise übernommen werden (verwende :hg:"
-"`commit`)"
+msgstr "Eine Zusammenführung kann nicht teilweise übernommen werden (verwende :hg:`commit`)"
 
 msgid "no changes to record\n"
 msgstr "Keine Änderungen zu übernehmen\n"
@@ -8065,9 +8221,6 @@
 msgid "hardlinks are not supported on this system"
 msgstr "Harte Verknüpfungen werden von diesem System nicht unterstützt"
 
-msgid "must specify local origin repository"
-msgstr "Lokales Quellarchiv muss angegeben werden"
-
 #, python-format
 msgid "relinking %s to %s\n"
 msgstr "Wiederverknüpft: %s nach %s\n"
@@ -8177,8 +8330,7 @@
 msgstr ""
 
 msgid "share a common history between several working directories"
-msgstr ""
-"Eine gemeinsame Historie zwischen mehreren Arbeitsverzeichnissen teilen"
+msgstr "Eine gemeinsame Historie zwischen mehreren Arbeitsverzeichnissen teilen"
 
 msgid "create a new shared repository"
 msgstr "Erzeuge ein neues gemeinsames Archiv"
@@ -8260,13 +8412,13 @@
 msgid "can only omit patchfile if merging"
 msgstr ""
 
-#, python-format
-msgid "%s: empty changeset"
-msgstr "%s: leerer Änderungssatz"
-
 msgid "fix up the merge and run hg transplant --continue"
 msgstr ""
 
+#, fuzzy, python-format
+msgid "skipping emptied changeset %s\n"
+msgstr "Entfernt berichtigten Änderungssatz %s\n"
+
 #, python-format
 msgid "%s transplanted as %s\n"
 msgstr ""
@@ -8366,7 +8518,7 @@
 msgstr ""
 
 msgid ""
-"    :hg:`transplant --branch REVISION --all` will transplant the\n"
+"    :hg:`transplant --branch REV --all` will transplant the\n"
 "    selected branch (up to the named revision) onto your current\n"
 "    working directory."
 msgstr ""
@@ -8518,8 +8670,7 @@
 "  # or ** = macdecode:"
 msgstr ""
 
-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 ""
 
 msgid ""
@@ -8548,7 +8699,7 @@
 msgstr ""
 
 #, python-format
-msgid "Attempt to commit or push text file(s) using %s line endings\n"
+msgid "attempt to commit or push text file(s) using %s line endings\n"
 msgstr ""
 
 #, python-format
@@ -8582,12 +8733,8 @@
 "** = %sdecode:\n"
 msgstr ""
 
-msgid ""
-"win32text is deprecated: http://mercurial.selenic.com/wiki/"
-"Win32TextExtension\n"
-msgstr ""
-"win32text ist veraltet: http://mercurial.selenic.com/wiki/"
-"Win32TextExtension\n"
+msgid "win32text is deprecated: http://mercurial.selenic.com/wiki/Win32TextExtension\n"
+msgstr "win32text ist veraltet: http://mercurial.selenic.com/wiki/Win32TextExtension\n"
 
 msgid "discover and advertise repositories on the local network"
 msgstr ""
@@ -8855,14 +9002,29 @@
 msgid "%s: no key named '%s'"
 msgstr "%s: kein Schlüsselwort '%s'"
 
-#, python-format
-msgid "Found revision %s from %s\n"
+#, fuzzy, python-format
+msgid "found revision %s from %s\n"
 msgstr "Gefundene Revision %s vom %s\n"
 
 msgid "revision matching date not found"
 msgstr "Keine zum Datum passende Revision gefunden"
 
 #, python-format
+msgid "cannot follow file not in parent revision: \"%s\""
+msgstr "Kann in Vorgängerrevision fehlender Datei nicht folgen: \"%s\""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr "Kann fehlender Datei nicht folgen: \"%s\""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr "Kopien/Umbenennungen können nur zu expliziten Dateinamen verfolgt werden"
+
+#, python-format
+msgid "-G/--graph option is incompatible with --%s"
+msgstr "Option -G/--graph ist inkompatibel zu --%s"
+
+#, python-format
 msgid "adding %s\n"
 msgstr "Füge %s hinzu\n"
 
@@ -8887,8 +9049,7 @@
 msgstr "Entfernt berichtigten Änderungssatz %s\n"
 
 msgid "HG: Enter commit message.  Lines beginning with 'HG:' are removed."
-msgstr ""
-"HG: Bitte gib eine Versions-Meldung ein. Zeilen beginnend mit 'HG:' werden"
+msgstr "HG: Bitte gib eine Versions-Meldung ein. Zeilen beginnend mit 'HG:' werden"
 
 msgid "HG: Leave message empty to abort commit."
 msgstr "HG: entfernt. Leere Versionsmeldung wird das Übernehmen abbrechen."
@@ -8956,9 +9117,7 @@
 msgstr "Wechselt das Arbeitsverzeichnis"
 
 msgid "do not prompt, automatically pick the first choice for all prompts"
-msgstr ""
-"Nicht nachfragen, automatisch die erste Auswahlmöglichkeit für alle Fragen "
-"wählen"
+msgstr "Nicht nachfragen, automatisch die erste Auswahlmöglichkeit für alle Fragen wählen"
 
 msgid "suppress output"
 msgstr "Unterdrückt Ausgabe"
@@ -8967,9 +9126,7 @@
 msgstr "Ausgabe weiterer Informationen"
 
 msgid "set/override config option (use 'section.name=value')"
-msgstr ""
-"Setze/Überschreibe Konfigurationsoption: %s (nutze --config Abschnitt."
-"Name=Wert)"
+msgstr "Setze/Überschreibe Konfigurationsoption: %s (nutze --config Abschnitt.Name=Wert)"
 
 msgid "CONFIG"
 msgstr ""
@@ -9017,8 +9174,7 @@
 msgstr "Spezifiziert den hg-Befehl, der entfernt ausgeführt wird"
 
 msgid "do not verify server certificate (ignoring web.cacerts config)"
-msgstr ""
-"Server-Zertifikat nicht überprüfen (web.cacerts-Konfiguration ignorieren)"
+msgstr "Server-Zertifikat nicht überprüfen (web.cacerts-Konfiguration ignorieren)"
 
 msgid "PATTERN"
 msgstr ""
@@ -9059,6 +9215,9 @@
 msgid "output diffstat-style summary of changes"
 msgstr "Zusammenfassung der Änderungen im diffstat-Stil"
 
+msgid "show the revision DAG"
+msgstr "Zeigt den Revisions-DAG"
+
 msgid "treat all files as text"
 msgstr "Behandelt alle Dateien als Text"
 
@@ -9156,21 +9315,21 @@
 "    ``.hgignore``. As with add, these changes take effect at the next\n"
 "    commit."
 msgstr ""
-"    Neue Dateien werden ignoriert, wenn sie einem der Muster aus ``."
-"hgignore``\n"
+"    Neue Dateien werden ignoriert, wenn sie einem der Muster aus ``.hgignore``\n"
 "    entsprechen. Genau wie add, wirken diese Änderungen erst beim nächsten\n"
 "    Übernehmen (commit)."
 
-msgid ""
-"    Use the -s/--similarity option to detect renamed files. With a\n"
-"    parameter greater than 0, this compares every removed file with\n"
-"    every added file and records those similar enough as renames. This\n"
+#, fuzzy
+msgid ""
+"    Use the -s/--similarity option to detect renamed files. This\n"
 "    option takes a percentage between 0 (disabled) and 100 (files must\n"
-"    be identical) as its parameter. Detecting renamed files this way\n"
+"    be identical) as its parameter. With a parameter greater than 0,\n"
+"    this compares every removed file with every added file and records\n"
+"    those similar enough as renames. Detecting renamed files this way\n"
 "    can be expensive. After using this option, :hg:`status -C` can be\n"
-"    used to check which files were identified as moved or renamed.\n"
-"    If this option is not specified, only renames of identical files\n"
-"    are detected."
+"    used to check which files were identified as moved or renamed. If\n"
+"    not specified, -s/--similarity defaults to 100 and only renames of\n"
+"    identical files are detected."
 msgstr ""
 "    Nutze die Option -s/--similarity, um umbenannte Dateien zu entdecken.\n"
 "    Mit einem Parameter größer 0 wird jede gelöschte Datei mit jeder\n"
@@ -9243,8 +9402,7 @@
 "    nor desirable."
 msgstr ""
 "    Ohne den Schalter -a/--text wird die Verarbeitung von Binärdateien\n"
-"    vermieden. Mit -a werden auch solche Dateien verarbeitet, "
-"wahrscheinlich\n"
+"    vermieden. Mit -a werden auch solche Dateien verarbeitet, wahrscheinlich\n"
 "    mit unerwünschtem Ergebnis."
 
 msgid "at least one filename or pattern is required"
@@ -9282,8 +9440,7 @@
 "    By default, the revision used is the parent of the working\n"
 "    directory; use -r/--rev to specify a different revision."
 msgstr ""
-"    Standardmäßig wird die Vorgängerversion der im Arbeitsverzeichnis "
-"gefundenen\n"
+"    Standardmäßig wird die Vorgängerversion der im Arbeitsverzeichnis gefundenen\n"
 "    verwendet. Eine andere Reversion kann mit \"-r/--rev\" angegeben werden."
 
 msgid ""
@@ -9349,8 +9506,7 @@
 msgstr "Projektarchiv-Wurzel kann nicht als Ziel angegeben werden"
 
 msgid "cannot archive plain files to stdout"
-msgstr ""
-"Ungepacktes Archiv kann nicht auf der Standardausgabe ausgegeben werden"
+msgstr "Ungepacktes Archiv kann nicht auf der Standardausgabe ausgegeben werden"
 
 msgid "merge with old dirstate parent after backout"
 msgstr "Führt mit Vorgänger im Status vor Rücknahme zusammen"
@@ -9502,8 +9658,7 @@
 msgid "      Some examples:"
 msgstr "      Einige Beispiele:"
 
-msgid ""
-"      - start a bisection with known bad revision 12, and good revision 34::"
+msgid "      - start a bisection with known bad revision 12, and good revision 34::"
 msgstr ""
 
 msgid ""
@@ -9512,8 +9667,7 @@
 msgstr ""
 
 msgid ""
-"      - advance the current bisection by marking current revision as good "
-"or\n"
+"      - advance the current bisection by marking current revision as good or\n"
 "        bad::"
 msgstr ""
 
@@ -9523,8 +9677,7 @@
 msgstr ""
 
 msgid ""
-"      - mark the current revision, or a known revision, to be skipped (eg. "
-"if\n"
+"      - mark the current revision, or a known revision, to be skipped (eg. if\n"
 "        that revision is not usable because of another issue)::"
 msgstr ""
 
@@ -9580,8 +9733,7 @@
 msgstr ""
 
 msgid "      See :hg:`help revsets` for more about the `bisect()` keyword."
-msgstr ""
-"      Siehe :hg:`help revsets' für mehr Infos über den bisect() Schlüssel."
+msgstr "      Siehe :hg:`help revsets' für mehr Infos über den bisect() Schlüssel."
 
 msgid "The first good revision is:\n"
 msgstr "Die erste fehlerfreie Revision ist:\n"
@@ -9632,8 +9784,8 @@
 msgid "%s killed"
 msgstr "%s gestorben"
 
-#, python-format
-msgid "Changeset %d:%s: %s\n"
+#, fuzzy, python-format
+msgid "changeset %d:%s: %s\n"
 msgstr "Änderungssatz %d:%s: %s\n"
 
 #, python-format
@@ -9692,13 +9844,11 @@
 msgid ""
 "    Bookmarks can be pushed and pulled between repositories (see :hg:`help\n"
 "    push` and :hg:`help pull`). This requires both the local and remote\n"
-"    repositories to support bookmarks. For versions prior to 1.8, this "
-"means\n"
+"    repositories to support bookmarks. For versions prior to 1.8, this means\n"
 "    the bookmarks extension must be enabled."
 msgstr ""
 "    Lesezeichen können zwischen Mercurial-Archiven ausgetauscht werden\n"
-"    (siehe :hg:`help push` bzw. :hg:`help pull`). Beide Archive müssen "
-"dafür\n"
+"    (siehe :hg:`help push` bzw. :hg:`help pull`). Beide Archive müssen dafür\n"
 "    Lesezeichen unterstützen. Bis Version 1.8 muss hierfür die\n"
 "    Lesezeichenerweiterung (bookmarks extension) eingeschaltet werden."
 
@@ -9737,8 +9887,7 @@
 msgstr "Ein Lesezeichenname darf nicht ausschließlich aus Leerraum bestehen"
 
 msgid "a bookmark cannot have the name of an existing branch"
-msgstr ""
-"Ein Lesezeichen darf nicht denselben Namen wie ein existierender Zweig haben"
+msgstr "Ein Lesezeichen darf nicht denselben Namen wie ein existierender Zweig haben"
 
 msgid "no bookmarks set\n"
 msgstr "Keine Lesezeichen gesetzt\n"
@@ -9757,8 +9906,7 @@
 
 msgid ""
 "    .. note::\n"
-"       Branch names are permanent and global. Use :hg:`bookmark` to create "
-"a\n"
+"       Branch names are permanent and global. 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 ""
@@ -9788,8 +9936,7 @@
 "    the parent of the working directory, negating a previous branch\n"
 "    change."
 msgstr ""
-"    Nutze -C/--clean um den neuen Namen rückgängig zu machen. Die "
-"Arbeitskopie\n"
+"    Nutze -C/--clean um den neuen Namen rückgängig zu machen. Die Arbeitskopie\n"
 "    hat dann wieder den selben Namen wie der Vorgänger im Projektarchiv."
 
 msgid ""
@@ -9847,8 +9994,7 @@
 "    Zweig gilt als aktiv, wenn er echte Köpfe besitzt."
 
 msgid "    Use the command :hg:`update` to switch to an existing branch."
-msgstr ""
-"    Zum Wechsel auf einen anderen (existierenden) Zweig siehe :hg:`update`."
+msgstr "    Zum Wechsel auf einen anderen (existierenden) Zweig siehe :hg:`update`."
 
 msgid ""
 "    Returns 0.\n"
@@ -9920,8 +10066,7 @@
 "    command. This is useful when direct push and pull are not\n"
 "    available or when exporting an entire repository is undesirable."
 msgstr ""
-"    Die Bündeldatei kann mit üblichen Mitteln transportiert und auf ein "
-"anderes\n"
+"    Die Bündeldatei kann mit üblichen Mitteln transportiert und auf ein anderes\n"
 "    Archiv mit dem 'unbundle' oder 'pull'-Befehl angewandt werden.\n"
 "    Dies ist nützlich wenn ein direktes Schieben oder Herunterladen von\n"
 "    Änderungen nicht verfügbar ist oder der Export eines kompletten Archivs\n"
@@ -9932,8 +10077,7 @@
 "    permissions, copy/rename information, and revision history."
 msgstr ""
 "    Die Anwendung von Bündeln bewahrt die Inhalte aller Änderungssätze,\n"
-"    Berechtigungen, Kopier/Umbennungs-Informationen und die "
-"Revisionshistorie."
+"    Berechtigungen, Kopier/Umbennungs-Informationen und die Revisionshistorie."
 
 msgid ""
 "    Returns 0 on success, 1 if no changes found.\n"
@@ -9961,8 +10105,7 @@
 msgstr "[OPTION]... DATEI..."
 
 msgid "output the current or given revision of files"
-msgstr ""
-"Gibt den Inhalt von Dateien in der aktuellen oder angegebenen Revision aus"
+msgstr "Gibt den Inhalt von Dateien in der aktuellen oder angegebenen Revision aus"
 
 msgid ""
 "    Print the specified files as they were at the given revision. If\n"
@@ -9980,8 +10123,7 @@
 "    for the export command, with the following additions:"
 msgstr ""
 "    Die Ausgabe kann in eine Datei erfolgen. In diesem Fall wird der Name\n"
-"    der Datei mit einem Formatstring vorgegeben. Die Formatierungsregeln "
-"sind\n"
+"    der Datei mit einem Formatstring vorgegeben. Die Formatierungsregeln sind\n"
 "    dem 'export'-Befehl analog, mit folgenden Ergänzungen::"
 
 msgid ""
@@ -10018,9 +10160,7 @@
 msgid ""
 "    If no destination directory name is specified, it defaults to the\n"
 "    basename of the source."
-msgstr ""
-"    Wird kein Zielverzeichnis angegeben, wird der Basisname der Quelle "
-"genutzt."
+msgstr "    Wird kein Zielverzeichnis angegeben, wird der Basisname der Quelle genutzt."
 
 msgid ""
 "    The location of the source is added to the new repository's\n"
@@ -10073,8 +10213,7 @@
 "      --pull option to avoid hardlinking."
 msgstr ""
 "      Aus Effizienzgründen werden 'hardlinks' für das Klonen genutzt, wann\n"
-"      immer Quelle und Ziel auf dem selben Dateisystem liegen (dies gilt "
-"nur\n"
+"      immer Quelle und Ziel auf dem selben Dateisystem liegen (dies gilt nur\n"
 "      für die Daten des Archivs, nicht für die Arbeitskopie). Einige\n"
 "      Dateisyteme, wie etwa AFS, implementieren 'hardlinks' fehlerhaft,\n"
 "      erzeugen dabei aber keine Fehlermeldung. Dann muss die --pull Option\n"
@@ -10099,13 +10238,11 @@
 "      place their metadata under the .hg directory, such as mq."
 msgstr ""
 "      Dies ist der schnellste Weg zu klonen, aber nicht immer sicher.\n"
-"      Diese Operation ist nicht atomar (das Archiv darf während der "
-"Operation\n"
+"      Diese Operation ist nicht atomar (das Archiv darf während der Operation\n"
 "      nicht modifiziert wird) und es muss sichergestellt werden, dass der\n"
 "      genutzte Editor 'hardlinks' auflöst (vim, emacs und die meisten Linux\n"
 "      Kernel Tools tun dies). Außerdem ist dies inkompatibel mit einigen\n"
-"      Erweiterungen, die Metadaten unter dem .hg Verzeichnis ablegen, z.B. "
-"mq."
+"      Erweiterungen, die Metadaten unter dem .hg Verzeichnis ablegen, z.B. mq."
 
 msgid ""
 "      Mercurial will update the working directory to the first applicable\n"
@@ -10127,8 +10264,7 @@
 "      h) tip"
 msgstr ""
 "      a) null , bei -U oder wenn das Quellarchiv keine Änderungssätze hat\n"
-"      b) Bei -u . und wenn es sich um ein lokales Archiv handelt, den "
-"ersten\n"
+"      b) Bei -u . und wenn es sich um ein lokales Archiv handelt, den ersten\n"
 "         Vorgänger der Arbeitskopie des Quellarchivs\n"
 "      c) Den Änderungssatz, der mit -u angegeben wurde (falls dies der Name\n"
 "         eines Zweiges ist, bedeutet das der neueste Kopf dieses Zweiges)\n"
@@ -10141,8 +10277,7 @@
 "         Spitze befindet      h) Die Spitze"
 
 msgid "      - clone a remote repository to a new directory named hg/::"
-msgstr ""
-"      - Klont ein entferntes Projektarchiv in ein neues Verzeichnis hg/::"
+msgstr "      - Klont ein entferntes Projektarchiv in ein neues Verzeichnis hg/::"
 
 msgid "          hg clone http://selenic.com/hg"
 msgstr "          hg clone http://selenic.com/hg"
@@ -10153,11 +10288,8 @@
 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 ""
-"      - Von einem absoluten Pfad auf einem SSH-Server klonen (Beachten Sie "
-"den Doppelschrägstrich)::"
+msgid "      - clone from an absolute path on an ssh server (note double-slash)::"
+msgstr "      - Von einem absoluten Pfad auf einem SSH-Server klonen (Beachten Sie den Doppelschrägstrich)::"
 
 msgid "          hg clone ssh://user@server//home/projects/alpha/"
 msgstr "          hg clone ssh://user@server//home/projects/alpha/"
@@ -10170,8 +10302,7 @@
 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::"
+msgid "      - create a repository without changesets after a particular revision::"
 msgstr ""
 
 msgid "          hg clone -r 04e544 experimental/ good/"
@@ -10187,24 +10318,20 @@
 msgstr "    Siehe auch :hg:`help urls` für das Format von Adressangaben."
 
 msgid "cannot specify both --noupdate and --updaterev"
-msgstr ""
-"Es können nicht gleichzeitig --noupdate und --updaterev angegeben werden"
+msgstr "Es können nicht gleichzeitig --noupdate und --updaterev angegeben werden"
 
 msgid "mark new/missing files as added/removed before committing"
 msgstr "Markiert neue/fehlende Dateien als hinzugefügt/entfernt"
 
 msgid "mark a branch as closed, hiding it from the branch list"
-msgstr ""
-"Markiert einen Branch als geschlossen und blendet ihn in der Branchlist aus"
+msgstr "Markiert einen Branch als geschlossen und blendet ihn in der Branchlist aus"
 
 #, fuzzy
 msgid "amend the parent of the working dir"
 msgstr "Berichtige die Vorgängerversion des Arbeitsverzeichnisses"
 
 msgid "commit the specified files or all outstanding changes"
-msgstr ""
-"Übernimmt Änderungen der angegebenen Dateien oder alle ausstehenden "
-"Änderungen ins Archiv"
+msgstr "Übernimmt Änderungen der angegebenen Dateien oder alle ausstehenden Änderungen ins Archiv"
 
 msgid ""
 "    Commit changes to the given files into the repository. Unlike a\n"
@@ -10321,10 +10448,8 @@
 "    directory, copies are put in that directory. If dest is a file,\n"
 "    the source must be a single file."
 msgstr ""
-"    Markiert das Ziel als Kopie der Quelle, so dass es die Versionshistorie "
-"der\n"
-"    Quelle bis zu diesem Zeitpunkt teilt. Wenn mehrere Quellen angegeben "
-"sind,\n"
+"    Markiert das Ziel als Kopie der Quelle, so dass es die Versionshistorie der\n"
+"    Quelle bis zu diesem Zeitpunkt teilt. Wenn mehrere Quellen angegeben sind,\n"
 "    muss das Ziel ein Verzeichnis sein."
 
 msgid ""
@@ -10332,20 +10457,16 @@
 "    exist in the working directory. If invoked with -A/--after, the\n"
 "    operation is recorded, but no copying is performed."
 msgstr ""
-"    Normalerweise kopiert dieser Befehl auch den Inhalt der Datei(en) wie "
-"sie\n"
-"    im Arbeitsverzeichnis vorliegt. Existiert das Ziel jedoch schon, so "
-"kann\n"
-"    dieses durch Angabe der Option -A/--after als Kopie nachträglich "
-"markiert\n"
+"    Normalerweise kopiert dieser Befehl auch den Inhalt der Datei(en) wie sie\n"
+"    im Arbeitsverzeichnis vorliegt. Existiert das Ziel jedoch schon, so kann\n"
+"    dieses durch Angabe der Option -A/--after als Kopie nachträglich markiert\n"
 "    werden."
 
 msgid ""
 "    This command takes effect with the next commit. To undo a copy\n"
 "    before that, see :hg:`revert`."
 msgstr ""
-"    Die neue Datei wird wie üblich nicht sofort übernommen, sondern "
-"existiert\n"
+"    Die neue Datei wird wie üblich nicht sofort übernommen, sondern existiert\n"
 "    als lokale  Änderung im Arbeitsverzeichnis. Sie kann durch :hg:`revert`\n"
 "    rückgängig gemacht werden."
 
@@ -10389,8 +10510,7 @@
 msgstr "    Elemente:"
 
 msgid ""
-"     - \"+n\" is a linear run of n nodes based on the current default "
-"parent\n"
+"     - \"+n\" is a linear run of n nodes based on the current default parent\n"
 "     - \".\" is a single node based on the current default parent\n"
 "     - \"$\" resets the default parent to null (implied at the start);\n"
 "           otherwise the default parent is always the last node created\n"
@@ -10400,7 +10520,8 @@
 "     - \"/p2\" is a merge of the preceding node and p2\n"
 "     - \":tag\" defines a local tag for the preceding node\n"
 "     - \"@branch\" sets the named branch for subsequent nodes\n"
-"     - \"#...\\n\" is a comment up to the end of the line"
+"     - \"#...\\n"
+"\" is a comment up to the end of the line"
 msgstr ""
 
 msgid "    Whitespace between the above elements is ignored."
@@ -10410,8 +10531,7 @@
 msgstr ""
 
 msgid ""
-"     - a number n, which references the node curr-n, where curr is the "
-"current\n"
+"     - a number n, which references the node curr-n, where curr is the current\n"
 "       node, or\n"
 "     - the name of a local tag you placed earlier using \":tag\", or\n"
 "     - empty to denote the default parent."
@@ -10419,8 +10539,7 @@
 
 msgid ""
 "    All string valued-elements are either strictly alphanumeric, or must\n"
-"    be enclosed in double quotes (\"...\"), with \"\\\" as escape "
-"character.\n"
+"    be enclosed in double quotes (\"...\"), with \"\\\" as escape character.\n"
 "    "
 msgstr ""
 
@@ -10544,6 +10663,14 @@
 msgid "runs the changeset discovery protocol in isolation"
 msgstr ""
 
+#, fuzzy
+msgid "apply the filespec on this revision"
+msgstr "Listet geänderte Dateien einer Revision"
+
+#, fuzzy
+msgid "[-r REV] FILESPEC"
+msgstr "[-r REV] DATEI"
+
 msgid "parse and apply a fileset specification"
 msgstr ""
 
@@ -10566,8 +10693,7 @@
 msgstr ""
 
 msgid ""
-"    Every ID must be a full-length hex node id string. Saves the bundle to "
-"the\n"
+"    Every ID must be a full-length hex node id string. Saves the bundle to the\n"
 "    given file.\n"
 "    "
 msgstr ""
@@ -10597,15 +10723,19 @@
 msgid "test Mercurial installation"
 msgstr "Testet die Mercurial-Installation"
 
-#, python-format
-msgid "Checking encoding (%s)...\n"
+#, fuzzy, python-format
+msgid "checking encoding (%s)...\n"
 msgstr "Prüfe Kodierung (%s)...\n"
 
 msgid " (check that your locale is properly set)\n"
 msgstr " (Stelle sicher, dass locale richtig gesetzt ist!)\n"
 
-#, python-format
-msgid "Checking installed modules (%s)...\n"
+#, fuzzy, python-format
+msgid "checking Python lib (%s)...\n"
+msgstr "Prüfe Kodierung (%s)...\n"
+
+#, fuzzy, python-format
+msgid "checking installed modules (%s)...\n"
 msgstr "Prüfe installierte Module (%s)...\n"
 
 msgid " One or more extensions could not be found"
@@ -10614,14 +10744,15 @@
 msgid " (check that you compiled the extensions)\n"
 msgstr " (Stelle sicher, dass die Erweiterungen compiliert wurden!)\n"
 
-#, python-format
-msgid "Checking templates (%s)...\n"
+#, fuzzy, python-format
+msgid "checking templates (%s)...\n"
 msgstr "Prüfe Vorlagen (%s)...\n"
 
 msgid " (templates seem to have been installed incorrectly)\n"
 msgstr "(Vorlagen scheinen falsch installiert worden zu sein)\n"
 
-msgid "Checking commit editor...\n"
+#, fuzzy
+msgid "checking commit editor...\n"
 msgstr "Prüfe Editor für Versionsmeldungen...\n"
 
 msgid " No commit editor set and can't find vi in PATH\n"
@@ -10634,13 +10765,15 @@
 msgid " Can't find editor '%s' in PATH\n"
 msgstr " Kann Editor '%s' nicht im PATH finden\n"
 
-msgid "Checking username...\n"
+#, fuzzy
+msgid "checking username...\n"
 msgstr "Prüfe Benutzernamen...\n"
 
 msgid " (specify a username in your configuration file)\n"
 msgstr " (Gib einen Benutzernamen in der .hgrc Datei an!)\n"
 
-msgid "No problems detected\n"
+#, fuzzy
+msgid "no problems detected\n"
 msgstr "Keine Probleme gefunden\n"
 
 #, python-format
@@ -10659,6 +10792,12 @@
 "    "
 msgstr ""
 
+msgid "[OBSOLETED [REPLACEMENT] [REPL... ]"
+msgstr ""
+
+msgid "create arbitrary obsolete marker"
+msgstr ""
+
 msgid "REPO NAMESPACE [KEY OLD NEW]"
 msgstr ""
 
@@ -10758,8 +10897,7 @@
 msgstr ""
 
 msgid "show the contents of the current dirstate"
-msgstr ""
-"Zeigt die interne Repräsentation der aktuellen Änderungen (dirstate) an"
+msgstr "Zeigt die interne Repräsentation der aktuellen Änderungen (dirstate) an"
 
 #, python-format
 msgid "copy: %s -> %s\n"
@@ -10781,8 +10919,7 @@
 msgstr "Zeigt Änderungen des Projektarchivs oder angegebener Dateien an"
 
 msgid "    Show differences between revisions for the specified files."
-msgstr ""
-"    Zeigt Änderungen zwischen den Revisionen der angegebenen Dateien an."
+msgstr "    Zeigt Änderungen zwischen den Revisionen der angegebenen Dateien an."
 
 msgid "    Differences between files are shown using the unified diff format."
 msgstr ""
@@ -10824,14 +10961,12 @@
 "    zu erzeugen. Für mehr Information ist :hg:`help diff` aufschlussreich."
 
 msgid "      - compare a file in the current working directory to its parent::"
-msgstr ""
-"      - vergleiche eine Datei im Arbeitsverzeichnis mit dem Vorgänger::"
+msgstr "      - vergleiche eine Datei im Arbeitsverzeichnis mit dem Vorgänger::"
 
 msgid "          hg diff foo.c"
 msgstr ""
 
-msgid ""
-"      - compare two historical versions of a directory, with rename info::"
+msgid "      - compare two historical versions of a directory, with rename info::"
 msgstr ""
 
 msgid "          hg diff --git -r 1.0:1.2 lib/"
@@ -10864,15 +10999,15 @@
 msgid "revisions to export"
 msgstr "zu exportierende Revisionen"
 
-msgid "[OPTION]... [-o OUTFILESPEC] REV..."
+#, fuzzy
+msgid "[OPTION]... [-o OUTFILESPEC] [-r] REV..."
 msgstr "[OPTION]... [-o DATEINAMENMUSTER] REV..."
 
 msgid "dump the header and diffs for one or more changesets"
 msgstr "Gibt Kopfzeilen und Änderungsverlauf einer oder mehrerer Versionen aus"
 
 msgid "    Print the changeset header and diffs for one or more revisions."
-msgstr ""
-"    Gibt Kopfzeilen und Änderungsverlauf einer oder mehrerer Versionen aus."
+msgstr "    Gibt Kopfzeilen und Änderungsverlauf einer oder mehrerer Versionen aus."
 
 msgid ""
 "    The information shown in the changeset header is: author, date,\n"
@@ -10880,8 +11015,7 @@
 "    comment."
 msgstr ""
 "    Die angezeigten Daten in den Kopfzeilen sind: Autor, Datum, Zweigname\n"
-"    (falls nicht \"default\"), Änderungssatz-Prüfsumme, Vorgängerversion"
-"(en)\n"
+"    (falls nicht \"default\"), Änderungssatz-Prüfsumme, Vorgängerversion(en)\n"
 "    und Versionsmeldung."
 
 msgid ""
@@ -10908,8 +11042,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"
+"    :``%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 ""
@@ -10918,10 +11051,8 @@
 "    :``%N``: Anzahl der generierten Patches\n"
 "    :``%R``: Revisionnummer des Änderungssatzes\n"
 "    :``%b``: Basisname des exportierten Archivs\n"
-"    :``%h``: Kurzform der Prüfsumme des Änderungssatzes (12 Byte "
-"hexadezimal)\n"
-"    :``%m``: Erste Zeile der Übernahmenachricht (nur alphanumerische "
-"Zeichen)\n"
+"    :``%h``: Kurzform der Prüfsumme des Änderungssatzes (12 Byte hexadezimal)\n"
+"    :``%m``: Erste Zeile der Übernahmenachricht (nur alphanumerische Zeichen)\n"
 "    :``%n``: Laufende Nummer mit führenden Nullen, beginnend bei 1\n"
 "    :``%r``: Revisionsnummer mit führenden Nullen"
 
@@ -10988,9 +11119,7 @@
 msgstr "Exportiere Patch:\n"
 
 msgid "forget the specified files on the next commit"
-msgstr ""
-"Angegebene Dateien ab dem nächsten Commit nicht mehr unter Versionskontrolle "
-"stellen"
+msgstr "Angegebene Dateien ab dem nächsten Commit nicht mehr unter Versionskontrolle stellen"
 
 msgid ""
 "    Mark the specified files so they will no longer be tracked\n"
@@ -11018,6 +11147,10 @@
 msgid "          hg forget \"set:hgignore()\""
 msgstr ""
 
+#, fuzzy
+msgid "revisions to graft"
+msgstr "zu exportierende Revisionen"
+
 msgid "resume interrupted graft"
 msgstr "Führt ein unterbrochenes graft fort"
 
@@ -11030,8 +11163,9 @@
 msgid "record the current user as committer"
 msgstr "Protokolliert den aktuellen Nutzer als Autor"
 
-msgid "[OPTION]... REVISION..."
-msgstr "[OPTION]... REVISION..."
+#, fuzzy
+msgid "[OPTION]... [-r] REV..."
+msgstr "[OPTION]... [DATEI [REV]]..."
 
 msgid "copy changes from other branches onto the current branch"
 msgstr ""
@@ -11064,8 +11198,7 @@
 "      The -c/--continue option does not reapply earlier options."
 msgstr ""
 
-msgid ""
-"      - copy a single change to the stable branch and edit its description::"
+msgid "      - copy a single change to the stable branch and edit its description::"
 msgstr ""
 
 msgid ""
@@ -11073,8 +11206,7 @@
 "          hg graft --edit 9393"
 msgstr ""
 
-msgid ""
-"      - graft a range of changesets with one exception, updating dates::"
+msgid "      - graft a range of changesets with one exception, updating dates::"
 msgstr ""
 
 msgid "          hg graft -D \"2085::2093 and not 2091\""
@@ -11164,8 +11296,7 @@
 msgstr "Sucht ein Muster in angegebenen Dateien und Revisionen"
 
 msgid "    Search revisions of files for a regular expression."
-msgstr ""
-"    Durchsucht Dateien in der Versionshistorie nach einem gegebenen Muster."
+msgstr "    Durchsucht Dateien in der Versionshistorie nach einem gegebenen Muster."
 
 msgid ""
 "    This command behaves differently than Unix grep. It only accepts\n"
@@ -11173,10 +11304,8 @@
 "    working directory. It always prints the revision number in which a\n"
 "    match appears."
 msgstr ""
-"    Dieser Befehl unterscheidet sich von Unix grep, da es Reguläre "
-"Ausdrücke\n"
-"    in Python/Perl Format erwartet und ausserdem nur die übernommenen "
-"Revisionen\n"
+"    Dieser Befehl unterscheidet sich von Unix grep, da es Reguläre Ausdrücke\n"
+"    in Python/Perl Format erwartet und ausserdem nur die übernommenen Revisionen\n"
 "    im Archiv durchsucht, nicht jedoch das Arbeitsverzeichnis."
 
 msgid ""
@@ -11186,10 +11315,8 @@
 "    becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
 "    use the --all flag."
 msgstr ""
-"    Standardmäßig gibt grep den Dateinamen und die jüngste Revision einer "
-"Datei\n"
-"    aus, die das Suchmuster enthält. Mit der Option --all werden "
-"stattdessen\n"
+"    Standardmäßig gibt grep den Dateinamen und die jüngste Revision einer Datei\n"
+"    aus, die das Suchmuster enthält. Mit der Option --all werden stattdessen\n"
 "    alle Revisionen ausgegeben, in der das Muster hinzugefügt (\"+\") oder\n"
 "    entfernt (\"-\") wurde."
 
@@ -11266,8 +11393,7 @@
 "    angezeigt, die Nachfahren der gegebenen Revision sind."
 
 msgid ""
-"    If -t/--topo is specified, named branch mechanics will be ignored and "
-"only\n"
+"    If -t/--topo is specified, named branch mechanics will be ignored and only\n"
 "    changesets without children will be shown."
 msgstr ""
 "    Mit -t/--topo wird Zweiginformation ignoriert und nur Änderungssätze\n"
@@ -11303,10 +11429,8 @@
 msgid "show help for a given topic or a help overview"
 msgstr "Zeigt die Hilfe für ein gegebenes Thema oder eine Hilfsübersicht"
 
-msgid ""
-"    With no arguments, print a list of commands with short help messages."
-msgstr ""
-"    Ohne Parameter wird eine Liste aller Befehle mit Kurzhilfe angezeigt."
+msgid "    With no arguments, print a list of commands with short help messages."
+msgstr "    Ohne Parameter wird eine Liste aller Befehle mit Kurzhilfe angezeigt."
 
 msgid ""
 "    Given a topic, extension, or command name, print help for that\n"
@@ -11351,8 +11475,7 @@
 
 #, python-format
 msgid "use \"hg help -e %s\" to show help for the %s extension"
-msgstr ""
-"Benutzen Sie \"hg -v help %s\" um Hilfe für die Erweitung %s anzuzeigen"
+msgstr "Benutzen Sie \"hg -v help %s\" um Hilfe für die Erweitung %s anzuzeigen"
 
 msgid "options:"
 msgstr "Optionen:"
@@ -11399,8 +11522,7 @@
 msgstr "Nutze \"hg help\" für eine Liste aller Befehle"
 
 msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
-msgstr ""
-"Nutze \"hg help\" für eine Liste aller Befehle oder \"hg -v\" für Details"
+msgstr "Nutze \"hg help\" für eine Liste aller Befehle oder \"hg -v\" für Details"
 
 #, python-format
 msgid "use \"hg help %s\" to show the full help text"
@@ -11472,8 +11594,7 @@
 "    a list of tags, and a list of bookmarks."
 msgstr ""
 "    Die Zusammenfassung beschreibt den Zustand des Projektarchivs unter\n"
-"    Nutzung von ein oder zwei Prüfsummenbezeichnern, gefolgt von einem \"+"
-"\"\n"
+"    Nutzung von ein oder zwei Prüfsummenbezeichnern, gefolgt von einem \"+\"\n"
 "    falls unversionierte Änderungen im Arbeitsverzeichnis vorliegen. Zudem\n"
 "    werden eine Liste der Tags und eine der Lesezeichen dieser Revision\n"
 "    ausgegeben sowie der Zweigname falls nicht der 'default'-Zweig vorliegt."
@@ -11513,12 +11634,8 @@
 msgid "can't query remote revision number, branch, or tags"
 msgstr ""
 
-msgid ""
-"directory strip option for patch. This has the same meaning as the "
-"corresponding patch option"
-msgstr ""
-"Entfernt führende Verzeichnisnamen. Dies hat dieselbe Bedeutung wie die "
-"gleichnamige Option von patch"
+msgid "directory strip option for patch. This has the same meaning as the corresponding patch option"
+msgstr "Entfernt führende Verzeichnisnamen. Dies hat dieselbe Bedeutung wie die gleichnamige Option von patch"
 
 msgid "PATH"
 msgstr "PFAD"
@@ -11527,8 +11644,7 @@
 msgstr "Basispfad (VERALTET)"
 
 msgid "skip check for outstanding uncommitted changes"
-msgstr ""
-"überspringt die Überprüfungen auf ausstehende, unversionierte Änderungen"
+msgstr "überspringt die Überprüfungen auf ausstehende, unversionierte Änderungen"
 
 msgid "don't commit, just update the working directory"
 msgstr "Kein Commit, nur Aktualisierung des Arbeitsverzeichnisses"
@@ -11552,8 +11668,7 @@
 "    Import a list of patches and commit them individually (unless\n"
 "    --no-commit is specified)."
 msgstr ""
-"    Wendet die angegebenen Patches nacheinander an und übernimmt die "
-"Änderungen\n"
+"    Wendet die angegebenen Patches nacheinander an und übernimmt die Änderungen\n"
 "    ins Archiv (es sei denn die Option --no-commit ist angegeben)."
 
 msgid ""
@@ -11573,8 +11688,7 @@
 msgstr ""
 "    Patches können direkt aus Emails importiert werden, sogar wenn sie in\n"
 "    einem Anhang (Mime Typ text/plain oder text/x-patch) vorliegen. Die\n"
-"    Absender- und Betreffszeile, sowie alle text/plain Abschnitte vor dem "
-"Patch\n"
+"    Absender- und Betreffszeile, sowie alle text/plain Abschnitte vor dem Patch\n"
 "    werden als Benutzername bzw. Versionsmeldung bei der Übernahme verwendet."
 
 msgid ""
@@ -11598,8 +11712,7 @@
 "    Mit der Option --exact wird das Arbeitsverzeichnis vor jedem Patch auf\n"
 "    dessen Vorgängerversion gebracht. Nach Anwendung wird geprüft, ob der\n"
 "    neue Änderungssatz die gleiche Prüfsumme aufweist, wie der Patch. Falls\n"
-"    dies nicht so ist (im Falle von inkompatiblen Zeichensätzen oder "
-"anderen\n"
+"    dies nicht so ist (im Falle von inkompatiblen Zeichensätzen oder anderen\n"
 "    Problemen mit dem Patch Format), wird die Operation abgebrochen."
 
 msgid ""
@@ -11621,8 +11734,7 @@
 "    a URL is specified, the patch will be downloaded from it.\n"
 "    See :hg:`help dates` for a list of formats valid for -d/--date."
 msgstr ""
-"    Um einen Patch von der Standardeingabe zu lesen, kann der Dateiname \"-"
-"\"\n"
+"    Um einen Patch von der Standardeingabe zu lesen, kann der Dateiname \"-\"\n"
 "    verwendet werden. Falls eine URL angegeben ist, wird der Patch von dort\n"
 "    heruntergeladen. Siehe :hg:`help dates` für eine Liste aller gültigen\n"
 "    Formate für -d/--date.\n"
@@ -11720,8 +11832,7 @@
 "    For remote repository, using --bundle avoids downloading the\n"
 "    changesets twice if the incoming is followed by a pull."
 msgstr ""
-"    Für entfernte Archive sorgt die Option --bundle dafür, dass die "
-"Änderungen\n"
+"    Für entfernte Archive sorgt die Option --bundle dafür, dass die Änderungen\n"
 "    bei einem folgenden \"hg pull\" nicht ein zweites Mal geholt werden."
 
 msgid "    See pull for valid source format details."
@@ -11805,8 +11916,7 @@
 msgstr ""
 "    Um die Ausgabe besser in Verbindung mit \"xargs\" verwenden zu können,\n"
 "    sollte die Option \"-0\" (Null) in beiden Befehle angegeben werden.\n"
-"    Dadurch werden die Dateinamen mit einem Null-Byte getrennt, was "
-"Probleme\n"
+"    Dadurch werden die Dateinamen mit einem Null-Byte getrennt, was Probleme\n"
 "    mit Leerzeichen in Dateinamen vermeidet."
 
 msgid "show revision history of entire repository or files"
@@ -11881,8 +11991,7 @@
 msgstr ""
 
 msgid "      - changesets ancestral to the working directory::"
-msgstr ""
-"      - Alle Änderungssätze, die Vorfahren des Arbeitsverzeichnisses sind"
+msgstr "      - Alle Änderungssätze, die Vorfahren des Arbeitsverzeichnisses sind"
 
 msgid "          hg log -f"
 msgstr ""
@@ -11893,15 +12002,13 @@
 msgid "          hg log -l 10 -b ."
 msgstr ""
 
-msgid ""
-"      - changesets showing all modifications of a file, including removals::"
+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::"
+msgid "      - all changesets that touch a directory, with diffs, excluding merges::"
 msgstr ""
 "      - Alle Änderungssätze die ein Verzeichnis betreffen, mit diffs ohne\n"
 "        Zusammenführungen::"
@@ -11912,7 +12019,9 @@
 msgid "      - all revision numbers that match a keyword::"
 msgstr "      - Die Nummern von Revisionen, die ein Schlüsselwort beinhalten::"
 
-msgid "          hg log -k bug --template \"{rev}\\n\""
+msgid ""
+"          hg log -k bug --template \"{rev}\\n"
+"\""
 msgstr ""
 
 msgid "      - check if a given changeset is included is a tagged release::"
@@ -11928,11 +12037,11 @@
 msgstr ""
 
 msgid "      - summary of all changesets after the last tag::"
-msgstr ""
-"      - Zusammenfassung aller Änderungssätze seit dem letzten Etikett::"
-
-msgid ""
-"          hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+msgstr "      - Zusammenfassung aller Änderungssätze seit dem letzten Etikett::"
+
+msgid ""
+"          hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n"
+"\""
 msgstr ""
 
 msgid ""
@@ -11967,8 +12076,7 @@
 "    If no revision is given, the first parent of the working directory\n"
 "    is used, or the null revision if no revision is checked out."
 msgstr ""
-"    Gibt eine Liste aller Dateien unter Versionskontrolle für die "
-"angegebene\n"
+"    Gibt eine Liste aller Dateien unter Versionskontrolle für die angegebene\n"
 "    Revision aus. Wenn keine Revision angegeben wird, wird die erste\n"
 "    Vorgängerversion des Arbeitsverzeichnis genutzt oder die Spitze (tip)\n"
 "    falls keine Revision ausgecheckt ist."
@@ -11977,8 +12085,7 @@
 "    With -v, print file permissions, symlink and executable bits.\n"
 "    With --debug, print file revision hashes."
 msgstr ""
-"    Mit dem Schalter -v werden zusätzlich zum Dateinamen auch die Rechte "
-"und\n"
+"    Mit dem Schalter -v werden zusätzlich zum Dateinamen auch die Rechte und\n"
 "    der Dateityp (Verknüpfung/ausführbar) ausgegeben; mit --debug auch noch\n"
 "    die Prüfsumme.\n"
 "    "
@@ -12037,11 +12144,9 @@
 "    explicit revision with which to merge with must be provided."
 msgstr ""
 "    Wenn keine Revision angegeben wird und der Vorgänger des Arbeits-\n"
-"    verzeichnisses eine Kopfversion eines Zweiges mit genau zwei Köpfen "
-"ist,\n"
+"    verzeichnisses eine Kopfversion eines Zweiges mit genau zwei Köpfen ist,\n"
 "    dann wird der andere Kopf für die Zusammenführung verwendet.\n"
-"    Bei mehr oder weniger als zwei Köpfen im Zweig muss eine andere "
-"Revision\n"
+"    Bei mehr oder weniger als zwei Köpfen im Zweig muss eine andere Revision\n"
 "    explizit angegeben werden."
 
 msgid "    :hg:`resolve` must be used to resolve unresolved files."
@@ -12060,21 +12165,14 @@
 "    Gibt 0 bei Erfolg zurück, 1 wenn ungelöste Konflikte auftraten.\n"
 "    "
 
-msgid ""
-"multiple matching bookmarks to merge - please merge with an explicit rev or "
-"bookmark"
-msgstr ""
-"Mehrere passende Lesezeichen zum Zusammenführen gefunden. Bitte wählen Sie "
-"eine explizite Revision oder ein Lesezeichen"
+msgid "multiple matching bookmarks to merge - please merge with an explicit rev or bookmark"
+msgstr "Mehrere passende Lesezeichen zum Zusammenführen gefunden. Bitte wählen Sie eine explizite Revision oder ein Lesezeichen"
 
 msgid "run 'hg heads' to see all heads"
 msgstr "'hg heads' zeigt alle Köpfe"
 
-msgid ""
-"no matching bookmark to merge - please merge with an explicit rev or bookmark"
-msgstr ""
-"Kein passendes Lesezeichen zum Zusammenführen gefunden. Bitte wählen Sie "
-"eine explizite Revision oder ein Lesezeichen"
+msgid "no matching bookmark to merge - please merge with an explicit rev or bookmark"
+msgstr "Kein passendes Lesezeichen zum Zusammenführen gefunden. Bitte wählen Sie eine explizite Revision oder ein Lesezeichen"
 
 #, python-format
 msgid "branch '%s' has %d heads - please merge with an explicit rev"
@@ -12084,9 +12182,7 @@
 msgstr "'hg heads .' zeigt Köpfe"
 
 msgid "heads are bookmarked - please merge with an explicit rev"
-msgstr ""
-"Es existieren  Lesezeichen für die Köpfe. Bitte geben Sie explizit eine "
-"Revision an"
+msgstr "Es existieren  Lesezeichen für die Köpfe. Bitte geben Sie explizit eine Revision an"
 
 #, python-format
 msgid "branch '%s' has one head - please merge with an explicit rev"
@@ -12173,8 +12269,7 @@
 "    Show definition of symbolic path name NAME. If no name is given,\n"
 "    show definition of all available names."
 msgstr ""
-"    Zeigt die Adressdefinition des Kurznamens NAME an. Wenn kein Name "
-"gegeben\n"
+"    Zeigt die Adressdefinition des Kurznamens NAME an. Wenn kein Name gegeben\n"
 "    ist, werden alle Alias-Definitionen angezeigt."
 
 msgid ""
@@ -12276,12 +12371,10 @@
 msgstr "aktualisiere nicht: %s\n"
 
 msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
-msgstr ""
-"(\"hg heads\" zeigt alle Köpfe, nutze \"hg merge\" um sie zusammenzuführen)\n"
+msgstr "(\"hg heads\" zeigt alle Köpfe, nutze \"hg merge\" um sie zusammenzuführen)\n"
 
 msgid "(run 'hg heads .' to see heads, 'hg merge' to merge)\n"
-msgstr ""
-"('hg heads' zeigt alle Köpfe, nutze 'hg merge' um sie zusammenzuführen)\n"
+msgstr "('hg heads' zeigt alle Köpfe, nutze 'hg merge' um sie zusammenzuführen)\n"
 
 msgid "(run 'hg heads' to see heads)\n"
 msgstr "('hg heads' zeigt alle Köpfe)\n"
@@ -12351,13 +12444,6 @@
 msgid "remote bookmark %s not found!"
 msgstr "Entferntes Lesezeichen %s wurde nicht gefunden!"
 
-msgid ""
-"other repository doesn't support revision lookup, so a rev cannot be "
-"specified."
-msgstr ""
-"Das andere Projektarchiv unterstützt keine Revisionsabfragen, daher kann\n"
-"keine Revision angegeben werden."
-
 #, python-format
 msgid "importing bookmark %s\n"
 msgstr "Importierte Lesezeichen %s\n"
@@ -12388,8 +12474,7 @@
 msgstr ""
 "    Dies ist das Gegenteil der 'pull' Operation. Die lokalen Änderungen\n"
 "    des aktuellen Archivs werden in ein anderes übertragen. Bei lokalem\n"
-"    Ziel ist diese Aktion identisch zu einem 'hg pull' von diesem Archiv "
-"zum\n"
+"    Ziel ist diese Aktion identisch zu einem 'hg pull' von diesem Archiv zum\n"
 "    aktuellen."
 
 msgid ""
@@ -12423,8 +12508,16 @@
 "    If -r/--rev is used, the specified revision and all its ancestors\n"
 "    will be pushed to the remote repository."
 msgstr ""
-"    Bei Nutzung von -r/--rev wird die benannte Revision mit allen "
-"Vorgängern\n"
+"    Bei Nutzung von -r/--rev wird die benannte Revision mit allen Vorgängern\n"
+"    in das entfernte Archiv übertragen."
+
+#, fuzzy
+msgid ""
+"    If -B/--bookmark is used, the specified bookmarked revision, its\n"
+"    ancestors, and the bookmark will be pushed to the remote\n"
+"    repository."
+msgstr ""
+"    Bei Nutzung von -r/--rev wird die benannte Revision mit allen Vorgängern\n"
 "    in das entfernte Archiv übertragen."
 
 msgid ""
@@ -12466,16 +12559,14 @@
 msgstr "Setzt eine unterbrochene Transaktion zurück"
 
 msgid "    Recover from an interrupted commit or pull."
-msgstr ""
-"    Setzt ein unterbrochenes Übernehmen (commit) oder Abholen (pull) zurück."
+msgstr "    Setzt ein unterbrochenes Übernehmen (commit) oder Abholen (pull) zurück."
 
 msgid ""
 "    This command tries to fix the repository status after an\n"
 "    interrupted operation. It should only be necessary when Mercurial\n"
 "    suggests it."
 msgstr ""
-"    Der ungültige Status durch die Unterbrechung wird repariert. Dies "
-"sollte\n"
+"    Der ungültige Status durch die Unterbrechung wird repariert. Dies sollte\n"
 "    nur dann nötig sein, wenn eine Meldung von Mercurial es vorschlägt."
 
 msgid ""
@@ -12493,8 +12584,7 @@
 msgstr "Entfernt die angegebenen Dateien in der nächsten Version"
 
 msgid "    Schedule the indicated files for removal from the current branch."
-msgstr ""
-"    Merkt die benannten Dateien für Entfernung aus dem aktuellen Zweig vor."
+msgstr "    Merkt die benannten Dateien für Entfernung aus dem aktuellen Zweig vor."
 
 msgid ""
 "    This command schedules the files to be removed at the next commit.\n"
@@ -12514,8 +12604,7 @@
 msgstr ""
 "      Option -A/--after kann genutzt werden, um Dateien zu entfernen, die\n"
 "      bereits gelöscht wurden, -f/--force kann genutzt werden, um die\n"
-"      Löschung zu erzwingen. -Af entfernt Dateien aus der nächsten "
-"Revision,\n"
+"      Löschung zu erzwingen. -Af entfernt Dateien aus der nächsten Revision,\n"
 "      ohne sie im Arbeitsverzeichnis zu löschen"
 
 msgid ""
@@ -12525,8 +12614,7 @@
 "      (as reported by :hg:`status`). The actions are Warn, Remove\n"
 "      (from branch) and Delete (from disk):"
 msgstr ""
-"      Die folgende Tabelle beschreibt detailliert das Verhalten von "
-"'remove'\n"
+"      Die folgende Tabelle beschreibt detailliert das Verhalten von 'remove'\n"
 "      für unterschiedliche Dateizustände (Spalten) und Optionskombinationen\n"
 "      (Reihen). Die Dateizustände sind Hinzugefügt (A), Unverändert (C),\n"
 "      Verändert (M) und Fehlend (!) (wie von :hg:`status` angezeigt). Die\n"
@@ -12578,9 +12666,7 @@
 
 #, python-format
 msgid "not removing %s: file has been marked for add (use forget to undo)\n"
-msgstr ""
-"Entferne nicht %s: Datei soll hinzugefügt werden ('hg forget' um dies "
-"rückgängig zu machen)\n"
+msgstr "Entferne nicht %s: Datei soll hinzugefügt werden ('hg forget' um dies rückgängig zu machen)\n"
 
 msgid "record a rename that has already occurred"
 msgstr ""
@@ -12624,9 +12710,7 @@
 msgstr "Versteckt das Status-Präfix"
 
 msgid "redo merges or set/view the merge status of files"
-msgstr ""
-"Macht Zusammenführungen rückgängig oder setzt/zeigt den "
-"Zusammenführungsstatus einer Datei"
+msgstr "Macht Zusammenführungen rückgängig oder setzt/zeigt den Zusammenführungsstatus einer Datei"
 
 msgid ""
 "    Merges with unresolved conflicts are often the result of\n"
@@ -12642,8 +12726,7 @@
 msgstr ""
 
 msgid ""
-"    - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the "
-"specified\n"
+"    - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the specified\n"
 "      files, discarding any previous merge attempts. Re-merging is not\n"
 "      performed for files already marked as resolved. Use ``--all/-a``\n"
 "      to select all unresolved files. ``--tool`` can be used to specify\n"
@@ -12703,15 +12786,18 @@
 msgid "restore files to their checkout state"
 msgstr "Setzt gegebene Dateien oder Verzeichnisse auf frühere Version zurück"
 
-msgid ""
-"    .. note::\n"
+msgid "    .. note::"
+msgstr ""
+
+#, fuzzy
+msgid ""
 "       To check out earlier revisions, you should use :hg:`update REV`.\n"
-"       To cancel a merge (and lose your changes), use :hg:`update --clean .`."
+"       To cancel an uncommitted merge (and lose your changes), use\n"
+"       :hg:`update --clean .`."
 msgstr ""
 "    .. note::\n"
 "       Um das Arbeitsverzeichnis auf eine ältere Version zu setzen, nutze\n"
-"       :hg:`update REV`. Um eine nicht übernommene Zusammenführung "
-"rückgängig\n"
+"       :hg:`update REV`. Um eine nicht übernommene Zusammenführung rückgängig\n"
 "       zu machen, nutze :hg:`update --clean .`."
 
 msgid ""
@@ -12739,8 +12825,7 @@
 msgstr ""
 "    Mit der -r/--rev oder der -d/--date Option werden die Dateien oder\n"
 "    Verzeichnisse auf die gegebene Revision zurückgesetzt. Da 'revert' aber\n"
-"    nicht die mit dem Arbeitsverzeichnis assoziierte Revisionsnummer "
-"ändert,\n"
+"    nicht die mit dem Arbeitsverzeichnis assoziierte Revisionsnummer ändert,\n"
 "    gelten die betroffenen Dateien dann als modifiziert. Damit kann man\n"
 "    ungewollte aber bereits übernommene Änderungen rückgängig machen. Siehe\n"
 "    auch :hg:`backout` für eine ähnliche Methode."
@@ -12756,8 +12841,7 @@
 msgstr "ungültige Angabe von Revision und Datum gleichzeitig"
 
 msgid "uncommitted merge with no revision specified"
-msgstr ""
-"Nicht übernommene Zusammenführung - bitte gib eine bestimmte Revision an"
+msgstr "Nicht übernommene Zusammenführung - bitte gib eine bestimmte Revision an"
 
 msgid "use \"hg update\" or see \"hg help revert\""
 msgstr "Verwende :h:`update` oder lies :h:`help revert`"
@@ -12765,30 +12849,19 @@
 msgid "no files or directories specified"
 msgstr "Keine Dateien order Verzeichnisse angegeben"
 
-msgid ""
-"uncommitted merge, use --all to discard all changes, or 'hg update -C .' to "
-"abort the merge"
-msgstr ""
-"Nicht übernommene Zusammenführung - nutze --all um alle Änderungen eines "
-"Vorgängers zu vergessen, oder 'hg update -C .' um die Zusammenführung nicht "
-"durchzuführen"
-
-#, python-format
-msgid ""
-"uncommitted changes, use --all to discard all changes, or 'hg update %s' to "
-"update"
-msgstr ""
-"Ausstehende nicht versionierte Änderungen - nutze -all um alle Änderungen zu "
-"verwerfen, oder 'hg update %s' zum Aktualisieren"
+msgid "uncommitted merge, use --all to discard all changes, or 'hg update -C .' to abort the merge"
+msgstr "Nicht übernommene Zusammenführung - nutze --all um alle Änderungen eines Vorgängers zu vergessen, oder 'hg update -C .' um die Zusammenführung nicht durchzuführen"
+
+#, python-format
+msgid "uncommitted changes, use --all to discard all changes, or 'hg update %s' to update"
+msgstr "Ausstehende nicht versionierte Änderungen - nutze -all um alle Änderungen zu verwerfen, oder 'hg update %s' zum Aktualisieren"
 
 #, python-format
 msgid "use --all to revert all files, or 'hg update %s' to update"
 msgstr ""
 
 msgid "uncommitted changes, use --all to discard all changes"
-msgstr ""
-"Ausstehende nicht versionierte Änderungen - nutze -all um alle Änderungen zu "
-"verwerfen"
+msgstr "Ausstehende nicht versionierte Änderungen - nutze -all um alle Änderungen zu verwerfen"
 
 msgid "use --all to revert all files"
 msgstr "nutze -all, um alle Dateien zurückzusetzen"
@@ -12807,29 +12880,33 @@
 "    the working directory."
 msgstr ""
 "    Dieser Befehl muss mit Vorsicht verwendet werden. Es gibt keine ver-\n"
-"    schachtelten Transaktionen und ein Rückrollen kann selber nicht "
-"rückgängig\n"
+"    schachtelten Transaktionen und ein Rückrollen kann selber nicht rückgängig\n"
 "    gemacht werden. Der aktuelle Status (dirstate) im .hg Verzeichnis wird\n"
 "    auf die letzte Transaktion zurückgesetzt. Neuere Änderungen gehen damit\n"
 "    verloren."
 
+#, fuzzy
 msgid ""
 "    Transactions are used to encapsulate the effects of all commands\n"
 "    that create new changesets or propagate existing changesets into a\n"
-"    repository. For example, the following commands are transactional,\n"
-"    and their effects can be rolled back:"
-msgstr ""
-"    Transaktionen werden verwendet um den Effekt aller Befehle, die "
-"Änderungs-\n"
+"    repository."
+msgstr ""
+"    Transaktionen werden verwendet um den Effekt aller Befehle, die Änderungs-\n"
 "    sätze erstellen oder verteilen, zu kapseln. Die folgenden Befehle\n"
 "    werden durch Transaktionen geschützt und können zurückgerollt werden:"
 
 msgid ""
-"    - commit\n"
-"    - import\n"
-"    - pull\n"
-"    - push (with this repository as the destination)\n"
-"    - unbundle"
+"      For example, the following commands are transactional, and their\n"
+"      effects can be rolled back:"
+msgstr ""
+
+#, fuzzy
+msgid ""
+"      - commit\n"
+"      - import\n"
+"      - pull\n"
+"      - push (with this repository as the destination)\n"
+"      - unbundle"
 msgstr ""
 "    - commit\n"
 "    - import\n"
@@ -12837,10 +12914,11 @@
 "    - push (mit diesem Archiv als Ziel)\n"
 "    - unbundle"
 
-msgid ""
-"    To avoid permanent data loss, rollback will refuse to rollback a\n"
-"    commit transaction if it isn't checked out. Use --force to\n"
-"    override this protection."
+#, fuzzy
+msgid ""
+"      To avoid permanent data loss, rollback will refuse to rollback a\n"
+"      commit transaction if it isn't checked out. Use --force to\n"
+"      override this protection."
 msgstr ""
 "    Um einen versehentlichen Datenverlust zu verhindern, wird rollback\n"
 "    keine Änderungssätze aus der Historie entfernen, die nicht im\n"
@@ -12855,30 +12933,24 @@
 "    repository; for example an in-progress pull from the repository\n"
 "    may fail if a rollback is performed."
 msgstr ""
-"    Dieser Befehl ist nicht für öffentliche Archive gedacht. Sobald "
-"Änderungen\n"
-"    für Andere sichtbar sind ist ein Zurückrollen unnütz, da jemand sie "
-"bereits\n"
-"    zu sich übertragen haben könnte. Weiterhin entsteht eine "
-"Wettlaufsituation,\n"
-"    wenn beispielsweise ein Zurückrollen ausgeführt wird, während jemand "
-"anders\n"
+"    Dieser Befehl ist nicht für öffentliche Archive gedacht. Sobald Änderungen\n"
+"    für Andere sichtbar sind ist ein Zurückrollen unnütz, da jemand sie bereits\n"
+"    zu sich übertragen haben könnte. Weiterhin entsteht eine Wettlaufsituation,\n"
+"    wenn beispielsweise ein Zurückrollen ausgeführt wird, während jemand anders\n"
 "    ein 'pull' ausführt."
 
 msgid ""
 "    Returns 0 on success, 1 if no rollback data is available.\n"
 "    "
 msgstr ""
-"    Gibt 0 bei Erfolg zurück, 1 wenn kein Transaktionsprotokoll gefunden "
-"wird.\n"
+"    Gibt 0 bei Erfolg zurück, 1 wenn kein Transaktionsprotokoll gefunden wird.\n"
 "    "
 
 msgid "print the root (top) of the current working directory"
 msgstr "Gibt die Wurzel (top) des aktuellen Arbeitsverzeichnisses aus"
 
 msgid "    Print the root directory of the current repository."
-msgstr ""
-"    Gibt das Wurzelverzeichnis des aktuellen Arbeitsverzeichnisses aus."
+msgstr "    Gibt das Wurzelverzeichnis des aktuellen Arbeitsverzeichnisses aus."
 
 msgid "name of access log file to write to"
 msgstr "Name der Zugriffs-Logdatei"
@@ -12899,12 +12971,10 @@
 msgstr ""
 
 msgid "prefix path to serve from (default: server root)"
-msgstr ""
-"Pfadpräfix von dem ausgeliefert wird (Voreinstellung: Serverwurzel '/')"
+msgstr "Pfadpräfix von dem ausgeliefert wird (Voreinstellung: Serverwurzel '/')"
 
 msgid "name to show in web pages (default: working directory)"
-msgstr ""
-"Name der auf der Webseite angezeigt wird (Voreinstellung: Arbeitsverzeichnis)"
+msgstr "Name der auf der Webseite angezeigt wird (Voreinstellung: Arbeitsverzeichnis)"
 
 msgid "name of the hgweb config file (see \"hg help hgweb\")"
 msgstr "Name der hgweb-Konfigurationsdatei (siehe \"hg help hgweb\")"
@@ -12963,9 +13033,6 @@
 msgid "cannot use --stdio with --cmdserver"
 msgstr "--stdio und --cmdserver können nicht gleichzeitig verwendet werden"
 
-msgid "There is no Mercurial repository here (.hg not found)"
-msgstr "Es gibt hier kein Mercurial-Archiv (.hg nicht vorhanden)"
-
 #, python-format
 msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
 msgstr "Höre auf http://%s%s/%s (gebunden an %s:%d)\n"
@@ -13076,8 +13143,7 @@
 "       relative to one merge parent."
 msgstr ""
 "    .. note:\n"
-"       Der Status kann sich vom Diff unterscheiden, wenn sich "
-"Berechtigungen\n"
+"       Der Status kann sich vom Diff unterscheiden, wenn sich Berechtigungen\n"
 "       geändert haben oder eine Zusammenführung durchgeführt wurde. Das\n"
 "       Vorgabe-Diff-Format zeigt keine Berechtigungsänderungen an und\n"
 "       'diff' zeigt nur Änderungen relativ zu einer Vorgängerversion einer\n"
@@ -13240,8 +13306,7 @@
 
 #, python-format
 msgid "update: %d new changesets, %d branch heads (merge)\n"
-msgstr ""
-"Aktualisiere: %d neue Änderungssätze, %d neue Zweigköpfe (Zusammenführung)\n"
+msgstr "Aktualisiere: %d neue Änderungssätze, %d neue Zweigköpfe (Zusammenführung)\n"
 
 msgid "1 or more incoming"
 msgstr ""
@@ -13284,8 +13349,7 @@
 msgstr "[-f] [-l] [-m TEXT] [-d DATUM] [-u BENUTZER] [-r REV] NAME..."
 
 msgid "add one or more tags for the current or given revision"
-msgstr ""
-"Setze ein oder mehrere Etiketten für die aktuelle oder gegebene Revision"
+msgstr "Setze ein oder mehrere Etiketten für die aktuelle oder gegebene Revision"
 
 msgid "    Name a particular revision using <name>."
 msgstr "    Benennt eine bestimmte Revision mit <name>."
@@ -13296,10 +13360,8 @@
 "    earlier versions or to mark branch points as releases, etc. Changing\n"
 "    an existing tag is normally disallowed; use -f/--force to override."
 msgstr ""
-"    Etiketten sind nützlich um somit benannte Revisionen später in "
-"Vergleichen\n"
-"    zu verwenden, in der Historie dorthin zurückzugehen oder wichtige "
-"Zweig-\n"
+"    Etiketten sind nützlich um somit benannte Revisionen später in Vergleichen\n"
+"    zu verwenden, in der Historie dorthin zurückzugehen oder wichtige Zweig-\n"
 "    stellen zu markieren. Daher sind Änderungen existierender Etiketten\n"
 "    normalerweise verboten, können aber mit -f/--force erzwungen werden."
 
@@ -13319,8 +13381,7 @@
 "    repositories)."
 msgstr ""
 "    Um die Versionskontrolle, Verteilung und Zusammenführung von Etiketten\n"
-"    möglich zu machen, werden sie in einer Datei '.hgtags' gespeichert, "
-"welche\n"
+"    möglich zu machen, werden sie in einer Datei '.hgtags' gespeichert, welche\n"
 "    zusammen mit den anderen Projektdateien überwacht wird und manuell\n"
 "    bearbeitet werden kann. Das bedeutet, dass Etikettierung automatisch\n"
 "    eine neue Revision übernimmt. Lokale Etiketten (nicht mit anderen\n"
@@ -13369,6 +13430,10 @@
 msgid "not at a branch head (use -f to force)"
 msgstr "Nicht auf einem Zweigkopf - erzwinge mit -f/--force"
 
+#, fuzzy
+msgid "null revision specified"
+msgstr "Keine Revisionen angegeben"
+
 msgid "list repository tags"
 msgstr "Liste alle Etiketten des Archivs auf"
 
@@ -13405,8 +13470,7 @@
 "    umbenannt oder manuell einem anderen Änderungssatz angehängt werden."
 
 msgid "update to new branch head if changesets were unbundled"
-msgstr ""
-"aktualisiere auf den neuen Zweigkopf when Änderungssätze entpackt wurden"
+msgstr "aktualisiere auf den neuen Zweigkopf when Änderungssätze entpackt wurden"
 
 msgid "[-u] FILE..."
 msgstr "[-u] DATEI..."
@@ -13430,9 +13494,7 @@
 msgstr "entferne nicht versionierte Änderungen (kein Backup)"
 
 msgid "update across branches if no uncommitted changes"
-msgstr ""
-"Aktualisiere auf anderen Zweig (falls keine unversionierten Änderungen "
-"ausstehen)"
+msgstr "Aktualisiere auf anderen Zweig (falls keine unversionierten Änderungen ausstehen)"
 
 msgid "[-c] [-C] [-d DATE] [[-r] REV]"
 msgstr "[-c] [-C] [-d DATUM] [[-r] REV]"
@@ -13451,6 +13513,14 @@
 "    Zweigs aktualisiert und das aktuelle Lesezeichen verschoben. (siehe\n"
 "    :hg:`help  bookmarks`)."
 
+#, fuzzy
+msgid ""
+"    Update sets the working directory's parent revision to the specified\n"
+"    changeset (see :hg:`help parents`)."
+msgstr ""
+"    Die gegebene Revision wird die Vorgängerversion des Arbeits-\n"
+"    verzeichnisses (siehe :hg:`help parents`)."
+
 msgid ""
 "    If the changeset is not a descendant or ancestor of the working\n"
 "    directory's parent, the update is aborted. With the -c/--check\n"
@@ -13459,29 +13529,24 @@
 "    changeset."
 msgstr ""
 
-msgid ""
-"    Update sets the working directory's parent revison to the specified\n"
-"    changeset (see :hg:`help parents`)."
-msgstr ""
-"    Die gegebene Revision wird die Vorgängerversion des Arbeits-\n"
-"    verzeichnisses (siehe :hg:`help parents`)."
-
-msgid ""
-"    The following rules apply when the working directory contains\n"
-"    uncommitted changes:"
+#, fuzzy
+msgid ""
+"      The following rules apply when the working directory contains\n"
+"      uncommitted changes:"
 msgstr ""
 "    Wenn die Arbeitskopie nicht übernommene Änderungen enthält, wird nach\n"
 "    folgenden Regeln vorgegangen:"
 
-msgid ""
-"    1. If neither -c/--check nor -C/--clean is specified, and if\n"
-"       the requested changeset is an ancestor or descendant of\n"
-"       the working directory's parent, the uncommitted changes\n"
-"       are merged into the requested changeset and the merged\n"
-"       result is left uncommitted. If the requested changeset is\n"
-"       not an ancestor or descendant (that is, it is on another\n"
-"       branch), the update is aborted and the uncommitted changes\n"
-"       are preserved."
+#, fuzzy
+msgid ""
+"      1. If neither -c/--check nor -C/--clean is specified, and if\n"
+"         the requested changeset is an ancestor or descendant of\n"
+"         the working directory's parent, the uncommitted changes\n"
+"         are merged into the requested changeset and the merged\n"
+"         result is left uncommitted. If the requested changeset is\n"
+"         not an ancestor or descendant (that is, it is on another\n"
+"         branch), the update is aborted and the uncommitted changes\n"
+"         are preserved."
 msgstr ""
 "    1. Falls weder -c/--check noch -C/--clean angegeben ist und das\n"
 "       Ziel der Aktualisierung ein Vor- oder Nachfahr des Vorgängers der\n"
@@ -13490,20 +13555,32 @@
 "       Wenn das Ziel dagegen nicht verwandt ist, wird die Aktualisierung\n"
 "       ohne Veränderung abgebrochen."
 
-msgid ""
-"    2. With the -c/--check option, the update is aborted and the\n"
-"       uncommitted changes are preserved."
+#, fuzzy
+msgid ""
+"      2. With the -c/--check option, the update is aborted and the\n"
+"         uncommitted changes are preserved."
 msgstr ""
 "    2. Mit der Option -c/--check wird die Aktualisierung immer aufgrund\n"
 "       der lokalen Änderungen abgebrochen."
 
-msgid ""
-"    3. With the -C/--clean option, uncommitted changes are discarded and\n"
-"       the working directory is updated to the requested changeset."
+#, fuzzy
+msgid ""
+"      3. With the -C/--clean option, uncommitted changes are discarded and\n"
+"         the working directory is updated to the requested changeset."
 msgstr ""
 "    3. Mit der Option -C/--clean werden die nicht übernommenen Änderungen\n"
 "       vernachlässigt und durch die Zielversion vollständig ersetzt."
 
+#, fuzzy
+msgid ""
+"    To cancel an uncommitted merge (and lose your changes), use\n"
+"    :hg:`update --clean .`."
+msgstr ""
+"    .. note::\n"
+"       Um das Arbeitsverzeichnis auf eine ältere Version zu setzen, nutze\n"
+"       :hg:`update REV`. Um eine nicht übernommene Zusammenführung rückgängig\n"
+"       zu machen, nutze :hg:`update --clean .`."
+
 msgid ""
 "    Use null as the changeset to remove the working directory (like\n"
 "    :hg:`clone -U`)."
@@ -13519,15 +13596,13 @@
 "    :hg:`revert [-r REV] NAME` genutzt werden."
 
 msgid "cannot specify both -c/--check and -C/--clean"
-msgstr ""
-"Es können nicht gleichzeitig -c/--check und -C/--clean angegeben werden"
+msgstr "Es können nicht gleichzeitig -c/--check und -C/--clean angegeben werden"
 
 msgid "verify the integrity of the repository"
 msgstr ""
 "Prüft die Integrität des Projektarchivs\n"
 "\n"
-"    Führt eine umfassende Prüfung des aktuellen Projektarchivs durch, "
-"rechnet\n"
+"    Führt eine umfassende Prüfung des aktuellen Projektarchivs durch, rechnet\n"
 "    alle Prüfsummen in Historie, Manifest und überwachten Dateien nach.\n"
 "    Auch die Integrität von Referenzen und Indizes wird geprüft.\n"
 "    "
@@ -13541,8 +13616,7 @@
 "    the changelog, manifest, and tracked files, as well as the\n"
 "    integrity of their crosslinks and indices."
 msgstr ""
-"    Führt eine umfassende Prüfung des aktuellen Projektarchivs durch, "
-"rechnet\n"
+"    Führt eine umfassende Prüfung des aktuellen Projektarchivs durch, rechnet\n"
 "    alle Prüfsummen in Historie, Manifest und überwachten Dateien nach.\n"
 "    Auch die Integrität von Referenzen und Indizes wird geprüft."
 
@@ -13626,9 +13700,7 @@
 
 #, python-format
 msgid "copy failed: %s is not a file or a symbolic link\n"
-msgstr ""
-"Kopieren fehlgeschlagen: %s ist keine Datei oder eine symbolische "
-"Verknüpfung\n"
+msgstr "Kopieren fehlgeschlagen: %s ist keine Datei oder eine symbolische Verknüpfung\n"
 
 #, python-format
 msgid "invalid character in dag description: %s..."
@@ -13702,9 +13774,7 @@
 msgstr "Push erzeugt neuen entfernten Kopfe %s!"
 
 msgid "you should pull and merge or use push -f to force"
-msgstr ""
-"Sie sollten zuerst synchronisieren (pull) und Zusammenführen (merge), oder -"
-"f/--force zum Erzwingen verwenden"
+msgstr "Sie sollten zuerst synchronisieren (pull) und Zusammenführen (merge), oder -f/--force zum Erzwingen verwenden"
 
 msgid "did you forget to merge? use push -f to force"
 msgstr "(Haben Sie vergessen zu mergen? Nutze push -f um zu erzwingen)"
@@ -13823,8 +13893,7 @@
 
 #, python-format
 msgid ""
-"** Unknown exception encountered with possibly-broken third-party extension "
-"%s\n"
+"** Unknown exception encountered with possibly-broken third-party extension %s\n"
 "** which supports versions %s of Mercurial.\n"
 "** Please disable %s and try your action again.\n"
 "** If that fixes the bug please report it to %s\n"
@@ -13856,9 +13925,7 @@
 msgstr ""
 
 #, python-format
-msgid ""
-"error in definition for alias '%s': %s may only be given on the command "
-"line\n"
+msgid "error in definition for alias '%s': %s may only be given on the command line\n"
 msgstr ""
 
 #, python-format
@@ -13887,15 +13954,11 @@
 msgid "option --cwd may not be abbreviated!"
 msgstr "Option --cwd kann nicht abgekürzt werden!"
 
-msgid ""
-"option -R has to be separated from other options (e.g. not -qR) and --"
-"repository may only be abbreviated as --repo!"
-msgstr ""
-"Option -R muss von anderen Optionen getrennt werden (also z.B. nicht -qR) "
-"und --repository kann nur als --repo abgekürzt werden!"
-
-#, python-format
-msgid "Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgid "option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!"
+msgstr "Option -R muss von anderen Optionen getrennt werden (also z.B. nicht -qR) und --repository kann nur als --repo abgekürzt werden!"
+
+#, python-format
+msgid "time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
 msgstr ""
 
 #, python-format
@@ -13913,9 +13976,7 @@
 msgid "unrecognized profiling format '%s' - Ignored\n"
 msgstr ""
 
-msgid ""
-"lsprof not available - install from 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 ""
 
 msgid "statprof not available - install using \"easy_install statprof\""
@@ -14170,10 +14231,15 @@
 "    File contains the given regular expression."
 msgstr ""
 
+#. i18n: "grep" is a keyword
 msgid "grep requires a pattern"
 msgstr "'grep' erwartet ein Muster"
 
 #, python-format
+msgid "invalid match pattern: %s"
+msgstr "Ungültiges Suchmuster: %s"
+
+#, python-format
 msgid "couldn't parse size: %s"
 msgstr "Konnte Größe %s nicht verarbeiten"
 
@@ -14377,7 +14443,7 @@
 
 msgid ""
 "Files\n"
-"-----"
+"====="
 msgstr ""
 
 msgid ""
@@ -14423,8 +14489,7 @@
 "    Per-user configuration file(s), for the user running Mercurial. On\n"
 "    Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``. Options in these\n"
 "    files apply to all Mercurial commands executed by this user in any\n"
-"    directory. Options in these files override per-system and per-"
-"installation\n"
+"    directory. Options in these files override per-system and per-installation\n"
 "    options."
 msgstr ""
 
@@ -14480,7 +14545,7 @@
 
 msgid ""
 "Syntax\n"
-"------"
+"======"
 msgstr ""
 
 msgid ""
@@ -14586,8 +14651,7 @@
 msgid ""
 "The values are either free-form text strings, lists of text strings,\n"
 "or Boolean values. Boolean values can be set to true using any of \"1\",\n"
-"\"yes\", \"true\", or \"on\" and to false using \"0\", \"no\", \"false\", or "
-"\"off\"\n"
+"\"yes\", \"true\", or \"on\" and to false using \"0\", \"no\", \"false\", or \"off\"\n"
 "(all case insensitive)."
 msgstr ""
 
@@ -14607,10 +14671,8 @@
 
 msgid ""
 "Sections\n"
-"--------"
-msgstr ""
-"Abschnitte\n"
-"----------"
+"========"
+msgstr ""
 
 msgid ""
 "This section describes the different sections that may appear in a\n"
@@ -14618,10 +14680,13 @@
 "keys, and their possible values."
 msgstr ""
 
+#, fuzzy
 msgid ""
 "``alias``\n"
-"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"---------"
+msgstr ""
+"Beispiele\n"
+"----------"
 
 msgid ""
 "Defines command aliases.\n"
@@ -14707,7 +14772,7 @@
 msgid ""
 "\n"
 "``annotate``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\""
+"------------"
 msgstr ""
 
 msgid ""
@@ -14734,7 +14799,7 @@
 msgid ""
 "\n"
 "``auth``\n"
-"\"\"\"\"\"\"\"\""
+"--------"
 msgstr ""
 
 msgid ""
@@ -14825,11 +14890,14 @@
 "for credentials as usual if required by the remote."
 msgstr ""
 
+#, fuzzy
 msgid ""
 "\n"
 "``decode/encode``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"-----------------"
+msgstr ""
+"Phasen und Server\n"
+"--------------------------"
 
 msgid ""
 "Filters for transforming files on checkout/checkin. This would\n"
@@ -14896,7 +14964,7 @@
 msgid ""
 "\n"
 "``defaults``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\""
+"------------"
 msgstr ""
 
 msgid "(defaults are deprecated. Don't use them. Use aliases instead)"
@@ -14927,7 +14995,7 @@
 msgid ""
 "\n"
 "``diff``\n"
-"\"\"\"\"\"\"\"\""
+"--------"
 msgstr ""
 
 msgid ""
@@ -14962,10 +15030,13 @@
 "``unified``\n"
 "    Anzahl der anzuzeigenden Kontextzeilen"
 
+#, fuzzy
 msgid ""
 "``email``\n"
-"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"---------"
+msgstr ""
+"Abschnitte\n"
+"----------"
 
 msgid "Settings for extensions that send email messages."
 msgstr ""
@@ -15037,11 +15108,14 @@
 "  charsets = iso-8859-1, iso-8859-15, windows-1252"
 msgstr ""
 
+#, fuzzy
 msgid ""
 "\n"
 "``extensions``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"--------------"
+msgstr ""
+"Beschreibung\n"
+"-----------"
 
 msgid ""
 "Mercurial has an extension mechanism for adding new features. To\n"
@@ -15082,7 +15156,7 @@
 msgid ""
 "\n"
 "``format``\n"
-"\"\"\"\"\"\"\"\"\"\""
+"----------"
 msgstr ""
 
 msgid ""
@@ -15115,10 +15189,13 @@
 "    repositories will be compatible with Mercurial before version 1.7."
 msgstr ""
 
+#, fuzzy
 msgid ""
 "``graph``\n"
-"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"---------"
+msgstr ""
+"Beispiele\n"
+"----------"
 
 msgid ""
 "Web graph view configuration. This section let you change graph\n"
@@ -15152,10 +15229,13 @@
 "    Set branch edges color in hexadecimal RGB notation."
 msgstr ""
 
+#, fuzzy
 msgid ""
 "``hooks``\n"
-"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"---------"
+msgstr ""
+"Abschnitte\n"
+"----------"
 
 msgid ""
 "Commands or Python functions that get automatically executed by\n"
@@ -15287,8 +15367,7 @@
 "``pretag``\n"
 "  Run before creating a tag. Exit status 0 allows the tag to be\n"
 "  created. Non-zero status will cause the tag to fail. ID of\n"
-"  changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag "
-"is\n"
+"  changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag is\n"
 "  local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``."
 msgstr ""
 
@@ -15389,11 +15468,15 @@
 "is treated as a failure."
 msgstr ""
 
+#, fuzzy
 msgid ""
 "\n"
 "``hostfingerprints``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"--------------------"
+msgstr ""
+"\n"
+"Hinzufügen eines Unterarchivs\n"
+"-----------------------------"
 
 msgid ""
 "Fingerprints of the certificates of known HTTPS servers.\n"
@@ -15409,8 +15492,7 @@
 
 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"
+"    hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:d6:4b:ee:cc"
 msgstr ""
 
 msgid "This feature is only supported when using Python 2.6 or later."
@@ -15419,7 +15501,7 @@
 msgid ""
 "\n"
 "``http_proxy``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+"--------------"
 msgstr ""
 
 msgid ""
@@ -15457,10 +15539,13 @@
 "    in ``http_proxy.no``. True or False. Default: False."
 msgstr ""
 
+#, fuzzy
 msgid ""
 "``merge-patterns``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"------------------"
+msgstr ""
+"Phasen und Server\n"
+"--------------------------"
 
 msgid ""
 "This section specifies merge tools to associate with particular file\n"
@@ -15477,7 +15562,7 @@
 
 msgid ""
 "``merge-tools``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+"---------------"
 msgstr ""
 
 msgid ""
@@ -15555,8 +15640,7 @@
 "  ``changed``\n"
 "    Ask whether merge was successful when the merged file shows no changes.\n"
 "  ``conflicts``\n"
-"    Check whether there are conflicts even though the tool reported "
-"success.\n"
+"    Check whether there are conflicts even though the tool reported success.\n"
 "  ``prompt``\n"
 "    Always prompt for merge success, regardless of success reported by tool."
 msgstr ""
@@ -15617,7 +15701,7 @@
 msgid ""
 "\n"
 "``patch``\n"
-"\"\"\"\"\"\"\"\"\""
+"---------"
 msgstr ""
 
 msgid ""
@@ -15641,7 +15725,7 @@
 msgid ""
 "\n"
 "``paths``\n"
-"\"\"\"\"\"\"\"\"\""
+"---------"
 msgstr ""
 
 msgid ""
@@ -15664,10 +15748,13 @@
 "    is specified."
 msgstr ""
 
+#, fuzzy
 msgid ""
 "``phases``\n"
-"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"----------"
+msgstr ""
+"Zusammenfassung\n"
+"-------"
 
 msgid ""
 "Specifies default handling of phases. See :hg:`help phases` for more\n"
@@ -15688,10 +15775,13 @@
 "    Default: draft"
 msgstr ""
 
+#, fuzzy
 msgid ""
 "``profiling``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"-------------"
+msgstr ""
+"Beschreibung\n"
+"-----------"
 
 msgid ""
 "Specifies profiling type, format, and file output. Two profilers are\n"
@@ -15756,7 +15846,7 @@
 
 msgid ""
 "``revsetalias``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+"---------------"
 msgstr ""
 
 msgid "Alias definitions for revsets. See :hg:`help revsets` for details."
@@ -15764,7 +15854,7 @@
 
 msgid ""
 "``server``\n"
-"\"\"\"\"\"\"\"\"\"\""
+"----------"
 msgstr ""
 
 msgid "Controls generic server settings."
@@ -15797,10 +15887,13 @@
 "    present. Default is False."
 msgstr ""
 
+#, fuzzy
 msgid ""
 "``smtp``\n"
-"\"\"\"\"\"\"\"\""
-msgstr ""
+"--------"
+msgstr ""
+"Beispiele\n"
+"----------"
 
 msgid "Configuration for extensions that need to send email messages."
 msgstr ""
@@ -15817,8 +15910,7 @@
 
 msgid ""
 "``tls``\n"
-"    Optional. Method to enable TLS when connecting to mail server: "
-"starttls,\n"
+"    Optional. Method to enable TLS when connecting to mail server: starttls,\n"
 "    smtps or none. Default: none."
 msgstr ""
 
@@ -15841,11 +15933,14 @@
 "    itself to the MTA."
 msgstr ""
 
+#, fuzzy
 msgid ""
 "\n"
 "``subpaths``\n"
-"\"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"------------"
+msgstr ""
+"Beschreibung\n"
+"-----------"
 
 msgid ""
 "Subrepository source URLs can go stale if a remote server changes name\n"
@@ -15870,15 +15965,18 @@
 msgstr ""
 
 msgid ""
-"Relative subrepository paths are first made absolute, and the the\n"
+"Relative subrepository paths are first made absolute, and the\n"
 "rewrite rules are then applied on the full (absolute) path. The rules\n"
 "are applied in definition order."
 msgstr ""
 
+#, fuzzy
 msgid ""
 "``trusted``\n"
-"\"\"\"\"\"\"\"\"\"\"\""
-msgstr ""
+"-----------"
+msgstr ""
+"Beschreibung\n"
+"-----------"
 
 msgid ""
 "Mercurial will not use the settings in the\n"
@@ -15911,7 +16009,7 @@
 msgid ""
 "\n"
 "``ui``\n"
-"\"\"\"\"\"\""
+"------"
 msgstr ""
 
 msgid "User interface controls."
@@ -15928,8 +16026,7 @@
 msgid ""
 "``askusername``\n"
 "    Whether to prompt for a username when committing. If True, and\n"
-"    neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user "
-"will\n"
+"    neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will\n"
 "    be prompted to enter a username. If no username is entered, the\n"
 "    default ``USER@HOST`` is used instead.\n"
 "    Default is False."
@@ -15999,10 +16096,8 @@
 "    Default is ``warn``.\n"
 "    If set to ``warn`` (or ``true``), a warning message is printed on POSIX\n"
 "    platforms, if a file with a non-portable filename is added (e.g. a file\n"
-"    with a name that can't be created on Windows because it contains "
-"reserved\n"
-"    parts like ``AUX``, reserved characters like ``:``, or would cause a "
-"case\n"
+"    with a name that can't be created on Windows because it contains reserved\n"
+"    parts like ``AUX``, reserved characters like ``:``, or would cause a case\n"
 "    collision with an existing file).\n"
 "    If set to ``ignore`` (or ``false``), no warning is printed.\n"
 "    If set to ``abort``, the command is aborted.\n"
@@ -16076,8 +16171,7 @@
 "``username``\n"
 "    The committer of a changeset created when running \"commit\".\n"
 "    Typically a person's name and email address, e.g. ``Fred Widget\n"
-"    <fred@example.com>``. Default is ``$EMAIL`` or ``username@hostname``. "
-"If\n"
+"    <fred@example.com>``. Default is ``$EMAIL`` or ``username@hostname``. If\n"
 "    the username in hgrc is empty, it has to be specified manually or\n"
 "    in a different hgrc file (e.g. ``$HOME/.hgrc``, if the admin set\n"
 "    ``username =``  in the system hgrc). Environment variables in the\n"
@@ -16092,7 +16186,7 @@
 msgid ""
 "\n"
 "``web``\n"
-"\"\"\"\"\"\"\""
+"-------"
 msgstr ""
 
 msgid ""
@@ -16174,15 +16268,6 @@
 msgstr ""
 
 msgid ""
-"``guessmime``\n"
-"    Control MIME types for raw download of file content.\n"
-"    Set to True to let hgweb guess the content type from the file\n"
-"    extension. This will serve HTML files as ``text/html`` and might\n"
-"    allow cross-site scripting attacks when serving untrusted\n"
-"    repositories. Default is False."
-msgstr ""
-
-msgid ""
 "``allow_read``\n"
 "    If the user has not already been denied repository access due to\n"
 "    the contents of deny_read, this list determines whether to grant\n"
@@ -16218,8 +16303,7 @@
 msgstr ""
 
 msgid ""
-"    This feature is only supported when using Python 2.6 or later. If you "
-"wish\n"
+"    This feature is only supported when using Python 2.6 or later. If you wish\n"
 "    to use it with earlier versions of Python, install the backported\n"
 "    version of the ssl library that is available from\n"
 "    ``http://pypi.python.org``."
@@ -16263,6 +16347,14 @@
 msgstr ""
 
 msgid ""
+"``comparisoncontext``\n"
+"    Number of lines of context to show in side-by-side file comparison. If\n"
+"    negative or the value ``full``, whole files are shown. Default is 5.\n"
+"    This setting can be overridden by a ``context`` request parameter to the\n"
+"    ``comparison`` command, taking the same values."
+msgstr ""
+
+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."
@@ -16296,10 +16388,8 @@
 
 msgid ""
 "``descend``\n"
-"    hgwebdir indexes will not descend into subdirectories. Only "
-"repositories\n"
-"    directly in the current path will be shown (other repositories are "
-"still\n"
+"    hgwebdir indexes will not descend into subdirectories. Only repositories\n"
+"    directly in the current path will be shown (other repositories are still\n"
 "    available from the index corresponding to their containing path)."
 msgstr ""
 
@@ -16321,6 +16411,15 @@
 msgstr ""
 
 msgid ""
+"``guessmime``\n"
+"    Control MIME types for raw download of file content.\n"
+"    Set to True to let hgweb guess the content type from the file\n"
+"    extension. This will serve HTML files as ``text/html`` and might\n"
+"    allow cross-site scripting attacks when serving untrusted\n"
+"    repositories. Default is False."
+msgstr ""
+
+msgid ""
 "``hidden``\n"
 "    Whether to hide the repository in the hgwebdir index.\n"
 "    Default is False."
@@ -16346,12 +16445,6 @@
 msgstr ""
 
 msgid ""
-"``name``\n"
-"    Repository name to use in the web interface. Default is current\n"
-"    working directory."
-msgstr ""
-
-msgid ""
 "``maxchanges``\n"
 "    Maximum number of changes to list on the changelog. Default is 10."
 msgstr ""
@@ -16362,6 +16455,18 @@
 msgstr ""
 
 msgid ""
+"``maxshortchanges``\n"
+"    Maximum number of changes to list on the shortlog, graph or filelog\n"
+"    pages. Default is 60."
+msgstr ""
+
+msgid ""
+"``name``\n"
+"    Repository name to use in the web interface. Default is current\n"
+"    working directory."
+msgstr ""
+
+msgid ""
 "``port``\n"
 "    Port to listen on. Default is 8000."
 msgstr ""
@@ -16570,8 +16675,7 @@
 "    This is the name of the editor to run when committing. See EDITOR."
 msgstr ""
 "HGEDITOR\n"
-"    Dies ist der Name des Editors, der zum Bearbeiten der    Versions-"
-"Meldung verwendet wird. Siehe auch EDITOR."
+"    Dies ist der Name des Editors, der zum Bearbeiten der    Versions-Meldung verwendet wird. Siehe auch EDITOR."
 
 msgid "    (deprecated, use configuration file)"
 msgstr "    (veraltet, benutze Konfigurationsdatei)"
@@ -16636,8 +16740,7 @@
 "    the .hg/hgrc from the current repository is read."
 msgstr ""
 "HGRCPATH\n"
-"    Eine Liste von Dateien oder Verzeichnissen, in denen nach "
-"Konfigurations-\n"
+"    Eine Liste von Dateien oder Verzeichnissen, in denen nach Konfigurations-\n"
 "    dateien gesucht werden soll. Als Trenner zwischen zwei Elementen\n"
 "    dient \":\" unter Unix und \";\" unter Windows. Wenn HGRCPATH nicht\n"
 "    gesetzt ist, wird der plattformspezifische Standardwert verwendet.\n"
@@ -16739,8 +16842,7 @@
 "    Manchmal muss Mercurial eine Textdatei in einem Editor öffnen, damit\n"
 "    der Nutzer sie bearbeiten kann, zum Beispiel wenn eine Versionsmeldung\n"
 "    geschrieben wird. Der verwendete Editor wird aus den drei Umgebungs-\n"
-"    variablen HGEDITOR, VISUAL und EDITOR (in dieser Reihenfolge) "
-"ermittelt.\n"
+"    variablen HGEDITOR, VISUAL und EDITOR (in dieser Reihenfolge) ermittelt.\n"
 "    Der erste nicht-leere wird verwendet. Wenn alle Angaben leer sind,\n"
 "    wird die Voreinstellung 'vi' verwendet."
 
@@ -16857,11 +16959,13 @@
 "``[._a-zA-Z0-9\\x80-\\xff]`` oder wenn sie einem der vordefinierten\n"
 "Prädikate entsprechen. Sonderzeichen können in Bezeichnern mit\n"
 "Anführungszeichen verwendet werden, indem sie \\-maskiert werden, z.B.\n"
-"wird ``\\n`` als Zeilenumbruch interpretiert."
+"wird ``\\n"
+"`` als Zeilenumbruch interpretiert."
 
 msgid ""
 "Special characters can be used in quoted identifiers by escaping them,\n"
-"e.g., ``\\n`` is interpreted as a newline. To prevent them from being\n"
+"e.g., ``\\n"
+"`` is interpreted as a newline. To prevent them from being\n"
 "interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``."
 msgstr ""
 
@@ -16910,10 +17014,8 @@
 msgid "Some sample queries:"
 msgstr "Einige Beispiel-Anfragen:"
 
-msgid ""
-"- Show status of files that appear to be binary in the working directory::"
-msgstr ""
-"- Zeigt den Status von als binär erkannten Dateien im Arbeitsverzeichnis::"
+msgid "- Show status of files that appear to be binary in the working directory::"
+msgstr "- Zeigt den Status von als binär erkannten Dateien im Arbeitsverzeichnis::"
 
 msgid "    hg status -A \"set:binary()\""
 msgstr ""
@@ -17250,8 +17352,7 @@
 "    patch."
 msgstr ""
 
-msgid ""
-"    Example: \"If you diff with changeset X, you will see what I mean.\""
+msgid "    Example: \"If you diff with changeset X, you will see what I mean.\""
 msgstr ""
 
 msgid ""
@@ -17568,10 +17669,8 @@
 
 msgid ""
 "Synopsis\n"
-"--------"
-msgstr ""
-"Zusammenfassung\n"
-"-------"
+"========"
+msgstr ""
 
 msgid ""
 "The Mercurial system uses a file called ``.hgignore`` in the root\n"
@@ -17579,12 +17678,11 @@
 "for files that it is not currently tracking."
 msgstr ""
 
+#, fuzzy
 msgid ""
 "Description\n"
-"-----------"
-msgstr ""
-"Beschreibung\n"
-"-----------"
+"==========="
+msgstr "Beschreibung:\n"
 
 msgid ""
 "The working directory of a Mercurial repository will often contain\n"
@@ -17622,6 +17720,13 @@
 msgstr ""
 
 msgid ""
+"Files that are already tracked are not affected by .hgignore, even\n"
+"if they appear in .hgignore. An untracked file X can be explicitly\n"
+"added with :hg:`add X`, even if X would be excluded by a pattern\n"
+"in .hgignore."
+msgstr ""
+
+msgid ""
 "An ignore file is a plain text file consisting of a list of patterns,\n"
 "with one pattern per line. Empty lines are skipped. The ``#``\n"
 "character is treated as a comment character, and the ``\\`` character\n"
@@ -17677,7 +17782,7 @@
 
 msgid ""
 "Example\n"
-"-------"
+"======="
 msgstr ""
 
 msgid "Here is an example ignore file. ::"
@@ -17702,14 +17807,15 @@
 
 msgid ""
 "Mercurial's internal web server, hgweb, can serve either a single\n"
-"repository, or a collection of them. In the latter case, a special\n"
-"configuration file can be used to specify the repository paths to use\n"
-"and global web configuration options."
-msgstr ""
-
-msgid ""
-"This file uses the same syntax as other Mercurial configuration files,\n"
-"but only the following sections are recognized:"
+"repository, or a tree of repositories. In the second case, repository\n"
+"paths and global options can be defined using a dedicated\n"
+"configuration file common to :hg:`serve`, ``hgweb.wsgi``,\n"
+"``hgweb.cgi`` and ``hgweb.fcgi``."
+msgstr ""
+
+msgid ""
+"This file uses the same syntax as other Mercurial configuration files\n"
+"but recognizes only the following sections:"
 msgstr ""
 
 msgid ""
@@ -17718,61 +17824,58 @@
 "  - collections"
 msgstr ""
 
-msgid ""
-"The ``web`` section can specify all the settings described in the web\n"
-"section of the hgrc(5) documentation. See :hg:`help config` for\n"
-"information on where to find the manual page."
-msgstr ""
-
-msgid ""
-"The ``paths`` section provides mappings of physical repository\n"
-"paths to virtual ones. For instance::"
-msgstr ""
+msgid "The ``web`` options are thorougly described in :hg:`help config`."
+msgstr ""
+
+msgid ""
+"The ``paths`` section maps URL paths to paths of repositories in the\n"
+"filesystem. hgweb will not expose the filesystem directly - only\n"
+"Mercurial repositories can be published and only according to the\n"
+"configuration."
+msgstr ""
+
+msgid ""
+"The left hand side is the path in the URL. Note that hgweb reserves\n"
+"subpaths like ``rev`` or ``file``, try using different names for\n"
+"nested repositories to avoid confusing effects."
+msgstr ""
+
+msgid ""
+"The right hand side is the path in the filesystem. If the specified\n"
+"path ends with ``*`` or ``**`` the filesystem will be searched\n"
+"recursively for repositories below that point.\n"
+"With ``*`` it will not recurse into the repositories it finds (except for\n"
+"``.hg/patches``).\n"
+"With ``**`` it will also search inside repository working directories\n"
+"and possibly find subrepositories."
+msgstr ""
+
+#, fuzzy
+msgid "In this example::"
+msgstr "Pipe-Beispiele::"
 
 msgid ""
 "  [paths]\n"
-"  projects/a = /foo/bar\n"
-"  projects/b = /baz/quux\n"
-"  web/root = /real/root/*\n"
-"  / = /real/root2/*\n"
-"  virtual/root2 = /real/root2/**"
+"  /projects/a = /srv/tmprepos/a\n"
+"  /projects/b = c:/repos/b\n"
+"  / = /srv/repos/*\n"
+"  /user/bob = /home/bob/repos/**"
 msgstr ""
 
 msgid ""
 "- The first two entries make two repositories in different directories\n"
 "  appear under the same directory in the web interface\n"
-"- The third entry maps every Mercurial repository found in '/real/root'\n"
-"  into 'web/root'. This format is preferred over the [collections] one,\n"
-"  since using absolute paths as configuration keys is not supported on "
-"every\n"
-"  platform (especially on Windows).\n"
-"- The fourth entry is a special case mapping all repositories in\n"
-"  '/real/root2' in the root of the virtual directory.\n"
-"- The fifth entry recursively finds all repositories under the real\n"
-"  root, and maps their relative paths under the virtual root."
-msgstr ""
-
-msgid ""
-"The ``collections`` section provides mappings of trees of physical\n"
-"repositories paths to virtual ones, though the paths syntax is generally\n"
-"preferred. For instance::"
-msgstr ""
-
-msgid ""
-"  [collections]\n"
-"  /foo = /foo"
-msgstr ""
-"  [collections]\n"
-"  /foo = /foo"
-
-msgid ""
-"Here, the left side will be stripped off all repositories found in the\n"
-"right side. Thus ``/foo/bar`` and ``foo/quux/baz`` will be listed as\n"
-"``bar`` and ``quux/baz`` respectively.\n"
-msgstr ""
-"Hier wird die linke Seite von allen Projektarchiven, die auf der rechten\n"
-"Seite gefunden werden, entfernt. Daher werden ``/foo/bar`` und\n"
-"``foo/quux/baz`` als ``bar`` und ``quux/baz`` aufgelistet.\n"
+"- The third entry will publish every Mercurial repository found in\n"
+"  ``/srv/repos/``, for instance the repository ``/srv/repos/quux/``\n"
+"  will appear as ``http://server/quux/``\n"
+"- The fourth entry will publish both ``http://server/user/bob/quux/``\n"
+"  and ``http://server/user/bob/quux/testsubrepo/``"
+msgstr ""
+
+msgid ""
+"The ``collections`` section is deprecated and has been superseded by\n"
+"``paths``.\n"
+msgstr ""
 
 msgid "To merge files Mercurial uses merge tools."
 msgstr ""
@@ -17792,8 +17895,7 @@
 msgid ""
 "Usually, the merge tool tries to automatically reconcile the files by\n"
 "combining all non-overlapping changes that occurred separately in\n"
-"the two different evolutions of the same initial base file. Furthermore, "
-"some\n"
+"the two different evolutions of the same initial base file. Furthermore, some\n"
 "interactive merge programs make it easier to manually resolve\n"
 "conflicting merges, either in a graphical way, or by inserting some\n"
 "conflict markers. Mercurial does not include any interactive merge\n"
@@ -17802,7 +17904,7 @@
 
 msgid ""
 "Available merge tools\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+"====================="
 msgstr ""
 
 msgid ""
@@ -17830,49 +17932,40 @@
 msgstr ""
 
 msgid ""
-"Internal tools are always available and do not require a GUI but will by "
-"default\n"
+"Internal tools are always available and do not require a GUI but will by default\n"
 "not handle symlinks or binary files."
 msgstr ""
 
 msgid ""
 "Choosing a merge tool\n"
-"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+"====================="
 msgstr ""
 
 msgid "Mercurial uses these rules when deciding which merge tool to use:"
 msgstr ""
 
 msgid ""
-"1. If a tool has been specified with the --tool option to merge or resolve, "
-"it\n"
-"   is used.  If it is the name of a tool in the merge-tools configuration, "
-"its\n"
-"   configuration is used. Otherwise the specified tool must be executable "
-"by\n"
+"1. If a tool has been specified with the --tool option to merge or resolve, it\n"
+"   is used.  If it is the name of a tool in the merge-tools configuration, its\n"
+"   configuration is used. Otherwise the specified tool must be executable by\n"
 "   the shell."
 msgstr ""
 
 msgid ""
-"2. If the ``HGMERGE`` environment variable is present, its value is used "
-"and\n"
+"2. If the ``HGMERGE`` environment variable is present, its value is used and\n"
 "   must be executable by the shell."
 msgstr ""
 
 msgid ""
-"3. If the filename of the file to be merged matches any of the patterns in "
-"the\n"
+"3. If the filename of the file to be merged matches any of the patterns in the\n"
 "   merge-patterns configuration section, the first usable merge tool\n"
-"   corresponding to a matching pattern is used. Here, binary capabilities of "
-"the\n"
+"   corresponding to a matching pattern is used. Here, binary capabilities of the\n"
 "   merge tool are not considered."
 msgstr ""
 
 msgid ""
-"4. If ui.merge is set it will be considered next. If the value is not the "
-"name\n"
-"   of a configured tool, the specified value is used and must be executable "
-"by\n"
+"4. If ui.merge is set it will be considered next. If the value is not the name\n"
+"   of a configured tool, the specified value is used and must be executable by\n"
 "   the shell. Otherwise the named tool is used if it is usable."
 msgstr ""
 
@@ -17882,8 +17975,7 @@
 msgstr ""
 
 msgid ""
-"6. If a program named ``hgmerge`` can be found on the system, it is used - "
-"but\n"
+"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 ""
 
@@ -17898,13 +17990,10 @@
 msgid ""
 ".. note::\n"
 "   After selecting a merge program, Mercurial will by default attempt\n"
-"   to merge the files using a simple merge algorithm first. Only if it "
-"doesn't\n"
-"   succeed because of conflicting changes Mercurial will actually execute "
-"the\n"
+"   to merge the files using a simple merge algorithm first. Only if it doesn't\n"
+"   succeed because of conflicting changes Mercurial will actually execute the\n"
 "   merge program. Whether to use the simple merge algorithm first can be\n"
-"   controlled by the premerge setting of the merge tool. Premerge is enabled "
-"by\n"
+"   controlled by the premerge setting of the merge tool. Premerge is enabled by\n"
 "   default unless the file is binary or a symlink."
 msgstr ""
 
@@ -17975,8 +18064,7 @@
 "``path:``. These path names must completely match starting at the\n"
 "current repository root."
 msgstr ""
-"Mit dem Prefix ``path:`` wird ein Pfad relativ zur Wurzel des "
-"Projektarchivs\n"
+"Mit dem Prefix ``path:`` wird ein Pfad relativ zur Wurzel des Projektarchivs\n"
 "ohne Mustererkennung angenommen."
 
 msgid ""
@@ -18063,7 +18151,7 @@
 
 msgid ""
 "What are phases?\n"
-"----------------"
+"================"
 msgstr ""
 
 msgid ""
@@ -18073,8 +18161,7 @@
 msgstr ""
 
 msgid "Each changeset in a repository is in one of the following phases:"
-msgstr ""
-"Jeder Änderungssatz in einem Projektarchiv ist in einer der folgenden Phasen:"
+msgstr "Jeder Änderungssatz in einem Projektarchiv ist in einer der folgenden Phasen:"
 
 msgid ""
 " - public : changeset is visible on a public server\n"
@@ -18091,10 +18178,8 @@
 
 msgid ""
 "How are phases managed?\n"
-"-----------------------"
-msgstr ""
-"Wie werden Phasen verwaltet?\n"
-"--------------------------"
+"======================="
+msgstr ""
 
 msgid ""
 "For the most part, phases should work transparently. By default, a\n"
@@ -18111,10 +18196,8 @@
 
 msgid ""
 "Phases and servers\n"
-"------------------"
-msgstr ""
-"Phasen und Server\n"
-"--------------------------"
+"=================="
+msgstr ""
 
 msgid "Normally, all servers are ``publishing`` by default. This means::"
 msgstr ""
@@ -18152,8 +18235,7 @@
 "  publish = False"
 
 msgid "See :hg:`help config` for more information on config files."
-msgstr ""
-"Siehe :hg:`help config` für weitere Informationen über Konfigurationsdateien."
+msgstr "Siehe :hg:`help config` für weitere Informationen über Konfigurationsdateien."
 
 msgid ""
 ".. note::\n"
@@ -18163,10 +18245,8 @@
 
 msgid ""
 "Examples\n"
-"--------"
-msgstr ""
-"Beispiele\n"
-"----------"
+"========"
+msgstr ""
 
 msgid " - list changesets in draft or secret phase::"
 msgstr ""
@@ -18180,8 +18260,7 @@
 msgid "     hg phase --draft \"secret()\""
 msgstr ""
 
-msgid ""
-" - forcibly move the current changeset and descendants from public to draft::"
+msgid " - forcibly move the current changeset and descendants from public to draft::"
 msgstr ""
 
 msgid "     hg phase --force --draft ."
@@ -18190,23 +18269,20 @@
 msgid " - show a list of changeset revision and phase::"
 msgstr ""
 
-msgid "     hg log --template \"{rev} {phase}\\n\""
+msgid ""
+"     hg log --template \"{rev} {phase}\\n"
+"\""
 msgstr ""
 
 #, fuzzy
 msgid " - resynchronize draft changesets relative to a remote repository::"
-msgstr ""
-" - Änderungssätze in der Entwurfsphase (draft) erneut bezüglich eines "
-"entfernten Projektarchivs synchronisieren::"
+msgstr " - Änderungssätze in der Entwurfsphase (draft) erneut bezüglich eines entfernten Projektarchivs synchronisieren::"
 
 msgid "     hg phase -fd 'outgoing(URL)' "
 msgstr ""
 
-msgid ""
-"See :hg:`help phase` for more information on manually manipulating phases.\n"
-msgstr ""
-"Siehe :hg:`help phase` für mehr Informationen über die manuelle Manipulation "
-"von Phasen.\n"
+msgid "See :hg:`help phase` for more information on manually manipulating phases.\n"
+msgstr "Siehe :hg:`help phase` für mehr Informationen über die manuelle Manipulation von Phasen.\n"
 
 msgid "Mercurial supports several ways to specify individual revisions."
 msgstr "Mercurial unterstützt mehrere Arten individuelle Revisionen anzugeben."
@@ -18247,8 +18323,7 @@
 "oder Zweiges behandelt. Ein Lesezeichen ist ein beweglicher Zeiger auf eine\n"
 "Revision. Ein Etikett ist ein permanenter Name für eine Revision.\n"
 "Ein Zweigname bezeichnet hier die jüngste Kopfrevision des Zweigs.\n"
-"Lesezeichen, Etiketten und Zweignamen dürfen das Zeichen \":\" nicht "
-"enthalten."
+"Lesezeichen, Etiketten und Zweignamen dürfen das Zeichen \":\" nicht enthalten."
 
 msgid "The reserved name \"tip\" always identifies the most recent revision."
 msgstr "Der reservierte Name \"tip\" identifiziert immer die neueste Revision."
@@ -18381,8 +18456,7 @@
 "Die folgenden Prädikate werden unterstützt:"
 
 msgid ""
-"New predicates (known as \"aliases\") can be defined, using any combination "
-"of\n"
+"New predicates (known as \"aliases\") can be defined, using any combination of\n"
 "existing predicates or other aliases. An alias definition looks like::"
 msgstr ""
 
@@ -18469,9 +18543,7 @@
 "  release::"
 msgstr ""
 
-msgid ""
-"    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 ""
 
 msgid ""
@@ -18503,8 +18575,7 @@
 "   tell where the subrepository checkouts come from. Mercurial\n"
 "   subrepositories are referenced like:"
 msgstr ""
-"2. Verschachtelte Archivreferenzen. Sie werden in ``.hgsub`` definiert,   "
-"was in der Wurzel des Arbeitsverzeichnisses abgelegt werden sollte,\n"
+"2. Verschachtelte Archivreferenzen. Sie werden in ``.hgsub`` definiert,   was in der Wurzel des Arbeitsverzeichnisses abgelegt werden sollte,\n"
 "   und geben an, wo Aktualisierungen für Unterarchive herkommen.\n"
 "   Mercurial-Unterarchive werden wie folgt angegeben:"
 
@@ -18549,11 +18620,8 @@
 msgid ""
 "\n"
 "Adding a Subrepository\n"
-"----------------------"
-msgstr ""
-"\n"
-"Hinzufügen eines Unterarchivs\n"
-"-----------------------------"
+"======================"
+msgstr ""
 
 msgid ""
 "If ``.hgsub`` does not exist, create it and add it to the parent\n"
@@ -18563,8 +18631,7 @@
 "subrepository is tracked and the next commit will record its state in\n"
 "``.hgsubstate`` and bind it to the committed changeset."
 msgstr ""
-"Wenn ``.hgsub`` nicht existiert, wird die Datei erstellt und dem "
-"übergeordneten Archiv hinzugefügt. Erstellen Sie eine Arbeitskopie\n"
+"Wenn ``.hgsub`` nicht existiert, wird die Datei erstellt und dem übergeordneten Archiv hinzugefügt. Erstellen Sie eine Arbeitskopie\n"
 "(beispielsweise mit clone oder checkout) der externen Projekte dort,\n"
 "wo sie im übergeordneten Projektarchiv liegen soll. Bearbeiten Sie\n"
 "``.hgsub`` und fügen Sie den Unterarchiv-Eintrag wie oben beschrieben\n"
@@ -18574,10 +18641,8 @@
 
 msgid ""
 "Synchronizing a Subrepository\n"
-"-----------------------------"
-msgstr ""
-"Synchronisieren eines Unterarchivs\n"
-"----------------------------------"
+"============================="
+msgstr ""
 
 #, fuzzy
 msgid ""
@@ -18607,10 +18672,8 @@
 
 msgid ""
 "Deleting a Subrepository\n"
-"------------------------"
-msgstr ""
-"Löschen eines Unterarchivs\n"
-"--------------------------"
+"========================"
+msgstr ""
 
 msgid ""
 "To remove a subrepository from the parent repository, delete its\n"
@@ -18621,10 +18684,8 @@
 
 msgid ""
 "Interaction with Mercurial Commands\n"
-"-----------------------------------"
-msgstr ""
-"Interaktion mit Mercurial-Befehlen\n"
-"----------------------------------"
+"==================================="
+msgstr ""
 
 msgid ""
 ":add: add does not recurse in subrepos unless -S/--subrepos is\n"
@@ -18760,10 +18821,8 @@
 
 msgid ""
 "Remapping Subrepositories Sources\n"
-"---------------------------------"
-msgstr ""
-"Umleitung der Quellen von Unterarchiven\n"
-"---------------------------------------"
+"================================="
+msgstr ""
 
 msgid ""
 "A subrepository source location may change during a project life,\n"
@@ -18819,10 +18878,12 @@
 "Ausgabe mit den eigentlichen Informationen ersetzt werden::"
 
 msgid ""
-"    $ hg log -r1 --template \"{node}\\n\"\n"
+"    $ hg log -r1 --template \"{node}\\n"
+"\"\n"
 "    b56ce7b07c52de7d5fd79fb89701ea538af65746"
 msgstr ""
-"    $ hg log -r1 --template \"{node}\\n\"\n"
+"    $ hg log -r1 --template \"{node}\\n"
+"\"\n"
 "    b56ce7b07c52de7d5fd79fb89701ea538af65746"
 
 msgid ""
@@ -18856,10 +18917,12 @@
 "erhalten::"
 
 msgid ""
-"   $ hg tip --template \"{date|isodate}\\n\"\n"
+"   $ hg tip --template \"{date|isodate}\\n"
+"\"\n"
 "   2008-08-21 18:22 +0000"
 msgstr ""
-"   $ hg tip --template \"{date|isodate}\\n\"\n"
+"   $ hg tip --template \"{date|isodate}\\n"
+"\"\n"
 "   2008-08-21 18:22 +0000"
 
 msgid "List of filters:"
@@ -18915,8 +18978,7 @@
 "Note that the security of HTTPS URLs depends on proper configuration of\n"
 "web.cacerts."
 msgstr ""
-"Beachten Sie, dass die Sicherheit von HTTPS-URLs von der richtigen "
-"Konfiguration\n"
+"Beachten Sie, dass die Sicherheit von HTTPS-URLs von der richtigen Konfiguration\n"
 "von web.cacerts abhängt."
 
 msgid "Some notes about using SSH with Mercurial:"
@@ -18942,8 +19004,7 @@
 "- Mercurial doesn't use its own compression via SSH; the right thing\n"
 "  to do is to configure it in your ~/.ssh/config, e.g.::"
 msgstr ""
-"- Mercurial nutzt keine eigene Kompressionsmechanismen über SSH; hier "
-"sollte\n"
+"- Mercurial nutzt keine eigene Kompressionsmechanismen über SSH; hier sollte\n"
 "  man die Kompression über ~/.ssh/config aktivieren, z.B.::"
 
 msgid ""
@@ -19004,10 +19065,8 @@
 "  pull-like commands (including incoming and outgoing)."
 msgstr ""
 "default:\n"
-"  Bei Erstellung eines Projektarchivs mit 'hg clone' sichert der clone-"
-"Befehl\n"
-"  die Herkunft des Quellarchivs als 'default'-Pfad des neuen Archivs. "
-"Dieser\n"
+"  Bei Erstellung eines Projektarchivs mit 'hg clone' sichert der clone-Befehl\n"
+"  die Herkunft des Quellarchivs als 'default'-Pfad des neuen Archivs. Dieser\n"
 "  Pfad wird immer dann genutzt, wenn bei Befehlen wie 'push'- oder 'pull'\n"
 "  der Pfad nicht angegeben wurde (auch 'incoming' und 'outgoing')."
 
@@ -19043,6 +19102,10 @@
 msgid "destination directory: %s\n"
 msgstr "Zielverzeichnis: %s\n"
 
+#, fuzzy
+msgid "empty destination path is not valid"
+msgstr "Ziel %s ist kein Verzeichnis"
+
 #, python-format
 msgid "destination '%s' already exists"
 msgstr "Ziel '%s' existiert bereits"
@@ -19051,9 +19114,7 @@
 msgid "destination '%s' is not empty"
 msgstr "Ziel %s ist nicht leer"
 
-msgid ""
-"src repository does not support revision lookup and so doesn't support clone "
-"by revision"
+msgid "src repository does not support revision lookup and so doesn't support clone by revision"
 msgstr ""
 "Quellarchiv unterstützt keine Revisions-Abfragen und\n"
 "lässt daher das Klonen bis zu einer Revision nicht zu"
@@ -19066,18 +19127,13 @@
 msgstr "Aktualisiere auf Zweig %s\n"
 
 #, python-format
-msgid ""
-"%d files updated, %d files merged, %d files removed, %d files unresolved\n"
-msgstr ""
-"%d Dateien aktualisiert, %d Dateien zusammengeführt, %d Dateien entfernt, %d "
-"Dateien ungelöst\n"
+msgid "%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr "%d Dateien aktualisiert, %d Dateien zusammengeführt, %d Dateien entfernt, %d Dateien ungelöst\n"
 
 msgid "use 'hg resolve' to retry unresolved file merges\n"
 msgstr "Nutze 'hg resolve', um ungelöste Merges zu wiederholen\n"
 
-msgid ""
-"use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to "
-"abandon\n"
+msgid "use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon\n"
 msgstr ""
 "Nutze 'hg resolve', um ungelöste Merges zu wiederholen\n"
 "oder 'hg update -C .' um aufzugeben\n"
@@ -19108,9 +19164,12 @@
 msgstr "Kann Server nicht auf '%s:%d' starten: %s"
 
 #, python-format
+msgid "(binary file %s, hash: %s)"
+msgstr ""
+
+#, python-format
 msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
-msgstr ""
-" %d Dateien verändert, %d Zeilen hinzugefügt(+), %d Zeilen entfernt(-)\n"
+msgstr " %d Dateien verändert, %d Zeilen hinzugefügt(+), %d Zeilen entfernt(-)\n"
 
 #, python-format
 msgid "calling hook %s: %s\n"
@@ -19166,6 +19225,10 @@
 msgid "warning: %s hook %s\n"
 msgstr "Warnung: %s-Hook %s\n"
 
+#, fuzzy, python-format
+msgid "loading %s hook failed:\n"
+msgstr "Warnung: %s-Hook schlug fehl\n"
+
 msgid "kb"
 msgstr ""
 
@@ -19245,8 +19308,7 @@
 
 #, python-format
 msgid "warning: ignoring unknown working parent %s!\n"
-msgstr ""
-"Warnung: Ignoriere unbekannte Elternversion %s des Arbeitsverzeichnisses!\n"
+msgstr "Warnung: Ignoriere unbekannte Elternversion %s des Arbeitsverzeichnisses!\n"
 
 #, python-format
 msgid "%r cannot be used in a tag name"
@@ -19257,8 +19319,7 @@
 msgstr "Warnung: Tag %s steht im Konflikt mit existierendem Zweignamen\n"
 
 msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
-msgstr ""
-"Arbeitskopie von .hgtags wurde geändert (bitte speichere .hgtags manuell)"
+msgstr "Arbeitskopie von .hgtags wurde geändert (bitte speichere .hgtags manuell)"
 
 msgid "abandoned transaction found - run hg recover"
 msgstr "abgebrochene Transaktion gefunden - bitte führe hg recover aus"
@@ -19291,9 +19352,7 @@
 
 #, python-format
 msgid "named branch could not be reset: current branch is still '%s'\n"
-msgstr ""
-"Benannter Zweig konnte nicht zurückgesetzt werden: aktueller Zweig ist "
-"weiterhin '%s'\n"
+msgstr "Benannter Zweig konnte nicht zurückgesetzt werden: aktueller Zweig ist weiterhin '%s'\n"
 
 #, python-format
 msgid "working directory now based on revisions %d and %d\n"
@@ -19320,9 +19379,7 @@
 msgstr ""
 
 msgid "cannot partially commit a merge (do not specify files or patterns)"
-msgstr ""
-"Das Zusammenführen kann nicht teilweise gespeichert werden (gib keine "
-"Dateien oder Muster an)"
+msgstr "Das Zusammenführen kann nicht teilweise gespeichert werden (gib keine Dateien oder Muster an)"
 
 #, python-format
 msgid "commit with new subrepo %s excluded"
@@ -19344,8 +19401,7 @@
 msgstr "Datei wird nicht versioniert!"
 
 msgid "cannot commit merge with missing files"
-msgstr ""
-"Zusammenführung kann aufgrund fehlender Dateien nicht übernommen werden"
+msgstr "Zusammenführung kann aufgrund fehlender Dateien nicht übernommen werden"
 
 msgid "unresolved merge conflicts (see hg help resolve)"
 msgstr "Ungelöste Konflikte beim Zusammenführen (siehe hg help resolve)"
@@ -19365,17 +19421,28 @@
 msgid "requesting all changes\n"
 msgstr "Fordere alle Änderungen an\n"
 
-msgid ""
-"partial pull cannot be done because other repository doesn't support "
-"changegroupsubset."
-msgstr ""
-"Teilweiser Pull kann nicht ausgeführt werden, da das andere Projektarchiv "
-"changegroupsubset nicht unterstützt."
+msgid "partial pull cannot be done because other repository doesn't support changegroupsubset."
+msgstr "Teilweiser Pull kann nicht ausgeführt werden, da das andere Projektarchiv changegroupsubset nicht unterstützt."
+
+#, fuzzy
+msgid "destination does not support push"
+msgstr "Ziel %s ist nicht leer"
+
+#, fuzzy, python-format
+msgid "push includes an obsolete changeset: %s!"
+msgstr "Push erzeugt neuen entfernten Zweig '%s'!"
+
+#, fuzzy, python-format
+msgid "push includes an unstable changeset: %s!"
+msgstr "Nicht veränderbarer Änderungssatz %s kann nicht verschoben werden"
 
 #, python-format
 msgid "updating %s to public failed!\n"
 msgstr ""
 
+msgid "failed to push some obsolete markers!\n"
+msgstr ""
+
 #, python-format
 msgid "%d changesets found\n"
 msgstr "%d Änderungssätze gefunden\n"
@@ -19420,7 +19487,8 @@
 msgid "added %d changesets with %d changes to %d files%s\n"
 msgstr "Fügte %d Änderungssätze mit %d Änderungen an %d Dateien hinzu%s\n"
 
-msgid "Unexpected response from remote server:"
+#, fuzzy
+msgid "unexpected response from remote server:"
 msgstr "Unerwartete Antwort vom entfernten Server:"
 
 msgid "operation forbidden by server"
@@ -19471,14 +19539,11 @@
 msgstr "Sende E-Mail: %s\n"
 
 msgid "smtp specified as email transport, but no smtp host configured"
-msgstr ""
-"SMTP zum Versenden von E-Mails angegeben, aber es wurde kein SMTP-Host "
-"konfiguriert"
+msgstr "SMTP zum Versenden von E-Mails angegeben, aber es wurde kein SMTP-Host konfiguriert"
 
 #, python-format
 msgid "%r specified as email transport, but not in PATH"
-msgstr ""
-"%r zum Versenden von E-Mails angegeben, wurde aber nicht in PATH gefunden"
+msgstr "%r zum Versenden von E-Mails angegeben, wurde aber nicht in PATH gefunden"
 
 #, python-format
 msgid "ignoring invalid sendcharset: %s\n"
@@ -19493,8 +19558,12 @@
 msgstr "Ungültige lokale Adresse: %s"
 
 #, python-format
-msgid "'\\n' and '\\r' disallowed in filenames: %r"
-msgstr "'\\n' und '\\r' sind nicht in Dateinamen erlaubt: %r"
+msgid ""
+"'\\n"
+"' and '\\r' disallowed in filenames: %r"
+msgstr ""
+"'\\n"
+"' und '\\r' sind nicht in Dateinamen erlaubt: %r"
 
 #, python-format
 msgid "failed to remove %s from manifest"
@@ -19519,11 +19588,8 @@
 msgid "%s: untracked file differs\n"
 msgstr "%s: Unversionierte Datei verändert\n"
 
-msgid ""
-"untracked files in working directory differ from files in requested revision"
-msgstr ""
-"Unversionierte Dateien in der Arbeitskopie unterscheidet sich von der "
-"angeforderten Revision: '%s'"
+msgid "untracked files in working directory differ from files in requested revision"
+msgstr "Unversionierte Dateien in der Arbeitskopie unterscheidet sich von der angeforderten Revision: '%s'"
 
 #, python-format
 msgid "case-folding collision between %s and %s"
@@ -19609,13 +19675,10 @@
 msgstr "Ausstehende, unversionierte Änderungen im Unterarchiv '%s'"
 
 msgid "crosses branches (merge branches or use --clean to discard changes)"
-msgstr ""
-"kreuzt Zweige (nutze :hg:`merge` zum Zusammenführen oder :hg:`update -C` um "
-"die Änderungen zu verwerfen)"
+msgstr "kreuzt Zweige (nutze :hg:`merge` zum Zusammenführen oder :hg:`update -C` um die Änderungen zu verwerfen)"
 
 msgid "crosses branches (merge branches or update --check to force update)"
-msgstr ""
-"kreuzt Zweige (nutze :hg:`merge` oder :hg:`update --check` zum Erzwingen)"
+msgstr "kreuzt Zweige (nutze :hg:`merge` oder :hg:`update --check` zum Erzwingen)"
 
 msgid "Attention:"
 msgstr "Obacht:"
@@ -19645,6 +19708,22 @@
 msgstr "Warnung!"
 
 #, python-format
+msgid "parsing obsolete marker: unknown version %r"
+msgstr ""
+
+#, python-format
+msgid "parsing obsolete marker: metadata is too short, %d bytes expected, got %d"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "unknown key: %r"
+msgstr "Unbekannter Sortiermodus: %r"
+
+#, fuzzy
+msgid "unexpected old value"
+msgstr "Unerwartete Antwort:"
+
+#, python-format
 msgid "unexpected token: %s"
 msgstr "Unerwartetes Token: %s"
 
@@ -19658,9 +19737,7 @@
 
 #, python-format
 msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
-msgstr ""
-"%d von %d Teilstücken sind FEHLGESCHLAGEN -- speichere Ausschuss in Datei "
-"%s\n"
+msgstr "%d von %d Teilstücken sind FEHLGESCHLAGEN -- speichere Ausschuss in Datei %s\n"
 
 #, python-format
 msgid "cannot patch %s: file is not tracked"
@@ -19689,15 +19766,11 @@
 
 #, python-format
 msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
-msgstr ""
-"Teilstück #%d wurde erfolgreich in Zeile %d mit Unschärfe %d angewandt (%d "
-"Zeilen verschoben).\n"
+msgstr "Teilstück #%d wurde erfolgreich in Zeile %d mit Unschärfe %d angewandt (%d Zeilen verschoben).\n"
 
 #, python-format
 msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
-msgstr ""
-"Teilstück #%d wurde erfolgreich in Zeile %d angewandt (%d Zeilen "
-"verschoben).\n"
+msgstr "Teilstück #%d wurde erfolgreich in Zeile %d angewandt (%d Zeilen verschoben).\n"
 
 #, python-format
 msgid "Hunk #%d FAILED at %d\n"
@@ -19754,6 +19827,10 @@
 msgid "patch failed to apply"
 msgstr "Patch schlug fehl"
 
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr "Kann nicht %s; entferntes Projektarchiv unterstützt nicht die %r-Fähigkeiten"
+
 msgid "cannot change null revision phase"
 msgstr "Kann die Phase der Null-Revision nicht ändern"
 
@@ -19796,10 +19873,9 @@
 msgid "strip failed, partial bundle stored in '%s'\n"
 msgstr "Bereinigen fehlgeschlagen, partielles Bündel in '%s' gespeichert\n"
 
-#, python-format
-msgid "cannot %s; remote repository does not support the %r capability"
-msgstr ""
-"Kann nicht %s; entferntes Projektarchiv unterstützt nicht die %r-Fähigkeiten"
+#, fuzzy, python-format
+msgid "revlog decompress error: %s"
+msgstr "hg: Parserfehler: %s\n"
 
 #, python-format
 msgid "unknown compression type %r"
@@ -19915,6 +19991,7 @@
 "    - ``current``            : the cset currently being bisected"
 msgstr ""
 
+#. i18n: "bisect" is a keyword
 msgid "bisect requires a string"
 msgstr "bisect erwartet eine Zeichenkette"
 
@@ -19925,8 +20002,7 @@
 
 msgid ""
 "    If `name` starts with `re:`, the remainder of the name is treated as\n"
-"    a regular expression. To match a bookmark that actually starts with `re:"
-"`,\n"
+"    a regular expression. To match a bookmark that actually starts with `re:`,\n"
 "    use the prefix `literal:`."
 msgstr ""
 
@@ -19944,8 +20020,7 @@
 
 msgid ""
 "``branch(string or set)``\n"
-"    All changesets belonging to the given branch or the branches of the "
-"given\n"
+"    All changesets belonging to the given branch or the branches of the given\n"
 "    changesets."
 msgstr ""
 "``branch(zeichenkette oder liste)``\n"
@@ -19954,8 +20029,7 @@
 
 msgid ""
 "    If `string` starts with `re:`, the remainder of the name is treated as\n"
-"    a regular expression. To match a branch that actually starts with `re:"
-"`,\n"
+"    a regular expression. To match a branch that actually starts with `re:`,\n"
 "    use the prefix `literal:`."
 msgstr ""
 
@@ -19988,6 +20062,22 @@
 msgstr "'contains' erwartet ein Muster"
 
 msgid ""
+"``converted([id])``\n"
+"    Changesets converted from the given identifier in the old repository if\n"
+"    present, or all converted changesets if no identifier is specified."
+msgstr ""
+
+#. i18n: "converted" is a keyword
+#, fuzzy
+msgid "converted takes one or no arguments"
+msgstr "'tag' erwartet eins oder keine Argumente"
+
+#. i18n: "converted" is a keyword
+#, fuzzy
+msgid "converted requires a revision"
+msgstr "Konvertiere Revisionen"
+
+msgid ""
 "``date(interval)``\n"
 "    Changesets within the interval, see :hg:`help dates`."
 msgstr ""
@@ -20018,13 +20108,34 @@
 "    Nachkommen der Änderungssätze in der Liste sind."
 
 msgid ""
+"``destination([set])``\n"
+"    Changesets that were created by a graft, transplant or rebase operation,\n"
+"    with the given revisions specified as the source.  Omitting the optional set\n"
+"    is the same as passing all()."
+msgstr ""
+
+msgid ""
 "``draft()``\n"
 "    Changeset in draft phase."
 msgstr ""
 
+#. i18n: "draft" is a keyword
 msgid "draft takes no arguments"
 msgstr "draft erwartet keine Argumente"
 
+#, fuzzy
+msgid ""
+"``extinct()``\n"
+"    Obsolete changesets with obsolete descendants only."
+msgstr ""
+"``descendants(liste)``\n"
+"    Nachkommen der Änderungssätze in der Liste sind."
+
+#. i18n: "extinct" is a keyword
+#, fuzzy
+msgid "extinct takes no arguments"
+msgstr "'exec' erwartet keine Argumente"
+
 msgid ""
 "``extra(label, [value])``\n"
 "    Changesets with the given label in the extra metadata, with the given\n"
@@ -20037,12 +20148,15 @@
 "    use the prefix `literal:`."
 msgstr ""
 
+#. i18n: "extra" is a keyword
 msgid "extra takes at least 1 and at most 2 arguments"
 msgstr "extra erwartet mindestens eins und höchstens zwei Argumente"
 
+#. i18n: "extra" is a keyword
 msgid "first argument to extra must be a string"
 msgstr "Erstes Argument für extra muss eine Zeichenkette sein"
 
+#. i18n: "extra" is a keyword
 msgid "second argument to extra must be a string"
 msgstr "Zweites Argument für extra muss eine Zeichenkette sein"
 
@@ -20053,6 +20167,13 @@
 "``filelog(muster)``\n"
 "    Änderungssätze, die das gegebene filelog betreffen."
 
+msgid ""
+"    For performance reasons, ``filelog()`` does not show every changeset\n"
+"    that affects the requested file(s). See :hg:`help log` for details. For\n"
+"    a slower, more accurate result, use ``file()``."
+msgstr ""
+
+#. i18n: "filelog" is a keyword
 msgid "filelog requires a pattern"
 msgstr "'filelog' erwartet ein Muster"
 
@@ -20104,23 +20225,23 @@
 msgid "grep requires a string"
 msgstr "'grep' erwartet eine Zeichenkette"
 
-#, python-format
-msgid "invalid match pattern: %s"
-msgstr "Ungültiges Suchmuster: %s"
-
 #. i18n: "_matchfiles" is a keyword
 msgid "_matchfiles requires at least one argument"
 msgstr "_matchfiles erwartet mindestens ein Argument"
 
+#. i18n: "_matchfiles" is a keyword
 msgid "_matchfiles requires string arguments"
 msgstr "_matchfiles erwartet Zeichenketten als Argumente"
 
+#. i18n: "_matchfiles" is a keyword
 msgid "_matchfiles expected at most one revision"
 msgstr "_matchfiles erwartete mindestens eine Revision"
 
+#. i18n: "_matchfiles" is a keyword
 msgid "_matchfiles expected at most one default mode"
 msgstr ""
 
+#. i18n: "_matchfiles" is a keyword
 #, python-format
 msgid "invalid _matchfiles prefix: %s"
 msgstr "Ungültiges Präfix für _matchfiles: %s"
@@ -20132,6 +20253,11 @@
 "``file(muster)``\n"
 "    Änderungssätze, die auf das Muster passende Dateien betreffen."
 
+msgid ""
+"    For a faster but less accurate result, consider using ``filelog()``\n"
+"    instead."
+msgstr ""
+
 #. i18n: "file" is a keyword
 msgid "file requires a pattern"
 msgstr "'file' erwartet ein Muster"
@@ -20257,6 +20383,28 @@
 msgid "id requires a string"
 msgstr "'id' erwartet eine Zeichenkette"
 
+#, fuzzy
+msgid ""
+"``obsolete()``\n"
+"    Mutable changeset with a newer version."
+msgstr ""
+"``merge()``\n"
+"    Änderungssatz ist eine Zusammenführung."
+
+#. i18n: "obsolete" is a keyword
+#, fuzzy
+msgid "obsolete takes no arguments"
+msgstr "'deleted' erwartet keine Argumente"
+
+msgid ""
+"``origin([set])``\n"
+"    Changesets that were specified as a source for the grafts, transplants or\n"
+"    rebases that created the given revisions.  Omitting the optional set is the\n"
+"    same as passing all().  If a changeset created by these operations is itself\n"
+"    specified as a source for one of these operations, only the source changeset\n"
+"    for the first operation is selected."
+msgstr ""
+
 msgid ""
 "``outgoing([path])``\n"
 "    Changesets not found in the specified destination repository, or the\n"
@@ -20292,8 +20440,7 @@
 
 msgid ""
 "``parents([set])``\n"
-"    The set of all parents for all changesets in set, or the working "
-"directory."
+"    The set of all parents for all changesets in set, or the working directory."
 msgstr ""
 "``parents([liste])``\n"
 "    Die Menge aller Eltern für die Änderungssätze der Liste oder des\n"
@@ -20322,6 +20469,7 @@
 "    Changeset in public phase."
 msgstr ""
 
+#. i18n: "public" is a keyword
 msgid "public takes no arguments"
 msgstr "public erwartet keine Argumente"
 
@@ -20374,8 +20522,7 @@
 
 msgid ""
 "``matching(revision [, field])``\n"
-"    Changesets in which a given set of fields match the set of fields in "
-"the\n"
+"    Changesets in which a given set of fields match the set of fields in the\n"
 "    selected revision or set."
 msgstr ""
 
@@ -20384,14 +20531,16 @@
 "    by spaces (e.g. ``author description``)."
 msgstr ""
 
-msgid ""
-"    Valid fields are most regular revision fields and some special fields."
+msgid "    Valid fields are most regular revision fields and some special fields."
 msgstr ""
 
 msgid ""
 "    Regular revision fields are ``description``, ``author``, ``branch``,\n"
-"    ``date``, ``files``, ``phase``, ``parents``, ``substate`` and ``user``.\n"
-"    Note that ``author`` and ``user`` are synonyms."
+"    ``date``, ``files``, ``phase``, ``parents``, ``substate``, ``user``\n"
+"    and ``diff``.\n"
+"    Note that ``author`` and ``user`` are synonyms. ``diff`` refers to the\n"
+"    contents of the revision. Two revisions matching their ``diff`` will\n"
+"    also match their ``files``."
 msgstr ""
 
 msgid ""
@@ -20406,12 +20555,15 @@
 "    specified. You can match more than one field at a time."
 msgstr ""
 
+#. i18n: "matching" is a keyword
 msgid "matching takes 1 or 2 arguments"
 msgstr "matching erwartet 1 oder 2 Argumente"
 
+#. i18n: "matching" is a keyword
 msgid "matching requires a string as its second argument"
 msgstr "matching erwartet eine Zeichenkette als sein zweites Argument"
 
+#. i18n: "matching" is a keyword
 #, python-format
 msgid "unexpected field name passed to matching: %s"
 msgstr "Unerwarteter Feldname wurde an matching übergeben: %s"
@@ -20435,6 +20587,7 @@
 "    Changeset in secret phase."
 msgstr ""
 
+#. i18n: "secret" is a keyword
 msgid "secret takes no arguments"
 msgstr "secret erwartet keine Argumente"
 
@@ -20467,6 +20620,7 @@
 msgid "sort requires one or two arguments"
 msgstr "'sort' verlangt ein oder zwei Argumente"
 
+#. i18n: "sort" is a keyword
 msgid "sort spec must be a string"
 msgstr "Sortiermodus muss eine Zeichenkette sein"
 
@@ -20495,6 +20649,19 @@
 msgid "no tags exist that match '%s'"
 msgstr "Es existiert kein Etikett, dass auf '%s' passt"
 
+#, fuzzy
+msgid ""
+"``unstable()``\n"
+"    Non-obsolete changesets with obsolete ancestors."
+msgstr ""
+"``all()``\n"
+"    Alle Änderungssätze, entspricht ``0:tip``."
+
+#. i18n: "unstable" is a keyword
+#, fuzzy
+msgid "unstable takes no arguments"
+msgstr "'unresolved' erwartet keine Argumente"
+
 msgid ""
 "``user(string)``\n"
 "    User name contains string. The match is case-insensitive."
@@ -20503,8 +20670,7 @@
 "    Der Benutzername enthält die Zeichenkette. Großschreibung wird ignoriert."
 
 msgid ""
-"    If `string` starts with `re:`, the remainder of the string is treated "
-"as\n"
+"    If `string` starts with `re:`, the remainder of the string is treated as\n"
 "    a regular expression. To match a user that actually contains `re:`, use\n"
 "    the prefix `literal:`."
 msgstr ""
@@ -20528,8 +20694,7 @@
 
 #, python-format
 msgid "no changes found (ignored %d secret changesets)\n"
-msgstr ""
-"Keine Änderungen gefunden (%d geheime Änderungssätze wurden ignoriert)\n"
+msgstr "Keine Änderungen gefunden (%d geheime Änderungssätze wurden ignoriert)\n"
 
 #, python-format
 msgid "ui.portablefilenames value is invalid ('%s')"
@@ -20564,14 +20729,11 @@
 
 #, python-format
 msgid "recording removal of %s as rename to %s (%d%% similar)\n"
-msgstr ""
-"Interpretiere die Entfernung von %s als Umbenennung in %s (%d%% ähnlich)\n"
+msgstr "Interpretiere die Entfernung von %s als Umbenennung in %s (%d%% ähnlich)\n"
 
 #, python-format
 msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
-msgstr ""
-"%s ist nicht im Archiv, daher gilt %s als neu hinzugefügt (nicht als "
-"kopiert).\n"
+msgstr "%s ist nicht im Archiv, daher gilt %s als neu hinzugefügt (nicht als kopiert).\n"
 
 msgid ".hg/requires file is corrupt"
 msgstr ".hg/requires file ist beschädigt"
@@ -20662,14 +20824,11 @@
 
 #, python-format
 msgid "host fingerprint for %s can't be verified (Python too old)"
-msgstr ""
-"Server Authentizität für %s kann nicht verifiziert werden (Python ist zu alt)"
+msgstr "Server Authentizität für %s kann nicht verifiziert werden (Python ist zu alt)"
 
 #, python-format
 msgid "warning: certificate for %s can't be verified (Python too old)\n"
-msgstr ""
-"Warnung: Zertifikat für %s kann nicht verifiziert werden (Python ist zu "
-"alt)\n"
+msgstr "Warnung: Zertifikat für %s kann nicht verifiziert werden (Python ist zu alt)\n"
 
 #, python-format
 msgid "%s ssl connection error"
@@ -20692,14 +20851,10 @@
 
 #, python-format
 msgid "configure hostfingerprint %s or use --insecure to connect insecurely"
-msgstr ""
-"Erlauben Sie Serverkennung %s in der Konfiguration oder benutzen Sie --"
-"insecure, um unsicher zu verbinden"
-
-#, python-format
-msgid ""
-"warning: %s certificate with fingerprint %s not verified (check "
-"hostfingerprints or web.cacerts config setting)\n"
+msgstr "Erlauben Sie Serverkennung %s in der Konfiguration oder benutzen Sie --insecure, um unsicher zu verbinden"
+
+#, python-format
+msgid "warning: %s certificate with fingerprint %s not verified (check hostfingerprints or web.cacerts config setting)\n"
 msgstr ""
 
 #, python-format
@@ -20834,6 +20989,14 @@
 msgid "not removing repo %s because it has changes.\n"
 msgstr "Entferne Projektarchiv %s nicht, da es Änderungen enthält.\n"
 
+#, fuzzy
+msgid "cannot retrieve git version"
+msgstr "Kann svn-Version nicht herausfinden"
+
+#, fuzzy
+msgid "git subrepo requires at least 1.6.0 or later"
+msgstr "export benötigt zumindest eine Versionsangabe"
+
 #, python-format
 msgid "revision %s does not exist in subrepo %s\n"
 msgstr "Revision %s existiert nicht im Unterarchiv %s\n"
@@ -20857,10 +21020,10 @@
 msgid "pushing branch %s of subrepo %s\n"
 msgstr "Übertrage Zweig %s von Unterarchiv %s\n"
 
-#, python-format
+#, fuzzy, python-format
 msgid ""
 "no branch checked out in subrepo %s\n"
-"cannot push revision %s"
+"cannot push revision %s\n"
 msgstr ""
 "kein Zweig in Unterarchiv %s aktuell\n"
 "Revision %s kann nicht übertragen werden"
@@ -20977,8 +21140,7 @@
 "    rfc3339date-Filter."
 
 msgid ":localdate: Date. Converts a date to local date."
-msgstr ""
-":localdate: Datumsangabe. Konvertiert ein Datum in das lokale Datumsformat."
+msgstr ":localdate: Datumsangabe. Konvertiert ein Datum in das lokale Datumsformat."
 
 msgid ":nonempty: Any text. Returns '(none)' if the string is empty."
 msgstr ""
@@ -21069,8 +21231,7 @@
 "    possible. For example, \"foo\" and \"foo/bar\" becomes \"foo\"."
 msgstr ""
 ":stripdir: Behandelt den Text als Pfadangabe und entfernt das letzte\n"
-"    Verzeichnis, wenn möglich. Zum Beispiel wird aus \"foo\" und \"foo/bar//"
-"\" \n"
+"    Verzeichnis, wenn möglich. Zum Beispiel wird aus \"foo\" und \"foo/bar//\" \n"
 "    dann \"bar\"."
 
 msgid ""
@@ -21131,8 +21292,7 @@
 msgstr ":children: Liste von Zeichenketten. Die Kinder dieses Änderungssatzes."
 
 msgid ":date: Date information. The date when the changeset was committed."
-msgstr ""
-":date: Datumsangabe. Das Datum, wann ein Änderungssatz versioniert wurde."
+msgstr ":date: Datumsangabe. Das Datum, wann ein Änderungssatz versioniert wurde."
 
 msgid ":desc: String. The text of the changeset description."
 msgstr ":desc: Zeichenkette. Der Text der Beschreibung eines Änderungssatzes."
@@ -21207,6 +21367,12 @@
 ":tags: Liste von Zeichenketten. Alle Tags, die diesem Änderungssatz\n"
 "    zugewiesen wurden."
 
+msgid ""
+":parents: List of strings. The parents of the changeset in \"rev:node\"\n"
+"    format. If the changeset has only one \"natural\" parent (the predecessor\n"
+"    revision) nothing is shown."
+msgstr ""
+
 #, python-format
 msgid "unknown method '%s'"
 msgstr "Unbekannte Method '%s'"
@@ -21232,6 +21398,10 @@
 msgid "style not found: %s"
 msgstr "Stil nicht gefunden: %s"
 
+#, fuzzy, python-format
+msgid "%s: missing value"
+msgstr "fehlendes Argument"
+
 #, python-format
 msgid "\"%s\" not in template map"
 msgstr "\"%s\" nicht in der Vorlagenzuordnungsdatei gefunden"
@@ -21241,8 +21411,7 @@
 msgstr "Vorlagendatei %s: %s"
 
 msgid "cannot use transaction when it is already committed/aborted"
-msgstr ""
-"Kann Transaktion nicht verwenden, wenn sie bereits übernommen/abgebrochen ist"
+msgstr "Kann Transaktion nicht verwenden, wenn sie bereits übernommen/abgebrochen ist"
 
 #, python-format
 msgid "failed to truncate %s\n"
@@ -21260,12 +21429,12 @@
 msgid "already have changeset "
 msgstr "Änderungssatz bereits vorhanden "
 
-#, python-format
-msgid "Not trusting file %s from untrusted user %s, group %s\n"
+#, fuzzy, python-format
+msgid "not trusting file %s from untrusted user %s, group %s\n"
 msgstr "Nicht vertrauenswürdige Datei %s vom Nutzer %s, Gruppe %s\n"
 
-#, python-format
-msgid "Ignored: %s\n"
+#, fuzzy, python-format
+msgid "ignored: %s\n"
 msgstr "Ignoriert: %s\n"
 
 #, python-format
@@ -21283,8 +21452,8 @@
 msgid "enter a commit username:"
 msgstr "Geben Sie einen Benutzernamen für den Commit ein:"
 
-#, python-format
-msgid "No username found, using '%s' instead\n"
+#, fuzzy, python-format
+msgid "no username found, using '%s' instead\n"
 msgstr "Kein Benutzername gefunden, nutze '%s' stattdessen\n"
 
 msgid "no username supplied (see \"hg help config\")"
@@ -21607,6 +21776,142 @@
 msgid "push failed:"
 msgstr "Übertragen fehlgeschlagen: %s"
 
+#~ msgid ""
+#~ "Branch-based Access Control\n"
+#~ "..........................."
+#~ msgstr ""
+#~ "Zweig-basierte Zugriffskontrolle\n"
+#~ "................................"
+
+#~ msgid ""
+#~ "Path-based Access Control\n"
+#~ "........................."
+#~ msgstr ""
+#~ "Pfad-basierte Zugriffskontrolle\n"
+#~ "..............................."
+
+#~ msgid ""
+#~ "Groups\n"
+#~ "......"
+#~ msgstr ""
+#~ "Gruppen\n"
+#~ "......."
+
+#~ msgid ""
+#~ "    Mercurial Destination\n"
+#~ "    '''''''''''''''''''''"
+#~ msgstr ""
+#~ "    Mercurial als Ziel\n"
+#~ "    ''''''''''''''''''"
+
+#~ msgid ""
+#~ "Other repository doesn't support revision lookup, so a rev cannot be "
+#~ "specified."
+#~ msgstr ""
+#~ "Das andere Projektarchiv unterstützt keine Revisionsabfragen, daher kann "
+#~ "keine Revision angegeben werden."
+
+#~ msgid ""
+#~ "Alternatively, they can be added to Mercurial configuration files by\n"
+#~ "setting the previous entry to an empty value."
+#~ msgstr ""
+#~ "Alternativ (mit leerem Wert für ``notify.config``) können die "
+#~ "Abonnements\n"
+#~ "in der Mercurial-Konfigurationsdatei angegeben werden."
+
+#~ 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"
+#~ "  Kommaseparierte Liste von Quellaktionen. Benachrichtigungen werden nur\n"
+#~ "  gesendet, wenn die Änderungen von einer solchen Aktion ausgelöst "
+#~ "wurden.\n"
+#~ "  Quellen für ankommende Änderungen sind ``serve`` (Änderungen via http\n"
+#~ "  oder ssh), ``pull`` (aktiv abgerufen), ``unbundle`` (per :hg:"
+#~ "`unbundle`\n"
+#~ "  eingefügt) oder ``push`` (lokal übertragen). Für ausgehende Änderungen\n"
+#~ "  gibt es die gleichen, nur mit ``unbundle`` gegen ``bundle`` getauscht.\n"
+#~ "  Voreinstellung: serve."
+
+#~ 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"
+#~ "  Falls eine Abonnementen- oder die Sender-Adresse keine Domäne haben,\n"
+#~ "  wird dieser Wert eingefügt."
+
+#~ msgid "Sending "
+#~ msgstr "Sende "
+
+#~ msgid "force detaching of source from its original branch"
+#~ msgstr "erzwingt ein Abkoppeln der Quelle von ihrem ursprünglichen Zweig"
+
+#~ msgid ""
+#~ "hg rebase [-s REV | -b REV] [-d REV] [options]\n"
+#~ "hg rebase {-a|-c}"
+#~ msgstr ""
+#~ "hg rebase [-s REV | -b REV] [-d REV] [Optionen]\n"
+#~ "hg rebase {-a|-c}"
+
+#~ msgid "cannot use detach with continue or abort"
+#~ msgstr "detach kann nicht mit continue oder abort genutzt werden"
+
+#~ msgid "cannot specify a base with detach"
+#~ msgstr "detach erwartet keine Basis"
+
+#~ msgid "warning: immutable rebased changeset detected, can't abort\n"
+#~ msgstr ""
+#~ "Warnung: Unveränderbare Änderungssätze gefunden. Kann nicht abbrechen\n"
+
+#~ msgid "must specify local origin repository"
+#~ msgstr "Lokales Quellarchiv muss angegeben werden"
+
+#~ msgid "[OPTION]... REVISION..."
+#~ msgstr "[OPTION]... REVISION..."
+
+#~ msgid "There is no Mercurial repository here (.hg not found)"
+#~ msgstr "Es gibt hier kein Mercurial-Archiv (.hg nicht vorhanden)"
+
+#~ msgid ""
+#~ "  [collections]\n"
+#~ "  /foo = /foo"
+#~ msgstr ""
+#~ "  [collections]\n"
+#~ "  /foo = /foo"
+
+#~ msgid ""
+#~ "Here, the left side will be stripped off all repositories found in the\n"
+#~ "right side. Thus ``/foo/bar`` and ``foo/quux/baz`` will be listed as\n"
+#~ "``bar`` and ``quux/baz`` respectively.\n"
+#~ msgstr ""
+#~ "Hier wird die linke Seite von allen Projektarchiven, die auf der rechten\n"
+#~ "Seite gefunden werden, entfernt. Daher werden ``/foo/bar`` und\n"
+#~ "``foo/quux/baz`` als ``bar`` und ``quux/baz`` aufgelistet.\n"
+
+#~ msgid ""
+#~ "Interaction with Mercurial Commands\n"
+#~ "-----------------------------------"
+#~ msgstr ""
+#~ "Interaktion mit Mercurial-Befehlen\n"
+#~ "----------------------------------"
+
+#~ msgid ""
+#~ "Remapping Subrepositories Sources\n"
+#~ "---------------------------------"
+#~ msgstr ""
+#~ "Umleitung der Quellen von Unterarchiven\n"
+#~ "---------------------------------------"
+
 #~ msgid "The hook does not change bug status."
 #~ msgstr "Diese Erweiterung ändert den Status des Bugzilla-Tickets nicht."
 
--- a/i18n/ja.po	Fri Aug 17 13:58:19 2012 -0700
+++ b/i18n/ja.po	Tue Sep 11 08:36:09 2012 -0700
@@ -128,7 +128,7 @@
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2012-08-01 04:42+0900\n"
+"POT-Creation-Date: 2012-08-27 16:11+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"
@@ -3887,19 +3887,21 @@
 " # Commands:\n"
 " #  p, pick = use commit\n"
 " #  e, edit = use commit, but stop for amending\n"
-" #  f, fold = use commit, but fold into previous commit\n"
+" #  f, fold = use commit, but fold into previous commit (combines N and "
+"N-1)\n"
 " #  d, drop = remove commit from history\n"
 " #  m, mess = edit message without changing commit content\n"
 " #"
 msgstr ""
-" # Edit history between 633536316234 and 7c2fd3b9020c\n"
+" # 633536316234 から 7c2fd3b9020c にかけての履歴の編集\n"
 " #\n"
-" # Commands:\n"
-" #  p, pick = use commit\n"
-" #  e, edit = use commit, but stop for amending\n"
-" #  f, fold = use commit, but fold into previous commit\n"
-" #  d, drop = remove commit from history\n"
-" #  m, mess = edit message without changing commit content\n"
+" # 指定可能コマンド:\n"
+" #  p, pick = リビジョンを採用\n"
+" #  e, edit = リビジョンを採用: 但し修正のために一旦実行を中断\n"
+" #  f, fold = リビジョンを採用: 但し直前のリビジョンに併合\n"
+" #            (このリビジョンが N 番目なら、N - 1 番目に併合)\n"
+" #  d, drop = リビジョンを破棄\n"
+" #  m, mess = 改変内容を維持しつつ、コミットログを修正\n"
 " #"
 
 msgid ""
@@ -4102,6 +4104,30 @@
 "連携先リポジトリとの関連性を、 検出できない場合でも、 ``--force``\n"
 "を指定することで、 元リポジトリとの関連ありとみなすことができます。\n"
 
+#. i18n: command names and abbreviations must remain untranslated
+#, python-format
+msgid ""
+"# Edit history between %s and %s\n"
+"#\n"
+"# Commands:\n"
+"#  p, pick = use commit\n"
+"#  e, edit = use commit, but stop for amending\n"
+"#  f, fold = use commit, but fold into previous commit (combines N and N-1)\n"
+"#  d, drop = remove commit from history\n"
+"#  m, mess = edit message without changing commit content\n"
+"#\n"
+msgstr ""
+" # %s から %s にかけての履歴の編集\n"
+" #\n"
+" # 指定可能コマンド:\n"
+" #  p, pick = リビジョンを採用\n"
+" #  e, edit = リビジョンを採用: 但し修正のために一旦実行を中断\n"
+" #  f, fold = リビジョンを採用: 但し直前のリビジョンに併合\n"
+" #            (このリビジョンが N 番目なら、N - 1 番目に併合)\n"
+" #  d, drop = リビジョンを破棄\n"
+" #  m, mess = 改変内容を維持しつつ、コミットログを修正\n"
+" #\n"
+
 msgid "cannot edit history that would orphan nodes"
 msgstr "履歴ツリーが分断されるような履歴改変はできません"
 
@@ -7963,12 +7989,8 @@
 msgid "abort an interrupted rebase"
 msgstr "中断された移動を中断"
 
-msgid ""
-"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
-"hg rebase {-a|-c}"
-msgstr ""
-"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
-"hg rebase {-a|-c}"
+msgid "[-s REV | -b REV] [-d REV] [OPTION]"
+msgstr "[-s REV | -b REV] [-d REV] [OPTION]"
 
 msgid "move changeset (and descendants) to a different branch"
 msgstr "別な履歴位置へのリビジョン(およびその子孫)の移動"
@@ -8658,6 +8680,10 @@
 msgstr "衝突解消後に \"hg transplant --continue\" してください"
 
 #, python-format
+msgid "skipping emptied changeset %s\n"
+msgstr "空リビジョン %s は移植対象から除外\n"
+
+#, python-format
 msgid "%s transplanted as %s\n"
 msgstr "%s が %s として移植されました\n"
 
@@ -14049,7 +14075,7 @@
 "    (詳細は :hg:`help bookmarks` 参照)"
 
 msgid ""
-"    Update sets the working directory's parent revison to the specified\n"
+"    Update sets the working directory's parent revision to the specified\n"
 "    changeset (see :hg:`help parents`)."
 msgstr ""
 "    作業領域の親リビジョンを、 指定されたリビジョンに更新します\n"
@@ -17788,21 +17814,6 @@
 "    確認の後です。"
 
 msgid ""
-"``guessmime``\n"
-"    Control MIME types for raw download of file content.\n"
-"    Set to True to let hgweb guess the content type from the file\n"
-"    extension. This will serve HTML files as ``text/html`` and might\n"
-"    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"
 "    If the user has not already been denied repository access due to\n"
 "    the contents of deny_read, this list determines whether to grant\n"
@@ -17927,6 +17938,20 @@
 "    デフォルト値: Flase。"
 
 msgid ""
+"``comparisoncontext``\n"
+"    Number of lines of context to show in side-by-side file comparison. If\n"
+"    negative or the value ``full``, whole files are shown. Default is 5.\n"
+"    This setting can be overridden by a ``context`` request parameter to "
+"the\n"
+"    ``comparison`` command, taking the same values."
+msgstr ""
+"``comparisoncontext``\n"
+"    ファイルの差分比較を表示する際の、 コンテキスト行数。 負値または\n"
+"    ``full`` 指定の場合、 ファイル全体が表示されます。 デフォルト値は 5。\n"
+"    ``comparison`` 要求時に ``context`` パラメータを指定することで、\n"
+"    設定を上書き可能です。"
+
+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."
@@ -18022,18 +18047,19 @@
 "    エラーログの書き出し先。 無指定時は標準エラー出力に出力。"
 
 msgid ""
-"``comparisoncontext``\n"
-"    Number of lines of context to show in side-by-side file comparison. If\n"
-"    negative or the value ``full``, whole files are shown. Default is 5.\n"
-"    This setting can be overridden by a ``context`` request parameter to "
-"the\n"
-"    ``comparison`` command, taking the same values."
-msgstr ""
-"``comparisoncontext``\n"
-"    ファイルの差分比較を表示する際の、 コンテキスト行数。 負値または\n"
-"    ``full`` 指定の場合、 ファイル全体が表示されます。 デフォルト値は 5。\n"
-"    ``comparison`` 要求時に ``context`` パラメータを指定することで、\n"
-"    設定を上書き可能です。"
+"``guessmime``\n"
+"    Control MIME types for raw download of file content.\n"
+"    Set to True to let hgweb guess the content type from the file\n"
+"    extension. This will serve HTML files as ``text/html`` and might\n"
+"    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 ""
 "``hidden``\n"
@@ -18074,15 +18100,6 @@
 "    ``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 ""
@@ -18097,6 +18114,24 @@
 "    リビジョンあたりの最大一覧表示ファイル数。 デフォルト値: 10"
 
 msgid ""
+"``maxshortchanges``\n"
+"    Maximum number of changes to list on the shortlog, graph or filelog\n"
+"    pages. Default is 60."
+msgstr ""
+"``maxshortchanges``\n"
+"    shortlog, graph, filelog 画面における最大表示リビジョン数。\n"
+"    デフォルト値: 60"
+
+msgid ""
+"``name``\n"
+"    Repository name to use in the web interface. Default is current\n"
+"    working directory."
+msgstr ""
+"``name``\n"
+"    ウェブインタフェースで使用するリポジトリ名。 無指定の場合、\n"
+"    当該作業領域のディレクトリ。"
+
+msgid ""
 "``port``\n"
 "    Port to listen on. Default is 8000."
 msgstr ""
@@ -19898,7 +19933,7 @@
 "  ``http://server/user/bob/quux/testsubrepo/`` の両方が公開されます。"
 
 msgid ""
-"The ``collections`` section is deprecated and has been superseeded by\n"
+"The ``collections`` section is deprecated and has been superseded by\n"
 "``paths``.\n"
 msgstr ""
 "``collections`` セクションでの設定は非推奨なので、 代わりに ``paths``\n"
@@ -23677,6 +23712,10 @@
 msgstr "スタイルが見つかりません: %s"
 
 #, python-format
+msgid "%s: missing value"
+msgstr "%s: 値指定がありません"
+
+#, python-format
 msgid "\"%s\" not in template map"
 msgstr "\"%s\" はキーワードとして認識できません"
 
--- a/i18n/pt_BR.po	Fri Aug 17 13:58:19 2012 -0700
+++ b/i18n/pt_BR.po	Tue Sep 11 08:36:09 2012 -0700
@@ -11266,6 +11266,12 @@
 msgid "runs the changeset discovery protocol in isolation"
 msgstr "executa o protocolo discovery isoladamente"
 
+msgid "apply the filespec on this revision"
+msgstr "aplica o filespec nesta revisão"
+
+msgid "[-r REV] FILESPEC"
+msgstr "[-r REV] FILESPEC"
+
 msgid "parse and apply a fileset specification"
 msgstr "interpreta e aplica uma especificação de fileset"
 
@@ -11329,6 +11335,10 @@
 msgstr " (verifique se seu locale está configurado propriamente)\n"
 
 #, python-format
+msgid "checking Python lib (%s)...\n"
+msgstr "verificando biblioteca Python (%s)...\n"
+
+#, python-format
 msgid "checking installed modules (%s)...\n"
 msgstr "verificando módulos instalados (%s)...\n"
 
@@ -14346,7 +14356,7 @@
 "    (veja :hg:`help bookmarks`)."
 
 msgid ""
-"    Update sets the working directory's parent revison to the specified\n"
+"    Update sets the working directory's parent revision to the specified\n"
 "    changeset (see :hg:`help parents`)."
 msgstr ""
 "    Update muda o pai do diretório de trabalho para a revisão especificada\n"
@@ -15134,10 +15144,15 @@
 "``grep(regex)``\n"
 "    O arquivo contém a expressão regular fornecida."
 
+#. i18n: "grep" is a keyword
 msgid "grep requires a pattern"
 msgstr "grep requer um padrão"
 
 #, python-format
+msgid "invalid match pattern: %s"
+msgstr "padrão de busca inválido: %s"
+
+#, python-format
 msgid "couldn't parse size: %s"
 msgstr "não foi possível decodificar o tamanho: %s"
 
@@ -22989,10 +23004,6 @@
 msgid "grep requires a string"
 msgstr "grep requer uma string"
 
-#, python-format
-msgid "invalid match pattern: %s"
-msgstr "padrão de busca inválido: %s"
-
 #. i18n: "_matchfiles" is a keyword
 msgid "_matchfiles requires at least one argument"
 msgstr "_matchfiles requer ao menos um argumento"
--- a/i18n/ru.po	Fri Aug 17 13:58:19 2012 -0700
+++ b/i18n/ru.po	Tue Sep 11 08:36:09 2012 -0700
@@ -173,7 +173,7 @@
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2012-08-09 13:23+0400\n"
+"POT-Creation-Date: 2012-08-13 16:01+0400\n"
 "PO-Revision-Date: 2011-05-12 23:48+0400\n"
 "Last-Translator: Alexander Sauta <demosito@gmail.com>\n"
 "Language-Team: Russian\n"
@@ -14542,11 +14542,11 @@
 "    bookmarks`)."
 
 msgid ""
-"    Update sets the working directory's parent revison to the specified\n"
+"    Update sets the working directory's parent revision to the specified\n"
 "    changeset (see :hg:`help parents`)."
 msgstr ""
-"    Update устанавливает ревизию родителя рабочего каталога в заданный\n"
-"    набор изменений (см. :hg:`help update`)."
+"    Update делает заданный набор изменений родительской ревизией рабочего\n"
+"    каталога (см. :hg:`help parents`)."
 
 msgid ""
 "    If the changeset is not a descendant or ancestor of the working\n"
--- a/mercurial/archival.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/archival.py	Tue Sep 11 08:36:09 2012 -0700
@@ -13,6 +13,10 @@
 import cStringIO, os, tarfile, time, zipfile
 import zlib, gzip
 
+# from unzip source code:
+_UNX_IFREG = 0x8000
+_UNX_IFLNK = 0xa000
+
 def tidyprefix(dest, kind, prefix):
     '''choose prefix to use for names in archive.  make sure prefix is
     safe for consumers.'''
@@ -173,10 +177,10 @@
         # unzip will not honor unix file modes unless file creator is
         # set to unix (id 3).
         i.create_system = 3
-        ftype = 0x8000 # UNX_IFREG in unzip source code
+        ftype = _UNX_IFREG
         if islink:
             mode = 0777
-            ftype = 0xa000 # UNX_IFLNK in unzip source code
+            ftype = _UNX_IFLNK
         i.external_attr = (mode | ftype) << 16L
         self.z.writestr(i, data)
 
--- a/mercurial/bookmarks.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/bookmarks.py	Tue Sep 11 08:36:09 2012 -0700
@@ -58,7 +58,7 @@
             raise
         return None
     try:
-        # No readline() in posixfile_nt, reading everything is cheap
+        # No readline() in osutil.posixfile, reading everything is cheap
         mark = encoding.tolocal((file.readlines() or [''])[0])
         if mark == '' or mark not in repo._bookmarks:
             mark = None
--- a/mercurial/byterange.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/byterange.py	Tue Sep 11 08:36:09 2012 -0700
@@ -32,7 +32,7 @@
 
     This was extremely simple. The Range header is a HTTP feature to
     begin with so all this class does is tell urllib2 that the
-    "206 Partial Content" reponse from the HTTP server is what we
+    "206 Partial Content" response from the HTTP server is what we
     expected.
 
     Example:
--- a/mercurial/changelog.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/changelog.py	Tue Sep 11 08:36:09 2012 -0700
@@ -183,7 +183,7 @@
         nodeid\n        : manifest node in ascii
         user\n          : user, no \n or \r allowed
         time tz extra\n : date (time is int or float, timezone is int)
-                        : extra is metadatas, encoded and separated by '\0'
+                        : extra is metadata, encoded and separated by '\0'
                         : older versions ignore it
         files\n\n       : files modified by the cset, no \n or \r allowed
         (.*)            : comment (free text, ideally utf-8)
--- a/mercurial/cmdutil.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/cmdutil.py	Tue Sep 11 08:36:09 2012 -0700
@@ -10,7 +10,8 @@
 import os, sys, errno, re, tempfile
 import util, scmutil, templater, patch, error, templatekw, revlog, copies
 import match as matchmod
-import subrepo, context, repair, bookmarks, graphmod, revset
+import subrepo, context, repair, bookmarks, graphmod, revset, phases, obsolete
+import lock as lockmod
 
 def parsealiases(cmd):
     return cmd.lstrip("^").split("|")
@@ -515,7 +516,7 @@
         sys.stdout.flush()
         sys.stderr.flush()
 
-        nullfd = os.open(util.nulldev, os.O_RDWR)
+        nullfd = os.open(os.devnull, os.O_RDWR)
         logfilefd = nullfd
         if logfile:
             logfilefd = os.open(logfile, os.O_RDWR | os.O_CREAT | os.O_APPEND)
@@ -547,30 +548,37 @@
         prev = (parents and parents[0]) or nullid
 
         shouldclose = False
-        if not fp:
+        if not fp and len(template) > 0:
             desc_lines = ctx.description().rstrip().split('\n')
             desc = desc_lines[0]    #Commit always has a first line.
             fp = makefileobj(repo, template, node, desc=desc, total=total,
                              seqno=seqno, revwidth=revwidth, mode='ab')
             if fp != template:
                 shouldclose = True
-        if fp != sys.stdout and util.safehasattr(fp, 'name'):
+        if fp and fp != sys.stdout and util.safehasattr(fp, 'name'):
             repo.ui.note("%s\n" % fp.name)
 
-        fp.write("# HG changeset patch\n")
-        fp.write("# User %s\n" % ctx.user())
-        fp.write("# Date %d %d\n" % ctx.date())
+        if not fp:
+            write = repo.ui.write
+        else:
+            def write(s, **kw):
+                fp.write(s)
+
+
+        write("# HG changeset patch\n")
+        write("# User %s\n" % ctx.user())
+        write("# Date %d %d\n" % ctx.date())
         if branch and branch != 'default':
-            fp.write("# Branch %s\n" % branch)
-        fp.write("# Node ID %s\n" % hex(node))
-        fp.write("# Parent  %s\n" % hex(prev))
+            write("# Branch %s\n" % branch)
+        write("# Node ID %s\n" % hex(node))
+        write("# Parent  %s\n" % hex(prev))
         if len(parents) > 1:
-            fp.write("# Parent  %s\n" % hex(parents[1]))
-        fp.write(ctx.description().rstrip())
-        fp.write("\n\n")
+            write("# Parent  %s\n" % hex(parents[1]))
+        write(ctx.description().rstrip())
+        write("\n\n")
 
-        for chunk in patch.diff(repo, prev, node, opts=opts):
-            fp.write(chunk)
+        for chunk, label in patch.diffui(repo, prev, node, opts=opts):
+            write(chunk, label=label)
 
         if shouldclose:
             fp.close()
@@ -1258,7 +1266,7 @@
     opts['branch'] = opts.get('branch', []) + opts.get('only_branch', [])
     opts['branch'] = [repo.lookupbranch(b) for b in opts['branch']]
     # pats/include/exclude are passed to match.match() directly in
-    # _matchfile() revset but walkchangerevs() builds its matcher with
+    # _matchfiles() revset but walkchangerevs() builds its matcher with
     # scmutil.match(). The difference is input pats are globbed on
     # platforms without shell expansion (windows).
     pctx = repo[None]
@@ -1304,7 +1312,7 @@
             fnopats = (('_ancestors', '_fancestors'),
                        ('_descendants', '_fdescendants'))
             if pats:
-                # follow() revset inteprets its file argument as a
+                # follow() revset interprets its file argument as a
                 # manifest entry, so use match.files(), not pats.
                 opts[fpats[followfirst]] = list(match.files())
             else:
@@ -1568,130 +1576,147 @@
     ui.note(_('amending changeset %s\n') % old)
     base = old.p1()
 
-    wlock = repo.wlock()
+    wlock = lock = None
     try:
-        # First, do a regular commit to record all changes in the working
-        # directory (if there are any)
-        ui.callhooks = False
+        wlock = repo.wlock()
+        lock = repo.lock()
+        tr = repo.transaction('amend')
         try:
-            node = commit(ui, repo, commitfunc, pats, opts)
-        finally:
-            ui.callhooks = True
-        ctx = repo[node]
-
-        # Participating changesets:
-        #
-        # node/ctx o - new (intermediate) commit that contains changes from
-        #          |   working dir to go into amending commit (or a workingctx
-        #          |   if there were no changes)
-        #          |
-        # old      o - changeset to amend
-        #          |
-        # base     o - parent of amending changeset
-
-        # Update extra dict from amended commit (e.g. to preserve graft source)
-        extra.update(old.extra())
-
-        # Also update it from the intermediate commit or from the wctx
-        extra.update(ctx.extra())
-
-        files = set(old.files())
-
-        # Second, we use either the commit we just did, or if there were no
-        # changes the parent of the working directory as the version of the
-        # files in the final amend commit
-        if node:
-            ui.note(_('copying changeset %s to %s\n') % (ctx, base))
-
-            user = ctx.user()
-            date = ctx.date()
-            message = ctx.description()
-            # Recompute copies (avoid recording a -> b -> a)
-            copied = copies.pathcopies(base, ctx)
-
-            # Prune files which were reverted by the updates: if old introduced
-            # file X and our intermediate commit, node, renamed that file, then
-            # those two files are the same and we can discard X from our list
-            # of files. Likewise if X was deleted, it's no longer relevant
-            files.update(ctx.files())
-
-            def samefile(f):
-                if f in ctx.manifest():
-                    a = ctx.filectx(f)
-                    if f in base.manifest():
-                        b = base.filectx(f)
-                        return (not a.cmp(b)
-                                and a.flags() == b.flags())
-                    else:
-                        return False
-                else:
-                    return f not in base.manifest()
-            files = [f for f in files if not samefile(f)]
-
-            def filectxfn(repo, ctx_, path):
-                try:
-                    fctx = ctx[path]
-                    flags = fctx.flags()
-                    mctx = context.memfilectx(fctx.path(), fctx.data(),
-                                              islink='l' in flags,
-                                              isexec='x' in flags,
-                                              copied=copied.get(path))
-                    return mctx
-                except KeyError:
-                    raise IOError
-        else:
-            ui.note(_('copying changeset %s to %s\n') % (old, base))
-
-            # Use version of files as in the old cset
-            def filectxfn(repo, ctx_, path):
-                try:
-                    return old.filectx(path)
-                except KeyError:
-                    raise IOError
-
             # See if we got a message from -m or -l, if not, open the editor
             # with the message of the changeset to amend
-            user = opts.get('user') or old.user()
-            date = opts.get('date') or old.date()
             message = logmessage(ui, opts)
-            if not message:
-                cctx = context.workingctx(repo, old.description(), user, date,
-                                          extra,
-                                          repo.status(base.node(), old.node()))
-                message = commitforceeditor(repo, cctx, [])
+            # First, do a regular commit to record all changes in the working
+            # directory (if there are any)
+            ui.callhooks = False
+            try:
+                opts['message'] = 'temporary amend commit for %s' % old
+                node = commit(ui, repo, commitfunc, pats, opts)
+            finally:
+                ui.callhooks = True
+            ctx = repo[node]
+
+            # Participating changesets:
+            #
+            # node/ctx o - new (intermediate) commit that contains changes
+            #          |   from working dir to go into amending commit
+            #          |   (or a workingctx if there were no changes)
+            #          |
+            # old      o - changeset to amend
+            #          |
+            # base     o - parent of amending changeset
+
+            # Update extra dict from amended commit (e.g. to preserve graft
+            # source)
+            extra.update(old.extra())
+
+            # Also update it from the intermediate commit or from the wctx
+            extra.update(ctx.extra())
+
+            files = set(old.files())
+
+            # Second, we use either the commit we just did, or if there were no
+            # changes the parent of the working directory as the version of the
+            # files in the final amend commit
+            if node:
+                ui.note(_('copying changeset %s to %s\n') % (ctx, base))
+
+                user = ctx.user()
+                date = ctx.date()
+                # Recompute copies (avoid recording a -> b -> a)
+                copied = copies.pathcopies(base, ctx)
+
+                # Prune files which were reverted by the updates: if old
+                # introduced file X and our intermediate commit, node,
+                # renamed that file, then those two files are the same and
+                # we can discard X from our list of files. Likewise if X
+                # was deleted, it's no longer relevant
+                files.update(ctx.files())
+
+                def samefile(f):
+                    if f in ctx.manifest():
+                        a = ctx.filectx(f)
+                        if f in base.manifest():
+                            b = base.filectx(f)
+                            return (not a.cmp(b)
+                                    and a.flags() == b.flags())
+                        else:
+                            return False
+                    else:
+                        return f not in base.manifest()
+                files = [f for f in files if not samefile(f)]
 
-        new = context.memctx(repo,
-                             parents=[base.node(), nullid],
-                             text=message,
-                             files=files,
-                             filectxfn=filectxfn,
-                             user=user,
-                             date=date,
-                             extra=extra)
-        newid = repo.commitctx(new)
-        if newid != old.node():
-            # Reroute the working copy parent to the new changeset
-            repo.setparents(newid, nullid)
+                def filectxfn(repo, ctx_, path):
+                    try:
+                        fctx = ctx[path]
+                        flags = fctx.flags()
+                        mctx = context.memfilectx(fctx.path(), fctx.data(),
+                                                  islink='l' in flags,
+                                                  isexec='x' in flags,
+                                                  copied=copied.get(path))
+                        return mctx
+                    except KeyError:
+                        raise IOError
+            else:
+                ui.note(_('copying changeset %s to %s\n') % (old, base))
+
+                # Use version of files as in the old cset
+                def filectxfn(repo, ctx_, path):
+                    try:
+                        return old.filectx(path)
+                    except KeyError:
+                        raise IOError
+
+                user = opts.get('user') or old.user()
+                date = opts.get('date') or old.date()
+            if not message:
+                message = old.description()
 
-            # Move bookmarks from old parent to amend commit
-            bms = repo.nodebookmarks(old.node())
-            if bms:
-                for bm in bms:
-                    repo._bookmarks[bm] = newid
-                bookmarks.write(repo)
+            new = context.memctx(repo,
+                                 parents=[base.node(), nullid],
+                                 text=message,
+                                 files=files,
+                                 filectxfn=filectxfn,
+                                 user=user,
+                                 date=date,
+                                 extra=extra)
+            new._text = commitforceeditor(repo, new, [])
+            ph = repo.ui.config('phases', 'new-commit', phases.draft)
+            try:
+                repo.ui.setconfig('phases', 'new-commit', old.phase())
+                newid = repo.commitctx(new)
+            finally:
+                repo.ui.setconfig('phases', 'new-commit', ph)
+            if newid != old.node():
+                # Reroute the working copy parent to the new changeset
+                repo.setparents(newid, nullid)
 
+                # Move bookmarks from old parent to amend commit
+                bms = repo.nodebookmarks(old.node())
+                if bms:
+                    for bm in bms:
+                        repo._bookmarks[bm] = newid
+                    bookmarks.write(repo)
+            #commit the whole amend process
+            if obsolete._enabled and newid != old.node():
+                # mark the new changeset as successor of the rewritten one
+                new = repo[newid]
+                obs = [(old, (new,))]
+                if node:
+                    obs.append((ctx, (new,)))
+
+                obsolete.createmarkers(repo, obs)
+            tr.close()
+        finally:
+            tr.release()
+        if (not obsolete._enabled) and newid != old.node():
             # Strip the intermediate commit (if there was one) and the amended
             # commit
-            lock = repo.lock()
-            try:
-                if node:
-                    ui.note(_('stripping intermediate changeset %s\n') % ctx)
-                ui.note(_('stripping amended changeset %s\n') % old)
-                repair.strip(ui, repo, old.node(), topic='amend-backup')
-            finally:
-                lock.release()
+            if node:
+                ui.note(_('stripping intermediate changeset %s\n') % ctx)
+            ui.note(_('stripping amended changeset %s\n') % old)
+            repair.strip(ui, repo, old.node(), topic='amend-backup')
     finally:
-        wlock.release()
+        lockmod.release(wlock, lock)
     return newid
 
 def commiteditor(repo, ctx, subs):
--- a/mercurial/commands.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/commands.py	Tue Sep 11 08:36:09 2012 -0700
@@ -543,7 +543,7 @@
           hg bisect --good
           hg bisect --bad
 
-      - mark the current revision, or a known revision, to be skipped (eg. if
+      - mark the current revision, or a known revision, to be skipped (e.g. if
         that revision is not usable because of another issue)::
 
           hg bisect --skip
@@ -1352,20 +1352,20 @@
         # printed anyway.
         #
         # Par Msg Comment
-        # NN   y  additional topo root
+        # N N  y  additional topo root
         #
-        # BN   y  additional branch root
-        # CN   y  additional topo head
-        # HN   n  usual case
+        # B N  y  additional branch root
+        # C N  y  additional topo head
+        # H N  n  usual case
         #
-        # BB   y  weird additional branch root
-        # CB   y  branch merge
-        # HB   n  merge with named branch
+        # B B  y  weird additional branch root
+        # C B  y  branch merge
+        # H B  n  merge with named branch
         #
-        # CC   y  additional head from merge
-        # CH   n  merge with a head
+        # C C  y  additional head from merge
+        # C H  n  merge with a head
         #
-        # HH   n  head merge: head count decreases
+        # H H  n  head merge: head count decreases
 
     if not opts.get('close_branch'):
         for r in parents:
@@ -1998,6 +1998,10 @@
         ui.write(_(" (check that your locale is properly set)\n"))
         problems += 1
 
+    # Python lib
+    ui.status(_("checking Python lib (%s)...\n")
+              % os.path.dirname(os.__file__))
+
     # compiled modules
     ui.status(_("checking installed modules (%s)...\n")
               % os.path.dirname(__file__))
@@ -4269,7 +4273,7 @@
                              hint=_("run 'hg heads .' to see heads"))
 
         parent = repo.dirstate.p1()
-        if len(nbhs) == 1:
+        if len(nbhs) <= 1:
             if len(bheads) > 1:
                 raise util.Abort(_("heads are bookmarked - "
                                    "please merge with an explicit rev"),
--- a/mercurial/commandserver.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/commandserver.py	Tue Sep 11 08:36:09 2012 -0700
@@ -137,7 +137,7 @@
         if logpath:
             global logfile
             if logpath == '-':
-                # write log on a special 'd'ebug channel
+                # write log on a special 'd' (debug) channel
                 logfile = channeledoutput(sys.stdout, sys.stdout, 'd')
             else:
                 logfile = open(logpath, 'a')
--- a/mercurial/context.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/context.py	Tue Sep 11 08:36:09 2012 -0700
@@ -11,6 +11,7 @@
 import copies
 import match as matchmod
 import os, errno, stat
+import obsolete as obsmod
 
 propertycache = util.propertycache
 
@@ -232,38 +233,15 @@
 
     def obsolete(self):
         """True if the changeset is obsolete"""
-        return (self.node() in self._repo.obsstore.precursors
-                and self.phase() > phases.public)
+        return self.rev() in obsmod.getobscache(self._repo, 'obsolete')
 
     def extinct(self):
         """True if the changeset is extinct"""
-        # We should just compute a cache a check againts it.
-        # see revset implementation for details
-        #
-        # But this naive implementation does not require cache
-        if self.phase() <= phases.public:
-            return False
-        if not self.obsolete():
-            return False
-        for desc in self.descendants():
-            if not desc.obsolete():
-                return False
-        return True
+        return self.rev() in obsmod.getobscache(self._repo, 'extinct')
 
     def unstable(self):
         """True if the changeset is not obsolete but it's ancestor are"""
-        # We should just compute /(obsolete()::) - obsolete()/
-        # and keep it in a cache.
-        #
-        # But this naive implementation does not require cache
-        if self.phase() <= phases.public:
-            return False
-        if self.obsolete():
-            return False
-        for anc in self.ancestors():
-            if anc.obsolete():
-                return True
-        return False
+        return self.rev() in obsmod.getobscache(self._repo, 'unstable')
 
     def _fileinfo(self, path):
         if '_manifest' in self.__dict__:
@@ -1167,7 +1145,7 @@
 
         returns True if different than fctx.
         """
-        # fctx should be a filectx (not a wfctx)
+        # fctx should be a filectx (not a workingfilectx)
         # invert comparison to reuse the same code path
         return fctx.cmp(self)
 
--- a/mercurial/discovery.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/discovery.py	Tue Sep 11 08:36:09 2012 -0700
@@ -21,8 +21,8 @@
       any longer.
     "heads" is either the supplied heads, or else the remote's heads.
 
-    If you pass heads and they are all known locally, the reponse lists just
-    the heads in "common" and in "heads".
+    If you pass heads and they are all known locally, the response lists just
+    these heads in "common" and in "heads".
 
     Please use findcommonoutgoing to compute the set of outgoing nodes to give
     extensions a good hook into outgoing.
@@ -348,7 +348,7 @@
 def visiblebranchmap(repo):
     """return a branchmap for the visible set"""
     # XXX Recomputing this data on the fly is very slow.  We should build a
-    # XXX cached version while computin the standard branchmap version.
+    # XXX cached version while computing the standard branchmap version.
     sroots = repo._phasecache.phaseroots[phases.secret]
     if sroots or repo.obsstore:
         vbranchmap = {}
--- a/mercurial/hbisect.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/hbisect.py	Tue Sep 11 08:36:09 2012 -0700
@@ -159,7 +159,7 @@
     Return a list of revision(s) that match the given status:
 
     - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip
-    - ``goods``, ``bads``      : csets topologicaly good/bad
+    - ``goods``, ``bads``      : csets topologically good/bad
     - ``range``              : csets taking part in the bisection
     - ``pruned``             : csets that are goods, bads or skipped
     - ``untested``           : csets whose fate is yet unknown
@@ -200,7 +200,7 @@
 
         # 'ignored' is all csets that were not used during the bisection
         # due to DAG topology, but may however have had an impact.
-        # Eg., a branch merged between bads and goods, but whose branch-
+        # E.g., a branch merged between bads and goods, but whose branch-
         # point is out-side of the range.
         iba = '::bisect(bad) - ::bisect(good)'  # Ignored bads' ancestors
         iga = '::bisect(good) - ::bisect(bad)'  # Ignored goods' ancestors
--- a/mercurial/help/config.txt	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/help/config.txt	Tue Sep 11 08:36:09 2012 -0700
@@ -1431,7 +1431,7 @@
     Example: ``http://hgserver/static/``.
 
 ``stripes``
-    How many lines a "zebra stripe" should span in multiline output.
+    How many lines a "zebra stripe" should span in multi-line output.
     Default is 1; set to 0 to disable.
 
 ``style``
--- a/mercurial/help/subrepos.txt	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/help/subrepos.txt	Tue Sep 11 08:36:09 2012 -0700
@@ -13,11 +13,11 @@
 2. Nested repository references. They are defined in ``.hgsub``, which
    should be placed in the root of working directory, and
    tell where the subrepository checkouts come from. Mercurial
-   subrepositories are referenced like:
+   subrepositories are referenced like::
 
      path/to/nested = https://example.com/nested/repo/path
 
-   Git and Subversion subrepos are also supported:
+   Git and Subversion subrepos are also supported::
 
      path/to/nested = [git]git://example.com/nested/repo/path
      path/to/nested = [svn]https://example.com/nested/trunk/path
--- a/mercurial/hgweb/common.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/hgweb/common.py	Tue Sep 11 08:36:09 2012 -0700
@@ -48,7 +48,7 @@
     # and replayed
     scheme = req.env.get('wsgi.url_scheme')
     if hgweb.configbool('web', 'push_ssl', True) and scheme != 'https':
-        raise ErrorResponse(HTTP_OK, 'ssl required')
+        raise ErrorResponse(HTTP_FORBIDDEN, 'ssl required')
 
     deny = hgweb.configlist('web', 'deny_push')
     if deny and (not user or deny == ['*'] or user in deny):
--- a/mercurial/hgweb/server.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/hgweb/server.py	Tue Sep 11 08:36:09 2012 -0700
@@ -12,7 +12,7 @@
 from mercurial.i18n import _
 
 def _splitURI(uri):
-    """ Return path and query splited from uri
+    """Return path and query that has been split from uri
 
     Just like CGI environment, the path is unquoted, the query is
     not.
--- a/mercurial/hgweb/wsgicgi.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/hgweb/wsgicgi.py	Tue Sep 11 08:36:09 2012 -0700
@@ -19,7 +19,7 @@
     environ = dict(os.environ.iteritems())
     environ.setdefault('PATH_INFO', '')
     if environ.get('SERVER_SOFTWARE', '').startswith('Microsoft-IIS'):
-        # IIS includes script_name in path_info
+        # IIS includes script_name in PATH_INFO
         scriptname = environ['SCRIPT_NAME']
         if environ['PATH_INFO'].startswith(scriptname):
             environ['PATH_INFO'] = environ['PATH_INFO'][len(scriptname):]
--- a/mercurial/hook.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/hook.py	Tue Sep 11 08:36:09 2012 -0700
@@ -154,7 +154,7 @@
                 oldstdout = os.dup(stdoutno)
                 os.dup2(stderrno, stdoutno)
         except AttributeError:
-            # __stdout/err__ doesn't have fileno(), it's not a real file
+            # __stdout__/__stderr__ doesn't have fileno(), it's not a real file
             pass
 
     try:
--- a/mercurial/httpclient/__init__.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/httpclient/__init__.py	Tue Sep 11 08:36:09 2012 -0700
@@ -170,7 +170,7 @@
         except socket.sslerror, e:
             if e.args[0] != socket.SSL_ERROR_WANT_READ:
                 raise
-            logger.debug('SSL_WANT_READ in _select, should retry later')
+            logger.debug('SSL_ERROR_WANT_READ in _select, should retry later')
             return True
         logger.debug('response read %d data during _select', len(data))
         # If the socket was readable and no data was read, that means
@@ -293,7 +293,7 @@
           host: The host to which we'll connect.
           port: Optional. The port over which we'll connect. Default 80 for
                 non-ssl, 443 for ssl.
-          use_ssl: Optional. Wether to use ssl. Defaults to False if port is
+          use_ssl: Optional. Whether to use ssl. Defaults to False if port is
                    not 443, true if port is 443.
           ssl_validator: a function(socket) to validate the ssl cert
           timeout: Optional. Connection timeout, default is TIMEOUT_DEFAULT.
@@ -374,7 +374,7 @@
         if self.ssl:
             # This is the default, but in the case of proxied SSL
             # requests the proxy logic above will have cleared
-            # blocking mode, so reenable it just to be safe.
+            # blocking mode, so re-enable it just to be safe.
             sock.setblocking(1)
             logger.debug('wrapping socket for ssl with options %r',
                          self.ssl_opts)
@@ -532,7 +532,7 @@
                         if e.args[0] != socket.SSL_ERROR_WANT_READ:
                             raise
                         logger.debug(
-                            'SSL_WANT_READ while sending data, retrying...')
+                            'SSL_ERROR_WANT_READ while sending data, retrying...')
                         continue
                     if not data:
                         logger.info('socket appears closed in read')
--- a/mercurial/httpclient/_readers.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/httpclient/_readers.py	Tue Sep 11 08:36:09 2012 -0700
@@ -120,7 +120,7 @@
         if data:
             assert not self._finished, (
                 'tried to add data (%r) to a closed reader!' % data)
-        logger.debug('%s read an addtional %d data', self.name, len(data))
+        logger.debug('%s read an additional %d data', self.name, len(data))
         self._done_chunks.append(data)
 
 
@@ -162,7 +162,7 @@
 
     def _load(self, data):
         assert not self._finished, 'tried to add data to a closed reader!'
-        logger.debug('chunked read an addtional %d data', len(data))
+        logger.debug('chunked read an additional %d data', len(data))
         position = 0
         if self._leftover_data:
             logger.debug('chunked reader trying to finish block from leftover data')
@@ -188,7 +188,7 @@
                 return
             if amt == 0:
                 self._finished = True
-                logger.debug('closing chunked redaer due to chunk of length 0')
+                logger.debug('closing chunked reader due to chunk of length 0')
                 return
             self._done_chunks.append(data[block_start:block_start + amt])
             position = block_start + amt + len(self._eol)
--- a/mercurial/httpconnection.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/httpconnection.py	Tue Sep 11 08:36:09 2012 -0700
@@ -73,7 +73,7 @@
     if '://' in uri:
         scheme, hostpath = uri.split('://', 1)
     else:
-        # py2.4.1 doesn't provide the full URI
+        # Python 2.4.1 doesn't provide the full URI
         scheme, hostpath = 'http', uri
     bestuser = None
     bestlen = 0
--- a/mercurial/keepalive.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/keepalive.py	Tue Sep 11 08:36:09 2012 -0700
@@ -67,8 +67,8 @@
 
     close_connection()  -  close the connection to the host
     readlines()         -  you know, readlines()
-    status              -  the return status (ie 404)
-    reason              -  english translation of status (ie 'File not found')
+    status              -  the return status (i.e. 404)
+    reason              -  english translation of status (i.e. 'File not found')
 
   If you want the best of both worlds, use this inside an
   AttributeError-catching try:
@@ -297,7 +297,7 @@
             # first.  We previously got into a nasty loop
             # where an exception was uncaught, and so the
             # connection stayed open.  On the next try, the
-            # same exception was raised, etc.  The tradeoff is
+            # same exception was raised, etc.  The trade-off is
             # that it's now possible this call will raise
             # a DIFFERENT exception
             if DEBUG:
@@ -370,7 +370,7 @@
     # so if you THEN do a normal read, you must first take stuff from
     # the buffer.
 
-    # the read method wraps the original to accomodate buffering,
+    # the read method wraps the original to accommodate buffering,
     # although read() never adds to the buffer.
     # Both readline and readlines have been stolen with almost no
     # modification from socket.py
@@ -442,7 +442,7 @@
                 try:
                     chunk_left = int(line, 16)
                 except ValueError:
-                    # close the connection as protocol synchronisation is
+                    # close the connection as protocol synchronization is
                     # probably lost
                     self.close()
                     raise httplib.IncompleteRead(value)
@@ -548,7 +548,7 @@
         read = getattr(str, 'read', None)
         if read is not None:
             if self.debuglevel > 0:
-                print "sendIng a read()able"
+                print "sending a read()able"
             data = read(blocksize)
             while data:
                 self.sock.sendall(data)
@@ -737,7 +737,7 @@
 
 
 def test(url, N=10):
-    print "checking error hander (do this on a non-200)"
+    print "checking error handler (do this on a non-200)"
     try: error_handler(url)
     except IOError:
         print "exiting - exception will prevent further tests"
--- a/mercurial/localrepo.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/localrepo.py	Tue Sep 11 08:36:09 2012 -0700
@@ -300,12 +300,14 @@
         """hiddenrevs: revs that should be hidden by command and tools
 
         This set is carried on the repo to ease initialization and lazy
-        loading it'll probably move back to changelog for efficiently and
-        consistency reason
+        loading; it'll probably move back to changelog for efficiency and
+        consistency reasons.
 
         Note that the hiddenrevs will needs invalidations when
         - a new changesets is added (possible unstable above extinct)
         - a new obsolete marker is added (possible new extinct changeset)
+
+        hidden changesets cannot have non-hidden descendants
         """
         hidden = set()
         if self.obsstore:
@@ -712,7 +714,7 @@
             # Remove candidate heads that no longer are in the repo (e.g., as
             # the result of a strip that just happened).  Avoid using 'node in
             # self' here because that dives down into branchcache code somewhat
-            # recrusively.
+            # recursively.
             bheadrevs = [self.changelog.rev(node) for node in bheads
                          if self.changelog.hasnode(node)]
             newheadrevs = [self.changelog.rev(node) for node in newnodes
@@ -1040,6 +1042,7 @@
 
         self._branchcache = None # in UTF-8
         self._branchcachetip = None
+        obsolete.clearobscaches(self)
 
     def invalidatedirstate(self):
         '''Invalidates the dirstate, causing the next call to dirstate
@@ -1312,6 +1315,7 @@
                 matched = set(changes[0] + changes[1] + changes[2])
 
                 for f in match.files():
+                    f = self.dirstate.normalize(f)
                     if f == '.' or f in matched or f in wctx.substate:
                         continue
                     if f in changes[3]: # missing
@@ -1478,7 +1482,7 @@
         and you also know the set of candidate new heads that may have resulted
         from the destruction, you can set newheadnodes.  This will enable the
         code to update the branchheads cache, rather than having future code
-        decide it's invalid and regenrating it from scratch.
+        decide it's invalid and regenerating it from scratch.
         '''
         # If we have info, newheadnodes, on how to update the branch cache, do
         # it, Otherwise, since nodes were destroyed, the cache is stale and this
@@ -1924,7 +1928,7 @@
                     #     missing = ((commonheads::missingheads) - commonheads)
                     #
                     # We can pick:
-                    # * missingheads part of comon (::commonheads)
+                    # * missingheads part of common (::commonheads)
                     common = set(outgoing.common)
                     cheads = [node for node in revs if node in common]
                     # and
@@ -2401,6 +2405,7 @@
             self.ui.status(_("added %d changesets"
                              " with %d changes to %d files%s\n")
                              % (changesets, revisions, files, htext))
+            obsolete.clearobscaches(self)
 
             if changesets > 0:
                 p = lambda: cl.writepending() and self.root or ""
@@ -2538,7 +2543,7 @@
         # uncompressed only if compatible.
 
         if not stream:
-            # if the server explicitly prefer to stream (for fast LANs)
+            # if the server explicitly prefers to stream (for fast LANs)
             stream = remote.capable('stream-preferred')
 
         if stream and not heads:
--- a/mercurial/lock.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/lock.py	Tue Sep 11 08:36:09 2012 -0700
@@ -122,7 +122,7 @@
     def release(self):
         """release the lock and execute callback function if any
 
-        If the lock have been aquired multiple time, the actual release is
+        If the lock has been acquired multiple times, the actual release is
         delayed to the last release call."""
         if self.held > 1:
             self.held -= 1
--- a/mercurial/mail.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/mail.py	Tue Sep 11 08:36:09 2012 -0700
@@ -13,7 +13,7 @@
 _oldheaderinit = email.Header.Header.__init__
 def _unifiedheaderinit(self, *args, **kw):
     """
-    Python2.7 introduces a backwards incompatible change
+    Python 2.7 introduces a backwards incompatible change
     (Python issue1974, r70772) in email.Generator.Generator code:
     pre-2.7 code passed "continuation_ws='\t'" to the Header
     constructor, and 2.7 removed this parameter.
@@ -151,7 +151,7 @@
 
 def mimetextqp(body, subtype, charset):
     '''Return MIME message.
-    Qouted-printable transfer encoding will be used if necessary.
+    Quoted-printable transfer encoding will be used if necessary.
     '''
     enc = None
     for line in body.splitlines():
--- a/mercurial/manifest.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/manifest.py	Tue Sep 11 08:36:09 2012 -0700
@@ -64,9 +64,7 @@
 
         If the string is found m[start:end] are the line containing
         that string.  If start == end the string was not found and
-        they indicate the proper sorted insertion point.  This was
-        taken from bisect_left, and modified to find line start/end as
-        it goes along.
+        they indicate the proper sorted insertion point.
 
         m should be a buffer or a string
         s is a string'''
@@ -156,7 +154,7 @@
             # combine the changed lists into one list for sorting
             work = [(x, False) for x in added]
             work.extend((x, True) for x in removed)
-            # this could use heapq.merge() (from python2.6+) or equivalent
+            # this could use heapq.merge() (from Python 2.6+) or equivalent
             # since the lists are already sorted
             work.sort()
 
--- a/mercurial/match.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/match.py	Tue Sep 11 08:36:09 2012 -0700
@@ -49,7 +49,7 @@
         a pattern is one of:
         'glob:<glob>' - a glob relative to cwd
         're:<regexp>' - a regular expression
-        'path:<path>' - a path relative to canonroot
+        'path:<path>' - a path relative to repository root
         'relglob:<glob>' - an unrooted glob (*.c matches C files in all dirs)
         'relpath:<path>' - a path relative to cwd
         'relre:<regexp>' - a regexp that needn't match the start of a name
--- a/mercurial/obsolete.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/obsolete.py	Tue Sep 11 08:36:09 2012 -0700
@@ -52,17 +52,15 @@
   cannot contain '\0'.
 """
 import struct
-from mercurial import util, base85
+import util, base85
 from i18n import _
 
-# the obsolete feature is not mature enought to be enabled by default.
-# you have to rely on third party extension extension to enable this.
-_enabled = False
-
 _pack = struct.pack
 _unpack = struct.unpack
 
-# the obsolete feature is not mature enought to be enabled by default.
+_SEEK_END = 2 # os.SEEK_END was introduced in Python 2.5
+
+# the obsolete feature is not mature enough to be enabled by default.
 # you have to rely on third party extension extension to enable this.
 _enabled = False
 
@@ -163,6 +161,8 @@
     """
 
     def __init__(self, sopener):
+        # caches for various obsolescence related cache
+        self.caches = {}
         self._all = []
         # new markers to serialize
         self.precursors = {}
@@ -211,7 +211,7 @@
                 # defined. So we must seek to the end before calling tell(),
                 # or we may get a zero offset for non-zero sized files on
                 # some platforms (issue3543).
-                f.seek(0, 2) # os.SEEK_END
+                f.seek(0, _SEEK_END)
                 offset = f.tell()
                 transaction.add('obsstore', offset)
                 # offset == 0: new file - add the version header
@@ -222,6 +222,8 @@
                 # call 'filecacheentry.refresh()'  here
                 f.close()
             self._load(new)
+            # new marker *may* have changed several set. invalidate the cache.
+            self.caches.clear()
         return len(new)
 
     def mergemarkers(self, transaction, data):
@@ -318,7 +320,7 @@
 def anysuccessors(obsstore, node):
     """Yield every successor of <node>
 
-    This this a linear yield unsuitable to detect split changeset."""
+    This is a linear yield unsuited to detecting split changesets."""
     remaining = set([node])
     seen = set(remaining)
     while remaining:
@@ -329,3 +331,103 @@
                 if suc not in seen:
                     seen.add(suc)
                     remaining.add(suc)
+
+# mapping of 'set-name' -> <function to computer this set>
+cachefuncs = {}
+def cachefor(name):
+    """Decorator to register a function as computing the cache for a set"""
+    def decorator(func):
+        assert name not in cachefuncs
+        cachefuncs[name] = func
+        return func
+    return decorator
+
+def getobscache(repo, name):
+    """Return the set of revision that belong to the <name> set
+
+    Such access may compute the set and cache it for future use"""
+    if not repo.obsstore:
+        return ()
+    if name not in repo.obsstore.caches:
+        repo.obsstore.caches[name] = cachefuncs[name](repo)
+    return repo.obsstore.caches[name]
+
+# To be simple we need to invalidate obsolescence cache when:
+#
+# - new changeset is added:
+# - public phase is changed
+# - obsolescence marker are added
+# - strip is used a repo
+def clearobscaches(repo):
+    """Remove all obsolescence related cache from a repo
+
+    This remove all cache in obsstore is the obsstore already exist on the
+    repo.
+
+    (We could be smarter here given the exact event that trigger the cache
+    clearing)"""
+    # only clear cache is there is obsstore data in this repo
+    if 'obsstore' in repo._filecache:
+        repo.obsstore.caches.clear()
+
+@cachefor('obsolete')
+def _computeobsoleteset(repo):
+    """the set of obsolete revisions"""
+    obs = set()
+    nm = repo.changelog.nodemap
+    for prec in repo.obsstore.precursors:
+        rev = nm.get(prec)
+        if rev is not None:
+            obs.add(rev)
+    return set(repo.revs('%ld - public()', obs))
+
+@cachefor('unstable')
+def _computeunstableset(repo):
+    """the set of non obsolete revisions with obsolete parents"""
+    return set(repo.revs('(obsolete()::) - obsolete()'))
+
+@cachefor('suspended')
+def _computesuspendedset(repo):
+    """the set of obsolete parents with non obsolete descendants"""
+    return set(repo.revs('obsolete() and obsolete()::unstable()'))
+
+@cachefor('extinct')
+def _computeextinctset(repo):
+    """the set of obsolete parents without non obsolete descendants"""
+    return set(repo.revs('obsolete() - obsolete()::unstable()'))
+
+def createmarkers(repo, relations, flag=0, metadata=None):
+    """Add obsolete markers between changesets in a repo
+
+    <relations> must be an iterable of (<old>, (<new>, ...)) tuple.
+    `old` and `news` are changectx.
+
+    Trying to obsolete a public changeset will raise an exception.
+
+    Current user and date are used except if specified otherwise in the
+    metadata attribute.
+
+    This function operates within a transaction of its own, but does
+    not take any lock on the repo.
+    """
+    # prepare metadata
+    if metadata is None:
+        metadata = {}
+    if 'date' not in metadata:
+        metadata['date'] = '%i %i' % util.makedate()
+    if 'user' not in metadata:
+        metadata['user'] = repo.ui.username()
+    tr = repo.transaction('add-obsolescence-marker')
+    try:
+        for prec, sucs in relations:
+            if not prec.mutable():
+                raise util.Abort("cannot obsolete immutable changeset: %s"
+                                 % prec)
+            nprec = prec.node()
+            nsucs = tuple(s.node() for s in sucs)
+            if nprec in nsucs:
+                raise util.Abort("changeset %s cannot obsolete itself" % prec)
+            repo.obsstore.create(tr, nprec, nsucs, flag, metadata)
+        tr.close()
+    finally:
+        tr.release()
--- a/mercurial/phases.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/phases.py	Tue Sep 11 08:36:09 2012 -0700
@@ -104,6 +104,7 @@
 from node import nullid, nullrev, bin, hex, short
 from i18n import _
 import util
+import obsolete
 
 allphases = public, draft, secret = range(3)
 trackedphases = allphases[1:]
@@ -195,7 +196,7 @@
         return self._phaserevs
 
     def phase(self, repo, rev):
-        # We need a repo argument here to be able to build _phaserev
+        # We need a repo argument here to be able to build _phaserevs
         # if necessary. The repository instance is not stored in
         # phasecache to avoid reference cycles. The changelog instance
         # is not stored because it is a filecache() property and can
@@ -244,6 +245,7 @@
             # declare deleted root in the target phase
             if targetphase != 0:
                 self.retractboundary(repo, targetphase, delroots)
+        obsolete.clearobscaches(repo)
 
     def retractboundary(self, repo, targetphase, nodes):
         # Be careful to preserve shallow-copied values: do not update
@@ -260,6 +262,7 @@
             ctxs = repo.set('roots(%ln::)', currentroots)
             currentroots.intersection_update(ctx.node() for ctx in ctxs)
             self._updateroots(targetphase, currentroots)
+        obsolete.clearobscaches(repo)
 
 def advanceboundary(repo, targetphase, nodes):
     """Add nodes to a phase changing other nodes phases if necessary.
@@ -363,7 +366,7 @@
     """compute new head of a subset minus another
 
     * `heads`: define the first subset
-    * `rroots`: define the second we substract to the first"""
+    * `roots`: define the second we subtract from the first"""
     revset = repo.set('heads((%ln + parents(%ln)) - (%ln::%ln))',
                       heads, roots, roots, heads)
     return [c.node() for c in revset]
--- a/mercurial/posix.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/posix.py	Tue Sep 11 08:36:09 2012 -0700
@@ -10,7 +10,6 @@
 import os, sys, errno, stat, getpass, pwd, grp, tempfile, unicodedata
 
 posixfile = open
-nulldev = '/dev/null'
 normpath = os.path.normpath
 samestat = os.path.samestat
 oslink = os.link
--- a/mercurial/pure/osutil.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/pure/osutil.py	Tue Sep 11 08:36:09 2012 -0700
@@ -82,7 +82,7 @@
 
     _FILE_ATTRIBUTE_NORMAL = 0x80
 
-    # _open_osfhandle
+    # open_osfhandle flags
     _O_RDONLY = 0x0000
     _O_RDWR = 0x0002
     _O_APPEND = 0x0008
--- a/mercurial/pure/parsers.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/pure/parsers.py	Tue Sep 11 08:36:09 2012 -0700
@@ -70,7 +70,7 @@
 
 def parse_dirstate(dmap, copymap, st):
     parents = [st[:20], st[20: 40]]
-    # deref fields so they will be local in loop
+    # dereference fields so they will be local in loop
     format = ">cllll"
     e_size = struct.calcsize(format)
     pos1 = 40
--- a/mercurial/pvec.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/pvec.py	Tue Sep 11 08:36:09 2012 -0700
@@ -57,7 +57,7 @@
 _depthbytes = _depthbits / 8
 _vecbytes = _bytes - _depthbytes
 _vecbits = _vecbytes * 8
-_radius = (_vecbits - 30) / 2 # high probability vecs are related
+_radius = (_vecbits - 30) / 2 # high probability vectors are related
 
 def _bin(bs):
     '''convert a bytestring to a long'''
--- a/mercurial/repair.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/repair.py	Tue Sep 11 08:36:09 2012 -0700
@@ -111,9 +111,8 @@
         saverevs.difference_update(descendants)
     savebases = [cl.node(r) for r in saverevs]
     stripbases = [cl.node(r) for r in tostrip]
-    rset = ' or '.join([str(r) for r in tostrip])
-    newbmtarget = repo.revs('sort(heads(ancestors(%r) - (%r)), -rev)',
-                            rset, rset)
+    newbmtarget = repo.revs('sort(heads((::%ld) - (%ld)), -rev)',
+                            tostrip, tostrip)
     if newbmtarget:
         newbmtarget = newbmtarget[0]
     else:
--- a/mercurial/revlog.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/revlog.py	Tue Sep 11 08:36:09 2012 -0700
@@ -1015,7 +1015,7 @@
         see addrevision for argument descriptions.
         invariants:
         - text is optional (can be None); if not set, cachedelta must be set.
-          if both are set, they must correspond to eachother.
+          if both are set, they must correspond to each other.
         """
         btext = [text]
         def buildtext():
--- a/mercurial/revset.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/revset.py	Tue Sep 11 08:36:09 2012 -0700
@@ -12,6 +12,7 @@
 import match as matchmod
 from i18n import _
 import encoding
+import obsolete as obsmod
 
 def _revancestors(repo, revs, followfirst):
     """Like revlog.ancestors(), but supports followfirst."""
@@ -335,7 +336,7 @@
     Changesets marked in the specified bisect status:
 
     - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip
-    - ``goods``, ``bads``      : csets topologicaly good/bad
+    - ``goods``, ``bads``      : csets topologically good/bad
     - ``range``              : csets taking part in the bisection
     - ``pruned``             : csets that are goods, bads or skipped
     - ``untested``           : csets whose fate is yet unknown
@@ -621,8 +622,8 @@
     """
     # i18n: "extinct" is a keyword
     getargs(x, 0, 0, _("extinct takes no arguments"))
-    extinctset = set(repo.revs('(obsolete()::) - (::(not obsolete()))'))
-    return [r for r in subset if r in extinctset]
+    extincts = obsmod.getobscache(repo, 'extinct')
+    return [r for r in subset if r in extincts]
 
 def extra(repo, subset, x):
     """``extra(label, [value])``
@@ -838,6 +839,14 @@
     ps = set(parents(repo, subset, x))
     return [r for r in s if r not in ps]
 
+def hidden(repo, subset, x):
+    """``hidden()``
+    Hidden changesets.
+    """
+    # i18n: "hidden" is a keyword
+    getargs(x, 0, 0, _("hidden takes no arguments"))
+    return [r for r in subset if r in repo.hiddenrevs]
+
 def keyword(repo, subset, x):
     """``keyword(string)``
     Search commit message, user name, and names of changed files for
@@ -951,7 +960,8 @@
     Mutable changeset with a newer version."""
     # i18n: "obsolete" is a keyword
     getargs(x, 0, 0, _("obsolete takes no arguments"))
-    return [r for r in subset if repo[r].obsolete()]
+    obsoletes = obsmod.getobscache(repo, 'obsolete')
+    return [r for r in subset if r in obsoletes]
 
 def origin(repo, subset, x):
     """``origin([set])``
@@ -1429,8 +1439,8 @@
     """
     # i18n: "unstable" is a keyword
     getargs(x, 0, 0, _("unstable takes no arguments"))
-    unstableset = set(repo.revs('(obsolete()::) - obsolete()'))
-    return [r for r in subset if r in unstableset]
+    unstables = obsmod.getobscache(repo, 'unstable')
+    return [r for r in subset if r in unstables]
 
 
 def user(repo, subset, x):
@@ -1484,6 +1494,7 @@
     "grep": grep,
     "head": head,
     "heads": heads,
+    "hidden": hidden,
     "id": node_,
     "keyword": keyword,
     "last": last,
--- a/mercurial/setdiscovery.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/setdiscovery.py	Tue Sep 11 08:36:09 2012 -0700
@@ -84,9 +84,6 @@
                     abortwhenunrelated=True):
     '''Return a tuple (common, anyincoming, remoteheads) used to identify
     missing nodes from or in remote.
-
-    shortcutlocal determines whether we try use direct access to localrepo if
-    remote is actually local.
     '''
     roundtrips = 0
     cl = local.changelog
@@ -109,7 +106,8 @@
         srvheadhashes = srvheadhashesref.value
         yesno = yesnoref.value
     else:
-        # compatibitity with pre-batch, but post-known remotes during 1.9 devel
+        # compatibility with pre-batch, but post-known remotes during 1.9
+        # development
         srvheadhashes = remote.heads()
         sample = []
 
--- a/mercurial/subrepo.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/subrepo.py	Tue Sep 11 08:36:09 2012 -0700
@@ -838,7 +838,7 @@
             name = ''.join(c.data for c
                            in e.getElementsByTagName('name')[0].childNodes
                            if c.nodeType == c.TEXT_NODE)
-            paths.append(name)
+            paths.append(name.encode('utf-8'))
         return paths
 
     def filedata(self, name):
--- a/mercurial/templater.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/templater.py	Tue Sep 11 08:36:09 2012 -0700
@@ -146,7 +146,15 @@
 
 def runfilter(context, mapping, data):
     func, data, filt = data
-    return filt(func(context, mapping, data))
+    try:
+        return filt(func(context, mapping, data))
+    except (ValueError, AttributeError, TypeError):
+        if isinstance(data, tuple):
+            dt = data[1]
+        else:
+            dt = data
+        raise util.Abort(_("template filter '%s' is not compatible with "
+                           "keyword '%s'") % (filt.func_name, dt))
 
 def buildmap(exp, context):
     func, data = compileexp(exp[1], context)
--- a/mercurial/templates/gitweb/graph.tmpl	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/templates/gitweb/graph.tmpl	Tue Sep 11 08:36:09 2012 -0700
@@ -51,11 +51,6 @@
 var graph = new Graph();
 graph.scale({bg_height});
 
-var revlink = '<li style="_STYLE"><span class="desc">';
-revlink += '<a class="list" href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID"><b>_DESC</b></a>';
-revlink += '</span> _TAGS';
-revlink += '<span class="info">_DATE, by _USER</span></li>';
-
 graph.vertex = function(x, y, color, parity, cur) \{
 	
 	this.ctx.beginPath();
@@ -66,13 +61,6 @@
 	var bg = '<li class="bg parity' + parity + '"></li>';
 	var left = (this.columns + 1) * this.bg_height;
 	var nstyle = 'padding-left: ' + left + 'px;';
-	var item = revlink.replace(/_STYLE/, nstyle);
-	item = item.replace(/_PARITY/, 'parity' + parity);
-	item = item.replace(/_NODEID/, cur[0]);
-	item = item.replace(/_NODEID/, cur[0]);
-	item = item.replace(/_DESC/, cur[3]);
-	item = item.replace(/_USER/, cur[4]);
-	item = item.replace(/_DATE/, cur[5]);
 	
 	var tagspan = '';
 	if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) \{
@@ -99,7 +87,11 @@
 		tagspan += '</span>';
 	}
 	
-	item = item.replace(/_TAGS/, tagspan);
+	var item = '<li style="' + nstyle + '"><span class="desc">';
+	item += '<a class="list" href="{url}rev/' + cur[0] + '{sessionvars%urlparameter}" title="' + cur[0] + '"><b>' + cur[3] + '</b></a>';
+	item += '</span> ' + tagspan + '';
+	item += '<span class="info">' + cur[5] + ', by ' + cur[4] + '</span></li>';
+
 	return [bg, item];
 	
 }
--- a/mercurial/templates/monoblue/graph.tmpl	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/templates/monoblue/graph.tmpl	Tue Sep 11 08:36:09 2012 -0700
@@ -49,10 +49,6 @@
     var graph = new Graph();
     graph.scale({bg_height});
 
-    var revlink = '<li style="_STYLE"><span class="desc">';
-    revlink += '<a href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID">_DESC</a>';
-    revlink += '</span>_TAGS<span class="info">_DATE, by _USER</span></li>';
-
     graph.vertex = function(x, y, color, parity, cur) \{
 
         this.ctx.beginPath();
@@ -63,13 +59,6 @@
         var bg = '<li class="bg parity' + parity + '"></li>';
         var left = (this.columns + 1) * this.bg_height;
         var nstyle = 'padding-left: ' + left + 'px;';
-        var item = revlink.replace(/_STYLE/, nstyle);
-        item = item.replace(/_PARITY/, 'parity' + parity);
-        item = item.replace(/_NODEID/, cur[0]);
-        item = item.replace(/_NODEID/, cur[0]);
-        item = item.replace(/_DESC/, cur[3]);
-        item = item.replace(/_USER/, cur[4]);
-        item = item.replace(/_DATE/, cur[5]);
 
         var tagspan = '';
         if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) \{
@@ -96,7 +85,10 @@
             tagspan += '</span>';
         }
 
-        item = item.replace(/_TAGS/, tagspan);
+        var item = '<li style="' + nstyle + '"><span class="desc">';
+        item += '<a href="{url}rev/' + cur[0] + '{sessionvars%urlparameter}" title="' + cur[0] + '">' + cur[3] + '</a>';
+        item += '</span>' + tagspan + '<span class="info">' + cur[5] + ', by ' + cur[4] + '</span></li>';
+
         return [bg, item];
 
     }
--- a/mercurial/templates/paper/graph.tmpl	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/templates/paper/graph.tmpl	Tue Sep 11 08:36:09 2012 -0700
@@ -62,10 +62,6 @@
 var graph = new Graph();
 graph.scale({bg_height});
 
-var revlink = '<li style="_STYLE"><span class="desc">';
-revlink += '<a href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID">_DESC</a>';
-revlink += '</span>_TAGS<span class="info">_DATE, by _USER</span></li>';
-
 graph.vertex = function(x, y, color, parity, cur) \{
 	
 	this.ctx.beginPath();
@@ -76,13 +72,6 @@
 	var bg = '<li class="bg parity' + parity + '"></li>';
 	var left = (this.columns + 1) * this.bg_height;
 	var nstyle = 'padding-left: ' + left + 'px;';
-	var item = revlink.replace(/_STYLE/, nstyle);
-	item = item.replace(/_PARITY/, 'parity' + parity);
-	item = item.replace(/_NODEID/, cur[0]);
-	item = item.replace(/_NODEID/, cur[0]);
-	item = item.replace(/_DESC/, cur[3]);
-	item = item.replace(/_USER/, cur[4]);
-	item = item.replace(/_DATE/, cur[5]);
 
 	var tagspan = '';
 	if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) \{
@@ -108,8 +97,11 @@
 		}
 		tagspan += '</span>';
 	}
+
+	var item = '<li style="' + nstyle + '"><span class="desc">';
+	item += '<a href="{url}rev/' + cur[0] + '{sessionvars%urlparameter}" title="' + cur[0] + '">' + cur[3] + '</a>';
+	item += '</span>' + tagspan + '<span class="info">' + cur[5] + ', by ' + cur[4] + '</span></li>';
 	
-	item = item.replace(/_TAGS/, tagspan);
 	return [bg, item];
 	
 }
--- a/mercurial/templates/spartan/graph.tmpl	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/templates/spartan/graph.tmpl	Tue Sep 11 08:36:09 2012 -0700
@@ -43,10 +43,6 @@
 var graph = new Graph();
 graph.scale({bg_height});
 
-var revlink = '<li style="_STYLE"><span class="desc">';
-revlink += '<a href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID">_DESC</a>';
-revlink += '</span><span class="info">_DATE, by _USER</span></li>';
-
 graph.vertex = function(x, y, color, parity, cur) \{
 	
 	this.ctx.beginPath();
@@ -57,14 +53,10 @@
 	var bg = '<li class="bg parity' + parity + '"></li>';
 	var left = (this.columns + 1) * this.bg_height;
 	var nstyle = 'padding-left: ' + left + 'px;';
-	var item = revlink.replace(/_STYLE/, nstyle);
-	item = item.replace(/_PARITY/, 'parity' + parity);
-	item = item.replace(/_NODEID/, cur[0]);
-	item = item.replace(/_NODEID/, cur[0]);
-	item = item.replace(/_DESC/, cur[3]);
-	item = item.replace(/_USER/, cur[4]);
-	item = item.replace(/_DATE/, cur[5]);
-	
+	var item = '<li style="' + nstyle + '"><span class="desc">';
+	item += '<a href="{url}rev/' + cur[0] + '{sessionvars%urlparameter}" title="' + cur[0] + '">' + cur[3] + '</a>';
+	item += '</span><span class="info">' + cur[5] + ', by ' + cur[4] + '</span></li>';
+
 	return [bg, item];
 	
 }
--- a/mercurial/templates/template-vars.txt	Fri Aug 17 13:58:19 2012 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-repo          the name of the repo
-rev           a changeset.manifest revision
-node          a changeset node
-changesets    total number of changesets
-file          a filename
-filerev       a file revision
-filerevs      total number of file revisions
-up            the directory of the relevant file
-path          a path in the manifest, starting with "/"
-basename      a short pathname
-date          a date string
-age           age in hours, days, etc
-line          a line of text (escaped)
-desc          a description (escaped, with breaks)
-shortdesc     a short description (escaped)
-author        a name or email addressv(obfuscated)
-parent        a list of the parent
-child         a list of the children
-tags          a list of tag
-
-header        the global page header
-footer        the global page footer
-
-files         a list of file links
-file_copies   a list of pairs of name, source filenames
-dirs          a set of directory links
-diff          a diff of one or more files
-annotate      an annotated file
-entries       the entries relevant to the page
-
-url           base url of hgweb interface
-logourl       base url of logo
-staticurl     base url for static resources
-
-
-Templates and commands:
-  changelog(rev) - a page for browsing changesets
-    naventry - a link for jumping to a changeset number
-    filenodelink - jump to file diff
-    fileellipses - printed after maxfiles
-    changelogentry - an entry in the log
-  manifest - browse a manifest as a directory tree
--- a/mercurial/ui.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/ui.py	Tue Sep 11 08:36:09 2012 -0700
@@ -713,8 +713,8 @@
         With stock hg, this is simply a debug message that is hidden
         by default, but with extensions or GUI tools it may be
         visible. 'topic' is the current operation, 'item' is a
-        non-numeric marker of the current position (ie the currently
-        in-process file), 'pos' is the current numeric position (ie
+        non-numeric marker of the current position (i.e. the currently
+        in-process file), 'pos' is the current numeric position (i.e.
         revision, bytes, etc.), unit is a corresponding unit label,
         and total is the highest expected pos.
 
--- a/mercurial/url.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/url.py	Tue Sep 11 08:36:09 2012 -0700
@@ -175,7 +175,7 @@
             self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
             self.sock.connect((self.host, self.port))
             if _generic_proxytunnel(self):
-                # we do not support client x509 certificates
+                # we do not support client X.509 certificates
                 self.sock = sslutil.ssl_wrap_socket(self.sock, None, None)
         else:
             keepalive.HTTPConnection.connect(self)
@@ -278,7 +278,8 @@
     res.will_close = res._check_close()
 
     # do we have a Content-Length?
-    # NOTE: RFC 2616, S4.4, #3 says we ignore this if tr_enc is "chunked"
+    # NOTE: RFC 2616, section 4.4, #3 says we ignore this if
+    # transfer-encoding is "chunked"
     length = res.msg.getheader('content-length')
     if length and not res.chunked:
         try:
--- a/mercurial/util.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/util.py	Tue Sep 11 08:36:09 2012 -0700
@@ -45,7 +45,6 @@
 nlinks = platform.nlinks
 normpath = platform.normpath
 normcase = platform.normcase
-nulldev = platform.nulldev
 openhardlinks = platform.openhardlinks
 oslink = platform.oslink
 parsepatchoutput = platform.parsepatchoutput
@@ -800,7 +799,7 @@
     return temp
 
 class atomictempfile(object):
-    '''writeable file object that atomically updates a file
+    '''writable file object that atomically updates a file
 
     All writes will go to a temporary copy of the original file. Call
     close() when you are done writing, and atomictempfile will rename
@@ -1240,7 +1239,7 @@
         so overriding is needed to use width information of each characters.
 
         In addition, characters classified into 'ambiguous' width are
-        treated as wide in east asian area, but as narrow in other.
+        treated as wide in East Asian area, but as narrow in other.
 
         This requires use decision to determine width of such characters.
         """
@@ -1301,7 +1300,7 @@
                 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).
+                # is the very beginning of the text (i.e. no lines started yet).
                 if self.drop_whitespace and chunks[-1].strip() == '' and lines:
                     del chunks[-1]
 
@@ -1478,7 +1477,11 @@
                  for a in _hexdig for b in _hexdig)
 
 def _urlunquote(s):
-    """unquote('abc%20def') -> 'abc def'."""
+    """Decode HTTP/HTML % encoding.
+
+    >>> _urlunquote('abc%20def')
+    'abc def'
+    """
     res = s.split('%')
     # fastpath
     if len(res) == 1:
--- a/mercurial/verify.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/verify.py	Tue Sep 11 08:36:09 2012 -0700
@@ -120,6 +120,7 @@
     havemf = len(mf) > 0
 
     ui.status(_("checking changesets\n"))
+    hasmanifest = False
     seen = {}
     checklog(cl, "changelog", 0)
     total = len(repo)
@@ -130,16 +131,22 @@
 
         try:
             changes = cl.read(n)
-            mflinkrevs.setdefault(changes[0], []).append(i)
+            if changes[0] != nullid:
+                mflinkrevs.setdefault(changes[0], []).append(i)
+                hasmanifest = True
             for f in changes[3]:
                 filelinkrevs.setdefault(f, []).append(i)
         except Exception, inst:
+            hasmanifest = True
             exc(i, _("unpacking changeset %s") % short(n), inst)
     ui.progress(_('checking'), None)
 
     ui.status(_("checking manifests\n"))
     seen = {}
-    checklog(mf, "manifest", 0)
+    if hasmanifest:
+        # Do not check manifest if there are only changelog entries with
+        # null manifests.
+        checklog(mf, "manifest", 0)
     total = len(mf)
     for i in mf:
         ui.progress(_('checking'), i, total=total, unit=_('manifests'))
--- a/mercurial/win32.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/win32.py	Tue Sep 11 08:36:09 2012 -0700
@@ -328,7 +328,7 @@
     env += '\0'
 
     args = subprocess.list2cmdline(args)
-    # Not running the command in shell mode makes python26 hang when
+    # Not running the command in shell mode makes Python 2.6 hang when
     # writing to hgweb output socket.
     comspec = os.environ.get("COMSPEC", "cmd.exe")
     args = comspec + " /c " + args
--- a/mercurial/windows.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/mercurial/windows.py	Tue Sep 11 08:36:09 2012 -0700
@@ -24,7 +24,6 @@
 testpid = win32.testpid
 unlink = win32.unlink
 
-nulldev = 'NUL:'
 umask = 0022
 
 # wrap osutil.posixfile to provide friendlier exceptions
@@ -174,7 +173,7 @@
     # Work around "popen spawned process may not write to stdout
     # under windows"
     # http://bugs.python.org/issue1366
-    command += " 2> %s" % nulldev
+    command += " 2> %s" % os.devnull
     return os.popen(quotecommand(command), mode)
 
 def explainexit(code):
--- a/tests/hghave.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/hghave.py	Tue Sep 11 08:36:09 2012 -0700
@@ -118,6 +118,9 @@
     except OSError:
         return False
 
+def has_killdaemons():
+    return True
+
 def has_cacheable_fs():
     from mercurial import util
 
@@ -286,6 +289,7 @@
     "hardlink": (has_hardlink, "hardlinks"),
     "icasefs": (has_icasefs, "case insensitive file system"),
     "inotify": (has_inotify, "inotify extension support"),
+    "killdaemons": (has_killdaemons, 'killdaemons.py support'),
     "lsprof": (has_lsprof, "python lsprof module"),
     "mtn": (has_mtn, "monotone client (>= 1.0)"),
     "outer-repo": (has_outer_repo, "outer repo"),
--- a/tests/killdaemons.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/killdaemons.py	Tue Sep 11 08:36:09 2012 -0700
@@ -1,25 +1,54 @@
 #!/usr/bin/env python
 
-import os, time, errno, signal
+import os, sys, time, errno, signal
 
-# Kill off any leftover daemon processes
-try:
-    fp = open(os.environ['DAEMON_PIDS'])
-    for line in fp:
-        try:
-            pid = int(line)
-        except ValueError:
-            continue
+if os.name =='nt':
+    import ctypes
+    def kill(pid, logfn, tryhard=True):
+        logfn('# Killing daemon process %d' % pid)
+        PROCESS_TERMINATE = 1
+        handle = ctypes.windll.kernel32.OpenProcess(
+                PROCESS_TERMINATE, False, pid)
+        ctypes.windll.kernel32.TerminateProcess(handle, -1)
+        ctypes.windll.kernel32.CloseHandle(handle)
+else:
+    def kill(pid, logfn, tryhard=True):
         try:
             os.kill(pid, 0)
+            logfn('# Killing daemon process %d' % pid)
             os.kill(pid, signal.SIGTERM)
-            for i in range(10):
-                time.sleep(0.05)
+            if tryhard:
+                for i in range(10):
+                    time.sleep(0.05)
+                    os.kill(pid, 0)
+            else:
+                time.sleep(0.1)
                 os.kill(pid, 0)
+            logfn('# Daemon process %d is stuck - really killing it' % pid)
             os.kill(pid, signal.SIGKILL)
         except OSError, err:
             if err.errno != errno.ESRCH:
                 raise
-    fp.close()
-except IOError:
-    pass
+
+def killdaemons(pidfile, tryhard=True, remove=False, logfn=None):
+    if not logfn:
+        logfn = lambda s: s
+    # Kill off any leftover daemon processes
+    try:
+        fp = open(pidfile)
+        for line in fp:
+            try:
+                pid = int(line)
+            except ValueError:
+                continue
+            kill(pid, logfn, tryhard)
+        fp.close()
+        if remove:
+            os.unlink(pidfile)
+    except IOError:
+        pass
+
+if __name__ == '__main__':
+    path, = sys.argv[1:]
+    killdaemons(path)
+
--- a/tests/run-tests.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/run-tests.py	Tue Sep 11 08:36:09 2012 -0700
@@ -54,6 +54,7 @@
 import time
 import re
 import threading
+import killdaemons as killmod
 
 processlock = threading.Lock()
 
@@ -348,29 +349,8 @@
         pass
 
 def killdaemons():
-    # Kill off any leftover daemon processes
-    try:
-        fp = open(DAEMON_PIDS)
-        for line in fp:
-            try:
-                pid = int(line)
-            except ValueError:
-                continue
-            try:
-                os.kill(pid, 0)
-                vlog('# Killing daemon process %d' % pid)
-                os.kill(pid, signal.SIGTERM)
-                time.sleep(0.1)
-                os.kill(pid, 0)
-                vlog('# Daemon process %d is stuck - really killing it' % pid)
-                os.kill(pid, signal.SIGKILL)
-            except OSError, err:
-                if err.errno != errno.ESRCH:
-                    raise
-        fp.close()
-        os.unlink(DAEMON_PIDS)
-    except IOError:
-        pass
+    return killmod.killdaemons(DAEMON_PIDS, tryhard=False, remove=True,
+                               logfn=vlog)
 
 def cleanup(options):
     if not options.keep_tmpdir:
--- a/tests/test-archive.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-archive.t	Tue Sep 11 08:36:09 2012 -0700
@@ -24,7 +24,7 @@
   >     echo % $3 and $4 disallowed should both give 403
   >     "$TESTDIR/get-with-headers.py" localhost:$HGPORT "archive/tip.$3" | head -n 1
   >     "$TESTDIR/get-with-headers.py" localhost:$HGPORT "archive/tip.$4" | head -n 1
-  >     "$TESTDIR/killdaemons.py"
+  >     "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   >     cat errors.log
   >     cp .hg/hgrc-base .hg/hgrc
   > }
@@ -93,7 +93,7 @@
       testing: test-archive-2c0277f05ed4/foo   OK
   No errors detected in compressed data of archive.zip.
 
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
 
   $ hg archive -t tar test.tar
   $ tar tf test.tar
--- a/tests/test-bookmarks-merge.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-bookmarks-merge.t	Tue Sep 11 08:36:09 2012 -0700
@@ -91,3 +91,38 @@
      b                         1:d2ae7f538514
      c                         3:b8f96cf4688b
    * e                         7:ca784329f0ba
+
+# test warning when all heads are inactive bookmarks
+
+  $ hg up -C 6
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo g > g
+  $ hg commit -Am 'g'
+  adding g
+  $ hg bookmark -i g
+  $ hg bookmarks
+     b                         1:d2ae7f538514
+     c                         3:b8f96cf4688b
+     e                         7:ca784329f0ba
+     g                         8:04dd21731d95
+  $ hg heads
+  changeset:   8:04dd21731d95
+  bookmark:    g
+  tag:         tip
+  parent:      6:be381d1126a0
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     g
+  
+  changeset:   7:ca784329f0ba
+  bookmark:    e
+  parent:      5:26bee9c5bcf3
+  parent:      4:a0546fcfe0fb
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     merge
+  
+  $ hg merge
+  abort: heads are bookmarked - please merge with an explicit rev
+  (run 'hg heads' to see all heads)
+  [255]
--- a/tests/test-check-code.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-check-code.t	Tue Sep 11 08:36:09 2012 -0700
@@ -83,7 +83,7 @@
    any/all/format not available in Python 2.4
   ./non-py24.py:11:
    >     try:
-   no try/except/finally in Py2.4
+   no try/except/finally in Python 2.4
   ./classstyle.py:4:
    > class oldstyle_class:
    old-style class, use class foo(object)
--- a/tests/test-clone.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-clone.t	Tue Sep 11 08:36:09 2012 -0700
@@ -558,7 +558,7 @@
   $ test -d d/.hg
   [1]
 
-reenable perm to allow deletion
+re-enable perm to allow deletion
 
   $ chmod +rx c/.hg/store/data
 
--- a/tests/test-command-template.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-command-template.t	Tue Sep 11 08:36:09 2012 -0700
@@ -1363,6 +1363,30 @@
   abort: t:3: unmatched quotes
   [255]
 
+Behind the scenes, this will throw TypeError
+
+  $ hg log -l 3 --template '{date|obfuscate}\n'
+  abort: template filter 'obfuscate' is not compatible with keyword 'date'
+  [255]
+
+Behind the scenes, this will throw a ValueError
+
+  $ hg log -l 3 --template 'line: {desc|shortdate}\n'
+  abort: template filter 'shortdate' is not compatible with keyword 'desc'
+  [255]
+
+Behind the scenes, this will throw AttributeError
+
+  $ hg log -l 3 --template 'line: {date|escape}\n'
+  abort: template filter 'escape' is not compatible with keyword 'date'
+  [255]
+
+Behind the scenes, this will throw ValueError
+
+  $ hg tip --template '{author|email|date}\n'
+  abort: template filter 'datefilter' is not compatible with keyword 'author'
+  [255]
+
   $ cd ..
 
 
--- a/tests/test-commit-amend.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-commit-amend.t	Tue Sep 11 08:36:09 2012 -0700
@@ -25,7 +25,7 @@
 
   $ cat >> $HGRCPATH <<EOF
   > [hooks]
-  > pretxncommit.foo = sh -c "echo \"pretxncommit \$HG_NODE\"; hg id -r \$HG_NODE"
+  > pretxncommit.foo = sh -c "echo \\"pretxncommit \$HG_NODE\\"; hg id -r \$HG_NODE"
   > EOF
 
 Amending changeset with changes in working dir:
@@ -167,6 +167,8 @@
   $ echo a >> a
   $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
   amending changeset ffb49186f961
+  a
+  copying changeset a4f8a65b7c6a to ad120869acf0
   another precious commit message
   
   
@@ -177,9 +179,7 @@
   HG: branch 'default'
   HG: changed a
   a
-  copying changeset 27f3aacd3011 to ad120869acf0
-  a
-  stripping intermediate changeset 27f3aacd3011
+  stripping intermediate changeset a4f8a65b7c6a
   stripping amended changeset ffb49186f961
   2 changesets found
   saved backup bundle to $TESTTMP/.hg/strip-backup/ffb49186f961-amend-backup.hg (glob)
@@ -355,3 +355,90 @@
   $ hg log -r . --debug | grep extra
   extra:       branch=a
   extra:       source=2647734878ef0236dda712fae9c1651cf694ea8a
+
+Preserve phase
+
+  $ hg phase '.^::.'
+  11: draft
+  13: draft
+  $ hg phase --secret --force .
+  $ hg phase '.^::.'
+  11: draft
+  13: secret
+  $ hg commit --amend -m 'amend for phase' -q
+  $ hg phase '.^::.'
+  11: draft
+  13: secret
+
+Test amend with obsolete
+---------------------------
+
+Enable obsolete
+
+  $ cat > ${TESTTMP}/obs.py << EOF
+  > import mercurial.obsolete
+  > mercurial.obsolete._enabled = True
+  > EOF
+  $ echo '[extensions]' >> $HGRCPATH
+  $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
+
+
+Amend with no files changes
+
+  $ hg id -n
+  13
+  $ hg ci --amend -m 'babar'
+  $ hg id -n
+  14
+  $ hg log -Gl 3 --style=compact
+  @  14[tip]:11   43df5a5434ad   1970-01-01 00:00 +0000   test
+  |    babar
+  |
+  | o  12:0   2647734878ef   1970-01-01 00:00 +0000   test
+  | |    fork
+  | |
+  o |  11   7e09f708a0e9   1970-01-01 00:00 +0000   test
+  | |    a''
+  | |
+  $ hg log -Gl 4 --hidden --style=compact
+  @  14[tip]:11   43df5a5434ad   1970-01-01 00:00 +0000   test
+  |    babar
+  |
+  | x  13:11   175fafee6f44   1970-01-01 00:00 +0000   test
+  |/     amend for phase
+  |
+  | o  12:0   2647734878ef   1970-01-01 00:00 +0000   test
+  | |    fork
+  | |
+  o |  11   7e09f708a0e9   1970-01-01 00:00 +0000   test
+  | |    a''
+  | |
+
+Amend with files changes
+
+(note: the extra commit over 15 is a temporary junk I would be happy to get
+ride of)
+
+  $ echo 'babar' >> a
+  $ hg commit --amend
+  $ hg log -Gl 6 --hidden --style=compact
+  @  16[tip]:11   31e0a4a1b04a   1970-01-01 00:00 +0000   test
+  |    babar
+  |
+  | x  15   053c696ada75   1970-01-01 00:00 +0000   test
+  | |    temporary amend commit for 43df5a5434ad
+  | |
+  | x  14:11   43df5a5434ad   1970-01-01 00:00 +0000   test
+  |/     babar
+  |
+  | x  13:11   175fafee6f44   1970-01-01 00:00 +0000   test
+  |/     amend for phase
+  |
+  | o  12:0   2647734878ef   1970-01-01 00:00 +0000   test
+  | |    fork
+  | |
+  o |  11   7e09f708a0e9   1970-01-01 00:00 +0000   test
+  | |    a''
+  | |
+
+
--- a/tests/test-convert-darcs.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-convert-darcs.t	Tue Sep 11 08:36:09 2012 -0700
@@ -5,25 +5,6 @@
   $ echo 'graphlog =' >> $HGRCPATH
   $ DARCS_EMAIL='test@example.org'; export DARCS_EMAIL
 
-skip if we can't import elementtree
-
-  $ mkdir dummy
-  $ mkdir dummy/_darcs
-  $ if hg convert dummy 2>&1 | grep ElementTree > /dev/null; then
-  >     echo 'skipped: missing feature: elementtree module'
-  >     exit 80
-  > fi
-
-#if no-outer-repo
-
-try converting darcs1 repository
-
-  $ hg clone -q "$TESTDIR/bundles/darcs1.hg" darcs
-  $ hg convert -s darcs darcs/darcs1 2>&1 | grep darcs-1.0
-  darcs-1.0 repository format is unsupported, please upgrade
-
-#endif
-
 initialize darcs repo
 
   $ mkdir darcs-repo
@@ -44,6 +25,13 @@
   Finished recording patch 'p1.1'
   $ cd ..
 
+skip if we can't import elementtree
+
+  $ if hg convert darcs-repo darcs-dummy 2>&1 | grep ElementTree > /dev/null; then
+  >     echo 'skipped: missing feature: elementtree module'
+  >     exit 80
+  > fi
+
 update source
 
   $ cd darcs-repo
@@ -108,3 +96,13 @@
   1e88685f5ddec574a34c70af492f95b6debc8741 644   b
   37406831adc447ec2385014019599dfec953c806 644   dir2/d
   b783a337463792a5c7d548ad85a7d3253c16ba8c 644   ff
+
+#if no-outer-repo
+
+try converting darcs1 repository
+
+  $ hg clone -q "$TESTDIR/bundles/darcs1.hg" darcs
+  $ hg convert -s darcs darcs/darcs1 2>&1 | grep darcs-1.0
+  darcs-1.0 repository format is unsupported, please upgrade
+
+#endif
--- a/tests/test-convert-mtn.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-convert-mtn.t	Tue Sep 11 08:36:09 2012 -0700
@@ -2,9 +2,18 @@
   $ "$TESTDIR/hghave" mtn || exit 80
 
 Monotone directory is called .monotone on *nix and monotone
-on Windows. Having a variable here ease test patching.
+on Windows.
+
+#if windows
+
+  $ mtndir=monotone
+
+#else
 
   $ mtndir=.monotone
+
+#endif
+
   $ echo "[extensions]" >> $HGRCPATH
   $ echo "convert=" >> $HGRCPATH
   $ echo 'graphlog =' >> $HGRCPATH
@@ -210,7 +219,9 @@
 
 test large file support (> 32kB)
 
-  $ python -c 'for x in range(10000): print x' > large-file
+  >>> fp = file('large-file', 'wb')
+  >>> for x in xrange(10000): fp.write('%d\n' % x)
+  >>> fp.close()
   $ $TESTDIR/md5sum.py large-file
   5d6de8a95c3b6bf9e0ffb808ba5299c1  large-file
   $ mtn add large-file
--- a/tests/test-convert-svn-branches.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-convert-svn-branches.t	Tue Sep 11 08:36:09 2012 -0700
@@ -95,9 +95,5 @@
 
 Test hg failing to call itself
 
-  $ HG=foobar hg convert svn-repo B-hg
-  * (glob)
-  initializing destination B-hg repository
+  $ HG=foobar hg convert svn-repo B-hg 2>&1 | grep abort
   abort: Mercurial failed to run itself, check hg executable is in PATH
-  [255]
-
--- a/tests/test-convert.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-convert.t	Tue Sep 11 08:36:09 2012 -0700
@@ -60,8 +60,8 @@
   
       The authormap is a simple text file that maps each source commit author to
       a destination commit author. It is handy for source SCMs that use unix
-      logins to identify authors (eg: CVS). One line per author mapping and the
-      line format is:
+      logins to identify authors (e.g.: CVS). One line per author mapping and
+      the line format is:
   
         source author = destination author
   
--- a/tests/test-export.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-export.t	Tue Sep 11 08:36:09 2012 -0700
@@ -144,4 +144,28 @@
   abort: export requires at least one changeset
   [255]
 
+Check for color output
+  $ echo "[color]" >> $HGRCPATH
+  $ echo "mode = ansi" >> $HGRCPATH
+  $ echo "[extensions]" >> $HGRCPATH
+  $ echo "color=" >> $HGRCPATH
+
+  $ hg export --color always --nodates tip
+  # HG changeset patch
+  # User test
+  # Date 0 0
+  # Node ID * (glob)
+  # Parent * (glob)
+   !"#$%&(,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
+  
+  \x1b[0;1mdiff -r f3acbafac161 -r 197ecd81a57f foo\x1b[0m (esc)
+  \x1b[0;31;1m--- a/foo\x1b[0m (esc)
+  \x1b[0;32;1m+++ b/foo\x1b[0m (esc)
+  \x1b[0;35m@@ -10,3 +10,4 @@\x1b[0m (esc)
+   foo-9
+   foo-10
+   foo-11
+  \x1b[0;32m+line\x1b[0m (esc)
+
+
   $ cd ..
--- a/tests/test-glog.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-glog.t	Tue Sep 11 08:36:09 2012 -0700
@@ -2044,20 +2044,40 @@
 Test --hidden
 
   $ cat > $HGTMP/testhidden.py << EOF
+  > from mercurial import util
   > def reposetup(ui, repo):
   >     for line in repo.opener('hidden'):
   >         ctx = repo[line.strip()]
   >         repo.hiddenrevs.add(ctx.rev())
+  >     if repo.revs('children(%ld) - %ld',  repo.hiddenrevs,  repo.hiddenrevs):
+  >       raise util.Abort('hidden revision with children!')
   > EOF
   $ echo '[extensions]' >> .hg/hgrc
   $ echo "hidden=$HGTMP/testhidden.py" >> .hg/hgrc
-  $ hg id --debug -i -r 0 > .hg/hidden
+  $ hg id --debug -i -r 8 > .hg/hidden
   $ testlog
   []
   []
   $ testlog --hidden
   []
   []
+  $ hg glog --template '{rev} {desc}\n'
+  o  7 Added tag foo-bar for changeset fc281d8ff18d
+  |
+  o    6 merge 5 and 4
+  |\
+  | o  5 add another e
+  | |
+  o |  4 mv dir/b e
+  |/
+  @  3 mv a b; add d
+  |
+  o  2 mv b dir/b
+  |
+  o  1 copy a b
+  |
+  o  0 add a
+  
 
 A template without trailing newline should do something sane
 
@@ -2066,6 +2086,8 @@
   |
   o  1 copy a b
   |
+  o  0 add a
+  
 
 Extra newlines must be preserved
 
@@ -2076,6 +2098,9 @@
   o
   |  1 copy a b
   |
+  o
+     0 add a
+  
 
 The almost-empty template should do something sane too ...
 
@@ -2084,5 +2109,7 @@
   |
   o
   |
+  o
+  
 
   $ cd ..
--- a/tests/test-hgweb-commands.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-hgweb-commands.t	Tue Sep 11 08:36:09 2012 -0700
@@ -980,11 +980,6 @@
   var graph = new Graph();
   graph.scale(39);
   
-  var revlink = '<li style="_STYLE"><span class="desc">';
-  revlink += '<a class="list" href="/rev/_NODEID?style=gitweb" title="_NODEID"><b>_DESC</b></a>';
-  revlink += '</span> _TAGS';
-  revlink += '<span class="info">_DATE, by _USER</span></li>';
-  
   graph.vertex = function(x, y, color, parity, cur) {
   	
   	this.ctx.beginPath();
@@ -995,13 +990,6 @@
   	var bg = '<li class="bg parity' + parity + '"></li>';
   	var left = (this.columns + 1) * this.bg_height;
   	var nstyle = 'padding-left: ' + left + 'px;';
-  	var item = revlink.replace(/_STYLE/, nstyle);
-  	item = item.replace(/_PARITY/, 'parity' + parity);
-  	item = item.replace(/_NODEID/, cur[0]);
-  	item = item.replace(/_NODEID/, cur[0]);
-  	item = item.replace(/_DESC/, cur[3]);
-  	item = item.replace(/_USER/, cur[4]);
-  	item = item.replace(/_DATE/, cur[5]);
   	
   	var tagspan = '';
   	if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) {
@@ -1028,7 +1016,11 @@
   		tagspan += '</span>';
   	}
   	
-  	item = item.replace(/_TAGS/, tagspan);
+  	var item = '<li style="' + nstyle + '"><span class="desc">';
+  	item += '<a class="list" href="/rev/' + cur[0] + '?style=gitweb" title="' + cur[0] + '"><b>' + cur[3] + '</b></a>';
+  	item += '</span> ' + tagspan + '';
+  	item += '<span class="info">' + cur[5] + ', by ' + cur[4] + '</span></li>';
+  
   	return [bg, item];
   	
   }
@@ -1268,7 +1260,7 @@
 
 Stop and restart with HGENCODING=cp932 and preferuncompressed
 
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   $ HGENCODING=cp932 hg serve --config server.preferuncompressed=True -n test \
   >     -p $HGPORT -d --pid-file=hg.pid -E errors.log
   $ cat hg.pid >> $DAEMON_PIDS
@@ -1296,7 +1288,7 @@
 ERRORS ENCOUNTERED
 
   $ cat errors.log
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
 
   $ cd ..
 
--- a/tests/test-hgweb-diffs.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-hgweb-diffs.t	Tue Sep 11 08:36:09 2012 -0700
@@ -291,7 +291,7 @@
 
 set up hgweb with git diffs
 
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   $ hg serve --config 'diff.git=1' -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
   $ cat hg.pid >> $DAEMON_PIDS
 
@@ -936,7 +936,7 @@
 
 raw revision with diff block numbers
 
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   $ cat <<EOF > .hg/hgrc
   > [web]
   > templates = rawdiff
@@ -973,7 +973,7 @@
   @@ -0,0 +1,1 @@
   +b
   
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   $ rm .hg/hgrc rawdiff/map
   $ rmdir rawdiff
   $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
--- a/tests/test-hgweb-empty.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-hgweb-empty.t	Tue Sep 11 08:36:09 2012 -0700
@@ -250,10 +250,6 @@
   var graph = new Graph();
   graph.scale(39);
   
-  var revlink = '<li style="_STYLE"><span class="desc">';
-  revlink += '<a href="/rev/_NODEID" title="_NODEID">_DESC</a>';
-  revlink += '</span>_TAGS<span class="info">_DATE, by _USER</span></li>';
-  
   graph.vertex = function(x, y, color, parity, cur) {
   	
   	this.ctx.beginPath();
@@ -264,13 +260,6 @@
   	var bg = '<li class="bg parity' + parity + '"></li>';
   	var left = (this.columns + 1) * this.bg_height;
   	var nstyle = 'padding-left: ' + left + 'px;';
-  	var item = revlink.replace(/_STYLE/, nstyle);
-  	item = item.replace(/_PARITY/, 'parity' + parity);
-  	item = item.replace(/_NODEID/, cur[0]);
-  	item = item.replace(/_NODEID/, cur[0]);
-  	item = item.replace(/_DESC/, cur[3]);
-  	item = item.replace(/_USER/, cur[4]);
-  	item = item.replace(/_DATE/, cur[5]);
   
   	var tagspan = '';
   	if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) {
@@ -296,8 +285,11 @@
   		}
   		tagspan += '</span>';
   	}
+  
+  	var item = '<li style="' + nstyle + '"><span class="desc">';
+  	item += '<a href="/rev/' + cur[0] + '" title="' + cur[0] + '">' + cur[3] + '</a>';
+  	item += '</span>' + tagspan + '<span class="info">' + cur[5] + ', by ' + cur[4] + '</span></li>';
   	
-  	item = item.replace(/_TAGS/, tagspan);
   	return [bg, item];
   	
   }
--- a/tests/test-hgweb.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-hgweb.t	Tue Sep 11 08:36:09 2012 -0700
@@ -299,7 +299,7 @@
 
 stop and restart
 
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log
   $ cat hg.pid >> $DAEMON_PIDS
 
--- a/tests/test-hgwebdir.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-hgwebdir.t	Tue Sep 11 08:36:09 2012 -0700
@@ -657,7 +657,7 @@
 
 Test collapse = True
 
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   $ cat >> paths.conf <<EOF
   > [web]
   > collapse=true
@@ -723,7 +723,7 @@
 
 Test descend = False
 
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   $ cat >> paths.conf <<EOF
   > descend=false
   > EOF
@@ -784,7 +784,7 @@
   $ hg id http://localhost:$HGPORT1/astar
   8580ff50825a
 
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   $ cat > paths.conf <<EOF
   > [paths]
   > t/a = $root/a
@@ -812,7 +812,7 @@
 
 Test collapse = True
 
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   $ cat >> paths.conf <<EOF
   > [web]
   > collapse=true
@@ -837,7 +837,7 @@
 
 test descend = False
 
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   $ cat >> paths.conf <<EOF
   > descend=false
   > EOF
@@ -857,7 +857,7 @@
   /t/a/
   /t/b/
   
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   $ cat > paths.conf <<EOF
   > [paths]
   > nostore = $root/nostore
@@ -956,7 +956,7 @@
 
   $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/rss-log' | grep '<guid'
       <guid isPermaLink="true">http://hg.example.com:8080/a/rev/8580ff50825a</guid>
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   $ hg serve --config web.baseurl=http://hg.example.com:8080/foo/ -p $HGPORT2 -d \
   >     --pid-file=hg.pid --webdir-conf collections.conf \
   >     -A access-collections-2.log -E error-collections-2.log
--- a/tests/test-highlight.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-highlight.t	Tue Sep 11 08:36:09 2012 -0700
@@ -545,7 +545,7 @@
 errors encountered
 
   $ cat errors.log
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
 
 Change the pygments style
 
@@ -579,7 +579,7 @@
   $ hg ci -Ama
   adding eucjp.txt
   $ hgserveget () {
-  >     "$TESTDIR/killdaemons.py"
+  >     "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   >     echo % HGENCODING="$1" hg serve
   >     HGENCODING="$1" hg serve -p $HGPORT -d -n test --pid-file=hg.pid -E errors.log
   >     cat hg.pid >> $DAEMON_PIDS
--- a/tests/test-http-branchmap.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-http-branchmap.t	Tue Sep 11 08:36:09 2012 -0700
@@ -1,7 +1,10 @@
-  $ "$TESTDIR/hghave" serve || exit 80
+  $ "$TESTDIR/hghave" killdaemons || exit 80
 
   $ hgserve() {
-  >     hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid -E errors.log -v $@
+  >     hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid \
+  >       -E errors.log -v $@ > startup.log
+  >     # Grepping hg serve stdout would hang on Windows
+  >     grep -v 'listening at' startup.log
   >     cat hg.pid >> "$DAEMON_PIDS"
   > }
   $ hg init a
@@ -12,7 +15,6 @@
   $ hg -R a ci -Am foo
   adding foo
   $ hgserve -R a --config web.push_ssl=False --config web.allow_push=* --encoding latin1
-  listening at http://*:$HGPORT1/ (bound to 127.0.0.1:$HGPORT1) (glob)
   $ hg --encoding utf-8 clone http://localhost:$HGPORT1 b
   requesting all changes
   adding changesets
@@ -52,7 +54,7 @@
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     foo
   
-  $ kill `cat hg.pid`
+  $ "$TESTDIR/killdaemons.py" hg.pid
 
 verify 7e7d56fe4833 (encoding fallback in branchmap to maintain compatibility with 1.3.x)
 
--- a/tests/test-hybridencode.py	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-hybridencode.py	Tue Sep 11 08:36:09 2012 -0700
@@ -6,10 +6,51 @@
 enc = hybridencode # used for 'dotencode' repo format
 
 def show(s):
-    print "A = '%s'" % s
-    print "B = '%s'" % enc(s)
+    print "A = '%s'" % s.encode("string_escape")
+    print "B = '%s'" % enc(s).encode("string_escape")
     print
 
+show("data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&'()+,-.;=[]^`{}")
+
+print "uppercase char X is encoded as _x"
+show("data/ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+
+print "underbar is doubled"
+show("data/_")
+
+print "tilde is character-encoded"
+show("data/~")
+
+print "characters in ASCII code range 1..31"
+show('data/\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
+          '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f')
+
+print "characters in ASCII code range 126..255"
+show('data/\x7e\x7f'
+          '\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')
+show('data/\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')
+show('data/\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')
+show('data/\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')
+
+print "Windows reserved characters"
+show('data/less <, greater >, colon :, double-quote ", backslash \\'
+           ', pipe |, question-mark ?, asterisk *')
+
+print "encoding directories ending in .hg, .i or .d with '.hg' suffix"
+show('data/x.hg/x.i/x.d/foo')
+
+print "but these are not encoded on *filenames*"
+show('data/foo/x.hg')
+show('data/foo/x.i')
+show('data/foo/x.d')
+
+print "plain .hg, .i and .d directories have the leading dot encoded"
+show('data/.hg/.i/.d/foo')
+
 show('data/aux.bla/bla.aux/prn/PRN/lpt/com3/nul/coma/foo.NUL/normal.c.i')
 
 show('data/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH/'
@@ -25,3 +66,362 @@
      'Followedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt')
 show('data/foo.../foo   / /a./_. /__/.x../    bla/.FOO/something.i')
 
+show('data/c/co/com/com0/com1/com2/com3/com4/com5/com6/com7/com8/com9')
+show('data/C/CO/COM/COM0/COM1/COM2/COM3/COM4/COM5/COM6/COM7/COM8/COM9')
+show('data/c.x/co.x/com.x/com0.x/com1.x/com2.x/com3.x/com4.x/com5.x'
+                                        '/com6.x/com7.x/com8.x/com9.x')
+show('data/x.c/x.co/x.com0/x.com1/x.com2/x.com3/x.com4/x.com5'
+                                        '/x.com6/x.com7/x.com8/x.com9')
+show('data/cx/cox/comx/com0x/com1x/com2x/com3x/com4x/com5x'
+                                            '/com6x/com7x/com8x/com9x')
+show('data/xc/xco/xcom0/xcom1/xcom2/xcom3/xcom4/xcom5'
+                                            '/xcom6/xcom7/xcom8/xcom9')
+
+show('data/l/lp/lpt/lpt0/lpt1/lpt2/lpt3/lpt4/lpt5/lpt6/lpt7/lpt8/lpt9')
+show('data/L/LP/LPT/LPT0/LPT1/LPT2/LPT3/LPT4/LPT5/LPT6/LPT7/LPT8/LPT9')
+show('data/l.x/lp.x/lpt.x/lpt0.x/lpt1.x/lpt2.x/lpt3.x/lpt4.x/lpt5.x'
+                                        '/lpt6.x/lpt7.x/lpt8.x/lpt9.x')
+show('data/x.l/x.lp/x.lpt/x.lpt0/x.lpt1/x.lpt2/x.lpt3/x.lpt4/x.lpt5'
+                                        '/x.lpt6/x.lpt7/x.lpt8/x.lpt9')
+show('data/lx/lpx/lptx/lpt0x/lpt1x/lpt2x/lpt3x/lpt4x/lpt5x'
+                                            '/lpt6x/lpt7x/lpt8x/lpt9x')
+show('data/xl/xlp/xlpt/xlpt0/xlpt1/xlpt2/xlpt3/xlpt4/xlpt5'
+                                            '/xlpt6/xlpt7/xlpt8/xlpt9')
+
+show('data/con/p/pr/prn/a/au/aux/n/nu/nul')
+show('data/CON/P/PR/PRN/A/AU/AUX/N/NU/NUL')
+show('data/con.x/p.x/pr.x/prn.x/a.x/au.x/aux.x/n.x/nu.x/nul.x')
+show('data/x.con/x.p/x.pr/x.prn/x.a/x.au/x.aux/x.n/x.nu/x.nul')
+show('data/conx/px/prx/prnx/ax/aux/auxx/nx/nux/nulx')
+show('data/xcon/xp/xpr/xprn/xa/xau/xaux/xn/xnu/xnul')
+
+print "largest unhashed path"
+show('data/123456789-123456789-123456789-123456789-123456789-'
+          'unhashed--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "shortest hashed path"
+show('data/123456789-123456789-123456789-123456789-123456789-'
+          'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "changing one char in part that's hashed away produces a different hash"
+show('data/123456789-123456789-123456789-123456789-123456789-'
+          'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxy-'
+          '123456789-123456')
+
+print "uppercase hitting length limit due to encoding"
+show('data/A23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/Z23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "compare with lowercase not hitting limit"
+show('data/a23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/z23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "not hitting limit with any of these"
+show("data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&'()+,-.;="
+          "[]^`{}xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-"
+          "123456789-12345")
+
+print "underbar hitting length limit due to encoding"
+show('data/_23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "tilde hitting length limit due to encoding"
+show('data/~23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "Windows reserved characters hitting length limit"
+show('data/<23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/>23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/:23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/"23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/\\23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/|23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/?23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/*23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "initial space hitting length limit"
+show('data/ 23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "initial dot hitting length limit"
+show('data/.23456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "trailing space in filename hitting length limit"
+show('data/123456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-1234 ')
+
+print "trailing dot in filename hitting length limit"
+show('data/123456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-1234.')
+
+print "initial space in directory hitting length limit"
+show('data/ x/456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "initial dot in directory hitting length limit"
+show('data/.x/456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "trailing space in directory hitting length limit"
+show('data/x /456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "trailing dot in directory hitting length limit"
+show('data/x./456789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "with directories that need direncoding, hitting length limit"
+show('data/x.i/56789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/x.d/56789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/x.hg/5789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "Windows reserved filenames, hitting length limit"
+show('data/con/56789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/prn/56789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/aux/56789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/nul/56789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/com1/6789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/com9/6789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/lpt1/6789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+show('data/lpt9/6789-123456789-123456789-123456789-123456789-'
+          'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "non-reserved names, just not hitting limit"
+show('data/123456789-123456789-123456789-123456789-123456789-'
+          '/com/com0/lpt/lpt0/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12345')
+
+print "hashed path with largest untruncated 1st dir"
+show('data/12345678/-123456789-123456789-123456789-123456789-'
+          'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with smallest truncated 1st dir"
+show('data/123456789/123456789-123456789-123456789-123456789-'
+          'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with largest untruncated two dirs"
+show('data/12345678/12345678/9-123456789-123456789-123456789-'
+          'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with smallest truncated two dirs"
+show('data/123456789/123456789/123456789-123456789-123456789-'
+          'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with largest untruncated three dirs"
+show('data/12345678/12345678/12345678/89-123456789-123456789-'
+          'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with smallest truncated three dirs"
+show('data/123456789/123456789/123456789/123456789-123456789-'
+          'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with largest untruncated four dirs"
+show('data/12345678/12345678/12345678/12345678/789-123456789-'
+          'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with smallest truncated four dirs"
+show('data/123456789/123456789/123456789/123456789/123456789-'
+          'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with largest untruncated five dirs"
+show('data/12345678/12345678/12345678/12345678/12345678/6789-'
+          'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with smallest truncated five dirs"
+show('data/123456789/123456789/123456789/123456789/123456789/'
+          'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with largest untruncated six dirs"
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/ed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with smallest truncated six dirs"
+show('data/123456789/123456789/123456789/123456789/123456789/'
+          '123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with largest untruncated seven dirs"
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/xxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with smallest truncated seven dirs"
+show('data/123456789/123456789/123456789/123456789/123456789/'
+          '123456789/123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with largest untruncated eight dirs"
+print "(directory 8 is dropped because it hits _maxshortdirslen)"
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345678/xxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with smallest truncated eight dirs"
+print "(directory 8 is dropped because it hits _maxshortdirslen)"
+show('data/123456789/123456789/123456789/123456789/123456789/'
+          '123456789/123456789/123456789/xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with largest non-dropped directory 8"
+print "(just not hitting the _maxshortdirslen boundary)"
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "...adding one truncated char to dir 1..7 won't drop dir 8"
+show('data/12345678x/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+show('data/12345678/12345678x/12345678/12345678/12345678/12345'
+          '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+show('data/12345678/12345678/12345678x/12345678/12345678/12345'
+          '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+show('data/12345678/12345678/12345678/12345678x/12345678/12345'
+          '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+show('data/12345678/12345678/12345678/12345678/12345678x/12345'
+          '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678x/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678x/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path with shortest dropped directory 8"
+print "(just hitting the _maxshortdirslen boundary)"
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/123456/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "hashed path that drops dir 8 due to dot or space at end is"
+print "encoded, and thus causing to hit _maxshortdirslen"
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/1234./-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/1234 /-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "... with dir 8 short enough for encoding"
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12./xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12 /xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-123456')
+
+print "extensions are replicated on hashed paths (unbounded!)"
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12.345')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12.3456')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12.34567')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12.345678')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12.3456789')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12.3456789-')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12.3456789-1')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12.3456789-12')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12.3456789-123')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12.3456789-1234')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12.3456789-12345')
+show('data/12345678/12345678/12345678/12345678/12345678/12345'
+          '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
+          '123456789-12.3456789-12345-ABCDEFGHIJKLMNOPRSTUVWX'
+          'YZ-abcdefghjiklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPRSTU'
+          'VWXYZ-1234567890-xxxxxxxxx-xxxxxxxxx-xxxxxxxx-xxxx'
+          'xxxxx-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwww'
+          'wwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww')
+
--- a/tests/test-hybridencode.py.out	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-hybridencode.py.out	Tue Sep 11 08:36:09 2012 -0700
@@ -1,3 +1,57 @@
+A = 'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}'
+B = 'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}'
+
+uppercase char X is encoded as _x
+A = 'data/ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+B = 'data/_a_b_c_d_e_f_g_h_i_j_k_l_m_n_o_p_q_r_s_t_u_v_w_x_y_z'
+
+underbar is doubled
+A = 'data/_'
+B = 'data/__'
+
+tilde is character-encoded
+A = 'data/~'
+B = 'data/~7e'
+
+characters in ASCII code range 1..31
+A = 'data/\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'
+B = 'data/~01~02~03~04~05~06~07~08~09~0a~0b~0c~0d~0e~0f~10~11~12~13~14~15~16~17~18~19~1a~1b~1c~1d~1e~1f'
+
+characters in ASCII code range 126..255
+A = 'data/~\x7f\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'
+B = 'data/~7e~7f~80~81~82~83~84~85~86~87~88~89~8a~8b~8c~8d~8e~8f~90~91~92~93~94~95~96~97~98~99~9a~9b~9c~9d~9e~9f'
+
+A = 'data/\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'
+B = 'data/~a0~a1~a2~a3~a4~a5~a6~a7~a8~a9~aa~ab~ac~ad~ae~af~b0~b1~b2~b3~b4~b5~b6~b7~b8~b9~ba~bb~bc~bd~be~bf'
+
+A = 'data/\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'
+B = 'data/~c0~c1~c2~c3~c4~c5~c6~c7~c8~c9~ca~cb~cc~cd~ce~cf~d0~d1~d2~d3~d4~d5~d6~d7~d8~d9~da~db~dc~dd~de~df'
+
+A = 'data/\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'
+B = 'data/~e0~e1~e2~e3~e4~e5~e6~e7~e8~e9~ea~eb~ec~ed~ee~ef~f0~f1~f2~f3~f4~f5~f6~f7~f8~f9~fa~fb~fc~fd~fe~ff'
+
+Windows reserved characters
+A = 'data/less <, greater >, colon :, double-quote ", backslash \\, pipe |, question-mark ?, asterisk *'
+B = 'data/less ~3c, greater ~3e, colon ~3a, double-quote ~22, backslash ~5c, pipe ~7c, question-mark ~3f, asterisk ~2a'
+
+encoding directories ending in .hg, .i or .d with '.hg' suffix
+A = 'data/x.hg/x.i/x.d/foo'
+B = 'data/x.hg.hg/x.i.hg/x.d.hg/foo'
+
+but these are not encoded on *filenames*
+A = 'data/foo/x.hg'
+B = 'data/foo/x.hg'
+
+A = 'data/foo/x.i'
+B = 'data/foo/x.i'
+
+A = 'data/foo/x.d'
+B = 'data/foo/x.d'
+
+plain .hg, .i and .d directories have the leading dot encoded
+A = 'data/.hg/.i/.d/foo'
+B = 'data/~2ehg.hg/~2ei.hg/~2ed.hg/foo'
+
 A = 'data/aux.bla/bla.aux/prn/PRN/lpt/com3/nul/coma/foo.NUL/normal.c.i'
 B = 'data/au~78.bla/bla.aux/pr~6e/_p_r_n/lpt/co~6d3/nu~6c/coma/foo._n_u_l/normal.c.i'
 
@@ -19,3 +73,341 @@
 A = 'data/foo.../foo   / /a./_. /__/.x../    bla/.FOO/something.i'
 B = 'data/foo..~2e/foo  ~20/~20/a~2e/__.~20/____/~2ex.~2e/~20   bla/~2e_f_o_o/something.i'
 
+A = 'data/c/co/com/com0/com1/com2/com3/com4/com5/com6/com7/com8/com9'
+B = 'data/c/co/com/com0/co~6d1/co~6d2/co~6d3/co~6d4/co~6d5/co~6d6/co~6d7/co~6d8/co~6d9'
+
+A = 'data/C/CO/COM/COM0/COM1/COM2/COM3/COM4/COM5/COM6/COM7/COM8/COM9'
+B = 'data/_c/_c_o/_c_o_m/_c_o_m0/_c_o_m1/_c_o_m2/_c_o_m3/_c_o_m4/_c_o_m5/_c_o_m6/_c_o_m7/_c_o_m8/_c_o_m9'
+
+A = 'data/c.x/co.x/com.x/com0.x/com1.x/com2.x/com3.x/com4.x/com5.x/com6.x/com7.x/com8.x/com9.x'
+B = 'data/c.x/co.x/com.x/com0.x/co~6d1.x/co~6d2.x/co~6d3.x/co~6d4.x/co~6d5.x/co~6d6.x/co~6d7.x/co~6d8.x/co~6d9.x'
+
+A = 'data/x.c/x.co/x.com0/x.com1/x.com2/x.com3/x.com4/x.com5/x.com6/x.com7/x.com8/x.com9'
+B = 'data/x.c/x.co/x.com0/x.com1/x.com2/x.com3/x.com4/x.com5/x.com6/x.com7/x.com8/x.com9'
+
+A = 'data/cx/cox/comx/com0x/com1x/com2x/com3x/com4x/com5x/com6x/com7x/com8x/com9x'
+B = 'data/cx/cox/comx/com0x/com1x/com2x/com3x/com4x/com5x/com6x/com7x/com8x/com9x'
+
+A = 'data/xc/xco/xcom0/xcom1/xcom2/xcom3/xcom4/xcom5/xcom6/xcom7/xcom8/xcom9'
+B = 'data/xc/xco/xcom0/xcom1/xcom2/xcom3/xcom4/xcom5/xcom6/xcom7/xcom8/xcom9'
+
+A = 'data/l/lp/lpt/lpt0/lpt1/lpt2/lpt3/lpt4/lpt5/lpt6/lpt7/lpt8/lpt9'
+B = 'data/l/lp/lpt/lpt0/lp~741/lp~742/lp~743/lp~744/lp~745/lp~746/lp~747/lp~748/lp~749'
+
+A = 'data/L/LP/LPT/LPT0/LPT1/LPT2/LPT3/LPT4/LPT5/LPT6/LPT7/LPT8/LPT9'
+B = 'data/_l/_l_p/_l_p_t/_l_p_t0/_l_p_t1/_l_p_t2/_l_p_t3/_l_p_t4/_l_p_t5/_l_p_t6/_l_p_t7/_l_p_t8/_l_p_t9'
+
+A = 'data/l.x/lp.x/lpt.x/lpt0.x/lpt1.x/lpt2.x/lpt3.x/lpt4.x/lpt5.x/lpt6.x/lpt7.x/lpt8.x/lpt9.x'
+B = 'data/l.x/lp.x/lpt.x/lpt0.x/lp~741.x/lp~742.x/lp~743.x/lp~744.x/lp~745.x/lp~746.x/lp~747.x/lp~748.x/lp~749.x'
+
+A = 'data/x.l/x.lp/x.lpt/x.lpt0/x.lpt1/x.lpt2/x.lpt3/x.lpt4/x.lpt5/x.lpt6/x.lpt7/x.lpt8/x.lpt9'
+B = 'data/x.l/x.lp/x.lpt/x.lpt0/x.lpt1/x.lpt2/x.lpt3/x.lpt4/x.lpt5/x.lpt6/x.lpt7/x.lpt8/x.lpt9'
+
+A = 'data/lx/lpx/lptx/lpt0x/lpt1x/lpt2x/lpt3x/lpt4x/lpt5x/lpt6x/lpt7x/lpt8x/lpt9x'
+B = 'data/lx/lpx/lptx/lpt0x/lpt1x/lpt2x/lpt3x/lpt4x/lpt5x/lpt6x/lpt7x/lpt8x/lpt9x'
+
+A = 'data/xl/xlp/xlpt/xlpt0/xlpt1/xlpt2/xlpt3/xlpt4/xlpt5/xlpt6/xlpt7/xlpt8/xlpt9'
+B = 'data/xl/xlp/xlpt/xlpt0/xlpt1/xlpt2/xlpt3/xlpt4/xlpt5/xlpt6/xlpt7/xlpt8/xlpt9'
+
+A = 'data/con/p/pr/prn/a/au/aux/n/nu/nul'
+B = 'data/co~6e/p/pr/pr~6e/a/au/au~78/n/nu/nu~6c'
+
+A = 'data/CON/P/PR/PRN/A/AU/AUX/N/NU/NUL'
+B = 'data/_c_o_n/_p/_p_r/_p_r_n/_a/_a_u/_a_u_x/_n/_n_u/_n_u_l'
+
+A = 'data/con.x/p.x/pr.x/prn.x/a.x/au.x/aux.x/n.x/nu.x/nul.x'
+B = 'data/co~6e.x/p.x/pr.x/pr~6e.x/a.x/au.x/au~78.x/n.x/nu.x/nu~6c.x'
+
+A = 'data/x.con/x.p/x.pr/x.prn/x.a/x.au/x.aux/x.n/x.nu/x.nul'
+B = 'data/x.con/x.p/x.pr/x.prn/x.a/x.au/x.aux/x.n/x.nu/x.nul'
+
+A = 'data/conx/px/prx/prnx/ax/aux/auxx/nx/nux/nulx'
+B = 'data/conx/px/prx/prnx/ax/au~78/auxx/nx/nux/nulx'
+
+A = 'data/xcon/xp/xpr/xprn/xa/xau/xaux/xn/xnu/xnul'
+B = 'data/xcon/xp/xpr/xprn/xa/xau/xaux/xn/xnu/xnul'
+
+largest unhashed path
+A = 'data/123456789-123456789-123456789-123456789-123456789-unhashed--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'data/123456789-123456789-123456789-123456789-123456789-unhashed--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+
+shortest hashed path
+A = 'data/123456789-123456789-123456789-123456789-123456789-hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/123456789-123456789-123456789-123456789-123456789-hashed----xxxxxxxxx-xxxxxxxe9c55002b50bf5181e7a6fc1f60b126e2a6fcf71'
+
+changing one char in part that's hashed away produces a different hash
+A = 'data/123456789-123456789-123456789-123456789-123456789-hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxy-123456789-123456'
+B = 'dh/123456789-123456789-123456789-123456789-123456789-hashed----xxxxxxxxx-xxxxxxxd24fa4455faf8a94350c18e5eace7c2bb17af706'
+
+uppercase hitting length limit due to encoding
+A = 'data/A23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/a23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxcbbc657029b41b94ed510d05feb6716a5c03bc6b'
+
+A = 'data/Z23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/z23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxx938f32a725c89512833fb96b6602dd9ebff51ddd'
+
+compare with lowercase not hitting limit
+A = 'data/a23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'data/a23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+
+A = 'data/z23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'data/z23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+
+not hitting limit with any of these
+A = 'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+
+underbar hitting length limit due to encoding
+A = 'data/_23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/_23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxx9921a01af50feeabc060ce00eee4cba6efc31d2b'
+
+tilde hitting length limit due to encoding
+A = 'data/~23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~7e23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx9cec6f97d569c10995f785720044ea2e4227481b'
+
+Windows reserved characters hitting length limit
+A = 'data/<23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~3c23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxee67d8f275876ca1ef2500fc542e63c885c4e62d'
+
+A = 'data/>23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~3e23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx387a85a5b1547cc9136310c974df716818458ddb'
+
+A = 'data/:23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~3a23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx2e4154fb571d13d22399c58cc4ef4858e4b75999'
+
+A = 'data/"23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~2223456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxfc7e3ec7b0687ee06ed8c32fef0eb0c1980259f5'
+
+A = 'data/\\23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~5c23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx944e1f2b7110687e116e0d151328ac648b06ab4a'
+
+A = 'data/|23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~7c23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx28b23dd3fd0242946334126ab62bcd772aac32f4'
+
+A = 'data/?23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~3f23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxa263022d3994d2143d98f94f431eef8b5e7e0f8a'
+
+A = 'data/*23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~2a23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx0e7e6020e3c00ba7bb7893d84ca2966fbf53e140'
+
+initial space hitting length limit
+A = 'data/ 23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~2023456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx92acbc78ef8c0b796111629a02601f07d8aec4ea'
+
+initial dot hitting length limit
+A = 'data/.23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~2e23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxdbe19cc6505b3515ab9228cebf877ad07075168f'
+
+trailing space in filename hitting length limit
+A = 'data/123456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-1234 '
+B = 'dh/123456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxx0025dc73e04f97426db4893e3bf67d581dc6d066'
+
+trailing dot in filename hitting length limit
+A = 'data/123456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-1234.'
+B = 'dh/123456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxx85a16cf03ee7feba8a5abc626f1ba9886d01e89d'
+
+initial space in directory hitting length limit
+A = 'data/ x/456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~20x/456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx1b3a3b712b2ac00d6af14ae8b4c14fdbf904f516'
+
+initial dot in directory hitting length limit
+A = 'data/.x/456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/~2ex/456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx39dbc4c193a5643a8936fc69c3363cd7ac91ab14'
+
+trailing space in directory hitting length limit
+A = 'data/x /456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/x~20/456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx2253c341df0b5290790ad312cd8499850f2273e5'
+
+trailing dot in directory hitting length limit
+A = 'data/x./456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/x~2e/456789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxcc0324d696d34562b44b5138db08ee1594ccc583'
+
+with directories that need direncoding, hitting length limit
+A = 'data/x.i/56789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/x.i.hg/56789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxa4c4399bdf81c67dbbbb7060aa0124d8dea94f74'
+
+A = 'data/x.d/56789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/x.d.hg/56789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxx1303fa90473b230615f5b3ea7b660e881ae5270a'
+
+A = 'data/x.hg/5789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/x.hg.hg/5789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxx26d724a8af68e7a4e4455e6602ea9adbd0eb801f'
+
+Windows reserved filenames, hitting length limit
+A = 'data/con/56789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/co~6e/56789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxc0794d4f4c605a2617900eb2563d7113cf6ea7d3'
+
+A = 'data/prn/56789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/pr~6e/56789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx64db876e1a9730e27236cb9b167aff942240e932'
+
+A = 'data/aux/56789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/au~78/56789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx8a178558405ca6fb4bbd75446dfa186f06751a0d'
+
+A = 'data/nul/56789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/nu~6c/56789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxc5e51b6fec1bd07bd243b053a0c3f7209855b886'
+
+A = 'data/com1/6789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/co~6d1/6789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx32f5f44ece3bb62b9327369ca84cc19c86259fcd'
+
+A = 'data/com9/6789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/co~6d9/6789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxx734360b28c66a3230f55849fe8926206d229f990'
+
+A = 'data/lpt1/6789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/lp~741/6789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxe6f16ab4b6b0637676b2842b3345c9836df46ef7'
+
+A = 'data/lpt9/6789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'dh/lp~749/6789-123456789-123456789-123456789-123456789-xxxxxxxxx-xxxxxxxxx-xxxxxa475814c51acead3e44f2ff801f0c4903f986157'
+
+non-reserved names, just not hitting limit
+A = 'data/123456789-123456789-123456789-123456789-123456789-/com/com0/lpt/lpt0/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+B = 'data/123456789-123456789-123456789-123456789-123456789-/com/com0/lpt/lpt0/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
+
+hashed path with largest untruncated 1st dir
+A = 'data/12345678/-123456789-123456789-123456789-123456789-hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/-123456789-123456789-123456789-123456789-hashed----xxxxxxxxx-xxxxxxx4e9e9e384d00929a93b6835fbf976eb32321ff3c'
+
+hashed path with smallest truncated 1st dir
+A = 'data/123456789/123456789-123456789-123456789-123456789-hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/123456789-123456789-123456789-123456789-hashed----xxxxxxxxx-xxxxxxxx1f4e4ec5f2be76e109bfaa8e31c062fe426d5490'
+
+hashed path with largest untruncated two dirs
+A = 'data/12345678/12345678/9-123456789-123456789-123456789-hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/9-123456789-123456789-123456789-hashed----xxxxxxxxx-xxxxxxx3332d8329d969cf835542a9f2cbcfb385b6cf39d'
+
+hashed path with smallest truncated two dirs
+A = 'data/123456789/123456789/123456789-123456789-123456789-hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/123456789-123456789-123456789-hashed----xxxxxxxxx-xxxxxxxxx9699559798247dffa18717138859be5f8874840e'
+
+hashed path with largest untruncated three dirs
+A = 'data/12345678/12345678/12345678/89-123456789-123456789-hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/89-123456789-123456789-hashed----xxxxxxxxx-xxxxxxxf0a2b053bb1369cce02f78c217d6a7aaea18c439'
+
+hashed path with smallest truncated three dirs
+A = 'data/123456789/123456789/123456789/123456789-123456789-hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/123456789-123456789-hashed----xxxxxxxxx-xxxxxxxxx-1c6f8284967384ec13985a046d3553179d9d03cd'
+
+hashed path with largest untruncated four dirs
+A = 'data/12345678/12345678/12345678/12345678/789-123456789-hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/789-123456789-hashed----xxxxxxxxx-xxxxxxx0d30c99049d8f0ff97b94d4ef302027e8d54c6fd'
+
+hashed path with smallest truncated four dirs
+A = 'data/123456789/123456789/123456789/123456789/123456789-hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/123456789-hashed----xxxxxxxxx-xxxxxxxxx-x46162779e1a771810b37a737f82ae7ed33771402'
+
+hashed path with largest untruncated five dirs
+A = 'data/12345678/12345678/12345678/12345678/12345678/6789-hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/6789-hashed----xxxxxxxxx-xxxxxxxbfe752ddc8b003c2790c66a9f2eb1ea75c114390'
+
+hashed path with smallest truncated five dirs
+A = 'data/123456789/123456789/123456789/123456789/123456789/hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/hashed----xxxxxxxxx-xxxxxxxxx-xxb94c27b3532fa880cdd572b1c514785cab7b6ff2'
+
+hashed path with largest untruncated six dirs
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/ed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/ed----xxxxxxxxx-xxxxxxxcd8cc5483a0f3be409e0e5d4bf9e36e113c59235'
+
+hashed path with smallest truncated six dirs
+A = 'data/123456789/123456789/123456789/123456789/123456789/123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/xxxxxxxxx-xxxxxxxxx-xxx47dd6f616f833a142da00701b334cebbf640da06'
+
+hashed path with largest untruncated seven dirs
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/xxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/xxxxxx-xxxxxxx1c8ed635229fc22efe51035feeadeb4c8a0ecb82'
+
+hashed path with smallest truncated seven dirs
+A = 'data/123456789/123456789/123456789/123456789/123456789/123456789/123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/xxxxxxxxx-xxxx298ff7d33f8ce6db57930837ffea2fb2f48bb926'
+
+hashed path with largest untruncated eight dirs
+(directory 8 is dropped because it hits _maxshortdirslen)
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345678/xxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/xxxxxxx-xxxxxxc8996ccd41b471f768057181a4d59d2febe7277d'
+
+hashed path with smallest truncated eight dirs
+(directory 8 is dropped because it hits _maxshortdirslen)
+A = 'data/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/xxxxxxxxx-xxxx4fa04a839a6bda93e1c21c713f2edcbd16e8890d'
+
+hashed path with largest non-dropped directory 8
+(just not hitting the _maxshortdirslen boundary)
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxx4d43d1ccaa20efbfe99ec779dc063611536ff2c5'
+
+...adding one truncated char to dir 1..7 won't drop dir 8
+A = 'data/12345678x/12345678/12345678/12345678/12345678/12345678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/xxxxxxxx0f9efce65189cc60fd90fe4ffd49d7b58bbe0f2e'
+
+A = 'data/12345678/12345678x/12345678/12345678/12345678/12345678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/xxxxxxxx945ca395708cafdd54a94501859beabd3e243921'
+
+A = 'data/12345678/12345678/12345678x/12345678/12345678/12345678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/xxxxxxxxac62bf6898c4fd0502146074547c11caa751a327'
+
+A = 'data/12345678/12345678/12345678/12345678x/12345678/12345678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/xxxxxxxx2ae5a2baed7983fae8974d0ca06c6bf08b9aee92'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678x/12345678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/xxxxxxxx214aba07b6687532a43d1e9eaf6e88cfca96b68c'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678x/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/xxxxxxxxe7a022ae82f0f55cf4e0498e55ba59ea4ebb55bf'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678x/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/xxxxxxxxb51ce61164996a80f36ce3cfe64b62d519aedae3'
+
+hashed path with shortest dropped directory 8
+(just hitting the _maxshortdirslen boundary)
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/123456/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/xxxxxxxxx-xxxx11fa9873cc6c3215eae864528b5530a04efc6cfe'
+
+hashed path that drops dir 8 due to dot or space at end is
+encoded, and thus causing to hit _maxshortdirslen
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/1234./-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/-xxxxxxxxx-xxx602df9b45bec564e2e1f0645d5140dddcc76ed58'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/1234 /-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/-xxxxxxxxx-xxxd99ff212bc84b4d1f70cd6b0071e3ef69d4e12ce'
+
+... with dir 8 short enough for encoding
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12./xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12~2e/xx-xxxxx7baeb5ed7f14a586ee1cacecdbcbff70032d1b3c'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12 /xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12~20/xx-xxxxxcf79ca9795f77d7f75745da36807e5d772bd5182'
+
+extensions are replicated on hashed paths (unbounded!)
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.345'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxx50a65dfc4ab6bf5fb9ba949447ccaf456c1ebf30.345'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3456'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxe5f03f29a0a5876660a28aefc43f978add5a7659.3456'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.34567'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xc2609a92347e5a14c29211c6cd634732d1f0c968.34567'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.345678'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-695e97d34c6cd8186afa3c74a56243bd645d50c3.345678'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3456789'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/b067582449be78bc1266e9195785a5c6165380e6.3456789'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3456789-'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/d3442b4cfe1fdbde1c4c60ad421e946344111961.3456789-'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3456789-1'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/40a78aaf2114e1b82f91ac3ff234bf358d99dbba.3456789-1'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3456789-12'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/1e04221e6fbff8cfbeaf555d11550dc573e3326d.3456789-12'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3456789-123'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/5e3b3973b3c9297b4577a4cf1d58162545a6b454.3456789-123'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3456789-1234'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/6ee6ef477c7ba44ff19c7d97fc4ac7fa4a8e4665.3456789-1234'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3456789-12345'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/f08b927027344ec4a7f1994ecb0effe2b9cc1215.3456789-12345'
+
+A = 'data/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3456789-12345-ABCDEFGHIJKLMNOPRSTUVWXYZ-abcdefghjiklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPRSTUVWXYZ-1234567890-xxxxxxxxx-xxxxxxxxx-xxxxxxxx-xxxxxxxxx-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww'
+B = 'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345678/12345/28de8651e30eeb95f4b97edb7d12b281d3fb3ce0.3456789-12345-abcdefghijklmnoprstuvwxyz-abcdefghjiklmnopqrstuvwxyz-abcdefghijklmnoprstuvwxyz-1234567890-xxxxxxxxx-xxxxxxxxx-xxxxxxxx-xxxxxxxxx-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww'
+
--- a/tests/test-install.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-install.t	Tue Sep 11 08:36:09 2012 -0700
@@ -1,6 +1,7 @@
 hg debuginstall
   $ hg debuginstall
   checking encoding (ascii)...
+  checking Python lib (*lib*)... (glob)
   checking installed modules (*mercurial)... (glob)
   checking templates (*mercurial?templates)... (glob)
   checking commit editor...
@@ -10,6 +11,7 @@
 hg debuginstall with no username
   $ HGUSER= hg debuginstall
   checking encoding (ascii)...
+  checking Python lib (*lib*)... (glob)
   checking installed modules (*mercurial)... (glob)
   checking templates (*mercurial?templates)... (glob)
   checking commit editor...
--- a/tests/test-keyword.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-keyword.t	Tue Sep 11 08:36:09 2012 -0700
@@ -727,7 +727,7 @@
   ignore $Id$
   a
 
-Write custom keyword and prepare multiline commit message
+Write custom keyword and prepare multi-line commit message
 
   $ echo '$Xinfo$' >> a
   $ cat <<EOF >> log
@@ -745,7 +745,7 @@
   ? c
   ? log
 
-Commit with multiline message and custom expansion
+Commit with multi-line message and custom expansion
 
   $ hg --debug commit -l log -d '2 0' -u 'User Name <user@example.com>'
   a
--- a/tests/test-largefiles.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-largefiles.t	Tue Sep 11 08:36:09 2012 -0700
@@ -13,7 +13,7 @@
   > patterns=glob:**.dat
   > usercache=${USERCACHE}
   > [hooks]
-  > precommit=sh -c "echo \"Invoking status precommit hook\"; hg status"
+  > precommit=sh -c "echo \\"Invoking status precommit hook\\"; hg status"
   > EOF
 
 Create the repo with a couple of revisions of both large and normal
@@ -200,7 +200,7 @@
   -rw-r--r-- 9 normal4
   
   
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
 #endif
 
 Test archiving the various revisions.  These hit corner cases known with
@@ -434,7 +434,7 @@
   $ cd ../addrm
   $ cat >> .hg/hgrc <<EOF
   > [hooks]
-  > post-commit.stat=sh -c "echo \"Invoking status postcommit hook\"; hg status -A"
+  > post-commit.stat=sh -c "echo \\"Invoking status postcommit hook\\"; hg status -A"
   > EOF
   $ touch foo
   $ hg add --large foo
@@ -1141,6 +1141,19 @@
   A f1
   $ cd ..
 
+largefiles can be pushed locally (issue3583)
+  $ hg init dest
+  $ cd r4
+  $ hg push ../dest
+  pushing to ../dest
+  searching for changes
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  $ cd ..
+
 #if serve
   $ hg serve -R r4 -d -p $HGPORT2 --pid-file hg.pid
   $ cat hg.pid >> $DAEMON_PIDS
@@ -1153,7 +1166,7 @@
   [255]
 
 used all HGPORTs, kill all daemons
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
 #endif
 
 vanilla clients locked out from largefiles ssh repos
@@ -1239,7 +1252,7 @@
   $ rm -rf empty
 
 used all HGPORTs, kill all daemons
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
 
 #endif
 
--- a/tests/test-mq-subrepo.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-mq-subrepo.t	Tue Sep 11 08:36:09 2012 -0700
@@ -478,7 +478,7 @@
   adding .hgsub
   $ hg -R sub update -C 1
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg commit -Am '#2 in parent (but will be rolled-back soon)'
+  $ hg commit -Am '#2 in parent (but will be rolled back soon)'
   $ hg rollback
   repository tip rolled back to revision 1 (undo commit)
   working directory now based on revision 1
--- a/tests/test-obsolete.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-obsolete.t	Tue Sep 11 08:36:09 2012 -0700
@@ -68,7 +68,10 @@
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ mkcommit new_c
   created new head
+  $ hg log -r 'hidden()' --template '{rev}:{node|short} {desc}\n' --hidden
   $ hg debugobsolete `getid original_c`  `getid new_c` -d '56 12'
+  $ hg log -r 'hidden()' --template '{rev}:{node|short} {desc}\n' --hidden
+  2:245bde4270cd add original_c
   $ hg debugobsolete
   245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
 
--- a/tests/test-pull-http.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-pull-http.t	Tue Sep 11 08:36:09 2012 -0700
@@ -28,7 +28,7 @@
   $ cat test3/.hg/hgrc
   [paths]
   default = http://foo@localhost:$HGPORT/
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
 
 expect error, cloning not allowed
 
@@ -40,7 +40,7 @@
   requesting all changes
   abort: authorization failed
   [255]
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
 
 serve errors
 
--- a/tests/test-push-http.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-push-http.t	Tue Sep 11 08:36:09 2012 -0700
@@ -16,9 +16,11 @@
   >     hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log
   >     cat hg.pid >> $DAEMON_PIDS
   >     hg --cwd ../test2 push http://localhost:$HGPORT/
-  >     "$TESTDIR/killdaemons.py"
+  >     exitstatus=$?
+  >     "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   >     echo % serve errors
   >     cat errors.log
+  >     return $exitstatus
   > }
   $ cd ../test
 
@@ -27,10 +29,9 @@
   $ req
   pushing to http://localhost:$HGPORT/
   searching for changes
-  remote: ssl required
-  remote: ssl required
-  updating cb9a9f314b8b to public failed!
+  abort: HTTP Error 403: ssl required
   % serve errors
+  [255]
 
 expect authorization error
 
@@ -41,6 +42,7 @@
   searching for changes
   abort: authorization failed
   % serve errors
+  [255]
 
 expect authorization error: must have authorized user
 
@@ -50,6 +52,7 @@
   searching for changes
   abort: authorization failed
   % serve errors
+  [255]
 
 expect success
 
@@ -110,6 +113,7 @@
   searching for changes
   abort: authorization failed
   % serve errors
+  [255]
 
 expect authorization error: some users denied, users must be authenticated
 
@@ -119,5 +123,6 @@
   searching for changes
   abort: authorization failed
   % serve errors
+  [255]
 
   $ cd ..
--- a/tests/test-record.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-record.t	Tue Sep 11 08:36:09 2012 -0700
@@ -246,10 +246,19 @@
   +9
   +10
   
+Modify end of plain file with username unset
+
+  $ echo 11 >> plain
+  $ unset HGUSER
+  $ hg record --config ui.username= -d '8 0' -m end plain
+  abort: no username supplied (see "hg help config")
+  [255]
+
 
 Modify end of plain file
 
-  $ echo 11 >> plain
+  $ HGUSER="test"
+  $ export HGUSER
   $ hg record -d '8 0' -m end plain <<EOF
   > y
   > y
--- a/tests/test-status.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-status.t	Tue Sep 11 08:36:09 2012 -0700
@@ -330,4 +330,9 @@
   $ hg status -A --rev 1 1
   R 1/2/3/4/5/b.txt
 
+#if windows
+  $ hg --config ui.slash=false status -A --rev 1 1
+  R 1\2\3\4\5\b.txt
+#endif
+
   $ cd ..
--- a/tests/test-subrepo-relative-path.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-subrepo-relative-path.t	Tue Sep 11 08:36:09 2012 -0700
@@ -70,7 +70,7 @@
    source   ../sub
    revision 863c1745b441bd97a8c4a096e87793073f4fb215
 
-  $ "$TESTDIR/killdaemons.py"
+  $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
 
 subrepo paths with ssh urls
 
--- a/tests/test-treediscovery-legacy.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-treediscovery-legacy.t	Tue Sep 11 08:36:09 2012 -0700
@@ -35,7 +35,7 @@
   >   cat hg.pid >> $DAEMON_PIDS
   > }
   $ tstop() {
-  >   "$TESTDIR/killdaemons.py"
+  >   "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   >   cp $HGRCPATH-withcap $HGRCPATH
   > }
 
--- a/tests/test-treediscovery.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-treediscovery.t	Tue Sep 11 08:36:09 2012 -0700
@@ -23,7 +23,7 @@
   >   cat hg.pid >> $DAEMON_PIDS
   > }
   $ tstop() {
-  >   "$TESTDIR/killdaemons.py"
+  >   "$TESTDIR/killdaemons.py" $DAEMON_PIDS
   > }
 
 Both are empty:
--- a/tests/test-verify.t	Fri Aug 17 13:58:19 2012 -0700
+++ b/tests/test-verify.t	Tue Sep 11 08:36:09 2012 -0700
@@ -61,10 +61,22 @@
   $ cd ../../..
   $ cd ..
 
-test revlog corruption
+test changelog without a manifest
 
   $ hg init b
   $ cd b
+  $ hg branch foo
+  marked working directory as branch foo
+  (branches are permanent and global, did you want a bookmark?)
+  $ hg ci -m branchfoo
+  $ hg verify
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+  0 files, 1 changesets, 0 total revisions
+
+test revlog corruption
 
   $ touch a
   $ hg add a
@@ -79,12 +91,12 @@
   checking manifests
   crosschecking files in changesets and manifests
   checking files
-   a@0: broken revlog! (index data/a.i is corrupted)
+   a@1: broken revlog! (index data/a.i is corrupted)
   warning: orphan revlog 'data/a.i'
-  1 files, 1 changesets, 0 total revisions
+  1 files, 2 changesets, 0 total revisions
   1 warnings encountered!
   1 integrity errors encountered!
-  (first damaged changeset appears to be 0)
+  (first damaged changeset appears to be 1)
   [1]
 
   $ cd ..