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: 7338faf653922c1c9ce0eb944f8


From: code
Subject: [Monotone-commits-diffs] net.venge.monotone: 7338faf653922c1c9ce0eb944f8c7c00f5e54bfd
Date: Thu, 26 Apr 2012 22:38:22 +0200 (CEST)

revision:            7338faf653922c1c9ce0eb944f8c7c00f5e54bfd
date:                2012-04-26T19:14:42
author:              address@hidden
branch:              net.venge.monotone
changelog:
explicit merge of '7f35bea8a325edba1786625efa7f237311e1ec5d'
              and 'd238d73a0c7bce35c65d1dd4612d8eae104612e9'



manifest:
format_version "1"

new_manifest [88a367357bf6d15b7e7ab5ee33b18ab1622a548b]

old_revision [7f35bea8a325edba1786625efa7f237311e1ec5d]

patch "NEWS"
 from [ed0d68331a7ba1efb4877f7a65628a1c9f7d791c]
   to [5514332f7c16430d0c46d3fbac01b0c8a96bc412]

patch "doc/monotone.texi"
 from [5d233f3ae943361cf83d586209e6ff04c083c9de]
   to [e0b88a30f08867f9e0f593e5004789ca17753a94]

patch "extra/mtn-hooks/monotone-buildbot.lua"
 from [41d82aee6613c5d1775fd8ebf97ffd0c29ea807c]
   to [d1439935004ff6fb523dfa6b2c5fd5c8641339ab]

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

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

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

patch "src/database.cc"
 from [4c259f963c440fc95564dfec99b2f832f0bad643]
   to [87efeeff2d3263ba98af684a4022f1897434ed2d]

patch "src/gzip.cc"
 from [e7c19bee910e3d421fd073933810ec52092b1d9b]
   to [9da41f6820cdf39707b22c716e3682e0fa0fd745]

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

patch "src/key_packet.cc"
 from [d1306df89dd684badac02c03744cd446381c07d3]
   to [c97262d161b23c9640972188979669b3e95afe7b]

patch "src/key_store.cc"
 from [64c4c4bed1fadc26b51207b9f61343f9dd7d3c6e]
   to [b7859345f7c665914d16357409bdff24a48b7996]

patch "src/monotone.cc"
 from [a25ecdd170a601db798b63a60add7681609a34c4]
   to [764bc9ca406b41d21efd552a0d810bc2849e0588]

patch "src/netxx/serverbase.cxx"
 from [7a9b465ce4b0b02cb8ff126acf86d3896b4eb456]
   to [156f2090341d2a36bdb718e7c69df58f9251983e]

patch "src/packet.cc"
 from [f61360ed2524fdf53411bd24d022a2a3c9e6e9c7]
   to [571ff6eae1d269a146da74f2730b70376957d3bb]

patch "src/packet.hh"
 from [0a224e6e92f244e2c3e9a5cdb935eb8613d7e85b]
   to [9c43d30145f0292d6ceda5e717e366fdead5a4d6]

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

patch "src/selectors.cc"
 from [3efba0ce3139290b4088cea0d6e82a912565471e]
   to [588c6b5fd3ded29f5f778a78e707352564acbc02]

patch "src/sha1.cc"
 from [5e1aa972d7c7d66e06320b039989652b830dcd75]
   to [42e48b22fd88b25e0d38d4f91e1f13f8a83c7120]

patch "src/ssh_agent.cc"
 from [6d188e7012a0b82f782563b09bbd7adf3f70cf75]
   to [4a0dcab873559e934e41c5f220b5434d35600d9b]

patch "src/transforms.cc"
 from [cdfb6854ef4992faba21074145f3c8269b845b11]
   to [b99278ffe95c0081bf4986bc74d3699c37a52948]

patch "test/func/attr_mtn_execute/__driver__.lua"
 from [ac0c1f7ecf54690607e55d5aa43544c023e3700c]
   to [b5bfcf8f4fdb98c59f95da35b93e7d97d08b99e7]

patch "test/func/branch_leaves_sync_bug/__driver__.lua"
 from [6b227867aeb3692dba4e68efdfe5c59ff5c15919]
   to [943c3f2d7c3294e5da221d44911c08511058acb2]

patch "test/func/clone_aborts_on_branch_pattern_in_uri/__driver__.lua"
 from [bf16d8dcec86e4ae012d1c6078082f9d13a9fd80]
   to [e75946886b2b0b4ee301016860238e6315c22a59]

patch "test/func/clone_branch_no_dir/__driver__.lua"
 from [b490cd593cefd9aa0b4dec9ab177eb72c3fb8058]
   to [1ab33d8f6d1bdc38d3804d8fcd41b6c2f65a6e61]

patch "test/func/clone_creates__MTN_log/__driver__.lua"
 from [5a8fe703d56ea39db22dcfbe6183294c1eb3f01b]
   to [b412d2f37df048846fc1f76ab62572d4c39b0796]

patch "test/func/clone_creates_right__MTN_options/__driver__.lua"
 from [12e86831366aa0f5573d1ec511872b6f9034aeb2]
   to [9891e77e30b8830f8040bcb817a0db26a433c9dd]

patch "test/func/clone_validates_target_directory/__driver__.lua"
 from [1286723ee00ea9ea6831e12575ba7ac32a066645]
   to [0c6f70282431ed62359ad0b4a827575406889f4b]

patch "test/func/clone_warning_with_multiple_heads/__driver__.lua"
 from [4333c6de0518517ff9bc04b4baef0d2d5ff08914]
   to [18e8670ea08dcb9602425ebdb97a786b20945ff6]

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

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

patch "test/func/imp_test_filesync_confdir/__driver__.lua"
 from [5262dae96bcf38a2a27cea3d17523e08ad3e03aa]
   to [19822aa249d9300dc8695f41adbd12cbce5a9234]

patch "test/func/netsync_over_pipes/__driver__.lua"
 from [e4ee774912c36ca34a2bfe897daecac570f626a7]
   to [e769e909c59f15351c957a47d98bd7be5868e9f7]

patch "test/func/serve-automate/__driver__.lua"
 from [ae4b03baf16d8401f31a32c8377021f879788d01]
   to [1343490c3b79e3d936a5b72ba7561055239235f8]

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

patch "test/func/syntax_errors_in_.mtn-ignore/mtn-ignore"
 from [c46ecd3b4771b7b0af41b6caff2074df0427fbfa]
   to [55bfcaa55ef14ee091aa6279251af51121f910b9]

patch "test/func/util_mtnopt/__driver__.lua"
 from [84307ea94ec302c6d9bbe163955e8f5e86973ce0]
   to [6981b9fe1aa7800aaaf76bd18f0ddbb73b0e6046]

patch "test/src/testlib.lua"
 from [6d2a308918594226fa6549ed0268ccaea3921038]
   to [f236da6fce62c15acac578b42756b552e0453d99]

old_revision [d238d73a0c7bce35c65d1dd4612d8eae104612e9]

patch "src/unix/fs.cc"
 from [030ebb81f78bc138de3cf89e3ace8e9dcde2309c]
   to [d34f7ed4b5cf3655d7920568e4e1a146fa670e13]
============================================================
--- NEWS	ed0d68331a7ba1efb4877f7a65628a1c9f7d791c
+++ NEWS	5514332f7c16430d0c46d3fbac01b0c8a96bc412
@@ -10,17 +10,37 @@ XXX XXX XX XX:XX:XX UTC 201X
           and returns the attributes for a specific file from the
           revision's manifest
 
