monotone-commits-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Monotone-commits-diffs] net.venge.monotone: 53e02eaa302bc05e96a18e3882b


From: code
Subject: [Monotone-commits-diffs] net.venge.monotone: 53e02eaa302bc05e96a18e3882b0e9843b53cf9a
Date: Mon, 14 May 2012 02:33:11 +0200 (CEST)

revision:            53e02eaa302bc05e96a18e3882b0e9843b53cf9a
date:                2012-05-14T00:32:33
author:              address@hidden
branch:              net.venge.monotone
changelog:
propagate from branch 'net.venge.monotone.lua-5.2' (head 
aad657f04d0f21ece638434694aeabc833f37aa4)
            to branch 'net.venge.monotone' (head 
384d89bf03cca6815b2df2580001d67378e41d26)



manifest:
format_version "1"

new_manifest [99e1fc2b67ab43131bcb46fdd6aa4a8cb56e3b0c]

old_revision [384d89bf03cca6815b2df2580001d67378e41d26]

patch "INSTALL_windows_cygwin.txt"
 from [46b16835478139759c0f52b531f16b6731e26314]
   to [155d548dd4bd91fa35deb7166c06a9353d615a23]

patch "INSTALL_windows_native.txt"
 from [d67a72a79605d8e65abc2529e06481fad204724f]
   to [a2eb4d25afc4f28d95fd62756e6527aab3ac88fa]

patch "NEWS"
 from [17c819736b0893e4d4667526656138ed23cb4b48]
   to [8e1f0621a0612b9d910be8c3b0d87829269e72a7]

patch "extra/mtn-hooks/monotone-cvs-ignore.lua"
 from [7bc64a29dac6409b2dbfbda0b3458ccc5b5fdc46]
   to [e237828983a27a99d58ec6bb0243fbf56fdcb817]

patch "innosetup/README.txt"
 from [2d4c16c9b1fc3da9d98e3d4806911490f876ef62]
   to [798ee75cb8be7728e4c5fbc6cb682d1f7beca7a2]

patch "src/lua.cc"
 from [40d590a9716e281f2004c1b5eb19c2b0926e7dde]
   to [6787dcbd552c2c8772e511dcd12b8f682868c0b3]

patch "src/lua.hh"
 from [146872f14cc23c6179c37bcda8667a0ecd178826]
   to [4396421e2bb335241ce33c29a53aeffd3ebf7380]

patch "src/luaext_parse_basic_io.cc"
 from [995b37d3cc3eb58a3c6be6db06e38f997ba6845e]
   to [f7a89950b6355b57d24ccf12331c7e2beae686bd]

patch "src/luaext_platform.cc"
 from [288a571d7c91fbb4abffb66611b52aac74889aa2]
   to [135278a8a971333575a0d8c92ed5d93262723cc7]

patch "test/func/automate_get_attributes/__driver__.lua"
 from [cd69b24a950d6c100143f4267cb9f22f3877ad75]
   to [3c820fcccbd5102c4bb3a4e9c01233de137aa21a]

patch "test/func/automate_interface_version/__driver__.lua"
 from [6fdc200cf0f8c01e6174ebb04f521b0e645198ec]
   to [8b65eadc6b526d1490ed02dc74a06134612c5c7b]

patch "test/func/automate_inventory_ignore_dirs/__driver__.lua"
 from [7afec31b9343b5e6d95f0d0bc30aa661254d7aeb]
   to [8b022036bd487f071752e21a3da566bc664c5995]

patch "test/func/automate_put_revision/__driver__.lua"
 from [deeeb9cb4ff8625284a4f69846ef9fa561a42ccf]
   to [e116294fa44da8646b2e41288615035f913b9563]

patch "test/func/automate_set_drop_attribute/__driver__.lua"
 from [5a090a94f10ebfa6ddb7378f9a285865ce881245]
   to [3d759e4395849775e5194721e6f5b05f50080644]

patch "test/func/clone_weird_branch_names/__driver__.lua"
 from [0afc1816afa8d3e4b2dfb9fd016500f224432f0a]
   to [e1253c24b2b696483bb621c85e48caa8d5c2cc90]

patch "test/func/list_databases/__driver__.lua"
 from [d78cd923f7f4950590407127854dcd3467b85625]
   to [9ab31d5e81fbca51ae7a5a919953e79d9c8e6631]

patch "test/func/list_workspaces/__driver__.lua"
 from [d7cc622b5a893fd344653512a434440082dbc247]
   to [e83147fac524181f19720ec74b04a38f7b1c41a7]

patch "test/func/log_--no-files_and_--merges/__driver__.lua"
 from [1a7944f904399553b56f8f4cc69b22152d03b851]
   to [7e1b2967179f5b5dec932ee44c0004e41b527bb0]

patch "test/func/manpage/__driver__.lua"
 from [a381ef4517c907170547a4984923650617f69c60]
   to [c8d528d2e1dab045cd6115111cceb2d5906296a8]

patch "test/func/netsync_negotiation/__driver__.lua"
 from [38cd5d9df0e16cf05d59f0d9525ae546a9654f5f]
   to [0b30d988c62dfc2aa3c4a7e0021b3395faba8609]

patch "test/func/serve-automate-single-run/__driver__.lua"
 from [7a75e9ff02a15ebc62a44c1c596ed39e3fdae0a0]
   to [9ac5e0e67c0a6849289ddfaf175505f674da6410]

patch "test/func/ssh_agent/__driver__.lua"
 from [e1e991f96a3289db93574829306b32b20aeba886]
   to [3f28e56f4fe2fa4169a34c5cc16e4039b2bd492a]

patch "test/func/two_parent_workspace_inodeprints/__driver__.lua"
 from [cb9175dd15771248cc7d53864fa77c17b9d09802]
   to [27930df4f388e02e7fa017e62aa0dd9873ac3d35]

patch "test/func/user_commands/extra_rc"
 from [94c90e2f0259bc9905f6be3fcc2580f0c8c2714d]
   to [7830e76cf219e92da08c959d7f9e33804be59c5a]

patch "test/src/testlib.lua"
 from [f236da6fce62c15acac578b42756b552e0453d99]
   to [445ed7ee75dfde94af676e7644e29e874aff58d7]

old_revision [aad657f04d0f21ece638434694aeabc833f37aa4]

add_dir "test/func/automate_erase_descendants"

add_file "test/func/automate_erase_descendants/__driver__.lua"
 content [45830e0a1e9f33e9031ca9953689b3648a9eb04e]

patch "NEWS"
 from [94d034c28d13efba836e06f633478f748c531d81]
   to [8e1f0621a0612b9d910be8c3b0d87829269e72a7]

patch "doc/monotone.texi"
 from [a063880df3b6539cf9f7c3536e82261e6d496708]
   to [d1293584f8a36c591fec36bc00427f77512c9876]

patch "innosetup/README.txt"
 from [ea1ad861438da89b7cf89f01c32a171ffd81ab11]
   to [798ee75cb8be7728e4c5fbc6cb682d1f7beca7a2]

patch "po/de.po"
 from [bd824479fb3a72bb048845d858e3a76b96f32c9b]
   to [4b2a04bf9575d35175f08c9ed53cca82d5050e4f]

patch "po/sv.po"
 from [f84b0093c5af0e103e0857bcf809fe78487e803b]
   to [fb60bb1b5c18bbb5c2025f33bed340b7647b7e3c]

patch "src/ancestry.cc"
 from [8b3388b690a5f4878bd29d752c3e6e073411739e]
   to [e673b17a5d2fad2716f7f4efe33c2ca11c7c31f9]

patch "src/automate.cc"
 from [efa4ecceab7f1e31f71778f325da312bf6aefba5]
   to [919e3df52514d0877aeafc67791aae6a3faa33b4]

patch "src/cmd_conflicts.cc"
 from [ad9dc74c27d4d8c50a74e5825ec9e0a12cdc1b09]
   to [86bf4eb2e0608a8b9814cef8b416626b4aa0ca90]

patch "src/gzip.hh"
 from [aff9da63bb22366bccf69c2d75ee7790406d2455]
   to [17093f66e365b3730a49ef1910295f622972c36e]

patch "src/rev_output.cc"
 from [a2c70b893b31296917d1a2b974faa1da46c13f1e]
   to [6b9862bfda95d0d558d8335fb2accfc0180e8fbd]

patch "src/revision.hh"
 from [740c4dd4ee350fcf06af3ba707cef3dadecb46f8]
   to [8d93883e8a6de779aa199d9b2e1aa58589f0626c]

patch "src/selectors.cc"
 from [3efba0ce3139290b4088cea0d6e82a912565471e]
   to [19a82c64f44ab5433354299f84598174cb15f510]

patch "src/unix/fs.cc"
 from [d34f7ed4b5cf3655d7920568e4e1a146fa670e13]
   to [f51cae4dbc5589b0add4f7b9b649fde3c83d1220]

patch "test/func/extended-selectors/__driver__.lua"
 from [435f44fb1b33bdfb53929fe6bd15ba7fa4c2c1d3]
   to [e80ed8e831bbc9cc346e7722c9877d32887104ef]

patch "test/func/resolve_conflicts_errors/__driver__.lua"
 from [4911dc65645a5af929cd990eef09c97146e60d17]
   to [9a130c83d4a7e3545f18d089542603c8d0bb72fa]

patch "test/unit/tests/xdelta.cc"
 from [4aff975cfd9a9cf18c26f70118e2895880ed6100]
   to [ed5f467ebc4755f7521e74a40833181974b43a8f]

patch "util/audit-includes"
 from [d5757fcf83ab116fba16c53221da0f832307a113]
   to [1c6fc8be30ebfafc67ca03980e7860db35e5d2e9]
============================================================
--- INSTALL_windows_cygwin.txt	46b16835478139759c0f52b531f16b6731e26314
+++ INSTALL_windows_cygwin.txt	155d548dd4bd91fa35deb7166c06a9353d615a23
@@ -2,40 +2,29 @@
 
 on Windows using Cygwin:
 
-Monotone needs the following packages to compile:
-(newer releases are usually ok)
+An official Cygwin package for monotone and all its dependencies is
+usually available soon after release; just run the Cygwin installer
+and install the 'monotone' package.
 
- Runtime requirements:
-   cygwin-1.7.0-60
-   libgcc1-4.3.2-2
-   libidn11-1.9-1
-   libintl8-0.17-11
-   libpcre0-7.9-1
-   libsqlite3_0-3.6.2-1
-   libstdc++6-4.3.2-2
-   lua-5.1.4-11
-   zlib0-1.2.3-10
+To build Monotone on Cygwin for development and testing, the following
+packages are required (the versions listed are known to work; they may
+not be the exact versions used to build the official Cygwin package).
+Note that the monotone source code is compatible with Lua 5.2, but (as
+of 8 May 2012), Cygwin only has Lua 5.1.4.
 
- Build requirements:
-   gcc4-4.3.2
-   binutils-2.19.51
-   boost-devel-1.33.1
-   libsqlite3-devel-3.6.2
-   libidn-devel-1.9
-   gettext-devel-0.17
-   zlib-1.2.3
-   perl-5.10.0
-   botan-1.8.2
+   binutils-2.22.51
+   libboost-devel-1.48.0
+   botan-1.8.13
+   gcc4-g++-4.5.3
+   gettext-devel-0.18.1
+   libidn-devel-1.22
+   libpcre-devel-8.21
+   libsqlite3-devel-3.7.3
+   lua-5.1.4-11
+   zlib-devel-1.2.5
 
-currently every prerequisite is available as packages except
-lua and botan which are only available in Cygwin 1.7;
-an official Cygwin package for monotone and all its
-dependencies is usually available soon after release.
+No special options are needed for configure.
 
-The following is needed to succesfully configure:
-
- export CXXFLAGS="-I/usr/include/boost-1_33_1/ -g -O2"; configure
-
 There is a bug in the bash builtin 'pwd' in bash 4.1; it can return
 'c:/' syntax for absolute paths in some circumstances. See
 http://sourceware.org/ml/cygwin/2002-11/msg01111.html. In particular,
@@ -43,4 +32,4 @@
 configure creating Makefiles with some problems. A work-around is to
 put 'cd `/bin/pwd`' in your ~/.emacs_bash.
 
-See ../cygport/README for building a Cygwin package.
+See cygport/README for building a Cygwin package.
============================================================
--- INSTALL_windows_native.txt	d67a72a79605d8e65abc2529e06481fad204724f
+++ INSTALL_windows_native.txt	a2eb4d25afc4f28d95fd62756e6527aab3ac88fa
@@ -2,44 +2,44 @@
 
 on Windows (using MinGW):
 
-Many tools and packages are available on SourceForge:
+Here we give sources for the various packages needed. We give
+directions to the download, rather than an exact URL, to make it easy
+to check for new versions.
 
-https://sourceforge.net/projects/<project>/files/
-
-That site is organized into several hierarchical lists of files. We
-give the hierarchy names here, rather than a complete download URL, to
-make it easy to check for new versions.
-
 The versions given here may not be exactly the same versions as used to
 build the current release of monontone.
 
 These instructions work on a new computer, with only
 Windows XP installed.
 
+The most recent MinGW installer mingw-get-inst-20120426 contains g++
+4.6.2; this is broken for C++ exceptions on MinGW. So we use an
+earlier installer mingw-get-inst-20110211, containing g++ 4.5.2 and a
+catalog of other binary packages that are consistent with that runtime.
+
 Package       | Version | location
 --------------------------
-Python        | 2.7.1   | http://www.python.org/
-                        | "Windows Installer" under "Quick Links (2.7.1)"
-mingw-get-inst| latest  | http://sourceforge.net/projects/mingw/files/
-                        | -> Automated MinGW Installer
+Python        | 2.7.3   | http://www.python.org/
+                        | "Windows Installer" under "Quick Links (2.7.3)"
+                        | Used for the Botan install; that does not work with Python 3.2.3
+mingw-get-inst|20110211 | http://sourceforge.net/projects/mingw/files/
+                        | -> Installer
                         | -> mingw-get-inst
                         | -> mingw-get-inst-20110211
-                        | -> mingw-get-inst-20110211.exe
-boost         | 1.46.1  | http://sourceforge.net/projects/boost/files/
-                        | -> boost -> 1.46.1 -> boost_1_46_1.tar.gz
-Lua           | 5.1.4   | http://www.lua.org/
-                        | -> download
-                        | -> "...current release is >Lua 5.1.4<" under "Source"
+                        | -> mingw-get-inst-20110211.exe - _not_ the most recent; see above
+boost         | 1.49.0  | http://sourceforge.net/projects/boost/files/
+                        | -> boost -> 1.49.0 -> boost_1_49_0.tar.bz2
                         | lua-5.1.4.tar.gz
-pcre          | 8.12    | http://www.pcre.org/
+pcre          | 8.30    | http://www.pcre.org/
                         | -> ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
-                        | -> pcre-8.12.tar.gz
-botan         | 1.8.11  | http://botan.randombit.net/download.html
+                        | -> pcre-8.30.tar.bz2
+botan         | 1.10.1  | http://botan.randombit.net/download.html
                         | "Source: >tar/gzip<" under "Current Stable Release"
-sqlite3       | 3.7.5   | http://www.sqlite.org/download.html
-                        | -> sqlite-autoconf-3070500.tar.gz
-libidn        | 1.20    | ftp://ftp.gnu.org/gnu/libidn/
-                        | -> libidn-1.20.tar.gz
+                        | _not_ the "windows binary installer"
+sqlite3       | 3.7.11  | http://www.sqlite.org/download.html
+                        | -> sqlite-autoconf-3071100.tar.gz
+libidn        | 1.24    | ftp://ftp.gnu.org/gnu/libidn/
+                        | -> libidn-1.24.tar.gz
 Depends.exe   |         | http://www.dependencywalker.com/ ; also comes with Visual Studio
 
 In general, there are two versions of most tools on the
@@ -78,43 +78,49 @@
     command window run "echo %PATH%" and look for the Python directory in the output.
 
 02. MinGW
-  Run mingw-get-inst (graphical installer for mingw-get and the MinGW base system).
-  At the "Select Components" screen, add "C++ compiler" and "MinGW Developer Toolkit".
-    Other than this, accept all defaults.
+  Run mingw-get-inst-20110211.exe - note that later versions include
+  g++ 4.6.2, which is broken for C++ exceptions on MinGW.
+  At the "Select Components" screen, add:
+    C++ compiler
+    MinGW Developer Toolkit
+  Other than this, accept all defaults.
+  In particular, do _not_ update the catalog; use the built-in
+  catalog, to insure the binaries are consistent with the g++ 4.5.2
+  runtime.
   Open the MinGW shell (Start->All Programs->MinGW->MinGW Shell)
   Run the following:
-  $ mingw-get install msys-autoconf msys-automake mingw32-libiconv
+  $ mingw-get install msys-autoconf msys-automake
   $ mingw-get install mingw32-zlib mingw32-libz-dev mingw32-gettext
 
 03. boost; only need headers
   $ cd /usr
   $ mkdir src
   $ cd src
-  $ tar -zxf ../boost_1_46_1.tar.gz
+  $ tar -jxf ../boost_1_49_0.tar.bz2
   This may give errors about gid_t out of range, and then say
   "Exiting with failure status due to previous errors"; you can
   ignore this.
-  $ cd boost_1_46_1
+  $ cd boost_1_49_0
   $ cp -a boost /mingw/include
 
 04. Lua
    $ cd /usr/src
-   $ tar -zxf ../lua-5.1.4.tar.gz
-   $ cd lua-5.1.4
+   $ tar -zxf ../lua-5.20.tar.gz
+   $ cd lua-5.2.0
    $ make mingw INSTALL_TOP=/mingw
    $ make install INSTALL_TOP=/mingw
 
 05. pcre
    $ cd /usr/src
-   $ tar -zxf ../pcre-8.12.tar.gz
-   $ cd pcre-8.12
+   $ tar -jxf ../pcre-8.30.tar.bz2
+   $ cd pcre-8.30
    $ ./configure --prefix=/mingw
    $ make install
 
 06. botan
    $ cd /usr/src
-   $ tar -zxf ../Botan-1.8.11.tgz
-   $ cd Botan-1.8.11
+   $ tar -zxf ../Botan-1.10.1.tgz
+   $ cd Botan-1.10.1
    $ ./configure.py --cc=gcc --os=mingw
    The Botan configure script generates paths with Python's
    os.path.join(...), which in the case of the Windows Python
@@ -125,15 +131,15 @@
 
 07. sqlite3
    $ cd /usr/src
-   $ tar -zxf ../sqlite-autoconf-3070500.tar.gz
-   $ cd sqlite-autoconf-3070500
+   $ tar -zxf ../sqlite-autoconf-3071100.tar.gz
+   $ cd sqlite-autoconf-3071100
    $ ./configure --prefix=/mingw
    $ make install
 
 08. libidn
    $ cd /usr/src
-   $ tar -zxf ../libidn-1.20.tar.gz
-   $ cd libidn-1.20
+   $ tar -zxf ../libidn-1.24.tar.gz
+   $ cd libidn-1.24
    $ ./configure --prefix=/mingw
    $ make install
 
@@ -143,7 +149,7 @@
    unpack it someplace in your %PATH% (for example, C:\MinGW\bin\).
    This is only used by the testsuite, in particular the empty_environment test.
    If you just want to build monotone for your own use, you can skip this and
-   just ignore that that test fails.
+   just ignore that test failing.
 
 10. build monotone
    You can skip the CXXFLAGS and LDFLAGS if you really want to, but if you do that
@@ -153,6 +159,9 @@
    $ autoreconf -i # not needed if you use the distributed tarball
    $ export CXXFLAGS="-static-libgcc -static-libstdc++ -g -O2 -Wall"
    $ export LDFLAGS="-static-libgcc -static-libstdc++"
+   $ export botan_CFLAGS="-I/mingw/include/botan-1.10"
+   $ export botan_LIBS="-lbotan-1.10"
    $ ./configure
    $ make
 
+See innosetup/README.txt for instructions on building the native Win32 installer.
============================================================
--- NEWS	17c819736b0893e4d4667526656138ed23cb4b48
+++ NEWS	8e1f0621a0612b9d910be8c3b0d87829269e72a7
@@ -38,6 +38,8 @@ XXX XXX XX XX:XX:XX UTC 201X
 
         - Fixed recursive file removal on Solaris.
 
+        - Monotone now compiles against Lua 5.2 as well.
+
         Internal
 
         - The performance and memory usage of regular expressions has
============================================================
--- extra/mtn-hooks/monotone-cvs-ignore.lua	7bc64a29dac6409b2dbfbda0b3458ccc5b5fdc46
+++ extra/mtn-hooks/monotone-cvs-ignore.lua	e237828983a27a99d58ec6bb0243fbf56fdcb817
@@ -23,7 +23,7 @@ do
 
       local handle, msg = io.open(dir .. ".cvsignore")
       if (handle) then
-	 for line in handle:lines(dir .. ".cvsignore") do
+	 for line in handle:lines() do
 	    pat2 = _glob_to_pattern(line) .. "$"
 	    if (string.find(name, pat1 .. pat2)) then
 	       return true
============================================================
--- innosetup/README.txt	2d4c16c9b1fc3da9d98e3d4806911490f876ef62
+++ innosetup/README.txt	798ee75cb8be7728e4c5fbc6cb682d1f7beca7a2
@@ -1,11 +1,12 @@
 This directory keeps the files needed to build the Windows native
-installer, using Inno Setup. 
+installer, using Inno Setup.
 
 Here are all the steps for creating a MinGW release, on a fresh
 Windows machine:
 
 Install Inno Setup and Inno Setup preprocessor; see
-http://www.jrsoftware.org/isinfo.php, get the Quick Start Pack isetup-5.4.2.exe
+http://www.jrsoftware.org/isinfo.php, isetup-5.4.3.exe. Install the
+preprocessor (we use it).
 
 Install MinGW tools; see ../INSTALL_windows_native.txt
 
@@ -15,7 +16,7 @@
 http://wiki.monotone.ca/MonotoneProjectServer/
 
 Check out the release version of monotone:
-mtn -d /path/to/monotone.db checkout -r t:monotone-<version> --branch net.venge.monotone monotone-<version>
+mtn -d /path/to/monotone.db checkout -r t:monotone-<version> --branch net.venge.monotone.monotone-<version> monotone-<version>
 
 Build the release. See the last instruction in ../INSTALL_windows_native.txt
 Then build the installer:
@@ -26,9 +27,9 @@
 
 NOTE:
 
-  If ISCC (Inno setup compiler) is not in PATH, then you must specify
-  its location:
-  
+  If ISCC (Inno setup compiler) is not in PATH when monotone configure
+  is run, then you must specify its location:
+
     make win32-installer ISCC=/d/progs/InnoSetup5/ISCC.exe
 
 Publish the binary on the monotone website with proper permissions:
============================================================
--- src/lua.cc	40d590a9716e281f2004c1b5eb19c2b0926e7dde
+++ src/lua.cc	6787dcbd552c2c8772e511dcd12b8f682868c0b3
@@ -44,7 +44,11 @@ dump_stack(lua_State * st)
     switch (t) {
     case LUA_TSTRING:  /* strings */
       out += '`';
+#ifdef lua_strlen
       out += string(lua_tostring(st, i), lua_strlen(st, i));
+#else
+      out += string(lua_tostring(st, i), lua_rawlen(st, i));
+#endif
       out += '\'';
       break;
 
@@ -95,7 +99,11 @@ Lua::report_error()
 Lua::report_error()
 {
 //  I(lua_isstring(st, -1));
+#ifdef lua_strlen
   string err = string(lua_tostring(st, -1), lua_strlen(st, -1));
+#else
+  string err = string(lua_tostring(st, -1), lua_rawlen(st, -1));
+#endif
   W(i18n_format("%s") % err);
   L(FL("lua stack: %s") % dump_stack(st));
   lua_pop(st, 1);
@@ -107,7 +115,11 @@ Lua::check_stack(int count)
 {
   if (!lua_checkstack(st, count))
     {
+#ifdef LUAI_MAXCSTACK
       fail((FL("lua stack limit '%d' reached") % LUAI_MAXCSTACK).str());
+#else
+      fail((FL("lua stack limit '%d' reached") % LUAI_MAXSTACK).str());
+#endif
       return false;
     }
   return true;
@@ -119,17 +131,27 @@ Lua::get(int idx)
 Lua::get(int idx)
 {
   if (failed) return *this;
-  if (!lua_istable (st, idx))
+  if (lua_gettop (st) < 1)
     {
-      fail("istable() in get");
+      fail("stack top > 0 in get");
       return *this;
     }
-  if (lua_gettop (st) < 1)
+  if (idx)
     {
-      fail("stack top > 0 in get");
-      return *this;
+      if (!lua_istable (st, idx))
+        {
+          fail("istable() in get");
+          return *this;
+        }
+      lua_gettable(st, idx);
     }
-  lua_gettable(st, idx);
+  else
+    {
+      string name;
+      extract_str(name);
+      pop();
+      lua_getglobal(st, name.c_str());
+    }
   return *this;
 }
 
@@ -194,7 +216,11 @@ Lua::extract_str_nolog(string & str)
       fail("isstring() in extract_str");
       return *this;
     }
+#ifdef lua_strlen
   str = string(lua_tostring(st, -1), lua_strlen(st, -1));
+#else
+  str = string(lua_tostring(st, -1), lua_rawlen(st, -1));
+#endif
   return *this;
 }
 
@@ -460,7 +486,7 @@ void add_functions(lua_State * st)
         {
           lua_newtable(st);
           lua_pushvalue(st, -1);
-          lua_setfield(st, LUA_GLOBALSINDEX, table.c_str());
+          lua_setglobal(st, table.c_str());
         }
       for (luaext::fmap::const_iterator j = i->second.begin();
            j != i->second.end(); ++j)
============================================================
--- src/lua.hh	146872f14cc23c6179c37bcda8667a0ecd178826
+++ src/lua.hh	4396421e2bb335241ce33c29a53aeffd3ebf7380
@@ -37,13 +37,13 @@ Lua
   void report_error();
   bool check_stack(int count);
 
-  // getters
-  Lua & get(int idx = LUA_GLOBALSINDEX);
-  Lua & get_fn(int idx = LUA_GLOBALSINDEX);
-  Lua & get_tab(int idx = LUA_GLOBALSINDEX);
-  Lua & get_str(int idx = LUA_GLOBALSINDEX);
-  Lua & get_num(int idx = LUA_GLOBALSINDEX);
-  Lua & get_bool(int idx = LUA_GLOBALSINDEX);
+  // getters (0 is an invalid index in lua, and is used here to represent the global table)
+  Lua & get(int idx = 0);
+  Lua & get_fn(int idx = 0);
+  Lua & get_tab(int idx = 0);
+  Lua & get_str(int idx = 0);
+  Lua & get_num(int idx = 0);
+  Lua & get_bool(int idx = 0);
 
   // extractors
   Lua & extract_str_nolog(std::string & str);
============================================================
--- src/luaext_parse_basic_io.cc	995b37d3cc3eb58a3c6be6db06e38f997ba6845e
+++ src/luaext_parse_basic_io.cc	f7a89950b6355b57d24ccf12331c7e2beae686bd
@@ -23,7 +23,11 @@ LUAEXT(parse_basic_io, )
   // followed by one or more string or hex values. It returns a table of
   // lines.
   vector<pair<string, vector<string> > > res;
+#ifdef lua_strlen
   const string str(luaL_checkstring(LS, -1), lua_strlen(LS, -1));
+#else
+  const string str(luaL_checkstring(LS, -1), lua_rawlen(LS, -1));
+#endif
   basic_io::input_source in(str, "monotone_parse_basic_io_for_lua");
   in.made_from = origin::user;
   basic_io::tokenizer tok(in);
============================================================
--- src/luaext_platform.cc	288a571d7c91fbb4abffb66611b52aac74889aa2
+++ src/luaext_platform.cc	135278a8a971333575a0d8c92ed5d93262723cc7
@@ -118,7 +118,10 @@ static FILE **newfile (lua_State *LS) {
   lua_setmetatable(LS, -2);
 
   lua_pushcfunction(LS, io_fclose);
+#ifdef LUA_ENVIRONINDEX
+  // Lua 5.2 removes C function environments
   lua_setfield(LS, LUA_ENVIRONINDEX, "__close");
+#endif
 
   return pf;
 }
============================================================
--- test/func/automate_get_attributes/__driver__.lua	cd69b24a950d6c100143f4267cb9f22f3877ad75
+++ test/func/automate_get_attributes/__driver__.lua	3c820fcccbd5102c4bb3a4e9c01233de137aa21a
@@ -28,7 +28,7 @@ parsed = parse_basic_io(readfile("stdout
 check(fsize("stderr") == 0)
 parsed = parse_basic_io(readfile("stdout"))
 -- make sure the output generated 8 stanzas
-check(table.getn(parsed) == 8)
+check(#parsed == 8)
 lastkey = ""
 checked = {}
 for _,l in pairs(parsed) do
@@ -108,7 +108,7 @@ parsed = parse_basic_io(readfile("stdout
 check(mtn("automate", "get_attributes", "testfile", "-r", rev), 0, true, false)
 
 parsed = parse_basic_io(readfile("stdout"))
-check(table.getn(parsed) == 6)
+check(#parsed == 6)
 
 lastkey = ""
 checked = {}
============================================================
--- test/func/automate_interface_version/__driver__.lua	6fdc200cf0f8c01e6174ebb04f521b0e645198ec
+++ test/func/automate_interface_version/__driver__.lua	8b65eadc6b526d1490ed02dc74a06134612c5c7b
@@ -7,4 +7,4 @@ check(numlines("a_v") == 1)
 -- MinGW's wc produces "      1" as output.  Arithmetic comparison works, string comparison doesn't
 check(numlines("a_v") == 1)
 -- This is really ^[0-9]+\.[0-9]+$, but m4 is obfuscatory.
-check(qgrep("^[0-9]+\.[0-9]+$", "a_v"))
+check(qgrep("^[0-9]+\\.[0-9]+$", "a_v"))
============================================================
--- test/func/automate_inventory_ignore_dirs/__driver__.lua	7afec31b9343b5e6d95f0d0bc30aa661254d7aeb
+++ test/func/automate_inventory_ignore_dirs/__driver__.lua	8b022036bd487f071752e21a3da566bc664c5995
@@ -14,7 +14,7 @@ function sortContentsByLine(input)
   table.insert(lines, string.sub(input, theStart))
   table.sort(lines)
 
-  local len = table.getn(lines)
+  local len = #lines
   local output = lines[1]
   for i = 2, len do
     output = output .. delimiter .. lines[i]
============================================================
--- test/func/automate_put_revision/__driver__.lua	deeeb9cb4ff8625284a4f69846ef9fa561a42ccf
+++ test/func/automate_put_revision/__driver__.lua	e116294fa44da8646b2e41288615035f913b9563
@@ -33,5 +33,5 @@ check(mtn("automate", "put_file", ""), 0
 -- but this should work (tests that we can use put_revision to commit a
 -- single-parent revision)
 check(mtn("automate", "put_file", ""), 0, false, false)
-rev = "format_version \"1\"\n\nnew_manifest [0000000000000000000000000000000000000000]\n\nold_revision [4c2c1d846fa561601254200918fba1fd71e6795d]\n\patch \"foo\"\n from [5bf1fd927dfb8679496a2e6cf00cbe50c1c87145] to [da39a3ee5e6b4b0d3255bfef95601890afd80709]\n"
+rev = "format_version \"1\"\n\nnew_manifest [0000000000000000000000000000000000000000]\n\nold_revision [4c2c1d846fa561601254200918fba1fd71e6795d]\n\npatch \"foo\"\n from [5bf1fd927dfb8679496a2e6cf00cbe50c1c87145] to [da39a3ee5e6b4b0d3255bfef95601890afd80709]\n"
 check(mtn("automate", "put_revision", rev), 0, false, false)
============================================================
--- test/func/automate_set_drop_attribute/__driver__.lua	5a090a94f10ebfa6ddb7378f9a285865ce881245
+++ test/func/automate_set_drop_attribute/__driver__.lua	3d759e4395849775e5194721e6f5b05f50080644
@@ -25,7 +25,7 @@ parsed = parse_basic_io(readfile("stdout
 check(mtn("automate", "get_attributes", "testfile"), 0, true, false)
 parsed = parse_basic_io(readfile("stdout"))
 
-check(table.getn(parsed) == 2)
+check(#parsed == 2)
 for _,l in pairs(parsed) do
     if l.name == "attr" then
         key = l.values[1]
@@ -44,7 +44,7 @@ parsed = parse_basic_io(readfile("stdout
 -- check if it has been really dropped
 check(mtn("automate", "get_attributes", "testfile"), 0, true, false)
 parsed = parse_basic_io(readfile("stdout"))
-check(table.getn(parsed) == 0)
+check(#parsed == 0)
 
 -- check if it escalates properly if there is no such attr to drop
 check(mtn("automate", "drop_attribute", "testfile", "foo"), 1, false, true)
============================================================
--- test/func/clone_weird_branch_names/__driver__.lua	0afc1816afa8d3e4b2dfb9fd016500f224432f0a
+++ test/func/clone_weird_branch_names/__driver__.lua	e1253c24b2b696483bb621c85e48caa8d5c2cc90
@@ -9,7 +9,7 @@ test_uri="file://" .. url_encode_path(te
 
 -- some of the special chars need to get double-escaped to get "through"
 test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") ..
-  "?" .. url_encode_query("my-branch\\\[1,2\\\]-1^3")
+  "?" .. url_encode_query("my-branch\\[1,2\\]-1^3")
 check(nodb_mtn("clone", test_uri), 0, false, false)
 check(exists("my-branch[1,2]-1^3"))
 check(readfile("foo") == readfile("my-branch[1,2]-1^3/foo"))
============================================================
--- test/func/list_databases/__driver__.lua	d78cd923f7f4950590407127854dcd3467b85625
+++ test/func/list_databases/__driver__.lua	9ab31d5e81fbca51ae7a5a919953e79d9c8e6631
@@ -25,15 +25,15 @@ check(mt("ls", "dbs"), 0, true, false)
 check(exists("managed_databases/bar.mtn"))
 
 check(mt("ls", "dbs"), 0, true, false)
-check(qgrep(":bar.mtn.+in.+list_databases\/managed_databases", "stdout"))
+check(qgrep(":bar.mtn.+in.+list_databases/managed_databases", "stdout"))
 check(qgrep("\tno known valid workspaces", "stdout"))
 
 check(mt("setup", "-d", ":bar", "-b", "test.foo.branch", "test_foo"), 0, false, false)
 
 check(mt("ls", "dbs"), 0, true, false)
 check(not qgrep("\tno known valid workspaces", "stdout"))
-check(qgrep("\ttest.foo.branch.+in.+list_databases\/test_foo", "stdout"))
+check(qgrep("\ttest.foo.branch.+in.+list_databases/test_foo", "stdout"))
 
 check(rename("managed_databases/bar.mtn", "managed_databases/bar.db"))
 check(mt("ls", "dbs"), 0, true, false)
-check(qgrep(":bar.db.+in.+list_databases\/managed_databases", "stdout"))
+check(qgrep(":bar.db.+in.+list_databases/managed_databases", "stdout"))
============================================================
--- test/func/list_workspaces/__driver__.lua	d7cc622b5a893fd344653512a434440082dbc247
+++ test/func/list_workspaces/__driver__.lua	e83147fac524181f19720ec74b04a38f7b1c41a7
@@ -10,17 +10,17 @@ check(raw_mtn("ls", "workspaces", "-d", 
 check(raw_mtn("setup", "-d", "test.mtn", "-b", "test.branch1", "work1"), 0, false, false)
 
 check(raw_mtn("ls", "workspaces", "-d", "test.mtn"), 0, true, false)
-check(qgrep("test.branch1.+in.+list_workspaces\/work1", "stdout"))
+check(qgrep("test.branch1.+in.+list_workspaces/work1", "stdout"))
 
 check(raw_mtn("setup", "-d", "test.mtn", "-b", "test.branch2", "work2"), 0, false, false)
 check(rename("work1", "work3"))
 
 check(raw_mtn("ls", "workspaces", "-d", "test.mtn"), 0, true, false)
-check(qgrep("test.branch2.+in.+list_workspaces\/work2", "stdout"))
-check(not qgrep("test.branch1.+in.+list_workspaces\/work1", "stdout"))
+check(qgrep("test.branch2.+in.+list_workspaces/work2", "stdout"))
+check(not qgrep("test.branch1.+in.+list_workspaces/work1", "stdout"))
 
 check(indir("work3", raw_mtn("register_workspace", "-d", "../test.mtn")), 0, false, false)
 
 check(raw_mtn("ls", "workspaces", "-d", "test.mtn"), 0, true, false)
-check(qgrep("test.branch1.+in.+list_workspaces\/work3", "stdout"))
+check(qgrep("test.branch1.+in.+list_workspaces/work3", "stdout"))
 
============================================================
--- test/func/log_--no-files_and_--merges/__driver__.lua	1a7944f904399553b56f8f4cc69b22152d03b851
+++ test/func/log_--no-files_and_--merges/__driver__.lua	7e1b2967179f5b5dec932ee44c0004e41b527bb0
@@ -29,8 +29,8 @@ check(mtn("log"), 0, true, false)
 
 -- check that merge is included by default
 check(mtn("log"), 0, true, false)
-check(qgrep("^[\\|\\\\\/ ]+Revision.*"..R2, "stdout"))
+check(qgrep("^[\\|\\\\/ ]+Revision.*"..R2, "stdout"))
 
 -- and that it is excluded by --no-merges
 check(mtn("log", "--no-merges"), 0, true, false)
-check(not qgrep("^[\\|\\\\\/ ]+Revision.*"..R2, "stdout"))
+check(not qgrep("^[\\|\\\\/ ]+Revision.*"..R2, "stdout"))
============================================================
--- test/func/manpage/__driver__.lua	a381ef4517c907170547a4984923650617f69c60
+++ test/func/manpage/__driver__.lua	c8d528d2e1dab045cd6115111cceb2d5906296a8
@@ -5,7 +5,7 @@ check(mtn("version"), 0, true, false)
 
 -- check for a proper header line
 check(mtn("version"), 0, true, false)
-local s,e,version = string.find(readfile("stdout"), "(monotone %d+\.%d+%S*)")
+local s,e,version = string.find(readfile("stdout"), "(monotone %d+%.%d+%S*)")
 check(qgrep(".TH \"monotone\" 1 \"[0-9]{4}-[0-9]{2}-[0-9]{2}\" \"" .. version .. "\"", "manpage"))
 
 -- check required sections
============================================================
--- test/func/netsync_negotiation/__driver__.lua	38cd5d9df0e16cf05d59f0d9525ae546a9654f5f
+++ test/func/netsync_negotiation/__driver__.lua	0b30d988c62dfc2aa3c4a7e0021b3395faba8609
@@ -87,10 +87,10 @@ function check_same_revs(cmd1, cmd2)
    check(cmd2, 0, true, false)
    local data2 = {}
    for l in io.lines("stdout") do table.insert(data2, l) end
-   L("Command 1 has ", table.getn(data1), " lines.")
-   L("Command 2 has ", table.getn(data2), " lines.")
-   check(table.getn(data1) == table.getn(data2))
-   for i = 1, table.getn(data1) do
+   L("Command 1 has ", #data1, " lines.")
+   L("Command 2 has ", #data2, " lines.")
+   check(#data1 == #data2)
+   for i = 1, #data1 do
       local hash_len = 40
       check(data1[i]:sub(1, hash_len) == data2[i]:sub(1, hash_len))
    end
============================================================
--- test/func/serve-automate-single-run/__driver__.lua	7a75e9ff02a15ebc62a44c1c596ed39e3fdae0a0
+++ test/func/serve-automate-single-run/__driver__.lua	9ac5e0e67c0a6849289ddfaf175505f674da6410
@@ -28,7 +28,7 @@ check(mtn2("automate", "remote", "--remo
 
 check(mtn2("automate", "remote", "--remote-stdio-host", server.address,
     "interface_version"), 0, true, false)
-check(qgrep("^[0-9]{2,}\.[0-9]+$", "stdout"))
+check(qgrep("^[0-9]{2,}\\.[0-9]+$", "stdout"))
 
 check(mtn2("automate", "remote", "--remote-stdio-host", server.address,
     "leaves"), 0, true, false)
============================================================
--- test/func/ssh_agent/__driver__.lua	e1e991f96a3289db93574829306b32b20aeba886
+++ test/func/ssh_agent/__driver__.lua	3f28e56f4fe2fa4169a34c5cc16e4039b2bd492a
@@ -81,7 +81,7 @@ for line in io.lines("stdout") do
 
 check({"ssh-agent"}, 0, true, false)
 for line in io.lines("stdout") do
-   for k, v in string.gmatch(line, "([%w_]+)=([%w/\.-]+)") do
+   for k, v in string.gmatch(line, "([%w_]+)=([%w/%.-]+)") do
       set_env(k, v)
    end
 end
@@ -91,7 +91,7 @@ for line in io.lines("stdout") do
 check({"ssh-add", "-l"}, 0, true, false)
 ok = false
 for line in io.lines("stdout") do
-    for k in string.gmatch(line, "address@hidden") do
+    for k in string.gmatch(line, "address@hidden") do
     	ok = true
     end
 end
@@ -288,7 +288,7 @@ for line in io.lines("stdout") do
 check({"ssh-add", "-l"}, 0, true, false)
 ok = false
 for line in io.lines("stdout") do
-    for k in string.gmatch(line, "address@hidden") do
+    for k in string.gmatch(line, "address@hidden") do
     	ok = true
     end
 end
@@ -338,7 +338,7 @@ for line in io.lines("stdout") do
 check({"ssh-add", "-l"}, 0, true, false)
 ok = false
 for line in io.lines("stdout") do
-    for k in string.gmatch(line, "address@hidden") do
+    for k in string.gmatch(line, "address@hidden") do
     	ok = true
     end
 end
============================================================
--- test/func/two_parent_workspace_inodeprints/__driver__.lua	cb9175dd15771248cc7d53864fa77c17b9d09802
+++ test/func/two_parent_workspace_inodeprints/__driver__.lua	27930df4f388e02e7fa017e62aa0dd9873ac3d35
@@ -19,13 +19,13 @@ check(mtn("status"), 0, true, false)
 
 -- check that we've got the expected initial status
 check(mtn("status"), 0, true, false)
-check(qgrep("patched[ 	]\+foo", "stdout"))
+check(qgrep("patched[ 	]+foo", "stdout"))
 
 -- enable inodeprints
 writefile("_MTN/inodeprints")
 
 check(mtn("status"), 0, true, false)
-check(qgrep("patched[ 	]\+foo", "stdout"))
+check(qgrep("patched[ 	]+foo", "stdout"))
 
 sleep(5)
 
============================================================
--- test/func/user_commands/extra_rc	94c90e2f0259bc9905f6be3fcc2580f0c8c2714d
+++ test/func/user_commands/extra_rc	7830e76cf219e92da08c959d7f9e33804be59c5a
@@ -5,7 +5,8 @@ function check_head(...)
       io.stderr:write("automate call failed\n")
       return
     end
-    arghead = unpack(arg)
+    local arg = {...}
+    arghead = arg[1]
     heads = heads:gsub("^%s*(.-)%s*$", "%1")	-- trim leading and trailing whitespace
     if (heads == arghead) then
         io.write("heads are equal\n")
============================================================
--- test/src/testlib.lua	f236da6fce62c15acac578b42756b552e0453d99
+++ test/src/testlib.lua	445ed7ee75dfde94af676e7644e29e874aff58d7
@@ -326,17 +326,11 @@ function include(name)
 -- to want to include from the dir for the current test,
 -- since in that case it could just go in the driver file.
 function include(name)
-  local func, e = loadfile(testdir.."/"..name)
-  if func == nil then err(e, 2) end
-  setfenv(func, getfenv(2))
-  func()
+  dofile(testdir.."/"..name)
 end
 
 function includecommon(name)
-  local func, e = loadfile(srcdir.."/common/"..name)
-  if func == nil then err(e, 2) end
-  setfenv(func, getfenv(2))
-  func()
+  dofile(srcdir.."/common/"..name)
 end
 
 function trim(str)
@@ -495,12 +489,11 @@ function samelines(f, t)
 function samelines(f, t)
   local fl = {}
   for l in io.lines(f) do table.insert(fl, l) end
-  if not (table.getn(fl) == table.getn(t)) then
-    L(locheader(), string.format("file has %s lines; table has %s\n",
-                                 table.getn(fl), table.getn(t)))
+  if not (#fl == #t) then
+    L(locheader(), string.format("file has %s lines; table has %s\n", #fl, #t))
     return false
   end
-  for i=1,table.getn(t) do
+  for i=1,#t do
     if fl[i] ~= t[i] then
       if fl[i] then
         L(locheader(), string.format("file[%d] = '%s'; table[%d] = '%s'\n",
@@ -518,12 +511,11 @@ function greplines(f, t)
 function greplines(f, t)
   local fl = {}
   for l in io.lines(f) do table.insert(fl, l) end
-  if not (table.getn(fl) == table.getn(t)) then
-    L(locheader(), string.format("file has %s lines; table has %s\n",
-                                 table.getn(fl), table.getn(t)))
+  if not (#fl == #t) then
+    L(locheader(), string.format("file has %s lines; table has %s\n", #fl, #t))
     return false
   end
-  for i=1,table.getn(t) do
+  for i=1,#t do
     if not regex.search(t[i], fl[i]) then
       L(locheader(), string.format("file[i] = '%s'; table[i] = '%s'\n",
                                    fl[i], t[i]))
@@ -593,7 +585,7 @@ function tail(...)
     local mylines = {}
     for l in io.lines(file) do
       table.insert(mylines, l)
-      if table.getn(mylines) > num then
+      if #mylines > num then
         table.remove(mylines, 1)
       end
     end
@@ -948,8 +940,8 @@ function run_tests(debugging, list_only,
     if _1 then
       l = l + 0
       r = r + 0
-      if l < 1 then l = table.getn(tests) + l + 1 end
-      if r < 1 then r = table.getn(tests) + r + 1 end
+      if l < 1 then l = #tests + l + 1 end
+      if r < 1 then r = #tests + r + 1 end
       if l > r then l,r = r,l end
       for j = l,r do
         torun[j] = tests[j]
@@ -957,7 +949,7 @@ function run_tests(debugging, list_only,
       run_all = false
     elseif string.find(a, "^-?%d+$") then
       r = a + 0
-      if r < 1 then r = table.getn(tests) + r + 1 end
+      if r < 1 then r = #tests + r + 1 end
       torun[r] = tests[r]
       run_all = false
     else
============================================================
--- NEWS	94d034c28d13efba836e06f633478f748c531d81
+++ NEWS	8e1f0621a0612b9d910be8c3b0d87829269e72a7
@@ -10,6 +10,21 @@ XXX XXX XX XX:XX:XX UTC 201X
           and returns the attributes for a specific file from the
           revision's manifest
 
+        - New 'erase_descendants' automate command which returns all
+          input revisions, except those that are a descendant of
+          another revision in the input.
+
+        - New 'min(A)' selector is now available which returns all
+          revisions selected by A which are not descendants of other
+          revisions selected by A.
+
+        - New 'not(A)' selector is now available which returns all
+          revisions not selected by 'A'.
+
+        - All certs for a revision are now output by 'mtn log' with
+          'suspend', 'testresult', and custom certs placed under a
+          a new 'Other certs' heading.
+           
         Bugs fixed
 
         - Monotone now compiles against Botan 1.10.x (as well as most of
@@ -34,6 +49,8 @@ XXX XXX XX XX:XX:XX UTC 201X
 
         Other
 
+        - 'mtn diff' now outputs old and new revision IDs in the diff header
+           when both are specified.
 
 Sat Mar 26 10:53:47 UTC 2011
 
============================================================
--- doc/monotone.texi	a063880df3b6539cf9f7c3536e82261e6d496708
+++ doc/monotone.texi	d1293584f8a36c591fec36bc00427f77512c9876
@@ -39,7 +39,7 @@
 Copyright @copyright{} 2006 Alex Queiroz @*
 Copyright @copyright{} 2006, 2007 William Uther @*
 Copyright @copyright{} 2006 - 2010 Thomas Keller @*
-Copyright @copyright{} 2007 - 2011 Stephen Leake @*
+Copyright @copyright{} 2007 - 2012 Stephen Leake @*
 
 This manual is made available under the GNU GPL version 2.0 or
 greater.  See the accompanying file COPYING for details.
@@ -2935,6 +2935,14 @@ @heading Composite selectors
 example, @code{difference(a:graydon;b:net.venge.monotone)} would return all
 revisions which have an @code{author} cert beginning with @code{graydon} which
 are not in the branch @code{net.venge.monotone}.
address@hidden not(A)
+Set complement; this returns all revisions not selected by A. For example,
address@hidden(c:testresult)} would return all revisions which do not have any
address@hidden certs. Conceptually @code{not(A)} is equivalent to
address@hidden(*, A)}, where @code{*} selects all revisions. The previous
+example to return all revisions which have an @code{author} cert beginning
+with @code{graydon} and are not in the branch @code{net.venge.monotone},
+can be written as @code{a:graydon/not(b:net.venge.monotone)}.
 @item lca(A;B)
 Least common ancestors; this is identical to
 @code{max((ancestors(A)|A)/(ancestors(B)|B))},
@@ -2949,6 +2957,11 @@ @heading Composite selectors
 @code{max(b:net.venge.monotone/a:graydon)} would return the latest revision(s)
 on branch @code{net.venge.monotone} which have an @code{author} cert beginning
 with @code{graydon}.
address@hidden min(A)
+Erase descendants; this returns all revisions selected by @code{A} which are not
+descendants of other revisions selected by @code{A}. For example,
address@hidden(b:net.venge.monotone)} would return the earliest revision(s)
+on branch @code{net.venge.monotone}.
 @item ancestors(A)
 Strict ancestors; returns all revisions which are an ancestor of a revision
 selected by @code{A}. For example, @code{ancestors(b:net.venge.monotone)}
@@ -4220,7 +4233,7 @@ @section Exporting to GIT
 $ mkdir test.git
 $ cd test.git
 $ git init
-$ mtn --db test.mtn git_export | git fast import
+$ mtn --db test.mtn git_export | git fast-import
 @end group
 @end smallexample
 
@@ -4590,7 +4603,8 @@ @chapter Command Reference
 The Lua hook @address@hidden can change the
 default value for any option.
 
-Revision arguments to commands may be selectors or hex ids.
+Revision arguments to commands (but not to automate commands) may be
+selectors (see @ref{Selectors}) or hex ids.
 
 @menu
 * Global and Common Options::   Options that affect all or many commands
@@ -4845,7 +4859,7 @@ @section Tree
 @anchor{mtn address@hidden mtn checkout [--[no-]move-conflicting-paths] address@hidden @var{directory}
 @itemx mtn checkout [--[no-]move-conflicting-paths] address@hidden @var{directory}
 @itemx mtn co
address@hidden is an alias for @command{checkout}
address@hidden is an alias for @command{checkout}. See @ref{Selectors}.
 
 These commands copy a revision @var{id} out of your database,
 recording the chosen revision (the @dfn{base revision}) in the file
@@ -4894,9 +4908,9 @@ @section Tree
 See @ref{Conflicts}
 
 @anchor{mtn address@hidden mtn explicit_merge [--[no-]update] @var{id} @var{id} @var{destbranch}
-See the online help for options. See @ref{--update}.
+See the online help for options. See @ref{--update}. See @ref{Selectors}.
 
-This command merges exactly the two @var{id}s you give it, and places
+This command merges exactly the two revision @var{id}s you give it, and places
 the result in branch @var{destbranch}.  It is useful when you need more
 control over the merging process than @command{propagate} or @command{merge}
 give you.  For instance, if you have a branch with three heads, and you
@@ -4919,7 +4933,7 @@ @section Tree
 
 @anchor{mtn address@hidden mtn import address@hidden address@hidden [--[no-]dry-run] @var{dir}
 @itemx mtn import address@hidden address@hidden [--[no-]dry-run] @var{dir}
-See the online help for more options.
+See the online help for more options. See @ref{Selectors}.
 
 This command imports the contents of the given directory and commits it
 to the head of the given branch or as a child of the given revision (and
@@ -4994,10 +5008,10 @@ @section Tree
 @ref{Merge Conflicts} can occur. See @ref{--update}.
 
 @anchor{mtn address@hidden mtn merge_into_workspace [--[no]-move-conflicting-paths] @var{revision}
-Merges @var{revision} into the current workspace; the result is not
-committed to the database. There can be no pending changes in the
-current workspace. The workspace's selected branch is not
-changed.
+Merges @var{revision} (see @ref{Selectors}) into the current
+workspace; the result is not committed to the database. There can be
+no pending changes in the current workspace. The workspace's selected
+branch is not changed.
 
 When a later commit is done, both @var{revision} and the workspace's
 base revision will be recorded as parents.
@@ -5092,10 +5106,10 @@ @subheading Commands
 @ftable @command
 @item mtn conflicts store address@hidden address@hidden @var{right_rev_id}]
 Store the conflicts encountered by merging @var{left_rev_id} with
address@hidden, in the specified file (defaults to
address@hidden/conflicts}. If @var{left_rev_id} and @var{right_rev_id} are
-not given, the first two heads that the @command{merge} command would
-merge are used.
address@hidden (revision ids; see @ref{Selectors}), in the
+specified file (defaults to @file{_MTN/conflicts}. If
address@hidden and @var{right_rev_id} are not given, the first two
+heads that the @command{merge} command would merge are used.
 
 The conflicts file format is as output by the @command{automate
 show_conflicts} command; see @address@hidden automate show_conflicts}}.
@@ -5471,7 +5485,7 @@ @section Workspace
 
 @anchor{mtn address@hidden mtn pluck [--[no-]move-conflicting-paths] address@hidden
 @itemx mtn pluck [--[no-]move-conflicting-paths] address@hidden address@hidden
-See the online help for more options.
+See the online help for more options. See @ref{Selectors}.
 
 This command takes changes made at any point in history, and attempts to
 edit your current workspace to include those changes.  The end result is
@@ -5547,7 +5561,7 @@ @section Workspace
 @anchor{mtn address@hidden mtn update [--[no-]move-conflicting-paths] [--branch @var{branchname}]
 @itemx mtn update [--[no-]move-conflicting-paths] address@hidden
 This command changes your workspace to have the a different revision as
-the base revision.
+the base revision. See @ref{Selectors}.
 
 @command{update} performs 3 separate stages. If any of these stages
 fails, the update aborts, doing nothing. The first two stages select
@@ -5761,9 +5775,9 @@ @section Network
 Finally, @command{clone} copies the files out of the newly created
 database into a local directory, just as @command{checkout} would.  If
 no @var{directory} is given, the @var{branchname} is used as
-directory. If @option{--revision} is given, that revision must be on
-the specified branch, and is checked out; otherwise the head of the
-branch is checked out.
+directory. If @option{--revision} is given (see @ref{Selectors}), that
+revision must be on the specified branch, and is checked out;
+otherwise the head of the branch is checked out.
 
 @strong{Important notice:} The @var{address}[:@var{port}] @var{branchname}
 call syntax is deprecated and subject to removal in future versions of monotone!
@@ -5776,6 +5790,7 @@ @section Informative
 @ftable @command
 @item mtn annotate @var{file}
 @itemx mtn annotate address@hidden [--revs-only] @var{file}
+See @ref{Selectors}.
 
 Dumps an annotated copy of the file to stdout. The output is in the
 form:
@@ -5799,10 +5814,10 @@ @section Informative
 
 @item mtn bisect bad address@hidden ...] [--[no-]move-conflicting-paths]
 Mark the specified revisions as ``bad'' for the current bisection
-operation (see @ref{Bisecting}). If no bisection operation is in
-progress a new bisection is initialized. If a bisection operation is
-in progress the next update target is selected and the workspace is
-updated to the selected revision.
+operation (see @ref{Bisecting}, see @ref{Selectors}). If no bisection
+operation is in progress a new bisection is initialized. If a
+bisection operation is in progress the next update target is selected
+and the workspace is updated to the selected revision.
 
 If the update is blocked by conflicting unversioned paths existing in
 the workspace this command may be re-issued with the
@@ -5812,10 +5827,10 @@ @section Informative
 
 @item mtn bisect good address@hidden ...] [--[no-]move-conflicting-paths]
 Mark the specified revisions as ``good'' for the current bisection
-operation (see @ref{Bisecting}). If no bisection operation is in
-progress a new bisection is initialized. If a bisection operation is
-in progress the next update target is selected and the workspace is
-updated to the selected revision.
+operation (see @ref{Bisecting}, see @ref{Selectors}). If no bisection
+operation is in progress a new bisection is initialized. If a
+bisection operation is in progress the next update target is selected
+and the workspace is updated to the selected revision.
 
 If the update is blocked by conflicting unversioned paths existing in
 the workspace this command may be re-issued with the
@@ -5830,10 +5845,10 @@ @section Informative
 
 @item mtn bisect skip address@hidden ...] [--[no-]move-conflicting-paths]
 Mark the specified revisions as ``skipped'' for the current bisection
-operation (see @ref{Bisecting}). If no bisection operation is in
-progress a new bisection is initialized. If a bisection operation is
-in progress the next update target is selected and the workspace is
-updated to the selected revision.
+operation (see @ref{Bisecting}, see @ref{Selectors}). If no bisection
+operation is in progress a new bisection is initialized. If a
+bisection operation is in progress the next update target is selected
+and the workspace is updated to the selected revision.
 
 If the update is blocked by conflicting unversioned paths existing in
 the workspace this command may be re-issued with the
@@ -5855,16 +5870,18 @@ @section Informative
 
 @item mtn cat address@hidden @var{path}
 Write the contents of a specific file @var{path} in revision @var{id}
-(default to workspace base revision) to standard output.
+(see @ref{Selectors}; default to workspace base revision) to standard
+output.
 
 @item mtn complete file @var{partial-id}
 @itemx mtn complete key @var{partial-id}
 @itemx mtn complete revision @var{partial-id}
 
 These commands print out all known completions of a partial @sc{sha1}
-value, listing completions which are @code{file}, @code{manifest} or
address@hidden IDs depending on which variant is used. For
-example, suppose you enter this command and get this result:
+value (@emph{not} a selector), listing completions which are
address@hidden, @code{manifest} or @code{revision} IDs depending on which
+variant is used. For example, suppose you enter this command and get
+this result:
 
 @smallexample
 @group
@@ -5889,7 +5906,8 @@ @section Informative
 @itemx mtn diff address@hidden address@hidden
 @itemx mtn diff address@hidden address@hidden @var{pathname...}
 @itemx mtn di
address@hidden is an alias for @command{diff}. See online help for more options.
address@hidden is an alias for @command{diff}. See online help for more
+options. See @ref{Selectors}.
 
 These commands print out textual difference listings between various
 manifest versions. With no @option{--revision} options, @command{diff}
@@ -6059,7 +6077,8 @@ @section Informative
 
 @item mtn list duplicates address@hidden
 @itemx mtn ls duplicates
address@hidden duplicates} is an alias for @command{list duplicates}.
address@hidden duplicates} is an alias for @command{list duplicates}. See
address@hidden
 
 This command lists duplicate files in a given revision (defaults to
 the workspace base revision). Ignored and unknown files are excluded
@@ -6172,7 +6191,7 @@ @section Informative
 
 @anchor{mtn address@hidden mtn log
 @itemx mtn log address@hidden address@hidden address@hidden [...]] [--clear-from] address@hidden [...]] [--clear-to] address@hidden [...]] [--[no-]brief] [--[no-]merges] [--[no-]files] [--[no-]graph] [--[no-]diffs] address@hidden
-See the online help for more options.
+See the online help for more options. See @ref{Selectors}.
 
 This command prints out a log, in forward ancestry order by default
 but optionally in reverse ancestry order, of small history summaries.
@@ -6269,7 +6288,7 @@ @section Informative
 
 @item mtn show_conflicts @var{rev} @var{rev}
 This command shows what conflicts would need to be resolved in order to merge
-the given revisions; see @ref{Merge Conflicts}.
+the given revisions; see @ref{Merge Conflicts}, see @ref{Selectors}.
 
 Note that this does not show conflicts due to update commands, since
 in that case one revision is the workspace.
@@ -6328,8 +6347,8 @@ @section Review
 
 @anchor{mtn address@hidden mtn comment @var{rev} address@hidden
 
-This adds a new comment to a committed revision.  If @var{comment} is
-not provided, it is obtained from the Lua hook
+This adds a new comment to a committed revision (see @ref{Selectors}).
+If @var{comment} is not provided, it is obtained from the Lua hook
 @address@hidden; the hook is passed an empty string.
 
 This command is a synonym for @command{mtn cert @var{rev} comment
@@ -6338,10 +6357,12 @@ @section Review
 @item mtn disapprove [--[no-]update] address@hidden @var{child}
 See online help for more options; see @ref{Common Options}. See @ref{--update}.
 
-This command records a disapproval of the changes between @var{parent}'s
-ancestor and @var{child}.  If @var{parent} is omitted, only @var{child}
-is disapproved.  The command does the disapproval by committing
-the @i{inverse} changes as a new revision descending from @var{child}.
+This command records a disapproval of the changes between
address@hidden's ancestor and @var{child}. @var{parent} and @var{child}
+are revision ids (see @ref{Selectors}). If @var{parent} is omitted,
+only @var{child} is disapproved.  The command does the disapproval by
+committing the @i{inverse} changes as a new revision descending from
address@hidden
 
 Conceptually, @command{disapprove}'s contract is that disapprove(A) gives a
 revision B such that whenever B is merged with a descendant D of A the merge
@@ -6356,10 +6377,11 @@ @section Review
 @anchor{mtn address@hidden mtn suspend [--[no-]update] [--branch @var{branchname}] @var{rev}
 See @ref{--update}.
 
-This makes @var{rev} invisible as a head of branch @var{branchname}
-(defaults to the current workspace branch).  Any operation that looks
-for heads will not count @var{rev}; this includes @address@hidden
-list branches}} as well as @address@hidden merge}} etc.
+This makes @var{rev} (a revision id; see @ref{Selectors}) invisible as
+a head of branch @var{branchname} (defaults to the current workspace
+branch).  Any operation that looks for heads will not count @var{rev};
+this includes @address@hidden list branches}} as well as
address@hidden@ref{mtn merge}} etc.
 
 If @var{rev} is not a head, @command{suspend} has no effect.
 
@@ -6372,8 +6394,9 @@ @section Review
 
 @item mtn tag @var{rev} @var{tagname}
 This command associates the symbolic name @var{tagname} with the
-revision @var{rev}, so that symbolic name can later be used in
address@hidden for specifying revisions.
+revision @var{rev} (a revision id; see @ref{Selectors}), so that
+symbolic name can later be used in selectors for specifying
+revisions.
 
 This command is a synonym for @command{mtn cert @var{rev} tag
 @var{tagname}}.
@@ -6426,7 +6449,7 @@ @section Key and Cert
 @anchor{mtn address@hidden mtn cert @var{selector} @var{certname} address@hidden
 
 Create a new certificate with name @var{certname}, for all
-revisions matching @var{selector}.
+revisions matching @var{selector} (see @ref{Selectors}).
 
 If @var{certval} is provided, it is the value of the certificate.
 Otherwise the certificate value is read from @code{stdin}.
@@ -6547,11 +6570,11 @@ @section Key and Cert
 
 @item mtn trusted @var{id} @var{certname} @var{certval} @var{signers}
 This command lets you test your revision trust hook
address@hidden  You pass it a revision ID, a
-certificate name, a certificate value, and one or more key IDs or key
-names, and it will tell you whether, under your current settings,
-Monotone would trust a cert on that revision with that value signed by
-those keys.
address@hidden  You pass it a revision ID (see
address@hidden), a certificate name, a certificate value, and one or
+more key IDs or key names, and it will tell you whether, under your
+current settings, Monotone would trust a cert on that revision with
+that value signed by those keys.
 
 The specified keys must exist either in your keystore or in the database.
 
@@ -6813,15 +6836,15 @@ @section Database
 
 @item mtn local kill_certs @var{selector} @var{certname} address@hidden
 This command deletes certs with the given name on revisions that match
-the given selector. If a value is given, it restricts itself to only
-delete certs that also have that same value. Like @address@hidden
-local kill_revision}}, it is a very dangerous command; it permanently
-and irrevocably deletes historical information from your
-database. Also like @command{kill_revision}, this only deletes the
-certs from your local database; if there are other databases that you
-sync with which have these certs they will reappear when you sync,
-unless the owners of those databases also delete those certificates
-locally.
+the given selector (see @ref{Selectors}). If a value is given, it
+restricts itself to only delete certs that also have that same
+value. Like @address@hidden local kill_revision}}, it is a very
+dangerous command; it permanently and irrevocably deletes historical
+information from your database. Also like @command{kill_revision},
+this only deletes the certs from your local database; if there are
+other databases that you sync with which have these certs they will
+reappear when you sync, unless the owners of those databases also
+delete those certificates locally.
 
 Early versions of monotone had @command{db kill_tag_locally} and
 @command{db kill_branch_certs_locally} commands. These can be emulated with
@@ -6829,14 +6852,15 @@ @section Database
 @command{local kill_certs i: branch BRANCH}, respectively.
 
 @anchor{mtn local address@hidden mtn local kill_revision @var{id}
-This command ``kills'', i.e., deletes, a given revision, as well as
-any certs attached to it.  It is a very dangerous command; it
-permanently and irrevocably deletes historical information from your
-database.  If you execute this command in a workspace, whose parent
-revision is the one you are about to delete, the killed revision is
-re-applied to this workspace which makes it possible for you to fix a
-problem and commit again later on easily. For this to work, the
-workspace may not have any changes and/or missing files.
+This command ``kills'', i.e., deletes, a given revision (see
address@hidden), as well as any certs attached to it.  It is a very
+dangerous command; it permanently and irrevocably deletes historical
+information from your database.  If you execute this command in a
+workspace, whose parent revision is the one you are about to delete,
+the killed revision is re-applied to this workspace which makes it
+possible for you to fix a problem and commit again later on
+easily. For this to work, the workspace may not have any changes
+and/or missing files.
 
 There are a number of other caveats with this command:
 @itemize
@@ -7499,7 +7523,48 @@ @section Automation
 
 @end table
 
address@hidden mtn automate erase_descendants address@hidden
 
address@hidden @strong
address@hidden Arguments:
+
+One or more revision IDs.
+
address@hidden Added in:
+
+13.1
+
address@hidden Purpose:
+
+Prints all arguments, except those that are a descendant of some other
+argument.
+
+One way to think about this is that it prints the minimal elements of
+the given set, under the ordering imposed by the ``parent of''
+relation.  Another way to think of it is if the arguments formed a
+branch, then we would print the roots of that branch.  If there are no
+arguments, prints nothing.
+
address@hidden Sample output:
+
address@hidden
+28ce076c69eadb9b1ca7bdf9d40ce95fe2f29b61
+75156724e0e2e3245838f356ec373c50fa469f1f
address@hidden verbatim
+
address@hidden Output format:
+
+Zero or more lines, each giving the ID of one of the given revisions.
+Each line consists of a revision ID, in hexadecimal, followed by a
+newline.  The lines are printed in alphabetically sorted order.
+
address@hidden Error conditions:
+
+If any of the revisions do not exist, prints nothing to stdout, prints
+an error message to stderr, and exits with status 1.
+
address@hidden table
+
 @item mtn automate file_merge @var{left-rid} @var{left-path} @var{right-rid} @var{right-path}
 
 @table @strong
============================================================
--- innosetup/README.txt	ea1ad861438da89b7cf89f01c32a171ffd81ab11
+++ innosetup/README.txt	798ee75cb8be7728e4c5fbc6cb682d1f7beca7a2
============================================================
--- po/de.po	bd824479fb3a72bb048845d858e3a76b96f32c9b
+++ po/de.po	4b2a04bf9575d35175f08c9ed53cca82d5050e4f
@@ -7,7 +7,7 @@ msgstr ""
 msgstr ""
 "Project-Id-Version: monotone\n"
 "Report-Msgid-Bugs-To: https://code.monotone.ca/p/monotone/issues/\n"
-"POT-Creation-Date: 2011-03-14 01:32+0100\n"
+"POT-Creation-Date: 2012-04-26 01:46+0200\n"
 "PO-Revision-Date: 2011-03-14 10:18+0100\n"
 "Last-Translator: tommyd <address@hidden>\n"
 "Language-Team: Deutsch <address@hidden>\n"
@@ -55,7 +55,7 @@ msgstr "Größe der hex-enkodierten ID '
 msgid "hex encoded ID '%s' size != %d"
 msgstr "Größe der hex-enkodierten ID '%s' ist ungleich %d"
 
-#: src/vocab.cc:53 src/database.cc:4231
+#: src/vocab.cc:53 src/database.cc:4229
 #, c-format
 msgid "bad character '%c' in id name '%s'"
 msgstr "ungültiges Zeichen '%c' in ID-Name '%s'"
@@ -82,12 +82,12 @@ msgstr "ungültiges Zeichen '%c' in Schl
 
 #: src/vocab.cc:109
 #, c-format
-msgid "Invalid key length of %d bytes"
+msgid "invalid key length of %d bytes"
 msgstr "Ungültige Schlüssellänge von %d Bytes"
 
 #: src/vocab.cc:123
 #, c-format
-msgid "Invalid hmac length of %d bytes"
+msgid "invalid hmac length of %d bytes"
 msgstr "Ungültige 'hmac'-Länge von %d Bytes"
 
 #: src/charset.cc:72
@@ -117,17 +117,17 @@ msgstr "Pfad '%s' ist im monotone-System
 
 #: src/paths.cc:460
 #, c-format
-msgid "Invalid utf8"
+msgid "invalid utf8"
 msgstr "Ungültiges UTF-8"
 
 #: src/paths.cc:484
 #, c-format
-msgid "Path is not normalized"
+msgid "path is not normalized"
 msgstr "Pfad ist nicht normalisiert"
 
 #: src/paths.cc:486
 #, c-format
-msgid "Bookkeeping path is not in bookkeeping dir"
+msgid "bookkeeping path is not in bookkeeping directory"
 msgstr "Systempfad ist nicht im monotone-Systemverzeichnis"
 
 #: src/paths.cc:827
@@ -172,7 +172,7 @@ msgstr "%s wurde mit einem ungültigen P
 
 #: src/lua.cc:592
 #, c-format
-msgid "Directory '%s' does not exist"
+msgid "directory '%s' does not exist"
 msgstr "Das Verzeichnis '%s' existiert nicht"
 
 #: src/lua.cc:594 src/cmd_othervcs.cc:61 src/work.cc:2140
@@ -276,7 +276,7 @@ msgstr "Kann Datei '%s' nicht zum Lesen 
 
 #: src/file_io.cc:303
 #, c-format
-msgid "Cannot read standard input multiple times"
+msgid "cannot read standard input multiple times"
 msgstr "Kann nicht mehrmals von der Standardeingabe lesen"
 
 #: src/file_io.cc:334
@@ -478,29 +478,29 @@ msgstr "%s: entfernte Kopfzeile:"
 
 #: src/automate_reader.cc:46
 #, c-format
-msgid "Bad input to automate stdio: expected ':' after string size"
+msgid "bad input to automate stdio: expected ':' after string size"
 msgstr ""
-"Falsche Eingabe für 'automate stdio': erwartete ':' nach Zeichenketten-Länge."
+"Falsche Eingabe für 'automate stdio': erwartete ':' nach Zeichenketten-Länge"
 
 #: src/automate_reader.cc:66
 #, c-format
-msgid "Bad input to automate stdio: unexpected EOF"
-msgstr "Falsche Eingabe für 'automate stdio': unerwartetes EOF."
+msgid "bad input to automate stdio: unexpected EOF"
+msgstr "Falsche Eingabe für 'automate stdio': unerwartetes EOF"
 
 #: src/automate_reader.cc:94
 #, c-format
-msgid "Bad input to automate stdio: unknown start token '%c'"
-msgstr "Falsche Eingabe für 'automate stdio': unbekanntes Startzeichen '%c'."
+msgid "bad input to automate stdio: unknown start token '%c'"
+msgstr "Falsche Eingabe für 'automate stdio': unbekanntes Startzeichen '%c'"
 
 #: src/automate_reader.cc:116
 #, c-format
-msgid "Bad input to automate stdio: expected '%c' token"
-msgstr "Falsche Eingabe für 'automate stdio': erwartete Zeichen '%c'."
+msgid "bad input to automate stdio: expected '%c' token"
+msgstr "Falsche Eingabe für 'automate stdio': erwartete Zeichen '%c'"
 
 #: src/automate_reader.cc:123
 #, c-format
-msgid "Bad input to automate stdio: command name is missing"
-msgstr "Falsche Eingabe für 'automate stdio': Kommandoname fehlt."
+msgid "bad input to automate stdio: command name is missing"
+msgstr "Falsche Eingabe für 'automate stdio': Kommandoname fehlt"
 
 #: src/commands.cc:496
 #, c-format
@@ -654,7 +654,7 @@ msgstr ""
 
 #: src/cmd.cc:459
 #, c-format
-msgid "Call to user command '%s' (lua command: '%s') failed."
+msgid "call to user command '%s' (lua command: '%s') failed."
 msgstr ""
 "Der Aufruf des Benutzerkommandos '%s' (Lua-Kommando: '%s') schlug fehl."
 
@@ -849,7 +849,7 @@ msgid ""
 #: src/cmd_netsync.cc:122 src/cmd_netsync.cc:225
 #, c-format
 msgid ""
-"No database given; assuming '%s' database. This means that\n"
+"no database given; assuming '%s' database. This means that\n"
 "we can't verify the server key, because we have no record of\n"
 "what it should be."
 msgstr ""
@@ -869,8 +869,8 @@ msgstr "Führt KOMMANDO auf einem entfer
 #: src/cmd_netsync.cc:221 src/cmd_list.cc:1021 src/cmd_packet.cc:73
 #: src/cmd_packet.cc:134 src/cmd_packet.cc:254 src/cmd_key_cert.cc:81
 #: src/cmd_key_cert.cc:186 src/cmd_merging.cc:384 src/cmd_merging.cc:1141
-#: src/cmd_merging.cc:1219 src/cmd_ws_commit.cc:1134 src/cmd_ws_commit.cc:1342
-#: src/cmd_ws_commit.cc:1456 src/cmd_ws_commit.cc:1478 src/cmd_automate.cc:138
+#: src/cmd_merging.cc:1219 src/cmd_ws_commit.cc:1136 src/cmd_ws_commit.cc:1342
+#: src/cmd_ws_commit.cc:1484 src/cmd_ws_commit.cc:1506 src/cmd_automate.cc:138
 #: src/cmd_files.cc:239 src/cmd_files.cc:336 src/cmd_files.cc:360
 #: src/cmd_files.cc:394 src/automate.cc:85 src/automate.cc:122
 #: src/automate.cc:175 src/automate.cc:298 src/automate.cc:400
@@ -1010,18 +1010,18 @@ msgstr "Das Zielverzeichnis für das Kop
 msgid "clone destination directory '%s' already exists"
 msgstr "Das Zielverzeichnis für das Kopieren '%s' existiert bereits."
 
-#: src/cmd_netsync.cc:832 src/cmd_ws_commit.cc:1842 src/cmd_ws_commit.cc:1931
+#: src/cmd_netsync.cc:832 src/cmd_ws_commit.cc:1870 src/cmd_ws_commit.cc:1959
 #, c-format
 msgid "bookkeeping directory already exists in '%s'"
 msgstr "Das monotone-Systemverzeichnis existiert bereits in '%s'"
 
 #: src/cmd_netsync.cc:866 src/cmd_merging.cc:535 src/cmd_merging.cc:636
-#: src/cmd_merging.cc:641 src/cmd_merging.cc:1471 src/cmd_ws_commit.cc:1030
+#: src/cmd_merging.cc:641 src/cmd_merging.cc:1471 src/cmd_ws_commit.cc:1032
 #, c-format
 msgid "branch '%s' is empty"
 msgstr "Zweig '%s' ist leer"
 
-#: src/cmd_netsync.cc:869 src/cmd_ws_commit.cc:1033 src/cmd_ws_commit.cc:1910
+#: src/cmd_netsync.cc:869 src/cmd_ws_commit.cc:1035 src/cmd_ws_commit.cc:1938
 #, c-format
 msgid "branch '%s' has multiple heads:"
 msgstr "Zweig '%s' hat mehrere Köpfe:"
@@ -1031,12 +1031,12 @@ msgstr "wählen Sie eine durch '%s clone
 msgid "choose one with '%s clone -r<id> URI'"
 msgstr "wählen Sie eine durch '%s clone -r<id> URI'"
 
-#: src/cmd_netsync.cc:874 src/cmd_ws_commit.cc:1039 src/cmd_ws_commit.cc:1916
+#: src/cmd_netsync.cc:874 src/cmd_ws_commit.cc:1041 src/cmd_ws_commit.cc:1944
 #, c-format
 msgid "branch '%s' has multiple heads"
 msgstr "Zweig '%s' hat mehrere Köpfe"
 
-#: src/cmd_netsync.cc:885 src/cmd_ws_commit.cc:1896
+#: src/cmd_netsync.cc:885 src/cmd_ws_commit.cc:1924
 #, c-format
 msgid "revision %s is not a member of branch '%s'"
 msgstr "Revision %s ist nicht Mitglied des Zweiges '%s'"
@@ -1125,7 +1125,7 @@ msgstr "mehr als eine Revision wurde üb
 #: src/automate.cc:1602 src/automate.cc:1634 src/automate.cc:1701
 #: src/automate.cc:1703 src/automate.cc:1739 src/automate.cc:1946
 #: src/automate.cc:2008 src/automate.cc:2013 src/automate.cc:2175
-#: src/selectors.cc:904 src/selectors.cc:922
+#: src/selectors.cc:917 src/selectors.cc:935
 #, c-format
 msgid "no revision %s found in database"
 msgstr "Revision %s nicht in Datenbank gefunden"
@@ -1202,12 +1202,12 @@ msgstr "Listet verwaltete Datenbanken un
 msgid "Lists managed databases and their known workspaces"
 msgstr "Listet verwaltete Datenbanken und deren bekannte Arbeitsbereiche"
 
-#: src/cmd_list.cc:684 src/database.cc:4978
+#: src/cmd_list.cc:684 src/database.cc:4976
 #, c-format
 msgid "no default database location configured"
 msgstr "kein Standard-Datenbankpfad konfiguriert"
 
-#: src/cmd_list.cc:688 src/database.cc:5056
+#: src/cmd_list.cc:688 src/database.cc:5054
 #, c-format
 msgid "could not query default database glob"
 msgstr "konnte nicht das Standarddateimuster für Datenbanken abfragen"
@@ -1560,8 +1560,8 @@ msgstr ""
 "Beim nächsten Einpflegen wird der Zweig '%s' genutzt"
 
 #: src/cmd_merging.cc:209 src/cmd_merging.cc:824 src/cmd_ws_commit.cc:370
-#: src/cmd_ws_commit.cc:1358 src/cmd_ws_commit.cc:2042
-#: src/cmd_ws_commit.cc:2270 src/cmd_ws_commit.cc:2385 src/cmd_files.cc:308
+#: src/cmd_ws_commit.cc:1362 src/cmd_ws_commit.cc:2070
+#: src/cmd_ws_commit.cc:2298 src/cmd_ws_commit.cc:2413 src/cmd_files.cc:308
 #: src/cmd_files.cc:406 src/automate.cc:1035 src/automate.cc:1328
 #, c-format
 msgid "this command can only be used in a single-parent workspace"
@@ -2284,7 +2284,7 @@ msgstr ""
 
 #: src/cmd_db.cc:464 src/cmd_db.cc:486
 #, c-format
-msgid "No workspace given"
+msgid "no workspace given"
 msgstr "Kein Arbeitsbereich angegeben"
 
 #: src/cmd_db.cc:478
@@ -2340,8 +2340,8 @@ msgstr "zwischengespeicherte Höhenangab
 msgstr "zwischengespeicherte Höhenangabe: %s"
 
 #: src/cmd_db.cc:630
-msgid "load all revisions from the database"
-msgstr "läd alle Revision aus der Datenbank"
+msgid "Load all revisions from the database"
+msgstr "läd alle Revisionen aus der Datenbank"
 
 #: src/cmd_db.cc:631
 msgid ""
@@ -2362,7 +2362,7 @@ msgstr "Revisionen"
 msgstr "Revisionen"
 
 #: src/cmd_db.cc:659
-msgid "load all roster versions from the database"
+msgid "Load all roster versions from the database"
 msgstr "läd alle Katalog-Versionen aus der Datenbank"
 
 #: src/cmd_db.cc:660
@@ -2383,7 +2383,7 @@ msgstr "Kataloge"
 msgstr "Kataloge"
 
 #: src/cmd_db.cc:687
-msgid "load all file versions from the database"
+msgid "Load all file versions from the database"
 msgstr "läd alle Dateiversionen aus der Datenbank"
 
 #: src/cmd_db.cc:688
@@ -2404,7 +2404,7 @@ msgstr "Dateien"
 msgstr "Dateien"
 
 #: src/cmd_db.cc:713
-msgid "load all certs from the database"
+msgid "Load all certs from the database"
 msgstr "läd alle Zertifikate aus der Datenbank"
 
 #: src/cmd_db.cc:714
@@ -2445,21 +2445,21 @@ msgstr ""
 "(Geben Sie die Revision, gegen die Änderungen angezeigt werden sollen, "
 "explizit mit '--revision' an.)"
 
-#: src/cmd_diff_log.cc:407 src/rev_output.cc:147
+#: src/cmd_diff_log.cc:410 src/rev_output.cc:164
 msgid "no changes"
 msgstr "keine Änderungen"
 
-#: src/cmd_diff_log.cc:416 src/cmd_ws_commit.cc:538 src/cmd_ws_commit.cc:776
-#: src/cmd_ws_commit.cc:818 src/cmd_ws_commit.cc:890 src/cmd_ws_commit.cc:1808
+#: src/cmd_diff_log.cc:419 src/cmd_ws_commit.cc:538 src/cmd_ws_commit.cc:778
+#: src/cmd_ws_commit.cc:820 src/cmd_ws_commit.cc:892 src/cmd_ws_commit.cc:1836
 #: src/automate.cc:1019
 msgid "[PATH]..."
 msgstr "[PFAD]..."
 
-#: src/cmd_diff_log.cc:417
+#: src/cmd_diff_log.cc:420
 msgid "Shows current differences"
 msgstr "Zeigt die derzeitigen Unterschiede"
 
-#: src/cmd_diff_log.cc:418
+#: src/cmd_diff_log.cc:421
 msgid ""
 "Compares the current tree with the files in the repository and prints the "
 "differences on the standard output.\n"
@@ -2474,7 +2474,7 @@ msgstr ""
 "Unterschiede zwischen diesen beiden ausgegeben.  Wenn kein Format angegeben "
 "wurde, wird standardmäßig 'unified' verwendet."
 
-#: src/cmd_diff_log.cc:429
+#: src/cmd_diff_log.cc:432
 #, c-format
 msgid ""
 "'--diff-args' requires '--external'; try adding '--external' or remove '--"
@@ -2483,31 +2483,31 @@ msgstr ""
 "'--diff-args' benötigt '--external'; fügen Sie '--external' hinzu oder "
 "entfernen Sie '--diff-args'"
 
-#: src/cmd_diff_log.cc:462
+#: src/cmd_diff_log.cc:465
 msgid "[FILE [...]]"
 msgstr "[DATEI [...]]"
 
-#: src/cmd_diff_log.cc:463
+#: src/cmd_diff_log.cc:466
 msgid "Calculates diffs of files"
 msgstr "Berechnet die Unterschiede in Dateien"
 
-#: src/cmd_diff_log.cc:643
+#: src/cmd_diff_log.cc:646
 #, c-format
 msgid "only one of '--last'/'--next' allowed"
 msgstr "'--last' und '--next' sind nur einmal erlaubt"
 
-#: src/cmd_diff_log.cc:660
+#: src/cmd_diff_log.cc:663
 #, c-format
 msgid "try passing a '--from' revision to start at"
 msgstr "Versuchen Sie, über die Option '--from' eine Startrevision anzugeben."
 
-#: src/cmd_diff_log.cc:669
+#: src/cmd_diff_log.cc:672
 #, c-format
 msgid "workspace has no parent revision, probably an empty branch"
 msgstr ""
 "Arbeitsbereich hat keine Elternrevision, wahrscheinlich ein leerer Zweig"
 
-#: src/cmd_diff_log.cc:672
+#: src/cmd_diff_log.cc:675
 #, c-format
 msgid ""
 "workspace parent revision %s not found - did you specify a wrong database?"
@@ -2515,20 +2515,20 @@ msgstr ""
 "Eltern-Revision %s des Arbeitsbereiches wurde nicht gefunden - haben Sie "
 "eine falsche Datenbank angegeben?"
 
-#: src/cmd_diff_log.cc:958
+#: src/cmd_diff_log.cc:961
 #, c-format
 msgid "(Revision: %s)"
 msgstr "(Revision: %s)"
 
-#: src/cmd_diff_log.cc:980 src/cmd_diff_log.cc:994
+#: src/cmd_diff_log.cc:983 src/cmd_diff_log.cc:997
 msgid "[PATH] ..."
 msgstr "[PFAD] ..."
 
-#: src/cmd_diff_log.cc:981
+#: src/cmd_diff_log.cc:984
 msgid "Prints selected history in forward or reverse order"
 msgstr "Gibt die ausgewählte Historie vorwärts oder rückwärts aus"
 
-#: src/cmd_diff_log.cc:982
+#: src/cmd_diff_log.cc:985
 msgid ""
 "This command prints selected history in forward or reverse order, filtering "
 "it by PATH if given."
@@ -2536,7 +2536,7 @@ msgstr ""
 "Dieses Kommando gibt die ausgewählte Historie vorwärts oder rückwärts aus, "
 "gefiltert durch PFAD, sofern angegeben."
 
-#: src/cmd_diff_log.cc:995
+#: src/cmd_diff_log.cc:998
 msgid "Lists the selected revision history"
 msgstr "Listet die ausgewählte Revisionshistorie"
 
@@ -2592,19 +2592,19 @@ msgstr ""
 "Datumsformat '%s' kann nicht analysiert werden; nutze stattdessen "
 "Standardformat"
 
-#: src/cmd_ws_commit.cc:237 src/cmd_ws_commit.cc:985
+#: src/cmd_ws_commit.cc:237 src/cmd_ws_commit.cc:987
 msgid "*** THIS REVISION WILL CREATE A NEW BRANCH ***"
 msgstr "*** DIESE REVISION ERZEUGT EINEN NEUEN ZWEIG ***"
 
-#: src/cmd_ws_commit.cc:240 src/cmd_ws_commit.cc:988
+#: src/cmd_ws_commit.cc:240 src/cmd_ws_commit.cc:990
 msgid "Old Branch: "
 msgstr "Alter Zweig: "
 
-#: src/cmd_ws_commit.cc:241 src/cmd_ws_commit.cc:989
+#: src/cmd_ws_commit.cc:241 src/cmd_ws_commit.cc:991
 msgid "New Branch: "
 msgstr "Neuer Zweig: "
 
-#: src/cmd_ws_commit.cc:252 src/cmd_ws_commit.cc:1000
+#: src/cmd_ws_commit.cc:252 src/cmd_ws_commit.cc:1002
 msgid "*** THIS REVISION WILL CREATE DIVERGENCE ***"
 msgstr "*** DIESE REVISION WIRD EINEN NEUEN KOPF ERZEUGEN ***"
 
@@ -2745,8 +2745,13 @@ msgstr ""
 "Revisionen teilen gemeinsame Historie, aber %s ist kein Vorfahr von %s, kann "
 "nicht umkehren"
 
-#: src/cmd_ws_commit.cc:702 src/cmd_ws_commit.cc:1771
+#: src/cmd_ws_commit.cc:674
 #, c-format
+msgid "cannot disapprove root revision"
+msgstr "kann Wurzel-Revision nicht verwerfen"
+
+#: src/cmd_ws_commit.cc:704 src/cmd_ws_commit.cc:1799
+#, c-format
 msgid ""
 "note: this revision creates divergence\n"
 "note: you may (or may not) wish to run '%s merge'"
@@ -2754,33 +2759,33 @@ msgstr ""
 "Hinweis: Diese Revision erzeugt einen neuen Kopf\n"
 "Hinweis: Sie möchten eventuell '%s merge' ausführen"
 
-#: src/cmd_ws_commit.cc:709
+#: src/cmd_ws_commit.cc:711
 msgid "[DIRECTORY...]"
 msgstr "[VERZEICHNIS...]"
 
-#: src/cmd_ws_commit.cc:710
+#: src/cmd_ws_commit.cc:712
 msgid "Creates directories and adds them to the workspace"
 msgstr "Erzeugt Verzeichnisse und fügt sie zum Arbeitsbereich hinzu"
 
-#: src/cmd_ws_commit.cc:728
+#: src/cmd_ws_commit.cc:730
 #, c-format
 msgid "directory '%s' already exists"
 msgstr "Das Verzeichnis '%s' existiert bereits."
 
-#: src/cmd_ws_commit.cc:735
+#: src/cmd_ws_commit.cc:737
 #, c-format
 msgid "ignoring directory '%s' (see '.mtn-ignore')"
 msgstr "ignoriere Verzeichnis '%s' (siehe '.mtn-ignore')"
 
-#: src/cmd_ws_commit.cc:777
+#: src/cmd_ws_commit.cc:779
 msgid "Adds files to the workspace"
 msgstr "Fügt Dateien zum Arbeitsbereich hinzu"
 
-#: src/cmd_ws_commit.cc:819
+#: src/cmd_ws_commit.cc:821
 msgid "Drops files from the workspace"
 msgstr "Entfernt Dateien vom Arbeitsbereich"
 
-#: src/cmd_ws_commit.cc:834
+#: src/cmd_ws_commit.cc:836
 msgid ""
 "SRC DEST\n"
 "SRC1 [SRC2 [...]] DEST_DIR"
@@ -2788,24 +2793,24 @@ msgstr ""
 "QUELLE ZIEL\n"
 "QUELLE1 [QUELLE2 [...]] ZIEL_VERZEICHNIS"
 
-#: src/cmd_ws_commit.cc:836
+#: src/cmd_ws_commit.cc:838
 msgid "Renames entries in the workspace"
 msgstr "Benennt Einträge im Arbeitsbereich um"
 
-#: src/cmd_ws_commit.cc:862
+#: src/cmd_ws_commit.cc:864
 #, c-format
 msgid "the specified target directory '%s/' doesn't exist."
 msgstr "Das angegebene Ziel-Verzeichnis '%s/' existiert nicht."
 
-#: src/cmd_ws_commit.cc:868
+#: src/cmd_ws_commit.cc:870
 msgid "NEW_ROOT PUT_OLD"
 msgstr "NEUE_WURZEL ALTE_WURZEL"
 
-#: src/cmd_ws_commit.cc:869
+#: src/cmd_ws_commit.cc:871
 msgid "Renames the root directory"
 msgstr "Benennt das Wurzelverzeichnis um"
 
-#: src/cmd_ws_commit.cc:870
+#: src/cmd_ws_commit.cc:872
 msgid ""
 "After this command, the directory that currently has the name NEW_ROOT will "
 "be the root directory, and the directory that is currently the root "
@@ -2817,52 +2822,52 @@ msgstr ""
 "ALTE_WURZEL erhält.\n"
 "Die Benutzung von '--bookkeep-only' wird NICHT empfohlen."
 
-#: src/cmd_ws_commit.cc:891
+#: src/cmd_ws_commit.cc:893
 msgid "Shows workspace's status information"
 msgstr "Zeigt Status-Informationen des Arbeitsbereiches"
 
-#: src/cmd_ws_commit.cc:929
+#: src/cmd_ws_commit.cc:931
 #, c-format
 msgid "bisection from revision %s in progress"
 msgstr "Bisektion von Revision %s wird durchgeführt"
 
-#: src/cmd_ws_commit.cc:1024
+#: src/cmd_ws_commit.cc:1026
 #, c-format
 msgid "use '--revision' or '--branch' to specify what to checkout"
 msgstr ""
 "nutzen Sie '--revision' oder '--branch' um festzulegen, was ausgecheckt "
 "werden soll"
 
-#: src/cmd_ws_commit.cc:1037
+#: src/cmd_ws_commit.cc:1039
 #, c-format
 msgid "choose one with '%s checkout -r<id>'"
 msgstr "wählen Sie einen durch '%s checkout -r<id>'"
 
-#: src/cmd_ws_commit.cc:1054
+#: src/cmd_ws_commit.cc:1056
 #, c-format
 msgid "revision %s is not a member of branch %s"
 msgstr "Revision %s ist nicht Mitglied des Zweiges %s"
 
-#: src/cmd_ws_commit.cc:1071
+#: src/cmd_ws_commit.cc:1073
 #, c-format
 msgid "you must specify a destination directory"
 msgstr "Es muss ein Zielverzeichnis angegeben werden."
 
-#: src/cmd_ws_commit.cc:1084
+#: src/cmd_ws_commit.cc:1086
 #, c-format
 msgid "checkout directory '%s' already exists"
 msgstr "Das Verzeichnis '%s' zum Auschecken existiert bereits."
 
-#: src/cmd_ws_commit.cc:1111 src/cmd_ws_commit.cc:1125
-#: src/cmd_ws_commit.cc:1821 src/cmd_ws_commit.cc:1978
+#: src/cmd_ws_commit.cc:1113 src/cmd_ws_commit.cc:1127
+#: src/cmd_ws_commit.cc:1849 src/cmd_ws_commit.cc:2006
 msgid "[DIRECTORY]"
 msgstr "[VERZEICHNIS]"
 
-#: src/cmd_ws_commit.cc:1112 src/cmd_ws_commit.cc:1126
+#: src/cmd_ws_commit.cc:1114 src/cmd_ws_commit.cc:1128
 msgid "Checks out a revision from the database into a directory"
 msgstr "Checkt eine Revision aus der Datenbank in ein Verzeichnis aus"
 
-#: src/cmd_ws_commit.cc:1113 src/cmd_ws_commit.cc:1127
+#: src/cmd_ws_commit.cc:1115 src/cmd_ws_commit.cc:1129
 msgid ""
 "If a revision is given, that's the one that will be checked out.  Otherwise, "
 "it will be the head of the branch (given or implicit).  If no directory is "
@@ -2873,41 +2878,41 @@ msgstr ""
 "ausgecheckt.  Wenn kein Verzeichnis angegeben wird, wird der Zweigname als "
 "Verzeichnisname verwendet."
 
-#: src/cmd_ws_commit.cc:1137
+#: src/cmd_ws_commit.cc:1139
 #, c-format
 msgid "wrong revision count"
 msgstr "falsche Anzahl von Revisionen"
 
-#: src/cmd_ws_commit.cc:1143
+#: src/cmd_ws_commit.cc:1145
 msgid "Manages file attributes"
 msgstr "Verwaltet Dateiattribute"
 
-#: src/cmd_ws_commit.cc:1144
+#: src/cmd_ws_commit.cc:1146
 msgid "This command is used to set, get or drop file attributes."
 msgstr ""
 "Dieses Kommando wird benutzt, um Dateiattribute zu setzen, zu holen oder zu "
 "löschen."
 
-#: src/cmd_ws_commit.cc:1163 src/cmd_ws_commit.cc:1231
-#: src/cmd_ws_commit.cc:1281 src/cmd_ws_commit.cc:1362
+#: src/cmd_ws_commit.cc:1165 src/cmd_ws_commit.cc:1233
+#: src/cmd_ws_commit.cc:1283 src/cmd_ws_commit.cc:1366
 #, c-format
 msgid "unknown path '%s'"
 msgstr "unbekannter Pfad '%s'"
 
-#: src/cmd_ws_commit.cc:1180
+#: src/cmd_ws_commit.cc:1182
 #, c-format
 msgid "path '%s' does not have attribute '%s'"
 msgstr "Pfad '%s' hat kein Attribut '%s'"
 
-#: src/cmd_ws_commit.cc:1199 src/cmd_ws_commit.cc:1212
+#: src/cmd_ws_commit.cc:1201 src/cmd_ws_commit.cc:1214
 msgid "PATH [ATTR]"
 msgstr "PFAD [ATTRIBUT]"
 
-#: src/cmd_ws_commit.cc:1200
+#: src/cmd_ws_commit.cc:1202
 msgid "Removes attributes from a file"
 msgstr "Entfernt Attribute von einer Datei"
 
-#: src/cmd_ws_commit.cc:1201
+#: src/cmd_ws_commit.cc:1203
 msgid ""
 "If no attribute is specified, this command removes all attributes attached "
 "to the file given in PATH.  Otherwise only removes the attribute specified "
@@ -2917,11 +2922,11 @@ msgstr ""
 "die einer Datei zugeordnet wurden.  Andernfalls wird lediglich das "
 "übergebene Attribut entfernt."
 
-#: src/cmd_ws_commit.cc:1213
+#: src/cmd_ws_commit.cc:1215
 msgid "Gets the values of a file's attributes"
 msgstr "Gibt den Wert eines Dateiattributs aus"
 
-#: src/cmd_ws_commit.cc:1214
+#: src/cmd_ws_commit.cc:1216
 msgid ""
 "If no attribute is specified, this command prints all attributes attached to "
 "the file given in PATH.  Otherwise it only prints the attribute specified in "
@@ -2931,61 +2936,79 @@ msgstr ""
 "die der Datei zugeordnet wurden.  Andernfalls wird lediglich der Wert des "
 "übergebenen Attributs ausgegeben."
 
-#: src/cmd_ws_commit.cc:1247
+#: src/cmd_ws_commit.cc:1249
 #, c-format
 msgid "no attributes for '%s'"
 msgstr "keine Attribute für '%s'"
 
-#: src/cmd_ws_commit.cc:1259
+#: src/cmd_ws_commit.cc:1261
 #, c-format
 msgid "no attribute '%s' on path '%s'"
 msgstr "kein Attribut für '%s' auf Pfad '%s'"
 
-#: src/cmd_ws_commit.cc:1305
+#: src/cmd_ws_commit.cc:1307
 msgid "PATH ATTR VALUE"
 msgstr "PFAD ATTRIBUT WERT"
 
-#: src/cmd_ws_commit.cc:1306
+#: src/cmd_ws_commit.cc:1308
 msgid "Sets an attribute on a file"
 msgstr "Setzt ein Attribut auf eine Datei"
 
-#: src/cmd_ws_commit.cc:1307
+#: src/cmd_ws_commit.cc:1309
 msgid ""
 "Sets the attribute given on ATTR to the value specified in VALUE for the "
 "file mentioned in PATH."
 msgstr ""
 "Setzt das Attribut ATTRIBUT auf den Wert WERT für die übergebene Datei DATEI."
 
-#: src/cmd_ws_commit.cc:1336 src/cmd_files.cc:138 src/cmd_files.cc:233
+#: src/cmd_ws_commit.cc:1335 src/cmd_files.cc:138 src/cmd_files.cc:233
 msgid "PATH"
 msgstr "PFAD"
 
-#: src/cmd_ws_commit.cc:1337
+#: src/cmd_ws_commit.cc:1336
 msgid "Prints all attributes for the specified path"
 msgstr "Gibt alle Attribute für den übergebenen Pfad aus"
 
-#: src/cmd_ws_commit.cc:1450
+#: src/cmd_ws_commit.cc:1337
+msgid ""
+"If an explicit revision is given, the file's attributes at this specific "
+"revision are returned."
+msgstr ""
+"Wenn eine Revision explizit übergeben wird, werden die Attribute der Datei "
+"in dieser Revision zurückgegeben"
+
+#: src/cmd_ws_commit.cc:1378
+#, c-format
+msgid "unknown path '%s' in %s"
+msgstr "unbekannter Pfad '%s' in %s"
+
+#: src/cmd_ws_commit.cc:1381
+#, c-format
+msgid "none or only one revision must be given"
+msgstr "keine oder eine Revision müssen übergeben werden"
+
+#: src/cmd_ws_commit.cc:1478
 msgid "PATH KEY VALUE"
 msgstr "PFAD SCHLÜSSEL WERT"
 
-#: src/cmd_ws_commit.cc:1451
+#: src/cmd_ws_commit.cc:1479
 msgid "Sets an attribute on a certain path"
 msgstr "Setzt ein Attribut auf den übergebenen Pfad"
 
-#: src/cmd_ws_commit.cc:1472
+#: src/cmd_ws_commit.cc:1500
 msgid "PATH [KEY]"
 msgstr "PFAD [SCHLÜSSEL]"
 
-#: src/cmd_ws_commit.cc:1473
+#: src/cmd_ws_commit.cc:1501
 msgid "Drops an attribute or all of them from a certain path"
 msgstr "Entfernt ein Attribut oder alle Attribute vom übergebenen Pfad"
 
-#: src/cmd_ws_commit.cc:1513
+#: src/cmd_ws_commit.cc:1541
 #, c-format
 msgid "no changes to commit"
 msgstr "keine Änderungen zum Einpflegen"
 
-#: src/cmd_ws_commit.cc:1534
+#: src/cmd_ws_commit.cc:1562
 #, c-format
 msgid ""
 "parent revisions of this commit are in different branches:\n"
@@ -2997,12 +3020,12 @@ msgstr ""
 "'%s' und '%s'.\n"
 "Bitte geben Sie einen Zweignamen mit '--branch' für das Einpflegen an."
 
-#: src/cmd_ws_commit.cc:1556
+#: src/cmd_ws_commit.cc:1584
 #, c-format
 msgid "changes rejected by hook: %s"
 msgstr "Änderungen durch Hook zurückgewiesen: %s"
 
-#: src/cmd_ws_commit.cc:1570
+#: src/cmd_ws_commit.cc:1598
 #, c-format
 msgid ""
 "'_MTN/log' is non-empty and log message was specified on command line.\n"
@@ -3015,74 +3038,74 @@ msgstr ""
 "entfernen Sie den '--message'-/'--message-file'-Parameter aus der "
 "Kommandozeile."
 
-#: src/cmd_ws_commit.cc:1615
+#: src/cmd_ws_commit.cc:1643
 #, c-format
 msgid "empty log message; commit canceled"
 msgstr "leerer Kommentar; Einpflegen abgebrochen"
 
-#: src/cmd_ws_commit.cc:1635
+#: src/cmd_ws_commit.cc:1663
 #, c-format
 msgid "log message rejected by hook: %s"
 msgstr "Kommentar durch Hook zurückgewiesen: %s"
 
-#: src/cmd_ws_commit.cc:1645
+#: src/cmd_ws_commit.cc:1673
 #, c-format
 msgid "beginning commit on branch '%s'"
 msgstr "beginne Einpflegen auf Zweig '%s'"
 
-#: src/cmd_ws_commit.cc:1651
+#: src/cmd_ws_commit.cc:1679
 #, c-format
 msgid "revision %s already in database"
 msgstr "Revision %s ist bereits in der Datenbank"
 
-#: src/cmd_ws_commit.cc:1695 src/cmd_ws_commit.cc:1725
+#: src/cmd_ws_commit.cc:1723 src/cmd_ws_commit.cc:1753
 #, c-format
 msgid "file '%s' modified during commit, aborting"
 msgstr "Datei '%s' wurde während des Einpflegens geändert, breche ab"
 
-#: src/cmd_ws_commit.cc:1706
+#: src/cmd_ws_commit.cc:1734
 #, c-format
 msgid "your database is missing version %s of file '%s'"
 msgstr "Ihrer Datenbank fehlt die Version %s der Datei '%s'"
 
-#: src/cmd_ws_commit.cc:1764
+#: src/cmd_ws_commit.cc:1792
 #, c-format
 msgid "committed revision %s"
 msgstr "Revision %s eingepflegt"
 
-#: src/cmd_ws_commit.cc:1809
+#: src/cmd_ws_commit.cc:1837
 msgid "Commits workspace changes to the database"
 msgstr "Pflegt Änderungen am Arbeitsbereich in die Datenbank ein"
 
-#: src/cmd_ws_commit.cc:1822
+#: src/cmd_ws_commit.cc:1850
 msgid "Sets up a new workspace directory"
 msgstr "Setzt einen neuen Arbeitsbereich auf"
 
-#: src/cmd_ws_commit.cc:1823
+#: src/cmd_ws_commit.cc:1851
 msgid "If no directory is specified, uses the current directory."
 msgstr ""
 "Wenn kein Verzeichnis übergeben wird, wird das derzeitige Verzeichnis "
 "genutzt."
 
-#: src/cmd_ws_commit.cc:1830
+#: src/cmd_ws_commit.cc:1858
 #, c-format
 msgid "need '--branch' argument for setup"
 msgstr "benötige '--branch'-Parameter für das Setup"
 
-#: src/cmd_ws_commit.cc:1868
+#: src/cmd_ws_commit.cc:1896
 msgid "DIRECTORY"
 msgstr "VERZEICHNIS"
 
-#: src/cmd_ws_commit.cc:1869
+#: src/cmd_ws_commit.cc:1897
 msgid "Imports the contents of a directory into a branch"
 msgstr "Importiert die Inhalte eines Verzeichnisses in einen Zweig"
 
-#: src/cmd_ws_commit.cc:1883
+#: src/cmd_ws_commit.cc:1911
 #, c-format
 msgid "you must specify a directory to import"
 msgstr "Es muss ein Verzeichnis für den Import angegeben werden."
 
-#: src/cmd_ws_commit.cc:1903
+#: src/cmd_ws_commit.cc:1931
 #, c-format
 msgid ""
 "use '--revision' or '--branch' to specify the parent revision for the import"
@@ -3090,40 +3113,40 @@ msgstr ""
 "Nutzen Sie '--revision' oder '--branch', um die Elternrevision für den "
 "Import festzulegen."
 
-#: src/cmd_ws_commit.cc:1914
+#: src/cmd_ws_commit.cc:1942
 #, c-format
 msgid "choose one with '%s import -r<id>'"
 msgstr "wählen Sie eine durch '%s import -r<id>'"
 
-#: src/cmd_ws_commit.cc:1925
+#: src/cmd_ws_commit.cc:1953
 #, c-format
 msgid "import directory '%s' doesn't exists"
 msgstr "Das Import-Verzeichnis '%s' existiert nicht."
 
-#: src/cmd_ws_commit.cc:1926
+#: src/cmd_ws_commit.cc:1954
 #, c-format
 msgid "import directory '%s' is a file"
 msgstr "Der Import-Pfad '%s' ist eine Datei und kein Verzeichnis."
 
-#: src/cmd_ws_commit.cc:1979
+#: src/cmd_ws_commit.cc:2007
 msgid "Migrates a workspace directory's metadata to the latest format"
 msgstr "Migriert die Metadaten eines Arbeitsbereichs auf das neueste Format"
 
-#: src/cmd_ws_commit.cc:1980
+#: src/cmd_ws_commit.cc:2008
 msgid "If no directory is given, defaults to the current workspace."
 msgstr ""
 "Wenn kein Verzeichnis übergeben wurde, wird standardmäßig der derzeitige "
 "Arbeitsbereich genutzt."
 
-#: src/cmd_ws_commit.cc:2004
+#: src/cmd_ws_commit.cc:2032
 msgid "Refreshes the inodeprint cache"
 msgstr "Aktualisiert den 'inodeprint'-Cache"
 
-#: src/cmd_ws_commit.cc:2015
+#: src/cmd_ws_commit.cc:2043
 msgid "Search revisions to find where a change first appeared"
 msgstr "Suche Revisionen, in denen eine Änderung zuerst erschien"
 
-#: src/cmd_ws_commit.cc:2016
+#: src/cmd_ws_commit.cc:2044
 msgid ""
 "These commands subdivide a set of revisions into good, bad and untested "
 "subsets and successively narrow the untested set to find the first revision "
@@ -3134,11 +3157,11 @@ msgstr ""
 "sukksessive solange, bis die erste Revision gefunden wurde, die eine "
 "bestimmte Änderung eingeführt hat."
 
-#: src/cmd_ws_commit.cc:2021
+#: src/cmd_ws_commit.cc:2049
 msgid "Reset the current bisection search"
 msgstr "Setze die aktuelle Bisektionssuche zurück"
 
-#: src/cmd_ws_commit.cc:2022
+#: src/cmd_ws_commit.cc:2050
 msgid ""
 "Update the workspace back to the revision from which the bisection was "
 "started and remove all current search information, allowing a new search to "
@@ -3148,24 +3171,24 @@ msgstr ""
 "Bisektion gestartet wurde und entferne alle derzeitigen Suchinformationen, "
 "um eine neue Suche zu ermöglichen."
 
-#: src/cmd_ws_commit.cc:2037 src/cmd_ws_commit.cc:2093
+#: src/cmd_ws_commit.cc:2065 src/cmd_ws_commit.cc:2121
 #, c-format
 msgid "no bisection in progress"
 msgstr "es wird keine Bisektion durchgeführt"
 
-#: src/cmd_ws_commit.cc:2052 src/cmd_ws_commit.cc:2280
+#: src/cmd_ws_commit.cc:2080 src/cmd_ws_commit.cc:2308
 #, c-format
 msgid "this command can only be used in a workspace with no pending changes"
 msgstr ""
 "dieses Kommando kann nur in einem Arbeitsbereich genutzt werden, der keine "
 "Änderungen aufweist."
 
-#: src/cmd_ws_commit.cc:2058
+#: src/cmd_ws_commit.cc:2086
 #, c-format
 msgid "reset back to %s"
 msgstr "setzte auf %s zurück"
 
-#: src/cmd_ws_commit.cc:2124
+#: src/cmd_ws_commit.cc:2152
 #, c-format
 msgid ""
 "bisecting revisions; %d good; %d bad; %d skipped; specify good revisions to "
@@ -3174,7 +3197,7 @@ msgstr ""
 "unterteile Revisionen; %d gute; %d schlechte; %d übergangene; geben Sie gute "
 "Revisionen an, um die Suche zu starten"
 
-#: src/cmd_ws_commit.cc:2130
+#: src/cmd_ws_commit.cc:2158
 #, c-format
 msgid ""
 "bisecting revisions; %d good; %d bad; %d skipped; specify bad revisions to "
@@ -3183,43 +3206,43 @@ msgstr ""
 "unterteile Revisionen; %d gute; %d schlechte; %d übergangene; geben Sie "
 "schlechte Revisionen an, um die Suche zu starten"
 
-#: src/cmd_ws_commit.cc:2193
+#: src/cmd_ws_commit.cc:2221
 #, c-format
 msgid "bisecting %d revisions; %d good; %d bad; %d skipped; %d remaining"
 msgstr ""
 "unterteile %d Revisionen; %d gute; %d schlechte; %d übergangene; %d "
 "verbleiben"
 
-#: src/cmd_ws_commit.cc:2211
+#: src/cmd_ws_commit.cc:2239
 #, c-format
 msgid "bisection finished at revision %s"
 msgstr "Bisektion bei Revision %s beendet"
 
-#: src/cmd_ws_commit.cc:2304
+#: src/cmd_ws_commit.cc:2332
 #, c-format
 msgid "bisection started at revision %s"
 msgstr "Bisektion bei Revision %s gestartet"
 
-#: src/cmd_ws_commit.cc:2320
+#: src/cmd_ws_commit.cc:2348
 #, c-format
 msgid "ignored redundant bisect %s on revision %s"
 msgstr "ignoriere überflüssiges 'bisect %s' auf Revision %s"
 
-#: src/cmd_ws_commit.cc:2325
+#: src/cmd_ws_commit.cc:2353
 #, c-format
 msgid "conflicting bisect %s/%s on revision %s"
 msgstr "Konflikt bei 'bisect %s/%s' auf Revision %s"
 
-#: src/cmd_ws_commit.cc:2343
+#: src/cmd_ws_commit.cc:2371
 #, c-format
 msgid "updating to %s"
 msgstr "aktualisiere auf %s"
 
-#: src/cmd_ws_commit.cc:2368
+#: src/cmd_ws_commit.cc:2396
 msgid "Reports on the current status of the bisection search"
 msgstr "Berichtet den derzeitigen Status der Bisektionssuche"
 
-#: src/cmd_ws_commit.cc:2369
+#: src/cmd_ws_commit.cc:2397
 msgid ""
 "Lists the total number of revisions in the search set, the number of "
 "revisions that have been determined to be good or bad, the number of "
@@ -3231,30 +3254,30 @@ msgstr ""
 "Revisionen, die übergangen wurden, sowie die Anzahl der zum Test "
 "verbleibenden Revisionen auf."
 
-#: src/cmd_ws_commit.cc:2397
+#: src/cmd_ws_commit.cc:2425
 #, c-format
 msgid "next revision for bisection testing is %s\n"
 msgstr "nächste Revision für Bisektionstest ist %s\n"
 
-#: src/cmd_ws_commit.cc:2398
+#: src/cmd_ws_commit.cc:2426
 #, c-format
 msgid "however this workspace is currently at %s\n"
 msgstr "der Arbeitsbereich hat jedoch derzeit die Revision %s\n"
 
-#: src/cmd_ws_commit.cc:2399
+#: src/cmd_ws_commit.cc:2427
 #, c-format
 msgid "run 'bisect update' to update to this revision before testing"
 msgstr ""
 "führen Sie 'bisect update' aus, um vor dem Test zur korrekten Revision zu "
 "aktualisieren"
 
-#: src/cmd_ws_commit.cc:2404
+#: src/cmd_ws_commit.cc:2432
 msgid "Updates the workspace to the next revision to be tested by bisection"
 msgstr ""
 "Aktualisiert den Arbeitsbereich zur nächsten Revision, die durch die "
 "Bisektionssuche getestet werden soll."
 
-#: src/cmd_ws_commit.cc:2405
+#: src/cmd_ws_commit.cc:2433
 msgid ""
 "This command can be used if updates by good, bad or skip commands fail due "
 "to blocked paths or other problems."
@@ -3263,13 +3286,13 @@ msgstr ""
 "Kommandos 'good', 'bad' oder 'skip' durch bestimmte Probleme, wie "
 "beispielsweise blockierte Pfade, fehlschlagen."
 
-#: src/cmd_ws_commit.cc:2415
+#: src/cmd_ws_commit.cc:2443
 msgid "Excludes the current revision or specified revisions from the search"
 msgstr ""
 "Schließt die derzeitige Revision oder die spezifizierten Revisionen von der "
 "Suche aus"
 
-#: src/cmd_ws_commit.cc:2416
+#: src/cmd_ws_commit.cc:2444
 msgid ""
 "Skipped revisions are removed from the set being searched. Revisions that "
 "cannot be tested for some reason should be skipped."
@@ -3278,23 +3301,23 @@ msgstr ""
 "die aus irgend einem Grund nicht getestet werden können, sollten übergangen "
 "werden."
 
-#: src/cmd_ws_commit.cc:2426
+#: src/cmd_ws_commit.cc:2454
 msgid "Marks the current revision or specified revisions as bad"
 msgstr ""
 "Markiert die derzeitige Revision oder die spezifizierten Revisionen als "
 "schlecht"
 
-#: src/cmd_ws_commit.cc:2427
+#: src/cmd_ws_commit.cc:2455
 msgid "Known bad revisions are removed from the set being searched."
 msgstr ""
 "Bekannte schlechte Revisionen werden von der durchsuchten Menge entfernt."
 
-#: src/cmd_ws_commit.cc:2436
+#: src/cmd_ws_commit.cc:2464
 msgid "Marks the current revision or specified revisions as good"
 msgstr ""
 "Markiert die derzeitige Revision oder die spezifizierten Revisionen als gut"
 
-#: src/cmd_ws_commit.cc:2437
+#: src/cmd_ws_commit.cc:2465
 msgid "Known good revisions are removed from the set being searched."
 msgstr "Bekannte gute Revisionen werden von der durchsuchten Menge entfernt."
 
@@ -3409,8 +3432,7 @@ msgid "bad input to mtn_automate() lua e
 #: src/cmd_automate.cc:333
 #, c-format
 msgid "bad input to mtn_automate() lua extension: command name is missing"
-msgstr ""
-"falsche Eingabe für mtn_automate()-Lua-Erweiterung: Kommandoname fehlt"
+msgstr "falsche Eingabe für mtn_automate()-Lua-Erweiterung: Kommandoname fehlt"
 
 #: src/cmd_files.cc:39
 msgid "Loads a file's contents into the database"
@@ -3748,7 +3770,7 @@ msgstr "rc-Datei '%s' existiert nicht"
 msgid "rcfile '%s' does not exist"
 msgstr "rc-Datei '%s' existiert nicht"
 
-#: src/transforms.cc:83
+#: src/transforms.cc:84
 #, c-format
 msgid ""
 "%s\n"
@@ -4332,7 +4354,8 @@ msgstr ""
 msgstr ""
 "Datenbank '%s' beinhaltet Manifeste, aber keine Revisionen\n"
 "Dies ist eine sehr alte Datenbank, die erneuert werden muss.\n"
-"Bitte konsultieren Sie 'http://wiki.monotone.ca/upgradefromchangesets/' für Details"
+"Bitte konsultieren Sie 'http://wiki.monotone.ca/upgradefromchangesets/' für "
+"Details"
 
 #: src/database.cc:650
 #, c-format
@@ -4552,7 +4575,7 @@ msgid ""
 #: src/database.cc:2530
 #, c-format
 msgid ""
-"Unknown delta direction '%s'; assuming 'reverse'. Valid values are "
+"unknown delta direction '%s'; assuming 'reverse'. Valid values are "
 "'reverse', 'forward', 'both'."
 msgstr ""
 "Unbekannte Delta-Richtung '%s'; habe 'reverse' vermutet. Gültige Werte sind "
@@ -4594,27 +4617,27 @@ msgstr "Revision beinhaltet ungültige m
 msgid "revision contains incorrect manifest_id"
 msgstr "Revision beinhaltet ungültige manifest_id"
 
-#: src/database.cc:3489
+#: src/database.cc:3487
 #, c-format
-msgid "Failed to get RSA verifying key for %s"
+msgid "failed to get RSA verifying key for %s"
 msgstr "RSA konnte den Schlüssel für %s nicht überprüfen"
 
-#: src/database.cc:3628
+#: src/database.cc:3626
 #, c-format
-msgid "Your database contains multiple keys named '%s'"
+msgid "your database contains multiple keys named '%s'"
 msgstr "Ihre Datenbank beinhaltet mehrere Schlüssel mit dem Namen '%s'"
 
-#: src/database.cc:3789
+#: src/database.cc:3787
 #, c-format
 msgid "cert revision %s does not exist in db"
 msgstr "Zertifikats-Revision %s existiert nicht in der Datenbank"
 
-#: src/database.cc:3791
+#: src/database.cc:3789
 #, c-format
 msgid "dropping cert"
 msgstr "entferne Zertifikat"
 
-#: src/database.cc:3801
+#: src/database.cc:3799
 #, c-format
 msgid ""
 "the branch name\n"
@@ -4638,34 +4661,34 @@ msgstr ""
 "Kommando '%s local kill_certs' um das Zweigzertifikat wieder zu löschen\n"
 "und danach ein neues mit gültigen Zweignamen zu erstellen."
 
-#: src/database.cc:4118
+#: src/database.cc:4116
 #, c-format
 msgid "ignoring bad signature by '%s' on '%s'"
 msgstr "ignoriere ungültige Signatur von '%s' vom '%s'"
 
-#: src/database.cc:4123
+#: src/database.cc:4121
 #, c-format
 msgid "ignoring unknown signature by '%s' on '%s'"
 msgstr "ignoriere unbekannte Signatur von '%s' vom '%s'"
 
-#: src/database.cc:4125
+#: src/database.cc:4123
 #, c-format
 msgid "trust function disliked %d signers of '%s' cert on revision %s"
 msgstr ""
 "Vertrauensfunktion lehnt %d Unterzeichner des Zertifikats '%s' auf Revision "
 "%s ab"
 
-#: src/database.cc:4813 src/database.cc:4955
+#: src/database.cc:4811 src/database.cc:4953
 #, c-format
 msgid "no database specified"
 msgstr "keine Datenbank spezifiziert"
 
-#: src/database.cc:4826
+#: src/database.cc:4824
 #, c-format
 msgid "database '%s' does not exist"
 msgstr "Datenbank '%s' existiert nicht"
 
-#: src/database.cc:4834
+#: src/database.cc:4832
 #, c-format
 msgid ""
 "'%s' is a workspace, not a database\n"
@@ -4674,17 +4697,17 @@ msgstr ""
 "'%s' ist ein Arbeitsverzeichnis, keine Datenbank\n"
 "(meinten Sie '%s'?)"
 
-#: src/database.cc:4838
+#: src/database.cc:4836
 #, c-format
 msgid "'%s' is a directory, not a database"
 msgstr "'%s' ist ein Verzeichnis, keine Datenbank"
 
-#: src/database.cc:4846
+#: src/database.cc:4844
 #, c-format
 msgid "database '%s' already exists"
 msgstr "Datenbank '%s' existiert bereits"
 
-#: src/database.cc:4851
+#: src/database.cc:4849
 #, c-format
 msgid ""
 "existing (possibly stale) journal file '%s' has same stem as new database "
@@ -4695,32 +4718,32 @@ msgstr ""
 "'%s'.\n"
 "Datenbankerstellung abgebrochen"
 
-#: src/database.cc:5013
+#: src/database.cc:5011
 #, c-format
 msgid "the database alias '%s' has multiple ambiguous expansions:"
 msgstr "der Datenbankalias '%s' kann auf mehrere Arten erweitert werden:"
 
-#: src/database.cc:5036
+#: src/database.cc:5034
 #, c-format
 msgid "could not query default database alias"
 msgstr "konnte nicht den Standarddatenbankalias abfragen"
 
-#: src/database.cc:5038
+#: src/database.cc:5036
 #, c-format
 msgid "using default database '%s'"
 msgstr "nutze Standarddatenbank '%s'"
 
-#: src/database.cc:5048
+#: src/database.cc:5046
 #, c-format
 msgid "invalid database alias '%s': does not start with a colon"
 msgstr "ungültiger Datenbankalias '%s': beginnt nicht mit einem Doppelpunkt"
 
-#: src/database.cc:5052
+#: src/database.cc:5050
 #, c-format
 msgid "invalid database alias '%s': must not be empty"
 msgstr "ungültiger Datenbankalias '%s': darf nicht leer sein"
 
-#: src/database.cc:5068
+#: src/database.cc:5066
 #, c-format
 msgid "invalid database alias '%s': does contain invalid characters"
 msgstr "ungültiger Datenbankalias '%s': beinhaltet ungültige Zeichen"
@@ -4794,7 +4817,7 @@ msgstr "kein Schlüsselpaar %s im Schlü
 msgid "no key pair %s found in key store '%s'"
 msgstr "kein Schlüsselpaar %s im Schlüsselbund '%s' gefunden"
 
-#: src/key_store.cc:620
+#: src/key_store.cc:633
 #, c-format
 msgid ""
 "failed to decrypt old private RSA key, probably incorrect passphrase or "
@@ -4803,48 +4826,48 @@ msgstr ""
 "konnte alten, privaten RSA-Schlüssel nicht entschlüsseln; Passwort ist "
 "womöglich falsch oder der 'get_passphrase'-Luahook fehlt"
 
-#: src/key_store.cc:633
+#: src/key_store.cc:646
 #, c-format
 msgid "failed to extract RSA private key from PKCS#8 keypair"
 msgstr ""
 "konnte privaten RSA-Schlüssel nicht vom PKCS#8-Schlüsselpaar extrahieren"
 
-#: src/key_store.cc:673
+#: src/key_store.cc:686
 #, c-format
 msgid "key '%s' already exists"
 msgstr "Schlüssel '%s' existiert bereits"
 
-#: src/key_store.cc:685
+#: src/key_store.cc:698
 #, c-format
 msgid "generating key-pair '%s'"
 msgstr "erzeuge Schlüsselpaar '%s'"
 
-#: src/key_store.cc:733
+#: src/key_store.cc:746
 #, c-format
 msgid "storing key-pair %s in '%s/'"
 msgstr "speichere Schlüsselpaar %s in '%s/'"
 
-#: src/key_store.cc:746
+#: src/key_store.cc:759
 #, c-format
 msgid "storing public key %s in '%s'"
 msgstr "speichere öffentlichen Schlüssel %s in '%s'"
 
-#: src/key_store.cc:762
+#: src/key_store.cc:775
 #, c-format
 msgid "key '%s' has hash '%s'"
 msgstr "Der Schlüssel '%s' hat die Prüfsumme '%s'"
 
-#: src/key_store.cc:776
+#: src/key_store.cc:789
 #, c-format
 msgid "no key pair '%s' found in key store '%s'"
 msgstr "kein Schlüsselpaar '%s' in Schlüsselbund '%s' gefunden"
 
-#: src/key_store.cc:828
+#: src/key_store.cc:845
 #, c-format
 msgid "Botan error decrypting data: '%s'"
 msgstr "Botan-Fehler beim Entschlüsseln von Daten: '%s'"
 
-#: src/key_store.cc:851
+#: src/key_store.cc:868
 #, c-format
 msgid ""
 "you have chosen to sign only with ssh-agent but ssh-agent does not seem to "
@@ -4853,12 +4876,12 @@ msgstr ""
 "Sie haben ausgewählt, nur mit ssh-agent zu signieren, aber derzeit scheint "
 "ssh-agent nicht zu laufen"
 
-#: src/key_store.cc:881
+#: src/key_store.cc:898
 #, c-format
 msgid "you don't seem to have your monotone key imported "
 msgstr "anscheinend haben Sie Ihren monotone-Schlüssel nicht importiert"
 
-#: src/key_store.cc:935
+#: src/key_store.cc:952
 #, c-format
 msgid ""
 "make_signature: ssh signature (%i) != monotone signature (%i)\n"
@@ -4869,24 +4892,24 @@ msgstr ""
 "ssh-Signatur     : %s\n"
 "monotone-Signatur: %s"
 
-#: src/key_store.cc:951
+#: src/key_store.cc:968
 #, c-format
 msgid "make_signature: signature is not valid"
 msgstr "make_signature: Signatur ist ungültig"
 
-#: src/key_store.cc:963
+#: src/key_store.cc:980
 #, c-format
 msgid "no ssh-agent is available, cannot add key %s"
 msgstr "es ist kein ssh-agent verfügbar; kann Schlüssel %s nicht hinzufügen"
 
-#: src/key_store.cc:1060
+#: src/key_store.cc:1087
 #, c-format
 msgid "failed to decrypt old private RSA key, probably incorrect passphrase"
 msgstr ""
 "konnte alten, privaten RSA-Schlüssel nicht entschlüsseln; Passwort ist "
 "womöglich falsch"
 
-#: src/key_store.cc:1097
+#: src/key_store.cc:1124
 #, c-format
 msgid "public and private keys for %s do not match"
 msgstr "öffentlicher und privater Schlüssel für %s stimmen nicht überein"
@@ -5030,22 +5053,22 @@ msgstr ""
 msgstr ""
 "falsch gebildetes Paket: ungültige öffentliche Schlüsseldaten für '%s': %s"
 
-#: src/packet.cc:187
+#: src/packet.cc:189
 #, c-format
 msgid "malformed packet: invalid private key data for '%s': %s"
 msgstr "falsch gebildetes Paket: ungültige private Schlüsseldaten für '%s': %s"
 
-#: src/packet.cc:199
+#: src/packet.cc:205
 #, c-format
 msgid "malformed packet: invalid cert name"
 msgstr "falsch gebildetes Paket: ungültiger Zertifikatsname"
 
-#: src/packet.cc:206
+#: src/packet.cc:212
 #, c-format
 msgid "malformed packet: too many arguments in header"
 msgstr "falsch gebildetes Paket: zu viele Argumente im Kopf"
 
-#: src/packet.cc:335
+#: src/packet.cc:341
 #, c-format
 msgid "unknown packet type '%s'"
 msgstr "unbekannter Pakettyp '%s'"
@@ -5416,7 +5439,7 @@ msgstr "Server ist zu alt für entfernte
 
 #: src/network/automate_session.cc:130
 #, c-format
-msgid "Sorry, you aren't allowed to do that."
+msgid "sorry, you aren't allowed to do that."
 msgstr "Entschuldigung, Sie dürfen dies nicht tun."
 
 #: src/network/automate_session.cc:219
@@ -5628,7 +5651,8 @@ msgstr ""
 "keys with this name and we don't know which one it is"
 msgstr ""
 "entferne eingehendes Zertifkat, welches von einem Schlüssel unterschrieben\n"
-"wurden, den wir nicht haben.  Sie müssen wahrscheinlich diesen Schlüssel von\n"
+"wurden, den wir nicht haben.  Sie müssen wahrscheinlich diesen Schlüssel "
+"von\n"
 "einem neueren netsync-Peer holen.  Der Name des Schlüssels ist '%s', aber\n"
 "beachten Sie, dass es mehrere Schlüssel mit diesem Namen gibt und wir nicht\n"
 "wissen, welcher das ist"
@@ -5715,7 +5739,7 @@ msgstr "Schlüssel"
 
 #: src/network/netsync_session.cc:1467
 #, c-format
-msgid "Cannot find key '%s'"
+msgid "cannot find key '%s'"
 msgstr "Kann Schlüssel '%s' nicht finden"
 
 #: src/network/reactor.cc:182
@@ -5846,7 +5870,7 @@ msgstr "Peer %s E/A im 'confirmed state'
 
 #: src/network/session_base.cc:256
 #, c-format
-msgid "Network error on peer %s, disconnecting"
+msgid "network error on peer %s, disconnecting"
 msgstr "Netzwerk-Fehler an Peer %s, trenne Verbindung"
 
 #: src/netxx_pipe.cc:50 src/netxx_pipe.cc:189
@@ -6222,8 +6246,8 @@ msgstr ""
 "'%s' is both known and ignored; it will be shown as 'missing'. Check '.mtn-"
 "ignore'"
 msgstr ""
-"'%s' ist bekannt, wird aber gleichzeitig ignoriert und wird daher "
-"als 'fehlend' gekennzeichnet. Überpüfen Sie die Datei '.mtn-ignore'"
+"'%s' ist bekannt, wird aber gleichzeitig ignoriert und wird daher als "
+"'fehlend' gekennzeichnet. Überpüfen Sie die Datei '.mtn-ignore'"
 
 #: src/automate.cc:1020
 msgid "Prints a summary of files found in the workspace"
@@ -6845,39 +6869,39 @@ msgstr[1] "die '%s'-Funktion benötigt %
 msgstr[0] "die '%s'-Funktion benötigt %d Argument, nicht %d"
 msgstr[1] "die '%s'-Funktion benötigt %d Argumente, nicht %d"
 
-#: src/selectors.cc:619
+#: src/selectors.cc:632
 #, c-format
 msgid "unknown selection function '%s'"
 msgstr "unbekannte Selektorfunktion '%s'"
 
-#: src/selectors.cc:652
+#: src/selectors.cc:665
 #, c-format
 msgid "expanded selector '%s' -> '%s'"
 msgstr "expandiere Selektor '%s' -> '%s'"
 
-#: src/selectors.cc:691
+#: src/selectors.cc:704
 #, c-format
 msgid "unknown selector type: %c"
 msgstr "unbekannter Selektor-Typ: %c"
 
-#: src/selectors.cc:726
+#: src/selectors.cc:739
 #, c-format
 msgid "selector '%s' is invalid, it ends with the escape character '\\'"
 msgstr "Selektor '%s' ist ungültig, er endet mit dem Escapezeichen '\\'"
 
-#: src/selectors.cc:731
+#: src/selectors.cc:744
 #, c-format
 msgid "selector '%s' is invalid, it contains an unknown escape sequence '%s%s'"
 msgstr ""
 "Selektor '%s' ist ungültig, er beinhaltet eine unbekannte Escapesequenz '%s"
 "%s'"
 
-#: src/selectors.cc:770
+#: src/selectors.cc:783
 #, c-format
 msgid "selector '%s' is invalid, unmatched ')'"
 msgstr "Selektor '%s' ist ungültig, keine öffnende Klammer für ')'"
 
-#: src/selectors.cc:787
+#: src/selectors.cc:800
 #, c-format
 msgid ""
 "selector '%s' is invalid, function argument doesn't look like an arg-list"
@@ -6885,7 +6909,7 @@ msgstr ""
 "Selektor '%s' ist ungültig, Funktionsargument sieht nicht wie eine Liste von "
 "Argumenten aus"
 
-#: src/selectors.cc:798
+#: src/selectors.cc:811
 #, c-format
 msgid ""
 "selector '%s' is invalid, grouping parentheses contain something that "
@@ -6894,17 +6918,17 @@ msgstr ""
 "Selektor '%s' ist ungültig, gruppierende Klammern beinhalten etwas, das "
 "nicht wie ein Ausdruck aussieht"
 
-#: src/selectors.cc:809
+#: src/selectors.cc:822
 #, c-format
 msgid "selector '%s' is invalid, because it starts with a '/'"
 msgstr "Selektor '%s' ist ungültig, da er mit einem '/' beginnt"
 
-#: src/selectors.cc:813
+#: src/selectors.cc:826
 #, c-format
 msgid "selector '%s' is invalid, because it starts with a '|'"
 msgstr "Selektor '%s' ist ungültig, da er mit einem '|' beginnt"
 
-#: src/selectors.cc:838
+#: src/selectors.cc:851
 #, c-format
 msgid ""
 "selector '%s' is invalid, because there is a '%s' someplace it shouldn't be"
@@ -6912,7 +6936,7 @@ msgstr ""
 "Selektor '%s' ist ungültig, da sich ein '%s' an einer Stelle befindet, wo es "
 "nicht hingehört"
 
-#: src/selectors.cc:843 src/selectors.cc:846
+#: src/selectors.cc:856 src/selectors.cc:859
 #, c-format
 msgid ""
 "selector '%s' is invalid, don't mix '/' and '|' operators without parentheses"
@@ -6920,22 +6944,22 @@ msgstr ""
 "Selektor '%s' ist ungültig, Vermischung von '/'- und '|'-Operatoren ohne "
 "Klammern"
 
-#: src/selectors.cc:885
+#: src/selectors.cc:898
 #, c-format
 msgid "selector '%s' is invalid, it doesn't look like an expr"
 msgstr "Selektor '%s' ist ungültig,  sieht nicht nach einem Ausdruck aus"
 
-#: src/selectors.cc:908
+#: src/selectors.cc:921
 #, c-format
 msgid "expanding selection '%s'"
 msgstr "expandiere Auswahl '%s'"
 
-#: src/selectors.cc:912
+#: src/selectors.cc:925
 #, c-format
 msgid "no match for selection '%s'"
 msgstr "kein Treffer für Auswahl '%s'"
 
-#: src/selectors.cc:917
+#: src/selectors.cc:930
 #, c-format
 msgid "expanded to '%s'"
 msgstr "erweitert zu '%s'"
@@ -7493,7 +7517,7 @@ msgstr "kann Host-Bestandteil der URI '%
 
 #: src/uri.cc:150 src/uri.cc:153 src/uri.cc:175 src/uri.cc:196
 #, c-format
-msgid "Bad URLencoded string '%s'"
+msgid "bad URLencoded string '%s'"
 msgstr "Falsch URL-kodierte Zeichenfolge '%s'"
 
 #: src/sha1.cc:34
@@ -7505,54 +7529,54 @@ msgstr "Bewerte Botans SHA-1-Kern"
 msgid "Benchmarking botan's SHA-1 core"
 msgstr "Bewerte Botans SHA-1-Kern"
 
-#: src/sha1.cc:61
+#: src/sha1.cc:64
 #, c-format
 msgid "SHA-1 provider '%s': %s MiB/s"
 msgstr "SHA-1 Anbieter '%s': %s MiB/s"
 
-#: src/sha1.cc:73
+#: src/sha1.cc:76
 #, c-format
 msgid "%s MiB/s"
 msgstr "%s MiB/s"
 
-#: src/pcrewrap.cc:219
+#: src/pcrewrap.cc:273
 #, c-format
 msgid "while compiling regex '%s': %s"
 msgstr "Fehler während der Übersetzung des regulären Ausdrucks '%s': %s"
 
-#: src/pcrewrap.cc:228
+#: src/pcrewrap.cc:282
 #, c-format
 msgid "error in regex '%s': %s"
 msgstr "Fehler im regulären Ausdruck '%s': %s"
 
-#: src/pcrewrap.cc:230
+#: src/pcrewrap.cc:284
 #, c-format
 msgid "error near char %d of regex '%s': %s"
 msgstr "Fehler in der Nähe des Zeichens %d des regulären Ausdrucks '%s': %s"
 
-#: src/pcrewrap.cc:245
+#: src/pcrewrap.cc:299
 #, c-format
 msgid "while studying regex '%s': %s"
 msgstr "Fehler während der Untersuchung des regulären Ausdrucks '%s': %s"
 
-#: src/pcrewrap.cc:263
+#: src/pcrewrap.cc:317
 #, c-format
 msgid "backtrack limit exceeded in regular _expression_ matching"
 msgstr "Backtrack-Grenze im regulären Ausdruck überschritten"
 
-#: src/pcrewrap.cc:267
+#: src/pcrewrap.cc:321
 #, c-format
 msgid "recursion limit exceeded in regular _expression_ matching"
 msgstr "Rekursions-Grenze im regulären Ausdruck überschritten"
 
-#: src/pcrewrap.cc:272
+#: src/pcrewrap.cc:326
 #, c-format
 msgid "invalid UTF-8 sequence found during regular _expression_ matching"
 msgstr ""
 "ungültige UTF-8-Sequenz während der Anwendung des regulären Ausdrucks "
 "gefunden"
 
-#: src/pcrewrap.cc:275
+#: src/pcrewrap.cc:329
 #, c-format
 msgid "pcre_exec returned %d"
 msgstr "pcre_exec gab %d zurück"
@@ -7569,30 +7593,34 @@ msgstr "Marke:      "
 msgid "Tag:      "
 msgstr "Marke:      "
 
-#: src/rev_output.cc:106
+#: src/rev_output.cc:110
+msgid "Other certs:"
+msgstr "Andere Zertifikate:"
+
+#: src/rev_output.cc:123
 msgid "Changelog: "
 msgstr "Änderungen: "
 
-#: src/rev_output.cc:114
+#: src/rev_output.cc:131
 msgid "Comments: "
 msgstr "Kommentare: "
 
-#: src/rev_output.cc:141
+#: src/rev_output.cc:158
 msgid "Changes"
 msgstr "Änderungen"
 
-#: src/rev_output.cc:143
+#: src/rev_output.cc:160
 msgid "Changes against parent "
 msgstr "Veränderungen ggü. Elternrev. "
 
-#: src/rev_output.cc:151
+#: src/rev_output.cc:168
 #, c-format
 msgid "  dropped  %s"
 msgstr ""
 "       Pfad  %s\n"
 "   entfernt"
 
-#: src/rev_output.cc:156
+#: src/rev_output.cc:173
 #, c-format
 msgid ""
 "  renamed  %s\n"
@@ -7602,21 +7630,21 @@ msgstr ""
 "       nach  %s\n"
 "  umbenannt"
 
-#: src/rev_output.cc:161 src/rev_output.cc:165
+#: src/rev_output.cc:178 src/rev_output.cc:182
 #, c-format
 msgid "  added    %s"
 msgstr ""
 "       Pfad  %s\n"
 "hinzugefügt"
 
-#: src/rev_output.cc:169
+#: src/rev_output.cc:186
 #, c-format
 msgid "  patched  %s"
 msgstr ""
 "      Datei  %s\n"
 "  verändert"
 
-#: src/rev_output.cc:173
+#: src/rev_output.cc:190
 #, c-format
 msgid ""
 "  attr on  %s\n"
@@ -7628,7 +7656,7 @@ msgstr ""
 "        auf  %1$s\n"
 "    gesetzt"
 
-#: src/rev_output.cc:186
+#: src/rev_output.cc:203
 #, c-format
 msgid ""
 "  attr on  %s\n"
@@ -8566,43 +8594,65 @@ msgid "this monotone binary requires at 
 #: src/monotone.cc:143
 #, c-format
 msgid "this monotone binary requires at least SQLite 3.3.8 to run"
-msgstr "dieses monotone benötigt mindestens SQLite 3.3.8, um ausgeführt zu werden"
+msgstr ""
+"dieses monotone benötigt mindestens SQLite 3.3.8, um ausgeführt zu werden"
 
 #: src/monotone.cc:146
 #, c-format
 msgid "this monotone binary requires at least SQLite 3.3.14 to run"
-msgstr "dieses monotone benötigt mindestens SQLite 3.3.14, um ausgeführt zu werden"
+msgstr ""
+"dieses monotone benötigt mindestens SQLite 3.3.14, um ausgeführt zu werden"
 
 #: src/monotone.cc:157
 #, c-format
 msgid "monotone does not support Botan 1.7.14"
 msgstr "monotone unterstüzt Botan 1.7.14 nicht"
 
-#: src/monotone.cc:161
+#: src/monotone.cc:163
 #, c-format
+msgid "monotone does not support Botan 1.9.9"
+msgstr "monotone unterstüzt Botan 1.9.9 nicht"
+
+#: src/monotone.cc:168
+#, c-format
 msgid "this monotone binary requires Botan 1.6.3 or newer"
 msgstr "dieses monotone benötigt Botan 1.6.3 oder neuer"
 
-#: src/monotone.cc:163
+#: src/monotone.cc:170
 #, c-format
-msgid "this monotone binary does not work with Botan newer than 1.7.6"
-msgstr "dieses monotone arbeitet nicht mit Botan >1.7.6 zusammen"
+msgid "this monotone binary does not work with Botan 1.7.7 or newer"
+msgstr "dieses monotone arbeitet nicht mit Botan 1.7.7 oder neuer zusammen"
 
-#: src/monotone.cc:166
+#: src/monotone.cc:175
 #, c-format
 msgid "this monotone binary requires Botan 1.7.7 or newer"
 msgstr "dieses monotone benötigt Botan 1.7.7 oder neuer"
 
-#: src/monotone.cc:172 src/monotone.cc:177
+#: src/monotone.cc:182 src/monotone.cc:189
 #, c-format
-msgid "this monotone binary does not work with Botan 1.9.x"
-msgstr "dieses monotone arbeitet nicht mit Botan 1.9.x zusammen"
+msgid "this monotone binary does not work with Botan 1.9.4 or newer"
+msgstr "dieses monotone arbeitet nicht mit Botan 1.9.4 oder neuer zusammen"
 
-#: src/monotone.cc:175
+#: src/monotone.cc:187
 #, c-format
 msgid "this monotone binary requires Botan 1.7.22 or newer"
 msgstr "dieses monotone benötigt Botan 1.7.22 oder neuer"
 
+#: src/monotone.cc:195
+#, c-format
+msgid "this monotone binary requires Botan 1.9.4 or newer"
+msgstr "dieses monotone benötigt Botan 1.9.4 oder neuer"
+
+#: src/monotone.cc:197
+#, c-format
+msgid "this monotone binary does not work with Botan 1.9.11 or newer"
+msgstr "dieses monotone arbeitet nicht mit Botan 1.9.11 oder neuer zusammen"
+
+#: src/monotone.cc:202
+#, c-format
+msgid "this monotone binary requires Botan 1.9.11 or newer"
+msgstr "dieses monotone benötigt Botan 1.9.11 oder neuer"
+
 #: src/std_hooks.lua:56
 msgid "Press enter"
 msgstr "Drücken Sie die Eingabetaste"
@@ -8611,6 +8661,9 @@ msgstr "Drücken Sie die Eingabetaste, w
 msgid "Press enter when the subprocess has completed"
 msgstr "Drücken Sie die Eingabetaste, wenn der Unterprozess beendet ist"
 
+#~ msgid "this monotone binary does not work with Botan newer than 1.7.6"
+#~ msgstr "dieses monotone arbeitet nicht mit Botan >1.7.6 zusammen"
+
 #~ msgid "Network error: %s"
 #~ msgstr "Netzwerk-Fehler: %s"
 
============================================================
--- po/sv.po	f84b0093c5af0e103e0857bcf809fe78487e803b
+++ po/sv.po	fb60bb1b5c18bbb5c2025f33bed340b7647b7e3c
@@ -7,8 +7,8 @@ msgstr ""
 msgstr ""
 "Project-Id-Version: monotone\n"
 "Report-Msgid-Bugs-To: https://code.monotone.ca/p/monotone/issues/\n"
-"POT-Creation-Date: 2011-03-27 20:20+0200\n"
-"PO-Revision-Date: 2011-03-27 20:22+0200\n"
+"POT-Creation-Date: 2012-04-25 21:48+0200\n"
+"PO-Revision-Date: 2012-04-25 22:02+0200\n"
 "Last-Translator: tommyd <address@hidden>\n"
 "Language-Team: Richard Levitte <address@hidden>\n"
 "Language: sv\n"
@@ -55,7 +55,7 @@ msgstr "storleken för den hexadecimalt 
 msgid "hex encoded ID '%s' size != %d"
 msgstr "storleken för den hexadecimalt kodade identiteten '%s' != %d"
 
-#: src/vocab.cc:53 src/database.cc:4231
+#: src/vocab.cc:53 src/database.cc:4229
 #, c-format
 msgid "bad character '%c' in id name '%s'"
 msgstr "otillåtet tecken '%c' i identitetsnamnet '%s'"
@@ -856,8 +856,8 @@ msgstr "Kör KOMMANDO på servern i andr
 #: src/cmd_netsync.cc:221 src/cmd_list.cc:1021 src/cmd_packet.cc:73
 #: src/cmd_packet.cc:134 src/cmd_packet.cc:254 src/cmd_key_cert.cc:81
 #: src/cmd_key_cert.cc:186 src/cmd_merging.cc:384 src/cmd_merging.cc:1141
-#: src/cmd_merging.cc:1219 src/cmd_ws_commit.cc:1134 src/cmd_ws_commit.cc:1342
-#: src/cmd_ws_commit.cc:1456 src/cmd_ws_commit.cc:1478 src/cmd_automate.cc:138
+#: src/cmd_merging.cc:1219 src/cmd_ws_commit.cc:1136 src/cmd_ws_commit.cc:1342
+#: src/cmd_ws_commit.cc:1484 src/cmd_ws_commit.cc:1506 src/cmd_automate.cc:138
 #: src/cmd_files.cc:239 src/cmd_files.cc:336 src/cmd_files.cc:360
 #: src/cmd_files.cc:394 src/automate.cc:85 src/automate.cc:122
 #: src/automate.cc:175 src/automate.cc:298 src/automate.cc:400
@@ -993,18 +993,18 @@ msgstr "kloningens tilltänkta katalog '
 msgid "clone destination directory '%s' already exists"
 msgstr "kloningens tilltänkta katalog '%s' finns redan"
 
-#: src/cmd_netsync.cc:832 src/cmd_ws_commit.cc:1842 src/cmd_ws_commit.cc:1931
+#: src/cmd_netsync.cc:832 src/cmd_ws_commit.cc:1870 src/cmd_ws_commit.cc:1959
 #, c-format
 msgid "bookkeeping directory already exists in '%s'"
 msgstr "det finns redan en administrativ katalog i '%s'"
 
 #: src/cmd_netsync.cc:866 src/cmd_merging.cc:535 src/cmd_merging.cc:636
-#: src/cmd_merging.cc:641 src/cmd_merging.cc:1471 src/cmd_ws_commit.cc:1030
+#: src/cmd_merging.cc:641 src/cmd_merging.cc:1471 src/cmd_ws_commit.cc:1032
 #, c-format
 msgid "branch '%s' is empty"
 msgstr "grenen '%s' är tom"
 
-#: src/cmd_netsync.cc:869 src/cmd_ws_commit.cc:1033 src/cmd_ws_commit.cc:1910
+#: src/cmd_netsync.cc:869 src/cmd_ws_commit.cc:1035 src/cmd_ws_commit.cc:1938
 #, c-format
 msgid "branch '%s' has multiple heads:"
 msgstr "grenen '%s' har flera löv:"
@@ -1014,12 +1014,12 @@ msgstr "välj ett med '%s clone -r<id> U
 msgid "choose one with '%s clone -r<id> URI'"
 msgstr "välj ett med '%s clone -r<id> URI'"
 
-#: src/cmd_netsync.cc:874 src/cmd_ws_commit.cc:1039 src/cmd_ws_commit.cc:1916
+#: src/cmd_netsync.cc:874 src/cmd_ws_commit.cc:1041 src/cmd_ws_commit.cc:1944
 #, c-format
 msgid "branch '%s' has multiple heads"
 msgstr "grenen '%s' har flera löv"
 
-#: src/cmd_netsync.cc:885 src/cmd_ws_commit.cc:1896
+#: src/cmd_netsync.cc:885 src/cmd_ws_commit.cc:1924
 #, c-format
 msgid "revision %s is not a member of branch '%s'"
 msgstr "revisionen %s är inte med i grenen '%s'"
@@ -1184,12 +1184,12 @@ msgstr "Visa vilka databaser som hantera
 msgid "Lists managed databases and their known workspaces"
 msgstr "Visa vilka databaser som hanteras och deras kända arbetskopior"
 
-#: src/cmd_list.cc:684 src/database.cc:4978
+#: src/cmd_list.cc:684 src/database.cc:4976
 #, c-format
 msgid "no default database location configured"
 msgstr "ingen standardkatalog för databaser finns definierad"
 
-#: src/cmd_list.cc:688 src/database.cc:5056
+#: src/cmd_list.cc:688 src/database.cc:5054
 #, c-format
 msgid "could not query default database glob"
 msgstr "kunde inte fråga efter standardglobben för databaser"
@@ -1531,8 +1531,8 @@ msgstr ""
 "Nästa ändring hamnar i grenen '%s'"
 
 #: src/cmd_merging.cc:209 src/cmd_merging.cc:824 src/cmd_ws_commit.cc:370
-#: src/cmd_ws_commit.cc:1358 src/cmd_ws_commit.cc:2042
-#: src/cmd_ws_commit.cc:2270 src/cmd_ws_commit.cc:2385 src/cmd_files.cc:308
+#: src/cmd_ws_commit.cc:1362 src/cmd_ws_commit.cc:2070
+#: src/cmd_ws_commit.cc:2298 src/cmd_ws_commit.cc:2413 src/cmd_files.cc:308
 #: src/cmd_files.cc:406 src/automate.cc:1035 src/automate.cc:1328
 #, c-format
 msgid "this command can only be used in a single-parent workspace"
@@ -2387,21 +2387,21 @@ msgstr ""
 "denna arbetskopia har mer än en förälder\n"
 "(ange en revision att se skillnader emot med '--revision')"
 
-#: src/cmd_diff_log.cc:407 src/rev_output.cc:147
+#: src/cmd_diff_log.cc:410 src/rev_output.cc:147
 msgid "no changes"
 msgstr "inga ändringar"
 
-#: src/cmd_diff_log.cc:416 src/cmd_ws_commit.cc:538 src/cmd_ws_commit.cc:776
-#: src/cmd_ws_commit.cc:818 src/cmd_ws_commit.cc:890 src/cmd_ws_commit.cc:1808
+#: src/cmd_diff_log.cc:419 src/cmd_ws_commit.cc:538 src/cmd_ws_commit.cc:778
+#: src/cmd_ws_commit.cc:820 src/cmd_ws_commit.cc:892 src/cmd_ws_commit.cc:1836
 #: src/automate.cc:1019
 msgid "[PATH]..."
 msgstr "[SÖKVÄG]..."
 
-#: src/cmd_diff_log.cc:417
+#: src/cmd_diff_log.cc:420
 msgid "Shows current differences"
 msgstr "Visa nuvarande skillnader"
 
-#: src/cmd_diff_log.cc:418
+#: src/cmd_diff_log.cc:421
 msgid ""
 "Compares the current tree with the files in the repository and prints the "
 "differences on the standard output.\n"
@@ -2415,7 +2415,7 @@ msgstr ""
 "revisionen. Om två revisioner anges visas skillnaden mellan dem. Om\n"
 "inget format anges används unified."
 
-#: src/cmd_diff_log.cc:429
+#: src/cmd_diff_log.cc:432
 #, c-format
 msgid ""
 "'--diff-args' requires '--external'; try adding '--external' or remove '--"
@@ -2424,50 +2424,50 @@ msgstr ""
 "'--diff-args' kräver att även '--external' anges; lägg till '--external' "
 "eller ta bort '--diff-args'"
 
-#: src/cmd_diff_log.cc:462
+#: src/cmd_diff_log.cc:465
 msgid "[FILE [...]]"
 msgstr "[FIL [...]]"
 
-#: src/cmd_diff_log.cc:463
+#: src/cmd_diff_log.cc:466
 msgid "Calculates diffs of files"
 msgstr "Räknar ut skillnaden mellan filerna"
 
-#: src/cmd_diff_log.cc:643
+#: src/cmd_diff_log.cc:646
 #, c-format
 msgid "only one of '--last'/'--next' allowed"
 msgstr "enbart en av '--last' eller '--next' tillåten"
 
-#: src/cmd_diff_log.cc:660
+#: src/cmd_diff_log.cc:663
 #, c-format
 msgid "try passing a '--from' revision to start at"
 msgstr "prova att ange en revision att börja med med hjälpa av '--from'"
 
-#: src/cmd_diff_log.cc:669
+#: src/cmd_diff_log.cc:672
 #, c-format
 msgid "workspace has no parent revision, probably an empty branch"
 msgstr ""
 "arbetskopian har ingen föräldrarevision, det här är antagligen en tom gren"
 
-#: src/cmd_diff_log.cc:672
+#: src/cmd_diff_log.cc:675
 #, c-format
 msgid ""
 "workspace parent revision %s not found - did you specify a wrong database?"
 msgstr "föräldrarevisionen %s finns inte - angav du fel databas?"
 
-#: src/cmd_diff_log.cc:958
+#: src/cmd_diff_log.cc:961
 #, c-format
 msgid "(Revision: %s)"
 msgstr "(Revision: %s)"
 
-#: src/cmd_diff_log.cc:980 src/cmd_diff_log.cc:994
+#: src/cmd_diff_log.cc:983 src/cmd_diff_log.cc:997
 msgid "[PATH] ..."
 msgstr "[SÖKVÄG] ..."
 
-#: src/cmd_diff_log.cc:981
+#: src/cmd_diff_log.cc:984
 msgid "Prints selected history in forward or reverse order"
 msgstr "Skriver ut vald historia i framlänges eller baklänges ordning"
 
-#: src/cmd_diff_log.cc:982
+#: src/cmd_diff_log.cc:985
 msgid ""
 "This command prints selected history in forward or reverse order, filtering "
 "it by PATH if given."
@@ -2475,7 +2475,7 @@ msgstr ""
 "Skriv ut historiken i framlänges eller baklänges ordning, med filtrering om "
 "SÖKVÄG är angiven."
 
-#: src/cmd_diff_log.cc:995
+#: src/cmd_diff_log.cc:998
 msgid "Lists the selected revision history"
 msgstr "Visa vald revisionshistoria"
 
@@ -2528,19 +2528,19 @@ msgstr "datumformatet '%s' kan inte tolk
 msgid "date format '%s' cannot be parsed; using default instead"
 msgstr "datumformatet '%s' kan inte tolkas; använder standardformat istället"
 
-#: src/cmd_ws_commit.cc:237 src/cmd_ws_commit.cc:985
+#: src/cmd_ws_commit.cc:237 src/cmd_ws_commit.cc:987
 msgid "*** THIS REVISION WILL CREATE A NEW BRANCH ***"
 msgstr "*** DENNA REVISION KOMMER ATT SKAPA EN NY GREN ***"
 
-#: src/cmd_ws_commit.cc:240 src/cmd_ws_commit.cc:988
+#: src/cmd_ws_commit.cc:240 src/cmd_ws_commit.cc:990
 msgid "Old Branch: "
 msgstr "Gammal gren: "
 
-#: src/cmd_ws_commit.cc:241 src/cmd_ws_commit.cc:989
+#: src/cmd_ws_commit.cc:241 src/cmd_ws_commit.cc:991
 msgid "New Branch: "
 msgstr "Ny gren: "
 
-#: src/cmd_ws_commit.cc:252 src/cmd_ws_commit.cc:1000
+#: src/cmd_ws_commit.cc:252 src/cmd_ws_commit.cc:1002
 msgid "*** THIS REVISION WILL CREATE DIVERGENCE ***"
 msgstr "*** DENNA REVISION KOMMER ATT SKAPA EN DIVERGENS ***"
 
@@ -2675,8 +2675,13 @@ msgstr ""
 "flera revisioner har gemensam historia, men %s är inte förfader till %s, kan "
 "inte invertera"
 
-#: src/cmd_ws_commit.cc:702 src/cmd_ws_commit.cc:1771
+#: src/cmd_ws_commit.cc:674
 #, c-format
+msgid "cannot disapprove root revision"
+msgstr "kan inte underkänna en rotrevision"
+
+#: src/cmd_ws_commit.cc:704 src/cmd_ws_commit.cc:1799
+#, c-format
 msgid ""
 "note: this revision creates divergence\n"
 "note: you may (or may not) wish to run '%s merge'"
@@ -2684,33 +2689,33 @@ msgstr ""
 "obs: den här revisionen skapade divergens\n"
 "obs: du kan tänkas vilja (eller kanske inte) köra '%s merge'"
 
-#: src/cmd_ws_commit.cc:709
+#: src/cmd_ws_commit.cc:711
 msgid "[DIRECTORY...]"
 msgstr "[KATALOG...]"
 
-#: src/cmd_ws_commit.cc:710
+#: src/cmd_ws_commit.cc:712
 msgid "Creates directories and adds them to the workspace"
 msgstr "Skapar en eller flera kataloger och lägger till dem i arbetskopian"
 
-#: src/cmd_ws_commit.cc:728
+#: src/cmd_ws_commit.cc:730
 #, c-format
 msgid "directory '%s' already exists"
 msgstr "katalogen '%s' finns redan"
 
-#: src/cmd_ws_commit.cc:735
+#: src/cmd_ws_commit.cc:737
 #, c-format
 msgid "ignoring directory '%s' (see '.mtn-ignore')"
 msgstr "ignorerar katalogen '%s' (se '.mtn-ignore')"
 
-#: src/cmd_ws_commit.cc:777
+#: src/cmd_ws_commit.cc:779
 msgid "Adds files to the workspace"
 msgstr "Lägger till filer i arbetskopian"
 
-#: src/cmd_ws_commit.cc:819
+#: src/cmd_ws_commit.cc:821
 msgid "Drops files from the workspace"
 msgstr "Överger filer i arbetskopian"
 
-#: src/cmd_ws_commit.cc:834
+#: src/cmd_ws_commit.cc:836
 msgid ""
 "SRC DEST\n"
 "SRC1 [SRC2 [...]] DEST_DIR"
@@ -2718,24 +2723,24 @@ msgstr ""
 "KÄLLA MÅL\n"
 "KÄLLA1 [KÄLLA2 [...]] MÅLKATALOG"
 
-#: src/cmd_ws_commit.cc:836
+#: src/cmd_ws_commit.cc:838
 msgid "Renames entries in the workspace"
 msgstr "Byter namn på filer i arbetskopian"
 
-#: src/cmd_ws_commit.cc:862
+#: src/cmd_ws_commit.cc:864
 #, c-format
 msgid "the specified target directory '%s/' doesn't exist."
 msgstr "den angivna målkatalogen '%s/' finns inte."
 
-#: src/cmd_ws_commit.cc:868
+#: src/cmd_ws_commit.cc:870
 msgid "NEW_ROOT PUT_OLD"
 msgstr "NY_ROT PLACERA_GAMLA"
 
-#: src/cmd_ws_commit.cc:869
+#: src/cmd_ws_commit.cc:871
 msgid "Renames the root directory"
 msgstr "Byter namn på rotkatalogen"
 
-#: src/cmd_ws_commit.cc:870
+#: src/cmd_ws_commit.cc:872
 msgid ""
 "After this command, the directory that currently has the name NEW_ROOT will "
 "be the root directory, and the directory that is currently the root "
@@ -2747,51 +2752,51 @@ msgstr ""
 "PLACERA_GAMLA.\n"
 "Det är INTE rekommenderat att använda '--bookkeep-only'."
 
-#: src/cmd_ws_commit.cc:891
+#: src/cmd_ws_commit.cc:893
 msgid "Shows workspace's status information"
 msgstr "Visar statusinformation för arbetskopian"
 
-#: src/cmd_ws_commit.cc:929
+#: src/cmd_ws_commit.cc:931
 #, c-format
 msgid "bisection from revision %s in progress"
 msgstr "uppdelning från revision %s pågår"
 
-#: src/cmd_ws_commit.cc:1024
+#: src/cmd_ws_commit.cc:1026
 #, c-format
 msgid "use '--revision' or '--branch' to specify what to checkout"
 msgstr ""
 "använd '--revision' eller '--branch' för att tala om vad som ska hämtas"
 
-#: src/cmd_ws_commit.cc:1037
+#: src/cmd_ws_commit.cc:1039
 #, c-format
 msgid "choose one with '%s checkout -r<id>'"
 msgstr "välj ett med '%s update -r<id>'"
 
-#: src/cmd_ws_commit.cc:1054
+#: src/cmd_ws_commit.cc:1056
 #, c-format
 msgid "revision %s is not a member of branch %s"
 msgstr "revisionen %s är inte med i grenen %s"
 
-#: src/cmd_ws_commit.cc:1071
+#: src/cmd_ws_commit.cc:1073
 #, c-format
 msgid "you must specify a destination directory"
 msgstr "du måste ange en målkatalog"
 
-#: src/cmd_ws_commit.cc:1084
+#: src/cmd_ws_commit.cc:1086
 #, c-format
 msgid "checkout directory '%s' already exists"
 msgstr "katalogen '%s' finns redan"
 
-#: src/cmd_ws_commit.cc:1111 src/cmd_ws_commit.cc:1125
-#: src/cmd_ws_commit.cc:1821 src/cmd_ws_commit.cc:1978
+#: src/cmd_ws_commit.cc:1113 src/cmd_ws_commit.cc:1127
+#: src/cmd_ws_commit.cc:1849 src/cmd_ws_commit.cc:2006
 msgid "[DIRECTORY]"
 msgstr "[KATALOG]"
 
-#: src/cmd_ws_commit.cc:1112 src/cmd_ws_commit.cc:1126
+#: src/cmd_ws_commit.cc:1114 src/cmd_ws_commit.cc:1128
 msgid "Checks out a revision from the database into a directory"
 msgstr "Hämtar en revision från databasen till en katalog"
 
-#: src/cmd_ws_commit.cc:1113 src/cmd_ws_commit.cc:1127
+#: src/cmd_ws_commit.cc:1115 src/cmd_ws_commit.cc:1129
 msgid ""
 "If a revision is given, that's the one that will be checked out.  Otherwise, "
 "it will be the head of the branch (given or implicit).  If no directory is "
@@ -2801,39 +2806,39 @@ msgstr ""
 "lövet i grenen (implicit eller angiven) att hämtas. Om ingen katalog anges "
 "kommer grenens namn att användas som katalognamn."
 
-#: src/cmd_ws_commit.cc:1137
+#: src/cmd_ws_commit.cc:1139
 #, c-format
 msgid "wrong revision count"
 msgstr "felaktigt antal revisioner"
 
-#: src/cmd_ws_commit.cc:1143
+#: src/cmd_ws_commit.cc:1145
 msgid "Manages file attributes"
 msgstr "Hanterar filattribut"
 
-#: src/cmd_ws_commit.cc:1144
+#: src/cmd_ws_commit.cc:1146
 msgid "This command is used to set, get or drop file attributes."
 msgstr "Detta kommando används för att sätta, hämta eller ta bort attribut"
 
-#: src/cmd_ws_commit.cc:1163 src/cmd_ws_commit.cc:1231
-#: src/cmd_ws_commit.cc:1281 src/cmd_ws_commit.cc:1362
+#: src/cmd_ws_commit.cc:1165 src/cmd_ws_commit.cc:1233
+#: src/cmd_ws_commit.cc:1283 src/cmd_ws_commit.cc:1366
 #, c-format
 msgid "unknown path '%s'"
 msgstr "okänd sökväg '%s'"
 
-#: src/cmd_ws_commit.cc:1180
+#: src/cmd_ws_commit.cc:1182
 #, c-format
 msgid "path '%s' does not have attribute '%s'"
 msgstr "sökvägen '%s' har inget attribut '%s'"
 
-#: src/cmd_ws_commit.cc:1199 src/cmd_ws_commit.cc:1212
+#: src/cmd_ws_commit.cc:1201 src/cmd_ws_commit.cc:1214
 msgid "PATH [ATTR]"
 msgstr "SÖKVÄG [ATTR]"
 
-#: src/cmd_ws_commit.cc:1200
+#: src/cmd_ws_commit.cc:1202
 msgid "Removes attributes from a file"
 msgstr "Tar bort attribut från en fil"
 
-#: src/cmd_ws_commit.cc:1201
+#: src/cmd_ws_commit.cc:1203
 msgid ""
 "If no attribute is specified, this command removes all attributes attached "
 "to the file given in PATH.  Otherwise only removes the attribute specified "
@@ -2842,11 +2847,11 @@ msgstr ""
 "Detta kommando tar bort alla attribut kopplade till filen SÖKVÄG om NYCKEL "
 "inte är givet.  Om NYCKEL är givet tas enbart detta attribut bort."
 
-#: src/cmd_ws_commit.cc:1213
+#: src/cmd_ws_commit.cc:1215
 msgid "Gets the values of a file's attributes"
 msgstr "Hämta värdet för ett filattribut"
 
-#: src/cmd_ws_commit.cc:1214
+#: src/cmd_ws_commit.cc:1216
 msgid ""
 "If no attribute is specified, this command prints all attributes attached to "
 "the file given in PATH.  Otherwise it only prints the attribute specified in "
@@ -2855,60 +2860,76 @@ msgstr ""
 "Detta kommando skriver ut alla attribut kopplade till filen SÖKVÄG om NYCKEL "
 "inte är givet.  Om NYCKEL är givet skrivs enbart detta attribut ut."
 
-#: src/cmd_ws_commit.cc:1247
+#: src/cmd_ws_commit.cc:1249
 #, c-format
 msgid "no attributes for '%s'"
 msgstr "inga attribut till '%s'"
 
-#: src/cmd_ws_commit.cc:1259
+#: src/cmd_ws_commit.cc:1261
 #, c-format
 msgid "no attribute '%s' on path '%s'"
 msgstr "inget attribut '%s' för sökvägen '%s'"
 
-#: src/cmd_ws_commit.cc:1305
+#: src/cmd_ws_commit.cc:1307
 msgid "PATH ATTR VALUE"
 msgstr "SÖKVÄG ATTR VÄRDE"
 
-#: src/cmd_ws_commit.cc:1306
+#: src/cmd_ws_commit.cc:1308
 msgid "Sets an attribute on a file"
 msgstr "Sätt ett attribut på en fil"
 
-#: src/cmd_ws_commit.cc:1307
+#: src/cmd_ws_commit.cc:1309
 msgid ""
 "Sets the attribute given on ATTR to the value specified in VALUE for the "
 "file mentioned in PATH."
 msgstr "Sätt attributet NYCKEL med värde VÄRDE på filen SÖKVÄG."
 
-#: src/cmd_ws_commit.cc:1336 src/cmd_files.cc:138 src/cmd_files.cc:233
+#: src/cmd_ws_commit.cc:1335 src/cmd_files.cc:138 src/cmd_files.cc:233
 msgid "PATH"
 msgstr "SÖKVÄG"
 
-#: src/cmd_ws_commit.cc:1337
+#: src/cmd_ws_commit.cc:1336
 msgid "Prints all attributes for the specified path"
 msgstr "Skriver ut alla attribut för den givna sökvägen"
 
-#: src/cmd_ws_commit.cc:1450
+#: src/cmd_ws_commit.cc:1337
+msgid ""
+"If an explicit revision is given, the file's attributes at this specific "
+"revision are returned."
+msgstr "Om en revision anges explicit får man filens attribut i den revisionen specifikt."
+
+#: src/cmd_ws_commit.cc:1378
+#, c-format
+msgid "unknown path '%s' in %s"
+msgstr "okänd sökväg '%s' i %s"
+
+#: src/cmd_ws_commit.cc:1381
+#, c-format
+msgid "none or only one revision must be given"
+msgstr "ingen eller enbart en revision får anges"
+
+#: src/cmd_ws_commit.cc:1478
 msgid "PATH KEY VALUE"
 msgstr "SÖKVÄG NYCKEL VÄRDE"
 
-#: src/cmd_ws_commit.cc:1451
+#: src/cmd_ws_commit.cc:1479
 msgid "Sets an attribute on a certain path"
 msgstr "Sätt ett attribut på en given sökväg"
 
-#: src/cmd_ws_commit.cc:1472
+#: src/cmd_ws_commit.cc:1500
 msgid "PATH [KEY]"
 msgstr "SÖKVÄG [NYCKEL]"
 
-#: src/cmd_ws_commit.cc:1473
+#: src/cmd_ws_commit.cc:1501
 msgid "Drops an attribute or all of them from a certain path"
 msgstr "Kata ett eller alla attribut för en given sökväg"
 
-#: src/cmd_ws_commit.cc:1513
+#: src/cmd_ws_commit.cc:1541
 #, c-format
 msgid "no changes to commit"
 msgstr "inga ändringar att arkivera"
 
-#: src/cmd_ws_commit.cc:1534
+#: src/cmd_ws_commit.cc:1562
 #, c-format
 msgid ""
 "parent revisions of this commit are in different branches:\n"
@@ -2919,12 +2940,12 @@ msgstr ""
 "'%s' och '%s'.\n"
 "var god ange en gren för denna arkivering med '--branch'."
 
-#: src/cmd_ws_commit.cc:1556
+#: src/cmd_ws_commit.cc:1584
 #, c-format
 msgid "changes rejected by hook: %s"
 msgstr "ändringar förkastade av hook: %s"
 
-#: src/cmd_ws_commit.cc:1570
+#: src/cmd_ws_commit.cc:1598
 #, c-format
 msgid ""
 "'_MTN/log' is non-empty and log message was specified on command line.\n"
@@ -2935,72 +2956,72 @@ msgstr ""
 "Kanske ta bort eller flytta på '_MTN/log'\n"
 "eller ta bort '--message'/'--message-file' från kommandoraden?"
 
-#: src/cmd_ws_commit.cc:1615
+#: src/cmd_ws_commit.cc:1643
 #, c-format
 msgid "empty log message; commit canceled"
 msgstr "tomt loggmeddelande; arkivering avbryts"
 
-#: src/cmd_ws_commit.cc:1635
+#: src/cmd_ws_commit.cc:1663
 #, c-format
 msgid "log message rejected by hook: %s"
 msgstr "loggmeddelandet förkastas: %s"
 
-#: src/cmd_ws_commit.cc:1645
+#: src/cmd_ws_commit.cc:1673
 #, c-format
 msgid "beginning commit on branch '%s'"
 msgstr "börjar arkivering av ändringar i grenen '%s'"
 
-#: src/cmd_ws_commit.cc:1651
+#: src/cmd_ws_commit.cc:1679
 #, c-format
 msgid "revision %s already in database"
 msgstr "revisionen %s finns redan i databasen"
 
-#: src/cmd_ws_commit.cc:1695 src/cmd_ws_commit.cc:1725
+#: src/cmd_ws_commit.cc:1723 src/cmd_ws_commit.cc:1753
 #, c-format
 msgid "file '%s' modified during commit, aborting"
 msgstr "filen '%s' ändrades under arkivering, avbryter"
 
-#: src/cmd_ws_commit.cc:1706
+#: src/cmd_ws_commit.cc:1734
 #, c-format
 msgid "your database is missing version %s of file '%s'"
 msgstr "din databas saknar version %s av filen '%s'"
 
-#: src/cmd_ws_commit.cc:1764
+#: src/cmd_ws_commit.cc:1792
 #, c-format
 msgid "committed revision %s"
 msgstr "arkiverade revisionen %s"
 
-#: src/cmd_ws_commit.cc:1809
+#: src/cmd_ws_commit.cc:1837
 msgid "Commits workspace changes to the database"
 msgstr "Arkiverar ändringar i arbetskopian till databasen"
 
-#: src/cmd_ws_commit.cc:1822
+#: src/cmd_ws_commit.cc:1850
 msgid "Sets up a new workspace directory"
 msgstr "Initierar en ny arbetskopie-katalog"
 
-#: src/cmd_ws_commit.cc:1823
+#: src/cmd_ws_commit.cc:1851
 msgid "If no directory is specified, uses the current directory."
 msgstr "Använd nuvarande katalog om inget annat anges."
 
-#: src/cmd_ws_commit.cc:1830
+#: src/cmd_ws_commit.cc:1858
 #, c-format
 msgid "need '--branch' argument for setup"
 msgstr "du måste ange en gren med '--branch' till kommandot 'setup'"
 
-#: src/cmd_ws_commit.cc:1868
+#: src/cmd_ws_commit.cc:1896
 msgid "DIRECTORY"
 msgstr "KATALOG"
 
-#: src/cmd_ws_commit.cc:1869
+#: src/cmd_ws_commit.cc:1897
 msgid "Imports the contents of a directory into a branch"
 msgstr "Importerar den givna katalogens innehåll till den givna grenen"
 
-#: src/cmd_ws_commit.cc:1883
+#: src/cmd_ws_commit.cc:1911
 #, c-format
 msgid "you must specify a directory to import"
 msgstr "du måste ange en katalog att importera"
 
-#: src/cmd_ws_commit.cc:1903
+#: src/cmd_ws_commit.cc:1931
 #, c-format
 msgid ""
 "use '--revision' or '--branch' to specify the parent revision for the import"
@@ -3008,38 +3029,38 @@ msgstr ""
 "använd '--revision' eller '--branch' för att ange föräldrarevisionen för "
 "importen"
 
-#: src/cmd_ws_commit.cc:1914
+#: src/cmd_ws_commit.cc:1942
 #, c-format
 msgid "choose one with '%s import -r<id>'"
 msgstr "välj en med '%s import -r<id>'"
 
-#: src/cmd_ws_commit.cc:1925
+#: src/cmd_ws_commit.cc:1953
 #, c-format
 msgid "import directory '%s' doesn't exists"
 msgstr "importkatalogen '%s' finns inte"
 
-#: src/cmd_ws_commit.cc:1926
+#: src/cmd_ws_commit.cc:1954
 #, c-format
 msgid "import directory '%s' is a file"
 msgstr "importkatalogen '%s' är en fil"
 
-#: src/cmd_ws_commit.cc:1979
+#: src/cmd_ws_commit.cc:2007
 msgid "Migrates a workspace directory's metadata to the latest format"
 msgstr "Migrerar en arbetskopias metadata till det senaste formatet"
 
-#: src/cmd_ws_commit.cc:1980
+#: src/cmd_ws_commit.cc:2008
 msgid "If no directory is given, defaults to the current workspace."
 msgstr "Nuvarande katalog avses om inget annat anges"
 
-#: src/cmd_ws_commit.cc:2004
+#: src/cmd_ws_commit.cc:2032
 msgid "Refreshes the inodeprint cache"
 msgstr "Uppdaterar inodeprint-cachen"
 
-#: src/cmd_ws_commit.cc:2015
+#: src/cmd_ws_commit.cc:2043
 msgid "Search revisions to find where a change first appeared"
 msgstr "Leta efter revision för att finna var en ändring uppstod"
 
-#: src/cmd_ws_commit.cc:2016
+#: src/cmd_ws_commit.cc:2044
 msgid ""
 "These commands subdivide a set of revisions into good, bad and untested "
 "subsets and successively narrow the untested set to find the first revision "
@@ -3049,11 +3070,11 @@ msgstr ""
 "otestad mängde, och smalnar successivt av den otestade mängden med målet att "
 "finna den revision som först introducerade en viss ändring."
 
-#: src/cmd_ws_commit.cc:2021
+#: src/cmd_ws_commit.cc:2049
 msgid "Reset the current bisection search"
 msgstr "Avbryt den pågående uppdelningssökningen"
 
-#: src/cmd_ws_commit.cc:2022
+#: src/cmd_ws_commit.cc:2050
 msgid ""
 "Update the workspace back to the revision from which the bisection was "
 "started and remove all current search information, allowing a new search to "
@@ -3062,24 +3083,24 @@ msgstr ""
 "Uppdatera arbetskopian tillbaka till revisionen där uppdelningen började och "
 "ta bort all sökningsinformation så att en ny sökning kan påbörjas."
 
-#: src/cmd_ws_commit.cc:2037 src/cmd_ws_commit.cc:2093
+#: src/cmd_ws_commit.cc:2065 src/cmd_ws_commit.cc:2121
 #, c-format
 msgid "no bisection in progress"
 msgstr "ingen uppdelning pågår"
 
-#: src/cmd_ws_commit.cc:2052 src/cmd_ws_commit.cc:2280
+#: src/cmd_ws_commit.cc:2080 src/cmd_ws_commit.cc:2308
 #, c-format
 msgid "this command can only be used in a workspace with no pending changes"
 msgstr ""
 "detta kommando kan enbart användas i en arbetskopia där alla gjorda "
 "ändringar har arkiverats"
 
-#: src/cmd_ws_commit.cc:2058
+#: src/cmd_ws_commit.cc:2086
 #, c-format
 msgid "reset back to %s"
 msgstr "återställ till %s"
 
-#: src/cmd_ws_commit.cc:2124
+#: src/cmd_ws_commit.cc:2152
 #, c-format
 msgid ""
 "bisecting revisions; %d good; %d bad; %d skipped; specify good revisions to "
@@ -3088,7 +3109,7 @@ msgstr ""
 "delar upp revisioner; %d bra; %d dåliga; %d hoppades över; var god ange bra "
 "revisioner för att påbörja sökningen"
 
-#: src/cmd_ws_commit.cc:2130
+#: src/cmd_ws_commit.cc:2158
 #, c-format
 msgid ""
 "bisecting revisions; %d good; %d bad; %d skipped; specify bad revisions to "
@@ -3097,41 +3118,41 @@ msgstr ""
 "delar upp revisioner; %d bra; %d dåliga; %d hoppades över; var god ange "
 "dåliga revisioner för att påbörja sökningen"
 
-#: src/cmd_ws_commit.cc:2193
+#: src/cmd_ws_commit.cc:2221
 #, c-format
 msgid "bisecting %d revisions; %d good; %d bad; %d skipped; %d remaining"
 msgstr "delar upp %d revisioner; %d bra; %d dåliga; %d hoppades över; %d kvar"
 
-#: src/cmd_ws_commit.cc:2211
+#: src/cmd_ws_commit.cc:2239
 #, c-format
 msgid "bisection finished at revision %s"
 msgstr "uppdelningen slutade på revision %s"
 
-#: src/cmd_ws_commit.cc:2304
+#: src/cmd_ws_commit.cc:2332
 #, c-format
 msgid "bisection started at revision %s"
 msgstr "uppdelningen började på revision %s"
 
-#: src/cmd_ws_commit.cc:2320
+#: src/cmd_ws_commit.cc:2348
 #, c-format
 msgid "ignored redundant bisect %s on revision %s"
 msgstr "ignorerade redundant uppdelning %s på revision %s"
 
-#: src/cmd_ws_commit.cc:2325
+#: src/cmd_ws_commit.cc:2353
 #, c-format
 msgid "conflicting bisect %s/%s on revision %s"
 msgstr "uppdelning %s och %s i konflikt med varandra i revision %s"
 
-#: src/cmd_ws_commit.cc:2343
+#: src/cmd_ws_commit.cc:2371
 #, c-format
 msgid "updating to %s"
 msgstr "uppdaterar till %s"
 
-#: src/cmd_ws_commit.cc:2368
+#: src/cmd_ws_commit.cc:2396
 msgid "Reports on the current status of the bisection search"
 msgstr "Berättar om den nuvarande uppdelningssökningens tillstånd"
 
-#: src/cmd_ws_commit.cc:2369
+#: src/cmd_ws_commit.cc:2397
 msgid ""
 "Lists the total number of revisions in the search set, the number of "
 "revisions that have been determined to be good or bad, the number of "
@@ -3142,26 +3163,26 @@ msgstr ""
 "markerats som bra eller dåliga, antalet revision som har hoppats över och "
 "antalet revisioner kvar att testa."
 
-#: src/cmd_ws_commit.cc:2397
+#: src/cmd_ws_commit.cc:2425
 #, c-format
 msgid "next revision for bisection testing is %s\n"
 msgstr "nästa revision att testa med uppdelning är %s\n"
 
-#: src/cmd_ws_commit.cc:2398
+#: src/cmd_ws_commit.cc:2426
 #, c-format
 msgid "however this workspace is currently at %s\n"
 msgstr "men denna arbetskopia är för närvarande på %s\n"
 
-#: src/cmd_ws_commit.cc:2399
+#: src/cmd_ws_commit.cc:2427
 #, c-format
 msgid "run 'bisect update' to update to this revision before testing"
 msgstr "kör 'bisect update' för att uppdatera till denna revision innan test"
 
-#: src/cmd_ws_commit.cc:2404
+#: src/cmd_ws_commit.cc:2432
 msgid "Updates the workspace to the next revision to be tested by bisection"
 msgstr "Uppdaterar arbetskopian till nästa revision att testa med uppdelning"
 
-#: src/cmd_ws_commit.cc:2405
+#: src/cmd_ws_commit.cc:2433
 msgid ""
 "This command can be used if updates by good, bad or skip commands fail due "
 "to blocked paths or other problems."
@@ -3169,11 +3190,11 @@ msgstr ""
 "Detta kommando kan användas om uppdatering med kommandona 'good', 'bad' och "
 "'skipped' misslyckades på grund av blockerade sökvägar eller andra problem."
 
-#: src/cmd_ws_commit.cc:2415
+#: src/cmd_ws_commit.cc:2443
 msgid "Excludes the current revision or specified revisions from the search"
 msgstr "Utestänger nuvarande revision eller angivna revisioner från sökningen"
 
-#: src/cmd_ws_commit.cc:2416
+#: src/cmd_ws_commit.cc:2444
 msgid ""
 "Skipped revisions are removed from the set being searched. Revisions that "
 "cannot be tested for some reason should be skipped."
@@ -3181,19 +3202,19 @@ msgstr ""
 "Revisioner som hoppas över tas bort från mängden som söks igenom. Revisioner "
 "som inte kan testas av någon anledning borde hoppas över."
 
-#: src/cmd_ws_commit.cc:2426
+#: src/cmd_ws_commit.cc:2454
 msgid "Marks the current revision or specified revisions as bad"
 msgstr "Markerar nuvarande revision eller angivna revisioner som dåliga"
 
-#: src/cmd_ws_commit.cc:2427
+#: src/cmd_ws_commit.cc:2455
 msgid "Known bad revisions are removed from the set being searched."
 msgstr "Kända dåliga revisioner tas bort från mängden att söka igenom."
 
-#: src/cmd_ws_commit.cc:2436
+#: src/cmd_ws_commit.cc:2464
 msgid "Marks the current revision or specified revisions as good"
 msgstr "Markerar nuvarande revision eller angivna revisioner som bra"
 
-#: src/cmd_ws_commit.cc:2437
+#: src/cmd_ws_commit.cc:2465
 msgid "Known good revisions are removed from the set being searched."
 msgstr "Kända bra revisioner tas bort från mängden att söka igenom."
 
@@ -3636,7 +3657,7 @@ msgstr "rcfilen '%s' finns inte"
 msgid "rcfile '%s' does not exist"
 msgstr "rcfilen '%s' finns inte"
 
-#: src/transforms.cc:83
+#: src/transforms.cc:84
 #, c-format
 msgid ""
 "%s\n"
@@ -4456,27 +4477,27 @@ msgstr "revisionen innehåller inkorrekt
 msgid "revision contains incorrect manifest_id"
 msgstr "revisionen innehåller inkorrekt manifest_id"
 
-#: src/database.cc:3489
+#: src/database.cc:3487
 #, c-format
 msgid "failed to get RSA verifying key for %s"
 msgstr "misslyckades med att finna signerande RSA-nyckel för %s"
 
-#: src/database.cc:3628
+#: src/database.cc:3626
 #, c-format
 msgid "your database contains multiple keys named '%s'"
 msgstr "din databas innehåller flera nycklar som heter '%s'"
 
-#: src/database.cc:3789
+#: src/database.cc:3787
 #, c-format
 msgid "cert revision %s does not exist in db"
 msgstr "certrevision %s finns inte i databasen"
 
-#: src/database.cc:3791
+#: src/database.cc:3789
 #, c-format
 msgid "dropping cert"
 msgstr "slänger cert"
 
-#: src/database.cc:3801
+#: src/database.cc:3799
 #, c-format
 msgid ""
 "the branch name\n"
@@ -4499,32 +4520,32 @@ msgstr ""
 "kommandot '%s local kill_certs för att ta bort detta särskilda\n"
 "gren-certifikat och lägga till en giltig."
 
-#: src/database.cc:4118
+#: src/database.cc:4116
 #, c-format
 msgid "ignoring bad signature by '%s' on '%s'"
 msgstr "ignorerar felaktig signatur på '%2$s', av '%1$s'"
 
-#: src/database.cc:4123
+#: src/database.cc:4121
 #, c-format
 msgid "ignoring unknown signature by '%s' on '%s'"
 msgstr "ignorerar okänd signatur på '%2$s', av '%1$s'"
 
-#: src/database.cc:4125
+#: src/database.cc:4123
 #, c-format
 msgid "trust function disliked %d signers of '%s' cert on revision %s"
 msgstr "tillitsfunktionen ogillar %d signerare av certet '%s' i revisionen %s"
 
-#: src/database.cc:4813 src/database.cc:4955
+#: src/database.cc:4811 src/database.cc:4953
 #, c-format
 msgid "no database specified"
 msgstr "ingen databas angiven"
 
-#: src/database.cc:4826
+#: src/database.cc:4824
 #, c-format
 msgid "database '%s' does not exist"
 msgstr "databasen '%s' finns inte"
 
-#: src/database.cc:4834
+#: src/database.cc:4832
 #, c-format
 msgid ""
 "'%s' is a workspace, not a database\n"
@@ -4533,17 +4554,17 @@ msgstr ""
 "'%s' är en katalog, inte en databas\n"
 "(menade du '%s'?)"
 
-#: src/database.cc:4838
+#: src/database.cc:4836
 #, c-format
 msgid "'%s' is a directory, not a database"
 msgstr "'%s' är en katalog, inte en databas"
 
-#: src/database.cc:4846
+#: src/database.cc:4844
 #, c-format
 msgid "database '%s' already exists"
 msgstr "databasen '%s' finns redan"
 
-#: src/database.cc:4851
+#: src/database.cc:4849
 #, c-format
 msgid ""
 "existing (possibly stale) journal file '%s' has same stem as new database "
@@ -4554,32 +4575,32 @@ msgstr ""
 "databasen '%s'.\n"
 "Avbryter skapandet av databasen"
 
-#: src/database.cc:5013
+#: src/database.cc:5011
 #, c-format
 msgid "the database alias '%s' has multiple ambiguous expansions:"
 msgstr "databasaliaset '%s' har flera motsägelsefulla uttydningar:"
 
-#: src/database.cc:5036
+#: src/database.cc:5034
 #, c-format
 msgid "could not query default database alias"
 msgstr "kunde inte fråga efter databasens standardalias"
 
-#: src/database.cc:5038
+#: src/database.cc:5036
 #, c-format
 msgid "using default database '%s'"
 msgstr "använder standarddatabasen '%s'"
 
-#: src/database.cc:5048
+#: src/database.cc:5046
 #, c-format
 msgid "invalid database alias '%s': does not start with a colon"
 msgstr "ogiltigt databasalias '%s': startar inte med ett kolon"
 
-#: src/database.cc:5052
+#: src/database.cc:5050
 #, c-format
 msgid "invalid database alias '%s': must not be empty"
 msgstr "ogiltigt databasalias '%s': får inte vara tomt"
 
-#: src/database.cc:5068
+#: src/database.cc:5066
 #, c-format
 msgid "invalid database alias '%s': does contain invalid characters"
 msgstr "ogiltigt databasalias '%s': innehåller ogiltiga tecken"
@@ -4653,7 +4674,7 @@ msgstr "nyckelparet %s finns inte i kata
 msgid "no key pair %s found in key store '%s'"
 msgstr "nyckelparet %s finns inte i katalogen '%s'"
 
-#: src/key_store.cc:620
+#: src/key_store.cc:633
 #, c-format
 msgid ""
 "failed to decrypt old private RSA key, probably incorrect passphrase or "
@@ -4662,49 +4683,49 @@ msgstr ""
 "misslyckades med att avkoda den gamla privata RSA-nyckeln, antagligen "
 "beroende på inkorrekt lösen eller på att lua-hooken 'get_passphrase' saknas"
 
-#: src/key_store.cc:633
+#: src/key_store.cc:646
 #, c-format
 msgid "failed to extract RSA private key from PKCS#8 keypair"
 msgstr ""
 "misslyckades med att plocka ut den privata RSA-nyckeln från nyckelparet i "
 "PKCS#8-format"
 
-#: src/key_store.cc:673
+#: src/key_store.cc:686
 #, c-format
 msgid "key '%s' already exists"
 msgstr "nyckeln '%s' finns redan"
 
-#: src/key_store.cc:685
+#: src/key_store.cc:698
 #, c-format
 msgid "generating key-pair '%s'"
 msgstr "skapar nyckelparet '%s'"
 
-#: src/key_store.cc:733
+#: src/key_store.cc:746
 #, c-format
 msgid "storing key-pair %s in '%s/'"
 msgstr "lagrar nyckelparet %s i '%s/'"
 
-#: src/key_store.cc:746
+#: src/key_store.cc:759
 #, c-format
 msgid "storing public key %s in '%s'"
 msgstr "lagrar den publika nyckeln %s i '%s'"
 
-#: src/key_store.cc:762
+#: src/key_store.cc:775
 #, c-format
 msgid "key '%s' has hash '%s'"
 msgstr "nyckeln '%s' har kontrollsumman '%s'"
 
-#: src/key_store.cc:776
+#: src/key_store.cc:789
 #, c-format
 msgid "no key pair '%s' found in key store '%s'"
 msgstr "nyckelparet '%s' finns inte i katalogen '%s'"
 
-#: src/key_store.cc:828
+#: src/key_store.cc:845
 #, c-format
 msgid "Botan error decrypting data: '%s'"
 msgstr "Botan genererade ett fel när den avkodade data: '%s'"
 
-#: src/key_store.cc:851
+#: src/key_store.cc:868
 #, c-format
 msgid ""
 "you have chosen to sign only with ssh-agent but ssh-agent does not seem to "
@@ -4713,12 +4734,12 @@ msgstr ""
 "du har valt att enbart signera med hjälp av ssh-agent, men den tycks inte "
 "vara igång"
 
-#: src/key_store.cc:881
+#: src/key_store.cc:898
 #, c-format
 msgid "you don't seem to have your monotone key imported "
 msgstr "du verkar inte ha importerat din monotonenyckel "
 
-#: src/key_store.cc:935
+#: src/key_store.cc:952
 #, c-format
 msgid ""
 "make_signature: ssh signature (%i) != monotone signature (%i)\n"
@@ -4729,24 +4750,24 @@ msgstr ""
 "sshsignatur     : %s\n"
 "monotonesignatur: %s"
 
-#: src/key_store.cc:951
+#: src/key_store.cc:968
 #, c-format
 msgid "make_signature: signature is not valid"
 msgstr "make_signature: signaturen är ogiltig"
 
-#: src/key_store.cc:963
+#: src/key_store.cc:980
 #, c-format
 msgid "no ssh-agent is available, cannot add key %s"
 msgstr "ingen ssh-agent tillgänglig, kunde inte lägga till nyckeln %s"
 
-#: src/key_store.cc:1060
+#: src/key_store.cc:1087
 #, c-format
 msgid "failed to decrypt old private RSA key, probably incorrect passphrase"
 msgstr ""
 "misslyckades med att avkoda den gamla privata RSA-nyckeln, antagligen "
 "beroende på inkorrekt lösen"
 
-#: src/key_store.cc:1097
+#: src/key_store.cc:1124
 #, c-format
 msgid "public and private keys for %s do not match"
 msgstr "publik och privat nyckel för %s stämmer inte överens"
@@ -4887,22 +4908,22 @@ msgstr "otydbart paket: ogiltigt data i 
 msgid "malformed packet: invalid public key data for '%s': %s"
 msgstr "otydbart paket: ogiltigt data i publik nyckel för '%s': %s"
 
-#: src/packet.cc:187
+#: src/packet.cc:189
 #, c-format
 msgid "malformed packet: invalid private key data for '%s': %s"
 msgstr "otydbart paket: ogiltigt data i privat nyckel för '%s': %s"
 
-#: src/packet.cc:199
+#: src/packet.cc:205
 #, c-format
 msgid "malformed packet: invalid cert name"
 msgstr "otydbart paket: ogiltigt certnamn"
 
-#: src/packet.cc:206
+#: src/packet.cc:212
 #, c-format
 msgid "malformed packet: too many arguments in header"
 msgstr "otydbart paket: för många argument i headern"
 
-#: src/packet.cc:335
+#: src/packet.cc:341
 #, c-format
 msgid "unknown packet type '%s'"
 msgstr "okänd pakettyp '%s'"
@@ -7334,52 +7355,52 @@ msgstr "Hastigetstestar Botans SHA-1"
 msgid "Benchmarking botan's SHA-1 core"
 msgstr "Hastigetstestar Botans SHA-1"
 
-#: src/sha1.cc:61
+#: src/sha1.cc:64
 #, c-format
 msgid "SHA-1 provider '%s': %s MiB/s"
 msgstr "SHA-1-leverantör '%s': %s MiB/s"
 
-#: src/sha1.cc:73
+#: src/sha1.cc:76
 #, c-format
 msgid "%s MiB/s"
 msgstr "%s MiB/s"
 
-#: src/pcrewrap.cc:219
+#: src/pcrewrap.cc:273
 #, c-format
 msgid "while compiling regex '%s': %s"
 msgstr "medans regexen '%s' kompilerades: %s"
 
-#: src/pcrewrap.cc:228
+#: src/pcrewrap.cc:282
 #, c-format
 msgid "error in regex '%s': %s"
 msgstr "fel i regexen '%s': %s"
 
-#: src/pcrewrap.cc:230
+#: src/pcrewrap.cc:284
 #, c-format
 msgid "error near char %d of regex '%s': %s"
 msgstr "fel nära tecken nummer %d i regexen '%s': %s"
 
-#: src/pcrewrap.cc:245
+#: src/pcrewrap.cc:299
 #, c-format
 msgid "while studying regex '%s': %s"
 msgstr "medans regexen '%s' studerades: %s"
 
-#: src/pcrewrap.cc:263
+#: src/pcrewrap.cc:317
 #, c-format
 msgid "backtrack limit exceeded in regular _expression_ matching"
 msgstr "bakåtspårningsnivån har nått sin gräns under jämförelse av regex"
 
-#: src/pcrewrap.cc:267
+#: src/pcrewrap.cc:321
 #, c-format
 msgid "recursion limit exceeded in regular _expression_ matching"
 msgstr "rekursionen har nått sin gräns under jämförelse av regex"
 
-#: src/pcrewrap.cc:272
+#: src/pcrewrap.cc:326
 #, c-format
 msgid "invalid UTF-8 sequence found during regular _expression_ matching"
 msgstr "ogiltig UTF8-sekvens funnen under jämförelsen av regex"
 
-#: src/pcrewrap.cc:275
+#: src/pcrewrap.cc:329
 #, c-format
 msgid "pcre_exec returned %d"
 msgstr "pcre_exec gav tillbaka %d"
@@ -8376,31 +8397,51 @@ msgstr "monotone stöder inte Botan 1.7.
 msgid "monotone does not support Botan 1.7.14"
 msgstr "monotone stöder inte Botan 1.7.14"
 
-#: src/monotone.cc:161
+#: src/monotone.cc:163
 #, c-format
+msgid "monotone does not support Botan 1.9.9"
+msgstr "monotone stöder inte Botan 1.9.9"
+
+#: src/monotone.cc:168
+#, c-format
 msgid "this monotone binary requires Botan 1.6.3 or newer"
 msgstr "denna monotone kräver Botan version 1.6.3 eller senare"
 
-#: src/monotone.cc:163
+#: src/monotone.cc:170
 #, c-format
-msgid "this monotone binary does not work with Botan newer than 1.7.6"
-msgstr "denna monotone fungerar inte med Botan version 1.7.6 eller senare"
+msgid "this monotone binary does not work with Botan 1.7.7 or newer"
+msgstr "denna monotone fungerar inte med Botan version 1.7.7 eller senare"
 
-#: src/monotone.cc:166
+#: src/monotone.cc:175
 #, c-format
 msgid "this monotone binary requires Botan 1.7.7 or newer"
 msgstr "denna monotone kräver Botan version 1.7.7 eller senare"
 
-#: src/monotone.cc:172 src/monotone.cc:177
+#: src/monotone.cc:182 src/monotone.cc:189
 #, c-format
-msgid "this monotone binary does not work with Botan 1.9.x"
-msgstr "denna monotone fungerar inte med Botan version 1.9.x"
+msgid "this monotone binary does not work with Botan 1.9.4 or newer"
+msgstr "denna monotone fungerar inte med Botan version 1.9.4 eller senare"
 
-#: src/monotone.cc:175
+#: src/monotone.cc:187
 #, c-format
 msgid "this monotone binary requires Botan 1.7.22 or newer"
 msgstr "denna monotone kräver Botan version 1.7.22 eller senare"
 
+#: src/monotone.cc:195
+#, c-format
+msgid "this monotone binary requires Botan 1.9.4 or newer"
+msgstr "denna monotone kräver Botan version 1.9.4 eller senare"
+
+#: src/monotone.cc:197
+#, c-format
+msgid "this monotone binary does not work with Botan 1.9.11 or newer"
+msgstr "denna monotone fungerar inte med Botan version 1.9.11 eller senare"
+
+#: src/monotone.cc:202
+#, c-format
+msgid "this monotone binary requires Botan 1.9.11 or newer"
+msgstr "denna monotone kräver Botan version 1.9.11 eller senare"
+
 #: src/std_hooks.lua:56
 msgid "Press enter"
 msgstr "Tryck på Enter"
@@ -8409,6 +8450,9 @@ msgstr "Tryck [Retur] när underprocesse
 msgid "Press enter when the subprocess has completed"
 msgstr "Tryck [Retur] när underprocessen är klar"
 
+#~ msgid "this monotone binary does not work with Botan newer than 1.7.6"
+#~ msgstr "denna monotone fungerar inte med Botan version 1.7.6 eller senare"
+
 #~ msgid "Network error: %s"
 #~ msgstr "Nätverksfel: %s"
 
============================================================
--- src/ancestry.cc	8b3388b690a5f4878bd29d752c3e6e073411739e
+++ src/ancestry.cc	e673b17a5d2fad2716f7f4efe33c2ca11c7c31f9
@@ -374,6 +374,121 @@ erase_ancestors(database & db, set<revis
   erase_ancestors_and_failures(db, revisions, p);
 }
 
+static void
+accumulate_strict_descendants(database & db,
+                              revision_id const & start,
+                              set<revision_id> & all_descendants,
+                              multimap<revision_id, revision_id> const & graph,
+                              rev_height const & max_height)
+{
+  typedef multimap<revision_id, revision_id>::const_iterator gi;
+
+  vector<revision_id> frontier;
+  frontier.push_back(start);
+
+  while (!frontier.empty())
+    {
+      revision_id rid = frontier.back();
+      frontier.pop_back();
+      pair<gi, gi> parents = graph.equal_range(rid);
+      for (gi i = parents.first; i != parents.second; ++i)
+        {
+          revision_id const & parent = i->second;
+          if (all_descendants.find(parent) == all_descendants.end())
+            {
+              // prune if we're above max_height
+              rev_height h;
+              db.get_rev_height(parent, h);
+              if (h <= max_height)
+                {
+                  all_descendants.insert(parent);
+                  frontier.push_back(parent);
+                }
+            }
+        }
+    }
+}
+
+// this call is equivalent to running:
+//   erase(remove_if(candidates.begin(), candidates.end(), p));
+//   erase_descendants(candidates, db);
+// however, by interleaving the two operations, it can in common cases make
+// many fewer calls to the predicate, which can be a significant speed win.
+
+void
+erase_descendants_and_failures(database & db,
+                               std::set<revision_id> & candidates,
+                               is_failure & p,
+                               multimap<revision_id, revision_id> *graph_cache_ptr)
+{
+  // Load up the ancestry graph
+  multimap<revision_id, revision_id> graph;
+
+  if (candidates.empty())
+    return;
+
+  if (graph_cache_ptr == NULL)
+    graph_cache_ptr = &graph;
+  if (graph_cache_ptr->empty())
+  {
+    db.get_forward_ancestry(*graph_cache_ptr);
+  }
+
+  // Keep a set of all descendants that we've traversed -- to avoid
+  // combinatorial explosion.
+  set<revision_id> all_descendants;
+
+  rev_height max_height;
+  db.get_rev_height(*candidates.begin(), max_height);
+  for (std::set<revision_id>::const_iterator it = candidates.begin(); it != candidates.end(); it++)
+    {
+      rev_height h;
+      db.get_rev_height(*it, h);
+      if (h > max_height)
+        max_height = h;
+    }
+
+  vector<revision_id> todo(candidates.begin(), candidates.end());
+  std::random_shuffle(todo.begin(), todo.end());
+
+  size_t predicates = 0;
+  while (!todo.empty())
+    {
+      revision_id rid = todo.back();
+      todo.pop_back();
+      // check if this one has already been eliminated
+      if (all_descendants.find(rid) != all_descendants.end())
+        continue;
+      // and then whether it actually should stay in the running:
+      ++predicates;
+      if (p(rid))
+        {
+          candidates.erase(rid);
+          continue;
+        }
+      // okay, it is good enough that all its descendants should be
+      // eliminated
+      accumulate_strict_descendants(db, rid, all_descendants, *graph_cache_ptr, max_height);
+    }
+
+  // now go and eliminate the ancestors
+  for (set<revision_id>::const_iterator i = all_descendants.begin();
+       i != all_descendants.end(); ++i)
+    candidates.erase(*i);
+
+  L(FL("called predicate %s times") % predicates);
+}
+
+// This function looks at a set of revisions, and for every pair A, B in that
+// set such that A is an descendant of B, it erases A.
+
+void
+erase_descendants(database & db, set<revision_id> & revisions)
+{
+  no_failures p;
+  erase_descendants_and_failures(db, revisions, p);
+}
+
 // This function takes a revision A and a set of revision Bs, calculates the
 // ancestry of each, and returns the set of revisions that are in A's ancestry
 // but not in the ancestry of any of the Bs.  It tells you 'what's new' in A
============================================================
--- src/automate.cc	efa4ecceab7f1e31f71778f325da312bf6aefba5
+++ src/automate.cc	919e3df52514d0877aeafc67791aae6a3faa33b4
@@ -240,6 +240,39 @@ CMD_AUTOMATE(erase_ancestors, N_("[REV1 
     output << *i << '\n';
 }
 
+// Name: erase_descendants
+// Arguments:
+//   0 or more: revision ids
+// Added in: 13.1
+// Purpose: Prints all arguments, except those that are a descendant of some
+//   other argument.  One way to think about this is that it prints the
+//   minimal elements of the given set, under the ordering imposed by the
+//   "parent of" relation.  Another way to think of it is if the arguments were
+//   a branch, then we print the roots of that branch.
+// Output format: A list of revision ids, in hexadecimal, each followed by a
+//   newline.  Revision ids are printed in alphabetically sorted order.
+// Error conditions: If any of the revisions do not exist, prints nothing to
+//   stdout, prints an error message to stderr, and exits with status 1.
+CMD_AUTOMATE(erase_descendants, N_("[REV1 [REV2 [REV3 [...]]]]"),
+             N_("Erases the descendants in a list of revisions"),
+             "",
+             options::opts::none)
+{
+  database db(app);
+
+  set<revision_id> revs;
+  for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i)
+    {
+      revision_id rid(decode_hexenc_as<revision_id>((*i)(), origin::user));
+      E(db.revision_exists(rid), origin::user,
+        F("no revision %s found in database") % rid);
+      revs.insert(rid);
+    }
+  erase_descendants(db, revs);
+  for (set<revision_id>::const_iterator i = revs.begin(); i != revs.end(); ++i)
+    output << *i << '\n';
+}
+
 // Name: toposort
 // Arguments:
 //   0 or more: revision ids
============================================================
--- src/cmd_conflicts.cc	ad9dc74c27d4d8c50a74e5825ec9e0a12cdc1b09
+++ src/cmd_conflicts.cc	86bf4eb2e0608a8b9814cef8b416626b4aa0ca90
@@ -1,4 +1,4 @@
-// Copyright (C) 2008 - 2010 Stephen Leake <address@hidden>
+// Copyright (C) 2008 - 2010, 2012 Stephen Leake <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
 // greater. See the accompanying file COPYING for details.
@@ -291,6 +291,8 @@ set_first_conflict(database & db,
                    args_vector const & args,
                    side_t side)
 {
+  E(args.size() > 0, origin::user, F("wrong number of arguments"));
+
   if (side != neither)
     {
       for (std::vector<duplicate_name_conflict>::iterator i = conflicts.result.duplicate_name_conflicts.begin();
============================================================
--- src/gzip.hh	aff9da63bb22366bccf69c2d75ee7790406d2455
+++ src/gzip.hh	17093f66e365b3730a49ef1910295f622972c36e
@@ -13,10 +13,17 @@ namespace Botan {
 
 namespace Botan {
 
-#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,4)
-// Only 1.9.4 and newer export the Memory_Exception. Give this gzip
-// implementation something compatible to work with.
-typedef std::bad_alloc Memory_Exhaustion;
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,12) && \
+  BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,4)
+// Botan versions between 1.7.12 and 1.9.3 (including) keep their
+// Memory_Exception private. Give this gzip implementation something
+// compatible to work with.
+class Memory_Exhaustion : public Exception
+{
+public:
+  Memory_Exhaustion() :
+    Exception("Ran out of memory, allocation failed") {}
+};
 #endif
 
 namespace GZIP {
============================================================
--- src/rev_output.cc	a2c70b893b31296917d1a2b974faa1da46c13f1e
+++ src/rev_output.cc	6b9862bfda95d0d558d8335fb2accfc0180e8fbd
@@ -98,6 +98,23 @@ revision_header(revision_id const rid, r
     if (i->name == tag)
       out << _("Tag:      ") << i->value << '\n';
 
+  // Output "custom" certs if we have any, under a heading of "Other certs"
+  bool need_to_output_heading = true;
+  for (vector<cert>::const_iterator i = certs.begin(); i != certs.end(); ++i)
+    {
+      if (i->name != author && i->name != branch && i->name != changelog &&
+          i->name != comment && i->name != date && i->name != tag)
+        {
+          if (need_to_output_heading)
+            {
+              out << _("Other certs:") << '\n';
+              need_to_output_heading = false;
+            }
+
+          out << "  " << i->name << ": " << i->value << '\n';
+        }
+    }
+
   out << "\n";
 
   for (vector<cert>::const_iterator i = certs.begin(); i != certs.end(); ++i)
============================================================
--- src/revision.hh	740c4dd4ee350fcf06af3ba707cef3dadecb46f8
+++ src/revision.hh	8d93883e8a6de779aa199d9b2e1aa58589f0626c
@@ -162,6 +162,15 @@ void
                              std::multimap<revision_id, revision_id> *inverse_graph_cache_ptr = NULL);
 
 void
+erase_descendants(database & db, std::set<revision_id> & revisions);
+
+void
+erase_descendants_and_failures(database & db,
+                               std::set<revision_id> & revisions,
+                               is_failure & p,
+                               std::multimap<revision_id, revision_id> *inverse_graph_cache_ptr = NULL);
+
+void
 ancestry_difference(database & db, revision_id const & a,
                     std::set<revision_id> const & bs,
                     std::set<revision_id> & new_stuff);
============================================================
--- src/selectors.cc	3efba0ce3139290b4088cea0d6e82a912565471e
+++ src/selectors.cc	19a82c64f44ab5433354299f84598174cb15f510
@@ -523,6 +523,19 @@ public:
                        inserter(ret, ret.end()));
         return ret;
       }
+    else if (name == "not")
+      {
+        diagnose_wrong_arg_count("not", 1, args.size());
+        set<revision_id> lhs;
+        set<revision_id> rhs = args[0]->complete(project);
+
+        project.db.get_revision_ids(lhs);
+        set<revision_id> ret;
+        set_difference(lhs.begin(), lhs.end(),
+                       rhs.begin(), rhs.end(),
+                       inserter(ret, ret.end()));
+        return ret;
+      }
     else if (name == "lca")
       {
         diagnose_wrong_arg_count("lca", 2, args.size());
@@ -546,6 +559,13 @@ public:
         erase_ancestors(project.db, ret);
         return ret;
       }
+    else if (name == "min")
+      {
+        diagnose_wrong_arg_count("min", 1, args.size());
+        set<revision_id> ret = args[0]->complete(project);
+        erase_descendants(project.db, ret);
+        return ret;
+      }
     else if (name == "ancestors")
       {
         diagnose_wrong_arg_count("ancestors", 1, args.size());
============================================================
--- src/unix/fs.cc	d34f7ed4b5cf3655d7920568e4e1a146fa670e13
+++ src/unix/fs.cc	f51cae4dbc5589b0add4f7b9b649fde3c83d1220
@@ -1,3 +1,4 @@
+// Copyright (C) 2012 Stephe Leake <address@hidden>
 // Copyright (C) 2005 nathaniel smith <address@hidden>
 //
 // This program is made available under the GNU GPL version 2.0 or
@@ -23,11 +24,13 @@
 #include <stdio.h>
 #include <fcntl.h>
 #include <dirent.h>
+#include <cstdlib>
 
 #include "../sanity.hh"
 #include "../platform.hh"
 #include "../vector.hh"
 
+using std::malloc;
 using std::string;
 using std::vector;
 
@@ -288,11 +291,74 @@ rename_clobberingly(string const & from,
 void
 rename_clobberingly(string const & from, string const & to)
 {
+  // rename doesn't work across devices, which can happen if part of the
+  // workspace is NFS mounted.
+  //
+  // We only check for that if rename fails, to avoid slowing down normal
+  // workspaces.
+
   if (rename(from.c_str(), to.c_str()))
     {
-      const int err = errno;
-      E(false, origin::system,
-        F("renaming '%s' to '%s' failed: %s") % from % to % os_strerror(err));
+      // rename failed
+      int err = errno;
+
+      int from_fd = open(from.c_str(), O_RDONLY);
+      int to_fd = open(to.c_str(), O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+      struct stat from_stat;
+      struct stat to_stat;
+      fstat(from_fd, &from_stat);
+      fstat(to_fd, &to_stat);
+
+      if (from_stat.st_dev != to_stat.st_dev)
+        {
+          // different devices; use cp, rm
+          //
+          // except there isn't a C function that does 'cp', so we read in
+          // the file and write it out again.
+
+          char * buffer    = (char * )malloc(from_stat.st_size);
+          char * ptr       = buffer;
+          size_t remaining = from_stat.st_size;
+
+          do
+            {
+              ssize_t read_count = read(from_fd, ptr, remaining);
+
+              err = errno;
+
+              E(read_count >= 0, origin::system,
+                F ("error reading file '%s': %s") % from % os_strerror(err));
+
+              remaining -= read_count;
+              ptr       += read_count;
+            }
+          while (remaining > 0);
+          close(from_fd);
+
+          ptr       = buffer;
+          remaining = from_stat.st_size;
+          do
+            {
+              ssize_t write_count = write(to_fd, ptr, remaining);
+              err = errno;
+              E(write_count >= 0, origin::system,
+                F("error writing file '%s': %s") % to % os_strerror(err));
+
+              remaining -= write_count;
+              ptr       += write_count;
+            }
+          while (remaining > 0);
+          close(to_fd);
+
+          free(buffer);
+
+          remove(from.c_str());
+        }
+      else
+        {
+          E(false, origin::system,
+            F("renaming '%s' to '%s' failed: %s") % from % to % os_strerror(err));
+        }
     }
 }
 
============================================================
--- /dev/null	
+++ test/func/automate_erase_descendants/__driver__.lua	45830e0a1e9f33e9031ca9953689b3648a9eb04e
@@ -0,0 +1,46 @@
+
+mtn_setup()
+
+-- Make sure we fail when given a non-existent revision
+check(mtn("automate", "erase_descendants", "c7539264e83c5d6af4c792f079b5d46e9c128665"), 1, false, false)
+
+--   A
+--  / \
+-- B   C
+--     |\
+--     D E
+--     \/
+--      F
+includecommon("automate_ancestry.lua")
+
+revs = make_graph()
+
+-- Now do some checks
+
+-- Empty input gives empty output
+revmap("erase_descendants", {}, {})
+
+-- Single revision input gives the same single revision output
+for _,x in pairs(revs) do
+  revmap("erase_descendants", {x}, {x})
+end
+
+-- Whole revision graph should give roots - A in this case
+revmap("erase_descendants", {revs.a, revs.b, revs.c, revs.d, revs.e, revs.f}, {revs.a})
+
+-- Sibling only inputs should give the same output
+revmap("erase_descendants", {revs.b, revs.c}, {revs.b, revs.c})
+revmap("erase_descendants", {revs.d, revs.e}, {revs.d, revs.e})
+
+-- Siblings with descendants should give just the siblings
+revmap("erase_descendants", {revs.b, revs.c, revs.d, revs.e, revs.f}, {revs.b, revs.c})
+revmap("erase_descendants", {revs.d, revs.e, revs.f}, {revs.d, revs.e})
+
+-- Leaves only input should give the same output
+revmap("erase_descendants", {revs.b, revs.f}, {revs.b, revs.f})
+
+-- Revision with its descendants should give just the revision
+revmap("erase_descendants", {revs.c, revs.d, revs.e, revs.f}, {revs.c})
+revmap("erase_descendants", {revs.e, revs.f}, {revs.e})
+
+
============================================================
--- test/func/extended-selectors/__driver__.lua	435f44fb1b33bdfb53929fe6bd15ba7fa4c2c1d3
+++ test/func/extended-selectors/__driver__.lua	e80ed8e831bbc9cc346e7722c9877d32887104ef
@@ -1,7 +1,9 @@
 -- selector functions are:
 --   difference(a,b)
+--   not(a)
 --   lca(a,b)
 --   max(a)
+--   min(a)
 --   ancestors(a)
 --   descendants(a)
 --   parents(a)
@@ -78,6 +80,24 @@ expect("b:testbranch|b:otherbranch", roo
 expect("b:testbranch/b:otherbranch", lhs)
 expect("b:testbranch|b:otherbranch", root, lhs, rhs, m, other, other_2)
 
+expect("min(*)", root)
+expect("min(b:testbranch)", root)
+expect("min(b:testbranch/a:Anne)", rhs)
+expect("min(b:otherbranch)", lhs)
+expect("min(a:Jim)", other)
+
+-- now do same tests again with a double not - should get same results
+expect("not(not(b:testbranch))", root, lhs, rhs, m)
+expect("not(not(b:otherbranch))", lhs, other, other_2)
+expect("not(not(b:testbranch/b:otherbranch))", lhs)
+expect("not(not(b:testbranch|b:otherbranch))", root, lhs, rhs, m, other, other_2)
+
+expect("not(b:otherbranch)", root, rhs, m)
+expect("not(b:testbranch)", other, other_2)
+expect("not(h:testbranch)", root, lhs, rhs, other, other_2)
+expect("not(lca(h:testbranch;h:otherbranch))", root, rhs, m, other, other_2)
+expect("b:testbranch/not(a:Joe)", rhs, m)
+
 expect("lca(h:testbranch;h:otherbranch)", lhs)
 expect("max(b:testbranch/a:Joe)", lhs)
 expect("max(b:otherbranch/a:Anne)")
============================================================
--- test/func/resolve_conflicts_errors/__driver__.lua	4911dc65645a5af929cd990eef09c97146e60d17
+++ test/func/resolve_conflicts_errors/__driver__.lua	9a130c83d4a7e3545f18d089542603c8d0bb72fa
@@ -51,10 +51,11 @@ check(samefilestd("conflicts-attr-store-
 ----------
 -- use old conflicts file for new merge
 
--- get rid of attr conflict, add file content conflict
+-- get rid of attr conflict, add half of file content conflict
 check(mtn("attr", "set", "simple_file", "foo", "1"), 0, nil, nil)
 writefile("simple_file", "simple\ntwo\nthree\nfour\n")
 commit("testbranch", "right 2")
+right_2 = base_revision()
 
 -- attempt merge with old conflict file
 check(mtn("merge", "--resolve-conflicts"), 1, nil, true)
@@ -62,19 +63,33 @@ check(samefilestd("merge-old-conflicts-f
 canonicalize("stdout")
 check(samefilestd("merge-old-conflicts-file", "stdout"))
 
+----------
+-- 'resolve_first' without resolution (issue 202)
 
+-- other half of file content conflict
+revert_to(left_1)
+writefile("simple_file", "simple\none\nthree\nfour\n")
+commit("testbranch", "left 2")
+left_2 = base_revision()
+
+check(mtn("conflicts", "store", left_2, right_2), 0, nil, true)
+
+check(mtn("conflicts", "resolve_first"), 1, nil, true)
+check(qgrep("wrong number of arguments", "stderr"))
+
 ----------
 -- specify inconsistent left and right resolutions for duplicate_name
 
+addfile("checkout.sh", "checkout.sh left 1")
+commit("testbranch", "left 3")
+
+revert_to(right_2)
+
 addfile("checkout.sh", "checkout.sh right 1")
 commit("testbranch", "right 3")
 
-revert_to(left_1)
-addfile("checkout.sh", "checkout.sh left 1")
-commit("testbranch", "left 2")
-
 check(mtn("conflicts", "store"), 0, nil, true)
-check(samelines("stderr", {"mtn: 1 conflict with supported resolutions.",
+check(samelines("stderr", {"mtn: 2 conflicts with supported resolutions.",
                            "mtn: stored in '_MTN/conflicts'"}))
 
 -- invalid number of params
============================================================
--- test/unit/tests/xdelta.cc	4aff975cfd9a9cf18c26f70118e2895880ed6100
+++ test/unit/tests/xdelta.cc	ed5f467ebc4755f7521e74a40833181974b43a8f
@@ -8,11 +8,16 @@
 // PURPOSE.
 
 #include "../../../src/base.hh"
+
+// <boost/math/special_functions/detail/lgamma_small.hpp> uses L().
+// This conflicts with a #define in "../../../src/sanity.hh".
+// Workaround: Include BOOST header before "../../../src/xdelta.hh".
+#include <boost/random.hpp>
+
 #include "../unit_tests.hh"
 #include "../../../src/xdelta.hh"
 
 #include "../../../src/adler32.hh"
-#include <boost/random.hpp>
 
 boost::mt19937 xdelta_prng;
 boost::uniform_smallint<char> xdelta_chargen('a', 'z');
============================================================
--- util/audit-includes	d5757fcf83ab116fba16c53221da0f832307a113
+++ util/audit-includes	1c6fc8be30ebfafc67ca03980e7860db35e5d2e9
@@ -11,6 +11,7 @@ egrep -H "$(printf '^[ \t]*#[ \t]*includ
 # Check all C++ source files to make sure they obey the header file rules.
 
 egrep -H "$(printf '^[ \t]*#[ \t]*include\\>')" "$@" |
+  sed -e "$(printf 's/\r$//')" |
   sed -e "$(printf 's/:[ \t]*#[ \t]*include[ \t]*[<\"]/ /')" -e 's/[>"]$//' |
   {
     current=""

reply via email to

[Prev in Thread] Current Thread [Next in Thread]