<pre style='margin:0'>
Chih-Hsuan Yen (yan12125) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/4725c69281496480c23053e004e965d0fca590d1">https://github.com/macports/macports-ports/commit/4725c69281496480c23053e004e965d0fca590d1</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 4725c69281496480c23053e004e965d0fca590d1
</span>Author: Chih-Hsuan Yen <yan12125@macports.org>
AuthorDate: Sat Jun 1 11:58:10 2019 +0800

<span style='display:block; white-space:pre;color:#404040;'>    monotone-devel: added for botan2 compatibility
</span>---
 devel/monotone/Portfile                  |   58 +-
 devel/monotone/files/patch-botan2.5.diff |   45 +
 devel/monotone/files/patch-botan2.9.diff | 6755 ++++++++++++++++++++++++++++++
 devel/monotone/files/patch-cstdlib.diff  |   26 +
 devel/monotone/files/patch-float128.diff |   47 +
 devel/monotone/files/patch-pid_t.diff    |   26 +
 6 files changed, 6946 insertions(+), 11 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/monotone/Portfile b/devel/monotone/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 3021eef..a057cef 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/monotone/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/monotone/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,10 +1,12 @@
</span> # -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
 
 PortSystem          1.0
<span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup           cxx11 1.1
</span> 
 name                monotone