+        - 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
+          the testing releases in 1.9.y).
+
+        - Struct file_handle got renamed to avoid clash with newer glibc's
+          fcntl.h.
+
+        - Monotone now compiles just fine with gcc's option
+          "-Werror=format-security."
+
+        - Fixed recursive file removal on Solaris.
+
         Internal
 
-	- The performance and memory usage of regular expressions has
-	  been improved throughout. This affects any use of the
-	  ".mtn-ignore" file such as "mtn ls unknown" and "mtn add",
-	  and any calls to "regex.search" in Lua hooks.
+        - The performance and memory usage of regular expressions has
+          been improved throughout. This affects any use of the
+          ".mtn-ignore" file such as "mtn ls unknown" and "mtn add",
+          and any calls to "regex.search" in Lua hooks.
 
         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	5d233f3ae943361cf83d586209e6ff04c083c9de
+++ doc/monotone.texi	e0b88a30f08867f9e0f593e5004789ca17753a94
@@ -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))},
@@ -4799,7 +4807,9 @@ @subsection Global Options
 
 @item --xargs <arg>
 @itemx -@@ <arg>
-Insert command line arguments taken from the given file.
+Insert command line arguments taken from the given file. A '-'
+can be used to read the arguments from standard input.
+e.g. @code{--xargs=-}
 @end ftable
 
 @node Common Options,  , Global Options, Global and Common Options
============================================================
--- extra/mtn-hooks/monotone-buildbot.lua	41d82aee6613c5d1775fd8ebf97ffd0c29ea807c
+++ extra/mtn-hooks/monotone-buildbot.lua	d1439935004ff6fb523dfa6b2c5fd5c8641339ab
@@ -10,6 +10,8 @@
 --     - initial version
 -- 0.2 (2011-03-11) Richard Levitte <address@hidden>
 --     - updated to have things more protected
+-- 0.3 (2012-04-10) Markus Wanner <address@hidden>
+--     - adapt to buildbot 0.8.3 and newer
 --
 -- License: GPL
 --
@@ -58,17 +60,21 @@ do
 	    end
 	 end
 
