changeset 10557:d1bbf01c4a8e

Merge with stable
author Martin Geisler <mg@lazybytes.net>
date Sun, 28 Feb 2010 18:06:47 +0100
parents 989b2a5eaaba (current diff) 9bd0bd785696 (diff)
children 704af22f4907
files
diffstat 24 files changed, 2308 insertions(+), 711 deletions(-) [+]
line wrap: on
line diff
--- a/contrib/vim/patchreview.txt	Wed Feb 24 18:22:45 2010 +0100
+++ b/contrib/vim/patchreview.txt	Sun Feb 28 18:06:47 2010 +0100
@@ -1,97 +1,97 @@
-*patchreview.txt* Vim global plugin for doing single or multipatch code reviews
+*patchreview.txt* Vim global plugin for doing single, multi-patch or diff code reviews
+                  Version  v0.2.2 (for Vim version 7.0 or higher)
 
-            Author: Manpreet Singh (junkblocker-CAT-yahoo-DOG-com)
-                    (Replace -CAT- and -DOG- with @ and . first)
-            Copyright (C) 2006 by Manpreet Singh
+            Author: Manpreet Singh < junkblocker@yahoo.com >
+            Copyright (C) 2006-2010 by Manpreet Singh
             License : This file is placed in the public domain.
 
 =============================================================================
 
-CONTENTS	                               *patchreview* *patchreview-contents*
+CONTENTS	                 *patchreview* *diffreview* *patchreview-contents*
 
   1. Contents.........................................: |patchreview-contents|
   2. Introduction.....................................: |patchreview-intro|
   3. PatchReview options..............................: |patchreview-options|
   4. PatchReview Usage................................: |patchreview-usage|
-     4.1 PatchReview Usage............................: |:PatchReview|
-     4.2 PatchReview Usage............................: |:PatchReviewCleanup|
+     4.1 DiffReview Usage.............................: |:DiffReview|
+     4.2 PatchReview Usage............................: |:PatchReview|
 
 =============================================================================
 
 PatchReview Introduction                                  *patchreview-intro*
 
-The Patch Review plugin allows single or multipatch code review to be done in
-VIM. VIM provides the |:diffpatch| command to do single file reviews but can
-not handle patch files containing multiple patches as is common with software
-development projects. This plugin provides that missing functionality. It also
-tries to improve on |:diffpatch|'s behaviour of creating the patched files in
+The Patch Review plugin allows easy single or multipatch code or diff reviews.
+
+It opens each affected file in the patch or in a workspace diff in a diff view
+in a separate tab.
+
+VIM provides the |:diffpatch| and related commands to do single file reviews
+but can not handle patch files containing multiple patches as is common with
+software development projects. This plugin provides that missing
+functionality.
+
+It also improves on |:diffpatch|'s behaviour of creating the patched files in
 the same directory as original file which can lead to project workspace
 pollution.
 
+It does automatic diff generation for various version control systems by
+running their diff command.
+
 =============================================================================
 
 PatchReview Options                                     *patchreview-options*
 
-  g:patchreview_filterdiff : Optional path to filterdiff binary. PatchReview
-                             tries to locate filterdiff on system path
-                             automatically. If the binary is not on system
-                             path, this option tell PatchReview the full path
-                             to the binary.  This option, if specified,
-                             overrides the default filterdiff binary on the
-                             path.
+  g:patchreview_patch = {string}
+      Optional path to patch binary. PatchReview tries to locate patch on
+      system path automatically. If the binary is not on system path, this
+      option tell PatchReview the full path to the binary.  This option, if
+      specified, overrides the default patch binary on the path.
+
+    examples:
+        (On Windows with Cygwin) >
+           let g:patchreview_patch = 'c:\\cygwin\\bin\\patch.exe'
+<
+        (On *nix systems) >
+           let g:patchreview_patch = '/usr/bin/gpatch'
+<
+
+  g:patchreview_filterdiff = {string}
+      Optional path to filterdiff binary. PatchReview tries to locate
+      filterdiff on system path automatically. If the binary is not on system
+      path, this option tell PatchReview the full path to the binary.  This
+      option, if specified, overrides the default filterdiff binary on the
+      path.
 
      examples:
         (On Windows with Cygwin)
-
+>
            let g:patchreview_filterdiff = 'c:\\cygwin\\bin\\filterdiff.exe'
-
+<
         (On *nix systems)
-
+>
            let g:patchreview_filterdiff = '/usr/bin/filterdiff'
-
-  g:patchreview_patch      : Optional path to patch binary. PatchReview tries
-                             to locate patch on system path automatically. If
-                             the binary is not on system path, this option
-                             tell PatchReview the full path to the binary.
-                             This option, if specified, overrides the default
-                             patch binary on the path.
-
-     examples:
-        (On Windows with Cygwin)
-
-           let g:patchreview_patch = 'c:\\cygwin\\bin\\patch.exe'
-
-        (On *nix systems)
-
-           let g:patchreview_patch = '/usr/bin/gpatch'
-
-
-  g:patchreview_tmpdir : Optional path where the plugin can save temporary
-                         files.  If this is not specified, the plugin tries to
-                         use TMP, TEMP and TMPDIR environment variables in
-                         succession.
-
-    examples:
-        (On Windows)      let g:patchreview_tmpdir = 'c:\\tmp'
-        (On *nix systems) let g:patchreview_tmpdir = '~/tmp'
-
+<
 =============================================================================
 
 PatchReview Usage                                          *patchreview-usage*
+                                                                *:DiffReview*
+
+  :DiffReview
+
+    Perform a diff review in the current directory under version control.
+    Currently supports Mercurial (hg), Subversion (svn), CVS, Bazaar (bzr) and
+    Monotone.
+
                                                                 *:PatchReview*
 
   :PatchReview patchfile_path [optional_source_directory]
 
     Perform a patch review in the current directory based on the supplied
     patchfile_path. If optional_source_directory is specified, patchreview is
-    done on that directory. Othewise, the current directory is assumed to be
+    done on that directory. Otherwise, the current directory is assumed to be
     the source directory.
-                                                          *:PatchReviewCleanup*
-
-  :PatchReviewCleanup
 
-    After you are done using the :PatchReview command, you can cleanup the
-    temporary files in the temporary directory using this command.
+    Only supports context or unified format patches.
 