<span style='display:block; white-space:pre;background:#ffe0e0;'>-version             1.1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-revision            5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+subport monotone-devel {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> categories          devel
 license             GPL-2+
 maintainers         nomaintainer
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -16,11 +18,6 @@ long_description    monotone is a free distributed version control system. It pr
</span>                     branches, integrated code review and 3rd party testing.
 homepage            http://www.monotone.ca/
 platforms           darwin
<span style='display:block; white-space:pre;background:#ffe0e0;'>-master_sites        ${homepage}downloads/${version}/
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-use_bzip2           yes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-checksums           rmd160  c5e0f45028b806eb166b4aaecababa8e8e81b686 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sha256  f95cf60a22d4e461bec9d0e72f5d3609c9a4576fb1cc45f553d0202ce2e38c88
</span> 
 depends_build       port:pkgconfig
 depends_lib         port:zlib \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -33,13 +30,52 @@ depends_lib         port:zlib \
</span>                     port:sqlite3 \
                     port:botan
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-patchfiles          monotone-1.1-Adapt-to-changes-in-pcre-8.42.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${name} eq ${subport}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # stable
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    version             1.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    revision            6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    master_sites        ${homepage}downloads/${version}/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    use_bzip2           yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    checksums           rmd160  c5e0f45028b806eb166b4aaecababa8e8e81b686 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  f95cf60a22d4e461bec9d0e72f5d3609c9a4576fb1cc45f553d0202ce2e38c88
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    pre-fetch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return -code error "monotone port is incompatible with the current botan. Use monotone-devel instead."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # devel
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    version             20180227
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set commit 880df7b506faa1ac84871b84629616a66bc02b84
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    revision            0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    master_sites        https://code.monotone.ca/p/monotone/source/download/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    distfiles           ${commit}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    distname            monotone-${commit}.zip
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    use_zip             yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    worksrcdir          monotone-${commit}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    extract.dir         ${worksrcpath}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    checksums           rmd160  262e74f4998f7234db7757eb1b20e5ce0e83acda \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sha256  593b186d0b3168eb12b1a14f471929a5d3bebad367bfff5f59d870e29e35f5d2 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        size    6167787
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    patchfiles-append   patch-botan2.5.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        patch-botan2.9.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        patch-float128.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        patch-cstdlib.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        patch-pid_t.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    use_autoreconf      yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.cxxflags-append   \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        -std=c++11
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles-append   monotone-1.1-Adapt-to-changes-in-pcre-8.42.patch
</span> 
 # botan is not universal
 universal_variant   no
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.args      botan_CFLAGS="-I${prefix}/include/botan-1.10" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    botan_LIBS="-lbotan-1.10"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> test.run            yes
 test.target         check
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/monotone/files/patch-botan2.5.diff b/devel/monotone/files/patch-botan2.5.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..694bb7f
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/monotone/files/patch-botan2.5.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,45 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+----------------------------------------------------------------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Revision: 8cb2147f6c474c56b6bea37f7fed2ae37ea7e155
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Parent:   880df7b506faa1ac84871b84629616a66bc02b84
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Author:   yan12125@gmail.com
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date:     西元2019年06月13日 21時15分35秒
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Branch:   net.venge.monotone
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Changelog: 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Fix building with botan 2.5+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+DEFAULT_BUFFERSIZE is renamed to BOTAN_DEFAULT_BUFFER_SIZE in this commit:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+https://github.com/randombit/botan/commit/fb44fe4f9ac094a7f223ef337796c3c4a2ed933f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Changes against parent 880df7b506faa1ac84871b84629616a66bc02b84
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/gzip.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/gzip.cc    9d7f68b36bf9039a8138317603abe37db5451d66
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/gzip.cc    7872a4ddd5d805731cfaba0a7ff743224763f3fc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -88,7 +88,7 @@ Gzip_Compression::Gzip_Compression(u32bi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Gzip_Compression Constructor                   *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *************************************************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Gzip_Compression::Gzip_Compression(u32bit l) :
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-   level((l >= 9) ? 9 : l), buffer(DEFAULT_BUFFERSIZE),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   level((l >= 9) ? 9 : l), buffer(BOTAN_DEFAULT_BUFFER_SIZE),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    pipe(new Hash_Filter("CRC32")), count( 0 )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -220,11 +220,11 @@ void Gzip_Compression::put_footer()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*************************************************
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Gzip_Decompression Constructor                 *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *************************************************/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-Gzip_Decompression::Gzip_Decompression() : buffer(DEFAULT_BUFFERSIZE),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Gzip_Decompression::Gzip_Decompression() : buffer(BOTAN_DEFAULT_BUFFER_SIZE),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    no_writes(true), pipe(new Hash_Filter("CRC32")), footer(0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-   if (DEFAULT_BUFFERSIZE < sizeof(GZIP::GZIP_HEADER))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      throw Decoding_Error("DEFAULT_BUFFERSIZE is too small");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++   if (BOTAN_DEFAULT_BUFFER_SIZE < sizeof(GZIP::GZIP_HEADER))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      throw Decoding_Error("BOTAN_DEFAULT_BUFFER_SIZE is too small");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    zlib = new Zlib_Stream;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/monotone/files/patch-botan2.9.diff b/devel/monotone/files/patch-botan2.9.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..80cf19e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/monotone/files/patch-botan2.9.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,6755 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+----------------------------------------------------------------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Revision: bce9def35807144b73ce06c7ade6ae610463b5c9
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Parent:   8cb2147f6c474c56b6bea37f7fed2ae37ea7e155
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Author:   yan12125@gmail.com
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date:     西元2019年06月13日 21時16分57秒
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Branch:   net.venge.monotone
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Changelog: 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Fix building with botan 2.9+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+In https://github.com/randombit/botan/commit/b909778857b3e0b7eb86ac26c818e5f25baaddbd,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+botan uses E to denote the exception class in the template function do_throw_error().
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This conflicts with the error macro E() in monotone.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Changes against parent 8cb2147f6c474c56b6bea37f7fed2ae37ea7e155
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/asciik.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/automate.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/automate_reader.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/basic_io.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/botan_glue.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/charset.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd.hh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd_automate.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd_conflicts.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd_db.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd_diff_log.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd_files.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd_key_cert.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd_list.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd_merging.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd_netsync.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd_othervcs.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd_packet.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/cmd_ws_commit.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/commands.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/database.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/database_check.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/dates.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/file_io.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/file_io.hh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/git_export.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/globish.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/key_packet.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/key_store.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/keys.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/lua.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/lua_hooks.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/luaext_parse_basic_io.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/merge_conflict.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/merge_content.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/merge_roster.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/migrate_ancestry.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/migrate_schema.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/migrate_work.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/monotone.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/netsync.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/network/automate_session.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/network/connection_info.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/network/netsync_session.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/network/session.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/netxx_pipe.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/option.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/options_list.hh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/packet.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/paths.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/paths.hh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/pcrewrap.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/platform.hh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/project.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/rcs_import.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/refiner.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/restrictions.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/revision.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/roster.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/sanity.hh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/selectors.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/ssh_agent.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/transforms.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/ui.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/unix/fs.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/unix/parse_date.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/unix/process.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/unix/ssh_agent_platform.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/uri.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/vocab.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/win32/fs.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/win32/parse_date.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/win32/ssh_agent_platform.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/work.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/work.hh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  test/src/tester.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  test/src/unix/tester-plaf.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  test/src/win32/tester-plaf.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  test/unit/tests/netxx_pipe.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/asciik.cc  40f500c5ec534ca70eb273021b893d931efc6761
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/asciik.cc  d69fc65c7cdb3e60ab6a262bce26765eeee18afd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -384,7 +384,7 @@ CMD(asciik, "asciik", "", CMD_REF(debug)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::pager)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set<revision_id> revs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/automate.cc        46ced211db0c7930b02a1eec7d667e6ee5c43509
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/automate.cc        de866add5dab0306a46eba02c07feb6047d513c2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -80,7 +80,7 @@ CMD_AUTOMATE(heads, N_("[BRANCH]"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -117,7 +117,7 @@ CMD_AUTOMATE(ancestors, N_("REV1 [REV2 [
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -127,7 +127,7 @@ CMD_AUTOMATE(ancestors, N_("REV1 [REV2 [
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revision_id rid(decode_hexenc_as<revision_id>((*i)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       frontier.push_back(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -169,7 +169,7 @@ CMD_AUTOMATE(descendents, N_("REV1 [REV2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -179,7 +179,7 @@ CMD_AUTOMATE(descendents, N_("REV1 [REV2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revision_id rid(decode_hexenc_as<revision_id>((*i)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       frontier.push_back(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -228,7 +228,7 @@ CMD_AUTOMATE(erase_ancestors, N_("[REV1 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revision_id rid(decode_hexenc_as<revision_id>((*i)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revs.insert(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -261,7 +261,7 @@ CMD_AUTOMATE(erase_descendants, N_("[REV
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revision_id rid(decode_hexenc_as<revision_id>((*i)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revs.insert(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -291,7 +291,7 @@ CMD_AUTOMATE(toposort, N_("[REV1 [REV2 [
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revision_id rid(decode_hexenc_as<revision_id>((*i)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revs.insert(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -324,7 +324,7 @@ CMD_AUTOMATE(ancestry_difference, N_("NE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -333,12 +333,12 @@ CMD_AUTOMATE(ancestry_difference, N_("NE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set<revision_id> bs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   args_vector::const_iterator i = args.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   a = decode_hexenc_as<revision_id>((*i)(), origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(a), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(a), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % a);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (++i; i != args.end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revision_id b(decode_hexenc_as<revision_id>((*i)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(db.revision_exists(b), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(db.revision_exists(b), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no revision %s found in database") % b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       bs.insert(b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -368,7 +368,7 @@ CMD_AUTOMATE(leaves, "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -393,7 +393,7 @@ CMD_AUTOMATE(roots, "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -422,13 +422,13 @@ CMD_AUTOMATE(parents, N_("REV"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id rid(decode_hexenc_as<revision_id>(idx(args, 0)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set<revision_id> parents = db.get_revision_parents(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (set<revision_id>::const_iterator i = parents.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -452,13 +452,13 @@ CMD_AUTOMATE(children, N_("REV"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id rid(decode_hexenc_as<revision_id>(idx(args, 0)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set<revision_id> children = db.get_revision_children(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (set<revision_id>::const_iterator i = children.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -492,7 +492,7 @@ CMD_AUTOMATE(graph, "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -537,7 +537,7 @@ CMD_AUTOMATE(select, N_("SELECTOR"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1058,7 +1058,7 @@ CMD_AUTOMATE(inventory,  N_("[PATH]...")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // for now, until we've figured out what the format could look like
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // and what conceptional model we can implement
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // see: http://wiki.monotone.ca/MultiParentWorkspaceFallout/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this command can only be used in a single-parent workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t old_roster = parent_roster(parents.begin()),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1283,14 +1283,14 @@ CMD_AUTOMATE(get_revision, N_("REVID"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id rid(decode_hexenc_as<revision_id>(idx(args, 0)(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                 origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_data dat = db.get_revision_data(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1345,13 +1345,13 @@ CMD_AUTOMATE(get_base_revision_id, "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   workspace work(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_t rev = work.get_work_rev();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(rev.edges.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(rev.edges.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this command can only be used in a single-parent workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   output << rev.edges.begin()->first << '\n';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1371,7 +1371,7 @@ CMD_AUTOMATE(get_current_revision_id, ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   workspace work(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1433,7 +1433,7 @@ CMD_AUTOMATE(get_manifest_of, N_("[REVID
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t new_roster;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1448,7 +1448,7 @@ CMD_AUTOMATE(get_manifest_of, N_("[REVID
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revision_id rid = decode_hexenc_as<revision_id>(idx(args, 0)(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                       origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       new_roster = db.get_roster(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1565,7 +1565,7 @@ CMD_AUTOMATE(get_extended_manifest_of, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1574,7 +1574,7 @@ CMD_AUTOMATE(get_extended_manifest_of, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id rid = decode_hexenc_as<revision_id>(idx(args, 0)(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                   origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   db.get_roster_and_markings(rid, roster, mm);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1600,7 +1600,7 @@ CMD_AUTOMATE(packet_for_rdata, N_("REVID
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1609,7 +1609,7 @@ CMD_AUTOMATE(packet_for_rdata, N_("REVID
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id r_id(decode_hexenc_as<revision_id>(idx(args, 0)(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                  origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(r_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(r_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % r_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   pw.consume_revision_data(r_id, db.get_revision_data(r_id));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1630,7 +1630,7 @@ CMD_AUTOMATE(packets_for_certs, N_("REVI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1640,7 +1640,7 @@ CMD_AUTOMATE(packets_for_certs, N_("REVI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id r_id(decode_hexenc_as<revision_id>(idx(args, 0)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   vector<cert> certs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(r_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(r_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % r_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   project.get_revision_certs(r_id, certs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1664,7 +1664,7 @@ CMD_AUTOMATE(packet_for_fdata, N_("FILEI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1672,7 +1672,7 @@ CMD_AUTOMATE(packet_for_fdata, N_("FILEI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   packet_writer pw(output);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_id f_id(decode_hexenc_as<file_id>(idx(args, 0)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.file_version_exists(f_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.file_version_exists(f_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no such file '%s'") % f_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   pw.consume_file_data(f_id, db.get_file_version(f_id));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1693,7 +1693,7 @@ CMD_AUTOMATE(packet_for_fdelta, N_("OLD_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1703,9 +1703,9 @@ CMD_AUTOMATE(packet_for_fdelta, N_("OLD_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_id f_old_id(decode_hexenc_as<file_id>(idx(args, 0)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_id f_new_id(decode_hexenc_as<file_id>(idx(args, 1)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.file_version_exists(f_old_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.file_version_exists(f_old_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % f_old_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.file_version_exists(f_new_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.file_version_exists(f_new_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % f_new_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   delta del;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   diff(db.get_file_version(f_old_id).inner(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1732,7 +1732,7 @@ CMD_AUTOMATE(common_ancestors, N_("REV1 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1741,7 +1741,7 @@ CMD_AUTOMATE(common_ancestors, N_("REV1 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revision_id rid(decode_hexenc_as<revision_id>((*i)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revs.insert(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1770,7 +1770,7 @@ CMD_AUTOMATE(branches, "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1822,7 +1822,7 @@ CMD_AUTOMATE(tags, N_("[BRANCH_PATTERN]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1905,7 +1905,7 @@ CMD_AUTOMATE(get_option, N_("OPTION"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   workspace work(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1938,7 +1938,7 @@ CMD_AUTOMATE(get_content_changed, N_("RE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1948,12 +1948,12 @@ CMD_AUTOMATE(get_content_changed, N_("RE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   marking_map mm;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ident = decode_hexenc_as<revision_id>(idx(args, 0)(), origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(ident), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(ident), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   db.get_roster_and_markings(ident, new_roster, mm);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_path path = file_path_external(idx(args,1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(new_roster.has_node(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(new_roster.has_node(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("file '%s' is unknown for revision %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % path % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2001,7 +2001,7 @@ CMD_AUTOMATE(get_corresponding_path, N_(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 3, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 3, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2009,17 +2009,17 @@ CMD_AUTOMATE(get_corresponding_path, N_(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id ident, old_ident;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ident = decode_hexenc_as<revision_id>(idx(args, 0)(), origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(ident), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(ident), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t new_roster = db.get_roster(ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   old_ident = decode_hexenc_as<revision_id>(idx(args, 2)(), origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(old_ident), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(old_ident), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % old_ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t old_roster = db.get_roster(old_ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_path path = file_path_external(idx(args,1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(new_roster.has_node(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(new_roster.has_node(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("file '%s' is unknown for revision %s") % path % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const_node_t node = new_roster.get_node(path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2052,7 +2052,7 @@ CMD_AUTOMATE(put_file, N_("[FILEID] CONT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1 || args.size() == 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1 || args.size() == 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2070,7 +2070,7 @@ CMD_AUTOMATE(put_file, N_("[FILEID] CONT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       file_data dat = typecast_vocab<file_data>(idx(args, 1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       sha1sum = calculate_ident(dat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       file_id base_id(decode_hexenc_as<file_id>(idx(args, 0)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(db.file_version_exists(base_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(db.file_version_exists(base_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no file version %s found in database") % base_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // put_file_version won't do anything if the target ID already exists,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2103,7 +2103,7 @@ CMD_AUTOMATE(put_revision, N_("REVISION-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2133,7 +2133,7 @@ CMD_AUTOMATE(put_revision, N_("REVISION-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // If the database refuses the revision, make sure this is because it's
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // already there.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.put_revision(id, move(rev)) || db.revision_exists(id),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.put_revision(id, move(rev)) || db.revision_exists(id),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("missing prerequisite for revision %s") % id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2157,7 +2157,7 @@ CMD_AUTOMATE(cert, N_("REVISION-ID NAME 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 3, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 3, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2166,7 +2166,7 @@ CMD_AUTOMATE(cert, N_("REVISION-ID NAME 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   hexenc<id> hrid(idx(args, 0)(), origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id rid(decode_hexenc_as<revision_id>(hrid(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % hrid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cache_user_key(app.opts, project, keys, app.lua);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2193,7 +2193,7 @@ CMD_AUTOMATE(get_db_variables, N_("[DOMA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2235,7 +2235,7 @@ CMD_AUTOMATE(get_db_variables, N_("[DOMA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       st.push_str_triple(syms::entry, i->first.second(), i->second());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(found_something, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(found_something, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no variables found or invalid domain specified"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // print the last stanza
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2262,7 +2262,7 @@ CMD_AUTOMATE(set_db_variable, N_("DOMAIN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 3, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 3, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2292,7 +2292,7 @@ CMD_AUTOMATE(drop_db_variables, N_("DOMA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1 || args.size() == 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1 || args.size() == 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2303,7 +2303,7 @@ CMD_AUTOMATE(drop_db_variables, N_("DOMA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       var_name name = typecast_vocab<var_name>(idx(args, 1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       var_key  key(domain, name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(db.var_exists(key), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(db.var_exists(key), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no var with name '%s' in domain '%s'") % name % domain);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       db.clear_var(key);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2322,7 +2322,7 @@ CMD_AUTOMATE(drop_db_variables, N_("DOMA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(found_something, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(found_something, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no variables found in domain '%s'") % domain);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2367,12 +2367,12 @@ CMD_AUTOMATE(lua, "LUA_FUNCTION [ARG1 [A
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() >= 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() >= 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   std::string func = idx(args, 0)();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(app.lua.hook_exists(func), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(app.lua.hook_exists(func), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("lua function '%s' does not exist") % func);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   std::vector<std::string> func_args;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2385,7 +2385,7 @@ CMD_AUTOMATE(lua, "LUA_FUNCTION [ARG1 [A
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   std::string out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(app.lua.hook_hook_wrapper(func, func_args, out), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(app.lua.hook_hook_wrapper(func, func_args, out), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("lua call '%s' failed") % func);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // the output already contains a trailing newline, so we don't add
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2420,12 +2420,12 @@ automate_stdio_shared_setup(app_state & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (matches.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no completions for this command"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if (matches.size() > 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("multiple completions possible for this command"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2437,7 +2437,7 @@ automate_stdio_shared_setup(app_state & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   acmd = dynamic_cast< automate const * >(cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   I(acmd != NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(acmd->can_run_from_stdio(), origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(acmd->can_run_from_stdio(), origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("sorry, that can't be run remotely or over stdio"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/automate_reader.cc ac60e48d6902a3cef96bc86a93640936c125beee
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/automate_reader.cc cd342871c1107e3c87fe4225706cf62e98db14ca
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -42,7 +42,7 @@ bool automate_reader::get_string(string 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       size = (size*10)+(c-'0');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       read(&c, 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(c == ':', origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(c == ':', origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("bad input to automate stdio: expected ':' after string size"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   char *str = new char[size];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   size_t got = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -62,7 +62,7 @@ streamsize automate_reader::read(char *b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   rv = in.rdbuf()->sgetn(buf, nbytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(eof_ok || rv > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(eof_ok || rv > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("bad input to automate stdio: unexpected EOF"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return rv;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -90,7 +90,7 @@ void automate_reader::go_to_next_item()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case 'o': loc = opt; break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case 'l': loc = cmd; break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("bad input to automate stdio: unknown start token '%c'") % c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -112,14 +112,14 @@ bool automate_reader::get_command(vector
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         params.push_back(make_pair(key, val));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       go_to_next_item();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(loc == cmd, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(loc == cmd, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("bad input to automate stdio: expected '%c' token") % cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string item;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   while (get_string(item))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       cmdline.push_back(item);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(cmdline.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(cmdline.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("bad input to automate stdio: command name is missing"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/basic_io.cc        95ae5bc17a2c7140bfe13691036591b8975bcf41
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/basic_io.cc        69a3a3da5c05094f0088e5ebf241cfbf8da4a806
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -26,7 +26,7 @@ void basic_io::input_source::err(string 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void basic_io::input_source::err(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("parsing a %s at %d:%d:E: %s") % name % line % col % s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/botan_glue.cc      fe2162c2c50bd9ea6632d5a37667378984b548f9
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/botan_glue.cc      76076e4d8a9aa50586ad574267c73734987618bc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -120,7 +120,7 @@ load_pkcs8_key(string const & name, stri
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (strstr(e.what(), "Passphrase required") != NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         throw Passphrase_Required("Passphrase required");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("malformed key_packet: invalid private key data for '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           % name % e.what());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/charset.cc c507ab057cf8e8c1300ea322ab1618b1353f7e97
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/charset.cc 710b80ed17d73faf3ce42c1c2b074553733ba0c1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -68,7 +68,7 @@ charset_convert(string const & src_chars
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             converted = src.c_str();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(converted != NULL, whence,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(converted != NULL, whence,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("failed to convert string from %s to %s: '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          % src_charset % dst_charset % src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       dst = string(converted);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -333,7 +333,7 @@ ace_to_utf8(string const & a, utf8 & utf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   char *out = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("converting %d bytes from IDNA ACE to UTF-8") % a.size());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   int res = idna_to_unicode_8z8z(a.c_str(), &out, IDNA_USE_STD3_ASCII_RULES);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(res == IDNA_SUCCESS || res == IDNA_NO_ACE_PREFIX, whence,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(res == IDNA_SUCCESS || res == IDNA_NO_ACE_PREFIX, whence,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("error converting %d UTF-8 bytes to IDNA ACE: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % a.size()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % decode_idna_error(res));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -347,7 +347,7 @@ utf8_to_ace(utf8 const & utf, string & a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   char *out = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("converting %d bytes from UTF-8 to IDNA ACE") % utf().size());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   int res = idna_to_ascii_8z(utf().c_str(), &out, IDNA_USE_STD3_ASCII_RULES);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(res == IDNA_SUCCESS, utf.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(res == IDNA_SUCCESS, utf.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("error converting %d UTF-8 bytes to IDNA ACE: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % utf().size()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % decode_idna_error(res));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd.cc     3a76154b01802f7abcbb1000e0de54fa19113fba
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd.cc     58bdb664240567553f7851e7ac08b995962ecb61
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -197,7 +197,7 @@ namespace commands {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                  ident.end()))();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     I(cmd->is_leaf() || cmd->is_group());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(!(cmd->is_group() && cmd->parent() == CMD_REF(__root__)),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(!(cmd->is_group() && cmd->parent() == CMD_REF(__root__)),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("command '%s' is invalid; it is a group") % join_words(ident));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -206,10 +206,10 @@ namespace commands {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         // args used in the command name have not been stripped yet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         remove_command_name_from_args(ident, app.opts.args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(!args.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(!args.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("no subcommand specified for '%s'") % visibleid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("could not match '%s' to a subcommand of '%s'") %
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           join_words(args) % visibleid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -460,7 +460,7 @@ namespace commands {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       app.mtn_automate_allowed = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(ll.ok(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(ll.ok(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("call to user command '%s' (lua command: '%s') failed.")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % primary_name() % f_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -471,7 +471,7 @@ LUAEXT(alias_command, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const char *old_cmd = luaL_checkstring(LS, -2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const char *new_cmd = luaL_checkstring(LS, -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(old_cmd && new_cmd, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(old_cmd && new_cmd, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("'%s' called with an invalid parameter") % "alias_command");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   args_vector args;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -494,7 +494,7 @@ LUAEXT(register_command, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const char *cmd_desc = luaL_checkstring(LS, -2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const char *cmd_func = luaL_checkstring(LS, -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(cmd_name && cmd_params && cmd_abstract && cmd_desc && cmd_func,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(cmd_name && cmd_params && cmd_abstract && cmd_desc && cmd_func,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("'%s' called with an invalid parameter") % "register_command");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -531,7 +531,7 @@ CMD_NO_WORKSPACE(version, "version", "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::full)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments allowed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (app.opts.full)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -549,7 +549,7 @@ CMD_HIDDEN(check_glob, "check_glob", "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   globish g = typecast_vocab<globish>(idx(args,0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string s(idx(args,1)());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(g.matches(s), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(g.matches(s), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("Glob '%s' does not match string '%s'") % g % s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -563,9 +563,9 @@ CMD_HIDDEN(crash, "crash", "", CMD_REF(d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     throw usage(execid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   bool spoon_exists(false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (idx(args,0)() == "N")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(spoon_exists, origin::user, i18n_format("There is no spoon."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(spoon_exists, origin::user, i18n_format("There is no spoon."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if (idx(args,0)() == "E")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(spoon_exists, origin::system, i18n_format("There is no spoon."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(spoon_exists, origin::system, i18n_format("There is no spoon."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if (idx(args,0)() == "I")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       I(spoon_exists);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -971,11 +971,11 @@ CMD_NO_WORKSPACE(manpage, "manpage", "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string cmd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(app.lua.hook_get_man_page_formatter_command(cmd) && !cmd.empty(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(app.lua.hook_get_man_page_formatter_command(cmd) && !cmd.empty(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user, F("no man page formatter command configured"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   FILE * fp = popen(cmd.c_str(), "w");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(fp != NULL, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(fp != NULL, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("could not execute man page formatter command '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % cmd % strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -992,7 +992,7 @@ process_commit_message_args(options cons
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             utf8 const & message_prefix)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // can't have both a --message and a --message-file ...
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!opts.message_given || !opts.msgfile_given, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!opts.message_given || !opts.msgfile_given, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("'--message' and '--message-file' are mutually exclusive"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (opts.message_given)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd.hh     a0edea1362380df6742b0b342b23f1e776157485
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd.hh     e20b22664c6d3ecfd19b14019c413ffe3c269b6f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -167,7 +167,7 @@ args_to_paths(args_vector const & args)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // behavior for empty path sets -- in particular, it is the same as having
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // no restriction at all.  "mtn revert _MTN" turning into "mtn revert"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // would be bad.  (Or substitute diff, etc.)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!(!args.empty() && paths.empty()), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!(!args.empty() && paths.empty()), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("all arguments given were bookkeeping paths; aborting"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return paths;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd_automate.cc    dc0f4afbfbe80e3b14277d6818fdf8ed3ebb06ac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd_automate.cc    e30a44faaf10122806c639d841730dcb810c5c8f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -110,7 +110,7 @@ CMD_AUTOMATE(interface_version, "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   output << interface_version << '\n';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -135,7 +135,7 @@ CMD_AUTOMATE_HIDDEN(bandtest, "{ info | 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   std::string type = args.at(0)();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -145,7 +145,7 @@ CMD_AUTOMATE_HIDDEN(bandtest, "{ info | 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if (type.compare("warning") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     W(F("this is a warning"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if (type.compare("error") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(false, origin::user, F("this is an error message"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(false, origin::user, F("this is an error message"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if (type.compare("ticker") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       ticker first("fake ticker (not fixed)", "f1", 3);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -232,7 +232,7 @@ CMD_AUTOMATE_NO_STDIO(stdio, "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       options::opts::automate_stdio_size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -321,7 +321,7 @@ LUAEXT(mtn_automate, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       app_state* app_p = get_app_state(LS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       I(app_p != NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       I(app_p->lua.check_lua_state(LS));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(app_p->mtn_automate_allowed, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(app_p->mtn_automate_allowed, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("it is illegal to call the mtn_automate() lua extension,\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             "unless from a command function defined by register_command()."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -330,7 +330,7 @@ LUAEXT(mtn_automate, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       int n = lua_gettop(LS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(n > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(n > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("bad input to mtn_automate() lua extension: command name is missing"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       L(FL("Starting call to mtn_automate lua hook"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd_conflicts.cc   149a8fefb86542c92f6665a5074c18aae5038771
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd_conflicts.cc   3e6ba155ae300340fa70ce0b020a2cd16819fefe
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -392,13 +392,13 @@ set_resolution(resolve_conflicts::file_r
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if ("drop" == idx(args, 0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(args.size() == 1, origin::user, F("too many arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(args.size() == 1, origin::user, F("too many arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       resolution.resolution = resolve_conflicts::drop;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if ("keep" == idx(args, 0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(args.size() == 1, origin::user, F("too many arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(other_resolution.resolution == resolve_conflicts::none ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(args.size() == 1, origin::user, F("too many arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(other_resolution.resolution == resolve_conflicts::none ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         other_resolution.resolution == resolve_conflicts::drop ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         other_resolution.resolution == resolve_conflicts::rename ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         other_resolution.resolution == resolve_conflicts::content_user_rename,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -409,14 +409,14 @@ set_resolution(resolve_conflicts::file_r
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if ("rename" == idx(args, 0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       resolution.resolution  = resolve_conflicts::rename;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       resolution.rename = file_path_external(idx(args,1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if ("user" == idx(args, 0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(other_resolution.resolution == resolve_conflicts::none ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(other_resolution.resolution == resolve_conflicts::none ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         other_resolution.resolution == resolve_conflicts::drop ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         other_resolution.resolution == resolve_conflicts::rename ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         other_resolution.resolution == resolve_conflicts::content_user_rename,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -429,14 +429,14 @@ set_resolution(resolve_conflicts::file_r
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if ("user_rename" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(args.size() == 3, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(args.size() == 3, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       resolution.resolution  = resolve_conflicts::content_user_rename;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       resolution.content = new_optimal_path(idx(args,1)(), false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       resolution.rename = file_path_external(idx(args,2));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F(conflict_resolution_not_supported_msg) % idx(args,0) % "duplicate_name");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } // set_resolution
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -448,7 +448,7 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    args_vector const & args,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    side_t side)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() > 0, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() > 0, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (side != neither)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -465,11 +465,11 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case left:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               if (conflict.left_resolution.resolution == resolve_conflicts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  E(conflict.left_nid != the_null_node, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  MONOTONE_ERROR(conflict.left_nid != the_null_node, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     F("must specify resolve_first (not _left or _right)"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if ("keep" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    MONOTONE_ERROR(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   set_resolution(conflict.left_resolution, conflict.right_resolution, args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -478,11 +478,11 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case right:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               if (conflict.right_resolution.resolution == resolve_conflicts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  E(conflict.right_nid != the_null_node, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  MONOTONE_ERROR(conflict.right_nid != the_null_node, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     F("must specify resolve_first (not _left or _right)"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if ("keep" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    MONOTONE_ERROR(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   set_resolution(conflict.right_resolution, conflict.left_resolution, args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -536,20 +536,20 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               if ("drop" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  E(args.size() == 1, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  MONOTONE_ERROR(args.size() == 1, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   conflict.resolution.resolution  = resolve_conflicts::drop;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               else if ("rename" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  E(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  MONOTONE_ERROR(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   conflict.resolution.resolution  = resolve_conflicts::rename;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   conflict.resolution.rename = file_path_external(idx(args,1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     F(conflict_resolution_not_supported_msg) % idx(args,0) % "orphaned_node");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -567,7 +567,7 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           switch (conflict.dropped_side)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case resolve_conflicts::left_side:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(conflict.left_nid == the_null_node, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(conflict.left_nid == the_null_node, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("must specify 'resolve_first_left' or 'resolve_first_right' (not just 'resolve_first')"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               // the left side stays dropped; we either drop, keep or replace the right side
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -575,35 +575,35 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if ("drop" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(args.size() == 1, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(args.size() == 1, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.right_resolution.resolution = resolve_conflicts::drop;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if ("keep" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(args.size() == 1, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(args.size() == 1, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.right_resolution.resolution = resolve_conflicts::keep;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if ("user" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.right_resolution.resolution  = resolve_conflicts::content_user;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.right_resolution.content = new_optimal_path(idx(args,1)(), false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if ("rename" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.right_resolution.resolution  = resolve_conflicts::rename;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.right_resolution.rename = file_path_external(idx(args,1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if ("user_rename" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(args.size() == 3, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(args.size() == 3, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.right_resolution.resolution  = resolve_conflicts::content_user_rename;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.right_resolution.content = new_optimal_path(idx(args,1)(), false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -611,7 +611,7 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         F(conflict_resolution_not_supported_msg) % idx(args,0) % "dropped_modified");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -619,7 +619,7 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case resolve_conflicts::right_side:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(conflict.right_nid == the_null_node, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(conflict.right_nid == the_null_node, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("must specify 'resolve_first_left' or 'resolve_first_right' (not just 'resolve_first')"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               // the right side stays dropped; we either drop, keep or replace the left side
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -627,35 +627,35 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if ("drop" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(args.size() == 1, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(args.size() == 1, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.left_resolution.resolution = resolve_conflicts::drop;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if ("keep" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(args.size() == 1, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(args.size() == 1, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.left_resolution.resolution  = resolve_conflicts::keep;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if ("user" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.left_resolution.resolution  = resolve_conflicts::content_user;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.left_resolution.content = new_optimal_path(idx(args,1)(), false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if ("rename" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.left_resolution.resolution  = resolve_conflicts::rename;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.left_resolution.rename = file_path_external(idx(args,1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else if ("user_rename" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(args.size() == 3, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(args.size() == 3, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.left_resolution.resolution  = resolve_conflicts::content_user_rename;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       conflict.left_resolution.content = new_optimal_path(idx(args,1)(), false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -663,7 +663,7 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         F(conflict_resolution_not_supported_msg) % idx(args,0) % "dropped_modified");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -707,7 +707,7 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      E(false, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      MONOTONE_ERROR(false, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   if (do_interactive_merge(db, lua, conflicts, conflict.nid,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -726,7 +726,7 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               else if ("user" == idx(args,0)())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  E(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  MONOTONE_ERROR(args.size() == 2, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   conflict.resolution.resolution  = resolve_conflicts::content_user;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   conflict.resolution.content = new_optimal_path(idx(args,1)(), false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -735,7 +735,7 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   // We don't allow the user to specify 'resolved_internal'; that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   // is only done by automate show_conflicts.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     F(conflict_resolution_not_supported_msg) % idx(args,0) % "file_content");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -746,15 +746,15 @@ set_first_conflict(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   switch (side)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case left:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, F("no resolvable yet unresolved left side conflicts"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, F("no resolvable yet unresolved left side conflicts"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case right:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, F("no resolvable yet unresolved right side conflicts"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, F("no resolvable yet unresolved right side conflicts"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case neither:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, F("no resolvable yet unresolved single-file conflicts"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, F("no resolvable yet unresolved single-file conflicts"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -779,7 +779,7 @@ CMD(show_first, "show_first", "", CMD_RE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   conflicts_t conflicts (db, app.opts.conflicts_file);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   show_conflicts(db, conflicts, first);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -796,7 +796,7 @@ CMD(show_remaining, "show_remaining", ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   conflicts_t conflicts (db, app.opts.conflicts_file);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user, F("wrong number of arguments"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   show_conflicts(db, conflicts, remaining);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd_db.cc  4dd6dff6224977cc4f66ccac035c04c60b4ff6c5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd_db.cc  5938cc68b338d336b7fbbdbf45a295281e403822
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -46,7 +46,7 @@ CMD(db_init, "init", "", CMD_REF(db), ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     N_("Creates a new database file and initializes it."),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -62,7 +62,7 @@ CMD(db_info, "info", "", CMD_REF(db), ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::full | options::opts::pager)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -74,7 +74,7 @@ CMD(db_version, "version", "", CMD_REF(d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -91,7 +91,7 @@ CMD(db_fix_certs, "fix_certs", "", CMD_R
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "such certs with 'mtn read'."),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::drop_bad_certs)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -109,7 +109,7 @@ CMD(db_dump, "dump", "", CMD_REF(db), ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "restore the database from a text file that serves as a backup."),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::pager)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -123,7 +123,7 @@ CMD(db_load, "load", "", CMD_REF(db), ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "output generated by the 'dump' command."),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -139,7 +139,7 @@ CMD(db_migrate, "migrate", "", CMD_REF(d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   key_store keys(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   migration_status mstat;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -197,7 +197,7 @@ CMD(db_kill_rev_locally, "kill_revision"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Check that the revision does not have any children
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   std::set<revision_id> children = db.get_revision_children(revid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!children.size(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!children.size(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("revision %s already has children. We cannot kill it.")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % revid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -223,7 +223,7 @@ CMD(db_kill_rev_locally, "kill_revision"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if (edge_old_revision(i) != revid)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(!work.has_changes(db), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(!work.has_changes(db), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("cannot kill revision %s,\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               "because it would leave the current workspace in an invalid\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               "state, from which monotone cannot recover automatically since\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -325,7 +325,7 @@ CMD(db_check, "check", "", CMD_REF(db), 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "checks."),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -341,7 +341,7 @@ CMD(db_changesetify, "changesetify", "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   key_store keys(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   project_t project(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   db.ensure_open_for_format_changes();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -362,7 +362,7 @@ CMD(db_rosterify, "rosterify", "", CMD_R
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   key_store keys(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   project_t project(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   db.ensure_open_for_format_changes();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -380,7 +380,7 @@ CMD(db_regenerate_caches, "regenerate_ca
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -407,7 +407,7 @@ CMD(db_set_epoch, "set_epoch", "", CMD_R
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (args.size() != 2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     throw usage(execid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(idx(args, 1)().size() == constants::epochlen, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(idx(args, 1)().size() == constants::epochlen, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("The epoch must be %d characters") % constants::epochlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   epoch_data ed(decode_hexenc_as<epoch_data>(idx(args, 1)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -450,7 +450,7 @@ CMD(unset, "unset", "", CMD_REF(variable
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   var_key k(d, n);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.var_exists(k), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.var_exists(k), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no var with name '%s' in domain '%s'") % n % d);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   db.clear_var(k);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -464,7 +464,7 @@ CMD(register_workspace, "register_worksp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (args.size() > 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     throw usage(execid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1 || workspace::found, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1 || workspace::found, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no workspace given"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   system_path workspace;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -486,7 +486,7 @@ CMD(unregister_workspace, "unregister_wo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (args.size() > 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     throw usage(execid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1 || workspace::found, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1 || workspace::found, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no workspace given"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   system_path workspace;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -554,7 +554,7 @@ CMD(complete, "complete", "", CMD_REF(in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   project_t project(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(idx(args, 1)().find_first_not_of("abcdef0123456789") == string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(idx(args, 1)().find_first_not_of("abcdef0123456789") == string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("non-hex digits in partial id"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -617,7 +617,7 @@ CMD_HIDDEN(rev_height, "rev_height", "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id rid(decode_hexenc_as<revision_id>(idx(args, 0)(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                 origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   P(F("cached height: %s") % db.get_rev_height(rid));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd_diff_log.cc    6849a40ebcf3550a1c1b29cdb2f844ad72a6982d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd_diff_log.cc    4232dbda923df2ff65f9d5eae301ddf74bf36665
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -257,10 +257,10 @@ prepare_diff(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // initialize before transaction so we have a database to work with.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   project_t project(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(app.opts.revision.size() <= 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(app.opts.revision.size() <= 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("more than two revisions given"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!app.opts.reverse || app.opts.revision.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!app.opts.reverse || app.opts.revision.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("'--reverse' only allowed with exactly one revision"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (app.opts.revision.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -272,7 +272,7 @@ prepare_diff(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       parent_map parents = work.get_parent_rosters(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // With no arguments, which parent should we diff against?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("this workspace has more than one parent\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "(specify a revision to diff against with '--revision')"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -451,7 +451,7 @@ CMD(diff, "diff", "di", CMD_REF(informat
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   (void)execid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (app.opts.external_diff_args_given)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(app.opts.diff_format == external_diff, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(app.opts.diff_format == external_diff, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("'--diff-args' requires '--external'; try adding '--external' or remove '--diff-args'"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t old_roster, new_roster;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -674,7 +674,7 @@ log_common (app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   log_direction direction = log_reverse;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(last == -1 || next == -1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(last == -1 || next == -1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("only one of '--last'/'--next' allowed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (next >= 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -703,7 +703,7 @@ log_common (app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if ((FL("%s") % rid).str().empty()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             W(F("workspace has no parent revision, probably an empty branch"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               F("workspace parent revision %s not found - "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 "did you specify a wrong database?") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             starting_revs.insert(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd_files.cc       2abfd5dfeb0b8ef04c0cb715064fc62b339b911a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd_files.cc       8e5a876c9f9fdd711f033b61af8f90ea298a5a52
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -66,13 +66,13 @@ CMD(fmerge, "fmerge", "", CMD_REF(debug)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     right_id(decode_hexenc_as<file_id>(idx(args, 2)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.file_version_exists (anc_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.file_version_exists (anc_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("ancestor file id does not exist"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.file_version_exists (left_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.file_version_exists (left_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("left file id does not exist"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.file_version_exists (right_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.file_version_exists (right_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("right file id does not exist"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_data
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -85,7 +85,7 @@ CMD(fmerge, "fmerge", "", CMD_REF(debug)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   split_into_lines(anc.inner()(), anc_lines);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   split_into_lines(left.inner()(), left_lines);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   split_into_lines(right.inner()(), right_lines);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(merge3(anc_lines, left_lines, right_lines, merged_lines),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(merge3(anc_lines, left_lines, right_lines, merged_lines),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user, F("merge failed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   copy(merged_lines.begin(), merged_lines.end(), ostream_iterator<string>(cout, "\n"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -113,10 +113,10 @@ CMD(fdiff, "fdiff", "", CMD_REF(debug), 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     dst_id(decode_hexenc_as<file_id>(idx(args, 3)(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.file_version_exists (src_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.file_version_exists (src_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("source file id does not exist"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.file_version_exists (dst_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.file_version_exists (dst_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("destination file id does not exist"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_data
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -173,7 +173,7 @@ CMD(annotate, "annotate", "", CMD_REF(in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // wants.  See tests/two_parent_workspace_annotate.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       workspace work(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revision_t rev = work.get_work_rev();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(rev.edges.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(rev.edges.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("with no revision selected, this command can only be used in "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "a single-parent workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -191,11 +191,11 @@ CMD(annotate, "annotate", "", CMD_REF(in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // find the version of the file requested
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(roster.has_node(file), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(roster.has_node(file), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no such file '%s' in revision %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % file % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const_node_t node = roster.get_node(file);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(is_file_t(node), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(is_file_t(node), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("'%s' in revision %s is not a file")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % file % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -234,12 +234,12 @@ CMD_AUTOMATE(identify, N_("PATH"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   utf8 path = idx(args, 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(path() != "-", origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(path() != "-", origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("cannot read from stdin"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   data dat = read_data_for_command_line(path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -249,7 +249,7 @@ dump_file(database & db, std::ostream & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dump_file(database & db, std::ostream & output, file_id const & ident)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.file_version_exists(ident), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.file_version_exists(ident), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no file version %s found in database") % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("dumping file %s") % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -260,7 +260,7 @@ dump_file(database & db, std::ostream & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dump_file(database & db, std::ostream & output, revision_id rid, utf8 filename)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Paths are interpreted as standard external ones when we're in a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -270,11 +270,11 @@ dump_file(database & db, std::ostream & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t roster;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   marking_map marks;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   db.get_roster_and_markings(rid, roster, marks);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(roster.has_node(fp), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(roster.has_node(fp), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no file '%s' found in revision %s") % fp % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const_node_t node = roster.get_node(fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E((!null_node(node->self) && is_file_t(node)), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR((!null_node(node->self) && is_file_t(node)), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no file '%s' found in revision %s") % fp % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const_file_t file_node = downcast_to_file_t(node);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -301,7 +301,7 @@ CMD(cat, "cat", "", CMD_REF(informative)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       workspace work(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       parent_map parents = work.get_parent_rosters(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("this command can only be used in a single-parent workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       rid = parent_id(parents.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -329,7 +329,7 @@ CMD_AUTOMATE(get_file, N_("FILEID"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -353,14 +353,14 @@ CMD_AUTOMATE(get_file_size, N_("FILEID")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   hexenc<id> hident(idx(args, 0)(), origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_id ident(decode_hexenc_as<file_id>(hident(), hident.made_from));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.file_version_exists(ident), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.file_version_exists(ident), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no file version %s found in database") % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   output << lexical_cast<string>(db.get_file_size(ident)) << "\n";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -385,7 +385,7 @@ CMD_AUTOMATE(get_file_of, N_("FILENAME")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::revision)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -396,7 +396,7 @@ CMD_AUTOMATE(get_file_of, N_("FILENAME")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       workspace work(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       parent_map parents = work.get_parent_rosters(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("this command can only be used in a single-parent workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       rid = parent_id(parents.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd_key_cert.cc    d0f1ad7a8e4afd9844beca248db38a6a9dcd5553
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd_key_cert.cc    91058d5907d250639b3488745e8e9ace712beacb
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -58,11 +58,11 @@ CMD(genkey, "genkey", "", CMD_REF(key_an
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!app.opts.force_duplicate_key)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!keys.key_pair_exists(name), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!keys.key_pair_exists(name), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("you already have a key named '%s'") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (db.database_specified())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(!db.public_key_exists(name), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(!db.public_key_exists(name), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("there is another key named '%s'") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -80,7 +80,7 @@ CMD_AUTOMATE(generate_key, N_("KEY_NAME 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // not unified with CMD(genkey), because the call to create_key_pair is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // significantly different.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app, database::maybe_unspecified);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -90,11 +90,11 @@ CMD_AUTOMATE(generate_key, N_("KEY_NAME 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!app.opts.force_duplicate_key)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!keys.key_pair_exists(name), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!keys.key_pair_exists(name), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("you already have a key named '%s'") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (db.database_specified())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(!db.public_key_exists(name), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(!db.public_key_exists(name), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("there is another key named '%s'") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -165,7 +165,7 @@ dropkey_common(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     fmt = F("public or private key '%s' does not exist "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             "in keystore, and no database was specified");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(key_deleted, origin::user, fmt % idx(args, 0)());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(key_deleted, origin::user, fmt % idx(args, 0)());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ CMD(dropkey, "dropkey", "", CMD_REF(key_and_cert), N_("KEY_NAME_OR_HASH"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -188,7 +188,7 @@ CMD_AUTOMATE(drop_public_key, N_("KEY_NA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   (void)execid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   (void)output;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   dropkey_common(app, args,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -413,7 +413,7 @@ CMD(approve, "approve", "", CMD_REF(revi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id rev_id;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   complete(app.opts, app.lua, project, idx(args, 0)(), rev_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   app.opts.branch = project.guess_branch(app.opts, rev_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("need '--branch' argument for approval"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cache_user_key(app.opts, project, keys, app.lua);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -439,7 +439,7 @@ CMD(suspend, "suspend", "", CMD_REF(revi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id rev_id;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   complete(app.opts, app.lua, project, idx(args, 0)(), rev_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   app.opts.branch = project.guess_branch(app.opts, rev_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("need '--branch' argument to suspend"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cache_user_key(app.opts, project, keys, app.lua);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -466,13 +466,13 @@ CMD(comment, "comment", "", CMD_REF(revi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       external comment_external;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(app.lua.hook_edit_comment(external(""), comment_external),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(app.lua.hook_edit_comment(external(""), comment_external),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("edit comment failed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       system_to_utf8(comment_external, comment);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(comment().find_first_not_of("\n\r\t ") != string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(comment().find_first_not_of("\n\r\t ") != string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("empty comment"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd_list.cc        21e848a20b9242b79c8de070eaf22e4acaa9c362
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd_list.cc        67eb3b105ef2adf57ccd8f0ee670b1cb669ac059
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -227,7 +227,7 @@ CMD(duplicates, "duplicates", "", CMD_RE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   project_t project(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(app.opts.revision.size() <= 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(app.opts.revision.size() <= 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("more than one revision given"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (app.opts.revision.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -239,7 +239,7 @@ CMD(duplicates, "duplicates", "", CMD_RE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       complete(app.opts, app.lua, project,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                idx(app.opts.revision, 0)(), rev_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(db.revision_exists(rev_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(db.revision_exists(rev_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no revision %s found in database") % rev_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       roster = db.get_roster(rev_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -542,7 +542,7 @@ CMD(epochs, "epochs", "", CMD_REF(list),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           map<branch_name, epoch_data>::const_iterator j =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             epochs.find(typecast_vocab<branch_name>((*i)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(j != epochs.end(), origin::user, F("no epoch for branch '%s'") % *i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(j != epochs.end(), origin::user, F("no epoch for branch '%s'") % *i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           cout << encode_hexenc(j->second.inner()(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 j->second.inner().made_from)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                << ' ' << j->first << '\n';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -711,11 +711,11 @@ CMD(databases, "databases", "dbs", CMD_R
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   vector<system_path> search_paths, files, specials, dirs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(app.lua.hook_get_default_database_locations(search_paths), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(app.lua.hook_get_default_database_locations(search_paths), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no default database location configured"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   globish file_matcher;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(app.lua.hook_get_default_database_glob(file_matcher), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(app.lua.hook_get_default_database_glob(file_matcher), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("could not query default database glob"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (system_path const search_path : search_paths)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -997,7 +997,7 @@ CMD_AUTOMATE(keys, "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no arguments needed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app, database::maybe_unspecified);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1056,7 +1056,7 @@ CMD_AUTOMATE(certs, N_("REV"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1069,7 +1069,7 @@ CMD_AUTOMATE(certs, N_("REV"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   hexenc<id> hrid(idx(args, 0)(), origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id rid(decode_hexenc_as<revision_id>(hrid(), origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no revision %s found in database") % hrid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   vector<cert> ts;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd_merging.cc     dd574477bc1cec5ef6ad110e518b863967111953
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd_merging.cc     9491220dfef660a11266a62b2f04f8a6dd1bdbce
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -172,7 +172,7 @@ pick_branch_for_update(options & opts, d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           for (set<branch_name>::const_iterator i = branches.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                i != branches.end(); i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             branch_list += "\n  " + (*i)();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("target revision is in multiple branches:%s\n\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               "Try again with explicit '--branch'") % branch_list);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -203,15 +203,15 @@ update(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Figure out where we are
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   parent_map parents = work.get_parent_rosters(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this command can only be used in a single-parent workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id old_rid = parent_id(parents.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!null_id(old_rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!null_id(old_rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this workspace is a new project; cannot update"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Figure out where we're going
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("cannot determine branch for update"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id chosen_rid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -222,7 +222,7 @@ update(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       pick_update_candidates(app.lua, project, candidates, old_rid,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                              app.opts.branch,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                              app.opts.ignore_suspend_certs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!candidates.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!candidates.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("your request matches no descendents of the current revision.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "In fact, it doesn't even match the current revision.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "Maybe you want something like '--revision=h:%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -235,7 +235,7 @@ update(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             P(i18n_format("  %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               % describe_revision(app.opts, app.lua, project, *i));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           P(F("choose one with '%s update -r<id>'") % prog_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("multiple update candidates remain after selection"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       chosen_rid = *(candidates.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -374,10 +374,10 @@ CMD_AUTOMATE(update, "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::branch | options::opts::revision |
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::move_conflicting_paths)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(app.opts.revision.size() <= 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(app.opts.revision.size() <= 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("at most one revision selector may be specified"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   update(app, args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -518,14 +518,14 @@ CMD(merge, "merge", "", CMD_REF(tree), "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!args.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     throw usage(execid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("please specify a branch, with '--branch=BRANCH'"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set<revision_id> heads;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   project.get_branch_heads(app.opts.branch, heads,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            app.opts.ignore_suspend_certs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!heads.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!heads.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("branch '%s' is empty") % app.opts.branch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (heads.size() == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -626,14 +626,14 @@ void perform_merge_into_dir(app_state & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   project.get_branch_heads(typecast_vocab<branch_name>(idx(args, 1)), dst_heads,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            app.opts.ignore_suspend_certs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(src_heads.size() != 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(src_heads.size() != 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("branch '%s' is empty") % idx(args, 0)());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(src_heads.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(src_heads.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("branch '%s' is not merged") % idx(args, 0)());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(dst_heads.size() != 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(dst_heads.size() != 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("branch '%s' is empty") % idx(args, 1)());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(dst_heads.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(dst_heads.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("branch '%s' is not merged") % idx(args, 1)());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set<revision_id>::const_iterator src_i = src_heads.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -693,7 +693,7 @@ void perform_merge_into_dir(app_state & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             MM(dir);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             pth.dirname_basename(dir, base);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(right_roster.has_node(dir), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(right_roster.has_node(dir), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               F("Path '%s' not found in destination tree.") % pth);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             const_node_t parent = right_roster.get_node(dir);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             moved_root->parent = parent->self;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -815,13 +815,13 @@ CMD(merge_into_workspace, "merge_into_wo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     parent_map parents = work.get_parent_rosters(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("this command can only be used in a single-parent workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     *working_roster = work.get_current_roster_shape(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     work.update_current_roster_from_filesystem(*working_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(parent_roster(parents.begin()) == *working_roster, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(parent_roster(parents.begin()) == *working_roster, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("'%s' can only be used in a workspace with no pending changes") %
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         join_words(execid)());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -834,12 +834,12 @@ CMD(merge_into_workspace, "merge_into_wo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   complete(app.opts, app.lua, project, idx(args, 0)(), right_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cached_roster right = db.get_cached_roster(right_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!(left_id == right_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!(left_id == right_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("workspace is already at revision %s") % left_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!is_ancestor(db, right_id, left_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!is_ancestor(db, right_id, left_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("revision %s is already an ancestor of your workspace") % right_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!is_ancestor(db, left_id, right_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!is_ancestor(db, left_id, right_id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("revision %s is a descendant of the workspace parent,\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "did you mean 'mtn update -r %s'?") % right_id % right_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -923,13 +923,13 @@ CMD(explicit_merge, "explicit_merge", ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   complete(app.opts, app.lua, project, idx(args, 1)(), right);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   branch = typecast_vocab<branch_name>(idx(args, 2));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!(left == right), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!(left == right), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("%s and %s are the same revision, aborting")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % left % right);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!is_ancestor(db, left, right), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!is_ancestor(db, left, right), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("%s is already an ancestor of %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % left % right);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!is_ancestor(db, right, left), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!is_ancestor(db, right, left), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("%s is already an ancestor of %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % right % left);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1120,14 +1120,14 @@ static void get_conflicts_rids(args_vect
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (args.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // get ids from heads
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("please specify a branch, with '--branch=BRANCH'"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       set<revision_id> heads;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       project.get_branch_heads(app.opts.branch, heads,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                app.opts.ignore_suspend_certs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(heads.size() >= 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(heads.size() >= 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("branch '%s' has only 1 head; must be at least 2 for conflicts") % app.opts.branch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revpair p = find_heads_to_merge (db, heads);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1141,7 +1141,7 @@ static void get_conflicts_rids(args_vect
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       complete(app.opts, app.lua, project, idx(args,1)(), right_rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(false, origin::user, F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(false, origin::user, F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Name: show_conflicts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1218,7 +1218,7 @@ CMD_AUTOMATE(file_merge, N_("LEFT_REVID 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // way to specify the ancestor id for a merge adaptor; why should we trust
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // the user?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 4, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 4, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database  db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1258,7 +1258,7 @@ CMD_AUTOMATE(file_merge, N_("LEFT_REVID 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     adaptor);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_data ancestor_data, left_data, right_data, merge_data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(cm.attempt_auto_merge(ancestor_path, left_path, right_path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(cm.attempt_auto_merge(ancestor_path, left_path, right_path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           ancestor_fid, left_n->content, right_n->content,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           left_data, right_data, merge_data),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1292,7 +1292,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       complete(app.opts, app.lua, project,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                idx(app.opts.revision, 0)(), to_rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       set<revision_id> parents = db.get_revision_parents(to_rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("revision %s is a merge.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "To apply the changes relative to one of its parents, use:\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "  %s pluck -r PARENT -r %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1311,7 +1311,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     throw usage(execid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!(from_rid == to_rid), origin::user, F("no changes to apply"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!(from_rid == to_rid), origin::user, F("no changes to apply"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // notionally, we have the situation
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1372,7 +1372,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     from_to_to = cset(*from_roster, restricted_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     from_to_to_excluded = cset(restricted_roster, to_true_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!from_to_to.empty(), origin::user, F("no changes to be applied"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!from_to_to.empty(), origin::user, F("no changes to be applied"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // ...and use it to create the TO roster
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   shared_ptr<roster_t> to_roster = make_shared<roster_t>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   MM(*to_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1417,7 +1417,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // we apply the working to merged cset to the workspace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cset update(*working_roster, merged_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   MM(update);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!update.empty(), origin::no_fault, F("no changes were applied"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!update.empty(), origin::no_fault, F("no changes were applied"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   work.perform_content_update(*working_roster, merged_roster, update, wca,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                               true, app.opts.move_conflicting_paths);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1462,7 +1462,7 @@ CMD(heads, "heads", "", CMD_REF(tree), "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!args.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     throw usage(execid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("please specify a branch, with '--branch=BRANCH'"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd_netsync.cc     42d5e8687b9dc65499efe1f16089ae790c535674
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd_netsync.cc     cf7deebb9a874f580c31428d9c07714e20d26987
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -64,7 +64,7 @@ extract_client_connection_info(options &
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (args.size() == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(!opts.exclude_given, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(!opts.exclude_given, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("cannot use '--exclude' in URI mode"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           netsync_connection_info::setup_from_uri(opts, project.db, lua, type,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -217,7 +217,7 @@ CMD_AUTOMATE_NO_STDIO(remote,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       options::opts::min_netsync_version |
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       options::opts::set_default)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() >= 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() >= 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!app.opts.dbname_given)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -276,7 +276,7 @@ CMD_AUTOMATE_NO_STDIO(remote,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        client_voice, source_and_sink_role, info,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        connection_counts::create());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(os.get_error() == 0, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(os.get_error() == 0, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("received remote error code %d") % os.get_error());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -740,7 +740,7 @@ CMD_NO_WORKSPACE(clone, "clone", "", CMD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!(no_ambigious_revision && (url_arg || host_branch_arg)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     throw usage(execid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(url_arg || (host_branch_arg && !app.opts.branch_given), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(url_arg || (host_branch_arg && !app.opts.branch_given), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("the '--branch' option is only valid with an URI to clone"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // we create the database before anything else, but we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -764,7 +764,7 @@ CMD_NO_WORKSPACE(clone, "clone", "", CMD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (url_arg)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!app.opts.exclude_given, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!app.opts.exclude_given, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("cannot use '--exclude' in URI mode"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       netsync_connection_info::setup_from_uri(app.opts, project.db, app.lua,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -789,7 +789,7 @@ CMD_NO_WORKSPACE(clone, "clone", "", CMD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (app.opts.branch().empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       globish include_pattern = info->client.get_include_pattern();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!include_pattern().empty() && !include_pattern.contains_meta_chars(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!include_pattern().empty() && !include_pattern.contains_meta_chars(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user, F("you must specify an unambiguous branch to clone"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       app.opts.branch = branch_name(include_pattern.unescaped(), origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -862,7 +862,7 @@ CMD_NO_WORKSPACE(clone, "clone", "", CMD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       set<revision_id> heads;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       project.get_branch_heads(app.opts.branch, heads,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                app.opts.ignore_suspend_certs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!heads.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!heads.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("branch '%s' is empty") % app.opts.branch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (heads.size() > 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -871,7 +871,7 @@ CMD_NO_WORKSPACE(clone, "clone", "", CMD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             P(i18n_format("  %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               % describe_revision(app.opts, app.lua, project, *i));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           P(F("choose one with '%s clone -r<id> URI'") % prog_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user, F("branch '%s' has multiple heads") % app.opts.branch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user, F("branch '%s' has multiple heads") % app.opts.branch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       ident = *(heads.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -880,7 +880,7 @@ CMD_NO_WORKSPACE(clone, "clone", "", CMD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // use specified revision
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       complete(app.opts, app.lua, project, idx(app.opts.revision, 0)(), ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(project.revision_is_in_branch(ident, app.opts.branch),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(project.revision_is_in_branch(ident, app.opts.branch),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("revision %s is not a member of branch '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           % ident % app.opts.branch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -913,7 +913,7 @@ struct pid_file
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     require_path_is_nonexistent(path, F("pid file '%s' already exists") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     file.open(path.as_external().c_str());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(file.is_open(), origin::system, F("failed to create pid file '%s'") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(file.is_open(), origin::system, F("failed to create pid file '%s'") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     file << get_process_id() << '\n';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     file.flush();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd_othervcs.cc    01389bf7bccdab20dcbbd54ee73840392002622a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd_othervcs.cc    175d8549c2c111442d309fc7b60d419258d5a59c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -52,7 +52,7 @@ CMD(cvs_import, "cvs_import", "", CMD_RE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (args.size() != 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     throw usage(execid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("need base '--branch' argument for importing"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   system_path cvsroot(idx(args, 0)(), origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd_packet.cc      adf591bbe10d5184ec04fb4e0484d0eddb1a1ff8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd_packet.cc      54dd035e5230f6e7e60605362d7a43ef4a5b8a16
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -70,7 +70,7 @@ CMD_AUTOMATE(put_public_key, N_("KEY-PAC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -108,7 +108,7 @@ pubkey_common(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       key = kp.pub;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       exists = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(exists, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(exists, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("public key '%s' does not exist") % idx(args, 0)());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   packet_writer pw(output);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -135,7 +135,7 @@ CMD_AUTOMATE(get_public_key, N_("KEY_NAM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   pubkey_common(app, args, output);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -259,7 +259,7 @@ CMD_AUTOMATE(read_packets, N_("PACKET-DA
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -282,7 +282,7 @@ CMD(read, "read", "", CMD_REF(packet_io)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (args.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       count += read_packets(cin, dbw);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(count != 0, origin::user, F("no packets found on stdin"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(count != 0, origin::user, F("no packets found on stdin"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -293,7 +293,7 @@ CMD(read, "read", "", CMD_REF(packet_io)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           istringstream ss(dat());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           count += read_packets(ss, dbw);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(count != 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(count != 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         FP("no packets found in given file",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            "no packets found in given files",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            args.size()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cmd_ws_commit.cc   8642e2de09758ea82c50c4a26065178a317b9f77
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cmd_ws_commit.cc   bdde4720b89aa07ebfdf9d6d5c2a37048e8ff9c6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -188,7 +188,7 @@ get_log_message_interactively(lua_hooks 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                               string const & date_fmt, utf8 & log_message)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   utf8 backup = work.load_commit_text();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(backup().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(backup().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("a backup from a previously failed commit exists in '_MTN/commit'.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "This file must be removed before commit will proceed.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "You may recover the previous message from this file if necessary."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -281,7 +281,7 @@ get_log_message_interactively(lua_hooks 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   utf8_to_system_best_effort(full_message, input_message);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(lua.hook_edit_comment(input_message, output_message),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(lua.hook_edit_comment(input_message, output_message),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("edit of log message failed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -297,7 +297,7 @@ get_log_message_interactively(lua_hooks 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (changelog_end != string::npos)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         work.write_user_log(utf8(trim_right(full_message().substr(0, changelog_end)) + '\n', origin::user));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, F("commit cancelled."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, F("commit cancelled."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // save the message in _MTN/commit so it's not lost if something fails
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -314,39 +314,39 @@ get_log_message_interactively(lua_hooks 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // this can't fail, since we start reading where we found it above.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   message.read(cancel());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(message.read(instructions()), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(message.read(instructions()), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("commit failed. Instructions not found."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Branch:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(message.read(trim_right(BRANCH())), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(message.read(trim_right(BRANCH())), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("commit failed. Branch header not found."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string b = message.readline();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!b.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!b.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("commit failed. Branch value empty."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   branch = branch_name(b, origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Author:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(message.read(trim_right(AUTHOR())), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(message.read(trim_right(AUTHOR())), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("commit failed. Author header not found."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   author = message.readline();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!author.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!author.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("commit failed. Author value empty."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Date:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(message.read(trim_right(DATE())), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(message.read(trim_right(DATE())), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("commit failed. Date header not found."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string d = message.readline();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!d.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!d.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("commit failed. Date value empty."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!is_date_fmt_valid || date_fmt.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -367,7 +367,7 @@ revert(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t old_roster, new_roster;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(app.opts.missing || !args.empty() || !app.opts.exclude.empty(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(app.opts.missing || !args.empty() || !app.opts.exclude.empty(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("you must pass at least one path to 'revert' (perhaps '.')"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -375,7 +375,7 @@ revert(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   workspace work(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   parent_map parents = work.get_parent_rosters(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this command can only be used in a single-parent workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   old_roster = parent_roster(parents.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -483,7 +483,7 @@ revert(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               P(F("reverting %s") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               L(FL("reverting %s to [%s]") % path % f->content);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(db.file_version_exists(f->content), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(db.file_version_exists(f->content), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("no file version %s found in database for '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 % f->content % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -570,16 +570,16 @@ walk_revisions(database & db, const revi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   do
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!null_id(r), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!null_id(r), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("revision %s it not a child of %s, cannot invert")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % from_rev % to_rev);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revision_t rev = db.get_revision(r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(rev.edges.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(rev.edges.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("revision %s has %d parents, cannot invert")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % r % rev.edges.size());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(rev.edges.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(rev.edges.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("revision %s it not a child of %s, cannot invert")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % from_rev % to_rev);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       r = edge_old_revision (rev.edges.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -614,12 +614,12 @@ CMD(disapprove, "disapprove", "", CMD_RE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       complete(app.opts, app.lua, project, idx(args, 0)(), child_rev);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       rev = db.get_revision(child_rev);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(rev.edges.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(rev.edges.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("revision %s has %d parents, cannot invert")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % child_rev % rev.edges.size());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       app.opts.branch = project.guess_branch(app.opts, child_rev);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("need '--branch' argument for disapproval"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       process_commit_message_args(app.opts, log_message_given, log_message,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -642,10 +642,10 @@ CMD(disapprove, "disapprove", "", CMD_RE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           set<revision_id> ancestors;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           db.get_common_ancestors (rev_set, ancestors);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(ancestors.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(ancestors.size() > 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("revisions %s and %s do not share common history, cannot invert")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             % parent_rev % child_rev);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(ancestors.size() < 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(ancestors.size() < 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("revisions share common history"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               ", but %s is not an ancestor of %s, cannot invert")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             % parent_rev % child_rev);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -654,12 +654,12 @@ CMD(disapprove, "disapprove", "", CMD_RE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       walk_revisions(db, child_rev, parent_rev);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       rev = db.get_revision(parent_rev);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(rev.edges.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(rev.edges.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("revision %s has %d parents, cannot invert")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % child_rev % rev.edges.size());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       app.opts.branch = project.guess_branch(app.opts, child_rev);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("need '--branch' argument for disapproval"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       process_commit_message_args(app.opts, log_message_given, log_message,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -678,7 +678,7 @@ CMD(disapprove, "disapprove", "", CMD_RE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   unsigned int old_head_size = heads.size();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   edge_entry const & old_edge = *rev.edges.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!null_id(edge_old_revision(old_edge)), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!null_id(edge_old_revision(old_edge)), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("cannot disapprove root revision"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   rev_inverse.new_manifest
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     = db.get_revision_manifest(edge_old_revision(old_edge));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -740,7 +740,7 @@ CMD(mkdir, "mkdir", "", CMD_REF(workspac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // we'll treat this as a user (fatal) error.  it really wouldn't make
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // sense to add a dir to .mtn-ignore and then try to add it to the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // project with a mkdir statement, but one never can tell...
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(app.opts.no_ignore || !work.ignore_file(fp),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(app.opts.no_ignore || !work.ignore_file(fp),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("ignoring directory '%s' (see '.mtn-ignore')") % fp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -777,7 +777,7 @@ void perform_add(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           for (file_path const & path : items.special)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             P(F("special file: %s") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("cannot handle special files"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -894,7 +894,7 @@ CMD(rename, "rename", "mv", CMD_REF(work
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //cases for more than one source item.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (src_paths.size() == 1 && dstr()[dstr().size() -1] == '/')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (get_path_status(*src_paths.begin()) != path::directory)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(get_path_status(dst_path) == path::directory, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(get_path_status(dst_path) == path::directory, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F(_("the specified target directory '%s/' doesn't exist.")) % dst_path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   work.perform_rename(db, src_paths, dst_path, app.opts.bookkeep_only);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1411,13 +1411,13 @@ checkout_common(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (app.opts.revision.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // use branch head revision
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("use '--revision' or '--branch' to specify what to checkout"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       set<revision_id> heads;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       project.get_branch_heads(app.opts.branch, heads,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                app.opts.ignore_suspend_certs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!heads.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!heads.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("branch '%s' is empty") % app.opts.branch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (heads.size() > 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1426,7 +1426,7 @@ checkout_common(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             P(i18n_format("  %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               % describe_revision(app.opts, app.lua, project, rid));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           P(F("choose one with '%s checkout -r<id>'") % prog_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("branch '%s' has multiple heads") % app.opts.branch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       rev_id = *(heads.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1440,7 +1440,7 @@ checkout_common(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       app.opts.branch = project.guess_branch(app.opts, rev_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       I(!app.opts.branch().empty());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(project.revision_is_in_branch(rev_id, app.opts.branch),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(project.revision_is_in_branch(rev_id, app.opts.branch),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("revision %s is not a member of branch %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % rev_id % app.opts.branch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1458,7 +1458,7 @@ checkout_common(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (args.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         // No checkout dir specified, use branch name for dir.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("you must specify a destination directory"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         dir = system_path(app.opts.branch(), origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1518,10 +1518,10 @@ CMD_AUTOMATE(checkout, N_("[DIRECTORY]")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::branch | options::opts::revision |
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     options::opts::move_conflicting_paths)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(app.opts.revision.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(app.opts.revision.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong revision count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   checkout_common(app, args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1543,7 +1543,7 @@ drop_attr(app_state & app, args_vector c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t old_roster = work.get_current_roster_shape(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_path path = file_path_external(idx(args, 0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(old_roster.has_node(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(old_roster.has_node(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("unknown path '%s'") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t new_roster = old_roster;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1560,7 +1560,7 @@ drop_attr(app_state & app, args_vector c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       I(args.size() == 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       attr_key a_key = typecast_vocab<attr_key>(idx(args, 1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(node->attrs.find(a_key) != node->attrs.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(node->attrs.find(a_key) != node->attrs.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("path '%s' does not have attribute '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % path % a_key);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       node->attrs[a_key] = make_pair(false, attr_value(""));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1610,7 +1610,7 @@ CMD(attr_get, "get", "", CMD_REF(attr), 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_path path = file_path_external(idx(args, 0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(new_roster.has_node(path), origin::user, F("unknown path '%s'") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(new_roster.has_node(path), origin::user, F("unknown path '%s'") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const_node_t node = new_roster.get_node(path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (args.size() == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1655,7 +1655,7 @@ set_attr(app_state & app, args_vector co
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t old_roster = work.get_current_roster_shape(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_path path = file_path_external(idx(args, 0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(old_roster.has_node(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(old_roster.has_node(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("unknown path '%s'") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t new_roster = old_roster;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1713,7 +1713,7 @@ CMD_AUTOMATE(get_attributes, N_("PATH"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 "at this specific revision are returned."),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::revision)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file_path path = file_path_external(idx(args,0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1730,11 +1730,11 @@ CMD_AUTOMATE(get_attributes, N_("PATH"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // get the base and the current roster of this workspace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       current = work.get_current_roster_shape(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       parent_map parents = work.get_parent_rosters(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("this command can only be used in a single-parent workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       base = parent_roster(parents.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(current.has_node(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(current.has_node(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("unknown path '%s'") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if (app.opts.revision.size() == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1746,11 +1746,11 @@ CMD_AUTOMATE(get_attributes, N_("PATH"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       complete(app.opts, app.lua, project, idx(app.opts.revision, 0)(), rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       current = db.get_roster(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(current.has_node(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(current.has_node(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("unknown path '%s' in %s") % path % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(false, origin::user, F("none or only one revision must be given"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(false, origin::user, F("none or only one revision must be given"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   basic_io::printer pr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1852,7 +1852,7 @@ CMD_AUTOMATE(set_attribute, N_("PATH KEY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 3, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 3, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set_attr(app, args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1874,7 +1874,7 @@ CMD_AUTOMATE(drop_attribute, N_("PATH [K
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              "",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              options::opts::none)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() ==1 || args.size() == 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() ==1 || args.size() == 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wrong argument count"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   drop_attr(app, args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1908,7 +1908,7 @@ void perform_commit(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     = make_restricted_revision(old_rosters, new_roster, mask,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                excluded, join_words(execid));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   restricted_rev.check_sane();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(restricted_rev.is_nontrivial(), origin::user, F("no changes to commit"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(restricted_rev.is_nontrivial(), origin::user, F("no changes to commit"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set<branch_name> old_branches = get_old_branch_names(db, old_rosters);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id restricted_rev_id = calculate_ident(restricted_rev);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1923,7 +1923,7 @@ void perform_commit(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // this will prefer --branch if it was set
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           bn_candidate =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             project.guess_branch(app.opts, edge_old_revision(edge));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(branchname() == "" || branchname == bn_candidate, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(branchname() == "" || branchname == bn_candidate, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("parent revisions of this commit are in different branches:\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               "'%s' and '%s'.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               "Please specify a branch name for the commit, with '--branch'.")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1944,7 +1944,7 @@ void perform_commit(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   app.lua.hook_validate_changes(rev_data, app.opts.branch,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 changes_validated, reason);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(changes_validated, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(changes_validated, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("changes rejected by hook: %s") % reason);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (global_sanity.debug_p())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1957,7 +1957,7 @@ void perform_commit(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   process_commit_message_args(app.opts, log_message_given, log_message);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!(log_message_given && work.has_contents_user_log() &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!(log_message_given && work.has_contents_user_log() &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       app.opts.msgfile() != "_MTN/log"), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("'_MTN/log' is non-empty and log message "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "was specified on command line.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2002,7 +2002,7 @@ void perform_commit(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // type --message="", then there wasn't any reason to stop them.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // FIXME: perhaps there should be no changelog cert in this case.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(log_message().find_first_not_of("\n\r\t ") != string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(log_message().find_first_not_of("\n\r\t ") != string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("empty log message; commit canceled"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2023,7 +2023,7 @@ void perform_commit(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   app.lua.hook_validate_commit_message(log_message, rev_data, app.opts.branch,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                        message_validated, reason);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(message_validated, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(message_validated, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("log message rejected by hook: %s") % reason);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cache_user_key(app.opts, project, keys, app.lua);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2078,7 +2078,7 @@ void perform_commit(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     data new_data = read_data(path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     // sanity check
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     file_id tid = calculate_ident(file_data(new_data));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                    E(tid == new_content, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    MONOTONE_ERROR(tid == new_content, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       F("file '%s' modified during commit, aborting")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     delta del;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2088,7 +2088,7 @@ void perform_commit(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   // If we don't err out here, the database will later.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  E(false, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  MONOTONE_ERROR(false, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     F("your database is missing version %s of file '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     % old_content % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2105,7 +2105,7 @@ void perform_commit(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 data new_data = read_data(path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 // sanity check
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 file_id tid = calculate_ident(file_data(new_data));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                E(tid == new_content, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                MONOTONE_ERROR(tid == new_content, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   F("file '%s' modified during commit, aborting")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 db.put_file(new_content, file_data(new_data));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2207,7 +2207,7 @@ CMD_NO_WORKSPACE(setup, "setup", "", CMD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (args.size() > 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     throw usage(execid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("need '--branch' argument for setup"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string dir;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2258,7 +2258,7 @@ CMD_NO_WORKSPACE(import, "import", "", C
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   database db(app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   project_t project(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(args.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("you must specify a directory to import"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (app.opts.revision.size() == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2269,7 +2269,7 @@ CMD_NO_WORKSPACE(import, "import", "", C
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       app.opts.branch = project.guess_branch(app.opts, ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       I(!app.opts.branch().empty());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(project.revision_is_in_branch(ident, app.opts.branch),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(project.revision_is_in_branch(ident, app.opts.branch),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("revision %s is not a member of branch '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % ident % app.opts.branch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2277,7 +2277,7 @@ CMD_NO_WORKSPACE(import, "import", "", C
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // use branch head revision
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!app.opts.branch().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("use '--revision' or '--branch' to specify the parent revision for the import"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       set<revision_id> heads;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2290,7 +2290,7 @@ CMD_NO_WORKSPACE(import, "import", "", C
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             P(i18n_format("  %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               % describe_revision(app.opts, app.lua, project, *i));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           P(F("choose one with '%s import -r<id>'") % prog_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("branch '%s' has multiple heads") % app.opts.branch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (!heads.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2413,10 +2413,10 @@ CMD(reset, "reset", "", CMD_REF(bisect),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   vector<bisect::entry> info = work.get_bisect_info();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!info.empty(), origin::user, F("no bisection in progress"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!info.empty(), origin::user, F("no bisection in progress"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   parent_map parents = work.get_parent_rosters(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this command can only be used in a single-parent workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id current_id = parent_id(*parents.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2424,7 +2424,7 @@ CMD(reset, "reset", "", CMD_REF(bisect),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t current_roster = work.get_current_roster_shape(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   work.update_current_roster_from_filesystem(current_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(parent_roster(parents.begin()) == current_roster, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(parent_roster(parents.begin()) == current_roster, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this command can only be used in a workspace with no pending changes"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   bisect::entry start = *info.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2458,7 +2458,7 @@ bisect_select(options const & opts, lua_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   graph_loader loader(project.db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set<revision_id> good, bad, skipped;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!info.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!info.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no bisection in progress"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (vector<bisect::entry>::const_iterator i = info.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2634,14 +2634,14 @@ bisect_update(app_state & app, bisect::t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   project_t project(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   parent_map parents = work.get_parent_rosters(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this command can only be used in a single-parent workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id current_id = parent_id(*parents.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   roster_t current_roster = work.get_current_roster_shape(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   work.update_current_roster_from_filesystem(current_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(parent_roster(parents.begin()) == current_roster, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(parent_roster(parents.begin()) == current_roster, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this command can only be used in a workspace with no pending changes"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   set<revision_id> marked_ids;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2686,7 +2686,7 @@ bisect_update(app_state & app, bisect::t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   marked_ids.erase(i->second);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                E(false, origin::user, F("conflicting bisect %s/%s on revision %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                MONOTONE_ERROR(false, origin::user, F("conflicting bisect %s/%s on revision %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   % type % i->first % i->second);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2737,7 +2737,7 @@ CMD(bisect_status, "status", "", CMD_REF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   project_t project(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   parent_map parents = work.get_parent_rosters(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(parents.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this command can only be used in a single-parent workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id current_id = parent_id(*parents.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/commands.cc        fea3779443f114ed1f043c5a1665065978830437
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/commands.cc        21d1607613ca9786a5782304c7d0f8a3fe975ae5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -493,7 +493,7 @@ namespace commands
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (matches.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("unknown command '%s'") % join_words(id));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     else if (matches.size() == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -509,7 +509,7 @@ namespace commands
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         for (set< command_id >::const_iterator iter = matches.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              iter != matches.end(); iter++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           err += '\n' + join_words(*iter)();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::user, i18n_format(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::user, i18n_format(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     I(!id.empty());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/database.cc        87c79458cd5a84c73189a899081d886ac7b0d9eb
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/database.cc        d9a4a3cf7ca90e2df61a34364502e5c90803c157
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -592,7 +592,7 @@ database::check_is_not_rosterified()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ database::check_is_not_rosterified()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!imp->table_has_data("rosters"), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!imp->table_has_data("rosters"), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this database already contains rosters"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -614,7 +614,7 @@ database_impl::check_format()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // they need to either changesetify or rosterify.  which?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (table_has_data("revisions"))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("database '%s' contains old-style revisions.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             "If you are a project leader or doing local testing:\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             "  see the file UPGRADE for instructions on upgrading.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -624,7 +624,7 @@ database_impl::check_format()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             "Sorry about the inconvenience.")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           % filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("database '%s' contains manifests but no revisions.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             "This is a very old database; it needs to be upgraded.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             "Please see 'http://wiki.monotone.ca/upgradefromchangesets/'\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -647,7 +647,7 @@ database_impl::check_caches()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       caches_are_filled = caches_are_filled && table_has_data("file_sizes");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(caches_are_filled, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(caches_are_filled, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("database '%s' lacks some cached data.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "Run '%s db regenerate_caches' to restore use of this database")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % filename % prog_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1444,13 +1444,13 @@ database_impl::fetch(results & res,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       L(FL("prepared statement %s") % query.sql_cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // no support for multiple statements here
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(*tail == 0, origin::internal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(*tail == 0, origin::internal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("multiple statements in query: %s") % query.sql_cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ncol = sqlite3_column_count(i->second.stmt());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(want_cols == any_cols || want_cols == ncol, origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(want_cols == any_cols || want_cols == ncol, origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wanted %d columns got %d in query: %s") % want_cols % ncol % query.sql_cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // bind parameters for this execution
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1529,7 +1529,7 @@ database_impl::fetch(results & res,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // We never store NULLs, so we should never see one.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           int const datatype = sqlite3_column_type(i->second.stmt(), col);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(datatype != SQLITE_NULL, origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(datatype != SQLITE_NULL, origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("null result in query: %s") % query.sql_cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           const char * value = (const char*)sqlite3_column_blob(i->second.stmt(), col);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           int bytes = sqlite3_column_bytes(i->second.stmt(), col);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1554,7 +1554,7 @@ database_impl::fetch(results & res,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   i->second.count++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(want_rows == any_rows || want_rows == nrow,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(want_rows == any_rows || want_rows == nrow,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("wanted %d rows got %d in query: %s") % want_rows % nrow % query.sql_cmd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1895,7 +1895,7 @@ database_impl::get_roster_base(revision_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   id checksum(res[0][0], origin::database);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   id calculated = calculate_ident(data(res[0][1], origin::database));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(calculated == checksum, origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(calculated == checksum, origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("roster does not match hash"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   gzip<data> dat_packed(res[0][1], origin::database);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1914,7 +1914,7 @@ database_impl::get_roster_delta(id const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   id checksum(res[0][0], origin::database);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   id calculated = calculate_ident(data(res[0][1], origin::database));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(calculated == checksum, origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(calculated == checksum, origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("roster_delta does not match hash"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   gzip<delta> del_packed(res[0][1], origin::database);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2092,7 +2092,7 @@ database_impl::get_version(id const & id
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   appl->finish(tmp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   dat = data(tmp, origin::database);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(calculate_ident(dat) == ident, origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(calculate_ident(dat) == ident, origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("delta-reconstructed '%s' item does not match hash")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % data_table);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2818,7 +2818,7 @@ database::get_revision_data(revision_id 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   decode_gzip(gzdata,rdat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // verify that we got a revision with the right id
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(id == calculate_ident(revision_data(rdat)), origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(id == calculate_ident(revision_data(rdat)), origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("revision does not match hash"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return revision_data(rdat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3095,7 +3095,7 @@ database::put_roster_for_revision(revisi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   shared_ptr<marking_map> mm_writeable = make_shared<marking_map>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   MM(*mm_writeable);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   make_roster_for_revision(*this, rev, new_id, *ros_writeable, *mm_writeable);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(rev.new_manifest == calculate_ident(*ros_writeable, false),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(rev.new_manifest == calculate_ident(*ros_writeable, false),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     rev.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("revision contains incorrect manifest_id"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // const'ify the objects, suitable for caching etc.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3434,7 +3434,7 @@ database::check_signature(key_id const &
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       shared_ptr<RSA_PublicKey> pub_key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         = std::dynamic_pointer_cast<RSA_PublicKey>(x509_key);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(pub_key, id.inner().made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(pub_key, id.inner().made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("failed to get RSA verifying key for %s") % id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,10,0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3574,7 +3574,7 @@ database_impl::oldstyle_results_to_certs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         else if (key_res.size() == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           k_id = key_id(key_res[0][0], origin::database);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("your database contains multiple keys named '%s'") % k_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4170,7 +4170,7 @@ database_impl::add_prefix_matching_const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       for (string::const_iterator i = prefix.begin(); i != prefix.end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-         E(is_xdigit(*i), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         MONOTONE_ERROR(is_xdigit(*i), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            F("bad character '%c' in id name '%s'") % *i % prefix);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4744,7 +4744,7 @@ database_impl::check_filename()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ database_impl::check_filename()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!filename.empty(), origin::user, F("no database specified"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!filename.empty(), origin::user, F("no database specified"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4757,21 +4757,21 @@ database_impl::check_db_exists()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::nonexistent:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, F("database '%s' does not exist") % filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, F("database '%s' does not exist") % filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::directory:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (directory_is_workspace(filename))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           options opts = workspace::get_options(filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(opts.dbname.as_internal().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(opts.dbname.as_internal().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("'%s' is a workspace, not a database\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               "(did you mean '%s'?)") % filename % opts.dbname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("'%s' is a directory, not a database") % filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::special:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("cannot handle special file '%s'") % filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4888,7 +4888,7 @@ database_path_helper::get_database_path(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           L(FL("no database option given or options empty"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, F("no database specified"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, F("no database specified"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (opts.dbname_type == unmanaged_db)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4910,7 +4910,7 @@ database_path_helper::get_database_path(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   vector<system_path> candidates;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   vector<system_path> search_paths;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(lua.hook_get_default_database_locations(search_paths) && search_paths.size() > 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(lua.hook_get_default_database_locations(search_paths) && search_paths.size() > 0,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user, F("no default database location configured"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (vector<system_path>::const_iterator i = search_paths.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4953,7 +4953,7 @@ database_path_helper::get_database_path(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            i != candidates.end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         err += ("\n  " + (*i).as_internal());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, i18n_format(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, i18n_format(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4968,7 +4968,7 @@ database_path_helper::maybe_set_default_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string alias;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(lua.hook_get_default_database_alias(alias) && !alias.empty(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(lua.hook_get_default_database_alias(alias) && !alias.empty(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user, F("could not query default database alias"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   P(F("using default database '%s'") % alias);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4980,15 +4980,15 @@ database_path_helper::validate_and_clean
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ database_path_helper::validate_and_clean_alias(string const & alias, path_component & pc)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(alias.find(':') == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(alias.find(':') == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("invalid database alias '%s': does not start with a colon") % alias);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string pure_alias = alias.substr(1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(pure_alias.size() > 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(pure_alias.size() > 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("invalid database alias '%s': must not be empty") % alias);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   globish matcher;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(lua.hook_get_default_database_glob(matcher),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(lua.hook_get_default_database_glob(matcher),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user, F("could not query default database glob"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!matcher.matches(pure_alias))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5000,7 +5000,7 @@ database_path_helper::validate_and_clean
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   catch (...)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("invalid database alias '%s': does contain invalid characters") % alias);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/database_check.cc  9d48083f29ab0431111e7368276625f73138bd50
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/database_check.cc  fb53f6f40f416b4c51335d7a540c5e53d80e4dfd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -150,7 +150,7 @@ check_db_integrity_check(database & db)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ check_db_integrity_check(database & db)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     L(FL("asking sqlite to check db integrity"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(db.check_integrity(), origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(db.check_integrity(), origin::database,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("file structure is corrupted; cannot check further"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -212,7 +212,7 @@ check_rosters_manifest(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           db.get_roster_and_markings(*i, ros, mm);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // When attempting to fetch a roster with no corresponding revision,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      // we fail with E(), not I() (when it tries to look up the manifest_id
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      // we fail with MONOTONE_ERROR(), not I() (when it tries to look up the manifest_id
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // to check).  std::exception catches both informative_failure's and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // logic_error's.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       catch (std::exception & e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1183,7 +1183,7 @@ check_db(database & db)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // should be origin::database, but that gives the "almost certainly a bug"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // message, which we don't want.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::no_fault, F("serious problems detected"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::no_fault, F("serious problems detected"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if (total)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     P(F("minor problems detected"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/dates.cc   9641439095909a8fbe8ee1a9456427929a1ebeca
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/dates.cc   828dc1c7498f8dea8d9458e4e6cef00fedaa1906
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -345,7 +345,7 @@ date_t::now()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   time_t t = std::time(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   s64 tu = MILLISEC(t) + get_epoch_offset();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(valid_ms_count(tu), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(valid_ms_count(tu), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("current date '%s' is outside usable range\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "(your system clock may not be set correctly)")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % std::ctime(&t));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -390,11 +390,11 @@ date_t::as_formatted_localtime(string co
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("%s seconds UTC since unix epoch") % seconds);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(seconds >= numeric_limits<time_t>::min(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(seconds >= numeric_limits<time_t>::min(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("date '%s' is out of range and cannot be formatted")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % as_iso_8601_extended());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(seconds <= numeric_limits<time_t>::max(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(seconds <= numeric_limits<time_t>::max(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("date '%s' is out of range and cannot be formatted")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % as_iso_8601_extended());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -402,7 +402,7 @@ date_t::as_formatted_localtime(string co
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // boundary. To simplify things, we generally enforce a lower limit of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // year 1902 if the system can only handle 32-bit dates.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (sizeof(time_t) <= 4 || STD_MKTIME_64BIT_WORKS == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(seconds >= -2145916800, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(seconds >= -2145916800, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("date '%s' is out of range and cannot be formatted")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % as_iso_8601_extended());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -445,7 +445,7 @@ date_t::as_formatted_localtime(string co
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return string();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("date '%s' is too long when formatted using '%s'"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       " (the result must fit in %d characters)")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % (sizeof buf - 1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -482,7 +482,7 @@ date_t::from_formatted_localtime(string 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // We generally enforce a lower limit of year 1902 if the system can only
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // handle 32-bit dates.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (sizeof(time_t) <= 4 || STD_MKTIME_64BIT_WORKS == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(tb.tm_year > 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(tb.tm_year > 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("date '%s' is out of range and cannot be parsed")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -504,7 +504,7 @@ date_t::from_formatted_localtime(string 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   tm check(*localtime(&t)); // back to local timezone values
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(tb.tm_sec   == check.tm_sec &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(tb.tm_sec   == check.tm_sec &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     tb.tm_min   == check.tm_min &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     tb.tm_hour  == check.tm_hour &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     tb.tm_mday  == check.tm_mday &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -563,7 +563,7 @@ date_t::date_t(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if (mid == string::npos)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               mid = s.rfind(' ');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(mid != string::npos, origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(mid != string::npos, origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // Discount matches before the space or 'T' separator.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -578,18 +578,18 @@ date_t::date_t(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if (s.at(tz_start) == 'Z')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(tz_start == s.size() - 1, origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(tz_start == s.size() - 1, origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               i = s.size() - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(s.at(i) >= '0' && s.at(i) <= '9'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(s.at(i) >= '0' && s.at(i) <= '9'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 && s.at(i-1) >= '0' && s.at(i-1) <= '9', origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               u8 last_part = (s.at(i-1) - '0') * 10 + (s.at(i) - '0');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               i -= 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(i >= tz_start, origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(i >= tz_start, origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               if (i == tz_start)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 // Only an hour offset was given. Multiply accordingly.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 timezone_offset = last_part * HOUR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -600,7 +600,7 @@ date_t::date_t(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     i--;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   // Minutes parsed, now read hours of time zone offset.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  E(s.at(i) >= '0' && s.at(i) <= '9'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  MONOTONE_ERROR(s.at(i) >= '0' && s.at(i) <= '9'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     && s.at(i-1) >= '0' && s.at(i-1) <= '9', origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   u8 tz_hours = (s.at(i-1) - '0') * 10 + (s.at(i) - '0');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -611,7 +611,7 @@ date_t::date_t(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               if (s.at(i) == '-')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 timezone_offset = -timezone_offset;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                E(s.at(i) == '+', origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                MONOTONE_ERROR(s.at(i) == '+', origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -631,12 +631,12 @@ date_t::date_t(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // seconds
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       u8 sec;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(s.at(i) >= '0' && s.at(i) <= '9'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(s.at(i) >= '0' && s.at(i) <= '9'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         && s.at(i-1) >= '0' && s.at(i-1) <= '5',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       sec = (s.at(i-1) - '0')*10 + (s.at(i) - '0');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       i -= 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(sec <= 60, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(sec <= 60, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("seconds out of range"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // optional colon
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -645,12 +645,12 @@ date_t::date_t(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // minutes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       u8 min;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(s.at(i) >= '0' && s.at(i) <= '9'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(s.at(i) >= '0' && s.at(i) <= '9'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         && s.at(i-1) >= '0' && s.at(i-1) <= '5',
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       min = (s.at(i-1) - '0')*10 + (s.at(i) - '0');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       i -= 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(min < 60, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(min < 60, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("minutes out of range"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // optional colon
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -659,22 +659,22 @@ date_t::date_t(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // hours
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       u8 hour;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E((s.at(i-1) >= '0' && s.at(i-1) <= '1'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR((s.at(i-1) >= '0' && s.at(i-1) <= '1'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          && s.at(i) >= '0' && s.at(i) <= '9')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         || (s.at(i-1) == '2' && s.at(i) >= '0' && s.at(i) <= '3'),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       hour = (s.at(i-1) - '0')*10 + (s.at(i) - '0');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       i -= 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(hour < 24, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(hour < 24, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("hour out of range"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // We accept 'T' as well as spaces between the date and the time
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(s.at(i) == 'T' || s.at(i) == ' ', origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(s.at(i) == 'T' || s.at(i) == ' ', origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       i--;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // day
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       u8 day;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(s.at(i-1) >= '0' && s.at(i-1) <= '3'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(s.at(i-1) >= '0' && s.at(i-1) <= '3'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         && s.at(i) >= '0' && s.at(i) <= '9', origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       day = (s.at(i-1) - '0')*10 + (s.at(i) - '0');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       i -= 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -685,10 +685,10 @@ date_t::date_t(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // month
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       u8 month;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(s.at(i-1) >= '0' && s.at(i-1) <= '1'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(s.at(i-1) >= '0' && s.at(i-1) <= '1'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         && s.at(i) >= '0' && s.at(i) <= '9', origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       month = (s.at(i-1) - '0')*10 + (s.at(i) - '0');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(month >= 1 && month <= 12, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(month >= 1 && month <= 12, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("month out of range in '%s'") % s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       i -= 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -697,7 +697,7 @@ date_t::date_t(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         i--;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // year
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(i >= 3, origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(i >= 3, origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // this counts down through zero and stops when it wraps around
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // (size_t being unsigned)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -705,15 +705,15 @@ date_t::date_t(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       u32 digit = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       while (i < s.size())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(s.at(i) >= '0' && s.at(i) <= '9', origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(s.at(i) >= '0' && s.at(i) <= '9', origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           year += (s.at(i) - '0')*digit;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           i--;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           digit *= 10;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(year >= 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(year >= 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("date too early (monotone only goes back to 0001-01-01T00:00:00)"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(year <= 292278994, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(year <= 292278994, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("date too late (monotone only goes forward to year 292,278,993)"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       u8 mdays;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -722,7 +722,7 @@ date_t::date_t(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         mdays = DAYS_PER_MONTH[month-1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(day >= 1 && day <= mdays, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(day >= 1 && day <= mdays, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("day out of range for its month in '%s'") % s);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       broken_down_time t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -739,7 +739,7 @@ date_t::date_t(string const & s)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   catch (std::out_of_range)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, parse_err_msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/file_io.cc 957aebe4616af705852f92ac18fbc419ae7334e4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/file_io.cc df8ad78a5ee3ea172f70502798bd0c5dc6ca409b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -57,7 +57,7 @@ require_path_is_nonexistent(any_path con
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ require_path_is_nonexistent(any_path const & path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             i18n_format const & message)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!path_exists(path), origin::user, message);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!path_exists(path), origin::user, message);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -69,13 +69,13 @@ require_path_is_file(any_path const & pa
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   switch (get_path_status(path))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::nonexistent:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, message_if_nonexistent);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, message_if_nonexistent);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::file:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::directory:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, message_if_directory);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, message_if_directory);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::special:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, message_if_special);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, message_if_special);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -88,11 +88,11 @@ require_path_is_directory(any_path const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   switch (get_path_status(path))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::nonexistent:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, message_if_nonexistent);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, message_if_nonexistent);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::file:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, message_if_file);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, message_if_file);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::special:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, message_if_special);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, message_if_special);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::directory:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -183,10 +183,10 @@ mkdir_p(any_path const & p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::directory:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::file:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("could not create directory '%s': it is a file") % p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::special:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("could not create directory '%s': it is a special file") % p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::nonexistent:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       std::string const current = p.as_external();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -228,7 +228,7 @@ delete_file_or_dir_shallow(any_path cons
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ delete_file_or_dir_shallow(any_path const & p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(path_exists(p), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(path_exists(p), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("object to delete, '%s', does not exist") % p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   do_remove(p.as_external());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -277,7 +277,7 @@ move_path(any_path const & old_path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ move_path(any_path const & old_path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           any_path const & new_path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(path_exists(old_path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(path_exists(old_path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("rename source path '%s' does not exist") % old_path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   require_path_is_nonexistent(new_path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                               F("rename target '%s' already exists")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -296,7 +296,7 @@ read_data(any_path const & p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ifstream file(p.as_external().c_str(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 ios_base::in | ios_base::binary);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(file, origin::user, F("cannot open file '%s' for reading") % p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(file, origin::user, F("cannot open file '%s' for reading") % p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   unfiltered_pipe->start_msg();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   file >> *unfiltered_pipe;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   unfiltered_pipe->end_msg();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -312,7 +312,7 @@ read_data_stdin()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ read_data_stdin()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   static bool have_consumed_stdin = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!have_consumed_stdin, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!have_consumed_stdin, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("cannot read standard input multiple times"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   have_consumed_stdin = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   unfiltered_pipe->start_msg();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -343,7 +343,7 @@ write_data_impl(any_path const & p,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 any_path const & tmp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 bool user_private)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!directory_exists(p), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!directory_exists(p), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("file '%s' cannot be overwritten as data; it is a directory") % p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   make_dir_for(p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -438,7 +438,7 @@ walk_tree(file_path const & path, tree_w
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   switch (get_path_status(path))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::nonexistent:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, F("no such file or directory: '%s'") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, F("no such file or directory: '%s'") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::file:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       walker.visit_file(path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/file_io.hh 7eb18c4cc3c1256bc48b85ee183770432ff25bab
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/file_io.hh 168e0fc92d840714cb3ed8dbf1ce9207d64838dc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -28,7 +28,7 @@ void assert_path_is_directory(any_path c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void assert_path_is_file(any_path const & path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void assert_path_is_directory(any_path const & path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// use E()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// use MONOTONE_ERROR()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void require_path_is_nonexistent(any_path const & path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                  i18n_format const & message);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void require_path_is_file(any_path const & path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/git_export.cc      ffae5a4230a3582454eb46057dbeb0a44e08cf17
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/git_export.cc      c7e484e62c69b927ab0dc9ba9a36b91af9297a52
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -86,7 +86,7 @@ validate_author_mappings(lua_hooks & lua
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (map<string, string>::const_iterator i = authors.begin(); 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        i != authors.end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(lua.hook_validate_git_author(i->second), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(lua.hook_validate_git_author(i->second), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("invalid git author '%s' mapped from monotone author '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % i->second % i->first);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -106,17 +106,17 @@ import_marks(system_path const & marks_f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       string tmp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       marks.get(c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(c == ':', origin::user, F("missing leading ':' in marks file"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(c == ':', origin::user, F("missing leading ':' in marks file"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       marks >> mark;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       marks.get(c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(c == ' ', origin::user, F("missing space after mark"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(c == ' ', origin::user, F("missing space after mark"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       marks >> tmp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(tmp.size() == 40, origin::user, F("bad revision id in marks file"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(tmp.size() == 40, origin::user, F("bad revision id in marks file"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revision_id revid(decode_hexenc(tmp, origin::user), origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       marks.get(c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(c == '\n', origin::user, F("incomplete line in marks file"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(c == '\n', origin::user, F("incomplete line in marks file"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       marked_revs[revid] = mark;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (mark > mark_id) mark_id = mark+1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -301,7 +301,7 @@ export_changes(database & db, lua_hooks 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           string unmapped_key;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           lua.hook_unmapped_git_author(author_key, unmapped_key);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(lua.hook_validate_git_author(unmapped_key), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(lua.hook_validate_git_author(unmapped_key), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("invalid git author '%s' from monotone author key '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             % unmapped_key % author_key);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           valid_authors.insert(make_pair(author_key, unmapped_key));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -318,7 +318,7 @@ export_changes(database & db, lua_hooks 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           string unmapped_name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           lua.hook_unmapped_git_author(author_name, unmapped_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(lua.hook_validate_git_author(unmapped_name), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(lua.hook_validate_git_author(unmapped_name), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("invalid git author '%s' from monotone author value '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             % unmapped_name % author_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           valid_authors.insert(make_pair(author_name, unmapped_name));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/globish.cc 05742d8536befa06b6edfb9a85308e45005375c4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/globish.cc aa5c98dceaefa16fae174d106d2e82402efcc996
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -51,14 +51,14 @@ compile_charclass(string const & pat, st
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   char bra = (char)META_CC_BRA;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   p++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(p != pat.end(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(p != pat.end(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("invalid pattern '%s': unmatched '['") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (*p == '!' || *p == '^')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       bra = (char)META_CC_INV_BRA;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       p++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(p != pat.end(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(p != pat.end(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("invalid pattern '%s': unmatched '['") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -84,21 +84,21 @@ compile_charclass(string const & pat, st
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // the cast is needed because boost::format will not obey the %x
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // if given a 'char'.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E((widen<unsigned int, char>(*p)) >= ' ', made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR((widen<unsigned int, char>(*p)) >= ' ', made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("invalid pattern '%s': control character 0x%02x is not allowed")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             % pat % (widen<unsigned int, char>(*p)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           unsigned int start = widen<unsigned int, char>(in_class.end()[-1]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           unsigned int stop = widen<unsigned int, char>(*p);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(start != stop, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(start != stop, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("invalid pattern '%s': "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               "one-element character ranges are not allowed") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(start < stop, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(start < stop, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("invalid pattern '%s': "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               "endpoints of a character range must be in "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               "ascending numeric order") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(start < 0x80 && stop < 0x80, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(start < 0x80 && stop < 0x80, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("invalid pattern '%s': cannot use non-ASCII characters "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               "in classes") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -109,15 +109,15 @@ compile_charclass(string const & pat, st
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             in_class.push_back((char)r);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(*p != '[', made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(*p != '[', made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("syntax error in '%s': "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             "character classes may not be nested") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E((widen<unsigned int, char>(*p)) >= ' ', made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR((widen<unsigned int, char>(*p)) >= ' ', made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("invalid pattern '%s': control character 0x%02x is not allowed")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % pat % (widen<unsigned int, char>(*p)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E((widen<unsigned int, char>(*p)) < 0x80, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR((widen<unsigned int, char>(*p)) < 0x80, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("invalid pattern '%s': cannot use non-ASCII characters in classes")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -125,10 +125,10 @@ compile_charclass(string const & pat, st
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       p++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(p != pat.end(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(p != pat.end(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("invalid pattern '%s': unmatched '['") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!in_class.empty(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!in_class.empty(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("invalid pattern '%s': empty character class") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // minor optimization: one-element non-inverted character class becomes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -157,7 +157,7 @@ compile_frag(string const & pat, back_in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     switch (*p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E((widen<unsigned int, char>(*p)) >= ' ', made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR((widen<unsigned int, char>(*p)) >= ' ', made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("invalid pattern '%s': control character 0x%02x is not allowed")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           % pat % (widen<unsigned int, char>(*p)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -188,10 +188,10 @@ compile_frag(string const & pat, back_in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       case '\\':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         p++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(p != pat.end(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(p != pat.end(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("invalid pattern '%s': un-escaped \\ at end") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E((widen<unsigned int, char>(*p)) >= ' ', made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR((widen<unsigned int, char>(*p)) >= ' ', made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("invalid pattern '%s': control character 0x%02x is not allowed")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           % pat % (widen<unsigned int, char>(*p)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -203,7 +203,7 @@ compile_frag(string const & pat, back_in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       case ']':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, made_from, F("invalid pattern '%s': unmatched ']'") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, made_from, F("invalid pattern '%s': unmatched ']'") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       case '{':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         // There's quite a bit of optimization we could be doing on
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -211,7 +211,7 @@ compile_frag(string const & pat, back_in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         // nested alternatives; so we're not doing any of it now.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         // (Look at emacs's regexp-opt.el for inspiration.)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         brace_depth++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(brace_depth < 6, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(brace_depth < 6, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("invalid pattern '%s': braces nested too deeply") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         *to++ = META_ALT_BRA;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -224,14 +224,14 @@ compile_frag(string const & pat, back_in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       case '}':
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(brace_depth > 0, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(brace_depth > 0, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("invalid pattern '%s': unmatched '}'") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         brace_depth--;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         *to++ = META_ALT_KET;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(brace_depth == 0, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(brace_depth == 0, made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("invalid pattern '%s': unmatched '{'") % pat);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/key_packet.cc      ee1d82af2b1cc782b422d0b19d5809c2f6b2d2ef
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/key_packet.cc      e9db9c5b6de4aa7a90510c88ff94c0821e83c557
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -90,20 +90,20 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void validate_base64(string const & s) const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!s.empty()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!s.empty()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         && s.find_first_not_of(constants::legal_base64_bytes) == string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("malformed key_packet: invalid base64 block"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void validate_arg_base64(string const & s) const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(s.find_first_not_of(constants::legal_base64_bytes) == string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(s.find_first_not_of(constants::legal_base64_bytes) == string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("malformed key_packet: invalid base64 block"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void validate_key(string const & k) const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!k.empty()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!k.empty()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         && k.find_first_not_of(constants::legal_key_name_bytes) == string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("malformed key_packet: invalid key name"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -123,7 +123,7 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       catch (Botan::Decoding_Error const & e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("malformed key_packet: invalid public key data for '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               % name % e.what());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -143,7 +143,7 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       string next;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       iss >> next;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(next.empty(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(next.empty(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("malformed key_packet: too many arguments in header"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/key_store.cc       e4a85bbc2cb19021f0817aa0969968f9b4509239
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/key_store.cc       0d6680d1ede9e073cd790065cd92e77889ac7928
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -84,7 +84,7 @@ struct key_store_state
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       non_interactive(app.opts.non_interactive),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       have_read(false), lua(app.lua)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(app.opts.key_dir_given
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(app.opts.key_dir_given
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       || app.opts.key_dir != system_path(get_default_keydir(), origin::user)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       || app.opts.conf_dir_given
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       || !app.opts.no_default_confdir,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -133,22 +133,22 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     keyreader(key_store_state & kss): kss(kss) {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     virtual void consume_file_data(file_id const & /* ident */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    file_data const & /* dat */)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    {E(false, origin::system, F("extraneous data in key store"));}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {MONOTONE_ERROR(false, origin::system, F("extraneous data in key store"));}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     virtual void consume_file_delta(file_id const & /* id_old */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                     file_id const & /* id_new */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                     file_delta const & /* del */)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    {E(false, origin::system, F("extraneous data in key store"));}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {MONOTONE_ERROR(false, origin::system, F("extraneous data in key store"));}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     virtual void consume_revision_data(revision_id const & /* ident */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                        revision_data const & /* dat */)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    {E(false, origin::system, F("extraneous data in key store"));}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {MONOTONE_ERROR(false, origin::system, F("extraneous data in key store"));}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     virtual void consume_revision_cert(cert const & /* t */)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    {E(false, origin::system, F("extraneous data in key store"));}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {MONOTONE_ERROR(false, origin::system, F("extraneous data in key store"));}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     virtual void consume_public_key(key_name const & /* ident */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                     rsa_pub_key const & /* k */)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    {E(false, origin::system, F("extraneous data in key store"));}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {MONOTONE_ERROR(false, origin::system, F("extraneous data in key store"));}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     virtual void consume_key_pair(key_name const & name,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   keypair const & kp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -156,7 +156,7 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       L(FL("reading key pair '%s' from key store") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       key_id ident = key_hash_code(name, kp.pub);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(kss.put_key_pair_memory(full_key_info(ident, key_info(name, kp))),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(kss.put_key_pair_memory(full_key_info(ident, key_info(name, kp))),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("key store has multiple copies of the key with id %s") % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -417,25 +417,25 @@ struct key_delete_validator : public pac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   virtual ~key_delete_validator() {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   virtual void consume_file_data(file_id const & /* ident */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                  file_data const & /* dat */)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  { E(false, origin::system, F("invalid data in key file")); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  { MONOTONE_ERROR(false, origin::system, F("invalid data in key file")); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   virtual void consume_file_delta(file_id const & /* id_old */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   file_id const & /* id_new */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   file_delta const & /* del */)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  { E(false, origin::system, F("invalid data in key file")); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  { MONOTONE_ERROR(false, origin::system, F("invalid data in key file")); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   virtual void consume_revision_data(revision_id const & /* ident */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                      revision_data const & /* dat */)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  { E(false, origin::system, F("invalid data in key file")); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  { MONOTONE_ERROR(false, origin::system, F("invalid data in key file")); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   virtual void consume_revision_cert(cert const & /* t */)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  { E(false, origin::system, F("invalid data in key file")); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  { MONOTONE_ERROR(false, origin::system, F("invalid data in key file")); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   virtual void consume_public_key(key_name const & /* ident */,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   rsa_pub_key const & /* k */)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  { E(false, origin::system, F("invalid data in key file")); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  { MONOTONE_ERROR(false, origin::system, F("invalid data in key file")); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   virtual void consume_key_pair(key_name const & name,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 keypair const & kp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      L(FL("reading key pair '%s' from key store for validation") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      key_id ident = key_hash_code(name, kp.pub);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     E(ident == expected_ident, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     MONOTONE_ERROR(ident == expected_ident, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        F("expected key with id %s in key file '%s', got key with id %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          % expected_ident % file % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -527,7 +527,7 @@ get_passphrase(utf8 & phrase,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if (strcmp(pass1, pass2) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(i++ < 2, origin::user, F("too many failed passphrases"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(i++ < 2, origin::user, F("too many failed passphrases"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           P(F("passphrases do not match, try again"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -556,7 +556,7 @@ key_store_state::decrypt_private_key(key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   keypair kp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   key_name name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(maybe_get_key_pair(id, name, kp), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(maybe_get_key_pair(id, name, kp), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no key pair %s found in key store '%s'") % id % key_dir);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("%d-byte private key") % kp.priv().size());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -605,7 +605,7 @@ key_store_state::decrypt_private_key(key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             cycles++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             L(FL("decrypt_private_key: failure %d to load encrypted key: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               % cycles % e.what());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(cycles < 3 && !non_interactive, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(cycles < 3 && !non_interactive, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               F("failed to decrypt old private RSA key, probably incorrect "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 "passphrase or missing 'get_passphrase' lua hook"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -618,7 +618,7 @@ key_store_state::decrypt_private_key(key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   shared_ptr<RSA_PrivateKey> priv_key;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   priv_key = dynamic_pointer_cast<RSA_PrivateKey>(pkcs8_key);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(priv_key, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(priv_key, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("failed to extract RSA private key from PKCS#8 keypair"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Cache the decrypted key if we're allowed.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -659,7 +659,7 @@ key_store::create_key_pair(database & db
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (i->second.first == ident)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         exists = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!exists, origin::user, F("key '%s' already exists") % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!exists, origin::user, F("key '%s' already exists") % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   utf8 prompted_passphrase;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!maybe_passphrase)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -771,7 +771,7 @@ key_store::change_key_passphrase(key_id 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     s->maybe_read_key_dir();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     key_map::const_iterator i = s->keys.find(id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(i != s->keys.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(i != s->keys.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("no key pair '%s' found in key store '%s'") % id % s->key_dir);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     name = i->second.first;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     kp = i->second.second;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -853,7 +853,7 @@ key_store::decrypt_rsa(key_id const & id
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   catch (Botan::Exception & e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, ciphertext.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, ciphertext.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("Botan error decrypting data: '%s'") % e.what());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -876,7 +876,7 @@ key_store::make_signature(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ssh_agent & agent = s->get_agent();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //sign with ssh-agent (if connected)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(agent.connected() || s->ssh_sign_mode != "only", origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(agent.connected() || s->ssh_sign_mode != "only", origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("you have chosen to sign only with ssh-agent but ssh-agent"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       " does not seem to be running"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (s->ssh_sign_mode == "yes"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -911,7 +911,7 @@ key_store::make_signature(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string ssh_sig = sig_string;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(ssh_sig.length() > 0 || s->ssh_sign_mode != "only", origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(ssh_sig.length() > 0 || s->ssh_sign_mode != "only", origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("you don't seem to have your monotone key imported "));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (ssh_sig.length() <= 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -979,7 +979,7 @@ key_store::make_signature(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (s->ssh_sign_mode == "check" && ssh_sig.length() > 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(ssh_sig == sig_string, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(ssh_sig == sig_string, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("make_signature: ssh signature (%i) != monotone signature (%i)\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "ssh signature     : %s\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "monotone signature: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -996,7 +996,7 @@ key_store::make_signature(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cert_status s = db.check_signature(id, tosign, signature);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   I(s != cert_unknown);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(s == cert_ok, origin::system, F("make_signature: signature is not valid"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(s == cert_ok, origin::system, F("make_signature: signature is not valid"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1007,7 +1007,7 @@ key_store::add_key_to_agent(key_id const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ key_store::add_key_to_agent(key_id const & id)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ssh_agent & agent = s->get_agent();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(agent.connected(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(agent.connected(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no ssh-agent is available, cannot add key %s") % id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   shared_ptr<RSA_PrivateKey> priv = s->decrypt_private_key(id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1120,7 +1120,7 @@ key_store_state::migrate_old_key_pair
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         L(FL("migrate_old_key_pair: failure %d to load old private key: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           % cycles % e.what());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(cycles <= 3, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(cycles <= 3, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("failed to decrypt old private RSA key, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             "probably incorrect passphrase"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/keys.cc    1af4995cc9311c4d609b6c087b9296675ce3d82d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/keys.cc    a3268f589832c29c92a3ffdb81bbe288ce5f7d60
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -39,7 +39,7 @@ load_key_pair(key_store & keys, key_id c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ load_key_pair(key_store & keys, key_id const & id)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(keys.key_pair_exists(id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(keys.key_pair_exists(id), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no key pair %s found in key store '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % id % keys.get_key_dir());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -83,7 +83,7 @@ namespace {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             rsa_pub_key pub_key;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             db.get_key(chosen_key, pub_key);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(keys_match(name, pub_key, name, priv_key.pub),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(keys_match(name, pub_key, name, priv_key.pub),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               F("the key %s stored in your database does\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 "not match the version in your local key store!")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -98,10 +98,10 @@ namespace {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     vector<key_id> all_privkeys;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     keys.get_key_ids(all_privkeys);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(key_requiredness == key_optional || !all_privkeys.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(key_requiredness == key_optional || !all_privkeys.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("you have no private key to make signatures with.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         "Perhaps you need to 'genkey <your email>'"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(key_requiredness == key_optional || all_privkeys.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(key_requiredness == key_optional || all_privkeys.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("you have multiple private keys.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         "Pick one to use for signatures by adding "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         "'-k<keyname>' to your command"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -140,7 +140,7 @@ get_user_key(options const & opts, lua_h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("a key is required for this operation, but the '--key' option "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               "was given with an empty argument"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/lua.cc     3d0789badf13ac3d28e5672906d689b5f00355b6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/lua.cc     e8f72fd1fcb624ab07530201231676e9b8190ad6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -507,7 +507,7 @@ LUAEXT(include, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ LUAEXT(include, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const char *path = luaL_checkstring(LS, -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(path, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(path, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("%s called with an invalid parameter") % "Include");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   bool res = run_file(LS, path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -519,7 +519,7 @@ LUAEXT(includedir, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ LUAEXT(includedir, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const char *pathstr = luaL_checkstring(LS, -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(pathstr, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(pathstr, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("%s called with an invalid parameter") % "IncludeDir");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   run_directory(LS, pathstr, "*");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -531,7 +531,7 @@ LUAEXT(includedirpattern, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const char *pathstr = luaL_checkstring(LS, -2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const char *pattern = luaL_checkstring(LS, -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(pathstr && pattern, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(pathstr && pattern, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("%s called with an invalid parameter") % "IncludeDirPattern");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   run_directory(LS, pathstr, pattern);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -615,10 +615,10 @@ run_directory(lua_State * st, char const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   switch (get_path_status(path))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::nonexistent:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, F("directory '%s' does not exist") % pathstr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, F("directory '%s' does not exist") % pathstr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::file:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::special:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, F("'%s' is not a directory") % pathstr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, F("'%s' is not a directory") % pathstr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::directory:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -640,7 +640,7 @@ run_directory(lua_State * st, char const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         .loadfile(i->c_str())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         .call(0,1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         .ok();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(res, origin::user, F("lua error while loading rcfile '%s'") % *i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(res, origin::user, F("lua error while loading rcfile '%s'") % *i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       L(FL("'%s' is ok") % *i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/lua_hooks.cc       b37cb78102f923e8a71cc9c7240d148365c6c8a3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/lua_hooks.cc       113137cd5df903dd3b761e54f5c85e8106aa4e51
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -211,7 +211,7 @@ lua_hooks::load_rcfile(utf8 const & rc)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       L(FL("opening rcfile '%s'") % rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       data dat = read_data_for_command_line(rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(run_string(st, dat().c_str(), rc().c_str()), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(run_string(st, dat().c_str(), rc().c_str()), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("lua error while loading rcfile '%s'") % rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       L(FL("'%s' is ok") % rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -240,13 +240,13 @@ lua_hooks::load_rcfile(any_path const & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (exists)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       L(FL("opening rcfile '%s'") % rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(run_file(st, rc.as_external().c_str()), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(run_file(st, rc.as_external().c_str()), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("lua error while loading '%s'") % rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       L(FL("'%s' is ok") % rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!required, origin::user, F("rcfile '%s' does not exist") % rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!required, origin::user, F("rcfile '%s' does not exist") % rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       L(FL("skipping nonexistent rcfile '%s'") % rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/luaext_parse_basic_io.cc   f7a89950b6355b57d24ccf12331c7e2beae686bd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/luaext_parse_basic_io.cc   9b52b20d8bc3b47c1a12c97aa13406d131d9b6ef
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -45,7 +45,7 @@ LUAEXT(parse_basic_io, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case basic_io::TOK_STRING:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case basic_io::TOK_HEX:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(!res.empty(), origin::user, F("bad input to parse_basic_io"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(!res.empty(), origin::user, F("bad input to parse_basic_io"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               res.back().second.push_back(got);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/merge_conflict.cc  1223ab20cb8b2718dc9fe2ec1203d162e1f52c68
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/merge_conflict.cc  6b44d626d3afeba6f1d70639ed438efc82340b65
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1888,7 +1888,7 @@ read_orphaned_node_conflict(basic_io::pa
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           pars.str();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F(conflict_resolution_not_supported_msg) % pars.token % "orphaned_node");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1934,9 +1934,9 @@ validate_orphaned_node_conflicts(basic_i
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           read_orphaned_node_conflict(pars, file_conflict, left_roster, right_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::user, F("expected orphaned_directory or orphaned_file, found %s") % pars.token);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::user, F("expected orphaned_directory or orphaned_file, found %s") % pars.token);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(merge_conflict.nid == file_conflict.nid, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(merge_conflict.nid == file_conflict.nid, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F(conflicts_mismatch_msg));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       merge_conflict.resolution = file_conflict.resolution;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1946,7 +1946,7 @@ validate_orphaned_node_conflicts(basic_i
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           std::vector<orphaned_node_conflict>::iterator tmp = i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(++tmp == conflicts.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(++tmp == conflicts.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("conflicts file does not match current conflicts"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2096,14 +2096,14 @@ read_dropped_modified_conflict(basic_io:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else if (pars.symp (syms::resolved_keep_left))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           conflict.left_resolution.resolution = resolve_conflicts::keep;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           pars.sym();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else if (pars.symp (syms::resolved_keep_right))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(!conflict.orphaned, origin::user, F("orphaned files must be renamed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           conflict.right_resolution.resolution = resolve_conflicts::keep;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           pars.sym();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2149,7 +2149,7 @@ read_dropped_modified_conflict(basic_io:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           pars.str();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F(conflict_resolution_not_supported_msg) % pars.token % "dropped_modified");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } // read_dropped_modified_conflict
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2197,7 +2197,7 @@ validate_dropped_modified_conflicts(basi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       read_dropped_modified_conflict(pars, file_conflict, left_rid, left_roster, right_rid, right_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // Note that we do not confirm the file ids.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(merge_conflict.dropped_side == file_conflict.dropped_side &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(merge_conflict.dropped_side == file_conflict.dropped_side &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         merge_conflict.left_nid == file_conflict.left_nid &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         merge_conflict.right_nid == file_conflict.right_nid,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2213,7 +2213,7 @@ validate_dropped_modified_conflicts(basi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           std::vector<dropped_modified_conflict>::iterator tmp = i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(++tmp == conflicts.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(++tmp == conflicts.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              F(conflicts_mismatch_msg));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2280,7 +2280,7 @@ read_duplicate_name_conflict(basic_io::p
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           pars.str();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F(conflict_resolution_not_supported_msg) % pars.token % "duplicate_name");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2324,7 +2324,7 @@ validate_duplicate_name_conflicts(basic_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       read_duplicate_name_conflict(pars, file_conflict, left_roster, right_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // Note that we do not confirm the file ids.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(merge_conflict.left_nid == file_conflict.left_nid &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(merge_conflict.left_nid == file_conflict.left_nid &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         merge_conflict.right_nid == file_conflict.right_nid,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F(conflicts_mismatch_msg));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2337,7 +2337,7 @@ validate_duplicate_name_conflicts(basic_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           std::vector<duplicate_name_conflict>::iterator tmp = i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(++tmp == conflicts.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(++tmp == conflicts.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              F(conflicts_mismatch_msg));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2490,7 +2490,7 @@ read_file_content_conflict(basic_io::par
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           pars.str();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F(conflict_resolution_not_supported_msg) % pars.token % "file_content");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2534,7 +2534,7 @@ validate_file_content_conflicts(basic_io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       read_file_content_conflict(pars, file_conflict, left_roster, right_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(merge_conflict.nid == file_conflict.nid, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(merge_conflict.nid == file_conflict.nid, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F(conflicts_mismatch_msg));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       merge_conflict.resolution = file_conflict.resolution;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2544,7 +2544,7 @@ validate_file_content_conflicts(basic_io
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           std::vector<file_content_conflict>::iterator tmp = i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(++tmp == conflicts.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(++tmp == conflicts.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("conflicts file does not match current conflicts"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2602,7 +2602,7 @@ read_conflict_file_core(basic_io::parser
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       read_file_content_conflicts(pars, result.file_content_conflicts, left_roster, right_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(pars.tok.in.lookahead == EOF, pars.tok.in.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(pars.tok.in.lookahead == EOF, pars.tok.in.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("extra data in file"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } // read_conflict_file_core
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2730,13 +2730,13 @@ parse_resolve_conflicts_opts (options co
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       pars.esym(syms::left);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       pars.hex(temp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(left_rid == decode_hexenc_as<revision_id>(temp, src.made_from),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(left_rid == decode_hexenc_as<revision_id>(temp, src.made_from),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("left revision id does not match conflict file"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       pars.esym(syms::right);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       pars.hex(temp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(right_rid == decode_hexenc_as<revision_id>(temp, src.made_from),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(right_rid == decode_hexenc_as<revision_id>(temp, src.made_from),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("right revision id does not match conflict file"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2768,9 +2768,9 @@ attach_node (lua_hooks & lua,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   I(!target_path.empty());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!new_roster.has_node(target_path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!new_roster.has_node(target_path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("'%s' already exists") % target_path.as_external());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(new_roster.has_node(target_path.dirname()), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(new_roster.has_node(target_path.dirname()), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("directory '%s' does not exist or is unknown") % target_path.dirname());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   new_roster.attach_node (nid, target_path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2819,7 +2819,7 @@ roster_merge_result::resolve_orphaned_no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         case resolve_conflicts::drop:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if (is_dir_t(roster.get_node(conflict.nid)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(downcast_to_dir_t(roster.get_node(conflict.nid))->children.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(downcast_to_dir_t(roster.get_node(conflict.nid))->children.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("can't drop directory '%s'; it is not empty") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2833,12 +2833,12 @@ roster_merge_result::resolve_orphaned_no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         case resolve_conflicts::none:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("no resolution provided for orphaned_node '%s'") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("invalid resolution for orphaned_node '%s'") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     } // end for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2927,13 +2927,13 @@ resolve_dropped_modified_one(lua_hooks &
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (nid == the_null_node)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(resolution.resolution == resolve_conflicts::none, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(resolution.resolution == resolve_conflicts::none, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("extra %s_resolution provided for dropped_modified '%s'") % side_image % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(resolution.resolution != resolve_conflicts::none, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(resolution.resolution != resolve_conflicts::none, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         (other_resolution.resolution == resolve_conflicts::none) ?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no resolution provided for dropped_modified '%s'") % name :
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no %s_resolution provided for dropped_modified '%s'") % side_image % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3169,7 +3169,7 @@ resolve_duplicate_name_one_side(lua_hook
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case resolve_conflicts::content_user:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(other_resolution.resolution == resolve_conflicts::drop ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(other_resolution.resolution == resolve_conflicts::drop ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           other_resolution.resolution == resolve_conflicts::rename,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("inconsistent left/right resolutions for '%s'") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3199,13 +3199,13 @@ resolve_duplicate_name_one_side(lua_hook
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (is_dir_t(result_roster.get_node(nid)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           const_dir_t n = downcast_to_dir_t(result_roster.get_node(nid));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(n->children.empty(), origin::user, F("can't drop '%s'; not empty") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(n->children.empty(), origin::user, F("can't drop '%s'; not empty") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       result_roster.drop_detached_node(nid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case resolve_conflicts::keep:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(other_resolution.resolution == resolve_conflicts::drop ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(other_resolution.resolution == resolve_conflicts::drop ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         other_resolution.resolution == resolve_conflicts::rename,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("inconsistent left/right resolutions for '%s'") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3220,7 +3220,7 @@ resolve_duplicate_name_one_side(lua_hook
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case resolve_conflicts::none:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no resolution provided for duplicate_name '%s'") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3318,7 +3318,7 @@ roster_merge_result::resolve_file_conten
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               file_id merged_id;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(resolve_conflicts::do_auto_merge(lua, conflict, adaptor, left_roster,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(resolve_conflicts::do_auto_merge(lua, conflict, adaptor, left_roster,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                  right_roster, this->roster, merged_id),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("merge of '%s', '%s' failed") % left_name % right_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/merge_content.cc   25f88a74962c2736d488e55fae3c81cf95e0d440
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/merge_content.cc   8b58285f952c2f8deb8e35ed4a10811fb75e9a0f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -336,7 +336,7 @@ content_merge_workspace_adaptor::get_ver
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("'%s' in workspace is not a regular file") % i->second);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       tmp = read_data(i->second);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       fid = calculate_ident(file_data(tmp));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(fid == ident, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(fid == ident, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("file '%s' in workspace has id %s, wanted %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % i->second
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % fid
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -731,15 +731,15 @@ resolve_merge_conflicts(lua_hooks & lua,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // resolutions, give a nice error message.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           char const * const msg = "conflict resolution for %s not yet supported";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(!result.missing_root_conflict, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(!result.missing_root_conflict, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F(msg) % "missing_root_dir");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(result.invalid_name_conflicts.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(result.invalid_name_conflicts.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F(msg) % "invalid_name_conflicts");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(result.directory_loop_conflicts.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(result.directory_loop_conflicts.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F(msg) % "directory_loop_conflicts");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(result.multiple_name_conflicts.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(result.multiple_name_conflicts.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F(msg) % "multiple_name_conflicts");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(result.attribute_conflicts.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(result.attribute_conflicts.size() == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F(msg) % "attribute_conflicts");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // Resolve the ones we can, if they have resolutions specified. Each
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -795,7 +795,7 @@ resolve_merge_conflicts(lua_hooks & lua,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // felt this whole design is already too complicated; we are
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // working to find a better solution. See thread at
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // http://lists.gnu.org/archive/html/monotone-devel/2010-04/msg00000.html
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(!opts.non_interactive, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(!opts.non_interactive, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("can't spawn external merger when non-interactive"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           result.report_file_content_conflicts(lua, left_roster, right_roster, adaptor, false, std::cout);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -805,7 +805,7 @@ resolve_merge_conflicts(lua_hooks & lua,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(result.is_clean(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(result.is_clean(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("merge failed due to unresolved conflicts"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/merge_roster.cc    7146fe6241e5b38357bea093ce92457ad00bdce3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/merge_roster.cc    c322af5eb9091e9315176900529d50db3e8d753f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -415,7 +415,7 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                        E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           F("unsupported '%s' conflict resolution in mtn:resolve_conflict attribute") %
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           i->second.first);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/migrate_ancestry.cc        b5d5566eb6fc92bf2a9be080b3dc8e2f7ed978ba
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/migrate_ancestry.cc        992b75e2621aad668518e4feeec9078c22a1643b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -483,7 +483,7 @@ insert_parents_into_roster(roster_t & ch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (child_roster.has_node(pth))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(is_dir_t(child_roster.get_node(pth)), origin::internal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(is_dir_t(child_roster.get_node(pth)), origin::internal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("directory '%s' for path '%s' cannot be added, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "as there is a file in the way") % pth % full);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -504,10 +504,10 @@ insert_into_roster(roster_t & child_rost
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (child_roster.has_node(pth))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const_node_t n = child_roster.get_node(pth);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(is_file_t(n), origin::internal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(is_file_t(n), origin::internal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("path '%s' cannot be added, as there is a directory in the way") % pth);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const_file_t f = downcast_to_file_t(n);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(f->content == fid, origin::internal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(f->content == fid, origin::internal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("path '%s' added twice with differing content") % pth);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -794,7 +794,7 @@ anc_graph::construct_revisions_from_ance
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                     attr_value(k->second,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                                origin::internal));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              E(false, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              MONOTONE_ERROR(false, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 F("unknown attribute '%s' on path '%s'.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   "Please contact %s so we can work out the right way to migrate this\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   "(if you just want it to go away, see the switch '--drop-attr', but\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/migrate_schema.cc  ca20562fa4ba8079a4ed29ad5fa760579fec6ae8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/migrate_schema.cc  52165143ec681ab10abef6096b97c110e3a43d35
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -61,7 +61,7 @@ assert_sqlite3_ok(sqlite3 * db)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // thrown from within an SQL extension function, caught, and turned
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // into a call to sqlite3_result_error.  (Extension functions have to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // do this to avoid corrupting sqlite's internal state.)  If it is,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  // rethrow it rather than feeding it to E(), lest we get "error:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // rethrow it rather than feeding it to MONOTONE_ERROR(), lest we get "error:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // sqlite error: error: " ugliness.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   char const *pfx = _("error: ");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!std::strncmp(errmsg, pfx, strlen(pfx)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -102,7 +102,7 @@ assert_sqlite3_ok(sqlite3 * db)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // if the auxiliary message is empty, the \n will be stripped off too
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("sqlite error: %s\n%s") % errmsg % auxiliary_message);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1155,16 +1155,16 @@ diagnose_unrecognized_schema(schema_mism
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ diagnose_unrecognized_schema(schema_mismatch_case cat,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                              system_path const & filename)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(cat != SCHEMA_EMPTY, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(cat != SCHEMA_EMPTY, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("cannot use the empty sqlite database '%s'\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "(monotone databases must be created with '%s db init')")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % filename % prog_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(cat != SCHEMA_NOT_MONOTONE, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(cat != SCHEMA_NOT_MONOTONE, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("'%s' does not appear to be a monotone database\n")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(cat != SCHEMA_TOO_NEW, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(cat != SCHEMA_TOO_NEW, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("'%s' appears to be a monotone database, but this version of\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "monotone does not recognize its schema.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "You probably need a newer version of monotone.")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1183,7 +1183,7 @@ check_sql_schema(sqlite3 * db, system_pa
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   diagnose_unrecognized_schema(cat, filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(cat != SCHEMA_MIGRATION_NEEDED, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(cat != SCHEMA_MIGRATION_NEEDED, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("database '%s' is laid out according to an old schema.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "Try '%s db migrate' to upgrade\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "(this is irreversible; you may want to make a backup copy first)")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1331,10 +1331,10 @@ test_migration_step(sqlite3 * db, key_st
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (schema == m->id)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(m >= migration_events, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(m >= migration_events, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("cannot test migration from unknown schema %s") % schema);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(m->migrator_sql || m->migrator_func, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(m->migrator_sql || m->migrator_func, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("schema %s is up to date") % schema);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("testing migration from %s to %s\n in database '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/migrate_work.cc    c74f33296d4cef14d8e318cf3a2f668528db75ed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/migrate_work.cc    1a36415c27899ad410fe340732a38d9f3fc2ad5c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -64,7 +64,7 @@ get_workspace_format()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else if (directory_exists(file_path() / old_bookkeeping_root_component))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         format = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::user, F("workspace required but not found"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::user, F("workspace required but not found"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -75,7 +75,7 @@ get_workspace_format()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       catch (exception & e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("workspace is corrupt: '%s' is invalid")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             % f_path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -121,7 +121,7 @@ workspace::check_format()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   unsigned int format = get_workspace_format();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Don't give user false expectations about format 0.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(format > 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(format > 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this workspace's metadata is in format 0. To use this workspace\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "with this version of monotone, you must delete it and check it\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "out again (migration from format 0 is not possible).\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -130,7 +130,7 @@ workspace::check_format()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "We apologize for the inconvenience.")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % first_version_supporting_current_format);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(format >= current_workspace_format, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(format >= current_workspace_format, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("to use this workspace with this version of monotone, its metadata\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "must be migrated from format %d to format %d, using the command\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "'%s migrate_workspace'.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -140,7 +140,7 @@ workspace::check_format()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % first_version_supporting_current_format);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // keep this message in sync with the copy in migrate_format
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(format <= current_workspace_format, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(format <= current_workspace_format, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("this version of monotone only understands workspace metadata\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "in formats 0 through %d.  Your workspace is in format %d.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "You need a newer version of monotone to use this workspace.")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -169,7 +169,7 @@ migrate_0_to_1()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // number corresponding to what was cached.  Thus, even if we did convert
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // the workspace, it would still be unusable.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("it is not possible to migrate from workspace format 0 to any\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "later format.  You must delete this workspace and check it out\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "again.  We apologize for the inconvenience."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -194,7 +194,7 @@ migrate_1_to_2()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   catch (exception & e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system, F("workspace is corrupt: reading '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system, F("workspace is corrupt: reading '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % rev_path % e.what());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id base_rid(decode_hexenc_as<revision_id>(remove_ws(base_rev_data()),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -216,7 +216,7 @@ migrate_1_to_2()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         catch (exception & e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               F("workspace is corrupt: reading '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               % workcs_path % e.what());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -272,7 +272,7 @@ workspace::migrate_format()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       I(format > current_workspace_format);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // keep this message in sync with the copy in check_format
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("this version of monotone only understands workspace metadata\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "in formats 0 through %d.  Your workspace is in format %d.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "You need a newer version of monotone to use this workspace.")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/monotone.cc        f55dc9871b59e3ab3a313c32417b1059c1a95d5b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/monotone.cc        dc6c3f95d09f74e613dbf74af8eb4e6b05a7dfb5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -138,10 +138,10 @@ cpp_main(int argc, char ** argv)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef SUPPORT_SQLITE_BEFORE_3003014
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(sqlite3_libversion_number() >= 3003008, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(sqlite3_libversion_number() >= 3003008, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("this monotone binary requires at least SQLite 3.3.8 to run"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(sqlite3_libversion_number() >= 3003014, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(sqlite3_libversion_number() >= 3003014, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("this monotone binary requires at least SQLite 3.3.14 to run"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -153,29 +153,29 @@ cpp_main(int argc, char ** argv)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // In Botan 1.9.9, the DataSink_Stream cannot be instantiated per
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // se. As 1.10.1 is already out, let's simply disable support for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // that specific (testing) version of botan.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(linked_botan_version != BOTAN_VERSION_CODE_FOR(1,9,9), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(linked_botan_version != BOTAN_VERSION_CODE_FOR(1,9,9), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("monotone does not support Botan 1.9.9"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,8,0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #error Botan versions older than 1.8.0 are no longer supported.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,4)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // motonote binary compiled against botan 1.8.0 - 1.9.3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,8,0), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,8,0), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("this monotone binary requires Botan 1.8.0 or newer"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,4), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,4), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("this monotone binary does not work with Botan 1.9.4 or newer"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,11)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // motonote binary compiled against botan 1.9.4 - 1.9.10
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #pragma message ( "The resulting monotone binary won't be able to run with any stable release of botan." )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,9,4), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,9,4), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("this monotone binary requires Botan 1.9.4 or newer"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,11), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,11), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("this monotone binary does not work with Botan 1.9.11 or newer"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // motonote binary compiled against botan 1.9.11 and newer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,9,11), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,9,11), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("this monotone binary requires Botan 1.9.11 or newer"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/netsync.cc 542d5a097ca3a34a61fb5e586a02961c4788842c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/netsync.cc adfef24f5cf567cf237248fb9510c03544c56c03
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -162,8 +162,8 @@ call_server(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // We failed during processing. This should only happen in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // client voice when we have a decode exception, or received an
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // error from our server (which is translated to a decode
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          // exception). We call these cases E() errors.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          // exception). We call these cases MONOTONE_ERROR() errors.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("processing failure while talking to peer '%s', disconnecting")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             % sess->get_peer());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -171,7 +171,7 @@ call_server(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       bool io_ok = react.do_io();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(io_ok, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(io_ok, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("timed out waiting for I/O with peer '%s', disconnecting")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % sess->get_peer());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -200,7 +200,7 @@ call_server(app_state & app,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(false, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(false, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               (F("I/O failure while talking to peer '%s', disconnecting")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                % sess->get_peer()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/network/automate_session.cc        e8eff583a0556256cbee3b1bca56555b9dd138e9
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/network/automate_session.cc        0ebbf32dd478c29d1c2ca53b51b5b6705d5a60d9
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -125,7 +125,7 @@ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     : app(app), remote_identity(ri), cmdline(c), params(p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   { }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   void operator()() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(app.lua.hook_get_remote_automate_permitted(remote_identity,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(app.lua.hook_get_remote_automate_permitted(remote_identity,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                  cmdline, params),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("sorry, you aren't allowed to do that."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -216,7 +216,7 @@ bool automate_session::do_work(transacti
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("unexpected netcmd '%d' received on automate connection")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % cmd_in->get_cmd_code());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/network/connection_info.cc 3cc57537bf3f460495cd4c071dbf513bd536b94f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/network/connection_info.cc b88ce86a971d7a6ddab14ea072dd29f41bbee3cf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -279,7 +279,7 @@ netsync_connection_info::Client::set_raw
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (uri.scheme.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     uri.scheme = "mtn";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(uri.scheme != "mtn" || !uri.host.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(uri.scheme != "mtn" || !uri.host.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("a non-empty hostname is expected for the 'mtn' uri scheme"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   var_key server_include(var_domain("server-include"),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -339,10 +339,10 @@ netsync_connection_info::Client::ensure_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ netsync_connection_info::Client::ensure_completeness() const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!uri.host.empty() || !uri.path.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!uri.host.empty() || !uri.path.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("connection host / path is empty and no default value could be loaded"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(conn_type != netsync_connection || !include_pattern().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(conn_type != netsync_connection || !include_pattern().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("branch pattern is empty and no default value could be loaded"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -421,7 +421,7 @@ netsync_connection_info::setup_from_sync
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                !request.exclude.empty();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   bool query_exists = !info->client.uri.query.empty();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!(include_exclude_given && query_exists), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!(include_exclude_given && query_exists), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("include / exclude pattern was given both as part of the URI "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "and as a separate argument"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -501,7 +501,7 @@ netsync_connection_info::setup_from_serv
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   info->client.conn_type = type;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   info->client.set_raw_uri(host());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(info->client.uri.query.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(info->client.uri.query.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("you can specify either a query string or separate include/exclude parameters, but not both"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   info->client.set_include_exclude_pattern(includes, excludes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -522,7 +522,7 @@ netsync_connection_info::setup_for_serve
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!opts.no_transport_auth)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(lua.hook_persist_phrase_ok(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(lua.hook_persist_phrase_ok(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("need permission to store persistent passphrase "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "(see hook persist_phrase_ok())"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/network/netsync_session.cc 6145f264aaf265eba81f23d16dfff64e535b8a23
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/network/netsync_session.cc d2cc87e37fa2f598a43fcb05f32b48b3de123711
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -491,7 +491,7 @@ decrement_if_nonzero(netcmd_item_type ty
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       string typestr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       netcmd_item_type_to_string(ty, typestr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("underflow on count of %s items to receive") % typestr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   --n;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/network/session.cc 605603a68faa778d8875c27bd68cc4c0b95f5618
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/network/session.cc ad9ace623d063b6a9b7cce51923c73fb41f8e1f8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -283,7 +283,7 @@ bool session::do_work(transaction_guard 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                               % printable_key_hash
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                               % expected_key_hash
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                               % prog_name % their_key_key.first % their_key_key.second);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                            E(false, origin::network, F("server key changed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            MONOTONE_ERROR(false, origin::network, F("server key changed"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/netxx_pipe.cc      43d43c0bae7402e2c196006261c8540ac4acc318
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/netxx_pipe.cc      3fbb1b6c64789a16e6cb28813daa948ec40698b5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -49,7 +49,7 @@ Netxx::PipeStream::PipeStream(int _readf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(_WIN32) || defined(_WIN64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(0, origin::system, F("this transport not supported on native Win32; use Cygwin"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(0, origin::system, F("this transport not supported on native Win32; use Cygwin"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // keeping code in case someone wants to try fixing it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -61,7 +61,7 @@ Netxx::PipeStream::PipeStream(int _readf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   named_pipe = (HANDLE)_get_osfhandle(_readfd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(named_pipe != INVALID_HANDLE_VALUE, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(named_pipe != INVALID_HANDLE_VALUE, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("pipe handle is invalid"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Create infrastructure for overlapping I/O
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -188,7 +188,7 @@ Netxx::PipeStream::PipeStream (const str
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(_WIN32) || defined(_WIN64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(0, origin::system, F("this transport not supported on native Win32; use Cygwin"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(0, origin::system, F("this transport not supported on native Win32; use Cygwin"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // keeping code in case someone wants to try fixing it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -211,7 +211,7 @@ Netxx::PipeStream::PipeStream (const str
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                1000,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(named_pipe != INVALID_HANDLE_VALUE, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(named_pipe != INVALID_HANDLE_VALUE, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("CreateNamedPipe(%s,...) call failed: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % pipename % err_msg());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -228,7 +228,7 @@ Netxx::PipeStream::PipeStream (const str
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             OPEN_EXISTING,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(hpipe != INVALID_HANDLE_VALUE, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(hpipe != INVALID_HANDLE_VALUE, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("CreateFile(%s,...) call failed: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % pipename % err_msg());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -259,7 +259,7 @@ Netxx::PipeStream::PipeStream (const str
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                NULL, // Current directory
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                &siStartInfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                &piProcInfo);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(started, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(started, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("CreateProcess(%s,...) call failed: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % cmdline % err_msg());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -276,7 +276,7 @@ Netxx::PipeStream::PipeStream (const str
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   int fd1[2], fd2[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   child = pipe_and_fork(fd1, fd2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(child >= 0, origin::system, F("pipe/fork failed: %s") % strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(child >= 0, origin::system, F("pipe/fork failed: %s") % strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!child)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       execvp(newargv[0], const_cast<char * const *>(newargv));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -322,7 +322,7 @@ Netxx::PipeStream::write(const void *buf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(_WIN32) || defined(_WIN64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   DWORD written = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   BOOL ok = WriteFile(named_pipe, buffer, length, &written, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(ok, origin::system, F("WriteFile call failed: %s") % err_msg());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(ok, origin::system, F("WriteFile call failed: %s") % err_msg());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   size_t written = ::write(writefd, buffer, length);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -413,7 +413,7 @@ Netxx::PipeCompatibleProbe::ready(const 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // Issue an async request to fill our buffer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           BOOL ok = ReadFile(pipe->named_pipe, pipe->readbuf,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                              sizeof(pipe->readbuf), NULL, &pipe->overlap);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(ok || GetLastError() == ERROR_IO_PENDING, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(ok || GetLastError() == ERROR_IO_PENDING, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("ReadFile call failed: %s") % err_msg());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           pipe->read_in_progress = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -448,7 +448,7 @@ Netxx::PipeCompatibleProbe::ready(const 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                FALSE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                                milliseconds);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(wstatus != WAIT_FAILED, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(wstatus != WAIT_FAILED, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("WaitForMultipleObjects call failed: %s") % err_msg());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               if (wstatus == WAIT_OBJECT_0 + 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -458,7 +458,7 @@ Netxx::PipeCompatibleProbe::ready(const 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               wstatus = WaitForSingleObject(pipe->overlap.hEvent,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                             milliseconds);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(wstatus != WAIT_FAILED, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(wstatus != WAIT_FAILED, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("WaitForSingleObject call failed: %s") % err_msg());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -478,7 +478,7 @@ Netxx::PipeCompatibleProbe::ready(const 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               // We did not complete our read.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(GetLastError() == ERROR_IO_INCOMPLETE, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(GetLastError() == ERROR_IO_INCOMPLETE, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("GetOverlappedResult call failed: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 % err_msg());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/option.cc  bc0641cad61c4d5aa09920fe5d5b9426c85eb2d1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/option.cc  51c076d154a10e1c76c52943914ced1f99614e6e
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -235,7 +235,7 @@ tokenize_for_command_line(string const &
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if (type != one)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             ++i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(i != from.end(), origin::user, F("invalid escape in '--xargs' file"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(i != from.end(), origin::user, F("invalid escape in '--xargs' file"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           cur += *i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           have_tok = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -349,7 +349,7 @@ getopt(map<string, concrete_option> cons
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           err += "\n'--" + *j + "' (" + i->second.description + ")";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::user, i18n_format(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::user, i18n_format(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // helper for get_by_name
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/options_list.hh    bb707efe26c892a78f5853f2fd577b01e7294d84
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/options_list.hh    f5d01e3eeb88171e0822a27765e86b478a4651d6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -617,7 +617,7 @@ OPTION(resolve_conflicts_opts, resolve_c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // we can't call  bookkeeping_path::external_string_is_bookkeeping_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // here, because we haven't found the workspace yet.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(bookkeeping_path::internal_string_is_bookkeeping_path(utf8(arg, origin::user)),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(bookkeeping_path::internal_string_is_bookkeeping_path(utf8(arg, origin::user)),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("conflicts file must be under '_MTN'"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   resolve_conflicts_file = bookkeeping_path(arg, origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -638,7 +638,7 @@ OPTION(conflicts_opts, conflicts_file, t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // we can't call bookkeeping_path::external_string_is_bookkeeping_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // here, because we haven't found the workspace yet.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(bookkeeping_path::internal_string_is_bookkeeping_path(utf8(arg, origin::user)),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(bookkeeping_path::internal_string_is_bookkeeping_path(utf8(arg, origin::user)),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("conflicts file must be under '_MTN'"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   conflicts_file = bookkeeping_path(arg, origin::user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/packet.cc  5f21e6e2db23ee7496c84cbfa1d49fb1bf2edc13
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/packet.cc  cbf01ed0c0c822fe587f2a3401a59d9641fd823a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -133,27 +133,27 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void validate_id(string const & id) const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(id.size() == constants::idlen
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(id.size() == constants::idlen
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         && id.find_first_not_of(constants::legal_id_bytes) == string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("malformed packet: invalid identifier"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void validate_base64(string const & s) const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!s.empty()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!s.empty()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         && s.find_first_not_of(constants::legal_base64_bytes) == string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("malformed packet: invalid base64 block"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void validate_arg_base64(string const & s) const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(s.find_first_not_of(constants::legal_base64_bytes) == string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(s.find_first_not_of(constants::legal_base64_bytes) == string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("malformed packet: invalid base64 block"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void validate_key(string const & k) const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!k.empty()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!k.empty()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         && k.find_first_not_of(constants::legal_key_name_bytes) == string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("malformed packet: invalid key name"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -173,7 +173,7 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       catch (Botan::Decoding_Error const & e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("malformed packet: invalid public key data for '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               % name % e.what());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -191,7 +191,7 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void validate_certname(string const & cn) const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!cn.empty()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!cn.empty()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         && cn.find_first_not_of(constants::legal_cert_name_bytes) == string::npos,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("malformed packet: invalid cert name"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -200,7 +200,7 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       string next;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       iss >> next;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(next.empty(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(next.empty(), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("malformed packet: too many arguments in header"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/paths.cc   934f378acd6077d5493b7cd9624565212424c37f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/paths.cc   2af1ebb2fd63dd95207ccf8e2ac5806e210cb29c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -357,12 +357,12 @@ normalize_external_path(string const & p
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // enter a workspace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       initial_rel_path.may_not_initialize();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       normalized = path;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(is_valid_internal(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(is_valid_internal(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("path '%s' is invalid") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!is_absolute_here(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!is_absolute_here(path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("absolute path '%s' is invalid") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       string base;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       try
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -379,11 +379,11 @@ normalize_external_path(string const & p
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       catch (exception &)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user, F("path '%s' is invalid") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user, F("path '%s' is invalid") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (normalized == ".")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         normalized = string("");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(fully_normalized_path(normalized), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(fully_normalized_path(normalized), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("path '%s' is invalid") % normalized);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -443,7 +443,7 @@ file_path::file_path(file_path::source_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       string normalized;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       normalize_external_path(path, normalized, to_workspace_root);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!in_bookkeeping_dir(normalized), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!in_bookkeeping_dir(normalized), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("path '%s' is in bookkeeping dir") % normalized);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       data = normalized;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -458,12 +458,12 @@ file_path::file_path(file_path::source_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   : any_path(path.made_from)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   MM(path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(utf8_validate(path), made_from, F("invalid utf8"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(utf8_validate(path), made_from, F("invalid utf8"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (type == external)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       string normalized;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       normalize_external_path(path(), normalized, to_workspace_root);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!in_bookkeeping_dir(normalized), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!in_bookkeeping_dir(normalized), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("path '%s' is in bookkeeping dir") % normalized);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       data = normalized;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -482,8 +482,8 @@ bookkeeping_path::bookkeeping_path(strin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bookkeeping_path::bookkeeping_path(string const & path, origin::type made_from)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(fully_normalized_path(path), made_from, F("path is not normalized"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(in_bookkeeping_dir(path), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(fully_normalized_path(path), made_from, F("path is not normalized"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(in_bookkeeping_dir(path), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("bookkeeping path is not in bookkeeping directory"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   data = path;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -825,7 +825,7 @@ static inline string const_system_path(u
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static inline string const_system_path(utf8 const & path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!path().empty(), path.made_from, F("invalid path ''"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!path().empty(), path.made_from, F("invalid path ''"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string expanded = tilde_expand(path());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (is_absolute_here(expanded))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return normalize_path(expanded);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/paths.hh   6c5767a2f033d996b507050cb949af9ae1ea6855
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/paths.hh   31989682fdf18232ddc653c9581097b03d32707a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -50,7 +50,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //          to the project root.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //        file_path_external: use this for strings that come from the user.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //          these strings are normalized before being checked, and if there
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-//          is a problem trigger E() invariants rather than I() invariants.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//          is a problem trigger MONOTONE_ERROR() invariants rather than I() invariants.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //          if in a workspace, such strings are interpreted as being
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //          _relative to the user's original directory_. if not in a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //          workspace, strings are treated as relative to the tree root. The
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/pcrewrap.cc        b1a7a2bf946a3d65df9ec8ec019b883965e22b56
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/pcrewrap.cc        d25bccfd7ebc16d1818cdba6cc799bd49e3e5bcd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -277,7 +277,7 @@ pcre_compile_error(int errcode, char con
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // character offset 0 in the pattern, so in practice we give the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // position-ful variant for all errors, but I'm leaving the == -1 check
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // here in case PCRE gets fixed.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, caused_by, (erroff == -1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, caused_by, (erroff == -1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            ? (F("error in regex '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                               % pattern % err)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            : (F("error near char %d of regex '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -312,16 +312,16 @@ pcre_exec_error(int errcode,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       throw std::bad_alloc();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case PCRE_ERROR_MATCHLIMIT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, subject_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, subject_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("backtrack limit exceeded in regular expression matching"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case PCRE_ERROR_RECURSIONLIMIT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, subject_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, subject_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("recursion limit exceeded in regular expression matching"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case PCRE_ERROR_BADUTF8:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case PCRE_ERROR_BADUTF8_OFFSET:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, subject_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, subject_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("invalid UTF-8 sequence found during regular expression matching"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/platform.hh        4b3bad0070d3a4a75611b9f750f7486049e5c040
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/platform.hh        9276d8a314fbca9e78e8f3963b77331e094b1b30
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -116,7 +116,7 @@ std::string get_current_working_dir();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // filesystem stuff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // FIXME: BUG: this returns a string in the filesystem charset/encoding
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ std::string get_current_working_dir();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// calls E() if fails
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// calls MONOTONE_ERROR() if fails
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void change_current_working_dir(std::string const & to);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ std::string tilde_expand(std::string const & path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ std::string get_default_confdir();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/project.cc 274448eb7d071c838995184ea3df762ec0f69e84
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/project.cc 703ee6aff5aceb0c2b7d6a4553ddc80f4d37fbfc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -472,7 +472,7 @@ project_t::put_revision_testresult(key_s
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            results == "0")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     passed = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("could not interpret test result string '%s'; "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         "valid strings are: 1, 0, yes, no, true, false, pass, fail")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % results);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -536,7 +536,7 @@ project_t::lookup_key_by_name(key_store 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(ks_match_by_local_name.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(ks_match_by_local_name.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("you have %d keys named '%s'") %
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ks_match_by_local_name.size() % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (ks_match_by_local_name.size() == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -544,7 +544,7 @@ project_t::lookup_key_by_name(key_store 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       id = *ks_match_by_local_name.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(db_match_by_local_name.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(db_match_by_local_name.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("there are %d keys named '%s'") %
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     db_match_by_local_name.size() % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (db_match_by_local_name.size() == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -552,7 +552,7 @@ project_t::lookup_key_by_name(key_store 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       id = *db_match_by_local_name.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(ks_match_by_given_name.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(ks_match_by_given_name.size() < 2, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("you have %d keys named '%s'") %
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     ks_match_by_local_name.size() % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (ks_match_by_given_name.size() == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -560,7 +560,7 @@ project_t::lookup_key_by_name(key_store 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       id = *ks_match_by_given_name.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("there is no key named '%s'") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -581,7 +581,7 @@ project_t::get_given_name_of_key(key_sto
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, id.inner().made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, id.inner().made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("key %s does not exist") % id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -725,18 +725,18 @@ project_t::guess_branch(options const & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return opts.branch;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!ident.inner()().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!ident.inner()().empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no branch found for empty revision, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "please provide a branch name"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       set<branch_name> branches;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       get_revision_branches(ident, branches);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!branches.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!branches.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no branch certs found for revision %s, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "please provide a branch name") % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(branches.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(branches.size() == 1, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("multiple branch certs found for revision %s, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "please provide a branch name") % ident);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/rcs_import.cc      77ec301af13aa8de3d0f81c6964e4b018f4427e1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/rcs_import.cc      475b9427d8c85d560d79a6b086ba6c567cfa344e
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1210,7 +1210,7 @@ import_cvs_repo(project_t & project,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 branch_name const & branchname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!directory_exists(cvsroot / "CVSROOT"), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!directory_exists(cvsroot / "CVSROOT"), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("'%s' appears to be a CVS repository root directory\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "try importing a module instead, with 'cvs_import %s/<module_name>'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % cvsroot % cvsroot);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/refiner.cc 31f39c58b006dc38d655bbdb3f85bc8d3cec0672
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/refiner.cc dc09d9e9d79066ef1bfe971ba5df1cbdba599306
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -399,7 +399,7 @@ refiner::process_refinement_command(refi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (ty == refinement_response)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E((queries_in_flight > 0), origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR((queries_in_flight > 0), origin::network,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("underflow on query-in-flight counter"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       --queries_in_flight;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/restrictions.cc    b00fbd236b8c556bf3178358301f83e786b67493
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/restrictions.cc    0f3c92f45c7f6d75a0099d947f5d4ff7f26bded1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -98,7 +98,7 @@ map_nodes(map<node_id, restricted_path::
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           node_status_iterator n = node_map.find(nid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if (n != node_map.end())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(n->second == status, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(n->second == status, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               F("conflicting include/exclude on path '%s'") % *i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             node_map[nid] = status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -172,7 +172,7 @@ map_paths(map<file_path, restricted_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       path_status_iterator p = path_map.find(*i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (p != path_map.end())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(p->second == status, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(p->second == status, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("conflicting include/exclude on path '%s'") % *i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         path_map[*i] = status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -234,7 +234,7 @@ validate_paths(set<file_path> const & in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         W(F("restriction excludes unknown path '%s'") % *i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(bad == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(bad == 0, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     FP("%d unknown path", "%d unknown paths", bad) % bad);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/revision.cc        5a10cfbecee66dfb7e9d5ebaa798f5436198a09e
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/revision.cc        9709d8f93b2619c8f459c13b4e9c4216b798181d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -30,7 +30,7 @@ void revision_t::check_sane() const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void revision_t::check_sane() const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!null_id(new_manifest), made_from, F("revision has no manifest id"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!null_id(new_manifest), made_from, F("revision has no manifest id"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (edges.size() == 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -40,12 +40,12 @@ void revision_t::check_sane() const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // merge nodes cannot have null revisions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       for (edge_map::const_iterator i = edges.begin(); i != edges.end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(!null_id(edge_old_revision(i)), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(!null_id(edge_old_revision(i)), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("merge revision has a null parent"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // revisions must always have either 1 or 2 edges
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(false, made_from, F("revision has %d edges, not 1 or 2") % edges.size());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(false, made_from, F("revision has %d edges, not 1 or 2") % edges.size());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // we used to also check that if there were multiple edges that had patches
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // for the same file, then the new hashes on each edge matched each other.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -218,7 +218,7 @@ make_restricted_revision(parent_map cons
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         no_excludes = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(old_rosters.size() == 1 || no_excludes, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(old_rosters.size() == 1 || no_excludes, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("the command '%s %s' cannot be restricted in a two-parent workspace")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % prog_name % cmd_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -355,7 +355,7 @@ parse_revision(basic_io::parser & parser
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string tmp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   parser.esym(syms::format_version);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   parser.str(tmp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(tmp == "1", parser.tok.in.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(tmp == "1", parser.tok.in.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("encountered a revision with unknown format, version %s.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "I only know how to understand the version 1 format.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "A newer version of monotone is required to complete this operation")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -380,7 +380,7 @@ read_revision(revision_data const & dat)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   basic_io::tokenizer tok(src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   basic_io::parser pars(tok);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   rev = parse_revision(pars);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(src.lookahead == EOF, rev.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(src.lookahead == EOF, rev.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("failed to parse revision"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return rev;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/roster.cc  73bab18b296d94f3f7046cca24b5ab5afc26f20a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/roster.cc  6821919c0ff86c7a3befce9d0c08d456a00f5062
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2549,7 +2549,7 @@ make_restricted_roster(roster_t const & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      problems++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(problems == 0, origin::user, F("invalid restriction"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(problems == 0, origin::user, F("invalid restriction"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!restricted.all_nodes().empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     restricted.check_sane(true);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/sanity.hh  cecb19decb0393a9bdef456b6751cdfdcb2dd7d9
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/sanity.hh  8162e955c46178f24ae2d826732a32c383d2781d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -374,11 +374,11 @@ struct bad_decode {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // E is for errors; they are normal (i.e., not a bug), but not necessarily
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // attributable to user naughtiness
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#define E(e, whence, explain)                                          \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define MONOTONE_ERROR(e, whence, explain)                             \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   do {                                                                 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (UNLIKELY(!(e)))                                                \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       {                                                                \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        global_sanity.generic_failure("E("#e")", (whence),             \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        global_sanity.generic_failure("MONOTONE_ERROR("#e")", (whence),             \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                       (explain),                       \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                       __FILE__, __LINE__);             \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }                                                                \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/selectors.cc       cc809a10de1a05a72ab8c0e26497c1bd5bcc54fe
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/selectors.cc       8601c5fc2a5893f9a0a2ea20aa78fdd3f3c01967
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -57,7 +57,7 @@ diagnose_ambiguous_expansion(options con
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        i != completions.end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     err += ("\n" + describe_revision(opts, lua, project, *i));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::user, i18n_format(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::user, i18n_format(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class selector
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -92,7 +92,7 @@ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   key_selector(string const & arg, lua_hooks & lua, project_t & project)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(!arg.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(!arg.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("the key selector k: must not be empty"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     project.get_key_identity(lua,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -127,7 +127,7 @@ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   cert_selector(string const & arg) : value(arg)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(!value.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(!value.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("the cert selector c: may not be empty"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   virtual set<revision_id> complete(project_t & project)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -145,7 +145,7 @@ string preprocess_date_for_selector(stri
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string tmp;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (lua.hook_exists("expand_date"))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(lua.hook_expand_date(sel, tmp), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(lua.hook_expand_date(sel, tmp), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("selector '%s' is not a valid date") % sel);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -161,7 +161,7 @@ string preprocess_date_for_selector(stri
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     tmp += "-01T00:00:00";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if (tmp.size()<11 && !equals)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     tmp += "T00:00:00";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(tmp.size()==19 || equals, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(tmp.size()==19 || equals, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("selector '%s' is not a valid date (internally completed to '%s')") % sel % tmp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (sel != tmp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -329,7 +329,7 @@ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   update_selector(string const & arg, lua_hooks & lua)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(arg.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(arg.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("no value is allowed with the update selector u:"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     workspace work(lua, F("the update selector u: refers to the "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -350,7 +350,7 @@ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   working_base_selector(string const & arg, project_t & project,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         lua_hooks & lua)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(arg.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(arg.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("no value is allowed with the base revision selector w:"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     workspace work(lua, F("the selector w: returns the "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -468,7 +468,7 @@ diagnose_wrong_arg_count(string const & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ diagnose_wrong_arg_count(string const & func, int expected, int actual)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(expected == actual, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(expected == actual, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     FP("the '%s' function takes %d argument, not %d",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "the '%s' function takes %d arguments, not %d",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        expected)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -606,7 +606,7 @@ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("unknown selection function '%s'") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -683,7 +683,7 @@ selector::create_simple_selector(options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return shared_ptr<selector>(make_shared<working_base_selector>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                   (sel, project, lua));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user, F("unknown selector type: %c") % sel_type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user, F("unknown selector type: %c") % sel_type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -717,12 +717,12 @@ shared_ptr<selector> selector::create(op
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             splitted.push_back(string());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           ++iter;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(iter != tokenizer.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(iter != tokenizer.end(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("selector '%s' is invalid, it ends with the escape character '\\'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             % orig);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           string const & val2 = *iter;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           I(!val2.empty());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(special_chars.find(val2) != string::npos, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(special_chars.find(val2) != string::npos, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("selector '%s' is invalid, it contains an unknown escape sequence '%s%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             % val % '\\' % val2.substr(0,1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           splitted.back().append(val2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -761,7 +761,7 @@ shared_ptr<selector> selector::create(op
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             ++lparen_pos;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(lparen_pos < items.size(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(lparen_pos < items.size(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("selector '%s' is invalid, unmatched ')'") % orig);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         I(idx(items, items.size() - lparen_pos).str == "(");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         unsigned int name_idx = items.size() - lparen_pos - 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -779,7 +779,7 @@ shared_ptr<selector> selector::create(op
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 L(FL("        found argument at stack position %d") % i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 shared_ptr<selector> arg = idx(items,i).sel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                E(i == items.size() - 1 || idx(items,i+1).str == ";", origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                MONOTONE_ERROR(i == items.size() - 1 || idx(items,i+1).str == ";", origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   F("selector '%s' is invalid, function argument doesn't look like an arg-list"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 to_add->add(arg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -790,7 +790,7 @@ shared_ptr<selector> selector::create(op
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             // just parentheses for grouping, closing paren is not on the item stack
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(lparen_pos == 2 && idx(items, items.size() - 1).sel, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(lparen_pos == 2 && idx(items, items.size() - 1).sel, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               F("selector '%s' is invalid, grouping parentheses contain something that "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 "doesn't look like an expr") % orig);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             shared_ptr<selector> to_add =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -802,11 +802,11 @@ shared_ptr<selector> selector::create(op
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       } else if (*tok == ";") {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         items.push_back(parse_item(*tok));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       } else if (*tok == "/") {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(!items.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(!items.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("selector '%s' is invalid, because it starts with a '/'") % orig);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         items.push_back(parse_item(*tok));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       } else if (*tok == "|") {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(!items.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(!items.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("selector '%s' is invalid, because it starts with a '|'") % orig);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         items.push_back(parse_item(*tok));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -831,17 +831,17 @@ shared_ptr<selector> selector::create(op
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               shared_ptr<selector> lhs = idx(items, items.size() - 3).sel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               shared_ptr<selector> rhs = idx(items, items.size() - 1).sel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(lhs, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(lhs, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("selector '%s' is invalid, because there is a '%s' someplace it shouldn't be")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 % orig % op);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               shared_ptr<or_selector> lhs_as_or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 = std::dynamic_pointer_cast<or_selector>(lhs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               shared_ptr<and_selector> lhs_as_and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 = std::dynamic_pointer_cast<and_selector>(lhs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(op == "/" || !lhs_as_and, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(op == "/" || !lhs_as_and, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("selector '%s' is invalid, don't mix '/' and '|' operators without parentheses")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 % orig);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(op == "|" || !lhs_as_or, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(op == "|" || !lhs_as_or, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("selector '%s' is invalid, don't mix '/' and '|' operators without parentheses")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 % orig);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               shared_ptr<selector> new_item;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -880,7 +880,7 @@ shared_ptr<selector> selector::create(op
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(items.size() == 1 && items[0].sel, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(items.size() == 1 && items[0].sel, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("selector '%s' is invalid, it doesn't look like an expr") % orig);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return items[0].sel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -899,7 +899,7 @@ complete(options const & opts, lua_hooks
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (isel && isel->is_full_length())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       completions.insert(isel->get_assuming_full_length());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(project.db.revision_exists(*completions.begin()), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(project.db.revision_exists(*completions.begin()), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no revision %s found in database") % *completions.begin());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -907,7 +907,7 @@ complete(options const & opts, lua_hooks
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   P(F("expanding selection '%s'") % str);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   completions = sel->complete(project);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!completions.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!completions.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no match for selection '%s'") % str);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (set<revision_id>::const_iterator i = completions.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -917,7 +917,7 @@ complete(options const & opts, lua_hooks
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // This may be impossible, but let's make sure.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // All the callers used to do it.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(project.db.revision_exists(*i), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(project.db.revision_exists(*i), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("no revision %s found in database") % *i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/ssh_agent.cc       6b9a6795f0277380767199906ed94d9c9fd4aac5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/ssh_agent.cc       3ce0bebe5098ef21e06507842f48af793af93390
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -140,7 +140,7 @@ get_long_from_buf(string const & buf, u3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static u32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ get_long_from_buf(string const & buf, u32 & loc)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(buf.length() >= loc + 4, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(buf.length() >= loc + 4, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("string not long enough to get a long"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   u32 ret = get_long(buf.data() + loc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   loc += 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -158,7 +158,7 @@ get_string_from_buf(string const & buf,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % loc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   len = get_long_from_buf(buf, loc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("ssh_agent: get_string_from_buf: len: %u" ) % len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(loc + len <= buf.length(), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(loc + len <= buf.length(), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("ssh_agent: length (%i) of buf less than loc (%u) + len (%u)")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % buf.length()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % loc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -270,7 +270,7 @@ ssh_agent_state::read_packet(string & pa
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   read_data(4, len_buf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   u32 l = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   len = get_long_from_buf(len_buf, l);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(len > 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(len > 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("ssh_agent: fetch_packet: zero-length packet from ssh-agent"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("ssh_agent: fetch_packet: response len %u") % len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -321,7 +321,7 @@ ssh_agent::get_keys()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //first byte is packet type
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   u32 packet_loc = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(packet.at(0) == 12, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(packet.at(0) == 12, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("ssh_agent: packet type (%u) != 12")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % (u32)packet.at(0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   packet_loc += 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -359,7 +359,7 @@ ssh_agent::get_keys()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                     BigInt::Binary);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           L(FL("ssh_agent: n: %s, len %u") % n % slen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(key.length() == key_loc, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(key.length() == key_loc, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("ssh_agent: get_keys: not all or too many key bytes consumed,"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               " location (%u), length (%i)")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             % key_loc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -383,7 +383,7 @@ ssh_agent::get_keys()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       get_string_from_buf(packet, packet_loc, comment_len, comment);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       L(FL("ssh_agent: comment_len: %u, comment: %s") % comment_len % comment);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(packet.length() == packet_loc, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(packet.length() == packet_loc, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("ssh_agent: get_keys: not all or too many packet bytes consumed,"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       " location (%u), length (%i)")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % packet_loc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -432,7 +432,7 @@ ssh_agent::sign_data(RSA_PublicKey const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                      string const & data,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                      string & out)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(connected(), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(connected(), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("ssh_agent: get_keys: attempted to sign data when not connected"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("ssh_agent: sign_data: key e: %s, n: %s, data len: %i")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -478,13 +478,13 @@ ssh_agent::sign_data(RSA_PublicKey const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("ssh_agent: sign_data: type (%u), '%s'") % type_len % type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   get_string_from_buf(full_sig, full_sig_loc, out_len, out);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("ssh_agent: sign_data: output length %u") % out_len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(full_sig.length() == full_sig_loc, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(full_sig.length() == full_sig_loc, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     (F("ssh_agent: sign_data: not all or too many signature bytes consumed,"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        " location (%u), length (%i)")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      % full_sig_loc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      % full_sig.length()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(packet_in.length() == packet_in_loc, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(packet_in.length() == packet_in_loc, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     (F("ssh_agent: sign_data: not all or too many packet bytes consumed,"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        " location (%u), length (%i)")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      % packet_in_loc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -494,7 +494,7 @@ ssh_agent::add_identity(RSA_PrivateKey c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssh_agent::add_identity(RSA_PrivateKey const & key, string const & comment)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(s->connected(), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(s->connected(), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("ssh_agent: add_identity: attempted to add a key when not connected"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("ssh_agent: add_identity: key e: %s, n: %s, comment len: %i")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -510,10 +510,10 @@ ssh_agent::add_identity(RSA_PrivateKey c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string packet_in;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   s->read_packet(packet_in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(packet_in.length() == 1, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(packet_in.length() == 1, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("ssh_agent: add_identity: response packet of unexpected size (%u)")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % packet_in.length());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(packet_in.at(0) == 6, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(packet_in.at(0) == 6, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("ssh_agent: packet type (%u) != 6")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % (u32)packet_in.at(0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/transforms.cc      a2af76783de4a02b528685459e99349ba9b118da
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/transforms.cc      472775c49c875a91eeb891e23b73d86e17e4dc99
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -82,7 +82,7 @@ error_in_transform(std::exception & e, o
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             *p = ' ';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, caused_by,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, caused_by,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("%s\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "This may be due to a memory glitch, data corruption during\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "a network transfer, corruption of your database or workspace,\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/ui.cc      8bdaebf0da3e90cbe0026d140c2000e92998693f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/ui.cc      537a6bd9c479e6aae463237c6ade682af4ddbde9
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -839,7 +839,7 @@ user_interface::redirect_log_to(system_p
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (filestr.is_open())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     filestr.close();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   filestr.open(filename.as_external().c_str(), ofstream::out | ofstream::app);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(filestr.is_open(), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(filestr.is_open(), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("failed to open log file '%s'") % filename);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   clog.rdbuf(filestr.rdbuf());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/unix/fs.cc 5b3be0d56e4ba2ae8526a4913a731e1134117900
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/unix/fs.cc 71e6b909346d0875ccaba0a1b1fcce2135865138
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -62,7 +62,7 @@ get_current_working_dir()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   while (errno == ERANGE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("cannot get working directory: %s") % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -72,7 +72,7 @@ change_current_working_dir(string const 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (chdir(to.c_str()))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("cannot change to directory '%s': %s") % to % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -94,7 +94,7 @@ get_homedir()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return string(home);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   struct passwd * pw = getpwuid(getuid());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(pw != NULL, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(pw != NULL, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("could not find home directory for uid %d") % getuid());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return string(pw->pw_dir);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -127,7 +127,7 @@ tilde_expand(string const & in)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // treating system-provided data as utf8, but it's probably in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // filesystem charset)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   pw = getpwnam(user.c_str());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(pw != NULL, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(pw != NULL, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("could not find home directory for user '%s'") % user);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return string(pw->pw_dir) + after;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -145,7 +145,7 @@ get_path_status(string const & path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (err == ENOENT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return path::nonexistent;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("error accessing file '%s': %s") % path % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (S_ISREG(buf.st_mode))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -168,7 +168,7 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (!d)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("could not open directory '%s': %s") % path % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -260,7 +260,7 @@ read_directory(string const & path,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(st_result == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(st_result == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("error accessing '%s/%s': %s") % p % d->d_name % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (S_ISREG(st.st_mode))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -282,7 +282,7 @@ make_accessible(string const & name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (stat(name.c_str(), &st) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("stat(%s) failed: %s") % name % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -294,7 +294,7 @@ make_accessible(string const & name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (chmod(name.c_str(), new_mode) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("chmod(%s) failed: %s") % name % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -337,7 +337,7 @@ rename_clobberingly(string const & from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(read_count >= 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(read_count >= 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F ("error reading file '%s': %s") % from % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               remaining -= read_count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -352,7 +352,7 @@ rename_clobberingly(string const & from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               ssize_t write_count = write(to_fd, ptr, remaining);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(write_count >= 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(write_count >= 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("error writing file '%s': %s") % to % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               remaining -= write_count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -367,7 +367,7 @@ rename_clobberingly(string const & from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("renaming '%s' to '%s' failed: %s") % from % to % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -381,7 +381,7 @@ do_remove(string const & path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (remove(path.c_str()))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("could not remove '%s': %s") % path % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -436,7 +436,7 @@ do_remove_recursive(string const & path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (err == ENOENT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return; // nothing to delete
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E((err == ENOTEMPTY) || (err == EEXIST), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR((err == ENOTEMPTY) || (err == EEXIST), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("could not remove '%s': %s") % path % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // If we get here, it's a non-empty directory to be recursed through.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -463,14 +463,14 @@ do_mkdir(string const & path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (mkdir(path.c_str(), 0777))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("could not create directory '%s': %s") % path % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Create a temporary file in directory DIR, writing its name to NAME and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // returning a read-write file descriptor for it.  If unable to create
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// the file, throws an E().
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// the file, throws an MONOTONE_ERROR().
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // N.B. None of the standard temporary-file creation routines in libc do
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -527,9 +527,9 @@ make_temp_file(string const & dir, strin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // plain error.  (ENOTDIR is a bug, and so are some ELOOP and EACCES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // conditions - caller's responsibility to make sure that 'dir' is in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // fact a directory to which we can write - but we get better
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      // diagnostics from this E() than we would from an I().)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      // diagnostics from this MONOTONE_ERROR() than we would from an I().)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(err == EEXIST, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(err == EEXIST, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("cannot create temp file '%s': %s") % tmp % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // This increment is relatively prime to 'limit', therefore 'value'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -539,7 +539,7 @@ make_temp_file(string const & dir, strin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // we really should never get here.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::no_fault,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("all %d possible temporary file names are in use") % limit);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -580,12 +580,12 @@ write_data_worker(string const & fname,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         ssize_t written = write(fd, ptr, remaining);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(written >= 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(written >= 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("error writing to temp file '%s': %s") % tmp % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (written == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             deadcycles++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(deadcycles < 4, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(deadcycles < 4, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               FP("giving up after four zero-length writes to '%s' "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                  "(%d byte written, %d left)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                  "giving up after four zero-length writes to '%s' "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/unix/parse_date.cc 0eca6adcb3e796a84fbc3c08c974694c916bb58e
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/unix/parse_date.cc a82dd38c5b1f404ad5191201ec754d7e99fb1a0b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -17,10 +17,10 @@ void parse_date(const std::string s, con
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   char *p = strptime(s.c_str(), fmt.c_str(), tp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(p, origin::user,// failed to match all of the fromat string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(p, origin::user,// failed to match all of the fromat string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("unable to parse date '%s' with format '%s'") % s % fmt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(*p == 0, origin::user, // extraneous characters in input string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(*p == 0, origin::user, // extraneous characters in input string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("invalid date '%s' not matched by format '%s'") % s % fmt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/unix/process.cc    00cf53c7ea3c15dd04d7957fa7c8ad89efd802c5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/unix/process.cc    40caaf41e3e4e8616e48688e3f4c37317e6f5a8b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -62,7 +62,7 @@ bool is_executable(const char *path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (rc == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("error getting status of file '%s': %s") % path % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -86,7 +86,7 @@ int change_xbits(const char *path, const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (fd == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("error opening file '%s': %s") % path % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (fstat(fd, &s))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -118,7 +118,7 @@ int change_xbits(const char *path, const
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (close(fd) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("error closing file '%s': %s") % path % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/unix/ssh_agent_platform.cc d7c26b7328fc34212efe48fbdb7aeabb1babfb4d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/unix/ssh_agent_platform.cc fb8801753b39082833d27dbc0e445ac0d33df500
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -96,17 +96,17 @@ ssh_agent_platform::write_data(string co
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       ssize_t sent = ::send(sock, buf, put, MSG_NOSIGNAL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(sent >= 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(sent >= 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("ssh_agent: error during send: %s") % strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (sent == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(++deadcycles < 8, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(++deadcycles < 8, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("ssh_agent: giving up after %d ineffective sends to agent")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           % deadcycles);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       buf += sent;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       put -= sent;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(put == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(put == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("ssh_agent: sent %u extra bytes to agent") % -put);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -126,16 +126,16 @@ ssh_agent_platform::read_data(string::si
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       ssize_t recvd = ::recv(sock, buf, min(get, bufsize), MSG_WAITALL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(recvd >= 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(recvd >= 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("ssh_agent: error during receive: %s") % strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (recvd == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(++deadcycles < 8, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(++deadcycles < 8, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("ssh_agent: giving up after %d ineffective receives from agent"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       out.append(buf, recvd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       get -= recvd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(get == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(get == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("ssh_agent: received %u extra bytes from agent") % -get);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/uri.cc     f50e7599f6294a9872c055a8b230ea4933bdcc82
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/uri.cc     7cf4f862ab7b454597db5084c50c8320617a2869
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -36,7 +36,7 @@ parse_uri(string const & in, uri_t & uri
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   pcre::regex matcher("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                       origin::internal);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   vector<string> matches;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(matcher.match(modified, made_from, matches), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(matcher.match(modified, made_from, matches), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("unable to parse URI '%s'") % in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   I(matches.size() == 10);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -64,7 +64,7 @@ parse_uri(string const & in, uri_t & uri
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            origin::internal);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       vector<string> hostlike_matches;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(hostlike.match(matches[4], made_from, hostlike_matches), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(hostlike.match(matches[4], made_from, hostlike_matches), made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("unable to parse host of URI '%s'") % in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (!hostlike_matches[2].empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -147,10 +147,10 @@ urldecode(string const & in, origin::typ
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           char d1, d2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           ++i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(i != in.end(), made_from, F("bad URLencoded string '%s'") % in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(i != in.end(), made_from, F("bad URLencoded string '%s'") % in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           d1 = *i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           ++i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(i != in.end(), made_from, F("bad URLencoded string '%s'") % in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(i != in.end(), made_from, F("bad URLencoded string '%s'") % in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           d2 = *i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           char c = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -172,7 +172,7 @@ urldecode(string const & in, origin::typ
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case 'd': case 'D': c += 13; break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case 'e': case 'E': c += 14; break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case 'f': case 'F': c += 15; break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            default: E(false, made_from, F("bad URLencoded string '%s'") % in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            default: MONOTONE_ERROR(false, made_from, F("bad URLencoded string '%s'") % in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           c *= 16;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           switch(d2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -193,7 +193,7 @@ urldecode(string const & in, origin::typ
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case 'd': case 'D': c += 13; break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case 'e': case 'E': c += 14; break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case 'f': case 'F': c += 15; break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            default: E(false, made_from, F("bad URLencoded string '%s'") % in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            default: MONOTONE_ERROR(false, made_from, F("bad URLencoded string '%s'") % in);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           out += c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/vocab.cc   1bbd1368822b5ab65aed2d1f16d165da0c096e54
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/vocab.cc   921456660e6e409ab5d7373199b346f8474cbbdf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -37,7 +37,7 @@ verify(hexenc<INNER> const & val)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (string::const_iterator i = val().begin(); i != val().end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(is_xdigit(*i), val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(is_xdigit(*i), val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("bad character '%c' in '%s'") % *i % val);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -49,11 +49,11 @@ verify(hexenc<id> const & val)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (val().empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(val().size() == constants::idlen, val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(val().size() == constants::idlen, val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("hex encoded ID '%s' size != %d") % val % constants::idlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (string::const_iterator i = val().begin(); i != val().end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(is_xdigit(*i), val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(is_xdigit(*i), val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("bad character '%c' in id name '%s'") % *i % val);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -65,7 +65,7 @@ verify(id & val)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (val().empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(val().size() == constants::idlen_bytes, val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(val().size() == constants::idlen_bytes, val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("invalid ID '%s'") % val);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -74,7 +74,7 @@ verify(symbol const & val)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (string::const_iterator i = val().begin(); i != val().end(); ++i)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(is_alnum(*i) || *i == '_', val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(is_alnum(*i) || *i == '_', val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("bad character '%c' in symbol '%s'") % *i % val);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -83,7 +83,7 @@ verify(cert_name const & val)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verify(cert_name const & val)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string::size_type pos = val().find_first_not_of(constants::legal_cert_name_bytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(pos == string::npos, val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(pos == string::npos, val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("bad character '%c' in cert name '%s'") % val().at(pos) % val);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -91,7 +91,7 @@ verify(key_name const & val)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ verify(key_name const & val)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   string::size_type pos = val().find_first_not_of(constants::legal_key_name_bytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(pos == string::npos, val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(pos == string::npos, val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("bad character '%c' in key name '%s'") % val().at(pos) % val);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -108,7 +108,7 @@ verify(netsync_session_key & val)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(val().size() == constants::netsync_session_key_length_in_bytes,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(val().size() == constants::netsync_session_key_length_in_bytes,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("invalid key length of %d bytes") % val().length());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -122,7 +122,7 @@ verify(netsync_hmac_value & val)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(val().size() == constants::netsync_hmac_value_length_in_bytes,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(val().size() == constants::netsync_hmac_value_length_in_bytes,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     val.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("invalid hmac length of %d bytes") % val().length());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/win32/fs.cc        0f64aceb6403806181436efb1d255fd8cce902b3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/win32/fs.cc        970294ab94b3b068b4ae042135fd402c898b6806
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -24,7 +24,7 @@ get_current_working_dir()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ get_current_working_dir()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   char buffer[4096];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(getcwd(buffer, 4096), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(getcwd(buffer, 4096), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("cannot get working directory: %s") % strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   std::string str(buffer);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -40,7 +40,7 @@ change_current_working_dir(std::string c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ change_current_working_dir(std::string const & to)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!chdir(to.c_str()), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!chdir(to.c_str()), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("cannot change to directory '%s': %s") % to % strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -58,7 +58,7 @@ get_default_confdir()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, szPath)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         base = szPath;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!base.empty(), origin::system, F("could not determine configuration path"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!base.empty(), origin::system, F("could not determine configuration path"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return base + "\\monotone";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -143,7 +143,7 @@ get_path_status(std::string const & path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          || err == ERROR_BAD_NETPATH)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return path::nonexistent;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::system, F("'%s': GetFileAttributes error: %s") % path % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::system, F("'%s': GetFileAttributes error: %s") % path % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if (attrs & FILE_ATTRIBUTE_DIRECTORY)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return path::directory;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -171,7 +171,7 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           if (GetLastError() == ERROR_FILE_NOT_FOUND) // zero files in dir
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             last = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(false, origin::system, F("could not open directory '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(false, origin::system, F("could not open directory '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               % path % os_strerror(GetLastError()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -192,7 +192,7 @@ namespace
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (FindNextFile(h, data))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(GetLastError() == ERROR_NO_MORE_FILES, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(GetLastError() == ERROR_NO_MORE_FILES, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("error while reading directory: %s") % os_strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       last = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -246,7 +246,7 @@ do_remove(std::string const & path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // the path doesn't exist.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("could not remove '%s': %s") % path % os_strerror(GetLastError()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -296,10 +296,10 @@ do_remove_recursive(std::string const & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   op.lpszProgressTitle = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   int rc = SHFileOperationA(&op);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(rc == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(rc == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("could not remove '%s' and contents: SHFileOperation error code 0x%x")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % path % rc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!op.fAnyOperationsAborted, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!op.fAnyOperationsAborted, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("could not remove '%s' and contents: SHFileOperation partially aborted")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -308,7 +308,7 @@ do_mkdir(std::string const & path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ do_mkdir(std::string const & path)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(CreateDirectoryA(path.c_str(), 0) != 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(CreateDirectoryA(path.c_str(), 0) != 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("could not create directory '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % path % os_strerror(GetLastError()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -364,11 +364,11 @@ void make_accessible(std::string const &
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void make_accessible(std::string const & name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   DWORD attrs = GetFileAttributes(name.c_str());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(attrs != INVALID_FILE_ATTRIBUTES, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(attrs != INVALID_FILE_ATTRIBUTES, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("GetFileAttributes(%s) failed: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % name % os_strerror(GetLastError()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(SetFileAttributes(name.c_str(), attrs & ~FILE_ATTRIBUTE_READONLY),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(SetFileAttributes(name.c_str(), attrs & ~FILE_ATTRIBUTE_READONLY),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("SetFileAttributes(%s) failed: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % name % os_strerror(GetLastError()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -395,14 +395,14 @@ rename_clobberingly(std::string const & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (sleepTime < 250)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       sleepTime *= 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("renaming '%s' to '%s' failed: %s (%d)") % from % to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % os_strerror(lastError) % lastError);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Create a temporary file in directory DIR, writing its name to NAME and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // returning a read-write file descriptor for it.  If unable to create
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// the file, throws an E().
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// the file, throws an MONOTONE_ERROR().
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // N.B. We could use GetTempFileName but it wouldn't help significantly, as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // we want to do the CreateFile ourselves (eventually we will want to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -456,7 +456,7 @@ make_temp_file(std::string const & dir, 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // ERROR_ALREADY_EXISTS means we should go 'round again.  Any other
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // GetLastError() value is a plain error.  (Presumably, just as for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // Unix, there are values that would represent bugs.)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(GetLastError() == ERROR_ALREADY_EXISTS, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(GetLastError() == ERROR_ALREADY_EXISTS, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("cannot create temp file '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % tmp % os_strerror(GetLastError()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -464,7 +464,7 @@ make_temp_file(std::string const & dir, 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // 'value' will visit every number in its range.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       value += 7777;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("cannot find a temporary file (tried %d possibilities)") % limit);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -516,7 +516,7 @@ write_data_worker(std::string const & fn
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     do
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         DWORD written;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        E(WriteFile(h, (LPCVOID)ptr, remaining, &written, (LPOVERLAPPED)0),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        MONOTONE_ERROR(WriteFile(h, (LPCVOID)ptr, remaining, &written, (LPOVERLAPPED)0),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           F("error writing to temp file '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           % tmp % os_strerror(GetLastError()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -524,7 +524,7 @@ write_data_worker(std::string const & fn
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (written == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             deadcycles++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(deadcycles < 4, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(deadcycles < 4, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               FP("giving up after four zero-length writes to '%s' "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                  "(%d byte written, %d left)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                  "giving up after four zero-length writes to '%s' "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/win32/parse_date.cc        e327b76670852e07142535c5db0521fbbbc6a2d4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/win32/parse_date.cc        f82660922cb5e201514f35863ef7d38248bd602b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -20,7 +20,7 @@ void parse_date(const std::string /* s *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // So far, parse_date is only used in the changelog processing to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // allow the user to change the date cert. So we just disable that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // on Win32; see cmd_ws_commit.cc get_log_message_interactively.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::system, F("date parsing not available on win32"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::system, F("date parsing not available on win32"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Local Variables:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/win32/ssh_agent_platform.cc        3db66d3900b7b7a0d43642e5ff6e0a1778faf919
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/win32/ssh_agent_platform.cc        9ba1a22e6ef591b5272fff1dc02facbcef6fb108
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -79,7 +79,7 @@ ssh_agent_platform::write_data(string co
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("ssh_agent_platform::write_data: writing %u bytes to %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % data.length() % mapname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(data.length() < AGENT_MAX_MSGLEN, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(data.length() < AGENT_MAX_MSGLEN, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("asked to write more than %u to pageant") %  AGENT_MAX_MSGLEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   memcpy(filemap_view, data.c_str(), data.length());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -89,7 +89,7 @@ ssh_agent_platform::write_data(string co
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   id = SendMessage(hwnd, WM_COPYDATA, (WPARAM) NULL, (LPARAM) &cds);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(id > 0, origin::system, F("error sending message to pageant (%d)") % id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(id > 0, origin::system, F("error sending message to pageant (%d)") % id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //Start our read counter again
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   read_len = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -102,7 +102,7 @@ ssh_agent_platform::read_data(u32 const 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("ssh_agent: read_data: asked to read %u bytes") % len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E((read_len + len) < AGENT_MAX_MSGLEN, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR((read_len + len) < AGENT_MAX_MSGLEN, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("asked to read more than %u from pageant") % AGENT_MAX_MSGLEN);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   out.append(filemap_view + read_len, len);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/work.cc    2faefc419f1f3f90874a25cf60a5b0e6b35395a6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/work.cc    73fef1f51c92a675f74f9367e14f2cd052a4270b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -138,7 +138,7 @@ workspace::require_workspace()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ workspace::require_workspace()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(workspace::found, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(workspace::found, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("workspace required but not found"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   workspace::used = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -146,7 +146,7 @@ workspace::require_workspace(i18n_format
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ workspace::require_workspace(i18n_format const & explanation)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(workspace::found, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(workspace::found, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("workspace required but not found\n%s") % explanation.str());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   workspace::used = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -156,7 +156,7 @@ workspace::create_workspace(options cons
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             lua_hooks & lua,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             system_path const & new_dir)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!new_dir.empty(), origin::user, F("invalid directory ''"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!new_dir.empty(), origin::user, F("invalid directory ''"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("creating workspace in %s") % new_dir);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -164,7 +164,7 @@ workspace::create_workspace(options cons
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   go_to_workspace(new_dir);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   mark_std_paths_used();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!directory_exists(bookkeeping_root), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!directory_exists(bookkeeping_root), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("monotone bookkeeping directory '%s' already exists in '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % bookkeeping_root % new_dir);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -230,7 +230,7 @@ workspace::get_work_rev()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   catch(exception & e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("workspace is corrupt: reading '%s': %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % rev_path % e.what());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -257,13 +257,13 @@ workspace::get_update_id()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   revision_id update_id;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   bookkeeping_path update_path = get_update_path();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(file_exists(update_path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(file_exists(update_path), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no update has occurred in this workspace"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   data update_data = read_data(update_path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   update_id = revision_id(decode_hexenc(update_data(), origin::internal),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           origin::internal);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!null_id(update_id), origin::internal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!null_id(update_id), origin::internal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("no update revision available"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return update_id;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -295,7 +295,7 @@ get_roster_for_rid(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(db.revision_exists(rid), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("base revision %s does not exist in database") % rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       cr = db.get_cached_roster(rid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -311,7 +311,7 @@ workspace::require_parents_in_db(databas
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        i != rev.edges.end(); i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       revision_id const & parent(edge_old_revision(i));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(null_id(parent) || db.revision_exists(parent), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(null_id(parent) || db.revision_exists(parent), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("parent revision %s does not exist, did you specify the wrong database?")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % parent);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -489,7 +489,7 @@ read_options_file(any_path const & optsp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (opt == "database")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(val != memory_db_identifier, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(val != memory_db_identifier, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("a memory database '%s' cannot be used in a workspace")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 % memory_db_identifier);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -525,7 +525,7 @@ read_options_file(any_path const & optsp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         W(F("unrecognized key '%s' in options file '%s' - ignored")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           % opt % optspath);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(src.lookahead == EOF, src.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(src.lookahead == EOF, src.made_from,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("Could not parse entire options file '%s'") % optspath);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -535,7 +535,7 @@ write_options_file(bookkeeping_path cons
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   basic_io::stanza st;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(opts.dbname_type != memory_db, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(opts.dbname_type != memory_db, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("a memory database '%s' cannot be used in a workspace")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % memory_db_identifier);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -636,7 +636,7 @@ workspace::set_options(options const & o
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ workspace::set_options(options const & opts, lua_hooks & lua,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        bool branch_is_sticky)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(workspace::found, origin::user, F("workspace required but not found"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(workspace::found, origin::user, F("workspace required but not found"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   bookkeeping_path o_path;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   get_options_path(o_path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -719,7 +719,7 @@ workspace::print_option(utf8 const & opt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ workspace::print_option(utf8 const & opt, std::ostream & output)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(workspace::found, origin::user, F("workspace required but not found"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(workspace::found, origin::user, F("workspace required but not found"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   bookkeeping_path o_path;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   get_options_path(o_path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -736,7 +736,7 @@ workspace::print_option(utf8 const & opt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else if (opt() == "keydir")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     output << opts.key_dir << '\n';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(false, origin::user, F("'%s' is not a recognized workspace option") % opt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(false, origin::user, F("'%s' is not a recognized workspace option") % opt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // _MTN/bisect handling.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -858,7 +858,7 @@ workspace::get_local_dump_path()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bookkeeping_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ workspace::get_local_dump_path()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(workspace::found, origin::user, F("workspace required but not found"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(workspace::found, origin::user, F("workspace required but not found"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   bookkeeping_path d_path = bookkeeping_root / local_dump_file_name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   L(FL("local dump path is %s") % d_path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1132,7 +1132,7 @@ addition_builder::add_nodes_for(file_pat
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // that the roster has a root node, which will be a directory.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (ros.has_node(path))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(is_dir_t(ros.get_node(path)), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(is_dir_t(ros.get_node(path)), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("cannot add '%s', because '%s' is recorded as a file "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "in the workspace manifest") % goal % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1157,7 +1157,7 @@ addition_builder::add_nodes_for(file_pat
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       nid = er.create_dir_node();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case path::special:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("cannot handle special file '%s'") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1213,7 +1213,7 @@ addition_builder::visit_special(file_pat
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("cannot add '%s'; it is not a regular file") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1442,7 +1442,7 @@ editable_working_tree::apply_delta(file_
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        F("file '%s' does not exist") % pth,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        F("file '%s' is a directory") % pth,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        F("file '%s' is not a regular file") % pth);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(calculate_ident(pth) == old_id, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(calculate_ident(pth) == old_id, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("content of file '%s' has changed, not overwriting") % pth);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   P(F("updating '%s'") % pth);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1804,7 +1804,7 @@ workspace::update_current_roster_from_fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Emit an error, if the caller doesn't want to cope with missing or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // mismatched files and directories in the workspace.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(missing_items == 0 || wres.get() != NULL, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(missing_items == 0 || wres.get() != NULL, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("%d missing items; use '%s ls missing' to view.\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "To restore consistency, on each missing item run either\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       " '%s drop ITEM' to remove it permanently, or\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1899,7 +1899,7 @@ workspace::perform_additions(database & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           switch (get_path_status(path))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case path::nonexistent:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("no such file or directory: '%s'") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case path::file:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1909,7 +1909,7 @@ workspace::perform_additions(database & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               build.visit_dir(path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             case path::special:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("cannot handle special file '%s'") % path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1962,7 +1962,7 @@ workspace::perform_deletions(database & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       file_path const & name(todo.front());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!name.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!name.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("unable to drop the root directory"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (!new_roster.has_node(name))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1975,7 +1975,7 @@ workspace::perform_deletions(database & 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               const_dir_t d = downcast_to_dir_t(n);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               if (!d->children.empty())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  E(recursive, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  MONOTONE_ERROR(recursive, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     F("cannot remove '%s/', it is not empty") % name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   for (dir_map::const_iterator j = d->children.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        j != d->children.end(); ++j)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2042,10 +2042,10 @@ workspace::perform_rename(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       file_path const & src = *srcs.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       file_path dpath = dst;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(!src.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(!src.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("cannot rename the workspace root (try '%s pivot_root' instead)")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         % prog_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(new_roster.has_node(src), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(new_roster.has_node(src), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("source file '%s' is not versioned") % src);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (src == dst || dst.is_beneath_of(src))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2069,7 +2069,7 @@ workspace::perform_rename(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // touch foo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // mtn mv foo bar/foo where bar doesn't exist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           file_path parent = dst.dirname();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(directory_exists(parent), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(directory_exists(parent), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("destination path's parent directory '%s/' doesn't exist")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             % parent);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2087,16 +2087,16 @@ workspace::perform_rename(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // 2) mv foo bar
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       //    mtn mv --bookkeep-only foo bar
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(directory_exists(dst), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(directory_exists(dst), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("destination '%s/' is not a directory") % dst);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       for (set<file_path>::const_iterator i = srcs.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            i != srcs.end(); i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(!i->empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(!i->empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("cannot rename the workspace root (try '%s pivot_root' instead)")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             % prog_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(new_roster.has_node(*i), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(new_roster.has_node(*i), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("source file '%s' is not versioned") % *i);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           file_path d = dst / i->basename();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2113,7 +2113,7 @@ workspace::perform_rename(database & db,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               // case 1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               d = dst / i->basename();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              E(!new_roster.has_node(d), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              MONOTONE_ERROR(!new_roster.has_node(d), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 F("destination '%s' already exists in the workspace manifest") % d);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2188,13 +2188,13 @@ workspace::perform_pivot_root(database &
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   MM(new_roster);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   I(old_roster.has_root());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(old_roster.has_node(new_root), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(old_roster.has_node(new_root), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("proposed new root directory '%s' is not versioned or does not exist")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % new_root);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(is_dir_t(old_roster.get_node(new_root)), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(is_dir_t(old_roster.get_node(new_root)), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("proposed new root directory '%s' is not a directory") % new_root);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(!old_roster.has_node(new_root / bookkeeping_root_component), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(!old_roster.has_node(new_root / bookkeeping_root_component), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("proposed new root directory '%s' contains illegal path '%s'")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % new_root % bookkeeping_root);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2204,14 +2204,14 @@ workspace::perform_pivot_root(database &
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     file_path current_path_to_put_old_parent
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       = current_path_to_put_old.dirname();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(old_roster.has_node(current_path_to_put_old_parent), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(old_roster.has_node(current_path_to_put_old_parent), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("directory '%s' is not versioned or does not exist")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % current_path_to_put_old_parent);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(is_dir_t(old_roster.get_node(current_path_to_put_old_parent)),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(is_dir_t(old_roster.get_node(current_path_to_put_old_parent)),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("'%s' is not a directory")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % current_path_to_put_old_parent);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(!old_roster.has_node(current_path_to_put_old),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(!old_roster.has_node(current_path_to_put_old),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("'%s' is in the way") % current_path_to_put_old);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2251,7 +2251,7 @@ workspace::perform_content_update(roster
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   bookkeeping_path detached = path_for_detached_nids();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   bool moved_conflicting = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!directory_exists(detached), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!directory_exists(detached), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("workspace is locked\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       "you must clean up and remove the %s directory")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     % detached);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2270,7 +2270,7 @@ workspace::perform_content_update(roster
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // wants them back
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (swt.has_conflicting_paths())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(move_conflicting_paths, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(move_conflicting_paths, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("re-run this command with '--move-conflicting-paths' to move "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "conflicting paths out of the way"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       move_conflicting_paths_into_bookkeeping(swt.get_conflicting_paths());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/work.hh    0a914719f5adbd4961a962b8e07a7467af8b064c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/work.hh    2f80920a3a1867e89933785929d386eee3b68c7f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -37,7 +37,7 @@ class app_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // as well as many instance methods.  class methods can be used when you're
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // not sure yet whether or not there is a workspace.  instance methods can
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // only be used if there definitely is a workspace; the workspace object
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// constructor will throw an E() if there isn't one.  (this can also be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// constructor will throw an MONOTONE_ERROR() if there isn't one.  (this can also be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // triggered by the class method require_workspace, for the sake of a few
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // places that need to do that but not create the workspace object yet.)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- test/src/tester.cc     ff0fdf93f175dfc1d8dee61bb01bdc902860c653
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/src/tester.cc     7687a74b445ec7f3b528bc4a6b8f9a72c8bf9639
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -170,7 +170,7 @@ void do_copy_recursive(string const & fr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   path::status fromstat = get_path_status(from);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(fromstat != path::nonexistent, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(fromstat != path::nonexistent, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("Source '%s' for copy does not exist") % from);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   switch (get_path_status(to))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -201,7 +201,7 @@ void do_copy_recursive(string const & fr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       struct file_copier copy_files(from, to);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       read_directory(from, copy_files, get_subdirs, get_specials);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(specials.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(specials.empty(), origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("cannot copy special files in '%s'") % from);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       for (vector<string>::const_iterator i = subdirs.begin();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            i != subdirs.end(); i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -221,14 +221,14 @@ LUAEXT(posix_umask, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ LUAEXT(posix_umask, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   unsigned int decmask = (unsigned int)luaL_checknumber(LS, -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(decmask <= 777, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(decmask <= 777, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("invalid argument %d to umask") % decmask);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   unsigned int a = decmask / 100  % 10;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   unsigned int b = decmask / 10   % 10;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   unsigned int c = decmask / 1    % 10;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(a <= 7 && b <= 7 && c <= 7, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(a <= 7 && b <= 7 && c <= 7, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("invalid octal number %d in umask") % decmask);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   int oldmask = do_umask((a*8 + b)*8 + c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -361,7 +361,7 @@ LUAEXT(normalize_path, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ LUAEXT(normalize_path, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const char *pathstr = luaL_checkstring(LS, -1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(pathstr, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(pathstr, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("%s called with an invalid parameter") % "normalize_path");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   lua_pushstring(LS, system_path(pathstr).as_external().c_str());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -426,7 +426,7 @@ LUAEXT(require_not_root, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ LUAEXT(require_not_root, )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  // E() doesn't work here, I just get "warning: " in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // MONOTONE_ERROR() doesn't work here, I just get "warning: " in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // output.  Why?
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (running_as_root())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -498,7 +498,7 @@ int test_invoker::operator()(std::string
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   catch (std::exception & e)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::no_fault, F("test %s: %s") % testname % e.what());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::no_fault, F("test %s: %s") % testname % e.what());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       retcode = 124;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return retcode;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -868,7 +868,7 @@ parse_command_line(int argc, char const 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (jxx != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     jobs = jxx;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(!run_one || (!want_help && !debugging && !list_only
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(!run_one || (!want_help && !debugging && !list_only
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                  && tests_to_run.size() == 3 && jobs == 0),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("incorrect self-invocation; -r <abs path to testsuite.lua> <abs path to work_dir> <test>"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -955,7 +955,7 @@ int main(int argc, char **argv)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           lua_lib st(tests_to_run[1], tests_to_run[0]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return test_invoker(st())(tests_to_run[2]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(false, origin::user,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("self-invocation should not be used on Unix\n"));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- test/src/unix/tester-plaf.cc   e89307c5460db6fe1a76214c34ad914f178a9988
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/src/unix/tester-plaf.cc   4e1d615e4ebe4e4da34ddca7d401635e9d4372d4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -38,7 +38,7 @@ time_t get_last_write_time(char const * 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (stat(name, &st) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system, F("stat(%s) failed: %s") % name % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system, F("stat(%s) failed: %s") % name % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return st.st_mtime;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -50,7 +50,7 @@ void do_copy_file(string const & from, s
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   int ifd, ofd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ifd = open(from.c_str(), O_RDONLY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(ifd >= 0, origin::system, F("open %s: %s") % from % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(ifd >= 0, origin::system, F("open %s: %s") % from % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   struct stat st;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   st.st_mode = 0666;  // sane default if fstat fails
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   fstat(ifd, &st);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -59,7 +59,7 @@ void do_copy_file(string const & from, s
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       close(ifd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(false, origin::system, F("open %s: %s") % to % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(false, origin::system, F("open %s: %s") % to % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ssize_t nread, nwrite;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -96,21 +96,21 @@ void do_copy_file(string const & from, s
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     close(ifd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     close(ofd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(false, origin::system, F("read error copying %s to %s: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(false, origin::system, F("read error copying %s to %s: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % from % to % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  write_error:  {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     int err = errno;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     close(ifd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     close(ofd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(false, origin::system, F("write error copying %s to %s: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(false, origin::system, F("write error copying %s to %s: %s")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % from % to % os_strerror(err));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  spinning:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     close(ifd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     close(ofd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("abandoning copy of %s to %s after four zero-length writes")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       % from % to);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -196,7 +196,7 @@ char * make_temp_dir()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       strcpy(tmpdir, templ);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       result = mktemp(tmpdir);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(result, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(result, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("mktemp(%s) failed: %s") % tmpdir % os_strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       I(result == tmpdir);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -207,11 +207,11 @@ char * make_temp_dir()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return templ;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(errno == EEXIST, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(errno == EEXIST, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("mkdir(%s) failed: %s") % tmpdir % os_strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       cycles++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(cycles < limit, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(cycles < limit, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("%d temporary names are all in use") % limit);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -377,7 +377,7 @@ void prepare_for_parallel_testcases(int 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (jread == -1 && jwrite == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       int jp[2];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(pipe(jp) == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(pipe(jp) == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("creating jobs pipe: %s") % os_strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       jread = jp[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       jwrite = jp[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -456,7 +456,7 @@ namespace {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if (errno == EINTR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            E(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            MONOTONE_ERROR(false, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               F("waitpid failed: %s") % os_strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -500,7 +500,7 @@ void run_tests_in_children(test_enumerat
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   sa.sa_handler = sigchld;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   sa.sa_flags = SA_NOCLDSTOP; // deliberate non-use of SA_RESTART
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(sigaction(SIGCHLD, &sa, &osa) == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(sigaction(SIGCHLD, &sa, &osa) == 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("setting SIGCHLD handler: %s") % os_strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   while (next_test(t))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- test/src/win32/tester-plaf.cc  645562da8321cb84ee9f1956d085528ac0892375
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/src/win32/tester-plaf.cc  5ee26097eae48366f0ae3f2875eaae6b4295b3de
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -22,11 +22,11 @@ time_t get_last_write_time(char const * 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   HANDLE h = CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         OPEN_EXISTING, 0, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(h != INVALID_HANDLE_VALUE, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(h != INVALID_HANDLE_VALUE, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("CreateFile(%s) failed: %s") % name % os_strerror(GetLastError()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   FILETIME ft;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(GetFileTime(h, NULL, NULL, &ft), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(GetFileTime(h, NULL, NULL, &ft), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("GetFileTime(%s) failed: %s") % name % os_strerror(GetLastError()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   CloseHandle(h);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -43,7 +43,7 @@ void do_copy_file(std::string const & fr
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void do_copy_file(std::string const & from, std::string const & to)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // For once something is easier with Windows.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(CopyFile(from.c_str(), to.c_str(), true), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(CopyFile(from.c_str(), to.c_str(), true), origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     F("copy %s to %s: %s") % from % to % os_strerror(GetLastError()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -98,7 +98,7 @@ char * make_temp_dir()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // GetTempFileName wants 14 characters at the end of the path.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     DWORD ret = GetTempPath(DIR_MAX_SIZE - 14, dir);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    E(ret > 0 && ret <= DIR_MAX_SIZE - 14, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MONOTONE_ERROR(ret > 0 && ret <= DIR_MAX_SIZE - 14, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       F("GetTempPath failed: %s") % os_strerror(GetLastError()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -111,16 +111,16 @@ char * make_temp_dir()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (base + i == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(GetTempFileName(dir, "MTN", base + i, name) != 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(GetTempFileName(dir, "MTN", base + i, name) != 0, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("GetTempFileName failed: %s") % os_strerror(GetLastError()));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (CreateDirectory(name, NULL))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      E(GetLastError() == ERROR_ALREADY_EXISTS, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      MONOTONE_ERROR(GetLastError() == ERROR_ALREADY_EXISTS, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         F("CreateDirectory(%s) failed: %s") % name % GetLastError());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  E(false, origin::system, F("All temporary directory names are already in use."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MONOTONE_ERROR(false, origin::system, F("All temporary directory names are already in use."));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bool running_as_root()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- test/unit/tests/netxx_pipe.cc  2141174212668037af24060f742c06430c59e3a7
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ test/unit/tests/netxx_pipe.cc  98c22586e6363e1d34bdaa1f0bcbcaf32d192fd7
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -56,7 +56,7 @@ UNIT_TEST(simple_pipe)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           probe.clear();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           probe.add(pipe, Netxx::Probe::ready_read);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           res = probe.ready(timeout);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          E(res.second & Netxx::Probe::ready_read, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          MONOTONE_ERROR(res.second & Netxx::Probe::ready_read, origin::system,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             F("timeout reading data %d") % c);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(_WIN32) || defined(_WIN64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           I(res.first == pipe.get_socketfd());
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/monotone/files/patch-cstdlib.diff b/devel/monotone/files/patch-cstdlib.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..157ad06
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/monotone/files/patch-cstdlib.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,26 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+----------------------------------------------------------------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Revision: d31e3528a05a44cb37564f06484906872f10eb5d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Parent:   2ed09e2720ad78b81a36d3b3d90602e8459b58b8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Author:   yan12125@gmail.com
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date:     西元2019年06月13日 21時19分45秒
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Branch:   net.venge.monotone
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Changelog: 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Fix building on Mac OS X 10.12
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Changes against parent 2ed09e2720ad78b81a36d3b3d90602e8459b58b8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/gzip.cc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/gzip.cc    7872a4ddd5d805731cfaba0a7ff743224763f3fc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/gzip.cc    f6e5c2af3852c44eae2c7f3315ad124f86864455
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -18,6 +18,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "botan_glue.hh"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <cstring>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <cstdlib>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <map>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <zlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/monotone/files/patch-float128.diff b/devel/monotone/files/patch-float128.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..398d565
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/monotone/files/patch-float128.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,47 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+----------------------------------------------------------------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Revision: 2ed09e2720ad78b81a36d3b3d90602e8459b58b8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Parent:   29828d7d187ae07d441e863d23e631c24b7e1fea
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Author:   yan12125@gmail.com
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date:     西元2019年06月13日 21時19分13秒
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Branch:   net.venge.monotone
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Changelog: 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Fix building with Apple Clang
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Apparently Apple Clang supports __float128 now, and declarations like
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+`struct __float128` lead to compiler errors.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Changes against parent 29828d7d187ae07d441e863d23e631c24b7e1fea
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/base.hh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/netxx/compat.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/base.hh    2c6f22801aef99bb44b173fba7e4564ae4d9b95f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/base.hh    7731f4cec3edeed490b45f21009bf952402dd1ee
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -39,11 +39,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #undef __STRICT_ANSI__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// Clang doesn't support __float128, but glibc needs it.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifdef __clang__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-struct __float128;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <iosfwd>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <string>  // it would be nice if there were a <stringfwd>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/netxx/compat.h     a7dc9d82de9bfc739303bb2730f74c68ecbfbbca
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/netxx/compat.h     de965006ea6b46afb54802a44b93a56d8f23a86f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -78,9 +78,4 @@ namespace std {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif // __cplusplus
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// Clang doesn't support __float128, but glibc needs it.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifdef __clang__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-struct __float128;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif // _compat_h__compatability_header
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/monotone/files/patch-pid_t.diff b/devel/monotone/files/patch-pid_t.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..c8bd47f
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/monotone/files/patch-pid_t.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,26 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+----------------------------------------------------------------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Revision: 282605965d2a3714bb0ef0deece20fbadfeb56bc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Parent:   d31e3528a05a44cb37564f06484906872f10eb5d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Author:   yan12125@gmail.com
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date:     2019/06/14 09時36分27秒
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Branch:   net.venge.monotone
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Changelog: 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Another fix for Mac OS X <= 10.12
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Changes against parent d31e3528a05a44cb37564f06484906872f10eb5d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  patched  src/platform.hh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+============================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/platform.hh        9276d8a314fbca9e78e8f3963b77331e094b1b30
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/platform.hh        5550553cda41431417a90c7569ad31efea9d671b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -15,6 +15,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <cstdio>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <ctime>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void read_password(std::string const & prompt, char * buf, size_t bufsz);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void get_system_flavour(std::string & ident);
</span></pre><pre style='margin:0'>

</pre>