+    -- Note: for buildbot versions before 0.8.3, you need to give a
+    -- 'username' argument instead of 'auth' and 'who'.
 	 print("monotone-buildbot-notification: Running script:",
 	       buildbot_bin, "sendchange",
 	       "--master", buildbot_master,
-	       "--username", "'"..author.."'",
+	       "--auth", "change:changepw",
+	       "--who", "'"..author.."'",
 	       "--revision", rev_id,
 	       "--comments", "'"..changelog.."'",
 	       "--branch", branch,
 	       touched_files)
 	 execute(buildbot_bin, "sendchange",
 		 "--master", buildbot_master,
-		 "--username", author,
+		 "--auth", "change:changepw",
+		 "--who", "'"..author.."'",
 		 "--revision", rev_id,
 		 "--comments", changelog,
 		 "--branch", branch,
============================================================
--- innosetup/README.txt	a42923bdd0fcc96ba589bf5e3b4e229fc98ae598
+++ innosetup/README.txt	2d4c16c9b1fc3da9d98e3d4806911490f876ef62
@@ -15,7 +15,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> monotone-<version>
+mtn -d /path/to/monotone.db checkout -r t:monotone-<version> --branch net.venge.monotone monotone-<version>
 
 Build the release. See the last instruction in ../INSTALL_windows_native.txt
 Then build the installer:
============================================================
--- 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/database.cc	4c259f963c440fc95564dfec99b2f832f0bad643
+++ src/database.cc	87efeeff2d3263ba98af684a4022f1897434ed2d
@@ -3425,9 +3425,8 @@ database::encrypt_rsa(key_id const & pub
   rsa_pub_key pub;
   get_key(pub_id, pub);
 
-  SecureVector<Botan::byte> pub_block;
-  pub_block.set(reinterpret_cast<Botan::byte const *>(pub().data()),
-                pub().size());
+  SecureVector<Botan::byte> pub_block
+    (reinterpret_cast<Botan::byte const *>(pub().data()), pub().size());
 
   shared_ptr<X509_PublicKey> x509_key(Botan::X509::load_key(pub_block));
   shared_ptr<RSA_PublicKey> pub_key
@@ -3471,14 +3470,13 @@ database::check_signature(key_id const &
   else
     {
       rsa_pub_key pub;
-      SecureVector<Botan::byte> pub_block;
 
       if (!public_key_exists(id))
         return cert_unknown;
 
       get_key(id, pub);
-      pub_block.set(reinterpret_cast<Botan::byte const *>(pub().data()),
-                    pub().size());
+      SecureVector<Botan::byte> pub_block
+        (reinterpret_cast<Botan::byte const *>(pub().data()), pub().size());
 
       L(FL("building verifier for %d-byte pub key") % pub_block.size());
       shared_ptr<X509_PublicKey> x509_key(Botan::X509::load_key(pub_block));
============================================================
--- src/gzip.cc	e7c19bee910e3d421fd073933810ec52092b1d9b
+++ src/gzip.cc	9da41f6820cdf39707b22c716e3682e0fa0fd745
@@ -110,7 +110,7 @@ Gzip_Compression::Gzip_Compression(u32bi
    if(deflateInit2(&(zlib->stream), level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY) != Z_OK)
       {
       delete zlib; zlib = 0;
-      throw Exception("Gzip_Compression: Memory allocation error");
+      throw Memory_Exhaustion();
       }
    }
 
@@ -137,7 +137,7 @@ void Gzip_Compression::start_msg()
 /*************************************************
 * Compress Input with Gzip                       *
 *************************************************/
-void Gzip_Compression::write(const byte input[], u32bit length)
+void Gzip_Compression::write(const byte input[], filter_length_t length)
    {
 
    count += length;
@@ -152,7 +152,7 @@ void Gzip_Compression::write(const byte 
       zlib->stream.avail_out = buffer.size();
       int rc = deflate(&(zlib->stream), Z_NO_FLUSH);
       if (rc != Z_OK && rc != Z_STREAM_END)
-         throw Exception("Internal error in Gzip_Compression deflate.");
+         throw Invalid_State("Internal error in Gzip_Compression deflate.");
       send(buffer.begin(), buffer.size() - zlib->stream.avail_out);
       }
    }
@@ -172,7 +172,7 @@ void Gzip_Compression::end_msg()
       zlib->stream.avail_out = buffer.size();
       rc = deflate(&(zlib->stream), Z_FINISH);
       if (rc != Z_OK && rc != Z_STREAM_END)
-         throw Exception("Internal error in Gzip_Compression finishing deflate.");
+         throw Invalid_State("Internal error in Gzip_Compression finishing deflate.");
       send(buffer.begin(), buffer.size() - zlib->stream.avail_out);
       }
 
@@ -228,7 +228,7 @@ Gzip_Decompression::Gzip_Decompression()
    no_writes(true), pipe(new Hash_Filter("CRC32")), footer(0)
    {
    if (DEFAULT_BUFFERSIZE < sizeof(GZIP::GZIP_HEADER))
-      throw Exception("DEFAULT_BUFFERSIZE is too small");
+      throw Decoding_Error("DEFAULT_BUFFERSIZE is too small");
 
    zlib = new Zlib_Stream;
 
@@ -237,7 +237,7 @@ Gzip_Decompression::Gzip_Decompression()
    if(inflateInit2(&(zlib->stream), -15) != Z_OK)
       {
       delete zlib; zlib = 0;
-      throw Exception("Gzip_Decompression: Memory allocation error");
+      throw Memory_Exhaustion();
       }
    }
 
@@ -256,7 +256,7 @@ void Gzip_Decompression::start_msg()
 void Gzip_Decompression::start_msg()
    {
    if (!no_writes)
-      throw Exception("Gzip_Decompression: start_msg after already writing");
+      throw Decoding_Error("Gzip_Decompression: start_msg after already writing");
 
    pipe.start_msg();
    datacount = 0;
@@ -267,7 +267,7 @@ void Gzip_Decompression::start_msg()
 /*************************************************
 * Decompress Input with Gzip                     *
 *************************************************/
-void Gzip_Decompression::write(const byte input[], u32bit length)
+void Gzip_Decompression::write(const byte input[], filter_length_t length)
    {
    if(length) no_writes = false;
 
@@ -277,15 +277,16 @@ void Gzip_Decompression::write(const byt
          u32bit eat_len = eat_footer(input, length);
          input += eat_len;
          length -= eat_len;
-         if (length == 0)
-            return;
       }
 
+   if (length == 0)
+     return;
+
    // Check the gzip header
    if (pos < sizeof(GZIP::GZIP_HEADER))
       {
-      u32bit len = std::min((u32bit)sizeof(GZIP::GZIP_HEADER)-pos, length);
-      u32bit cmplen = len;
+      filter_length_t len = std::min((filter_length_t)sizeof(GZIP::GZIP_HEADER)-pos, length);
+      filter_length_t cmplen = len;
       // The last byte is the OS flag - we don't care about that
       if (pos + len - 1 >= GZIP::HEADER_POS_OS)
          cmplen--;
@@ -317,8 +318,8 @@ void Gzip_Decompression::write(const byt
          if(rc == Z_NEED_DICT)
             throw Decoding_Error("Gzip_Decompression: Need preset dictionary");
          if(rc == Z_MEM_ERROR)
-            throw Exception("Gzip_Decompression: Memory allocation error");
-         throw Exception("Gzip_Decompression: Unknown decompress error");
+            throw Memory_Exhaustion();
+         throw Decoding_Error("Gzip_Decompression: Unknown decompress error");
          }
       send(buffer.begin(), buffer.size() - zlib->stream.avail_out);
       pipe.write(buffer.begin(), buffer.size() - zlib->stream.avail_out);
@@ -346,8 +347,14 @@ u32bit Gzip_Decompression::eat_footer(co
       if (footer.size() >= GZIP::FOOTER_LENGTH)
          throw Decoding_Error("Gzip_Decompression: Data integrity error in footer");
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+      size_t eat_len = std::min(GZIP::FOOTER_LENGTH-footer.size(),
+                                static_cast<size_t>(length));
+      footer += std::make_pair(input, eat_len);
+#else
       u32bit eat_len = std::min(GZIP::FOOTER_LENGTH-footer.size(), length);
       footer.append(input, eat_len);
+#endif
 
       if (footer.size() == GZIP::FOOTER_LENGTH)
          {
@@ -364,7 +371,7 @@ void Gzip_Decompression::check_footer()
 void Gzip_Decompression::check_footer()
    {
    if (footer.size() != GZIP::FOOTER_LENGTH)
-      throw Exception("Gzip_Decompression: Error finalizing decompression");
+      throw Decoding_Error("Gzip_Decompression: Error finalizing decompression");
 
    pipe.end_msg();
 
@@ -377,7 +384,12 @@ void Gzip_Decompression::check_footer()
   for (int i = 0; i < 4; i++)
      buf[3-i] = tmpbuf[i];
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+  tmpbuf.resize(4);
+  tmpbuf.copy(footer.begin(), 4);
+#else
   tmpbuf.set(footer.begin(), 4);
+#endif
   if (buf != tmpbuf)
       throw Decoding_Error("Gzip_Decompression: Data integrity error - CRC32 error");
 
@@ -400,7 +412,7 @@ void Gzip_Decompression::end_msg()
    // read, clear() will reset no_writes
    if(no_writes) return;
 
-   throw Exception("Gzip_Decompression: didn't find footer");
+   throw Decoding_Error("Gzip_Decompression: didn't find footer");
 
    }
 
@@ -412,7 +424,11 @@ void Gzip_Decompression::clear()
    no_writes = true;
    inflateReset(&(zlib->stream));
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+   footer.clear();
+#else
    footer.destroy();
+#endif
    pos = 0;
    datacount = 0;
    }
============================================================
--- src/gzip.hh	649dfc0b250954f39c0f73870f8bec3f32f7fa43
+++ src/gzip.hh	17093f66e365b3730a49ef1910295f622972c36e
@@ -7,11 +7,25 @@
 #ifndef BOTAN_EXT_GZIP_H__
 #define BOTAN_EXT_GZIP_H__
 
+#include <botan/version.h>
 #include <botan/filter.h>
 #include <botan/pipe.h>
 
 namespace Botan {
 
+#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 {
 
    /* A basic header - we only need to set the IDs and compression method */
@@ -30,13 +44,19 @@ namespace GZIP {
 
 }
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+typedef size_t filter_length_t;
+#else
+typedef u32bit filter_length_t;
+#endif
+
 /*************************************************
 * Gzip Compression Filter                        *
 *************************************************/
 class Gzip_Compression : public Filter
    {
    public:
-      void write(const byte input[], u32bit length);
+      void write(const byte input[], filter_length_t length);
       void start_msg();
       void end_msg();
       std::string name() const { return "Gzip_Compression"; }
@@ -60,7 +80,7 @@ class Gzip_Decompression : public Filter
 class Gzip_Decompression : public Filter
    {
    public:
-      void write(const byte input[], u32bit length);
+      void write(const byte input[], filter_length_t length);
       void start_msg();
       void end_msg();
       std::string name() const { return "Gzip_Decompression"; }
============================================================
--- src/key_packet.cc	d1306df89dd684badac02c03744cd446381c07d3
+++ src/key_packet.cc	c97262d161b23c9640972188979669b3e95afe7b
@@ -106,8 +106,8 @@ namespace
     void validate_public_key_data(string const & name, string const & keydata) const
     {
       string decoded = decode_base64_as<string>(keydata, origin::user);
-      Botan::SecureVector<Botan::byte> key_block;
-      key_block.set(reinterpret_cast<Botan::byte const *>(decoded.c_str()), decoded.size());
+      Botan::SecureVector<Botan::byte> key_block
+        (reinterpret_cast<Botan::byte const *>(decoded.c_str()), decoded.size());
       try
         {
           Botan::X509::load_key(key_block);
============================================================
--- src/key_store.cc	64c4c4bed1fadc26b51207b9f61343f9dd7d3c6e
+++ src/key_store.cc	b7859345f7c665914d16357409bdff24a48b7996
@@ -572,13 +572,21 @@ key_store_state::decrypt_private_key(key
   try // with empty passphrase
     {
       Botan::DataSource_Memory ds(kp.priv());
-#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7)
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+      pkcs8_key.reset(Botan::PKCS8::load_key(ds, lazy_rng::get(), Dummy_UI()));
+#elif BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7)
       pkcs8_key.reset(Botan::PKCS8::load_key(ds, lazy_rng::get(), ""));
 #else
       pkcs8_key.reset(Botan::PKCS8::load_key(ds, ""));
 #endif
     }
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+  catch (Passphrase_Required & e)
+#elif BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4)
+  catch (Botan::Invalid_Argument & e)
+#else
   catch (Botan::Exception & e)
+#endif
     {
       L(FL("failed to load key with no passphrase: %s") % e.what());
 
@@ -605,13 +613,18 @@ key_store_state::decrypt_private_key(key
           {
             Botan::DataSource_Memory ds(kp.priv());
 #if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7)
-            pkcs8_key.reset(Botan::PKCS8::load_key(ds, lazy_rng::get(), phrase()));
+            pkcs8_key.reset(Botan::PKCS8::load_key(ds, lazy_rng::get(),
+                                                   phrase()));
 #else
             pkcs8_key.reset(Botan::PKCS8::load_key(ds, phrase()));
 #endif
             break;
           }
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4)
+        catch (Botan::Invalid_Argument)
+#else
         catch (Botan::Exception & e)
+#endif
           {
             cycles++;
             L(FL("decrypt_private_key: failure %d to load encrypted key: %s")
@@ -822,10 +835,14 @@ key_store::decrypt_rsa(key_id const & id
       plaintext = string(reinterpret_cast<char const*>(plain.begin()),
                          plain.size());
     }
-  catch (Botan::Exception & ex)
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4)
+  catch (std::exception & e)
+#else
+  catch (Botan::Exception & e)
+#endif
     {
       E(false, ciphertext.made_from,
-        F("Botan error decrypting data: '%s'") % ex.what());
+        F("Botan error decrypting data: '%s'") % e.what());
     }
 }
 
@@ -856,9 +873,9 @@ key_store::make_signature(database & db,
     {
       if (agent.connected()) {
         //grab the monotone public key as an RSA_PublicKey
-        SecureVector<Botan::byte> pub_block;
-        pub_block.set(reinterpret_cast<Botan::byte const *>(key.pub().data()),
-                      key.pub().size());
+        SecureVector<Botan::byte> pub_block
+          (reinterpret_cast<Botan::byte const *>(key.pub().data()),
+           key.pub().size());
         L(FL("make_signature: building %d-byte pub key") % pub_block.size());
         shared_ptr<X509_PublicKey> x509_key =
           shared_ptr<X509_PublicKey>(Botan::X509::load_key(pub_block));
@@ -1031,8 +1048,14 @@ key_store_state::migrate_old_key_pair
   for (;;)
     try
       {
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+        arc4_key.resize(phrase().size());
+        arc4_key.copy(reinterpret_cast<Botan::byte const *>(phrase().data()),
+                      phrase().size());
+#else
         arc4_key.set(reinterpret_cast<Botan::byte const *>(phrase().data()),
                      phrase().size());
+#endif
 
         Pipe arc4_decryptor(get_cipher("ARC4", arc4_key, Botan::DECRYPTION));
 
@@ -1051,7 +1074,11 @@ key_store_state::migrate_old_key_pair
 #endif
         break;
       }
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4)
+    catch (Botan::Invalid_Argument & e)
+#else
     catch (Botan::Exception & e)
+#endif
       {
         L(FL("migrate_old_key_pair: failure %d to load old private key: %s")
           % cycles % e.what());
============================================================
--- src/monotone.cc	a25ecdd170a601db798b63a60add7681609a34c4
+++ src/monotone.cc	764bc9ca406b41d21efd552a0d810bc2849e0588
@@ -156,27 +156,53 @@ cpp_main(int argc, char ** argv)
       E(linked_botan_version != BOTAN_VERSION_CODE_FOR(1,7,14), origin::system,
         F("monotone does not support Botan 1.7.14"));
 
-#if BOTAN_VERSION_CODE <= BOTAN_VERSION_CODE_FOR(1,7,6)
+      // In Botan 1.9.9, the DataSink_Stream cannot be instantiated per
+      // se. As 1.10.1 is already out, let's simply disable support for
+      // that specific (testing) version of botan.
+      E(linked_botan_version != BOTAN_VERSION_CODE_FOR(1,9,9), origin::system,
+        F("monotone does not support Botan 1.9.9"));
+
+#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,7,7)
+      // motonote binary compiled against botan younger than 1.7.7
       E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,6,3), origin::system,
         F("this monotone binary requires Botan 1.6.3 or newer"));
-      E(linked_botan_version <= BOTAN_VERSION_CODE_FOR(1,7,6), origin::system,
-        F("this monotone binary does not work with Botan newer than 1.7.6"));
-#elif BOTAN_VERSION_CODE <= BOTAN_VERSION_CODE_FOR(1,7,22)
-      E(linked_botan_version > BOTAN_VERSION_CODE_FOR(1,7,6), origin::system,
+      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,7,7), origin::system,
+        F("this monotone binary does not work with Botan 1.7.7 or newer"));
+
+#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,7,22)
+      // motonote binary compiled against botan 1.7.7 - 1.7.21
+      E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,7,7), origin::system,
         F("this monotone binary requires Botan 1.7.7 or newer"));
-      // While compiling against 1.7.22 or newer is recommended, because
-      // it enables new features of Botan, the monotone binary compiled
-      // against Botan 1.7.21 and before should still work with newer Botan
-      // versions, including all of the stable branch 1.8.x.
-      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,0), origin::system,
-        F("this monotone binary does not work with Botan 1.9.x"));
-#else
-      E(linked_botan_version > BOTAN_VERSION_CODE_FOR(1,7,22), origin::system,
+      // While compiling against 1.7.22 or newer is recommended, because it
+      // enables new features of Botan, the monotone binary compiled against
+      // Botan 1.7.21 and before should still work with newer Botan version,
+      // including all of the stable branch 1.8.x, up to and including
+      // 1.9.3.
+      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,4), origin::system,
+        F("this monotone binary does not work with Botan 1.9.4 or newer"));
+
+#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,4)
+      // motonote binary compiled against botan 1.7.22 - 1.9.3
+      E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,7,22), origin::system,
         F("this monotone binary requires Botan 1.7.22 or newer"));
-      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,0), origin::system,
-        F("this monotone binary does not work with Botan 1.9.x"));
+      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,4), origin::system,
+        F("this monotone binary does not work with Botan 1.9.4 or newer"));
+
+#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,11)
+      // motonote binary compiled against botan 1.9.4 - 1.9.10
+#pragma message ( "The resulting monotone binary won't be able to run with any stable release of botan." )
+      E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,9,4), origin::system,
+        F("this monotone binary requires Botan 1.9.4 or newer"));
+      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,11), origin::system,
+        F("this monotone binary does not work with Botan 1.9.11 or newer"));
+
+#else
+      // motonote binary compiled against botan 1.9.11 and newer
+      E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,9,11), origin::system,
+        F("this monotone binary requires Botan 1.9.11 or newer"));
 #endif
 