-=============================================================================
-vim: ft=help:ts=2:sts=2:sw=2:tw=78:tw=78
+------------------------------------------------------------------------------
+ vim: ft=help:ts=2:sts=2:sw=2:tw=78:norl:
--- a/contrib/vim/patchreview.vim	Wed Feb 24 18:22:45 2010 +0100
+++ b/contrib/vim/patchreview.vim	Sun Feb 28 18:06:47 2010 +0100
@@ -1,113 +1,154 @@
-" Vim global plugin for doing single or multipatch code reviews"{{{
+" VIM plugin for doing single, multi-patch or diff code reviews {{{
+" Home:  http://www.vim.org/scripts/script.php?script_id=1563
 
-" Version       : 0.1                                          "{{{
-" Last Modified : Thu 25 May 2006 10:15:11 PM PDT
-" Author        : Manpreet Singh (junkblocker AT yahoo DOT com)
-" Copyright     : 2006 by Manpreet Singh
+" Version       : 0.2.2                                        "{{{
+" Author        : Manpreet Singh < junkblocker@yahoo.com >
+" Copyright     : 2006-2010 by Manpreet Singh
 " License       : This file is placed in the public domain.
+"                 No warranties express or implied. Use at your own risk.
 "
-" History       : 0.1 - First released
+" Changelog :
+"
+"   0.2.2 - Security fixes by removing custom tempfile creation
+"         - Removed need for DiffReviewCleanup/PatchReviewCleanup
+"         - Better command execution error detection and display
+"         - Improved diff view and folding by ignoring modelines
+"         - Improved tab labels display
+"
+"   0.2.1 - Minor temp directory autodetection logic and cleanup
+"
+"   0.2 - Removed the need for filterdiff by implemeting it in pure vim script
+"       - Added DiffReview command for reverse (changed repository to
+"         pristine state) reviews.
+"         (PatchReview does pristine repository to patch review)
+"       - DiffReview does automatic detection and generation of diffs for
+"         various Source Control systems
+"       - Skip load if VIM 7.0 or higher unavailable
+"
+"   0.1 - First released
 "}}}
+
 " Documentation:                                                         "{{{
 " ===========================================================================
-" This plugin allows single or multipatch code reviews to be done in VIM. Vim
-" has :diffpatch command to do single file reviews but can not handle patch
-" files containing multiple patches. This plugin provides that missing
-" functionality and doesn't require the original file to be open.
+" This plugin allows single or multiple, patch or diff based code reviews to
+" be easily done in VIM. VIM has :diffpatch command to do single file reviews
+" but a) can not handle patch files containing multiple patches or b) do
+" automated diff generation for various version control systems. This plugin
+" attempts to provide those functionalities. It opens each changed / added or
+" removed file diff in new tabs.
+"
+" Installing:
+"
+"   For a quick start, unzip patchreview.zip into your ~/.vim directory and
+"   restart Vim.
 "
-" Installing:                                                            "{{{
+" Details:
+"
+"   Requirements:
+"
+"   1) VIM 7.0 or higher built with +diff option.
 "
-"  For a quick start...
+"   2) A gnu compatible patch command installed. This is the standard patch
+"      command on Linux, Mac OS X, *BSD, Cygwin or /usr/bin/gpatch on newer
+"      Solaris.
 "
-"   Requirements:                                                        "{{{
+"   3) Optional (but recommended for speed)
 "
-"   1) (g)vim 7.0 or higher built with +diff option.
-"   2) patch and patchutils ( http://cyberelk.net/tim/patchutils/ ) installed
-"      for your OS. For windows it is availble from Cygwin (
-"      http://www.cygwin.com ) or GnuWin32 ( http://gnuwin32.sourceforge.net/
-"      ).
-""}}}
-"   Install:                                                            "{{{
+"      Install patchutils ( http://cyberelk.net/tim/patchutils/ ) for your
+"      OS. For windows it is availble from Cygwin
+"
+"         http://www.cygwin.com
+"
+"      or GnuWin32
+"
+"         http://gnuwin32.sourceforge.net/
+"
+"   Install:
 "
-"   1) Extract this in your $VIM/vimfiles or $HOME/.vim directory and restart
-"      vim.
+"   1) Extract the zip in your $HOME/.vim or $VIM/vimfiles directory and
+"      restart vim. The  directory location relevant to your platform can be
+"      seen by running :help add-global-plugin in vim.
+"
+"   2) Restart vim.
 "
-"   2) Make sure that you have filterdiff from patchutils and patch commands
-"      installed.
+"  Configuration:
 "
-"   3) Optinally, specify the locations to filterdiff and patch commands and
-"      location of a temporary directory to use in your .vimrc.
+"  Optionally, specify the locations to these filterdiff and patch commands
+"  and location of a temporary directory to use in your .vimrc.
 "
+"      let g:patchreview_patch       = '/path/to/gnu/patch'
+"
+"      " If you are using filterdiff
 "      let g:patchreview_filterdiff  = '/path/to/filterdiff'
-"      let g:patchreview_patch       = '/path/to/patch'
-"      let g:patchreview_tmpdir      = '/tmp/or/something'
 "
-"   4) Optionally, generate help tags to use help
 "
-"      :helptags ~/.vim/doc
-"      or
-"      :helptags c:\vim\vimfiles\doc
-""}}}
-""}}}
-" Usage:                                                                 "{{{
+" Usage:
 "
-"  :PatchReview path_to_submitted_patchfile [optional_source_directory]
+"  Please see :help patchreview or :help diffreview for details.
 "
-"  after review is done
-"
-"  :PatchReviewCleanup
-"
-" See :help patchreview for details after you've created help tags.
 ""}}}
-"}}}
-" Code                                                                   "{{{
+
+" Enabled only during development
+" unlet! g:loaded_patchreview " DEBUG
+" unlet! g:patchreview_patch " DEBUG
+" unlet! g:patchreview_filterdiff " DEBUG
+" let g:patchreview_patch = 'patch'    " DEBUG
+
+if v:version < 700
+  finish
+endif
+if ! has('diff')
+  call confirm('patchreview.vim plugin needs (G)VIM built with +diff support to work.')
+  finish
+endif
 
-" Enabled only during development                                        "{{{
-" unlet! g:loaded_patchreview " DEBUG
-" unlet! g:patchreview_tmpdir " DEBUG
-" unlet! g:patchreview_filterdiff " DEBUG
-" unlet! g:patchreview_patch " DEBUG
+" load only once
+if (! exists('g:patchreview_debug') && exists('g:loaded_patchreview')) || &compatible
+  finish
+endif
+let g:loaded_patchreview="0.2.2"
+
+let s:msgbufname = '-PatchReviewMessages-'
+
+function! <SID>Debug(str)                                                 "{{{
+  if exists('g:patchreview_debug')
+    Pecho 'DEBUG: ' . a:str
+  endif
+endfunction
+command! -nargs=+ -complete=expression Debug call s:Debug(<args>)
 "}}}
 
-" load only once                                                         "{{{
-if exists('g:loaded_patchreview')
-  finish
-endif
-let g:loaded_patchreview=1
-let s:msgbufname = 'Patch Review Messages'
-"}}}
-
-function! <SID>PR_wipeMsgBuf()                                           "{{{
-  let s:winnum = bufwinnr(s:msgbufname)
-  if s:winnum != -1 " If the window is already open, jump to it
-    let s:cur_winnr = winnr()
-    if winnr() != s:winnum
-      exe s:winnum . 'wincmd w'
+function! <SID>PR_wipeMsgBuf()                                            "{{{
+  let winnum = bufwinnr(s:msgbufname)
+  if winnum != -1 " If the window is already open, jump to it
+    let cur_winnr = winnr()
+    if winnr() != winnum
+      exe winnum . 'wincmd w'
       exe 'bw'
-      exe s:cur_winnr . 'wincmd w'
+      exe cur_winnr . 'wincmd w'
     endif
   endif
 endfunction
 "}}}
 
-function! <SID>PR_echo(...)                                              "{{{
-  " Usage: PR_echo(msg, [return_to_original_window_flag])
+function! <SID>Pecho(...)                                                 "{{{
+  " Usage: Pecho(msg, [return_to_original_window_flag])
   "            default return_to_original_window_flag = 0
   "
-  let s:cur_winnr = winnr()
-  let s:winnum = bufwinnr(s:msgbufname)
-  if s:winnum != -1 " If the window is already open, jump to it
-    if winnr() != s:winnum
-      exe s:winnum . 'wincmd w'
+  let cur_winnr = winnr()
+  let winnum = bufwinnr(s:msgbufname)
+  if winnum != -1 " If the window is already open, jump to it
+    if winnr() != winnum
+      exe winnum . 'wincmd w'
     endif
   else
-    let s:bufnum = bufnr(s:msgbufname)
-    if s:bufnum == -1
-      let s:wcmd = s:msgbufname
+    let bufnum = bufnr(s:msgbufname)
+    if bufnum == -1
+      let wcmd = s:msgbufname
     else
-      let s:wcmd = '+buffer' . s:bufnum
+      let wcmd = '+buffer' . bufnum
     endif
-    exe 'silent! botright 5split ' . s:wcmd
+    exe 'silent! botright 5split ' . wcmd
   endif
   setlocal modifiable
   setlocal buftype=nofile
@@ -121,23 +162,26 @@
   exe ':$'
   setlocal nomodifiable
   if a:0 > 1 && a:2
-    exe s:cur_winnr . 'wincmd w'
+    exe cur_winnr . 'wincmd w'
   endif
 endfunction
+
+command! -nargs=+ -complete=expression Pecho call s:Pecho(<args>)
 "}}}
 
-function! <SID>PR_checkBinary(BinaryName)                                "{{{
+function! <SID>PR_checkBinary(BinaryName)                                 "{{{
   " Verify that BinaryName is specified or available
   if ! exists('g:patchreview_' . a:BinaryName)
     if executable(a:BinaryName)
       let g:patchreview_{a:BinaryName} = a:BinaryName
       return 1
     else
-      call s:PR_echo('g:patchreview_' . a:BinaryName . ' is not defined and could not be found on path. Please define it in your .vimrc.')
+      Pecho 'g:patchreview_' . a:BinaryName . ' is not defined and ' . a:BinaryName . ' command could not be found on path.'
+      Pecho 'Please define it in your .vimrc.'
       return 0
     endif
   elseif ! executable(g:patchreview_{a:BinaryName})
-    call s:PR_echo('Specified g:patchreview_' . a:BinaryName . ' [' . g:patchreview_{a.BinaryName} . '] is not executable.')
+    Pecho 'Specified g:patchreview_' . a:BinaryName . ' [' . g:patchreview_{a:BinaryName} . '] is not executable.'
     return 0
   else
     return 1
@@ -145,188 +189,680 @@
 endfunction
 "}}}
 
-function! <SID>PR_GetTempDirLocation(Quiet)                              "{{{
-  if exists('g:patchreview_tmpdir')
-    if ! isdirectory(g:patchreview_tmpdir) || ! filewritable(g:patchreview_tmpdir)
-      if ! a:Quiet
-        call s:PR_echo('Temporary directory specified by g:patchreview_tmpdir [' . g:patchreview_tmpdir . '] is not accessible.')
-        return 0
-      endif
+function! <SID>ExtractDiffsNative(...)                                    "{{{
+  " Sets g:patches = {'reason':'', 'patch':[
+  " {
+  "  'filename': filepath
+  "  'type'    : '+' | '-' | '!'
+  "  'content' : patch text for this file
+  " },
+  " ...
+  " ]}
+  let g:patches = {'reason' : '', 'patch' : []}
+  " TODO : User pointers into lines list rather then use collect
+  if a:0 == 0
+    let g:patches['reason'] = "ExtractDiffsNative expects at least a patchfile argument"
+    return
+  endif
+  let patchfile = expand(a:1, ':p')
+  if a:0 > 1
+    let patch = a:2
+  endif
+  if ! filereadable(patchfile)
+    let g:patches['reason'] = "File " . patchfile . " is not readable"
+    return
+  endif
+  unlet! filterdiffcmd
+  let filterdiffcmd = '' . g:patchreview_filterdiff . ' --list -s ' . patchfile
+  let fileslist = split(system(filterdiffcmd), '[\r\n]')
+  for filewithchangetype in fileslist
+    if filewithchangetype !~ '^[!+-] '
+      Pecho '*** Skipping review generation due to unknown change for [' . filewithchangetype . ']'
+      continue
     endif
-  elseif exists("$TMP") && isdirectory($TMP) && filewritable($TMP)
-    let g:patchreview_tmpdir = $TMP
-  elseif exists("$TEMP") && isdirectory($TEMP) && filewritable($TEMP)
-    let g:patchreview_tmpdir = $TEMP
-  elseif exists("$TMPDIR") && isdirectory($TMPDIR) && filewritable($TMPDIR)
-    let g:patchreview_tmpdir = $TMPDIR
-  else
-    if ! a:Quiet
-      call s:PR_echo('Could not figure out a temporary directory to use. Please specify g:patchreview_tmpdir in your .vimrc.')
-      return 0
+
+    unlet! this_patch
+    let this_patch = {}
+
+    unlet! relpath
+    let relpath = substitute(filewithchangetype, '^. ', '', '')
+
+    let this_patch['filename'] = relpath
+
+    if filewithchangetype =~ '^! '
+      let this_patch['type'] = '!'
+    elseif filewithchangetype =~ '^+ '
+      let this_patch['type'] = '+'
+    elseif filewithchangetype =~ '^- '
+      let this_patch['type'] = '-'
     endif
-  endif
-  let g:patchreview_tmpdir = g:patchreview_tmpdir . '/'
-  let g:patchreview_tmpdir = substitute(g:patchreview_tmpdir, '\\', '/', 'g')
-  let g:patchreview_tmpdir = substitute(g:patchreview_tmpdir, '/+$', '/', '')
-  if has('win32')
-    let g:patchreview_tmpdir = substitute(g:patchreview_tmpdir, '/', '\\', 'g')
-  endif
-  return 1
+
+    unlet! filterdiffcmd
+    let filterdiffcmd = '' . g:patchreview_filterdiff . ' -i ' . relpath . ' ' . patchfile
+    let this_patch['content'] = split(system(filterdiffcmd), '[\n\r]')
+    let g:patches['patch'] += [this_patch]
+    Debug "Patch collected for " . relpath
+  endfor
 endfunction
 "}}}
 
-function! <SID>PatchReview(...)                                          "{{{
-  " VIM 7+ required"{{{
-  if version < 700
-    call s:PR_echo('This plugin needs VIM 7 or higher')
+function! <SID>ExtractDiffsPureVim(...)                                   "{{{
+  " Sets g:patches = {'reason':'', 'patch':[
+  " {
+  "  'filename': filepath
+  "  'type'    : '+' | '-' | '!'
+  "  'content' : patch text for this file
+  " },
+  " ...
+  " ]}
+  let g:patches = {'reason' : '', 'patch' : []}
+  " TODO : User pointers into lines list rather then use collect
+  if a:0 == 0
+    let g:patches['reason'] = "ExtractDiffsPureVim expects at least a patchfile argument"
+    return
+  endif
+  let patchfile = expand(a:1, ':p')
+  if a:0 > 1
+    let patch = a:2
+  endif
+  if ! filereadable(patchfile)
+    let g:patches['reason'] = "File " . patchfile . " is not readable"
     return
   endif
+  call s:PR_wipeMsgBuf()
+  let collect = []
+  let linum = 0
+  let lines = readfile(patchfile)
+  let linescount = len(lines)
+  State 'START'
+  while linum < linescount
+    let line = lines[linum]
+    let linum += 1
+    if State() == 'START'
+      let mat = matchlist(line, '^--- \([^\t]\+\).*$')
+      if ! empty(mat) && mat[1] != ''
+        State 'MAYBE_UNIFIED_DIFF'
+        let p_first_file = mat[1]
+        let collect = [line]
+        Debug line . State()
+        continue
+      endif
+      let mat = matchlist(line, '^\*\*\* \([^\t]\+\).*$')
+      if ! empty(mat) && mat[1] != ''
+        State 'MAYBE_CONTEXT_DIFF'
+        let p_first_file = mat[1]
+        let collect = [line]
+        Debug line . State()
+        continue
+      endif
+      continue
+    elseif State() == 'MAYBE_CONTEXT_DIFF'
+      let mat = matchlist(line, '^--- \([^\t]\+\).*$')
+      if empty(mat) || mat[1] == ''
+        State 'START'
+        let linum -= 1
+        continue
+        Debug 'Back to square one ' . line()
+      endif
+      let p_second_file = mat[1]
+      if p_first_file == '/dev/null'
+        if p_second_file == '/dev/null'
+          let g:patches['reason'] = "Malformed diff found at line " . linum
+          return
+        endif
+        let p_type = '+'
+        let filepath = p_second_file
+      else
+        if p_second_file == '/dev/null'
+          let p_type = '-'
+          let filepath = p_first_file
+        else
+          let p_type = '!'
+          let filepath = p_first_file
+        endif
+      endif
+      State 'EXPECT_15_STARS'
+      let collect += [line]
+      Debug line . State()
+    elseif State() == 'EXPECT_15_STARS'
+      if line !~ '^*\{15}$'
+        State 'START'
+        let linum -= 1
+        Debug line . State()
+        continue
+      endif
+      State 'EXPECT_CONTEXT_CHUNK_HEADER_1'
+      let collect += [line]
+      Debug line . State()
+    elseif State() == 'EXPECT_CONTEXT_CHUNK_HEADER_1'
+      let mat = matchlist(line, '^\*\*\* \(\d\+,\)\?\(\d\+\) \*\*\*\*$')
+      if empty(mat) || mat[1] == ''
+        State 'START'
+        let linum -= 1
+        Debug line . State()
+        continue
+      endif
+      let collect += [line]
+      State 'SKIP_CONTEXT_STUFF_1'
+      Debug line . State()
+      continue
+    elseif State() == 'SKIP_CONTEXT_STUFF_1'
+      if line !~ '^[ !+].*$'
+        let mat = matchlist(line, '^--- \(\d\+\),\(\d\+\) ----$')
+        if ! empty(mat) && mat[1] != '' && mat[2] != ''
+          let goal_count = mat[2] - mat[1] + 1
+          let c_count = 0
+          State 'READ_CONTEXT_CHUNK'
+          let collect += [line]
+          Debug line . State() . " Goal count set to " . goal_count
+          continue
+        endif
+        State 'START'
+        let linum -= 1
+        Debug line . State()
+        continue
+      endif
+      let collect += [line]
+      continue
+    elseif State() == 'READ_CONTEXT_CHUNK'
+      let c_count += 1
+      if c_count == goal_count
+        let collect += [line]
+        State 'BACKSLASH_OR_CRANGE_EOF'
+        continue
+      else " goal not met yet
+        let mat = matchlist(line, '^\([\\!+ ]\).*$')
+        if empty(mat) || mat[1] == ''
+          let linum -= 1
+          State 'START'
+          Debug line . State()
+          continue
+        endif
+        let collect += [line]
+        continue
+      endif
+    elseif State() == 'BACKSLASH_OR_CRANGE_EOF'
+      if line =~ '^\\ No newline.*$'   " XXX: Can we go to another chunk from here??
+        let collect += [line]
+        let this_patch = {}
+        let this_patch['filename'] = filepath
+        let this_patch['type'] = p_type
+        let this_patch['content'] = collect
+        let g:patches['patch'] += [this_patch]
+        Debug "Patch collected for " . filepath
+        State 'START'
+        continue
+      endif
+      if line =~ '^\*\{15}$'
+        let collect += [line]
+        State 'EXPECT_CONTEXT_CHUNK_HEADER_1'
+        Debug line . State()
+        continue
+      endif
+      let this_patch = {}
+      let this_patch['filename'] = filepath
+      let this_patch['type'] = p_type
+      let this_patch['content'] = collect
+      let g:patches['patch'] += [this_patch]
+      let linum -= 1
+      State 'START'
+      Debug "Patch collected for " . filepath
+      Debug line . State()
+      continue
+    elseif State() == 'MAYBE_UNIFIED_DIFF'
+      let mat = matchlist(line, '^+++ \([^\t]\+\).*$')
+      if empty(mat) || mat[1] == ''
+        State 'START'
+        let linum -= 1
+        Debug line . State()
+        continue
+      endif
+      let p_second_file = mat[1]
+      if p_first_file == '/dev/null'
+        if p_second_file == '/dev/null'
+          let g:patches['reason'] = "Malformed diff found at line " . linum
+          return
+        endif
+        let p_type = '+'
+        let filepath = p_second_file
+      else
+        if p_second_file == '/dev/null'
+          let p_type = '-'
+          let filepath = p_first_file
+        else
+          let p_type = '!'
+          let filepath = p_first_file
+        endif
+      endif
+      State 'EXPECT_UNIFIED_RANGE_CHUNK'
+      let collect += [line]
+      Debug line . State()
+      continue
+    elseif State() == 'EXPECT_UNIFIED_RANGE_CHUNK'
+      let mat = matchlist(line, '^@@ -\(\d\+,\)\?\(\d\+\) +\(\d\+,\)\?\(\d\+\) @@$')
+      if ! empty(mat)
+        let old_goal_count = mat[2]
+        let new_goal_count = mat[4]
+        let o_count = 0
+        let n_count = 0
+        Debug "Goal count set to " . old_goal_count . ', ' . new_goal_count
+        State 'READ_UNIFIED_CHUNK'
+        let collect += [line]
+        Debug line . State()
+        continue
+      endif
+      State 'START'
+      Debug line . State()
+      continue
+    elseif State() == 'READ_UNIFIED_CHUNK'
+      if o_count == old_goal_count && n_count == new_goal_count
+        if line =~ '^\\.*$'   " XXX: Can we go to another chunk from here??
+          let collect += [line]
+          let this_patch = {}
+          let this_patch['filename'] = filepath
+          let this_patch['type'] = p_type
+          let this_patch['content'] = collect
+          let g:patches['patch'] += [this_patch]
+          Debug "Patch collected for " . filepath
+          State 'START'
+          continue
+        endif
+        let mat = matchlist(line, '^@@ -\(\d\+,\)\?\(\d\+\) +\(\d\+,\)\?\(\d\+\) @@$')
+        if ! empty(mat)
+          let old_goal_count = mat[2]
+          let new_goal_count = mat[4]
+          let o_count = 0
+          let n_count = 0
+          Debug "Goal count set to " . old_goal_count . ', ' . new_goal_count
+          let collect += [line]
+          Debug line . State()
+          continue
+        endif
+        let this_patch = {}
+        let this_patch['filename'] = filepath
+        let this_patch['type'] = p_type
+        let this_patch['content'] = collect
+        let g:patches['patch'] += [this_patch]
+        Debug "Patch collected for " . filepath
+        let linum -= 1
+        State 'START'
+        Debug line . State()
+        continue
+      else " goal not met yet
+        let mat = matchlist(line, '^\([\\+ -]\).*$')
+        if empty(mat) || mat[1] == ''
+          let linum -= 1
+          State 'START'
+          continue
+        endif
+        let chr = mat[1]
+        if chr == '+'
+          let n_count += 1
+        endif
+        if chr == ' '
+          let o_count += 1
+          let n_count += 1
+        endif
+        if chr == '-'
+          let o_count += 1
+        endif
+        let collect += [line]
+        Debug line . State()
+        continue
+      endif
+    else
+      let g:patches['reason'] = "Internal error: Do not use the plugin anymore and if possible please send the diff or patch file you tried it with to Manpreet Singh <junkblocker@yahoo.com>"
+      return
+    endif
+  endwhile
+  "Pecho State()
+  if (State() == 'READ_CONTEXT_CHUNK' && c_count == goal_count) || (State() == 'READ_UNIFIED_CHUNK' && n_count == new_goal_count && o_count == old_goal_count)
+    let this_patch = {}
+    let this_patch['filename'] = filepath
+    let this_patch['type'] = p_type
+    let this_patch['content'] = collect
+    let g:patches['patch'] += [this_patch]
+    Debug "Patch collected for " . filepath
+  endif
+  return
+endfunction
 "}}}
 
-  let s:save_shortmess = &shortmess
-  set shortmess+=aW
-  call s:PR_wipeMsgBuf()
+function! State(...)  " For easy manipulation of diff extraction state      "{{{
+  if a:0 != 0
+    let s:STATE = a:1
+  else
+    if ! exists('s:STATE')
+      let s:STATE = 'START'
+    endif
+    return s:STATE
+  endif
+endfunction
+com! -nargs=+ -complete=expression State call State(<args>)
+"}}}
 
-  " Check passed arguments                                               "{{{
-  if a:0 == 0
-    call s:PR_echo('PatchReview command needs at least one argument specifying a patchfile path.')
-    let &shortmess = s:save_shortmess
+function! <SID>PatchReview(...)                                           "{{{
+  let s:save_shortmess = &shortmess
+  let s:save_aw = &autowrite
+  let s:save_awa = &autowriteall
+  set shortmess=aW
+  call s:PR_wipeMsgBuf()
+  let s:reviewmode = 'patch'
+  call s:_GenericReview(a:000)
+  let &autowriteall = s:save_awa
+  let &autowrite = s:save_aw
+  let &shortmess = s:save_shortmess
+endfunction
+"}}}
+
+function! <SID>_GenericReview(argslist)                                   "{{{
+  " diff mode:
+  "   arg1 = patchfile
+  "   arg2 = strip count
+  " patch mode:
+  "   arg1 = patchfile
+  "   arg2 = strip count
+  "   arg3 = directory
+
+  " VIM 7+ required
+  if version < 700
+    Pecho 'This plugin needs VIM 7 or higher'
     return
   endif
-  if a:0 >= 1 && a:0 <= 2
-    let s:PatchFilePath = expand(a:1, ':p')
-    if ! filereadable(s:PatchFilePath)
-      call s:PR_echo('File [' . s:PatchFilePath . '] is not accessible.')
-      let &shortmess = s:save_shortmess
+
+  " +diff required
+  if ! has('diff')
+    Pecho 'This plugin needs VIM built with +diff feature.'
+    return
+  endif
+
+
+  if s:reviewmode == 'diff'
+    let patch_R_option = ' -t -R '
+  elseif s:reviewmode == 'patch'
+    let patch_R_option = ''
+  else
+    Pecho 'Fatal internal error in patchreview.vim plugin'
+    return
+  endif
+
+  " Check passed arguments
+  if len(a:argslist) == 0
+    Pecho 'PatchReview command needs at least one argument specifying a patchfile path.'
+    return
+  endif
+  let StripCount = 0
+  if len(a:argslist) >= 1 && ((s:reviewmode == 'patch' && len(a:argslist) <= 3) || (s:reviewmode == 'diff' && len(a:argslist) == 2))
+    let PatchFilePath = expand(a:argslist[0], ':p')
+    if ! filereadable(PatchFilePath)
+      Pecho 'File [' . PatchFilePath . '] is not accessible.'
       return
     endif
-    if a:0 == 2
-      let s:SrcDirectory = expand(a:2, ':p')
+    if len(a:argslist) >= 2 && s:reviewmode == 'patch'
+      let s:SrcDirectory = expand(a:argslist[1], ':p')
       if ! isdirectory(s:SrcDirectory)
-        call s:PR_echo('[' . s:SrcDirectory . '] is not a directory')
-        let &shortmess = s:save_shortmess
+        Pecho '[' . s:SrcDirectory . '] is not a directory'
         return
       endif
       try
+        " Command line has already escaped the path
         exe 'cd ' . s:SrcDirectory
       catch /^.*E344.*/
-        call s:PR_echo('Could not change to directory [' . s:SrcDirectory . ']')
-        let &shortmess = s:save_shortmess
+        Pecho 'Could not change to directory [' . s:SrcDirectory . ']'
         return
       endtry
     endif
+    if s:reviewmode == 'diff'
+      " passed in by default
+      let StripCount = eval(a:argslist[1])
+    elseif s:reviewmode == 'patch'
+      let StripCount = 1
+      " optional strip count
+      if len(a:argslist) == 3
+        let StripCount = eval(a:argslist[2])
+      endif
+    endif
   else
-    call s:PR_echo('PatchReview command needs at most two arguments: patchfile path and optional source directory path.')
-    let &shortmess = s:save_shortmess
+    if s:reviewmode == 'patch'
+      Pecho 'PatchReview command needs at most three arguments: patchfile path, optional source directory path and optional strip count.'
+    elseif s:reviewmode == 'diff'
+      Pecho 'DiffReview command accepts no arguments.'
+    endif
+    return
+  endif
+
+  " Verify that patch command and temporary directory are available or specified
+  if ! s:PR_checkBinary('patch')
     return
   endif
+
+  " Requirements met, now execute
+  let PatchFilePath = fnamemodify(PatchFilePath, ':p')
+  if s:reviewmode == 'patch'
+    Pecho 'Patch file      : ' . PatchFilePath
+  endif
+  Pecho 'Source directory: ' . getcwd()
+  Pecho '------------------'
+  if s:PR_checkBinary('filterdiff')
+    Debug "Using filterdiff"
+    call s:ExtractDiffsNative(PatchFilePath)
+  else
+    Debug "Using own diff extraction (slower)"
+    call s:ExtractDiffsPureVim(PatchFilePath)
+  endif
+  for patch in g:patches['patch']
+    if patch.type !~ '^[!+-]$'
+      Pecho '*** Skipping review generation due to unknown change [' . patch.type . ']', 1
+      continue
+    endif
+    unlet! relpath
+    let relpath = patch.filename
+    " XXX: svn diff and hg diff produce different kind of outputs, one requires
+    " XXX: stripping but the other doesn't. We need to take care of that
+    let stripmore = StripCount
+    let StrippedRelativeFilePath = relpath
+    while stripmore > 0
+      " strip one
+      let StrippedRelativeFilePath = substitute(StrippedRelativeFilePath, '^[^\\\/]\+[^\\\/]*[\\\/]' , '' , '')
+      let stripmore -= 1
+    endwhile
+    if patch.type == '!'
+      if s:reviewmode == 'patch'
+        let msgtype = 'Patch modifies file: '
+      elseif s:reviewmode == 'diff'
+        let msgtype = 'File has changes: '
+      endif
+    elseif patch.type == '+'
+      if s:reviewmode == 'patch'
+        let msgtype = 'Patch adds file    : '
+      elseif s:reviewmode == 'diff'
+        let msgtype = 'New file        : '
+      endif
+    elseif patch.type == '-'
+      if s:reviewmode == 'patch'
+        let msgtype = 'Patch removes file : '
+      elseif s:reviewmode == 'diff'
+        let msgtype = 'Removed file    : '
+      endif
+    endif
+    let bufnum = bufnr(relpath)
+    if buflisted(bufnum) && getbufvar(bufnum, '&mod')
+      Pecho 'Old buffer for file [' . relpath . '] exists in modified state. Skipping review.', 1
+      continue
+    endif
+    let tmpname = tempname()
+
+    " write patch for patch.filename into tmpname
+    call writefile(patch.content, tmpname)
+    if patch.type == '+' && s:reviewmode == 'patch'
+      let inputfile = ''
+      let patchcmd = '!' . g:patchreview_patch . patch_R_option . ' -o "' . tmpname . '.file" "' . inputfile . '" < "' . tmpname . '"'
+    elseif patch.type == '+' && s:reviewmode == 'diff'
+      let inputfile = ''
+      unlet! patchcmd
+    else
+      let inputfile = expand(StrippedRelativeFilePath, ':p')
+      let patchcmd = '!' . g:patchreview_patch . patch_R_option . ' -o "' . tmpname . '.file" "' . inputfile . '" < "' . tmpname . '"'
+    endif
+    if exists('patchcmd')
+      let v:errmsg = ''
+      Debug patchcmd
+      silent exe patchcmd
+      if v:errmsg != '' || v:shell_error
+        Pecho 'ERROR: Could not execute patch command.'
+        Pecho 'ERROR:     ' . patchcmd
+        Pecho 'ERROR: ' . v:errmsg
+        Pecho 'ERROR: Diff skipped.'
+        continue
+      endif
+    endif
+    call delete(tmpname)
+    let s:origtabpagenr = tabpagenr()
+    silent! exe 'tabedit ' . StrippedRelativeFilePath
+    if exists('patchcmd')
+      " modelines in loaded files mess with diff comparision
+      let s:keep_modeline=&modeline
+      let &modeline=0
+      silent! exe 'vert diffsplit ' . tmpname . '.file'
+      setlocal buftype=nofile
+      setlocal noswapfile
+      setlocal syntax=none
+      setlocal bufhidden=delete
+      setlocal nobuflisted
+      setlocal modifiable
+      setlocal nowrap
+      " Remove buffer name
+      silent! 0f
+      " Switch to original to get a nice tab title
+      silent! wincmd p
+      let &modeline=s:keep_modeline
+    else
+      silent! exe 'vnew'
+    endif
+    if filereadable(tmpname . '.file.rej')
+      silent! exe 'topleft 5split ' . tmpname . '.file.rej'
+      Pecho msgtype . '*** REJECTED *** ' . relpath, 1
+    else
+      Pecho msgtype . ' ' . relpath, 1
+    endif
+    silent! exe 'tabn ' . s:origtabpagenr
+  endfor
+  Pecho '-----'
+  Pecho 'Done.'
+
+endfunction
 "}}}
 
-  " Verify that filterdiff and patch are specified or available          "{{{
-  if ! s:PR_checkBinary('filterdiff') || ! s:PR_checkBinary('patch')
+function! <SID>DiffReview(...)                                            "{{{
+  let s:save_shortmess = &shortmess
+  set shortmess=aW
+  call s:PR_wipeMsgBuf()
+
+  let vcsdict = {
+                  \'Mercurial'  : {'dir' : '.hg',  'binary' : 'hg',  'diffargs' : 'diff' ,          'strip' : 1},
+                  \'Bazaar-NG'  : {'dir' : '.bzr', 'binary' : 'bzr', 'diffargs' : 'diff' ,          'strip' : 0},
+                  \'monotone'   : {'dir' : '_MTN', 'binary' : 'mtn', 'diffargs' : 'diff --unified', 'strip' : 0},
+                  \'Subversion' : {'dir' : '.svn', 'binary' : 'svn', 'diffargs' : 'diff' ,          'strip' : 0},
+                  \'cvs'        : {'dir' : 'CVS',  'binary' : 'cvs', 'diffargs' : '-q diff -u' ,    'strip' : 0},
+                  \}
+
+  unlet! s:theDiffCmd
+  unlet! l:vcs
+  if ! exists('g:patchreview_diffcmd')
+    for key in keys(vcsdict)
+      if isdirectory(vcsdict[key]['dir'])
+        if ! s:PR_checkBinary(vcsdict[key]['binary'])
+          Pecho 'Current directory looks like a ' . vcsdict[key] . ' repository but ' . vcsdist[key]['binary'] . ' command was not found on path.'
+          let &shortmess = s:save_shortmess
+          return
+        else
+          let s:theDiffCmd = vcsdict[key]['binary'] . ' ' . vcsdict[key]['diffargs']
+          let strip = vcsdict[key]['strip']
+
+          Pecho 'Using [' . s:theDiffCmd . '] to generate diffs for this ' . key . ' review.'
+          let &shortmess = s:save_shortmess
+          let l:vcs = vcsdict[key]['binary']
+          break
+        endif
+      else
+        continue
+      endif
+    endfor
+  else
+    let s:theDiffCmd = g:patchreview_diffcmd
+    let strip = 0
+  endif
+  if ! exists('s:theDiffCmd')
+    Pecho 'Please define g:patchreview_diffcmd and make sure you are in a VCS controlled top directory.'
     let &shortmess = s:save_shortmess
     return
   endif
 
-  let s:retval = s:PR_GetTempDirLocation(0)
-  if ! s:retval
+  let outfile = tempname()
+  let cmd = s:theDiffCmd . ' > "' . outfile . '"'
+  let v:errmsg = ''
+  let cout = system(cmd)
+  if v:errmsg == '' && exists('l:vcs') && l:vcs == 'cvs' && v:shell_error == 1
+    " Ignoring CVS non-error
+  elseif v:errmsg != '' || v:shell_error
+    Pecho v:errmsg
+    Pecho 'Could not execute [' . s:theDiffCmd . ']'
+    Pecho 'Error code: ' . v:shell_error
+    Pecho cout
+    Pecho 'Diff review aborted.'
     let &shortmess = s:save_shortmess
     return
   endif
-"}}}
-
-  " Requirements met, now execute                                        "{{{
-  let s:PatchFilePath = fnamemodify(s:PatchFilePath, ':p')
-  call s:PR_echo('Patch file      : ' . s:PatchFilePath)
-  call s:PR_echo('Source directory: ' . getcwd())
-  call s:PR_echo('------------------')
-  let s:theFilterDiffCommand = '' . g:patchreview_filterdiff . ' --list -s ' . s:PatchFilePath
-  let s:theFilesString = system(s:theFilterDiffCommand)
-  let s:theFilesList = split(s:theFilesString, '[\r\n]')
-  for s:filewithchangetype in s:theFilesList
-    if s:filewithchangetype !~ '^[!+-] '
-      call s:PR_echo('*** Skipping review generation due to understood change for [' . s:filewithchangetype . ']', 1)
-      continue
-    endif
-    unlet! s:RelativeFilePath
-    let s:RelativeFilePath = substitute(s:filewithchangetype, '^. ', '', '')
-    let s:RelativeFilePath = substitute(s:RelativeFilePath, '^[a-z][^\\\/]*[\\\/]' , '' , '')
-    if s:filewithchangetype =~ '^! '
-      let s:msgtype = 'Modification : '
-    elseif s:filewithchangetype =~ '^+ '
-      let s:msgtype = 'Addition     : '
-    elseif s:filewithchangetype =~ '^- '
-      let s:msgtype = 'Deletion     : '
-    endif
-    let s:bufnum = bufnr(s:RelativeFilePath)
-    if buflisted(s:bufnum) && getbufvar(s:bufnum, '&mod')
-      call s:PR_echo('Old buffer for file [' . s:RelativeFilePath . '] exists in modified state. Skipping review.', 1)
-      continue
-    endif
-    let s:tmpname = substitute(s:RelativeFilePath, '/', '_', 'g')
-    let s:tmpname = substitute(s:tmpname, '\\', '_', 'g')
-    let s:tmpname = g:patchreview_tmpdir . 'PatchReview.' . s:tmpname . '.' . strftime('%Y%m%d%H%M%S')
-    if has('win32')
-      let s:tmpname = substitute(s:tmpname, '/', '\\', 'g')
-    endif
-    if ! exists('s:patchreview_tmpfiles')
-      let s:patchreview_tmpfiles = []
-    endif
-    let s:patchreview_tmpfiles = s:patchreview_tmpfiles + [s:tmpname]
-
-    let s:filterdiffcmd = '!' . g:patchreview_filterdiff . ' -i ' . s:RelativeFilePath . ' ' . s:PatchFilePath . ' > ' . s:tmpname
-    silent! exe s:filterdiffcmd
-    if s:filewithchangetype =~ '^+ '
-      if has('win32')
-        let s:inputfile = 'nul'
-      else
-        let s:inputfile = '/dev/null'
-      endif
-    else
-      let s:inputfile = expand(s:RelativeFilePath, ':p')
-    endif
-    silent exe '!' . g:patchreview_patch . ' -o ' . s:tmpname . '.file ' . s:inputfile . ' < ' . s:tmpname
-    let s:origtabpagenr = tabpagenr()
-    silent! exe 'tabedit ' . s:RelativeFilePath
-    silent! exe 'vert diffsplit ' . s:tmpname . '.file'
-    if filereadable(s:tmpname . '.file.rej')
-      silent! exe 'topleft 5split ' . s:tmpname . '.file.rej'
-      call s:PR_echo(s:msgtype . '*** REJECTED *** ' . s:RelativeFilePath, 1)
-    else
-      call s:PR_echo(s:msgtype . ' ' . s:RelativeFilePath, 1)
-    endif
-    silent! exe 'tabn ' . s:origtabpagenr
-  endfor
-  call s:PR_echo('-----')
-  call s:PR_echo('Done.')
+  let s:reviewmode = 'diff'
+  call s:_GenericReview([outfile, strip])
   let &shortmess = s:save_shortmess
-"}}}
 endfunction
 "}}}
 
-function! <SID>PatchReviewCleanup()                                      "{{{
-  let s:retval = s:PR_GetTempDirLocation(1)
-  if s:retval && exists('g:patchreview_tmpdir') && isdirectory(g:patchreview_tmpdir) && filewritable(g:patchreview_tmpdir)
-    let s:zefilestr = globpath(g:patchreview_tmpdir, 'PatchReview.*')
-    let s:theFilesList = split(s:zefilestr, '\m[\r\n]\+')
-    for s:thefile in s:theFilesList
-      call delete(s:thefile)
-    endfor
-  endif
-endfunction
-"}}}
-
-" Commands                                                               "{{{
+" End user commands                                                         "{{{
 "============================================================================
 " :PatchReview
 command! -nargs=* -complete=file PatchReview call s:PatchReview (<f-args>)
 
-
-" :PatchReviewCleanup
-command! -nargs=0 PatchReviewCleanup call s:PatchReviewCleanup ()
-"}}}
+" :DiffReview
+command! -nargs=0 DiffReview call s:DiffReview()
 "}}}
 
-" vim: textwidth=78 nowrap tabstop=2 shiftwidth=2 softtabstop=2 expandtab
-" vim: filetype=vim encoding=latin1 fileformat=unix foldlevel=0 foldmethod=marker
+" Development                                                               "{{{
+if exists('g:patchreview_debug')
+  " Tests
+  function! <SID>PRExtractTestNative(...)
+    "let patchfiles = glob(expand(a:1) . '/?*')
+    "for fname in split(patchfiles)
+    call s:PR_wipeMsgBuf()
+    let fname = a:1
+    call s:ExtractDiffsNative(fname)
+    for patch in g:patches['patch']
+      for line in patch.content
+        Pecho line
+      endfor
+    endfor
+    "endfor
+  endfunction
+
+  function! <SID>PRExtractTestVim(...)
+    "let patchfiles = glob(expand(a:1) . '/?*')
+    "for fname in split(patchfiles)
+    call s:PR_wipeMsgBuf()
+    let fname = a:1
+    call s:ExtractDiffsPureVim(fname)
+    for patch in g:patches['patch']
+      for line in patch.content
+        Pecho line
+      endfor
+    endfor
+    "endfor
+  endfunction
+
+  command! -nargs=+ -complete=file PRTestVim call s:PRExtractTestVim(<f-args>)
+  command! -nargs=+ -complete=file PRTestNative call s:PRExtractTestNative(<f-args>)
+endif
 "}}}
+
+" modeline
+" vim: set et fdl=0 fdm=marker fenc=latin ff=unix ft=vim sw=2 sts=0 ts=2 textwidth=78 nowrap :
Binary file contrib/wix/COPYING.rtf has changed
--- a/contrib/wix/mercurial.wxs	Wed Feb 24 18:22:45 2010 +0100
+++ b/contrib/wix/mercurial.wxs	Sun Feb 28 18:06:47 2010 +0100
@@ -51,7 +51,7 @@
               <File Id='ReadMe' Name='ReadMe.html' DiskId='1' Source='contrib\win32\ReadMe.html' KeyPath='yes'/>
           </Component>
           <Component Id='COPYING' Guid='B7801DBA-1C49-4BF4-91AD-33C65F5C7895'>
-            <File Id='COPYING' Name='COPYING.rtf' DiskId='1' Source='..\misc\COPYING.rtf' />
+            <File Id='COPYING' Name='COPYING.rtf' DiskId='1' Source='contrib\wix\COPYING.rtf' />
           </Component>
           <Directory Id='HGRCD' Name='hgrc.d'>
             <Component Id='mercurial.rc' Guid='1D5FAEEE-7E6E-43B1-9F7F-802714316B15'>
@@ -115,7 +115,7 @@
     <UIRef Id="WixUI_FeatureTree" />
     <UIRef Id="WixUI_ErrorProgressText" />
 
-    <WixVariable Id="WixUILicenseRtf" Value="..\misc\COPYING.rtf" />
+    <WixVariable Id="WixUILicenseRtf" Value="contrib\wix\COPYING.rtf" />
 
     <Icon Id="hgIcon.ico" SourceFile="contrib/win32/mercurial.ico" />
 
--- a/doc/Makefile	Wed Feb 24 18:22:45 2010 +0100
+++ b/doc/Makefile	Sun Feb 28 18:06:47 2010 +0100
@@ -8,6 +8,7 @@
 PYTHON=python
 RST2HTML=$(shell which rst2html 2> /dev/null || echo rst2html.py)
 
+export LANGUAGE=C
 export LC_ALL=C
 
 all: man html
--- a/hgext/hgcia.py	Wed Feb 24 18:22:45 2010 +0100
+++ b/hgext/hgcia.py	Sun Feb 28 18:06:47 2010 +0100
@@ -197,7 +197,10 @@
 
     def sendrpc(self, msg):
         srv = xmlrpclib.Server(self.ciaurl)
-        srv.hub.deliver(msg)
+        res = srv.hub.deliver(msg)
+        if res is not True:
+            raise util.Abort(_('%s returned an error: %s') %
+                             (self.ciaurl, res))
 
     def sendemail(self, address, data):
         p = email.Parser.Parser()
--- a/hgext/progress.py	Wed Feb 24 18:22:45 2010 +0100
+++ b/hgext/progress.py	Sun Feb 28 18:06:47 2010 +0100
@@ -170,6 +170,10 @@
 sharedprog = None
 
 def uisetup(ui):
+    # Apps that derive a class from ui.ui() can use
+    # setconfig('progress', 'disable', 'True') to disable this extension
+    if ui.configbool('progress', 'disable'):
+        return
     if ui.interactive() and not ui.debugflag and not ui.quiet:
         # we instantiate one globally shared progress bar to avoid
         # competing progress bars when multiple UI objects get created
--- a/i18n/da.po	Wed Feb 24 18:22:45 2010 +0100
+++ b/i18n/da.po	Sun Feb 28 18:06:47 2010 +0100
@@ -1,6 +1,6 @@
 # Danish translations for Mercurial
 # Danske oversættelser for Mercurial
-# Copyright (C) 2009 Matt Mackall and others
+# Copyright (C) 2009, 2010 Matt Mackall and others
 #
 # Translation dictionary:
 #
@@ -17,8 +17,8 @@
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2009-12-30 03:33+0100\n"
-"PO-Revision-Date: 2009-12-30 03:38+0100\n"
+"POT-Creation-Date: 2010-02-28 17:12+0100\n"
+"PO-Revision-Date: 2010-02-28 18:06+0100\n"
 "Last-Translator:  <mg@lazybytes.net>\n"
 "Language-Team: Danish\n"
 "MIME-Version: 1.0\n"
@@ -165,6 +165,9 @@
 msgid "a bookmark cannot have the name of an existing branch"
 msgstr "et bogmærke kan ikke hedde det samme som en eksisterende gren"
 
+msgid "no bookmarks set\n"
+msgstr ""
+
 msgid "force"
 msgstr "gennemtving"
 
@@ -530,8 +533,9 @@
 msgid ""
 "colorize output from some commands\n"
 "\n"
-"This extension modifies the status command to add color to its output\n"
-"to reflect file status, the qseries command to add color to reflect\n"
+"This extension modifies the status and resolve commands to add color to "
+"their\n"
+"output to reflect file status, the qseries command to add color to reflect\n"
 "patch status (applied, unapplied, missing), and to diff-related\n"
 "commands to highlight additions, removals, diff headers, and trailing\n"
 "whitespace.\n"
@@ -569,14 +573,17 @@
 "  diff.changed = white\n"
 "  diff.trailingwhitespace = bold red_background\n"
 "\n"
+"  resolve.unresolved = red bold\n"
+"  resolve.resolved = green bold\n"
+"\n"
 "  bookmarks.current = green\n"
 msgstr ""
 "farvelæg output for nogle kommandoer\n"
 "\n"
-"Denne udvidelse ændrer status-kommandoen så den tilføjer farve til sit\n"
-"output for at afspejle filstatus, ændrer qseries-kommandoen så den\n"
-"tilføjer farve for at afspejle status for rettelsen (anvendt,\n"
-"ikke-anvendt, manglende), og ændrer diff-relaterede kommandoer så de\n"
+"Denne udvidelse ændrer status- og resolve-kommandoerne så de tilføjer\n"
+"farve til deres output for at afspejle filstatus, qseries-kommandoen\n"
+"så den tilføjer farve for at afspejle status for rettelsen (anvendt,\n"
+"ikke-anvendt, manglende), og diff-relaterede kommandoer så de\n"
 "fremhæver tilføjelser, fjernelser, diff-hoveder og mellemrum i\n"
 "slutningen af linier.\n"
 "\n"
@@ -614,6 +621,9 @@
 "  diff.changed = white\n"
 "  diff.trailingwhitespace = bold red_background\n"
 "\n"
+"  resolve.unresolved = red bold\\n\"\n"
+"  resolve.resolved = green bold\\n\"\n"
+"\n"
 "  bookmarks.current = green\n"
 
 msgid "when to colorize (always, auto, or never)"
@@ -1542,6 +1552,10 @@
 msgid "uncommitted merge - please provide a specific revision"
 msgstr "udeponeret sammenføjning - angiv venligst en specifik revision"
 
+#, python-format
+msgid "Signing %d:%s\n"
+msgstr "Underskriver: %d:%s\n"
+
 msgid "Error while signing"
 msgstr "Fejl ved underskrivning"
 
@@ -1674,6 +1688,10 @@
 msgstr ""
 
 #, python-format
+msgid "%s returned an error: %s"
+msgstr "%s returnerede en fejl: %s"
+
+#, python-format
 msgid "hgcia: sending update to %s\n"
 msgstr "hgcia: sender opdatering til %s\n"
 
@@ -2150,6 +2168,9 @@
 msgid "unhooked all commit hooks\n"
 msgstr ""
 
+msgid "hg keyword configuration and expansion example"
+msgstr ""
+
 msgid ""
 "\n"
 "\tkeywords expanded\n"
@@ -2269,6 +2290,18 @@
 "  add known patch to applied stack          qpush\n"
 "  remove patch from applied stack           qpop\n"
 "  refresh contents of top applied patch     qrefresh\n"
+"\n"
+"By default, mq will automatically use git patches when required to\n"
+"avoid losing file mode changes, copy records, binary files or empty\n"
+"files creations or deletions. This behaviour can be configured with::\n"
+"\n"
+"  [mq]\n"
+"  git = auto/keep/yes/no\n"
+"\n"
+"If set to 'keep', mq will obey the [diff] section configuration while\n"
+"preserving existing git patches upon qrefresh. If set to 'yes' or\n"
+"'no', mq will override the [diff] section and always generate git or\n"
+"regular patches, possibly losing data in the second case.\n"
 msgstr ""
 "håndter en stak af rettelser\n"
 "\n"
@@ -2293,6 +2326,24 @@
 "  anvend og put rettelse på stakken                  qpush\n"
 "  fjern rettelse fra stakken                         qpop\n"
 "  genopfrisk indholdet af den øverste rettelse       qrefresh\n"
+"\n"
+"Som udgangspunkt vil mq automatisk bruge git rettelser når det er\n"
+"nødvendigt for at undgå at miste information om ændring af\n"
+"filrettigheder, information om kopier, binære filer eller oprettelse\n"
+"og sletning af tomme filer. Dette kan konfigureres med::\n"
+"\n"
+"  [mq]\n"
+"  git = auto/keep/yes/no\n"
+"\n"
+"Hvis tilvalget er sat til 'keep', så vil mq adlyde [diff] sektionen\n"
+"samtidig med at den bevarer eksisterende git rettelser ved qrefresh.\n"
+"Hvis det sættes til 'yes' eller 'no', så vil mq ignorere [diff]\n"
+"sektionen og altid generere git eller normale rettelser, med mulighed\n"
+"for tab af data i det sidste tilfælde.\n"
+
+#, python-format
+msgid "mq.git option can be auto/keep/yes/no got %s"
+msgstr ""
 
 #, python-format
 msgid "%s appears more than once in %s"
@@ -2380,23 +2431,11 @@
 msgstr "kan ikke læse %s\n"
 
 #, python-format
-msgid "imported patch %s\n"
-msgstr "importeret rettelse %s\n"
-
-#, python-format
-msgid ""
-"\n"
-"imported patch %s"
-msgstr ""
-"\n"
-"importeret rettelse %s"
-
-#, python-format
 msgid "patch %s is empty\n"
 msgstr "rettelsen %s er tom\n"
 
 msgid "patch failed, rejects left in working dir\n"
-msgstr "rettelse fejlede, afvisninger efter efterladt i arbejdskataloget\n"
+msgstr "rettelse fejlede, afvisninger er efterladt i arbejdskataloget\n"
 
 msgid "fuzz found when applying patch, stopping\n"
 msgstr ""
@@ -2444,6 +2483,9 @@
 msgid "patch \"%s\" already exists"
 msgstr "rettelsen \"%s\" findes allerede"
 
+msgid "cannot manage merge changesets"
+msgstr "kan ikke håndtere sammenføjninger"
+
 #, python-format
 msgid "error unlinking %s\n"
 msgstr "fejl ved sletning af %s\n"
@@ -2707,21 +2749,27 @@
 "    "
 
 msgid ""
-"init a new queue repository\n"
+"init a new queue repository (DEPRECATED)\n"
 "\n"
 "    The queue repository is unversioned by default. If\n"
 "    -c/--create-repo is specified, qinit will create a separate nested\n"
 "    repository for patches (qinit -c may also be run later to convert\n"
 "    an unversioned patch repository into a versioned one). You can use\n"
-"    qcommit to commit changes to this queue repository."
-msgstr ""
-"opret et nyt kø-depot\n"
+"    qcommit to commit changes to this queue repository.\n"
+"\n"
+"    This command is deprecated. Without -c, it's implied by other relevant\n"
+"    commands. With -c, use hg init -Q instead."
+msgstr ""
+"opret et nyt kø-depot (FORÆLDET)\n"
 "\n"
 "    Kø-depotet er uversioneret som standard. Hvis -c/--create-repo\n"
 "    bruges, så vil qinit oprettet et separat indlejret depot til\n"
 "    patches (qinit -c kan også bruges senere for at konvertere et\n"
 "    uversioneret patch depot til et versioneret et). Du kan bruge\n"
-"    qcommit for at deponere ændringer i dette kø-depot."
+"    qcommit for at deponere ændringer i dette kø-depot.\n"
+"\n"
+"    Denne kommando er forældet. Uden -c er den kommandoen ikke\n"
+"    nødvendig, med -c bør hg init -Q bruges i stedet."
 
 msgid ""
 "clone main and patch repository at same time\n"
@@ -2755,8 +2803,11 @@
 msgid "updating destination repository\n"
 msgstr "opdaterer destinationsdepotet\n"
 
-msgid "commit changes in the queue repository"
-msgstr "deponerer ændringer i kødepotet"
+msgid ""
+"commit changes in the queue repository (DEPRECATED)\n"
+"\n"
+"    This command is deprecated; use hg -Q commit instead."
+msgstr ""
 
 msgid "print the entire series file"
 msgstr "udskriver hele series filen"
@@ -2909,7 +2960,7 @@
 "\n"
 "    To set guards on another patch::\n"
 "\n"
-"      hg qguard -- other.patch +2.6.17 -stable\n"
+"      hg qguard other.patch -- +2.6.17 -stable\n"
 "    "
 msgstr ""
 "sæt eller vis filtre for en rettelse\n"
@@ -2927,7 +2978,7 @@
 "\n"
 "    For at sætte filtre på en anden rettelse::\n"
 "\n"
-"      hg qguard -- other.patch +2.6.17 -stable\n"
+"      hg qguard other.patch -- +2.6.17 -stable\n"
 "    "
 
 msgid "cannot mix -l/--list with options or arguments"
@@ -3001,11 +3052,21 @@
 msgid "A patch named %s already exists in the series file"
 msgstr "En rettelse ved navn %s eksisterer allerede i serien"
 
-msgid "restore the queue state saved by a revision"
-msgstr ""
-
-msgid "save current queue state"
-msgstr "gem tilstanden for den nuværende kø"
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr "omdøber %s til %s\n"
+
+msgid ""
+"restore the queue state saved by a revision (DEPRECATED)\n"
+"\n"
+"    This command is deprecated, use rebase --mq instead."
+msgstr ""
+
+msgid ""
+"save current queue state (DEPRECATED)\n"
+"\n"
+"    This command is deprecated, use rebase --mq instead."
+msgstr ""
 
 #, python-format
 msgid "destination %s exists and is not a directory"
@@ -3174,6 +3235,9 @@
 msgid "cannot import over an applied patch"
 msgstr "kan ikke importere henover en anvendt rettelse"
 
+msgid "operate on patch repository"
+msgstr "arbejd på rettelsesdepot"
+
 msgid "print first line of patch header"
 msgstr "udskriv første linie i rettelsens hoved"
 
@@ -3234,8 +3298,8 @@
 msgid "drop all guards"
 msgstr "drop alle filtre"
 
-msgid "hg qguard [-l] [-n] -- [PATCH] [+GUARD]... [-GUARD]..."
-msgstr "hg qguard [-l] [-n] -- [RETTELSE] [+VAGT]... [-VAGT]..."
+msgid "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
+msgstr "hg qguard [-l] [-n] [RETTELSE] [-- [+VAGT]... [-VAGT]...]"
 
 msgid "hg qheader [PATCH]"
 msgstr "hg qheader [RETTELSE]"
@@ -3267,8 +3331,8 @@
 msgid "hg qinit [-c]"
 msgstr "hg qinit [-c]"
 
-msgid "import uncommitted changes into patch"
-msgstr "importer ikke-deponerede ændringer ind i rettelse"
+msgid "import uncommitted changes (DEPRECATED)"
+msgstr "importer udeponerede ændringer (FORÆLDET)"
 
 msgid "add \"From: <current user>\" to patch"
 msgstr "tilføj \"From: <aktuel bruger>\" til rettelsen"
@@ -3294,7 +3358,7 @@
 msgid "pop all patches"
 msgstr "fjern alle rettelser"
 
-msgid "queue name to pop"
+msgid "queue name to pop (DEPRECATED)"
 msgstr ""
 
 msgid "forget any local changes to patched files"
@@ -3312,11 +3376,11 @@
 msgid "apply all patches"
 msgstr "anvend alle rettelser"
 
-msgid "merge from another queue"
-msgstr ""
-
-msgid "merge queue name"
-msgstr ""
+msgid "merge from another queue (DEPRECATED)"
+msgstr "sammenføj med en anden kø (FORÆLDET)"
+
+msgid "merge queue name (DEPRECATED)"
+msgstr "sammenføj med navngiven kø (FORÆLDET)"
 
 msgid "hg qpush [-f] [-l] [-a] [-m] [-n NAME] [PATCH | INDEX]"
 msgstr "hg qpush [-f] [-l] [-a] [-m] [-n NAVN] [RETTELSE | INDEKS]"
@@ -3618,6 +3682,9 @@
 "  cc = cc1, cc2, ...\n"
 "  bcc = bcc1, bcc2, ...\n"
 "\n"
+"Use ``[patchbomb]`` as configuration section name if you need to\n"
+"override global ``[email]`` address settings.\n"
+"\n"
 "Then you can use the \"hg email\" command to mail a series of changesets\n"
 "as a patchbomb.\n"
 "\n"
@@ -3827,6 +3894,30 @@
 msgid "hg email [OPTION]... [DEST]..."
 msgstr "hg email [TILVALG]... [MÅL]..."
 
+msgid ""
+"show progress bars for some actions\n"
+"\n"
+"This extension uses the progress information logged by hg commands\n"
+"to draw progress bars that are as informative as possible. Some progress\n"
+"bars only offer indeterminate information, while others have a definite\n"
+"end point.\n"
+"\n"
+"The following settings are available::\n"
+"\n"
+"  [progress]\n"
+"  delay = 3 # number of seconds (float) before showing the progress bar\n"
+"  refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
+"  format = topic bar number # format of the progress bar\n"
+"  width = <none> # if set, the maximum width of the progress information\n"
+"                 # (that is, min(width, term width) will be used)\n"
+"  clear-complete = True # clear the progress bar after it's done\n"
+"\n"
+"Valid entries for the format field are topic, bar, number, unit, and\n"
+"item. item defaults to the last 20 characters of the item, but this\n"
+"can be changed by adding either ``-<num>`` which would take the last\n"
+"num characters, or ``+<num>`` for the first num characters.\n"
+msgstr ""
+
 msgid "command to delete untracked files from the working directory"
 msgstr "kommando til at slette filer fra arbejdskataloget som ikke følges"
 
@@ -3924,18 +4015,34 @@
 msgid "cannot use collapse with continue or abort"
 msgstr "continue eller abort kan ikke angives samtidig med collapse"
 
+msgid "cannot use detach with continue or abort"
+msgstr "continue eller abort kan ikke angives samtidig med detach"
+
 msgid "abort and continue do not allow specifying revisions"
 msgstr "abort og continue tillader ikke at der angives revisioner"
 
 msgid "cannot specify both a revision and a base"
 msgstr "man kan ikke angive både en revision og en basis"
 
+msgid "detach requires a revision to be specified"
+msgstr "der skal angives en revision til detach"
+
+msgid "cannot specify a base with detach"
+msgstr "kan ikke angive --rev og --change på samme tid"
+
 msgid "nothing to rebase\n"
 msgstr ""
 
 msgid "cannot use both keepbranches and extrafn"
 msgstr "man kan ikke bruge både keepbranches og extrafn"
 
+msgid "fix unresolved conflicts with hg resolve then run hg rebase --continue"
+msgstr "ret uløste konflikter med hg resolve og kør så hg rebase --continue"
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr "ingen ændringer, revision %d sprunget over\n"
+
 msgid "rebase merging completed\n"
 msgstr ""
 
@@ -3949,12 +4056,8 @@
 msgid "%d revisions have been skipped\n"
 msgstr "sprang %d revisioner over\n"
 
-msgid "fix unresolved conflicts with hg resolve then run hg rebase --continue"
-msgstr "ret uløste konflikter med hg resolve og kør så hg rebase --continue"
-
-#, python-format
-msgid "no changes, revision %d skipped\n"
-msgstr "ingen ændringer, revision %d sprunget over\n"
+msgid "unable to collapse, there is more than one external parent"
+msgstr ""
 
 #, python-format
 msgid "cannot use revision %d as base, result would have 3 parents"
@@ -3978,9 +4081,6 @@
 msgid "source is descendant of destination"
 msgstr "kilden nedstammer fra destinationen"
 
-msgid "unable to collapse, there is more than one external parent"
-msgstr ""
-
 msgid "rebase working directory to branch head"
 msgstr ""
 
@@ -4002,6 +4102,9 @@
 msgid "keep original branch names"
 msgstr "behold originale grennavne"
 
+msgid "force detaching of source from its original branch"
+msgstr ""
+
 msgid "continue an interrupted rebase"
 msgstr ""
 
@@ -4009,11 +4112,9 @@
 msgstr ""
 
 msgid ""
-"hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--keep] [--keepbranches] "
-"| [-c] | [-a]"
-msgstr ""
-"hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--keep] [--keepbranches] "
-"| [-c] | [-a]"
+"hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--detach] [--keep] [--"
+"keepbranches] | [-c] | [-a]"
+msgstr "hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--detach] [--keep] [--keepbranches] | [-c] | [-a]"
 
 msgid "commands to interactively select changes for commit/qrefresh"
 msgstr ""
@@ -4172,6 +4273,9 @@
 "    "
 msgstr ""
 
+msgid "hardlinks are not supported on this system"
+msgstr "Hårde lænker er ikke supporteret på dette system"
+
 #, python-format
 msgid "relinking %s to %s\n"
 msgstr ""
@@ -4250,8 +4354,15 @@
 "    Initialize a new repository and working directory that shares its\n"
 "    history with another repository.\n"
 "\n"
-"    NOTE: actions that change history such as rollback or moving the\n"
-"    source may confuse sharers.\n"
+"    NOTE: using rollback or extensions that destroy/modify history\n"
+"    (mq, rebase, etc.) can cause considerable confusion with shared\n"
+"    clones. In particular, if two shared clones are both updated to\n"
+"    the same changeset, and one of them destroys that changeset with\n"
+"    rollback, the other clone will suddenly stop working: all\n"
+"    operations will fail with \"abort: working directory has unknown\n"
+"    parent\". The only known workaround is to use debugsetparents on\n"
+"    the broken clone to reset it to a changeset that still exists\n"
+"    (e.g. tip).\n"
 "    "
 msgstr ""
 
@@ -4317,9 +4428,22 @@
 msgid "commit failed"
 msgstr "deponering fejlede"
 
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+
 msgid "apply changeset? [ynmpcq?]:"
 msgstr ""
 
+msgid "no such option\n"
+msgstr "tilvalget findes ikke\n"
+
 msgid ""
 "transplant changesets from another branch\n"
 "\n"
@@ -4580,6 +4704,10 @@
 msgid "username %s contains a newline"
 msgstr "brugernavn %s indeholder et linieskift"
 
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr "navnet '%s' er reserveret"
+
 msgid "options --message and --logfile are mutually exclusive"
 msgstr ""
 
@@ -4670,6 +4798,9 @@
 msgid "(consider using --after)\n"
 msgstr "(overvej at bruge --after)\n"
 
+msgid "child process failed to start"
+msgstr ""
+
 #, python-format
 msgid "changeset:   %d:%s\n"
 msgstr "ændring:     %d:%s\n"
@@ -4798,6 +4929,20 @@
 "    undo an add before that, see hg forget.\n"
 "\n"
 "    If no names are given, add all files to the repository.\n"
+"\n"
+"    .. container:: verbose\n"
+"\n"
+"       An example showing how new (unknown) files are added\n"
+"       automatically by ``hg add``::\n"
+"\n"
+"         $ ls\n"
+"         foo.c\n"
+"         $ hg status\n"
+"         ? foo.c\n"
+"         $ hg add\n"
+"         adding foo.c\n"
+"         $ hg status\n"
+"         A foo.c\n"
 "    "
 msgstr ""
 "tilføj de angivne filer ved næste deponering\n"
@@ -4809,6 +4954,20 @@
 "\n"
 "    Hvis der ikke er angivet nogen navne tilføjes alle filer til\n"
 "    depotet.\n"
+"\n"
+"    .. container:: verbose\n"
+"\n"
+"       An example showing how new (unknown) files are added\n"
+"       automatically by ``hg add``::\n"
+"\n"
+"         $ ls\n"
+"         foo.c\n"
+"         $ hg status\n"
+"         ? foo.c\n"
+"         $ hg add\n"
+"         adding foo.c\n"
+"         $ hg status\n"
+"         A foo.c\n"
 "    "
 
 msgid ""
@@ -5153,8 +5312,8 @@
 "    Generate a compressed changegroup file collecting changesets not\n"
 "    known to be in another repository.\n"
 "\n"
-"    If no destination repository is specified the destination is\n"
-"    assumed to have all the nodes specified by one or more --base\n"
+"    If you omit the destination repository, then hg assumes the\n"
+"    destination will have all the nodes you specify with --base\n"
 "    parameters. To create a bundle containing all changesets, use\n"
 "    -a/--all (or --base null).\n"
 "\n"
@@ -5235,7 +5394,9 @@
 "\n"
 "    a) the changeset, tag or branch specified with -u/--updaterev\n"
 "    b) the changeset, tag or branch given with the first -r/--rev\n"
-"    c) the head of the default branch\n"
+"    c) the branch given with the first -b/--branch\n"
+"    d) the branch given with the url#branch source syntax\n"
+"    e) the head of the default branch\n"
 "\n"
 "    Use 'hg clone -u . src dst' to checkout the source repository's\n"
 "    parent changeset (applicable for local source repositories only).\n"
@@ -5297,7 +5458,9 @@
 "       -u/--updaterev\n"
 "    b) ændringen, mærkaten eller grenen angivet med den første\n"
 "       -r/--rev\n"
-"    c) hovedet af default grenen\n"
+"    c) grenen angivet med det første -b/--branch tilvalg\n"
+"    d) grenen angivet ved url#gren syntaksen\n"
+"    e) hovedet af default grenen\n"
 "\n"
 "    Brug 'hg clone -u . kilde destination' for at hente ændringen i\n"
 "    kildedepotet ud i destinations depotet (kan kun anvendes ved\n"
@@ -5592,6 +5755,9 @@
 "    revisions are specified, the working directory files are compared\n"
 "    to its parent.\n"
 "\n"
+"    Alternatively you can specify -c/--change with a revision to see\n"
+"    the changes in that changeset relative to its first parent.\n"
+"\n"
 "    Without the -a/--text option, diff will avoid generating diffs of\n"
 "    files it detects as binary. With -a, diff will generate a diff\n"
 "    anyway, probably with undesirable results.\n"
@@ -5616,6 +5782,9 @@
 "    denne revision med arbejdskataloget, og når der ikke angives nogen\n"
 "    revisioner, så sammenlignes arbejdskataloget med dennes forælder.\n"
 "\n"
+"    Du kan alternativt angive -c/--change med en revision for at se\n"
+"    ændringerne i den revision relativt til dens første forælder.\n"
+"\n"
 "    Uden -a/--text tilvalget vil diff undgå at generere ændringer for\n"
 "    filer som den detekterer som binære. Med -a vil diff generere\n"
 "    ændringer alligevel, sandsynligvis med uønskede resultater.\n"
@@ -5629,8 +5798,9 @@
 "\n"
 "    Print the changeset header and diffs for one or more revisions.\n"
 "\n"
-"    The information shown in the changeset header is: author,\n"
-"    changeset hash, parent(s) and commit comment.\n"
+"    The information shown in the changeset header is: author, date,\n"
+"    branch name (if non-default), changeset hash, parent(s) and commit\n"
+"    comment.\n"
 "\n"
 "    NOTE: export may generate unexpected diff output for merge\n"
 "    changesets, as it will compare the merge changeset against its\n"
@@ -5664,8 +5834,9 @@
 "    Udskriv ændrings-hovedet og ændringerne for en eller flere\n"
 "    revisioner.\n"
 "\n"
-"    Informationen som vises i ændrings-hovedet er: forfatter,\n"
-"    ændringshash, forældrene og deponeringsbeskeden.\n"
+"    Informationen som vises i ændrings-hovedet er: forfatter, dato,\n"
+"    grennavn (hvis forskellig fra default), ændringshash, forældrene\n"
+"    og deponeringsbeskeden.\n"
 "\n"
 "    BEMÆRK: export kan generere uventet diff uddata for\n"
 "    sammenføjningsændringer idet den kun vil sammenligne\n"
@@ -5761,44 +5932,35 @@
 msgid ""
 "show current repository heads or show branch heads\n"
 "\n"
-"    With no arguments, show all repository head changesets.\n"
+"    With no arguments, show all repository branch heads.\n"
 "\n"
 "    Repository \"heads\" are changesets with no child changesets. They are\n"
 "    where development generally takes place and are the usual targets\n"
-"    for update and merge operations.\n"
-"\n"
-"    If one or more REV is given, the \"branch heads\" will be shown for\n"
-"    the named branch associated with the specified changeset(s).\n"
-"\n"
-"    Branch heads are changesets on a named branch with no descendants on\n"
-"    the same branch. A branch head could be a \"true\" (repository) head,\n"
-"    or it could be the last changeset on that branch before it was\n"
-"    merged into another branch, or it could be the last changeset on the\n"
-"    branch before a new branch was created. If none of the branch heads\n"
-"    are true heads, the branch is considered inactive.\n"
+"    for update and merge operations. Branch heads are changesets that have\n"
+"    no child changeset on the same branch.\n"
+"\n"
+"    If one or more REVs are given, only branch heads on the branches\n"
+"    associated with the specified changesets are shown.\n"
 "\n"
 "    If -c/--closed is specified, also show branch heads marked closed\n"
 "    (see hg commit --close-branch).\n"
 "\n"
 "    If STARTREV is specified, only those heads that are descendants of\n"
 "    STARTREV will be displayed.\n"
-"    "
-msgstr ""
-
-msgid "you must specify a branch to use --closed"
-msgstr ""
-
-#, python-format
-msgid "no open branch heads on branch %s\n"
-msgstr "ingen åbne gren-hoveder på gren %s\n"
-
-#, python-format
-msgid "no changes on branch %s containing %s are reachable from %s\n"
-msgstr "ingen ændringer på gren %s som indeholder %s kan nås fra %s\n"
-
-#, python-format
-msgid "no changes on branch %s are reachable from %s\n"
-msgstr "ingen ændringer på gren %s kan nås fra %s\n"
+"\n"
+"    If -t/--topo is specified, named branch mechanics will be ignored and "
+"only\n"
+"    changesets without children will be shown.\n"
+"    "
+msgstr ""
+
+#, python-format
+msgid "no open branch heads found on branches %s"
+msgstr "fandt ingen åbne gren-hoveder på grenene %s"
+
+#, python-format
+msgid " (started at %s)"
+msgstr " (startet ved %s)"
 
 msgid ""
 "show help for a given topic or a help overview\n"
@@ -5846,6 +6008,12 @@
 msgid "(no help text available)"
 msgstr "(ingen hjælpetekst tilgængelig)"
 
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show verbose help\n"
+msgstr "\nbrug \"hg -v help %s\" for at se udførlig hjælp\n"
+
 msgid "options:\n"
 msgstr "valgmuligheder:\n"
 
@@ -5863,6 +6031,13 @@
 "%s udvidelse - %s\n"
 "\n"
 
+msgid "use \"hg help extensions\" for information on enabling extensions\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' is provided by the following extension:"
+msgstr ""
+
 msgid "Mercurial Distributed SCM\n"
 msgstr "Mercurial Distribueret SCM\n"
 
@@ -5940,11 +6115,8 @@
 "    "
 msgstr ""
 
-msgid "applying patch from stdin\n"
-msgstr "anvender rettelse fra standardinddata\n"
-
-msgid "no diffs found"
-msgstr "fandt ingen ændringer"
+msgid "to working directory"
+msgstr "til arbejdskatalog"
 
 msgid "not a Mercurial patch"
 msgstr "ikke en Mercurial patch"
@@ -5952,6 +6124,16 @@
 msgid "patch is damaged or loses information"
 msgstr "rettelsen er beskadiget eller mister information"
 
+msgid "applying patch from stdin\n"
+msgstr "anvender rettelse fra standardinddata\n"
+
+#, python-format
+msgid "applied %s\n"
+msgstr "anvendte %s\n"
+
+msgid "no diffs found"
+msgstr "fandt ingen ændringer"
+
 msgid ""
 "show new changesets found in source\n"
 "\n"
@@ -6113,13 +6295,18 @@
 "    "
 
 #, python-format
-msgid "branch '%s' has %d heads - please merge with an explicit rev"
-msgstr ""
-"gren '%s' har %d hoveder - sammenføj venligst med en eksplicit revision"
-
-#, python-format
-msgid "branch '%s' has one head - please merge with an explicit rev"
-msgstr "gren '%s' har et hoved - sammenføj venligst med en eksplicit revision"
+msgid "abort: branch '%s' has %d heads - please merge with an explicit rev\n"
+msgstr "afbrudt: gren '%s' har %d hoveder - sammenføj venligst med en eksplicit revision\n"
+
+msgid "(run 'hg heads .' to see heads)\n"
+msgstr "(kør 'hg heads .' for at se hoveder)\n"
+
+#, python-format
+msgid "abort: branch '%s' has one head - please merge with an explicit rev\n"
+msgstr "afbrudt: gren '%s' har et hoved - sammenføj venligst med en eksplicit revision\n"
+
+msgid "(run 'hg heads' to see all heads)\n"
+msgstr "(kør 'hg heads' for at se alle hoveder)\n"
 
 msgid "there is nothing to merge"
 msgstr "der er ikke noget at sammenføje"
@@ -6136,13 +6323,13 @@
 "sammenføj med en eksplicit revision"
 
 msgid ""
-"show changesets not found in destination\n"
+"show changesets not found in the destination\n"
 "\n"
 "    Show changesets not found in the specified destination repository\n"
 "    or the default push location. These are the changesets that would\n"
 "    be pushed if a push was requested.\n"
 "\n"
-"    See pull for valid destination format details.\n"
+"    See pull for details of valid destination formats.\n"
 "    "
 msgstr ""
 
@@ -6237,7 +6424,7 @@
 msgid ""
 "push changes to the specified destination\n"
 "\n"
-"    Push changes from the local repository to the given destination.\n"
+"    Push changes from the local repository to the specified destination.\n"
 "\n"
 "    This is the symmetrical operation for pull. It moves changes from\n"
 "    the current repository to a different one. If the destination is\n"
@@ -6257,7 +6444,8 @@
 msgstr ""
 "skub ændringer til den angivne destination\n"
 "\n"
-"    Skubber ændringer fra det lokale depot til den givne destination.\n"
+"    Skubber ændringer fra det lokale depot til den angivne\n"
+"    destination.\n"
 "\n"
 "    Dette er den symmetriske operation for pull. Den flytter ændringer\n"
 "    fra det nuværende depot til et andet. Hvis destinationen er lokal,\n"
@@ -6387,7 +6575,7 @@
 "    will be overwritten if the merge is retried with resolve. The\n"
 "    -m/--mark switch should be used to mark the file as resolved.\n"
 "\n"
-"    You can specify a set of files to operate on, or use the -a/-all\n"
+"    You can specify a set of files to operate on, or use the -a/--all\n"
 "    switch to select all unresolved files.\n"
 "\n"
 "    This command also allows listing resolved files and manually\n"
@@ -6422,8 +6610,8 @@
 "    to the contents they had in the parent of the working directory.\n"
 "    This restores the contents of the affected files to an unmodified\n"
 "    state and unschedules adds, removes, copies, and renames. If the\n"
-"    working directory has two parents, you must explicitly specify the\n"
-"    revision to revert to.\n"
+"    working directory has two parents, you must explicitly specify a\n"
+"    revision.\n"
 "\n"
 "    Using the -r/--rev option, revert the given files or directories\n"
 "    to their contents as of a specific revision. This can be helpful\n"
@@ -6496,7 +6684,7 @@
 "    - commit\n"
 "    - import\n"
 "    - pull\n"
-"    - push (with this repository as destination)\n"
+"    - push (with this repository as the destination)\n"
 "    - unbundle\n"
 "\n"
 "    This command is not intended for use on public repositories. Once\n"
@@ -6728,10 +6916,6 @@
 msgid "tag names must be unique"
 msgstr "mærkatnavne skal være unikke"
 
-#, python-format
-msgid "the name '%s' is reserved"
-msgstr "navnet '%s' er reserveret"
-
 msgid "--rev and --remove are incompatible"
 msgstr "--rev og --remove er inkompatible"
 
@@ -6919,8 +7103,8 @@
 msgid "enable additional output"
 msgstr "aktiver yderlig output"
 
-msgid "set/override config option"
-msgstr "sæt/overskriv konfigurationopsætning"
+msgid "set/override config option (use 'section.name=value')"
+msgstr "angiv eller overskriv tilvalg (brug 'sektion.navn=værdi')"
 
 msgid "enable debugging output"
 msgstr "aktiver fejlsøgningsinformation"
@@ -6988,7 +7172,7 @@
 msgid "treat all files as text"
 msgstr "behandl alle filer som tekst"
 
-msgid "don't include dates in diff headers"
+msgid "omit dates from diff headers"
 msgstr "inkluder ikke datoer i diff-hoveder"
 
 msgid "show which function each change is in"
@@ -7021,12 +7205,18 @@
 msgid "annotate the specified revision"
 msgstr "annotér den angivne revision"
 
-msgid "follow file copies and renames"
-msgstr "følg kopier og omdøbninger"
+msgid "follow copies and renames (DEPRECATED)"
+msgstr "følg kopier og omdøbninger (FORÆLDET)"
+
+msgid "don't follow copies and renames"
+msgstr "følg ikke kopier og omdøbninger"
 
 msgid "list the author (long with -v)"
 msgstr "vis forfatteren (lang med -v)"
 
+msgid "list the filename"
+msgstr "vis filnavnet"
+
 msgid "list the date (short with -q)"
 msgstr "vis datoen (kort med -q)"
 
@@ -7108,13 +7298,16 @@
 msgid "[-ac]"
 msgstr "[-ac]"
 
-msgid "run even when remote repository is unrelated"
+msgid "run even when the destination is unrelated"
 msgstr "kør selv hvis fjerndepotet er urelateret"
 
-msgid "a changeset up to which you would like to bundle"
-msgstr ""
-
-msgid "a base changeset to specify instead of a destination"
+msgid "a changeset intended to be added to the destination"
+msgstr ""
+
+msgid "a specific branch you would like to bundle"
+msgstr "en bestemt gren som du gerne vil pakke sammen"
+
+msgid "a base changeset assumed to be available at the destination"
 msgstr ""
 
 msgid "bundle all changesets in the repository"
@@ -7138,14 +7331,17 @@
 msgid "[OPTION]... FILE..."
 msgstr "[TILVALG]... FIL..."
 
-msgid "the clone will only contain a repository (no working copy)"
-msgstr "klonen vil kun indeholde et depot (intet arbejdsbibliotek)"
+msgid "the clone will include an empty working copy (only a repository)"
+msgstr "klonen vil indeholde et tomt arbejdsbibliotek (kun et depot)"
 
 msgid "revision, tag or branch to check out"
 msgstr "revision, mærkat eller gren som skal hentes ud"
 
-msgid "clone only the specified revisions and ancestors"
-msgstr "klon kun de specificerede revisioner og deres forfædre"
+msgid "include the specified changeset"
+msgstr "inkluder den angivne revision"
+
+msgid "clone only the specified branch"
+msgstr "klon kun den angivne gren"
 
 msgid "[OPTION]... SOURCE [DEST]"
 msgstr "[TILVALG]... KILDE [MÅL]"
@@ -7216,8 +7412,8 @@
 msgid "revision to check"
 msgstr "revision som skal undersøges"
 
-msgid "[OPTION]... [-r REV1 [-r REV2]] [FILE]..."
-msgstr "[TILVALG]... [-r REV1 [-r REV2]] [FIL]..."
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr "[TILVALG]... ([-c REV] | [-r REV1 [-r REV2]]) [FIL]..."
 
 msgid "diff against the second parent"
 msgstr "find forskelle i forhold til den anden forældre"
@@ -7255,8 +7451,11 @@
 msgid "show only heads which are descendants of REV"
 msgstr "vis kun hoveder som er efterkommere af REV"
 
-msgid "show only the active branch heads from open branches"
-msgstr "vis kun de aktive grenhoveder fra åbne grene"
+msgid "show topological heads only"
+msgstr ""
+
+msgid "show active branchheads only [DEPRECATED]"
+msgstr "vis kun aktive gren-hoveder (FORÆLDET)"
 
 msgid "show normal and closed branch heads"
 msgstr "vis normale og lukkede grenhoveder"
@@ -7308,14 +7507,20 @@
 msgid "[OPTION]... PATCH..."
 msgstr "[TILVALG]... RETTELSE..."
 
+msgid "run even if remote repository is unrelated"
+msgstr "kør selv hvis fjerndepotet er urelateret"
+
 msgid "show newest record first"
 msgstr "vis nyeste postering først"
 
 msgid "file to store the bundles into"
 msgstr "fil hvor bundterne skal gemmes"
 
-msgid "a specific remote revision up to which you would like to pull"
-msgstr "en specifik revision op til hvilken du gerne vil trække"
+msgid "a remote changeset intended to be added"
+msgstr ""
+
+msgid "a specific branch you would like to pull"
+msgstr "en bestemt gren du gerne vil hive ned"
 
 msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
 msgstr "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILNAVN] [KILDE]"
@@ -7323,7 +7528,7 @@
 msgid "[-e CMD] [--remotecmd CMD] [DEST]"
 msgstr "[-e KOMMANDO] [--remotecmd KOMMANDO] [MÅL]"
 
-msgid "search the repository as it stood at REV"
+msgid "search the repository as it is in REV"
 msgstr ""
 
 msgid "end filenames with NUL, for use with xargs"
@@ -7383,13 +7588,16 @@
 msgid "[-P] [-f] [[-r] REV]"
 msgstr "[-P] [-f] [[-r] REV]"
 
-msgid "a specific revision up to which you would like to push"
-msgstr ""
+msgid "a changeset intended to be included in the destination"
+msgstr ""
+
+msgid "a specific branch you would like to push"
+msgstr "en bestemt gren du gerne vil skubbe ud"
 
 msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
 msgstr "[-M] [-p] [-n] [-f] [-r REV]... [MÅL]"
 
-msgid "show parents from the specified revision"
+msgid "show parents of the specified revision"
 msgstr "vis forældre for den angivne revision"
 
 msgid "[-r REV] [FILE]"
@@ -7398,8 +7606,11 @@
 msgid "[NAME]"
 msgstr "[NAVN]"
 
-msgid "update to new tip if changesets were pulled"
-msgstr "opdater til den nye spids hvis ændringer blev trukket ned"
+msgid "update to new branch head if changesets were pulled"
+msgstr "opdater til det nye gren-hovede hvis ændringer blev trukket ned"
+
+msgid "run even when remote repository is unrelated"
+msgstr "kør selv hvis fjerndepotet er urelateret"
 
 msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
 msgstr "[-u] [-f] [-r REV]... [-e KOMMANDO] [--remotecmd KOMMANDO] [KILDE]"
@@ -7443,8 +7654,8 @@
 msgid "tipmost revision matching date"
 msgstr ""
 
-msgid "revision to revert to"
-msgstr "revision der skal føres tilbage til"
+msgid "revert to the specified revision"
+msgstr "vend tilbage til den angivne revision"
 
 msgid "do not save backup copies of files"
 msgstr "gem ikke sikkerhedskopier af filer"
@@ -7548,8 +7759,8 @@
 msgid "[-p] [-g]"
 msgstr "[-p] [-g]"
 
-msgid "update to new tip if changesets were unbundled"
-msgstr "opdater til ny spids hvis ændringer blev pakket ud"
+msgid "update to new branch head if changesets were unbundled"
+msgstr "opdater til nyt gren-hoved hvis ændringer blev pakket ud"
 
 msgid "[-u] FILE..."
 msgstr "[-u] FIL..."
@@ -8115,6 +8326,16 @@
 "    - if it's a directory, all files ending with .rc are added\n"
 "    - otherwise, the file itself will be added\n"
 "\n"
+"HGPLAIN\n"
+"    When set, this disables any options in .hgrc that might change\n"
+"    Mercurial's default output. This includes encoding, defaults,\n"
+"    verbose mode, debug mode, quiet mode, tracebacks, and\n"
+"    localization. This can be useful when scripting against Mercurial\n"
+"    in the face of existing user configuration.\n"
+"\n"
+"    Equivalent options set via command line flags or environment\n"
+"    variables are not overridden.\n"
+"\n"
 "HGUSER\n"
 "    This is the string used as the author of a commit. If not set,\n"
 "    available values will be considered in this order:\n"
@@ -8542,6 +8763,9 @@
 "  prefer it over 'default' if both are defined.\n"
 msgstr ""
 
+msgid "dirstate branch not accessible"
+msgstr ""
+
 msgid "can only share local repositories"
 msgstr "kan kun dele lokale depoter"
 
@@ -8713,6 +8937,9 @@
 msgid "push failed (unexpected response):"
 msgstr "skub fejlede (uventet svar):"
 
+msgid "remote: "
+msgstr "fjernsystem: "
+
 #, python-format
 msgid "push failed: %s"
 msgstr "skub fejlede: %s"
@@ -8867,6 +9094,12 @@
 msgid "searching for changes\n"
 msgstr "leder efter ændringer\n"
 
+msgid "queries"
+msgstr ""
+
+msgid "searching"
+msgstr "søger"
+
 msgid "already have changeset "
 msgstr "har allerede ændringen "
 
@@ -8885,8 +9118,8 @@
 msgstr ""
 
 #, python-format
-msgid "abort: push creates new remote branch '%s'!\n"
-msgstr "afbrudt: skub laver ny gren '%s' i fjerndepotet!\n"
+msgid "abort: push creates new remote heads on branch '%s'!\n"
+msgstr "afbrudt: skub laver nye hoveder på grenen '%s'!\n"
 
 msgid "abort: push creates new remote heads!\n"
 msgstr "afbrudt: skub laver nye fjern-hoveder!\n"
@@ -8894,6 +9127,16 @@
 msgid "(did you forget to merge? use push -f to force)\n"
 msgstr "(glemte du at sammenføje? brug push -f for at gennemtvinge)\n"
 
+msgid "(you should pull and merge or use push -f to force)\n"
+msgstr "(du skal hive og sammenføje eller bruge -f for at gennemtvinge)\n"
+
+#, python-format
+msgid "abort: push creates new remote branches: %s!\n"
+msgstr "afbrudt: skub laver nye grene i fjerndepotet: %s!\n"
+
+msgid "(use 'hg push -f' to force)\n"
+msgstr "(brug push -f for at gennemtvinge)\n"
+
 msgid "note: unsynced remote changes!\n"
 msgstr "bemærk: usynkroniserede ændringer i fjernsystemet!\n"
 
@@ -8901,25 +9144,50 @@
 msgid "%d changesets found\n"
 msgstr "fandt %d ændringer\n"
 
+msgid "bundle changes"
+msgstr ""
+
+msgid "chunks"
+msgstr ""
+
+msgid "bundle manifests"
+msgstr ""
+
 #, python-format
 msgid "empty or missing revlog for %s"
 msgstr "tom eller manglende revlog for %s"
 
+msgid "bundle files"
+msgstr ""
+
 msgid "adding changesets\n"
 msgstr "tilføjer ændringer\n"
 
+msgid "changesets"
+msgstr "ændringer"
+
 msgid "received changelog group is empty"
 msgstr "modtagen changelog-gruppe er tom"
 
 msgid "adding manifests\n"
 msgstr "tilføjer manifester\n"
 
+msgid "manifests"
+msgstr "manifester"
+
 msgid "adding file changes\n"
 msgstr "tilføjer filændringer\n"
 
 msgid "received file revlog group is empty"
 msgstr ""
 
+msgid "files"
+msgstr "filer"
+
+#, python-format
+msgid "missing file data for %s:%s - run hg verify"
+msgstr ""
+
 #, python-format
 msgid " (%+d heads)"
 msgstr " (%+d hoveder)"
@@ -9117,11 +9385,11 @@
 msgstr "filen %s eksisterer allerede\n"
 
 #, python-format
-msgid "Hunk #%d succeeded at %d %s(offset %d line).\n"
-msgstr ""
-
-#, python-format
-msgid "Hunk #%d succeeded at %d %s(offset %d lines).\n"
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
 msgstr ""
 
 #, python-format
@@ -9193,6 +9461,9 @@
 msgid "unknown compression type %r"
 msgstr "ukendt kompressionstype %r"
 
+msgid "index entry flags need RevlogNG"
+msgstr ""
+
 #, python-format
 msgid "index %s unknown flags %#04x for format v0"
 msgstr "indeks %s ukendt flag %#04x for format v0"
@@ -9252,9 +9523,6 @@
 msgid "no suitable response from remote hg"
 msgstr "intet brugbart svar fra fjernsystemets hg"
 
-msgid "remote: "
-msgstr "fjernsystem: "
-
 #, python-format
 msgid "push refused: %s"
 msgstr "skub afvist: %s"
@@ -9277,6 +9545,13 @@
 msgstr ""
 
 #, python-format
+msgid "subrepo spec file %s not found"
+msgstr "underdepot spec-fil %s blev ikke fundet"
+
+msgid "missing ] in subrepo source"
+msgstr "manglende ] i underdepot kilde"
+
+#, python-format
 msgid ""
 " subrepository sources for %s differ\n"
 "use (l)ocal source (%s) or (r)emote source (%s)?"
@@ -9298,6 +9573,10 @@
 msgstr ""
 
 #, python-format
+msgid "unknown subrepo type %s"
+msgstr "ukendt underdepottype %s"
+
+#, python-format
 msgid "removing subrepo %s\n"
 msgstr "fjerner underdepot %s\n"
 
@@ -9309,6 +9588,13 @@
 msgid "pushing subrepo %s\n"
 msgstr "skubber til underdepot %s\n"
 
+msgid "cannot commit svn externals"
+msgstr "kan ikke deponere svn externals"
+
+#, python-format
+msgid "not removing repo %s because it has changes.\n"
+msgstr "fjerner ikke depotet %s fordi det er ændret.\n"
+
 #, python-format
 msgid "%s, line %s: %s\n"
 msgstr "%s, linie %s: %s\n"
@@ -9419,6 +9705,16 @@
 msgstr "http godkendelse: bruger %s, kodeord %s\n"
 
 #, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr "ignorerer ugyldig [auth] nøgle '%s'\n"
+
+msgid "certificate checking requires Python 2.6"
+msgstr ""
+
+msgid "server identity verification succeeded\n"
+msgstr ""
+
+#, python-format
 msgid "command '%s' failed: %s"
 msgstr "kommandoen '%s' fejlede: %s"
 
@@ -9561,6 +9857,9 @@
 msgid "checking changesets\n"
 msgstr "kontrollerer ændringer\n"
 
+msgid "changelog"
+msgstr ""
+
 #, python-format
 msgid "unpacking changeset %s"
 msgstr "udpakker ændring %s"
@@ -9582,6 +9881,9 @@
 msgid "crosschecking files in changesets and manifests\n"
 msgstr "krydstjekker filer i ændringer og manifester\n"
 
+msgid "crosscheck"
+msgstr ""
+
 #, python-format
 msgid "changeset refers to unknown manifest %s"
 msgstr "ændring refererer til et ukendt manifest %s"
--- a/i18n/ja.po	Wed Feb 24 18:22:45 2010 +0100
+++ b/i18n/ja.po	Sun Feb 28 18:06:47 2010 +0100
@@ -99,7 +99,7 @@
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2010-01-30 00:17+0900\n"
+"POT-Creation-Date: 2010-02-27 18:17+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"
@@ -247,6 +247,9 @@
 msgid "a bookmark cannot have the name of an existing branch"
 msgstr "既存ブランチと同名のブックマークは作成できません"
 
+msgid "no bookmarks set\n"
+msgstr "ブックマークは存在しません\n"
+
 msgid "force"
 msgstr "強制実施"
 
@@ -456,6 +459,9 @@
 "details:\n"
 "\t{desc|tabindent}"
 msgstr ""
+"リポジトリ {root} のリビジョン {node|short} がバグ {bug} に関連。\n"
+"詳細:\n"
+"\t{desc|tabindent}"
 
 #, python-format
 msgid "python mysql support not available: %s"
@@ -1390,11 +1396,11 @@
 
 #, python-format
 msgid "making snapshot of %d files from rev %s\n"
-msgstr ""
+msgstr "%d 個のファイルのスナップショットをリビジョン %s から生成中\n"
 
 #, python-format
 msgid "making snapshot of %d files from working directory\n"
-msgstr ""
+msgstr "%d 個のファイルのスナップショットを作業領域から生成中\n"
 
 msgid "cannot specify --rev and --change at the same time"
 msgstr "--rev と --change は同時には指定出来ません"
@@ -1422,16 +1428,16 @@
 msgstr ""
 
 msgid "comparison program to run"
-msgstr ""
+msgstr "比較実行用プログラム"
 
 msgid "pass option to comparison program"
-msgstr ""
+msgstr "比較実行用プログラムへのオプション指定"
 
 msgid "change made by revision"
 msgstr "当該リビジョンにおける変更内容の表示"
 
 msgid "hg extdiff [OPT]... [FILE]..."
-msgstr ""
+msgstr "hg extdiff [OPT]... [FILE]..."
 
 #, python-format
 msgid ""
@@ -1449,10 +1455,10 @@
 
 #, python-format
 msgid "hg %s [OPTION]... [FILE]..."
-msgstr ""
+msgstr "hg %s [OPTION]... [FILE]..."
 
 msgid "pull, update and merge in one command"
-msgstr ""
+msgstr "pull, update, merge の一括実行"
 
 msgid ""
 "pull changes from a remote repository, merge new changes if needed.\n"
@@ -1477,6 +1483,8 @@
 msgid ""
 "working dir not at branch tip (use \"hg update\" to check out branch tip)"
 msgstr ""
+"作業領域はブランチ tip ではありません(\"hg update\" でブランチ tip に更新可"
+"能)"
 
 msgid "outstanding uncommitted merge"
 msgstr "マージが未コミットです"
@@ -1490,6 +1498,8 @@
 msgid ""
 "multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
 msgstr ""
+"このブランチには複数のヘッドがあります(\"hg heads .\" と \"hg merge\" でマー"
+"ジしてください)"
 
 #, python-format
 msgid "pulling from %s\n"
@@ -1505,6 +1515,8 @@
 "not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge"
 "\" to merge them)\n"
 msgstr ""
+"%d 個の新規ブランチヘッドとはマージされません(\"hg heads .\" と \"hg merge\" "
+"でマージしてください)\n"
 
 #, python-format
 msgid "updating to %d:%s\n"
@@ -1516,40 +1528,40 @@
 
 #, python-format
 msgid "new changeset %d:%s merges remote changes with local\n"
-msgstr ""
+msgstr "新規リビジョン %d:%s で遠隔とローカルのリビジョンをマージ\n"
 
 msgid "a specific revision you would like to pull"
-msgstr ""
+msgstr "取り込み対象リビジョンの指定"
 
 msgid "edit commit message"
 msgstr "コミットメッセージの編集"
 
 msgid "edit commit message (DEPRECATED)"
-msgstr ""
+msgstr "コミットメッセージの編集(非推奨)"
 
 msgid "switch parents when merging"
-msgstr ""
+msgstr "マージの際の第1親リビジョンを切り替え"
 
 msgid "hg fetch [SOURCE]"
-msgstr ""
+msgstr "hg fetch [SOURCE]"
 
 msgid "commands to sign and verify changesets"
 msgstr "チェンジセットの署名および検証のコマンド"
 
 msgid "error while verifying signature"
-msgstr ""
+msgstr "署名検証中のエラー"
 
 #, python-format
 msgid "%s Bad signature from \"%s\"\n"
-msgstr ""
+msgstr "%s 不正署名(\"%s\" による署名)\n"
 
 #, python-format
 msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
-msgstr ""
+msgstr "%s 備考: 有効期限切れ署名(\"%s\" による署名)\n"
 
 #, python-format
 msgid "%s Note: This key has expired (signed by: \"%s\")\n"
-msgstr ""
+msgstr "%s 備考: 有効期限切れ鍵(\"%s\" による署名)\n"
 
 msgid "list signed changesets"
 msgstr "署名済みリビジョンの一覧表示"
@@ -1559,7 +1571,7 @@
 msgstr "%s:%d ノードは存在しません\n"
 
 msgid "verify all the signatures there may be for a particular revision"
-msgstr ""
+msgstr "特定リビジョンに関する全署名の検証"
 
 #, python-format
 msgid "No valid signature for %s\n"
@@ -1578,6 +1590,10 @@
 msgid "uncommitted merge - please provide a specific revision"
 msgstr "マージが未コミットです - 対象リビジョンを指定してください"
 
+#, python-format
+msgid "Signing %d:%s\n"
+msgstr "%d:%s への署名中\n"
+
 msgid "Error while signing"
 msgstr "署名処理の失敗"
 
@@ -1585,21 +1601,23 @@
 "working copy of .hgsigs is changed (please commit .hgsigs manually or use --"
 "force)"
 msgstr ""
+"作業領域の .hgsigs は変更されています(.hgsigs を手動コミットするか、--force "
+"を使用してください)"
 
 msgid "unknown signature version"
 msgstr "未知の署名バージョン"
 
 msgid "make the signature local"
-msgstr ""
+msgstr "自リポジトリローカルな署名"
 
 msgid "sign even if the sigfile is modified"
-msgstr ""
+msgstr "署名ファイルが変更されていても署名を実施"
 
 msgid "do not commit the sigfile after signing"
-msgstr ""
+msgstr "署名後の署名ファイルのコミットを抑止"
 
 msgid "the key id to sign with"
-msgstr ""
+msgstr "署名に使用する鍵ID"
 
 msgid "commit message"
 msgstr "コミットメッセージ"
@@ -1707,11 +1725,15 @@
 msgstr ""
 
 #, python-format
+msgid "%s returned an error: %s"
+msgstr "%s からエラーが返却されました: %s"
+
+#, python-format
 msgid "hgcia: sending update to %s\n"
 msgstr "hgcia: %s に更新を送信しています\n"
 
 msgid "email.from must be defined when sending by email"
-msgstr ""
+msgstr "電子メール送信のためには email.from の定義が必要です"
 
 msgid ""
 "browse the repository in a graphical way\n"
@@ -1753,7 +1775,7 @@
 msgstr "指定リビジョン時点の内容表示"
 
 msgid "cat-file: type or revision not supplied\n"
-msgstr ""
+msgstr "cat-file: 種別もリビジョンも指定されていません\n"
 
 msgid "aborting hg cat-file only understands commits\n"
 msgstr ""
@@ -1768,7 +1790,7 @@
 msgstr "エクステンション設定の表示"
 
 msgid "start interactive history viewer"
-msgstr ""
+msgstr "対話的な履歴参照の開始"
 
 msgid "hg view [-l LIMIT] [REVRANGE]"
 msgstr "hg view [-l LIMIT] [REVRANGE]"
@@ -1789,7 +1811,7 @@
 msgstr "コピーの検出"
 
 msgid "search"
-msgstr ""
+msgstr "検索"
 
 msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
 msgstr "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
@@ -1813,13 +1835,13 @@
 msgstr "ヘッダ"
 
 msgid "topo-order"
-msgstr ""
+msgstr "履歴トポロジーの順序"
 
 msgid "parents"
 msgstr "親"
 
 msgid "max-count"
-msgstr ""
+msgstr "最大数"
 
 msgid "hg debug-rev-list [OPTION]... REV..."
 msgstr "hg debug-rev-list [OPTION]... REV..."
@@ -2226,6 +2248,9 @@
 msgid "unhooked all commit hooks\n"
 msgstr "全ての commit フックを無効化\n"
 
+msgid "hg keyword configuration and expansion example"
+msgstr ""
+
 msgid ""
 "\n"
 "\tkeywords expanded\n"
@@ -2824,21 +2849,28 @@
 "    "
 
 msgid ""
-"init a new queue repository\n"
+"init a new queue repository (DEPRECATED)\n"
 "\n"
 "    The queue repository is unversioned by default. If\n"
 "    -c/--create-repo is specified, qinit will create a separate nested\n"
 "    repository for patches (qinit -c may also be run later to convert\n"
 "    an unversioned patch repository into a versioned one). You can use\n"
-"    qcommit to commit changes to this queue repository."
-msgstr ""
-"パッチ管理領域の初期化\n"
+"    qcommit to commit changes to this queue repository.\n"
+"\n"
+"    This command is deprecated. Without -c, it's implied by other relevant\n"
+"    commands. With -c, use hg init -Q instead."
+msgstr ""
+"パッチ管理領域の初期化(非推奨)\n"
 "\n"
 "    特に指定が無い場合、パッチ管理領域は構成管理されません。\n"
 "    -c/--create-repo が指定された場合、本コマンドはパッチ管理領域自体を\n"
 "    Mercurial のリポジトリとして作成します(既存のパッチ管理領域を後から\n"
 "    Mercurial リポジトリ化するのにも使用できます)。管理領域の変更内容は\n"
-"    qcommit によってコミットすることができます。"
+"    qcommit によってコミットすることができます。\n"
+"\n"
+"    本コマンドは推奨されません。-c 指定無しでの作成なら、他の関連コマンド\n"
+"    によって作成されます。-c 指定有りでの作成ならば、hg init -Q を使用\n"
+"    してください。"
 
 msgid ""
 "clone main and patch repository at same time\n"
@@ -2886,8 +2918,14 @@
 msgid "updating destination repository\n"
 msgstr "複製先の作業領域を更新中\n"
 
-msgid "commit changes in the queue repository"
-msgstr "パッチ管理領域の変更をコミット"
+msgid ""
+"commit changes in the queue repository (DEPRECATED)\n"
+"\n"
+"    This command is deprecated; use hg -Q commit instead."
+msgstr ""
+"パッチ管理領域の変更をコミット(非推奨)\n"
+"\n"
+"    本コマンドは非推奨です。`hg -Q commit` を使用してください。"
 
 msgid "print the entire series file"
 msgstr "既知のパッチ一覧の表示"
@@ -3069,7 +3107,7 @@
 "\n"
 "    To set guards on another patch::\n"
 "\n"
-"      hg qguard -- other.patch +2.6.17 -stable\n"
+"      hg qguard other.patch -- +2.6.17 -stable\n"
 "    "
 msgstr ""
 "パッチのガード設定ないし表示\n"
@@ -3086,7 +3124,7 @@
 "\n"
 "    現行パッチ以外にガードを設定するには::\n"
 "\n"
-"      hg qguard -- 対象パッチ名 +2.6.17 -stable\n"
+"      hg qguard 対象パッチ名 -- +2.6.17 -stable\n"
 "    "
 
 msgid "cannot mix -l/--list with options or arguments"
@@ -3160,11 +3198,27 @@
 msgid "A patch named %s already exists in the series file"
 msgstr "同名のパッチ %s が既に存在します"
 
-msgid "restore the queue state saved by a revision"
-msgstr "指定リビジョンによって保存されたパッチ管理状態の復旧"
-
-msgid "save current queue state"
-msgstr "パッチ管理状態の保存"
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr "%s から %s に改名中\n"
+
+msgid ""
+"restore the queue state saved by a revision (DEPRECATED)\n"
+"\n"
+"    This command is deprecated, use rebase --mq instead."
+msgstr ""
+"指定リビジョンによって保存されたパッチ管理状態の復旧(非推奨)\n"
+"\n"
+"    本コマンドは非推奨です。--mq 指定によるリベースをしてください。"
+
+msgid ""
+"save current queue state (DEPRECATED)\n"
+"\n"
+"    This command is deprecated, use rebase --mq instead."
+msgstr ""
+"パッチ管理状態の保存(非推奨)\n"
+"\n"
+"    本コマンドは非推奨です。--mq 指定によるリベースをしてください。"
 
 #, python-format
 msgid "destination %s exists and is not a directory"
@@ -3339,6 +3393,9 @@
 msgid "cannot import over an applied patch"
 msgstr "パッチ適用中の import による取り込みはできません"
 
+msgid "operate on patch repository"
+msgstr "パッチ管理リポジトリへの操作"
+
 msgid "print first line of patch header"
 msgstr "パッチヘッダの最初の行を表示"
 
@@ -3399,8 +3456,8 @@
 msgid "drop all guards"
 msgstr "全てのガード設定を破棄"
 
-msgid "hg qguard [-l] [-n] -- [PATCH] [+GUARD]... [-GUARD]..."
-msgstr "hg qguard [-l] [-n] -- [PATCH] [+GUARD]... [-GUARD]..."
+msgid "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
+msgstr "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
 
 msgid "hg qheader [PATCH]"
 msgstr "hg qheader [PATCH]"
@@ -3432,8 +3489,8 @@
 msgid "hg qinit [-c]"
 msgstr "hg qinit [-c]"
 
-msgid "import uncommitted changes into patch"
-msgstr "作業領域の変更内容のパッチへの取り込み"
+msgid "import uncommitted changes (DEPRECATED)"
+msgstr "作業領域の変更内容のパッチへの取り込み(非推奨)"
 
 msgid "add \"From: <current user>\" to patch"
 msgstr "\"From: <現ユーザ名>\" をパッチに追加"
@@ -3459,8 +3516,8 @@
 msgid "pop all patches"
 msgstr "全てのパッチの適用を解除"
 
-msgid "queue name to pop"
-msgstr "パッチ解除先のパッチ管理領域名"
+msgid "queue name to pop (DEPRECATED)"
+msgstr "パッチ解除先のパッチ管理領域名(非推奨)"
 
 msgid "forget any local changes to patched files"
 msgstr "パッチ対象ファイルに対する作業領域中の変更を破棄"
@@ -3477,11 +3534,11 @@
 msgid "apply all patches"
 msgstr "全てのパッチを適用"
 
-msgid "merge from another queue"
-msgstr "他のパッチ管理領域とのマージ"
-
-msgid "merge queue name"
-msgstr "マージ対象のパッチ管理領域名"
+msgid "merge from another queue (DEPRECATED)"
+msgstr "他のパッチ管理領域とのマージ(非推奨)"
+
+msgid "merge queue name (DEPRECATED)"
+msgstr "マージ対象のパッチ管理領域名(非推奨)"
 
 msgid "hg qpush [-f] [-l] [-a] [-m] [-n NAME] [PATCH | INDEX]"
 msgstr "hg qpush [-f] [-l] [-a] [-m] [-n NAME] [PATCH | INDEX]"
@@ -3651,7 +3708,7 @@
 
 #, python-format
 msgid "notify: sending %d subscribers %d changes\n"
-msgstr ""
+msgstr "notify: %d 購読者に %d 変更を送信中\n"
 
 #, python-format
 msgid ""
@@ -3659,6 +3716,9 @@
 "diffs (truncated from %d to %d lines):\n"
 "\n"
 msgstr ""
+"\n"
+"差分 (%d 行から %d 行に切り詰め):\n"
+"\n"
 
 #, python-format
 msgid ""
@@ -3666,10 +3726,13 @@
 "diffs (%d lines):\n"
 "\n"
 msgstr ""
+"\n"
+"差分 (%d 行):\n"
+"\n"
 
 #, python-format
 msgid "notify: suppressing notification for merge %d:%s\n"
-msgstr ""
+msgstr "notify: マージ %d:%s の通知を抑止中\n"
 
 msgid ""
 "browse command output with an external pager\n"
@@ -4082,6 +4145,30 @@
 msgid "hg email [OPTION]... [DEST]..."
 msgstr "hg email [OPTION]... [DEST]...\""
 
+msgid ""
+"show progress bars for some actions\n"
+"\n"
+"This extension uses the progress information logged by hg commands\n"
+"to draw progress bars that are as informative as possible. Some progress\n"
+"bars only offer indeterminate information, while others have a definite\n"
+"end point.\n"
+"\n"
+"The following settings are available::\n"
+"\n"
+"  [progress]\n"
+"  delay = 3 # number of seconds (float) before showing the progress bar\n"
+"  refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
+"  format = topic bar number # format of the progress bar\n"
+"  width = <none> # if set, the maximum width of the progress information\n"
+"                 # (that is, min(width, term width) will be used)\n"
+"  clear-complete = True # clear the progress bar after it's done\n"
+"\n"
+"Valid entries for the format field are topic, bar, number, unit, and\n"
+"item. item defaults to the last 20 characters of the item, but this\n"
+"can be changed by adding either ``-<num>`` which would take the last\n"
+"num characters, or ``+<num>`` for the first num characters.\n"
+msgstr ""
+
 msgid "command to delete untracked files from the working directory"
 msgstr "作業領域中の未登録ファイルを削除するコマンド"
 
@@ -4189,18 +4276,34 @@
 msgid "cannot use collapse with continue or abort"
 msgstr "--collapse は --abort や --continue と併用できません"
 
+msgid "cannot use detach with continue or abort"
+msgstr "--detach は --abort や --continue と併用できません"
+
 msgid "abort and continue do not allow specifying revisions"
 msgstr "--abort や --continue は、りビジョン指定と併用できません"
 
 msgid "cannot specify both a revision and a base"
 msgstr "--soruce と --base は併用できません"
 
+msgid "detach requires a revision to be specified"
+msgstr "--detach にはリビジョン指定が必要です"
+
+msgid "cannot specify a base with detach"
+msgstr "--base と --detach は同時には指定出来ません"
+
 msgid "nothing to rebase\n"
 msgstr "リベースの必要はありません\n"
 
 msgid "cannot use both keepbranches and extrafn"
 msgstr "--keepbranches と --extrafn は併用できません"
 
+msgid "fix unresolved conflicts with hg resolve then run hg rebase --continue"
+msgstr " 'hg resolve' で衝突解消してから 'hg rebase --continue' してください"
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr "変更がないので、リビジョン %d をスキップ\n"
+
 msgid "rebase merging completed\n"
 msgstr "リベースのマージ処理が完了\n"
 
@@ -4214,12 +4317,8 @@
 msgid "%d revisions have been skipped\n"
 msgstr "%d 個のリビジョンをスキップ\n"
 
-msgid "fix unresolved conflicts with hg resolve then run hg rebase --continue"
-msgstr " 'hg resolve' で衝突解消してから 'hg rebase --continue' してください"
-
-#, python-format
-msgid "no changes, revision %d skipped\n"
-msgstr "変更がないので、リビジョン %d をスキップ\n"
+msgid "unable to collapse, there is more than one external parent"
+msgstr "複数の親との関係から、--collapse は指定できません"
 
 #, python-format
 msgid "cannot use revision %d as base, result would have 3 parents"
@@ -4243,9 +4342,6 @@
 msgid "source is descendant of destination"
 msgstr "移動元は移動先の子孫です"
 
-msgid "unable to collapse, there is more than one external parent"
-msgstr "複数の親との関係から、--collapse は指定できません"
-
 msgid "rebase working directory to branch head"
 msgstr "作業領域をブランチヘッドにリベース"
 
@@ -4267,6 +4363,9 @@
 msgid "keep original branch names"
 msgstr "元ブランチ名を維持"
 
+msgid "force detaching of source from its original branch"
+msgstr "リベース元を元ブランチから強制的に移動"
+
 msgid "continue an interrupted rebase"
 msgstr "中断されたリベースを再開"
 
@@ -4274,11 +4373,11 @@
 msgstr "中断されたリベースを中止"
 
 msgid ""
-"hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--keep] [--keepbranches] "
-"| [-c] | [-a]"
-msgstr ""
-"hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--keep] [--keepbranches] "
-"| [-c] | [-a]"
+"hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--detach] [--keep] [--"
+"keepbranches] | [-c] | [-a]"
+msgstr ""
+"hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--detach] [--keep] [--"
+"keepbranches] | [-c] | [-a]"
 
 msgid "commands to interactively select changes for commit/qrefresh"
 msgstr "commit または qrefresh 実行時に対話的な変更選択を行うコマンド"
@@ -4407,7 +4506,7 @@
 msgstr "hg qrecord [OPTION]... PATCH [FILE]..."
 
 msgid "recreates hardlinks between repository clones"
-msgstr ""
+msgstr "複製リポジトリ間でのハードリンクの再生成"
 
 msgid ""
 "recreate hardlinks between two repositories\n"
@@ -4445,7 +4544,7 @@
 
 #, python-format
 msgid "collected %d candidate storage files\n"
-msgstr ""
+msgstr "%d 個の候補ファイルの領域を回収\n"
 
 msgid "source and destination are on different devices"
 msgstr "リンク元とリンク先が同一ファイルシステム上にありません"
@@ -4456,7 +4555,7 @@
 
 #, python-format
 msgid "pruned down to %d probably relinkable files\n"
-msgstr ""
+msgstr "ハードリンク可能と思われる %d のファイルを除外\n"
 
 msgid " files"
 msgstr " ファイル"
@@ -4469,7 +4568,7 @@
 msgstr "%d ファイルを再リンク(%d バイトの節約)\n"
 
 msgid "[ORIGIN]"
-msgstr ""
+msgstr "[ORIGIN]"
 
 msgid ""
 "extend schemes with shortcuts to repository swarms\n"
@@ -4509,7 +4608,7 @@
 msgstr ""
 
 msgid "share a common history between several working directories"
-msgstr ""
+msgstr "複数作業領域による履歴情報領域の共有"
 
 msgid ""
 "create a new shared repository (experimental)\n"
@@ -4598,9 +4697,29 @@
 msgid "commit failed"
 msgstr "コミットに失敗"
 
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+"y: このリビジョンを移植\n"
+"n: このリビジョンは移植しない\n"
+"m: このリビジョンでマージ\n"
+"p: パッチを表示\n"
+"c: 選択されたリビジョンをコミット\n"
+"q: 移植の取り消し\n"
+"?: ヘルプの表示\n"
+
 msgid "apply changeset? [ynmpcq?]:"
 msgstr "チェンジセットを適用しますか? [ynmpcq?]:"
 
+msgid "no such option\n"
+msgstr "そのようなオプションはありません\n"
+
 msgid ""
 "transplant changesets from another branch\n"
 "\n"
@@ -4971,6 +5090,10 @@
 msgid "username %s contains a newline"
 msgstr "ユーザ名 %s が改行を含んでいます"
 
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr "タグ名 '%s' はシステムで予約されています"
+
 msgid "options --message and --logfile are mutually exclusive"
 msgstr "--message と --logfile は同時に指定できません"
 
@@ -5058,6 +5181,9 @@
 msgid "(consider using --after)\n"
 msgstr "( --after を使ってみては? )\n"
 
+msgid "child process failed to start"
+msgstr "子プロセスの生成に失敗"
+
 #, python-format
 msgid "changeset:   %d:%s\n"
 msgstr "チェンジセット:   %d:%s\n"
@@ -5187,6 +5313,20 @@
 "    undo an add before that, see hg forget.\n"
 "\n"
 "    If no names are given, add all files to the repository.\n"
+"\n"
+"    .. container:: verbose\n"
+"\n"
+"       An example showing how new (unknown) files are added\n"
+"       automatically by ``hg add``::\n"
+"\n"
+"         $ ls\n"
+"         foo.c\n"
+"         $ hg status\n"
+"         ? foo.c\n"
+"         $ hg add\n"
+"         adding foo.c\n"
+"         $ hg status\n"
+"         A foo.c\n"
 "    "
 msgstr ""
 "指定ファイルの追加登録予約\n"
@@ -5198,6 +5338,20 @@
 "    ください。\n"
 "\n"
 "    ファイル名指定が無い場合、作業領域中の全ファイルが対象となります。\n"
+"\n"
+"    .. container:: verbose\n"
+"\n"
+"       以下の実行例は、``hg add`` 実行における(未知のファイルの)自動的な\n"
+"       追加の例です::\n"
+"\n"
+"         $ ls\n"
+"         foo.c\n"
+"         $ hg status\n"
+"         ? foo.c\n"
+"         $ hg add\n"
+"         foo.c を追加登録中\n"
+"         $ hg status\n"
+"         A foo.c\n"
 "    "
 
 msgid ""
@@ -5574,8 +5728,8 @@
 "    Generate a compressed changegroup file collecting changesets not\n"
 "    known to be in another repository.\n"
 "\n"
-"    If no destination repository is specified the destination is\n"
-"    assumed to have all the nodes specified by one or more --base\n"
+"    If you omit the destination repository, then hg assumes the\n"
+"    destination will have all the nodes you specify with --base\n"
 "    parameters. To create a bundle containing all changesets, use\n"
 "    -a/--all (or --base null).\n"
 "\n"
@@ -5675,7 +5829,9 @@
 "\n"
 "    a) the changeset, tag or branch specified with -u/--updaterev\n"
 "    b) the changeset, tag or branch given with the first -r/--rev\n"
-"    c) the head of the default branch\n"
+"    c) the branch given with the first -b/--branch\n"
+"    d) the branch given with the url#branch source syntax\n"
+"    e) the head of the default branch\n"
 "\n"
 "    Use 'hg clone -u . src dst' to checkout the source repository's\n"
 "    parent changeset (applicable for local source repositories only).\n"
@@ -5736,7 +5892,9 @@
 "\n"
 "    a) -u/--updaterev で指定されたリビジョン(タグやブランチ名も可)\n"
 "    b) 最初の -r/--rev で指定されたリビジョン(タグやブランチ名も可)\n"
-"    c) 'default' ブランチのヘッドリビジョン\n"
+"    c) 最初の -b/--branch で指定されたブランチ\n"
+"    d) 複製元指定において url#branch 形式で指定されたブランチ\n"
+"    e) 'default' ブランチのヘッドリビジョン\n"
 "\n"
 "    複製元の作業領域における親リビジョンで、複製先リポジトリの作業領域を\n"
 "    更新するには、'hg clone -u . 複製元 複製先' と指定します\n"
@@ -6067,6 +6225,9 @@
 "    revisions are specified, the working directory files are compared\n"
 "    to its parent.\n"
 "\n"
+"    Alternatively you can specify -c/--change with a revision to see\n"
+"    the changes in that changeset relative to its first parent.\n"
+"\n"
 "    Without the -a/--text option, diff will avoid generating diffs of\n"
 "    files it detects as binary. With -a, diff will generate a diff\n"
 "    anyway, probably with undesirable results.\n"
@@ -6089,6 +6250,9 @@
 "    され、リビジョンが1つも指定されない場合は、作業領域の内容と\n"
 "    親リビジョンとが比較されます。\n"
 "\n"
+"    指定リビジョンと、その第1親との間の差分を見るには、-c/--change で\n"
+"    対象リビジョンを指定する方法も使用できます。\n"
+"\n"
 "    -a/--text 指定が無い場合、バイナリと思しきファイルは処理対象から\n"
 "    除外されます。-a 指定が有る場合、結果に関わらず全てのファイルが\n"
 "    処理対象となります。\n"
@@ -6102,8 +6266,9 @@
 "\n"
 "    Print the changeset header and diffs for one or more revisions.\n"
 "\n"
-"    The information shown in the changeset header is: author,\n"
-"    changeset hash, parent(s) and commit comment.\n"
+"    The information shown in the changeset header is: author, date,\n"
+"    branch name (if non-default), changeset hash, parent(s) and commit\n"
+"    comment.\n"
 "\n"
 "    NOTE: export may generate unexpected diff output for merge\n"
 "    changesets, as it will compare the merge changeset against its\n"
@@ -6136,8 +6301,8 @@
 "\n"
 "    1つ以上のリビジョンに対して、ヘッダ情報および変更内容を表示します。\n"
 "\n"
-"    ヘッダ情報表示に含まれるのは:\n"
-"    作成者/ハッシュ値/親リビジョン/コミットログ\n"
+"    ヘッダ情報として表示される情報は:作成者/日付/\n"
+"    (default 以外の場合は)ブランチ名前/ハッシュ値/親リビジョン/コミットログ\n"
 "\n"
 "    備考: マージ実施リビジョンに対して、本コマンドが期待と異なる差分を\n"
 "    出力するのは、第1親との差分のみを出力するためです。\n"
@@ -6243,68 +6408,56 @@
 msgid ""
 "show current repository heads or show branch heads\n"
 "\n"
-"    With no arguments, show all repository head changesets.\n"
+"    With no arguments, show all repository branch heads.\n"
 "\n"
 "    Repository \"heads\" are changesets with no child changesets. They are\n"
 "    where development generally takes place and are the usual targets\n"
-"    for update and merge operations.\n"
-"\n"
-"    If one or more REV is given, the \"branch heads\" will be shown for\n"
-"    the named branch associated with the specified changeset(s).\n"
-"\n"
-"    Branch heads are changesets on a named branch with no descendants on\n"
-"    the same branch. A branch head could be a \"true\" (repository) head,\n"
-"    or it could be the last changeset on that branch before it was\n"
-"    merged into another branch, or it could be the last changeset on the\n"
-"    branch before a new branch was created. If none of the branch heads\n"
-"    are true heads, the branch is considered inactive.\n"
+"    for update and merge operations. Branch heads are changesets that have\n"
+"    no child changeset on the same branch.\n"
+"\n"
+"    If one or more REVs are given, only branch heads on the branches\n"
+"    associated with the specified changesets are shown.\n"
 "\n"
 "    If -c/--closed is specified, also show branch heads marked closed\n"
 "    (see hg commit --close-branch).\n"
 "\n"
 "    If STARTREV is specified, only those heads that are descendants of\n"
 "    STARTREV will be displayed.\n"
+"\n"
+"    If -t/--topo is specified, named branch mechanics will be ignored and "
+"only\n"
+"    changesets without children will be shown.\n"
 "    "
 msgstr ""
 "現時点でのリポジトリ(ないしブランチ)のヘッド表示\n"
 "\n"
-"    引数指定が無い場合、リポジトリ中の全てのヘッドを表示します。\n"
+"    引数指定が無い場合、リポジトリ中の全てのブランチヘッドを表示します。\n"
 "\n"
 "    リポジトリの「ヘッド」とは、子リビジョンを持たないリビジョンの\n"
 "    ことを指します。改変作業の実施や、update/merge コマンド実施の際には、\n"
-"    このリビジョンを対象とするのが一般的です。\n"
-"\n"
-"    1つ以上のリビジョンが指定された場合、本コマンドは指定リビジョンの属\n"
-"    する名前付きブランチの「ブランチヘッド」を表示します。\n"
-"\n"
-"    「ブランチヘッド」とは、自身が属する名前付きブランチ内に\n"
-"    子リビジョンを持たないリビジョンのことを指します。\n"
-"    ブランチヘッドは「真のヘッド」である場合と、\n"
-"    新たなブランチへの枝分かれや他のブランチへのマージ直前のリビジョンで\n"
-"    ある場合のいずれかです。\n"
-"    真のヘッドを持たないブランチが非アクティブとみなされます。\n"
+"    このリビジョンを対象とするのが一般的です。「ブランチヘッド」とは、\n"
+"    同じ名前付きブランチ内に子リビジョンを持たないリビジョンのことです。\n"
+"\n"
+"    1つ以上のリビジョンが指定された場合、本コマンドは指定リビジョンの\n"
+"    属する名前付きブランチのブランチヘッドを表示します。\n"
 "\n"
 "    -c/--closed 指定時には、閉鎖済みのブランチ\n"
 "    ('hg commit' への --close-branch 指定で実施)も表示されます。\n"
 "\n"
 "    引数として開始リビジョンが指定された場合、\n"
 "    指定リビジョンの子孫となるヘッドのみが表示されます。\n"
-"    "
-
-msgid "you must specify a branch to use --closed"
-msgstr "--closed 指定時にはブランチも指定してください"
-
-#, python-format
-msgid "no open branch heads on branch %s\n"
-msgstr "ブランチ %s にはオープンなヘッドがありません\n"
-
-#, python-format
-msgid "no changes on branch %s containing %s are reachable from %s\n"
-msgstr "ブランチ %s のリビジョンは(%s も含めて) %s から到達できません\n"
-
-#, python-format
-msgid "no changes on branch %s are reachable from %s\n"
-msgstr "ブランチ %s のリビジョンは %s から到達できません\n"
+"\n"
+"    -t/--topo 指定時には、名前付きブランチに関する判定は無視され、\n"
+"    単に子リビジョンを持たないリビジョンが表示されます。\n"
+"    "
+
+#, python-format
+msgid "no open branch heads found on branches %s"
+msgstr "ブランチ %s にはオープンなヘッドがありません"
+
+#, python-format
+msgid " (started at %s)"
+msgstr "(%s から開始)"
 
 msgid ""
 "show help for a given topic or a help overview\n"
@@ -6356,6 +6509,14 @@
 msgid "(no help text available)"
 msgstr "(ヘルプはありません)"
 
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show verbose help\n"
+msgstr ""
+"\n"
+"\"hg -v help %s\" で詳細なヘルプが表示されます\n"
+
 msgid "options:\n"
 msgstr "オプション:\n"
 
@@ -6373,6 +6534,13 @@
 "%s エクステンション - %s\n"
 "\n"
 
+msgid "use \"hg help extensions\" for information on enabling extensions\n"
+msgstr "\"hg help extensions\" で有効なエクステンションの情報が表示されます\n"
+
+#, python-format
+msgid "'%s' is provided by the following extension:"
+msgstr "以下のエクステンションにより  '%s' が提供されています:"
+
 msgid "Mercurial Distributed SCM\n"
 msgstr "Mercurial - 分散構成管理ツール\n"
 
@@ -6496,11 +6664,8 @@
 "    -d/--date への指定に関しては、'hg help dates' を参照してください。\n"
 "    "
 
-msgid "applying patch from stdin\n"
-msgstr "標準入力からのパッチを適用中\n"
-
-msgid "no diffs found"
-msgstr "差分がありません"
+msgid "to working directory"
+msgstr "作業領域"
 
 msgid "not a Mercurial patch"
 msgstr "Mercurial 向けのパッチではありません"
@@ -6508,6 +6673,16 @@
 msgid "patch is damaged or loses information"
 msgstr "パッチには破損ないし情報の欠落があります"
 
+msgid "applying patch from stdin\n"
+msgstr "標準入力からのパッチを適用中\n"
+
+#, python-format
+msgid "applied %s\n"
+msgstr "%s に対して適用\n"
+
+msgid "no diffs found"
+msgstr "差分がありません"
+
 msgid ""
 "show new changesets found in source\n"
 "\n"
@@ -6708,13 +6883,18 @@
 "    "
 
 #, python-format
-msgid "branch '%s' has %d heads - please merge with an explicit rev"
-msgstr "ブランチ '%s' にはヘッドが %d あります - マージ対象を明示してください"
-
-#, python-format
-msgid "branch '%s' has one head - please merge with an explicit rev"
-msgstr ""
-"ブランチ '%s' にはヘッドが1しかありません - マージ対象を明示してください"
+msgid "abort: branch '%s' has %d heads - please merge with an explicit rev\n"
+msgstr "中断: ブランチ '%s' には %d ヘッドあります - 対象を明示してください\n"
+
+msgid "(run 'hg heads .' to see heads)\n"
+msgstr "(ヘッド一覧は 'hg heads' で表示されます)\n"
+
+#, python-format
+msgid "abort: branch '%s' has one head - please merge with an explicit rev\n"
+msgstr "中断: ブランチ '%s' は単一ヘッドです - 対象を明示してください\n"
+
+msgid "(run 'hg heads' to see all heads)\n"
+msgstr "(ヘッド一覧は 'hg heads' で表示されます)\n"
 
 msgid "there is nothing to merge"
 msgstr "マージの必要がありません"
@@ -6731,13 +6911,13 @@
 "リビジョンを明示しての \"hg update\" ないしマージを実施してください。"
 
 msgid ""
-"show changesets not found in destination\n"
+"show changesets not found in the destination\n"
 "\n"
 "    Show changesets not found in the specified destination repository\n"
 "    or the default push location. These are the changesets that would\n"
 "    be pushed if a push was requested.\n"
 "\n"
-"    See pull for valid destination format details.\n"
+"    See pull for details of valid destination formats.\n"
 "    "
 msgstr ""
 "連携先リポジトリに含まれないチェンジセットの表示\n"
@@ -6850,7 +7030,7 @@
 msgid ""
 "push changes to the specified destination\n"
 "\n"
-"    Push changes from the local repository to the given destination.\n"
+"    Push changes from the local repository to the specified destination.\n"
 "\n"
 "    This is the symmetrical operation for pull. It moves changes from\n"
 "    the current repository to a different one. If the destination is\n"
@@ -6870,7 +7050,7 @@
 msgstr ""
 "指定リポジトリへの変更履歴の反映\n"
 "\n"
-"    手元のリポジトリから連携先リポジトリに変更履歴を反映します。\n"
+"    手元のリポジトリから指定の連携先リポジトリに変更履歴を反映します。\n"
 "\n"
 "    これは 'hg pull' と対称的な操作です。現在のリポジトリから連携先へと\n"
 "    変更履歴を反映させることができます。連携先が同一ホスト上のリポジトリ\n"
@@ -7077,8 +7257,8 @@
 "    to the contents they had in the parent of the working directory.\n"
 "    This restores the contents of the affected files to an unmodified\n"
 "    state and unschedules adds, removes, copies, and renames. If the\n"
-"    working directory has two parents, you must explicitly specify the\n"
-"    revision to revert to.\n"
+"    working directory has two parents, you must explicitly specify a\n"
+"    revision.\n"
 "\n"
 "    Using the -r/--rev option, revert the given files or directories\n"
 "    to their contents as of a specific revision. This can be helpful\n"
@@ -7180,7 +7360,7 @@
 "    - commit\n"
 "    - import\n"
 "    - pull\n"
-"    - push (with this repository as destination)\n"
+"    - push (with this repository as the destination)\n"
 "    - unbundle\n"
 "\n"
 "    This command is not intended for use on public repositories. Once\n"
@@ -7206,7 +7386,7 @@
 "    - commit\n"
 "    - import\n"
 "    - pull\n"
-"    - push (rollback 可能なのは反映先リポジトリ側)\n"
+"    - push (現リポジトリが、反映対象として指定された場合)\n"
 "    - unbundle\n"
 "\n"
 "    本コマンドは、公開リポジトリでの実行を想定していません。他のユーザ\n"
@@ -7466,10 +7646,6 @@
 msgid "tag names must be unique"
 msgstr "タグ名が重複しています"
 
-#, python-format
-msgid "the name '%s' is reserved"
-msgstr "タグ名 '%s' はシステムで予約されています"
-
 msgid "--rev and --remove are incompatible"
 msgstr "--rev と --remove は同時に使用できません"
 
@@ -7487,7 +7663,7 @@
 
 #, python-format
 msgid "tag '%s' already exists (use -f to force)"
-msgstr "タグ '%s' は存在します(強行する場合は -f を指定してください)"
+msgstr "タグ '%s' は存在します(強制実行する場合は -f を指定してください)"
 
 msgid ""
 "list repository tags\n"
@@ -7667,8 +7843,8 @@
 msgid "enable additional output"
 msgstr "付加的な出力を有効化"
 
-msgid "set/override config option"
-msgstr "オプション設定を指定/上書き"
+msgid "set/override config option (use 'section.name=value')"
+msgstr "オプション設定を指定/上書き(指定形式は 'section.name=value')"
 
 msgid "enable debugging output"
 msgstr "デバッグ出力を有効化"
@@ -7736,8 +7912,8 @@
 msgid "treat all files as text"
 msgstr "全ファイルをテキストファイルと仮定"
 
-msgid "don't include dates in diff headers"
-msgstr "差分表示の際に日付情報を抑止"
+msgid "omit dates from diff headers"
+msgstr "差分表示の際に日付情報の表示を抑止"
 
 msgid "show which function each change is in"
 msgstr "差分表示の際に関数名情報を表示"
@@ -7769,12 +7945,18 @@
 msgid "annotate the specified revision"
 msgstr "当該リビジョン時点での由来情報を表示"
 
-msgid "follow file copies and renames"
-msgstr "複製/改名元ファイルの履歴も追跡"
+msgid "follow copies and renames (DEPRECATED)"
+msgstr "複製/改名元ファイルの履歴も追跡(非推奨)"
+
+msgid "don't follow copies and renames"
+msgstr "複製/改名元ファイル履歴の追跡を抑止"
 
 msgid "list the author (long with -v)"
 msgstr "ユーザ名を表示(-v 指定時は詳細表示)"
 
+msgid "list the filename"
+msgstr "ファイル名を表示"
+
 msgid "list the date (short with -q)"
 msgstr "日付を表示(-q 指定時は簡略表示)"
 
@@ -7856,14 +8038,17 @@
 msgid "[-ac]"
 msgstr "[-ac]"
 
-msgid "run even when remote repository is unrelated"
+msgid "run even when the destination is unrelated"
 msgstr "連携先が無関係なリポジトリでも実行"
 
-msgid "a changeset up to which you would like to bundle"
-msgstr "バンドルファイルに含める上限のリビジョン"
-
-msgid "a base changeset to specify instead of a destination"
-msgstr "連携先指定の代わりとなる基底リビジョン"
+msgid "a changeset intended to be added to the destination"
+msgstr "バンドルに含めたいリビジョン"
+
+msgid "a specific branch you would like to bundle"
+msgstr "バンドルに含めたいブランチ"
+
+msgid "a base changeset assumed to be available at the destination"
+msgstr "連携先リポジトリに存在することを仮定するリビジョン"
 
 msgid "bundle all changesets in the repository"
 msgstr "リポジトリ中の全リビジョンをバンドルに含める"
@@ -7886,14 +8071,17 @@
 msgid "[OPTION]... FILE..."
 msgstr "[OPTION]... FILE..."
 
-msgid "the clone will only contain a repository (no working copy)"
-msgstr "管理領域のみの複製(作業領域の更新無し)"
+msgid "the clone will include an empty working copy (only a repository)"
+msgstr "作業領域の更新無し(管理領域のみの複製)"
 
 msgid "revision, tag or branch to check out"
 msgstr "作業領域更新用リビジョン(タグ名/ブランチ名)"
 
-msgid "clone only the specified revisions and ancestors"
-msgstr "指定リビジョンと、その祖先のみを複製"
+msgid "include the specified changeset"
+msgstr "複製対象に含めるリビジョン"
+
+msgid "clone only the specified branch"
+msgstr "指定ブランチのみを複製"
 
 msgid "[OPTION]... SOURCE [DEST]"
 msgstr "[OPTION]... SOURCE [DEST]"
@@ -7964,8 +8152,8 @@
 msgid "revision to check"
 msgstr "確認対象リビジョン"
 
-msgid "[OPTION]... [-r REV1 [-r REV2]] [FILE]..."
-msgstr "[OPTION]... [-r REV1 [-r REV2]] [FILE]..."
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
 
 msgid "diff against the second parent"
 msgstr "第2親との差分を使用"
@@ -8003,8 +8191,11 @@
 msgid "show only heads which are descendants of REV"
 msgstr "当該リビジョンの子孫となるヘッドのみを表示"
 
-msgid "show only the active branch heads from open branches"
-msgstr "アクティブなブランチのヘッドのみを表示"
+msgid "show topological heads only"
+msgstr "子を持たない全てのリビジョンを表示"
+
+msgid "show active branchheads only [DEPRECATED]"
+msgstr "アクティブなブランチヘッドのみを表示 [非推奨]"
 
 msgid "show normal and closed branch heads"
 msgstr "閉鎖したヘッドも表示"
@@ -8056,14 +8247,20 @@
 msgid "[OPTION]... PATCH..."
 msgstr "[OPTION]... PATCH..."
 
+msgid "run even if remote repository is unrelated"
+msgstr "連携先が無関係なリポジトリでも実行"
+
 msgid "show newest record first"
 msgstr "新しいリビジョンから先に表示"
 
 msgid "file to store the bundles into"
 msgstr "バンドルファイルの書き出し先"
 
-msgid "a specific remote revision up to which you would like to pull"
-msgstr "取り込み対象上限とする遠隔リビジョン"
+msgid "a remote changeset intended to be added"
+msgstr "取り込み対象リビジョン"
+
+msgid "a specific branch you would like to pull"
+msgstr "取り込み対象ブランチ"
 
 msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
 msgstr "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
@@ -8071,7 +8268,7 @@
 msgid "[-e CMD] [--remotecmd CMD] [DEST]"
 msgstr "[-e CMD] [--remotecmd CMD] [DEST]"
 
-msgid "search the repository as it stood at REV"
+msgid "search the repository as it is in REV"
 msgstr "当該リビジョン時点のファイル一覧から検索"
 
 msgid "end filenames with NUL, for use with xargs"
@@ -8131,14 +8328,17 @@
 msgid "[-P] [-f] [[-r] REV]"
 msgstr "[-P] [-f] [[-r] REV]"
 
-msgid "a specific revision up to which you would like to push"
-msgstr "反映対象とする上限のリビジョン"
+msgid "a changeset intended to be included in the destination"
+msgstr "反映対象とするリビジョン"
+
+msgid "a specific branch you would like to push"
+msgstr "反映対象とするブランチ"
 
 msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
 msgstr "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
 
-msgid "show parents from the specified revision"
-msgstr "当該リビジョンの親リビジョンを表示"
+msgid "show parents of the specified revision"
+msgstr "親リビジョンの表示対象"
 
 msgid "[-r REV] [FILE]"
 msgstr "[-r REV] [FILE]"
@@ -8149,6 +8349,9 @@
 msgid "update to new branch head if changesets were pulled"
 msgstr "新規取り込みの際には作業領域を新規のブランチヘッドで更新"
 
+msgid "run even when remote repository is unrelated"
+msgstr "連携先が無関係なリポジトリでも実行"
+
 msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
 msgstr "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
 
@@ -8191,8 +8394,8 @@
 msgid "tipmost revision matching date"
 msgstr "当該日時の最新リビジョンを使用"
 
-msgid "revision to revert to"
-msgstr "当該リビジョンの内容で復旧"
+msgid "revert to the specified revision"
+msgstr "当該リビジョン時点の内容で復旧"
 
 msgid "do not save backup copies of files"
 msgstr "取り消し実施前内容のバックアップを抑止"
@@ -8890,6 +9093,16 @@
 "    - if it's a directory, all files ending with .rc are added\n"
 "    - otherwise, the file itself will be added\n"
 "\n"
+"HGPLAIN\n"
+"    When set, this disables any options in .hgrc that might change\n"
+"    Mercurial's default output. This includes encoding, defaults,\n"
+"    verbose mode, debug mode, quiet mode, tracebacks, and\n"
+"    localization. This can be useful when scripting against Mercurial\n"
+"    in the face of existing user configuration.\n"
+"\n"
+"    Equivalent options set via command line flags or environment\n"
+"    variables are not overridden.\n"
+"\n"
 "HGUSER\n"
 "    This is the string used as the author of a commit. If not set,\n"
 "    available values will be considered in this order:\n"
@@ -8970,6 +9183,16 @@
 "    - ディレクトリなら、配下の \".rc\" で終わる名前のファイルを読み込む\n"
 "    - ファイルなら、そのファイル自身を読み込む\n"
 "\n"
+"HGPLAIN\n"
+"    この環境変数が設定された場合、Mercurial の表示設定を変更し得る\n"
+"    .hgrc 中の記述が全て無視されます。encoding や defaults の指定、\n"
+"    verbose モード、debug モード、quiet モード、tracebacks や各国語設定が\n"
+"    対象となります。ユーザ設定を温存したままで、ツール等から Mercurial を\n"
+"    使用する場合に有用です。\n"
+"\n"
+"    コマンドラインや環境変数によって同等のオプションが明示的に指定された\n"
+"    場合には、こららは無視されません。\n"
+"\n"
 "HGUSER\n"
 "    チェンジセット作成者としてコミット時に記録する名前の指定。\n"
 "    作成者名として採用される値の決定順序は以下の通りです:\n"
@@ -9673,6 +9896,9 @@
 "  'default' が定義されている場合でも、'default-push' が定義されていれば\n"
 "  こちらが優先されます。\n"
 
+msgid "dirstate branch not accessible"
+msgstr "dirstate のブランチ情報にアクセスできません"
+
 msgid "can only share local repositories"
 msgstr "共有可能なのはローカルリポジトリのみです"
 
@@ -9842,6 +10068,9 @@
 msgid "push failed (unexpected response):"
 msgstr "履歴反映に失敗(未知のレスポンス):"
 
+msgid "remote: "
+msgstr "遠隔ホスト: "
+
 #, python-format
 msgid "push failed: %s"
 msgstr "履歴反映に失敗: %s"
@@ -9992,6 +10221,12 @@
 msgid "searching for changes\n"
 msgstr "変更点を探索中\n"
 
+msgid "queries"
+msgstr "問い合わせ"
+
+msgid "searching"
+msgstr "検索中"
+
 msgid "already have changeset "
 msgstr "既にチェンジセットがあります "
 
@@ -10010,15 +10245,25 @@
 msgstr "連携先の changegroupsubset 機能未対応により、部分取り込みできません。"
 
 #, python-format
-msgid "abort: push creates new remote branch '%s'!\n"
-msgstr "中断: 反映によって連携先に新しいブランチ '%s' が作成されます!\n"
+msgid "abort: push creates new remote heads on branch '%s'!\n"
+msgstr "中断: 連携先のブランチ '%s' に新しいヘッドが作成されます!\n"
 
 msgid "abort: push creates new remote heads!\n"
-msgstr "中断: 反映によって連携先に新しいヘッドが作成されます!\n"
+msgstr "中断: 連携先に新しいヘッドが作成されます!\n"
 
 msgid "(did you forget to merge? use push -f to force)\n"
 msgstr "(マージは済んでいますか? push -f で強制実行できます)\n"
 
+msgid "(you should pull and merge or use push -f to force)\n"
+msgstr "(pull と merge を実施するか、push -f で強制実行してください)\n"
+
+#, python-format
+msgid "abort: push creates new remote branches: %s!\n"
+msgstr "中断: 連携先に新しいブランチが作成されます:  %s!\n"
+
+msgid "(use 'hg push -f' to force)\n"
+msgstr "('hg push -f' で強制実行できます)\n"
+
 msgid "note: unsynced remote changes!\n"
 msgstr "注意: 連携先での変更点が取り込まれていません!\n"
 
@@ -10026,25 +10271,50 @@
 msgid "%d changesets found\n"
 msgstr "%d 個のチェンジセット\n"
 
+msgid "bundle changes"
+msgstr "チェンジセットをバンドルに追加"
+
+msgid "chunks"
+msgstr "チャンク"
+
+msgid "bundle manifests"
+msgstr "マニフェストをバンドルに追加"
+
 #, python-format
 msgid "empty or missing revlog for %s"
 msgstr "%s に対するリビジョンログが空ないし不在です"
 
+msgid "bundle files"
+msgstr "ファイルをバンドルに追加"
+
 msgid "adding changesets\n"
 msgstr "チェンジセットを追加中\n"
 
+msgid "changesets"
+msgstr "チェンジセット"
+
 msgid "received changelog group is empty"
 msgstr "受信した変更履歴は空です"
 
 msgid "adding manifests\n"
 msgstr "マニフェストを追加中\n"
 
+msgid "manifests"
+msgstr "マニフェスト"
+
 msgid "adding file changes\n"
 msgstr "ファイルの変更を追加中\n"
 
 msgid "received file revlog group is empty"
 msgstr "ファイルのリビジョンログが空です"
 
+msgid "files"
+msgstr "ファイル"
+
+#, python-format
+msgid "missing file data for %s:%s - run hg verify"
+msgstr "%s:%s のファイルデータが不在です - hg verify を実施してください"
+
 #, python-format
 msgid " (%+d heads)"
 msgstr "(%+d個のヘッド)"
@@ -10247,12 +10517,12 @@
 msgstr "ファイル %s は既に存在します\n"
 
 #, python-format
-msgid "Hunk #%d succeeded at %d %s(offset %d line).\n"
-msgstr "ハンク #%d の適用成功:%d 行目 %s 補正行数 %d\n"
-
-#, python-format
-msgid "Hunk #%d succeeded at %d %s(offset %d lines).\n"
-msgstr "ハンク #%d の適用成功:%d 行目 %s 補正行数 %d\n"
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr "ハンク #%d の適用成功:%d 行目、曖昧性 %d (位置補正 %d 行)\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
+msgstr "ハンク #%d の適用成功:%d 行目 (位置補正 %d 行)\n"
 
 #, python-format
 msgid "Hunk #%d FAILED at %d\n"
@@ -10323,6 +10593,9 @@
 msgid "unknown compression type %r"
 msgstr "%r は未知の圧縮形式です"
 
+msgid "index entry flags need RevlogNG"
+msgstr "インデックスエントリフラグは RevlogNG 対応が必要です"
+
 #, python-format
 msgid "index %s unknown flags %#04x for format v0"
 msgstr "インデックス %s: %#04x は未知のフラグです(フォーマット v0)"
@@ -10382,9 +10655,6 @@
 msgid "no suitable response from remote hg"
 msgstr "遠隔ホストの応答が不適切"
 
-msgid "remote: "
-msgstr "遠隔ホスト: "
-
 #, python-format
 msgid "push refused: %s"
 msgstr "履歴反映が拒否されました: %s"
@@ -10573,6 +10843,16 @@
 msgstr "HTTP 認証: ユーザ名 %s, パスワード %s\n"
 
 #, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr "不正な [auth] セクションのキー'%s' を無視します\n"
+
+msgid "certificate checking requires Python 2.6"
+msgstr "証明書検証には Python 2.6 が必要です"
+
+msgid "server identity verification succeeded\n"
+msgstr "サーバ証明書の検証に成功\n"
+
+#, python-format
 msgid "command '%s' failed: %s"
 msgstr "コマンド '%s' 失敗: %s"
 
@@ -10715,6 +10995,9 @@
 msgid "checking changesets\n"
 msgstr "チェンジセットの確認中\n"
 
+msgid "changelog"
+msgstr "チェンジログ"
+
 #, python-format
 msgid "unpacking changeset %s"
 msgstr "リビジョン %s の展開中"
@@ -10736,6 +11019,9 @@
 msgid "crosschecking files in changesets and manifests\n"
 msgstr "チェンジセットとマニフェストによるファイルのクロスチェック中\n"
 
+msgid "crosscheck"
+msgstr "クロスチェック"
+
 #, python-format
 msgid "changeset refers to unknown manifest %s"
 msgstr "未知のマニフェスト %s が参照されています"
--- a/i18n/pt_BR.po	Wed Feb 24 18:22:45 2010 +0100
+++ b/i18n/pt_BR.po	Sun Feb 28 18:06:47 2010 +0100
@@ -266,6 +266,9 @@
 msgid "a bookmark cannot have the name of an existing branch"
 msgstr "um marcador não pode ter o mesmo nome de um ramo existente"
 
+msgid "no bookmarks set\n"
+msgstr "nenhum marcador definido\n"
+
 msgid "force"
 msgstr "forçar"
 
@@ -825,8 +828,8 @@
 "colore a saída de alguns comandos\n"
 "\n"
 "Essa extensão colore a saída dos comandos para realçar diversas\n"
-"informações: nos comandos status e resolve, reflete os estados dos arquivos;\n"
-"no comando qseries, reflete os estados dos patches (aplicado,\n"
+"informações: nos comandos status e resolve, reflete os estados dos\n"
+"arquivos; no comando qseries, reflete os estados dos patches (aplicado,\n"
 "não-aplicado, faltando); e para comandos relacionados com diff,\n"
 "destaca adições, remoções, cabeçalhos de diffs e espaços em branco\n"
 "no final das linhas.\n"
@@ -1262,10 +1265,10 @@
 "        do log do CVS. Essa função recebe uma lista com as entradas do log,\n"
 "        e pode modificar, adicionar ou remover entradas.\n"
 "    --config hook.cvschangesets\n"
-"        Especifica uma função Python a ser chamada após os conjuntos de mudanças\n"
-"        serem calculados a partir do log do CVS. Essa função recebe uma lista\n"
-"        com as entradas do conjunto de mudanças, e pode modificar, adicionar ou\n"
-"        remover suas entradas.\n"
+"        Especifica uma função Python a ser chamada após os conjuntos de\n"
+"        mudanças serem calculados a partir do log do CVS. Essa função\n"
+"        recebe uma lista com as entradas do conjunto de mudanças, e pode\n"
+"        modificar, adicionar ou remover suas entradas.\n"
 "\n"
 "    O comando \"debugcvsps\" do Mercurial permite que o código de mesclagem\n"
 "    interno seja executado fora do processo de conversão. Seus\n"
@@ -2126,6 +2129,10 @@
 msgid "uncommitted merge - please provide a specific revision"
 msgstr "mesclagem não consolidada - por favor forneça uma revisão específica"
 
+#, python-format
+msgid "Signing %d:%s\n"
+msgstr "Assinando %d: %s\n"
+
 msgid "Error while signing"
 msgstr "Erro ao assinar"
 
@@ -2293,6 +2300,10 @@
 "  baseurl = http://server/path/to/repo\n"
 
 #, python-format
+msgid "%s returned an error: %s"
+msgstr "%s devolveu um erro: %s"
+
+#, python-format
 msgid "hgcia: sending update to %s\n"
 msgstr "hgcia: enviando atualização para %s\n"
 
@@ -2866,6 +2877,9 @@
 msgid "unhooked all commit hooks\n"
 msgstr "removidos os registros de todos os ganchos de consolidação\n"
 
+msgid "hg keyword configuration and expansion example"
+msgstr "exemplo de configuração e expansão da extensão keyword"
+
 msgid ""
 "\n"
 "\tkeywords expanded\n"
@@ -3055,8 +3069,8 @@
 "Se configurada como 'keep', a mq irá obedecer a seção [diff] do arquivo de\n"
 "configuração ao preservar patches git existentes em um comando qrefresh. Se\n"
 "configurada como 'yes' ou 'no', a mq irá sobrepor a seção [diff] e sempre\n"
-"gerar patches git ou comuns, respectivamente, possivelmente perdendo dados no\n"
-"segundo caso.\n"
+"gerar patches git ou comuns, respectivamente, possivelmente perdendo dados\n"
+"no segundo caso.\n"
 
 #, python-format
 msgid "mq.git option can be auto/keep/yes/no got %s"
@@ -3551,7 +3565,7 @@
 "\n"
 "    This command is deprecated; use hg -Q commit instead."
 msgstr ""
-"consolida mudanças no repositório da fila de patches (OBSOLETO) "
+"consolida mudanças no repositório da fila de patches (OBSOLETO)\n"
 "\n"
 "    Este comando é obsoleto; use hg -Q commit em seu lugar."
 
@@ -3835,22 +3849,25 @@
 msgid "A patch named %s already exists in the series file"
 msgstr "Um patch de nome %s já existe no arquivo series"
 
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr "renomeando %s para %s\n"
+
 msgid ""
 "restore the queue state saved by a revision (DEPRECATED)\n"
 "\n"
 "    This command is deprecated, use rebase --mq instead."
 msgstr ""
-"restaura o estado da fila salvo por uma revisão (OBSOLETO) "
-"\n"
-"    Este comando é obsoleto, use "
+"restaura o estado da fila salvo por uma revisão (OBSOLETO)\n"
+"\n"
+"    Este comando é obsoleto, use rebase --mq em seu lugar."
 
 msgid ""
 "save current queue state (DEPRECATED)\n"
 "\n"
 "    This command is deprecated, use rebase --mq instead."
 msgstr ""
-"salva o estado atual da fila (OBSOLETO) "
-"\n"
+"salva o estado atual da fila (OBSOLETO)\n"
 "    Este comando é obsoleto, use rebase --mq em seu lugar."
 
 #, python-format
@@ -4952,15 +4969,17 @@
 "\n"
 "  [progress]\n"
 "  delay = 3 # número de segundos (float) antes que a barra seja mostrada\n"
-"  refresh = 0.1 # tempo em segundos entre atualizações da barra de progresso\n"
+"  refresh = 0.1 # tempo em segundos entre atualizações da\n"
+"                # barra de progresso\n"
 "  format = topic bar number # formato da barra de progresso\n"
-"  width = <none> # se definido, será a largura máxima da informação de progresso\n"
-"                 # (isto é, min(largura, largura do terminal) será usada)\n"
+"  width = <none> # se definido, será a largura máxima da informação de\n"
+"                 # progresso (isto é, min(largura, largura do terminal)\n"
+"                 # será usada)\n"
 "  clear-complete = True # limpa a barra de progresso após terminar\n"
 "\n"
 "Entradas válidas para o campo format são topic (tópico), bar (barra),\n"
-"number (número), unit (unidade) e item (item). item por padrão são os últimos\n"
-"caracteres do item, mas isto pode ser modificado adicionando ou\n"
+"number (número), unit (unidade) e item (item). item por padrão são os\n"
+"últimos caracteres do item, mas isto pode ser modificado adicionando ou\n"
 "``-<num>``, que consideraria os últimos num caracteres, ou ``+<num>``\n"
 "para os primeiros num caracteres.\n"
 
@@ -5200,8 +5219,8 @@
 "hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--detach] [--keep] [--"
 "keepbranches] | [-c] | [-a]"
 msgstr ""
-"hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--detach] [--keep]"
-" [--keepbranches] [-c] | [-a]"
+"hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--detach] [--keep] [--"
+"keepbranches] [-c] | [-a]"
 
 msgid "commands to interactively select changes for commit/qrefresh"
 msgstr "comandos para selecionar interativamente mudanças em um commit ou qrefresh"
@@ -5599,9 +5618,29 @@
 msgid "commit failed"
 msgstr "falha ao consolidar"
 
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+"y: transplante esta revisão\n"
+"n: pula esta revisão\n"
+"m: mescal nesta revisão\n"
+"p: mostra o patch\n"
+"c: consolida revisões selecionadas\n"
+"q: cancela o transplante\n"
+"?: exibe esta ajuda\n"
+
 msgid "apply changeset? [ynmpcq?]:"
 msgstr "aplicar revisão? [ynmpcq?]:"
 
+msgid "no such option\n"
+msgstr "não existe tal opção\n"
+
 msgid ""
 "transplant changesets from another branch\n"
 "\n"
@@ -7165,6 +7204,9 @@
 "    revisions are specified, the working directory files are compared\n"
 "    to its parent.\n"
 "\n"
+"    Alternatively you can specify -c/--change with a revision to see\n"
+"    the changes in that changeset relative to its first parent.\n"
+"\n"
 "    Without the -a/--text option, diff will avoid generating diffs of\n"
 "    files it detects as binary. With -a, diff will generate a diff\n"
 "    anyway, probably with undesirable results.\n"
@@ -7190,6 +7232,9 @@
 "    trabalho, e se não for especificada uma revisão, os arquivos do\n"
 "    diretório de trabalho serão comparados com seu pai.\n"
 "\n"
+"    Alternativamente você pode especificar -c/--change com uma revisão\n"
+"    para ver as mudanças nessa revisão relativas a seu primeiro pai.\n"
+"\n"
 "    Sem a opção -a/--text, diff evitará gerar diffs de arquivos que\n"
 "    detectar como binários. Com -a, diff irá gerar um diff de\n"
 "    qualquer maneira, provavelmente com resultados não desejados.\n"
@@ -7842,7 +7887,9 @@
 
 #, python-format
 msgid "abort: branch '%s' has %d heads - please merge with an explicit rev\n"
-msgstr "abortado: o ramo '%s' tem %d cabeças - por favor mescle com uma revisão específica\n"
+msgstr ""
+"abortado: o ramo '%s' tem %d cabeças - por favor mescle com uma revisão "
+"específica\n"
 
 msgid "(run 'hg heads .' to see heads)\n"
 msgstr "(execute 'hg heads .' para ver as cabeças)\n"
@@ -8636,19 +8683,19 @@
 
 #, python-format
 msgid "tag '%s' does not exist"
-msgstr "etiqueta '%s' não existe"
+msgstr "a etiqueta '%s' não existe"
 
 #, python-format
 msgid "tag '%s' is not a global tag"
-msgstr "etiqueta '%s' não é uma etiqueta global"
+msgstr "a etiqueta '%s' não é uma etiqueta global"
 
 #, python-format
 msgid "tag '%s' is not a local tag"
-msgstr "etiqueta '%s' não é uma etiqueta local"
+msgstr "a etiqueta '%s' não é uma etiqueta local"
 
 #, python-format
 msgid "tag '%s' already exists (use -f to force)"
-msgstr "etiqueta '%s' já existe (use -f para forçar)"
+msgstr "a etiqueta '%s' já existe (use -f para forçar)"
 
 msgid ""
 "list repository tags\n"
@@ -8837,8 +8884,8 @@
 msgid "enable additional output"
 msgstr "habilita saída adicional"
 
-msgid "set/override config option"
-msgstr "define/sobrepõe opção de configuração"
+msgid "set/override config option (use 'section.name=value')"
+msgstr "define/sobrepõe opção de configuração (use 'seção.nome=valor')"
 
 msgid "enable debugging output"
 msgstr "habilita saída de depuração"
@@ -9148,8 +9195,8 @@
 msgid "revision to check"
 msgstr "revisão para verificar"
 
-msgid "[OPTION]... [-r REV1 [-r REV2]] [FILE]..."
-msgstr "[OPÇÃO]... [-r REV1 [-r REV2]] [ARQUIVO]..."
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr "[OPÇÃO]... ([-c REV] | [-r REV1 [-r REV2]]) [ARQUIVO]..."
 
 msgid "diff against the second parent"
 msgstr "faz o diff com o segundo pai"
@@ -11115,6 +11162,9 @@
 msgid "push failed (unexpected response):"
 msgstr "o push falhou (resposta inesperada):"
 
+msgid "remote: "
+msgstr "remoto: "
+
 #, python-format
 msgid "push failed: %s"
 msgstr "o push falhou: %s"
@@ -11269,6 +11319,12 @@
 msgid "searching for changes\n"
 msgstr "procurando por mudanças\n"
 
+msgid "queries"
+msgstr "consultas"
+
+msgid "searching"
+msgstr "procurando"
+
 msgid "already have changeset "
 msgstr "já possui a revisão "
 
@@ -11315,25 +11371,46 @@
 msgid "%d changesets found\n"
 msgstr "%d revisões encontradas\n"
 
+msgid "bundle changes"
+msgstr "empacotando mudanças"
+
+msgid "chunks"
+msgstr "trechos"
+
+msgid "bundle manifests"
+msgstr "empacotando manifestos"
+
 #, python-format
 msgid "empty or missing revlog for %s"
 msgstr "revlog vazio ou não encontrado para %s"
 
+msgid "bundle files"
+msgstr "empacotando arquivos"
+
 msgid "adding changesets\n"
 msgstr "adicionando revisões\n"
 
+msgid "changesets"
+msgstr "revisões"
+
 msgid "received changelog group is empty"
 msgstr "grupo de changelogs recebido é vazio"
 
 msgid "adding manifests\n"
 msgstr "adicionando manifestos\n"
 
+msgid "manifests"
+msgstr "manifestos"
+
 msgid "adding file changes\n"
 msgstr "adicionando mudanças em arquivos\n"
 
 msgid "received file revlog group is empty"
 msgstr "grupo recebido de arquivos revlog vazio"
 
+msgid "files"
+msgstr "arquivos"
+
 #, python-format
 msgid "missing file data for %s:%s - run hg verify"
 msgstr "faltando dados de arquivo para %s:%s - execute hg verify"
@@ -11546,12 +11623,14 @@
 msgstr "arquivo %s já existe\n"
 
 #, python-format
-msgid "Hunk #%d succeeded at %d %s(offset %d line).\n"
-msgstr "Trecho #%d aplicado com sucesso em %d %s(distância %d linha).\n"
-
-#, python-format
-msgid "Hunk #%d succeeded at %d %s(offset %d lines).\n"
-msgstr "Trecho #%d aplicado com sucesso em %d %s(distância %d linhas).\n"
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr ""
+"Trecho #%d aplicado com sucesso em %d com indistinção %d (distância %d "
+"linhas).\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
+msgstr "Trecho #%d aplicado com sucesso em %d (distância %d linhas).\n"
 
 #, python-format
 msgid "Hunk #%d FAILED at %d\n"
@@ -11684,9 +11763,6 @@
 msgid "no suitable response from remote hg"
 msgstr "nenhuma resposta adequada do hg remoto"
 
-msgid "remote: "
-msgstr "remoto: "
-
 #, python-format
 msgid "push refused: %s"
 msgstr "envio recusado: %s"
@@ -11874,6 +11950,10 @@
 msgid "http auth: user %s, password %s\n"
 msgstr "autenticação http: usuário %s, senha %s\n"
 
+#, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr "ignorando chave inválida em [auth] '%s'\n"
+
 msgid "certificate checking requires Python 2.6"
 msgstr "verificação de certificado exige Python 2.6"
 
@@ -12023,6 +12103,9 @@
 msgid "checking changesets\n"
 msgstr "checando revisões\n"
 
+msgid "changelog"
+msgstr "changelog"
+
 #, python-format
 msgid "unpacking changeset %s"
 msgstr "desempacotando revisão %s"
@@ -12044,6 +12127,9 @@
 msgid "crosschecking files in changesets and manifests\n"
 msgstr "checagem cruzada de arquivos em revisões e no manifesto\n"
 
+msgid "crosscheck"
+msgstr "checagem cruzada"
+
 #, python-format
 msgid "changeset refers to unknown manifest %s"
 msgstr "revisão se refere a manifesto desconhecido %s"
--- a/i18n/sv.po	Wed Feb 24 18:22:45 2010 +0100
+++ b/i18n/sv.po	Sun Feb 28 18:06:47 2010 +0100
@@ -13,8 +13,8 @@
 msgstr ""
 "Project-Id-Version: Mercurial\n"
 "Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2010-02-16 18:12+0100\n"
-"PO-Revision-Date: 2010-02-16 22:01+0100\n"
+"POT-Creation-Date: 2010-02-24 19:41+0100\n"
+"PO-Revision-Date: 2010-02-24 19:47+0100\n"
 "Last-Translator: Jens Bäckman <jens.backman@gmail.com>\n"
 "Language-Team: Swedish\n"
 "MIME-Version: 1.0\n"
@@ -159,8 +159,11 @@
 msgid "a bookmark cannot have the name of an existing branch"
 msgstr ""
 
+msgid "no bookmarks set\n"
+msgstr "inga bokmärken satta\n"
+
 msgid "force"
-msgstr ""
+msgstr "tvinga"
 
 msgid "revision"
 msgstr "revision"
@@ -1436,6 +1439,10 @@
 msgid "uncommitted merge - please provide a specific revision"
 msgstr ""
 
+#, python-format
+msgid "Signing %d:%s\n"
+msgstr "Signerar %d:%s\n"
+
 msgid "Error while signing"
 msgstr ""
 
@@ -1554,6 +1561,10 @@
 msgstr ""
 
 #, python-format
+msgid "%s returned an error: %s"
+msgstr "%s returnerade ett fel: %s"
+
+#, python-format
 msgid "hgcia: sending update to %s\n"
 msgstr ""
 
@@ -1987,6 +1998,9 @@
 msgid "unhooked all commit hooks\n"
 msgstr ""
 
+msgid "hg keyword configuration and expansion example"
+msgstr "exempel på nyckelordskonfiguration och -expansion i hg"
+
 msgid ""
 "\n"
 "\tkeywords expanded\n"
@@ -2718,6 +2732,10 @@
 msgid "A patch named %s already exists in the series file"
 msgstr ""
 
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr "döper om %s till %s\n"
+
 msgid ""
 "restore the queue state saved by a revision (DEPRECATED)\n"
 "\n"
@@ -3988,8 +4006,28 @@
 msgid "commit failed"
 msgstr ""
 
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+"y: transplantera denna ändring\n"
+"n: hoppa över denna ändring\n"
+"m: sammanfoga vid denna ändring\n"
+"p: visa patch\n"
+"c: arkivera valda ändringar\n"
+"q: avbryt transplantation\n"
+"?: visa denna hjälp\n"
+
 msgid "apply changeset? [ynmpcq?]:"
-msgstr ""
+msgstr "applicera ändring? [ynmpcq?]:"
+
+msgid "no such option\n"
+msgstr "inget sådant alternativ\n"
 
 msgid ""
 "transplant changesets from another branch\n"
@@ -5352,6 +5390,9 @@
 "    revisions are specified, the working directory files are compared\n"
 "    to its parent.\n"
 "\n"
+"    Alternatively you can specify -c/--change with a revision to see\n"
+"    the changes in that changeset relative to its first parent.\n"
+"\n"
 "    Without the -a/--text option, diff will avoid generating diffs of\n"
 "    files it detects as binary. With -a, diff will generate a diff\n"
 "    anyway, probably with undesirable results.\n"
@@ -5375,6 +5416,9 @@
 "    arbetskatalogen, och om ingen revision anges, jämförs arbetskatalogens\n"
 "    filer med dess förälder.\n"
 "\n"
+"    Alternativt så kan du ange -c/--change med en revision för att se\n"
+"    modifikationerna i den ändringen relativt till dess första förälder.\n"
+"\n"
 "    Utan flaggan -a/--text, kommer diff att försöka undvika att visa\n"
 "    skillnader mellan binära filer. Med -a, kommer en diff att skapas ändå,\n"
 "    troligtvis med oönskade resultat.\n"
@@ -7217,8 +7261,8 @@
 msgid "revision to check"
 msgstr "revision att kontrollera"
 
-msgid "[OPTION]... [-r REV1 [-r REV2]] [FILE]..."
-msgstr "[FLAGGA]... [-r REV1 [-r REV2]] [FIL]..."
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr "[FLAGGA]... ([-c REV] | [-r REV1 [-r REV2]]) [FIL]..."
 
 msgid "diff against the second parent"
 msgstr "diffa mot den andra föräldern"
@@ -8799,6 +8843,12 @@
 msgid "searching for changes\n"
 msgstr "söker efter ändringar\n"
 
+msgid "queries"
+msgstr "frågar"
+
+msgid "searching"
+msgstr "söker"
+
 msgid "already have changeset "
 msgstr ""
 
@@ -8844,25 +8894,46 @@
 msgid "%d changesets found\n"
 msgstr "%d ändringar hittades\n"
 
+msgid "bundle changes"
+msgstr "bunta ändringar"
+
+msgid "chunks"
+msgstr "stycken"
+
+msgid "bundle manifests"
+msgstr "bunta manifest"
+
 #, python-format
 msgid "empty or missing revlog for %s"
 msgstr "tom eller saknad revlog för %s"
 
+msgid "bundle files"
+msgstr "bunta filer"
+
 msgid "adding changesets\n"
 msgstr "lägger till ändringar\n"
 
+msgid "changesets"
+msgstr "ändringar"
+
 msgid "received changelog group is empty"
 msgstr "mottagen ändringsgrupp är tom"
 
 msgid "adding manifests\n"
 msgstr "lägger till manifest\n"
 
+msgid "manifests"
+msgstr "manifest"
+
 msgid "adding file changes\n"
 msgstr "lägger till filändringar\n"
 
 msgid "received file revlog group is empty"
 msgstr "mottagen revlog-grupp för filer är tom"
 
+msgid "files"
+msgstr "filer"
+
 #, python-format
 msgid "missing file data for %s:%s - run hg verify"
 msgstr "fildata för %s:%s saknas - kör hg verify"
@@ -9061,12 +9132,12 @@
 msgstr ""
 
 #, python-format
-msgid "Hunk #%d succeeded at %d %s(offset %d line).\n"
-msgstr ""
-
-#, python-format
-msgid "Hunk #%d succeeded at %d %s(offset %d lines).\n"
-msgstr ""
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr "Stycke #%d lyckades vid %d med luddigheten %d (offset %d rader).\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
+msgstr "Stycke #%d lyckades vid %d (offset %d rader).\n"
 
 #, python-format
 msgid "Hunk #%d FAILED at %d\n"
@@ -9383,6 +9454,10 @@
 msgid "http auth: user %s, password %s\n"
 msgstr ""
 
+#, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr "ignorerar ogiltig [auth]-nyckel '%s'\n"
+
 msgid "certificate checking requires Python 2.6"
 msgstr "certifikatkontroll kräver Python 2.6"
 
@@ -9532,6 +9607,9 @@
 msgid "checking changesets\n"
 msgstr "kontrollerar ändringar\n"
 
+msgid "changelog"
+msgstr "ändringslogg"
+
 #, python-format
 msgid "unpacking changeset %s"
 msgstr ""
@@ -9553,6 +9631,9 @@
 msgid "crosschecking files in changesets and manifests\n"
 msgstr "korskontrollerar filer i ändringar och manifest\n"
 
+msgid "crosscheck"
+msgstr "korskontroll"
+
 #, python-format
 msgid "changeset refers to unknown manifest %s"
 msgstr ""
--- a/mercurial/commands.py	Wed Feb 24 18:22:45 2010 +0100
+++ b/mercurial/commands.py	Sun Feb 28 18:06:47 2010 +0100
@@ -3334,7 +3334,8 @@
      _('do not prompt, assume \'yes\' for any required answers')),
     ('q', 'quiet', None, _('suppress output')),
     ('v', 'verbose', None, _('enable additional output')),
-    ('', 'config', [], _('set/override config option')),
+    ('', 'config', [],
+     _('set/override config option (use \'section.name=value\')')),
     ('', 'debug', None, _('enable debugging output')),
     ('', 'debugger', None, _('start debugger')),
     ('', 'encoding', encoding.encoding, _('set the charset encoding')),
--- a/mercurial/filemerge.py	Wed Feb 24 18:22:45 2010 +0100
+++ b/mercurial/filemerge.py	Sun Feb 28 18:06:47 2010 +0100
@@ -205,7 +205,7 @@
             out, a = a, back # read input from backup, write to original
         replace = dict(local=a, base=b, other=c, output=out)
         args = re.sub("\$(local|base|other|output)",
-                      lambda x: '"%s"' % replace[x.group()[1:]], args)
+            lambda x: '"%s"' % util.localpath(replace[x.group()[1:]]), args)
         r = util.system(toolpath + ' ' + args, cwd=repo.root, environ=env)
 
     if not r and _toolbool(ui, tool, "checkconflicts"):
--- a/mercurial/hgweb/protocol.py	Wed Feb 24 18:22:45 2010 +0100
+++ b/mercurial/hgweb/protocol.py	Sun Feb 28 18:06:47 2010 +0100
@@ -62,13 +62,9 @@
     yield resp
 
 def between(repo, req):
-    if 'pairs' in req.form:
-        pairs = [map(bin, p.split("-"))
-                 for p in req.form['pairs'][0].split(" ")]
-    resp = cStringIO.StringIO()
-    for b in repo.between(pairs):
-        resp.write(" ".join(map(hex, b)) + "\n")
-    resp = resp.getvalue()
+    pairs = [map(bin, p.split("-"))
+             for p in req.form['pairs'][0].split(" ")]
+    resp = ''.join(" ".join(map(hex, b)) + "\n" for b in repo.between(pairs))
     req.respond(HTTP_OK, HGTYPE, length=len(resp))
     yield resp
 
--- a/mercurial/httprepo.py	Wed Feb 24 18:22:45 2010 +0100
+++ b/mercurial/httprepo.py	Sun Feb 28 18:06:47 2010 +0100
@@ -239,7 +239,8 @@
                 except ValueError, err:
                     raise error.ResponseError(
                             _('push failed (unexpected response):'), resp)
-                self.ui.write(output)
+                for l in output.splitlines(True):
+                    self.ui.status(_('remote: '), l)
                 return ret
             except socket.error, err:
                 if err[0] in (errno.ECONNRESET, errno.EPIPE):
--- a/mercurial/localrepo.py	Wed Feb 24 18:22:45 2010 +0100
+++ b/mercurial/localrepo.py	Sun Feb 28 18:06:47 2010 +0100
@@ -622,16 +622,19 @@
         finally:
             release(lock, wlock)
 
-    def invalidate(self):
-        for a in "changelog manifest".split():
-            if a in self.__dict__:
-                delattr(self, a)
+    def invalidatecaches(self):
         self._tags = None
         self._tagtypes = None
         self.nodetagscache = None
         self._branchcache = None # in UTF-8
         self._branchcachetip = None
 
+    def invalidate(self):
+        for a in "changelog manifest".split():
+            if a in self.__dict__:
+                delattr(self, a)
+        self.invalidatecaches()
+
     def _lock(self, lockname, wait, releasefn, acquirefn, desc):
         try:
             l = lock.lock(lockname, 0, releasefn, desc=desc)
@@ -957,7 +960,7 @@
         # head, refresh the tag cache, then immediately add a new head.
         # But I think doing it this way is necessary for the "instant
         # tag cache retrieval" case to work.
-        tags_.findglobaltags(self.ui, self, {}, {})
+        self.invalidatecaches()
 
     def walk(self, match, node=None):
         '''
--- a/mercurial/pure/diffhelpers.py	Wed Feb 24 18:22:45 2010 +0100
+++ b/mercurial/pure/diffhelpers.py	Sun Feb 28 18:06:47 2010 +0100
@@ -34,11 +34,15 @@
 
 def fix_newline(hunk, a, b):
     l = hunk[-1]
-    c = l[0]
-    hline = l[:-1]
+    # tolerate CRLF in last line
+    if l.endswith('\r\n'):
+        hline = l[:-2]
+    else:
+        hline = l[:-1]
+    c = hline[0]
 
     if c == " " or c == "+":
-        b[-1] = l[1:-1]
+        b[-1] = hline[1:]
     if c == " " or c == "-":
         a[-1] = hline
     hunk[-1] = hline
--- a/mercurial/url.py	Wed Feb 24 18:22:45 2010 +0100
+++ b/mercurial/url.py	Sun Feb 28 18:06:47 2010 +0100
@@ -140,6 +140,9 @@
         # Read configuration
         config = dict()
         for key, val in self.ui.configitems('auth'):
+            if '.' not in key:
+                self.ui.warn(_("ignoring invalid [auth] key '%s'\n") % key)
+                continue
             group, setting = key.split('.', 1)
             gdict = config.setdefault(group, dict())
             gdict[setting] = val
--- a/tests/test-branchmap.out	Wed Feb 24 18:22:45 2010 +0100
+++ b/tests/test-branchmap.out	Sun Feb 28 18:06:47 2010 +0100
@@ -17,10 +17,10 @@
 
 pushing to http://localhost:PORT
 searching for changes
-adding changesets
-adding manifests
-adding file changes
-added 1 changesets with 1 changes to 1 files
+remote: adding changesets
+remote: adding manifests
+remote: adding file changes
+remote: added 1 changesets with 1 changes to 1 files
 changeset:   1:58e7c90d67cb
 branch:      æ
 tag:         tip
--- a/tests/test-extension.out	Wed Feb 24 18:22:45 2010 +0100
+++ b/tests/test-extension.out	Sun Feb 28 18:06:47 2010 +0100
@@ -56,7 +56,7 @@
  -y --noninteractive  do not prompt, assume 'yes' for any required answers
  -q --quiet           suppress output
  -v --verbose         enable additional output
-    --config          set/override config option
+    --config          set/override config option (use 'section.name=value')
     --debug           enable debugging output
     --debugger        start debugger
     --encoding        set the charset encoding (default: ascii)
@@ -82,7 +82,7 @@
  -y --noninteractive  do not prompt, assume 'yes' for any required answers
  -q --quiet           suppress output
  -v --verbose         enable additional output
-    --config          set/override config option
+    --config          set/override config option (use 'section.name=value')
     --debug           enable debugging output
     --debugger        start debugger
     --encoding        set the charset encoding (default: ascii)
--- a/tests/test-help.out	Wed Feb 24 18:22:45 2010 +0100
+++ b/tests/test-help.out	Sun Feb 28 18:06:47 2010 +0100
@@ -220,7 +220,7 @@
  -y --noninteractive  do not prompt, assume 'yes' for any required answers
  -q --quiet           suppress output
  -v --verbose         enable additional output
-    --config          set/override config option
+    --config          set/override config option (use 'section.name=value')
     --debug           enable debugging output
     --debugger        start debugger
     --encoding        set the charset encoding (default: ascii)
@@ -288,7 +288,7 @@
  -y --noninteractive  do not prompt, assume 'yes' for any required answers
  -q --quiet           suppress output
  -v --verbose         enable additional output
-    --config          set/override config option
+    --config          set/override config option (use 'section.name=value')
     --debug           enable debugging output
     --debugger        start debugger
     --encoding        set the charset encoding (default: ascii)
--- a/tests/test-push-http.out	Wed Feb 24 18:22:45 2010 +0100
+++ b/tests/test-push-http.out	Sun Feb 28 18:06:47 2010 +0100
@@ -4,7 +4,7 @@
 % expect ssl error
 pushing to http://localhost:$HGPORT/
 searching for changes
-ssl required
+remote: ssl required
 % serve errors
 % expect authorization error
 abort: authorization failed
@@ -19,10 +19,10 @@
 % expect success
 pushing to http://localhost:$HGPORT/
 searching for changes
-adding changesets
-adding manifests
-adding file changes
-added 1 changesets with 1 changes to 1 files
+remote: adding changesets
+remote: adding manifests
+remote: adding file changes
+remote: added 1 changesets with 1 changes to 1 files
 % serve errors
 changegroup hook: HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_URL=remote:http 
 rolling back last transaction
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-rebase-cache	Sun Feb 28 18:06:47 2010 +0100
@@ -0,0 +1,104 @@
+#!/bin/sh
+
+createrepo() {
+    rm -rf repo
+    hg init repo
+    cd repo
+
+    echo "a" > a
+    hg commit -d '0 0' -A -m 'A'
+
+    hg branch branch1
+    hg commit -d '1 0' -m 'Branch1'
+
+    echo "b" > b
+    hg commit -A -d '2 0' -m 'B'
+
+    hg up 0
+    hg branch branch2
+    hg commit -d '3 0' -m 'Branch2'
+
+    echo "c" > C
+    hg commit -A -d '4 0' -m 'C'
+
+    hg up 2
+    hg branch -f branch2
+    echo "d" > d
+    hg commit -A -d '5 0' -m 'D'
+
+    echo "e" > e
+    hg commit -A -d '6 0' -m 'E'
+
+    hg update default
+
+    hg branch branch3
+    hg commit -d '7 0' -m 'Branch3'
+
+    echo "f" > f
+    hg commit -A -d '8 0' -m 'F'
+}
+
+echo
+createrepo > /dev/null 2>&1
+hg --config extensions.hgext.graphlog= glog --template '{rev}:{node|short} {desc} branch: {branches}\n'
+
+echo
+echo '% Branches'
+hg branches
+
+echo
+echo '% Heads'
+hg heads --template '{rev}:{node|short} {desc} branch: {branches}\n'
+
+echo
+echo '% Rebase part of branch2 (5-6) onto branch3 (8)'
+hg --config extensions.hgext.rebase= rebase --detach -s 5 -d 8 2>&1 | sed 's/\(saving bundle to \).*/\1/'
+
+echo
+echo '% Branches'
+hg branches
+
+echo
+echo '% Heads'
+hg heads --template '{rev}:{node|short} {desc} branch: {branches}\n'
+
+echo
+hg --config extensions.hgext.graphlog= glog --template '{rev}:{node|short} {desc} branch: {branches}\n'
+
+echo
+echo '% Rebase head of branch3 (8) onto branch2 (6)'
+createrepo > /dev/null 2>&1
+hg --config extensions.hgext.graphlog= glog --template '{rev}:{node|short} {desc} branch: {branches}\n'
+
+hg --config extensions.hgext.rebase= rebase --detach -s 8 -d 6 2>&1 | sed 's/\(saving bundle to \).*/\1/'
+
+echo
+echo '% Branches'
+hg branches
+
+echo
+echo '% Heads'
+hg heads --template '{rev}:{node|short} {desc} branch: {branches}\n'
+
+echo
+hg --config extensions.hgext.graphlog= glog --template '{rev}:{node|short} {desc} branch: {branches}\n'
+hg verify -q
+
+echo
+echo '% Rebase entire branch3 (7-8) onto branch2 (6)'
+createrepo > /dev/null 2>&1
+hg --config extensions.hgext.graphlog= glog --template '{rev}:{node|short} {desc} branch: {branches}\n'
+
+hg --config extensions.hgext.rebase= rebase --detach -s 7 -d 6 2>&1 | sed 's/\(saving bundle to \).*/\1/'
+
+echo
+echo '% Branches'
+hg branches
+
+echo
+echo '% Heads'
+hg heads --template '{rev}:{node|short} {desc} branch: {branches}\n'
+
+echo
+hg --config extensions.hgext.graphlog= glog --template '{rev}:{node|short} {desc} branch: {branches}\n'
+hg verify -q
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-rebase-cache.out	Sun Feb 28 18:06:47 2010 +0100
@@ -0,0 +1,186 @@
+
+@  8:c11d5b3e9c00 F branch: branch3
+|
+o  7:33c9da881988 Branch3 branch: branch3
+|
+| o  6:0e4064ab11a3 E branch: branch2
+| |
+| o  5:5ac035cb5d8f D branch: branch2
+| |
+| | o  4:8e66061486ee C branch: branch2
+| | |
++---o  3:99567862abbe Branch2 branch: branch2
+| |
+| o  2:65a26a4d12f6 B branch: branch1
+| |
+| o  1:0f3f3010ee16 Branch1 branch: branch1
+|/
+o  0:1994f17a630e A branch:
+
+
+% Branches
+branch3                        8:c11d5b3e9c00
+branch2                        6:0e4064ab11a3
+branch1                        2:65a26a4d12f6 (inactive)
+default                        0:1994f17a630e (inactive)
+
+% Heads
+8:c11d5b3e9c00 F branch: branch3
+6:0e4064ab11a3 E branch: branch2
+4:8e66061486ee C branch: branch2
+2:65a26a4d12f6 B branch: branch1
+0:1994f17a630e A branch: 
+
+% Rebase part of branch2 (5-6) onto branch3 (8)
+saving bundle to 
+adding branch
+adding changesets
+adding manifests
+adding file changes
+added 4 changesets with 3 changes to 3 files (+1 heads)
+rebase completed
+
+% Branches
+branch3                        8:c9bfa9beb84e
+branch2                        4:8e66061486ee
+branch1                        2:65a26a4d12f6
+default                        0:1994f17a630e (inactive)
+
+% Heads
+8:c9bfa9beb84e E branch: branch3
+4:8e66061486ee C branch: branch2
+2:65a26a4d12f6 B branch: branch1
+0:1994f17a630e A branch: 
+
+@  8:c9bfa9beb84e E branch: branch3
+|
+o  7:bf9037384081 D branch: branch3
+|
+o  6:c11d5b3e9c00 F branch: branch3
+|
+o  5:33c9da881988 Branch3 branch: branch3
+|
+| o  4:8e66061486ee C branch: branch2
+| |
+| o  3:99567862abbe Branch2 branch: branch2
+|/
+| o  2:65a26a4d12f6 B branch: branch1
+| |
+| o  1:0f3f3010ee16 Branch1 branch: branch1
+|/
+o  0:1994f17a630e A branch:
+
+
+% Rebase head of branch3 (8) onto branch2 (6)
+@  8:c11d5b3e9c00 F branch: branch3
+|
+o  7:33c9da881988 Branch3 branch: branch3
+|
+| o  6:0e4064ab11a3 E branch: branch2
+| |
+| o  5:5ac035cb5d8f D branch: branch2
+| |
+| | o  4:8e66061486ee C branch: branch2
+| | |
++---o  3:99567862abbe Branch2 branch: branch2
+| |
+| o  2:65a26a4d12f6 B branch: branch1
+| |
+| o  1:0f3f3010ee16 Branch1 branch: branch1
+|/
+o  0:1994f17a630e A branch:
+
+saving bundle to 
+adding branch
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 1 changes to 1 files
+rebase completed
+
+% Branches
+branch2                        8:b44d3024f247
+branch3                        7:33c9da881988
+branch1                        2:65a26a4d12f6 (inactive)
+default                        0:1994f17a630e (inactive)
+
+% Heads
+8:b44d3024f247 F branch: branch2
+7:33c9da881988 Branch3 branch: branch3
+4:8e66061486ee C branch: branch2
+2:65a26a4d12f6 B branch: branch1
+0:1994f17a630e A branch: 
+
+@  8:b44d3024f247 F branch: branch2
+|
+| o  7:33c9da881988 Branch3 branch: branch3
+| |
+o |  6:0e4064ab11a3 E branch: branch2
+| |
+o |  5:5ac035cb5d8f D branch: branch2
+| |
+| | o  4:8e66061486ee C branch: branch2
+| | |
+| | o  3:99567862abbe Branch2 branch: branch2
+| |/
+o |  2:65a26a4d12f6 B branch: branch1
+| |
+o |  1:0f3f3010ee16 Branch1 branch: branch1
+|/
+o  0:1994f17a630e A branch:
+
+
+% Rebase entire branch3 (7-8) onto branch2 (6)
+@  8:c11d5b3e9c00 F branch: branch3
+|
+o  7:33c9da881988 Branch3 branch: branch3
+|
+| o  6:0e4064ab11a3 E branch: branch2
+| |
+| o  5:5ac035cb5d8f D branch: branch2
+| |
+| | o  4:8e66061486ee C branch: branch2
+| | |
++---o  3:99567862abbe Branch2 branch: branch2
+| |
+| o  2:65a26a4d12f6 B branch: branch1
+| |
+| o  1:0f3f3010ee16 Branch1 branch: branch1
+|/
+o  0:1994f17a630e A branch:
+
+saving bundle to 
+adding branch
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 1 changes to 1 files
+rebase completed
+
+% Branches
+branch2                        7:b44d3024f247
+branch1                        2:65a26a4d12f6 (inactive)
+default                        0:1994f17a630e (inactive)
+
+% Heads
+7:b44d3024f247 F branch: branch2
+4:8e66061486ee C branch: branch2
+2:65a26a4d12f6 B branch: branch1
+0:1994f17a630e A branch: 
+
+@  7:b44d3024f247 F branch: branch2
+|
+o  6:0e4064ab11a3 E branch: branch2
+|
+o  5:5ac035cb5d8f D branch: branch2
+|
+| o  4:8e66061486ee C branch: branch2
+| |
+| o  3:99567862abbe Branch2 branch: branch2
+| |
+o |  2:65a26a4d12f6 B branch: branch1
+| |
+o |  1:0f3f3010ee16 Branch1 branch: branch1
+|/
+o  0:1994f17a630e A branch:
+