+
       app_state app;
       try
         {
============================================================
--- src/netxx/serverbase.cxx	7a9b465ce4b0b02cb8ff126acf86d3896b4eb456
+++ src/netxx/serverbase.cxx	156f2090341d2a36bdb718e7c69df58f9251983e
@@ -44,6 +44,8 @@
 #include "probeinfo.h"
 #include "socket.h"
 
+#include <cerrno>
+
 // standard includes
 #include <map>
 #include <vector>
@@ -167,13 +169,26 @@ void Netxx::ServerBase::bind_to(const Ad
 		if (saun->sun_path[0] == '/') {
 		    files_.push_back(saun->sun_path);
 		} else {
-		    char buffer[MAXPATHLEN];
+		    // BIG FAT WARNING: THIS CODE HAS NOT BEEN TESTED!
+		    // The original code is non-dynamic, depending on
+		    // the value of MAXPATHLEN.  Since that macro isn't
+		    // guaranteed to exist, a more dynamic use if getcwd()
+		    // was written.  However, since monotone doesn't use
+		    // AF_LOCAL sockets, this code will not be reached.
+		    int e = ERANGE;
+		    int n = 4096;
 
-		    if (getcwd(buffer, sizeof(buffer))) {
- 			std::string fullpath = buffer; fullpath += '/'; fullpath += saun->sun_path;
-			files_.push_back(fullpath);
-		    } else {
-			files_.push_back(saun->sun_path);
+		    while (e == ERANGE) {
+			char buffer[n];
+			e = 0;
+			n += 4096;
+
+			if (getcwd(buffer, n)) {
+			    std::string fullpath = buffer; fullpath += '/'; fullpath += saun->sun_path;
+			    files_.push_back(fullpath);
+			} else if ((e = errno) != ERANGE) {
+			    files_.push_back(saun->sun_path);
+			}
 		    }
 		}
 	    }
============================================================
--- src/packet.cc	f61360ed2524fdf53411bd24d022a2a3c9e6e9c7
+++ src/packet.cc	571ff6eae1d269a146da74f2730b70376957d3bb
@@ -156,8 +156,8 @@ namespace
     void validate_public_key_data(string const & name, string const & keydata) const
     {
       string decoded = decode_base64_as<string>(keydata, origin::user);
-      Botan::SecureVector<Botan::byte> key_block;
-      key_block.set(reinterpret_cast<Botan::byte const *>(decoded.c_str()), decoded.size());
+      Botan::SecureVector<Botan::byte> key_block
+        (reinterpret_cast<Botan::byte const *>(decoded.c_str()), decoded.size());
       try
         {
           Botan::X509::load_key(key_block);
@@ -175,7 +175,9 @@ namespace
       Botan::DataSource_Memory ds(decoded);
       try
         {
-#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7)
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+          Botan::PKCS8::load_key(ds, lazy_rng::get(), Dummy_UI());
+#elif BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7)
           Botan::PKCS8::load_key(ds, lazy_rng::get(), string());
 #else
           Botan::PKCS8::load_key(ds, string());
@@ -189,7 +191,11 @@ namespace
         }
       // since we do not want to prompt for a password to decode it finally,
       // we ignore all other exceptions
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+      catch (Passphrase_Required) {}
+#else
       catch (Botan::Invalid_Argument) {}
+#endif
     }
     void validate_certname(string const & cn) const
     {
@@ -460,8 +466,16 @@ read_packets(istream & in, packet_consum
   return count;
 }
 
+// Dummy User_Interface implementation for Botan
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+std::string
+Dummy_UI::get_passphrase(const std::string &, const std::string &,
+                         Botan::User_Interface::UI_Result&) const
+{
+  throw Passphrase_Required("Passphrase required");
+}
+#endif
 
-
 // Local Variables:
 // mode: C++
 // fill-column: 76
============================================================
--- src/packet.hh	0a224e6e92f244e2c3e9a5cdb935eb8613d7e85b
+++ src/packet.hh	9c43d30145f0292d6ceda5e717e366fdead5a4d6
@@ -10,6 +10,10 @@
 #ifndef __PACKET_HH__
 #define __PACKET_HH__
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+#include <botan/ui.h>
+#endif
+
 #include "vocab.hh"
 
 struct cert;
@@ -84,8 +88,23 @@ size_t read_packets(std::istream & in, p
 
 size_t read_packets(std::istream & in, packet_consumer & cons);
 
+#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11)
+// A helper class implementing Botan::User_Interface - which doesn't really
+// interface with the user, but provides the necessary plumbing for Botan.
+//
+// See Botan commit 2d09d7d0cd4bd0e7155d001dd65a4f29103b158c
+typedef std::runtime_error Passphrase_Required;
+
+class Dummy_UI : public Botan::User_Interface
+{
+public:
+  virtual std::string get_passphrase(const std::string &, const std::string &,
+                                     Botan::User_Interface::UI_Result &) const;
+};
 #endif
 
+#endif
+
 // Local Variables:
 // mode: C++
 // fill-column: 76
============================================================
--- 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/selectors.cc	3efba0ce3139290b4088cea0d6e82a912565471e
+++ src/selectors.cc	588c6b5fd3ded29f5f778a78e707352564acbc02
@@ -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());
============================================================
--- src/sha1.cc	5e1aa972d7c7d66e06320b039989652b830dcd75
+++ src/sha1.cc	42e48b22fd88b25e0d38d4f91e1f13f8a83c7120
@@ -50,9 +50,12 @@ CMD_HIDDEN(benchmark_sha1, "benchmark_sh
   Botan::Default_Benchmark_Timer timer;
   std::map<std::string, double> results =
     Botan::algorithm_benchmark("SHA-1",  milliseconds, timer, rng, af);
+#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,11)
+  std::map<std::string, double> results =
+    Botan::algorithm_benchmark("SHA-1",  milliseconds, rng, af);
 #else
   std::map<std::string, double> results =
-    Botan::algorithm_benchmark("SHA-1",  milliseconds, rng, af);
+    Botan::algorithm_benchmark("SHA-1",  af, rng, milliseconds, 16);
 #endif
 
   for(std::map<std::string, double>::const_iterator i = results.begin();
============================================================
--- src/ssh_agent.cc	6d188e7012a0b82f782563b09bbd7adf3f70cf75
+++ src/ssh_agent.cc	4a0dcab873559e934e41c5f220b5434d35600d9b
@@ -385,9 +385,9 @@ ssh_agent::has_key(const keypair & key)
 ssh_agent::has_key(const keypair & key)
 {
   //grab the monotone public key as an RSA_PublicKey
-  SecureVector<Botan::byte> pub_block;
-  pub_block.set(reinterpret_cast<Botan::byte const *>((key.pub)().data()),
-                (key.pub)().size());
+  SecureVector<Botan::byte> pub_block
+    (reinterpret_cast<Botan::byte const *>((key.pub)().data()),
+     (key.pub)().size());
   L(FL("has_key: building %d-byte pub key") % pub_block.size());
   shared_ptr<X509_PublicKey> x509_key =
     shared_ptr<X509_PublicKey>(Botan::X509::load_key(pub_block));
============================================================
--- src/transforms.cc	cdfb6854ef4992faba21074145f3c8269b845b11
+++ src/transforms.cc	b99278ffe95c0081bf4986bc74d3699c37a52948
@@ -53,15 +53,16 @@ using Botan::Hash_Filter;
 // paradigm "must" be used. this program is intended for source code
 // control and I make no bones about it.
 
-NORETURN(static inline void error_in_transform(Botan::Exception & e));
+NORETURN(static inline void error_in_transform(std::exception & e));
 
 static inline void
-error_in_transform(Botan::Exception & e, origin::type caused_by)
+error_in_transform(std::exception & e, origin::type caused_by)
 {
   // these classes can all indicate data corruption
   if (typeid(e) == typeid(Botan::Encoding_Error)
       || typeid(e) == typeid(Botan::Decoding_Error)
       || typeid(e) == typeid(Botan::Stream_IO_Error)
+      || typeid(e) == typeid(Botan::Invalid_Argument)
       || typeid(e) == typeid(Botan::Integrity_Failure))
     {
       // clean up the what() string a little: throw away the
@@ -107,7 +108,7 @@ error_in_transform(Botan::Exception & e,
         pipe->process_msg(in);                                  \
         out = pipe->read_all_as_string(Pipe::LAST_MESSAGE);     \
       }                                                         \
-    catch (Botan::Exception & e)                                \
+    catch (std::exception & e)                                   \
       {                                                         \
         pipe.reset(new Pipe(new T(carg)));                      \
         error_in_transform(e, made_from);                       \
@@ -173,7 +174,7 @@ template<> string xform<Botan::Hex_Decod
             {
               throw Botan::Decoding_Error(string("invalid hex character '") + (char)c + "'");
             }
-          catch(Botan::Exception & e)
+          catch(std::exception & e)
             {
               error_in_transform(e, made_from);
             }
@@ -219,7 +220,7 @@ void pack(T const & in, base64< gzip<T> 
       tmp = pipe->read_all_as_string(Pipe::LAST_MESSAGE);
       out = base64< gzip<T> >(tmp, in.made_from);
     }
-  catch (Botan::Exception & e)
+  catch (std::exception & e)
     {
       pipe.reset(new Pipe(new Gzip_Compression,
                           new Base64_Encoder));
@@ -237,7 +238,7 @@ void unpack(base64< gzip<T> > const & in
       pipe->process_msg(in());
       out = T(pipe->read_all_as_string(Pipe::LAST_MESSAGE), in.made_from);
     }
-  catch (Botan::Exception & e)
+  catch (std::exception & e)
     {
       pipe.reset(new Pipe(new Base64_Decoder,
                           new Gzip_Decompression));
@@ -264,7 +265,7 @@ calculate_ident(data const & dat,
       p->process_msg(dat());
       ident = id(p->read_all_as_string(Pipe::LAST_MESSAGE), dat.made_from);
     }
-  catch (Botan::Exception & e)
+  catch (std::exception & e)
     {
       p.reset(new Pipe(new Hash_Filter("SHA-160")));
       error_in_transform(e, dat.made_from);
============================================================
--- test/func/attr_mtn_execute/__driver__.lua	ac0c1f7ecf54690607e55d5aa43544c023e3700c
+++ test/func/attr_mtn_execute/__driver__.lua	b5bfcf8f4fdb98c59f95da35b93e7d97d08b99e7
@@ -30,7 +30,7 @@ copy("test.db", "test-clone.db")
 -- test clone with mtn:execute
 
 copy("test.db", "test-clone.db")
-testURI="file://" .. test.root .. "/test-clone.db?testbranch"
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?testbranch"
 
-check(nodb_mtn("clone", testURI, "clone"), 0, false, true)
+check(nodb_mtn("clone", test_uri, "clone"), 0, false, true)
 check(indir("clone", {"test", "-x","foo"}, 0, false, false))
============================================================
--- test/func/branch_leaves_sync_bug/__driver__.lua	6b227867aeb3692dba4e68efdfe5c59ff5c15919
+++ test/func/branch_leaves_sync_bug/__driver__.lua	943c3f2d7c3294e5da221d44911c08511058acb2
@@ -46,7 +46,9 @@ chdir(test.root)
 
 -- Create Beth's workspace via checkout, so 'update' works
 chdir(test.root)
-check(abe_mtn("sync", "file://" .. test.root .. "/beth.db?*"), 0, false, false)
+
+test_uri="file://" .. url_encode_path(test.root .. "/beth.db") .. "?*"
+check(abe_mtn("sync", test_uri), 0, false, false)
 check(beth_mtn("checkout", "--branch", "testbranch", "Beth"), 0, false, false)
 chdir("Beth")
 check(beth_mtn("genkey", "address@hidden"), 0, false, false, string.rep("address@hidden", 2))
@@ -64,7 +66,7 @@ rev_b = base_revision()
 rev_b = base_revision()
 
 -- Sync dbs
-check(abe_mtn("sync", "file://" .. test.root .. "/beth.db?*"), 0, false, false)
+check(abe_mtn("sync", test_uri), 0, false, false)
 
 -- Abe merges
 chdir("Abe")
@@ -80,7 +82,8 @@ rev_d = base_revision()
 rev_d = base_revision()
 
 -- Sync dbs (not clear if direction of sync matters)
-check(beth_mtn("sync", "file://" .. test.root .. "/abe.db?*"), 0, false, false)
+test_uri="file://" .. url_encode_path(test.root .. "/abe.db") .. "?*"
+check(beth_mtn("sync", test_uri), 0, false, false)
 
 -- bug; rev_d and rev_c are both heads according to branch_leaves table.
 check(beth_mtn("db", "check"), 0, false, false)
============================================================
--- test/func/clone_aborts_on_branch_pattern_in_uri/__driver__.lua	bf16d8dcec86e4ae012d1c6078082f9d13a9fd80
+++ test/func/clone_aborts_on_branch_pattern_in_uri/__driver__.lua	e75946886b2b0b4ee301016860238e6315c22a59
@@ -6,9 +6,9 @@ copy("test.db", "test-clone.db")
 commit("mybranch")
 
 copy("test.db", "test-clone.db")
-testURI="file://" .. test.root .. "/test-clone.db?mybranch*"
 
-check(nodb_mtn("clone", testURI), 1, false, true)
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?mybranch*"
+check(nodb_mtn("clone", test_uri), 1, false, true)
 check(qgrep("you must specify an unambiguous branch to clone", "stderr"))
 
 -- the branch option is invalid in non-URI mode
@@ -16,7 +16,7 @@ check(qgrep("the '--branch' option is on
 check(qgrep("the '--branch' option is only valid with an URI to clone", "stderr"))
 
 -- finally, this should succeed
-check(nodb_mtn("clone", testURI, "--branch=mybranch"), 0, false, false)
+check(nodb_mtn("clone", test_uri, "--branch=mybranch"), 0, false, false)
 check(exists("mybranch"))
 check(readfile("foo") == readfile("mybranch/foo"))
 
============================================================
--- test/func/clone_branch_no_dir/__driver__.lua	b490cd593cefd9aa0b4dec9ab177eb72c3fb8058
+++ test/func/clone_branch_no_dir/__driver__.lua	1ab33d8f6d1bdc38d3804d8fcd41b6c2f65a6e61
@@ -6,18 +6,18 @@ copy("test.db", "test-clone.db")
 commit("mybranch")
 
 copy("test.db", "test-clone.db")
-testURI="file://" .. test.root .. "/test-clone.db?mybranch"
 
-check(nodb_mtn("clone", testURI), 0, false, false)
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?mybranch"
+check(nodb_mtn("clone", test_uri), 0, false, false)
 check(exists("mybranch"))
 check(readfile("foo") == readfile("mybranch/foo"))
 
 -- but now that that directory exists, this clone should fail
-check(nodb_mtn("clone", testURI), 1, false, false)
+check(nodb_mtn("clone", test_uri), 1, false, false)
 
 -- but succeed if given a specific dir
-check(nodb_mtn("clone", testURI, "otherdir"), 0, false, false)
+check(nodb_mtn("clone", test_uri, "otherdir"), 0, false, false)
 
 -- clone into . should not fail, like checkout
 mkdir("test4")
-check(indir("test4", nodb_mtn("clone", testURI, ".")), 0, false, false)
+check(indir("test4", nodb_mtn("clone", test_uri, ".")), 0, false, false)
============================================================
--- test/func/clone_creates__MTN_log/__driver__.lua	5a8fe703d56ea39db22dcfbe6183294c1eb3f01b
+++ test/func/clone_creates__MTN_log/__driver__.lua	b412d2f37df048846fc1f76ab62572d4c39b0796
@@ -13,9 +13,9 @@ copy("test.db", "test-clone.db")
 check(mtn("--branch=testbranch", "--rcfile=commit_log.lua", "commit"), 0, false, false)
 
 copy("test.db", "test-clone.db")
-testURI="file://" .. test.root .. "/test-clone.db?testbranch"
 
-check(nodb_mtn("clone", testURI, "testbranch"), 0, false, true)
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?testbranch"
+check(nodb_mtn("clone", test_uri, "testbranch"), 0, false, true)
 
 check(exists("testbranch/_MTN/log"))
 check(fsize("_MTN/log") == 0)
============================================================
--- test/func/clone_creates_right__MTN_options/__driver__.lua	12e86831366aa0f5573d1ec511872b6f9034aeb2
+++ test/func/clone_creates_right__MTN_options/__driver__.lua	9891e77e30b8830f8040bcb817a0db26a433c9dd
@@ -10,7 +10,7 @@ commit()
 writefile("testfile", "blah")
 commit()
 
-testURI="file://" .. test.root .. "/test-clone.db?testbranch"
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?testbranch"
 
 -- We use RAW_MTN because it used to be that passing --db= (as
 -- MTN does) would hide a bug in this functionality...
@@ -18,16 +18,17 @@ testURI="file://" .. test.root .. "/test
 -- all of these inherit options settings from the current _MTN dir
 -- unless they override them on the command line
 
-check(nodb_mtn("clone", testURI, "test_dir1"), 0, false, false)
-check(nodb_mtn("clone", "--revision", rev, testURI, "test_dir2"), 0, false, false)
-check(nodb_mtn("--db=" .. test.root .. "/test-new.db", "clone", testURI, "test_dir3"), 0, false, false)
-check(nodb_mtn("--db=" .. test.root .. "/test-new.db", "clone", testURI, "--revision", rev, "test_dir4"), 0, false, false)
+check(nodb_mtn("clone", test_uri, "test_dir1"), 0, false, false)
+check(nodb_mtn("clone", "--revision", rev, test_uri, "test_dir2"), 0, false, false)
+check(nodb_mtn("--db=" .. test.root .. "/test-new.db", "clone", test_uri, "test_dir3"), 0, false, false)
+check(nodb_mtn("--db=" .. test.root .. "/test-new.db", "clone", test_uri, "--revision", rev, "test_dir4"), 0, false, false)
 
 -- checkout fails if the specified revision is not a member of the specified branch
-testURI="file://" .. test.root .. "/test-clone.db?foobar"
-check(nodb_mtn("clone", testURI, "--revision", rev, "test_dir5"), 1, false, false)
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?foobar"
+
+check(nodb_mtn("clone", test_uri, "--revision", rev, "test_dir5"), 1, false, false)
 check(nodb_mtn("cert", rev, "branch", "foobar", "-d", "test-clone.db"), 0, false, false)
-check(nodb_mtn("clone", testURI, "--revision", rev, "test_dir6"), 0, false, false)
+check(nodb_mtn("clone", test_uri, "--revision", rev, "test_dir6"), 0, false, false)
 
 
 for i = 1,2 do
============================================================
--- test/func/clone_validates_target_directory/__driver__.lua	1286723ee00ea9ea6831e12575ba7ac32a066645
+++ test/func/clone_validates_target_directory/__driver__.lua	0c6f70282431ed62359ad0b4a827575406889f4b
@@ -6,15 +6,15 @@ copy("test.db", "test-clone.db")
 commit()
 
 copy("test.db", "test-clone.db")
-testURI="file://" .. test.root .. "/test-clone.db?testbranch"
 
-check(nodb_mtn("clone", testURI, "test_dir1"), 0, false, false)
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?testbranch"
+check(nodb_mtn("clone", test_uri, "test_dir1"), 0, false, false)
 
 writefile("test_dir2")
-check(nodb_mtn("clone", testURI, "test_dir2"), 1, false, false)
+check(nodb_mtn("clone", test_uri, "test_dir2"), 1, false, false)
 
 mkdir("test_dir3")
-check(nodb_mtn("clone", testURI, "test_dir3"), 1, false, false)
+check(nodb_mtn("clone", test_uri, "test_dir3"), 1, false, false)
 
 if existsonpath("chmod") and existsonpath("test") then
   -- skip this part if run as root (hi Gentoo!)
@@ -27,9 +27,9 @@ if existsonpath("chmod") and existsonpat
   else
     mkdir("test_dir4")
     check({"chmod", "444", "test_dir4"}, 0, false)
-    check(nodb_mtn("clone", testURI, "test_dir4"),
+    check(nodb_mtn("clone", test_uri, "test_dir4"),
              1, false, false)
-    check(nodb_mtn("clone", testURI, "test_dir4/subdir"),
+    check(nodb_mtn("clone", test_uri, "test_dir4/subdir"),
              1, false, false)
     -- Reset the permissions so Autotest can correctly clean up our
     -- temporary directory.
============================================================
--- test/func/clone_warning_with_multiple_heads/__driver__.lua	4333c6de0518517ff9bc04b4baef0d2d5ff08914
+++ test/func/clone_warning_with_multiple_heads/__driver__.lua	18e8670ea08dcb9602425ebdb97a786b20945ff6
@@ -16,9 +16,9 @@ copy("test.db", "test-clone.db")
 REV3=base_revision()
 
 copy("test.db", "test-clone.db")
-testURI="file://" .. test.root .. "/test-clone.db?testbranch"
 
-check(nodb_mtn("clone", testURI, "test_dirA"),
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") .. "?testbranch"
+check(nodb_mtn("clone", test_uri, "test_dirA"),
          1, false, true)
 check(qgrep(REV2, "stderr"))
 check(qgrep(REV3, "stderr"))
============================================================
--- test/func/clone_weird_branch_names/__driver__.lua	205c20a2809513b93ee9ab6c1affb24070f284a2
+++ test/func/clone_weird_branch_names/__driver__.lua	0afc1816afa8d3e4b2dfb9fd016500f224432f0a
@@ -6,10 +6,11 @@ copy("test.db", "test-clone.db")
 commit("my-branch[1,2]-1^3")
 
 copy("test.db", "test-clone.db")
+
 -- some of the special chars need to get double-escaped to get "through"
-testURI="file://" .. test.root .. "/test-clone.db?my-branch\\\[1,2\\\]-1^3"
-
-check(nodb_mtn("clone", testURI), 0, false, false)
+test_uri="file://" .. url_encode_path(test.root .. "/test-clone.db") ..
+  "?" .. 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/extended-selectors/__driver__.lua	435f44fb1b33bdfb53929fe6bd15ba7fa4c2c1d3
+++ test/func/extended-selectors/__driver__.lua	cab379ef6f3439ab7f5a4424202ebf9097171c4c
@@ -1,5 +1,6 @@
 -- selector functions are:
 --   difference(a,b)
+--   not(a)
 --   lca(a,b)
 --   max(a)
 --   ancestors(a)
@@ -78,6 +79,18 @@ expect("b:testbranch|b:otherbranch", roo
 expect("b:testbranch/b:otherbranch", lhs)
 expect("b:testbranch|b:otherbranch", root, lhs, rhs, m, other, other_2)
 
+-- 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/imp_test_filesync_confdir/__driver__.lua	5262dae96bcf38a2a27cea3d17523e08ad3e03aa
+++ test/func/imp_test_filesync_confdir/__driver__.lua	19822aa249d9300dc8695f41adbd12cbce5a9234
@@ -18,7 +18,8 @@ end
    rcfile:close()
 end
 
-check(mtn("sync", "file://" .. test.root .. "/test2.db?testbranch"), 0, true, false)
+test_uri="file://" .. url_encode_path(test.root .. "/test2.db") .. "?testbranch"
+check(mtn("sync", test_uri), 0, true, false)
 
 n = 0
 
============================================================
--- test/func/netsync_over_pipes/__driver__.lua	e4ee774912c36ca34a2bfe897daecac570f626a7
+++ test/func/netsync_over_pipes/__driver__.lua	e769e909c59f15351c957a47d98bd7be5868e9f7
@@ -7,6 +7,7 @@ commit()
 addfile("testfile", "foo")
 commit()
 
-check(mtn("sync", "file://" .. test.root .. "/test2.db?testbranch"), 0, false, true)
+test_uri="file://" .. url_encode_path(test.root .. "/test2.db") .. "?testbranch"
+check(mtn("sync", test_uri), 0, false, true)
 check(not qgrep("error", "stderr"))
 check_same_db_contents("test.db", "test2.db")
============================================================
--- test/func/serve-automate/__driver__.lua	ae4b03baf16d8401f31a32c8377021f879788d01
+++ test/func/serve-automate/__driver__.lua	1343490c3b79e3d936a5b72ba7561055239235f8
@@ -56,7 +56,8 @@ if ostype ~= "Windows" then
 if ostype ~= "Windows" then
 -- 'file:' not supported on Windows
 
-check(mtn2("automate", "remote_stdio", "file://" .. test.root .. "/test.db"),
+test_uri="file://" .. url_encode_path(test.root .. "/test.db")
+check(mtn2("automate", "remote_stdio", test_uri),
       0, true, false, "l17:interface_versione")
 check(parse_stdio(readfile("stdout"), 0, 0, "m") ~= nil)
 end
============================================================
--- test/func/serve-automate-single-run/__driver__.lua	01013ad10150f9056bee7609338cb09b47d8c677
+++ test/func/serve-automate-single-run/__driver__.lua	7a75e9ff02a15ebc62a44c1c596ed39e3fdae0a0
@@ -60,8 +60,9 @@ copy("allow-automate.lua", "custom_test_
 -- 'file:' not supported on Windows
 
 copy("allow-automate.lua", "custom_test_hooks.lua")
+test_uri="file://" .. url_encode_path(test.root .. "/test.db")
 check(mtn2("automate", "remote", "--remote-stdio-host",
-	   "file://"..test.root.."/test.db",
+	   test_uri,
 	   "get_file_of", "--", "-r".. R1, "foo"), 0, true, false)
 check(qgrep("bar", "stdout"))
 end
============================================================
--- test/func/syntax_errors_in_.mtn-ignore/mtn-ignore	c46ecd3b4771b7b0af41b6caff2074df0427fbfa
+++ test/func/syntax_errors_in_.mtn-ignore/mtn-ignore	55bfcaa55ef14ee091aa6279251af51121f910b9
@@ -21,7 +21,6 @@ abc\3
 [[:fnord:]]
 \\x{123456}
 (?(0))
-(?<=\C)
 \l
 (?C256)
 (?C1
============================================================
--- test/func/util_mtnopt/__driver__.lua	84307ea94ec302c6d9bbe163955e8f5e86973ce0
+++ test/func/util_mtnopt/__driver__.lua	6981b9fe1aa7800aaaf76bd18f0ddbb73b0e6046
@@ -6,6 +6,11 @@ normalized_testroot = normalize_path (te
 
 normalized_testroot = normalize_path (test.root)
 
+-- Escape regexp special characters to form a proper regexp that correctly
+-- checks for the given path.
+escaped_testroot = string.gsub(normalized_testroot, "([*+.()[\\^$|?])",
+  function (x) return "\\" .. x end)
+
 -- check default operation
 
 -- MinGW does not process the shebang in mtnopt; must invoke sh directly
@@ -13,7 +18,7 @@ check({"sh", "./mtnopt"}, 0, true)
 -- Don't pass the full /bin/sh path, it looks like that doesn't always
 -- work under mingw.
 check({"sh", "./mtnopt"}, 0, true)
-check(qgrep('^MTN_database="' .. normalized_testroot .. '/test.db";$', "stdout"))
+check(qgrep('^MTN_database="' .. escaped_testroot .. '/test.db";$', "stdout"))
 check(qgrep('^MTN_branch="testbranch";$', "stdout"))
 
 -- check operation with a specific key and just returning the value
============================================================
--- test/src/testlib.lua	6d2a308918594226fa6549ed0268ccaea3921038
+++ test/src/testlib.lua	f236da6fce62c15acac578b42756b552e0453d99
@@ -144,6 +144,22 @@ end
   return n
 end
 
+-- encodes a query by percent escaping reserved characters (as defined
+-- in RFC 3986) - except for the directory separator ('/').
+function url_encode_path(path)
+  path = string.gsub(path, "([!*'();:@&=+$,?#[%]])",
+    function (x) return string.format("%%%02X", string.byte(x)) end)
+  return string.gsub(path, " ", "+")
+end
+
+-- encodes a query by percent escaping reserved characters (as defined
+-- in RFC 3986) - except for the ampersand and equal sign ('&', '=')
+function url_encode_query(path)
+  path = string.gsub(path, "([!*'();:@+$,/?#[%]])",
+    function (x) return string.format("%%%02X", string.byte(x)) end)
+  return string.gsub(path, " ", "+")
+end
+
 function open_or_err(filename, mode, depth)
   local file, e = io.open(filename, mode)
   if file == nil then
============================================================
--- src/unix/fs.cc	030ebb81f78bc138de3cf89e3ace8e9dcde2309c
+++ src/unix/fs.cc	d34f7ed4b5cf3655d7920568e4e1a146fa670e13
@@ -1,4 +1,3 @@
-// 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
@@ -29,7 +28,6 @@
 #include "../platform.hh"
 #include "../vector.hh"
 
-using std::malloc;
 using std::string;
 using std::vector;
 
@@ -290,74 +288,11 @@ 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()))
     {
-      // 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);
-      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));
-        }
+      const int err = errno;
+      E(false, origin::system,
+        F("renaming '%s' to '%s' failed: %s") % from % to % os_strerror(err));
     }
 }
 

reply via email to

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