diff options
author | Peter Volkov <pva@gentoo.org> | 2013-08-28 13:35:54 +0000 |
---|---|---|
committer | Peter Volkov <pva@gentoo.org> | 2013-08-28 13:35:54 +0000 |
commit | e469a9ebc4e3fa2845c94c91847c870eba2037af (patch) | |
tree | 61d8275da2526826e79b66b2a5f6e5e15a90d052 /dev-vcs/monotone | |
parent | Stable for HPPA (bug #482308). (diff) | |
download | gentoo-2-e469a9ebc4e3fa2845c94c91847c870eba2037af.tar.gz gentoo-2-e469a9ebc4e3fa2845c94c91847c870eba2037af.tar.bz2 gentoo-2-e469a9ebc4e3fa2845c94c91847c870eba2037af.zip |
Fixed test failure with botan-1.10, thank Martin von Gagern for patch in bug #380257. Fixed another failure with pcre3 (patch from debian).
(Portage version: 2.1.12.2/cvs/Linux x86_64, signed Manifest commit with key F1989B07)
Diffstat (limited to 'dev-vcs/monotone')
-rw-r--r-- | dev-vcs/monotone/ChangeLog | 10 | ||||
-rw-r--r-- | dev-vcs/monotone/files/monotone-1.0-botan-1.10-v2.patch | 644 | ||||
-rw-r--r-- | dev-vcs/monotone/files/monotone-1.0-pcre3.patch | 26 | ||||
-rw-r--r-- | dev-vcs/monotone/metadata.xml | 4 | ||||
-rw-r--r-- | dev-vcs/monotone/monotone-1.0-r4.ebuild | 115 |
5 files changed, 798 insertions, 1 deletions
diff --git a/dev-vcs/monotone/ChangeLog b/dev-vcs/monotone/ChangeLog index b7745cbdbed0..0d584260ad48 100644 --- a/dev-vcs/monotone/ChangeLog +++ b/dev-vcs/monotone/ChangeLog @@ -1,6 +1,14 @@ # ChangeLog for dev-vcs/monotone # Copyright 1999-2013 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/dev-vcs/monotone/ChangeLog,v 1.26 2013/06/30 00:18:23 chithanh Exp $ +# $Header: /var/cvsroot/gentoo-x86/dev-vcs/monotone/ChangeLog,v 1.27 2013/08/28 13:35:54 pva Exp $ + +*monotone-1.0-r4 (28 Aug 2013) + + 28 Aug 2013; Peter Volkov <pva@gentoo.org> +monotone-1.0-r4.ebuild, + +files/monotone-1.0-botan-1.10-v2.patch, +files/monotone-1.0-pcre3.patch, + metadata.xml: + Fixed test failure with botan-1.10, thank Martin von Gagern for patch in bug + #380257. Fixed another failure with pcre3 (patch from debian). 30 Jun 2013; Chí-Thanh Christopher Nguyễn <chithanh@gentoo.org> +files/monotone-1.0-boost-1.53.patch, monotone-1.0-r3.ebuild: diff --git a/dev-vcs/monotone/files/monotone-1.0-botan-1.10-v2.patch b/dev-vcs/monotone/files/monotone-1.0-botan-1.10-v2.patch new file mode 100644 index 000000000000..a86bac555b18 --- /dev/null +++ b/dev-vcs/monotone/files/monotone-1.0-botan-1.10-v2.patch @@ -0,0 +1,644 @@ +Make monotone work with botan 1.10. + +Patch generated using the following command: +mtn diff -r 972ee5c3eab3fb5ba0b80684193293d18438a9d0 \ + -r f4feb3fdc68e4f955909450b2dcb3ff9312dbc9e + +Authors: Martin von Gagern, Markus Wanner + +References: +https://bugs.gentoo.org/380257 +https://code.monotone.ca/p/monotone/issues/182/ +https://code.monotone.ca/p/monotone/source/commit/f4feb3fd + +============================================================ +--- src/database.cc 4c259f963c440fc95564dfec99b2f832f0bad643 ++++ src/database.cc 87efeeff2d3263ba98af684a4022f1897434ed2d +@@ -3425,9 +3425,8 @@ database::encrypt_rsa(key_id const & pub + rsa_pub_key pub; + get_key(pub_id, pub); + +- SecureVector<Botan::byte> pub_block; +- pub_block.set(reinterpret_cast<Botan::byte const *>(pub().data()), +- pub().size()); ++ SecureVector<Botan::byte> pub_block ++ (reinterpret_cast<Botan::byte const *>(pub().data()), pub().size()); + + shared_ptr<X509_PublicKey> x509_key(Botan::X509::load_key(pub_block)); + shared_ptr<RSA_PublicKey> pub_key +@@ -3471,14 +3470,13 @@ database::check_signature(key_id const & + else + { + rsa_pub_key pub; +- SecureVector<Botan::byte> pub_block; + + if (!public_key_exists(id)) + return cert_unknown; + + get_key(id, pub); +- pub_block.set(reinterpret_cast<Botan::byte const *>(pub().data()), +- pub().size()); ++ SecureVector<Botan::byte> pub_block ++ (reinterpret_cast<Botan::byte const *>(pub().data()), pub().size()); + + L(FL("building verifier for %d-byte pub key") % pub_block.size()); + shared_ptr<X509_PublicKey> x509_key(Botan::X509::load_key(pub_block)); +============================================================ +--- src/gzip.cc e7c19bee910e3d421fd073933810ec52092b1d9b ++++ src/gzip.cc 9da41f6820cdf39707b22c716e3682e0fa0fd745 +@@ -110,7 +110,7 @@ Gzip_Compression::Gzip_Compression(u32bi + if(deflateInit2(&(zlib->stream), level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY) != Z_OK) + { + delete zlib; zlib = 0; +- throw Exception("Gzip_Compression: Memory allocation error"); ++ throw Memory_Exhaustion(); + } + } + +@@ -137,7 +137,7 @@ void Gzip_Compression::start_msg() + /************************************************* + * Compress Input with Gzip * + *************************************************/ +-void Gzip_Compression::write(const byte input[], u32bit length) ++void Gzip_Compression::write(const byte input[], filter_length_t length) + { + + count += length; +@@ -152,7 +152,7 @@ void Gzip_Compression::write(const byte + zlib->stream.avail_out = buffer.size(); + int rc = deflate(&(zlib->stream), Z_NO_FLUSH); + if (rc != Z_OK && rc != Z_STREAM_END) +- throw Exception("Internal error in Gzip_Compression deflate."); ++ throw Invalid_State("Internal error in Gzip_Compression deflate."); + send(buffer.begin(), buffer.size() - zlib->stream.avail_out); + } + } +@@ -172,7 +172,7 @@ void Gzip_Compression::end_msg() + zlib->stream.avail_out = buffer.size(); + rc = deflate(&(zlib->stream), Z_FINISH); + if (rc != Z_OK && rc != Z_STREAM_END) +- throw Exception("Internal error in Gzip_Compression finishing deflate."); ++ throw Invalid_State("Internal error in Gzip_Compression finishing deflate."); + send(buffer.begin(), buffer.size() - zlib->stream.avail_out); + } + +@@ -228,7 +228,7 @@ Gzip_Decompression::Gzip_Decompression() + no_writes(true), pipe(new Hash_Filter("CRC32")), footer(0) + { + if (DEFAULT_BUFFERSIZE < sizeof(GZIP::GZIP_HEADER)) +- throw Exception("DEFAULT_BUFFERSIZE is too small"); ++ throw Decoding_Error("DEFAULT_BUFFERSIZE is too small"); + + zlib = new Zlib_Stream; + +@@ -237,7 +237,7 @@ Gzip_Decompression::Gzip_Decompression() + if(inflateInit2(&(zlib->stream), -15) != Z_OK) + { + delete zlib; zlib = 0; +- throw Exception("Gzip_Decompression: Memory allocation error"); ++ throw Memory_Exhaustion(); + } + } + +@@ -256,7 +256,7 @@ void Gzip_Decompression::start_msg() + void Gzip_Decompression::start_msg() + { + if (!no_writes) +- throw Exception("Gzip_Decompression: start_msg after already writing"); ++ throw Decoding_Error("Gzip_Decompression: start_msg after already writing"); + + pipe.start_msg(); + datacount = 0; +@@ -267,7 +267,7 @@ void Gzip_Decompression::start_msg() + /************************************************* + * Decompress Input with Gzip * + *************************************************/ +-void Gzip_Decompression::write(const byte input[], u32bit length) ++void Gzip_Decompression::write(const byte input[], filter_length_t length) + { + if(length) no_writes = false; + +@@ -277,15 +277,16 @@ void Gzip_Decompression::write(const byt + u32bit eat_len = eat_footer(input, length); + input += eat_len; + length -= eat_len; +- if (length == 0) +- return; + } + ++ if (length == 0) ++ return; ++ + // Check the gzip header + if (pos < sizeof(GZIP::GZIP_HEADER)) + { +- u32bit len = std::min((u32bit)sizeof(GZIP::GZIP_HEADER)-pos, length); +- u32bit cmplen = len; ++ filter_length_t len = std::min((filter_length_t)sizeof(GZIP::GZIP_HEADER)-pos, length); ++ filter_length_t cmplen = len; + // The last byte is the OS flag - we don't care about that + if (pos + len - 1 >= GZIP::HEADER_POS_OS) + cmplen--; +@@ -317,8 +318,8 @@ void Gzip_Decompression::write(const byt + if(rc == Z_NEED_DICT) + throw Decoding_Error("Gzip_Decompression: Need preset dictionary"); + if(rc == Z_MEM_ERROR) +- throw Exception("Gzip_Decompression: Memory allocation error"); +- throw Exception("Gzip_Decompression: Unknown decompress error"); ++ throw Memory_Exhaustion(); ++ throw Decoding_Error("Gzip_Decompression: Unknown decompress error"); + } + send(buffer.begin(), buffer.size() - zlib->stream.avail_out); + pipe.write(buffer.begin(), buffer.size() - zlib->stream.avail_out); +@@ -346,8 +347,14 @@ u32bit Gzip_Decompression::eat_footer(co + if (footer.size() >= GZIP::FOOTER_LENGTH) + throw Decoding_Error("Gzip_Decompression: Data integrity error in footer"); + ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11) ++ size_t eat_len = std::min(GZIP::FOOTER_LENGTH-footer.size(), ++ static_cast<size_t>(length)); ++ footer += std::make_pair(input, eat_len); ++#else + u32bit eat_len = std::min(GZIP::FOOTER_LENGTH-footer.size(), length); + footer.append(input, eat_len); ++#endif + + if (footer.size() == GZIP::FOOTER_LENGTH) + { +@@ -364,7 +371,7 @@ void Gzip_Decompression::check_footer() + void Gzip_Decompression::check_footer() + { + if (footer.size() != GZIP::FOOTER_LENGTH) +- throw Exception("Gzip_Decompression: Error finalizing decompression"); ++ throw Decoding_Error("Gzip_Decompression: Error finalizing decompression"); + + pipe.end_msg(); + +@@ -377,7 +384,12 @@ void Gzip_Decompression::check_footer() + for (int i = 0; i < 4; i++) + buf[3-i] = tmpbuf[i]; + ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11) ++ tmpbuf.resize(4); ++ tmpbuf.copy(footer.begin(), 4); ++#else + tmpbuf.set(footer.begin(), 4); ++#endif + if (buf != tmpbuf) + throw Decoding_Error("Gzip_Decompression: Data integrity error - CRC32 error"); + +@@ -400,7 +412,7 @@ void Gzip_Decompression::end_msg() + // read, clear() will reset no_writes + if(no_writes) return; + +- throw Exception("Gzip_Decompression: didn't find footer"); ++ throw Decoding_Error("Gzip_Decompression: didn't find footer"); + + } + +@@ -412,7 +424,11 @@ void Gzip_Decompression::clear() + no_writes = true; + inflateReset(&(zlib->stream)); + ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11) ++ footer.clear(); ++#else + footer.destroy(); ++#endif + pos = 0; + datacount = 0; + } +============================================================ +--- src/gzip.hh 649dfc0b250954f39c0f73870f8bec3f32f7fa43 ++++ src/gzip.hh aff9da63bb22366bccf69c2d75ee7790406d2455 +@@ -7,11 +7,18 @@ + #ifndef BOTAN_EXT_GZIP_H__ + #define BOTAN_EXT_GZIP_H__ + ++#include <botan/version.h> + #include <botan/filter.h> + #include <botan/pipe.h> + + namespace Botan { + ++#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,4) ++// Only 1.9.4 and newer export the Memory_Exception. Give this gzip ++// implementation something compatible to work with. ++typedef std::bad_alloc Memory_Exhaustion; ++#endif ++ + namespace GZIP { + + /* A basic header - we only need to set the IDs and compression method */ +@@ -30,13 +37,19 @@ namespace GZIP { + + } + ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11) ++typedef size_t filter_length_t; ++#else ++typedef u32bit filter_length_t; ++#endif ++ + /************************************************* + * Gzip Compression Filter * + *************************************************/ + class Gzip_Compression : public Filter + { + public: +- void write(const byte input[], u32bit length); ++ void write(const byte input[], filter_length_t length); + void start_msg(); + void end_msg(); + std::string name() const { return "Gzip_Compression"; } +@@ -60,7 +73,7 @@ class Gzip_Decompression : public Filter + class Gzip_Decompression : public Filter + { + public: +- void write(const byte input[], u32bit length); ++ void write(const byte input[], filter_length_t length); + void start_msg(); + void end_msg(); + std::string name() const { return "Gzip_Decompression"; } +============================================================ +--- src/key_packet.cc d1306df89dd684badac02c03744cd446381c07d3 ++++ src/key_packet.cc c97262d161b23c9640972188979669b3e95afe7b +@@ -106,8 +106,8 @@ namespace + void validate_public_key_data(string const & name, string const & keydata) const + { + string decoded = decode_base64_as<string>(keydata, origin::user); +- Botan::SecureVector<Botan::byte> key_block; +- key_block.set(reinterpret_cast<Botan::byte const *>(decoded.c_str()), decoded.size()); ++ Botan::SecureVector<Botan::byte> key_block ++ (reinterpret_cast<Botan::byte const *>(decoded.c_str()), decoded.size()); + try + { + Botan::X509::load_key(key_block); +============================================================ +--- src/key_store.cc 64c4c4bed1fadc26b51207b9f61343f9dd7d3c6e ++++ src/key_store.cc b7859345f7c665914d16357409bdff24a48b7996 +@@ -572,13 +572,21 @@ key_store_state::decrypt_private_key(key + try // with empty passphrase + { + Botan::DataSource_Memory ds(kp.priv()); +-#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7) ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11) ++ pkcs8_key.reset(Botan::PKCS8::load_key(ds, lazy_rng::get(), Dummy_UI())); ++#elif BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7) + pkcs8_key.reset(Botan::PKCS8::load_key(ds, lazy_rng::get(), "")); + #else + pkcs8_key.reset(Botan::PKCS8::load_key(ds, "")); + #endif + } ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11) ++ catch (Passphrase_Required & e) ++#elif BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4) ++ catch (Botan::Invalid_Argument & e) ++#else + catch (Botan::Exception & e) ++#endif + { + L(FL("failed to load key with no passphrase: %s") % e.what()); + +@@ -605,13 +613,18 @@ key_store_state::decrypt_private_key(key + { + Botan::DataSource_Memory ds(kp.priv()); + #if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7) +- pkcs8_key.reset(Botan::PKCS8::load_key(ds, lazy_rng::get(), phrase())); ++ pkcs8_key.reset(Botan::PKCS8::load_key(ds, lazy_rng::get(), ++ phrase())); + #else + pkcs8_key.reset(Botan::PKCS8::load_key(ds, phrase())); + #endif + break; + } ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4) ++ catch (Botan::Invalid_Argument) ++#else + catch (Botan::Exception & e) ++#endif + { + cycles++; + L(FL("decrypt_private_key: failure %d to load encrypted key: %s") +@@ -822,10 +835,14 @@ key_store::decrypt_rsa(key_id const & id + plaintext = string(reinterpret_cast<char const*>(plain.begin()), + plain.size()); + } +- catch (Botan::Exception & ex) ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4) ++ catch (std::exception & e) ++#else ++ catch (Botan::Exception & e) ++#endif + { + E(false, ciphertext.made_from, +- F("Botan error decrypting data: '%s'") % ex.what()); ++ F("Botan error decrypting data: '%s'") % e.what()); + } + } + +@@ -856,9 +873,9 @@ key_store::make_signature(database & db, + { + if (agent.connected()) { + //grab the monotone public key as an RSA_PublicKey +- SecureVector<Botan::byte> pub_block; +- pub_block.set(reinterpret_cast<Botan::byte const *>(key.pub().data()), +- key.pub().size()); ++ SecureVector<Botan::byte> pub_block ++ (reinterpret_cast<Botan::byte const *>(key.pub().data()), ++ key.pub().size()); + L(FL("make_signature: building %d-byte pub key") % pub_block.size()); + shared_ptr<X509_PublicKey> x509_key = + shared_ptr<X509_PublicKey>(Botan::X509::load_key(pub_block)); +@@ -1031,8 +1048,14 @@ key_store_state::migrate_old_key_pair + for (;;) + try + { ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11) ++ arc4_key.resize(phrase().size()); ++ arc4_key.copy(reinterpret_cast<Botan::byte const *>(phrase().data()), ++ phrase().size()); ++#else + arc4_key.set(reinterpret_cast<Botan::byte const *>(phrase().data()), + phrase().size()); ++#endif + + Pipe arc4_decryptor(get_cipher("ARC4", arc4_key, Botan::DECRYPTION)); + +@@ -1051,7 +1074,11 @@ key_store_state::migrate_old_key_pair + #endif + break; + } ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,4) ++ catch (Botan::Invalid_Argument & e) ++#else + catch (Botan::Exception & e) ++#endif + { + L(FL("migrate_old_key_pair: failure %d to load old private key: %s") + % cycles % e.what()); +============================================================ +--- src/monotone.cc a25ecdd170a601db798b63a60add7681609a34c4 ++++ src/monotone.cc 764bc9ca406b41d21efd552a0d810bc2849e0588 +@@ -156,27 +156,53 @@ cpp_main(int argc, char ** argv) + E(linked_botan_version != BOTAN_VERSION_CODE_FOR(1,7,14), origin::system, + F("monotone does not support Botan 1.7.14")); + +-#if BOTAN_VERSION_CODE <= BOTAN_VERSION_CODE_FOR(1,7,6) ++ // In Botan 1.9.9, the DataSink_Stream cannot be instantiated per ++ // se. As 1.10.1 is already out, let's simply disable support for ++ // that specific (testing) version of botan. ++ E(linked_botan_version != BOTAN_VERSION_CODE_FOR(1,9,9), origin::system, ++ F("monotone does not support Botan 1.9.9")); ++ ++#if BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,7,7) ++ // motonote binary compiled against botan younger than 1.7.7 + E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,6,3), origin::system, + F("this monotone binary requires Botan 1.6.3 or newer")); +- E(linked_botan_version <= BOTAN_VERSION_CODE_FOR(1,7,6), origin::system, +- F("this monotone binary does not work with Botan newer than 1.7.6")); +-#elif BOTAN_VERSION_CODE <= BOTAN_VERSION_CODE_FOR(1,7,22) +- E(linked_botan_version > BOTAN_VERSION_CODE_FOR(1,7,6), origin::system, ++ E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,7,7), origin::system, ++ F("this monotone binary does not work with Botan 1.7.7 or newer")); ++ ++#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,7,22) ++ // motonote binary compiled against botan 1.7.7 - 1.7.21 ++ E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,7,7), origin::system, + F("this monotone binary requires Botan 1.7.7 or newer")); +- // While compiling against 1.7.22 or newer is recommended, because +- // it enables new features of Botan, the monotone binary compiled +- // against Botan 1.7.21 and before should still work with newer Botan +- // versions, including all of the stable branch 1.8.x. +- E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,0), origin::system, +- F("this monotone binary does not work with Botan 1.9.x")); +-#else +- E(linked_botan_version > BOTAN_VERSION_CODE_FOR(1,7,22), origin::system, ++ // While compiling against 1.7.22 or newer is recommended, because it ++ // enables new features of Botan, the monotone binary compiled against ++ // Botan 1.7.21 and before should still work with newer Botan version, ++ // including all of the stable branch 1.8.x, up to and including ++ // 1.9.3. ++ E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,4), origin::system, ++ F("this monotone binary does not work with Botan 1.9.4 or newer")); ++ ++#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,4) ++ // motonote binary compiled against botan 1.7.22 - 1.9.3 ++ E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,7,22), origin::system, + F("this monotone binary requires Botan 1.7.22 or newer")); +- E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,0), origin::system, +- F("this monotone binary does not work with Botan 1.9.x")); ++ E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,4), origin::system, ++ F("this monotone binary does not work with Botan 1.9.4 or newer")); ++ ++#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,11) ++ // motonote binary compiled against botan 1.9.4 - 1.9.10 ++#pragma message ( "The resulting monotone binary won't be able to run with any stable release of botan." ) ++ E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,9,4), origin::system, ++ F("this monotone binary requires Botan 1.9.4 or newer")); ++ E(linked_botan_version < BOTAN_VERSION_CODE_FOR(1,9,11), origin::system, ++ F("this monotone binary does not work with Botan 1.9.11 or newer")); ++ ++#else ++ // motonote binary compiled against botan 1.9.11 and newer ++ E(linked_botan_version >= BOTAN_VERSION_CODE_FOR(1,9,11), origin::system, ++ F("this monotone binary requires Botan 1.9.11 or newer")); + #endif + ++ + app_state app; + try + { +============================================================ +--- src/packet.cc f61360ed2524fdf53411bd24d022a2a3c9e6e9c7 ++++ src/packet.cc 571ff6eae1d269a146da74f2730b70376957d3bb +@@ -156,8 +156,8 @@ namespace + void validate_public_key_data(string const & name, string const & keydata) const + { + string decoded = decode_base64_as<string>(keydata, origin::user); +- Botan::SecureVector<Botan::byte> key_block; +- key_block.set(reinterpret_cast<Botan::byte const *>(decoded.c_str()), decoded.size()); ++ Botan::SecureVector<Botan::byte> key_block ++ (reinterpret_cast<Botan::byte const *>(decoded.c_str()), decoded.size()); + try + { + Botan::X509::load_key(key_block); +@@ -175,7 +175,9 @@ namespace + Botan::DataSource_Memory ds(decoded); + try + { +-#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7) ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11) ++ Botan::PKCS8::load_key(ds, lazy_rng::get(), Dummy_UI()); ++#elif BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,7,7) + Botan::PKCS8::load_key(ds, lazy_rng::get(), string()); + #else + Botan::PKCS8::load_key(ds, string()); +@@ -189,7 +191,11 @@ namespace + } + // since we do not want to prompt for a password to decode it finally, + // we ignore all other exceptions ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11) ++ catch (Passphrase_Required) {} ++#else + catch (Botan::Invalid_Argument) {} ++#endif + } + void validate_certname(string const & cn) const + { +@@ -460,8 +466,16 @@ read_packets(istream & in, packet_consum + return count; + } + ++// Dummy User_Interface implementation for Botan ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11) ++std::string ++Dummy_UI::get_passphrase(const std::string &, const std::string &, ++ Botan::User_Interface::UI_Result&) const ++{ ++ throw Passphrase_Required("Passphrase required"); ++} ++#endif + +- + // Local Variables: + // mode: C++ + // fill-column: 76 +============================================================ +--- src/packet.hh 0a224e6e92f244e2c3e9a5cdb935eb8613d7e85b ++++ src/packet.hh 9c43d30145f0292d6ceda5e717e366fdead5a4d6 +@@ -10,6 +10,10 @@ + #ifndef __PACKET_HH__ + #define __PACKET_HH__ + ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11) ++#include <botan/ui.h> ++#endif ++ + #include "vocab.hh" + + struct cert; +@@ -84,8 +88,23 @@ size_t read_packets(std::istream & in, p + + size_t read_packets(std::istream & in, packet_consumer & cons); + ++#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,9,11) ++// A helper class implementing Botan::User_Interface - which doesn't really ++// interface with the user, but provides the necessary plumbing for Botan. ++// ++// See Botan commit 2d09d7d0cd4bd0e7155d001dd65a4f29103b158c ++typedef std::runtime_error Passphrase_Required; ++ ++class Dummy_UI : public Botan::User_Interface ++{ ++public: ++ virtual std::string get_passphrase(const std::string &, const std::string &, ++ Botan::User_Interface::UI_Result &) const; ++}; + #endif + ++#endif ++ + // Local Variables: + // mode: C++ + // fill-column: 76 +============================================================ +--- src/sha1.cc 5e1aa972d7c7d66e06320b039989652b830dcd75 ++++ src/sha1.cc 42e48b22fd88b25e0d38d4f91e1f13f8a83c7120 +@@ -50,9 +50,12 @@ CMD_HIDDEN(benchmark_sha1, "benchmark_sh + Botan::Default_Benchmark_Timer timer; + std::map<std::string, double> results = + Botan::algorithm_benchmark("SHA-1", milliseconds, timer, rng, af); ++#elif BOTAN_VERSION_CODE < BOTAN_VERSION_CODE_FOR(1,9,11) ++ std::map<std::string, double> results = ++ Botan::algorithm_benchmark("SHA-1", milliseconds, rng, af); + #else + std::map<std::string, double> results = +- Botan::algorithm_benchmark("SHA-1", milliseconds, rng, af); ++ Botan::algorithm_benchmark("SHA-1", af, rng, milliseconds, 16); + #endif + + for(std::map<std::string, double>::const_iterator i = results.begin(); +============================================================ +--- src/ssh_agent.cc 6d188e7012a0b82f782563b09bbd7adf3f70cf75 ++++ src/ssh_agent.cc 4a0dcab873559e934e41c5f220b5434d35600d9b +@@ -385,9 +385,9 @@ ssh_agent::has_key(const keypair & key) + ssh_agent::has_key(const keypair & key) + { + //grab the monotone public key as an RSA_PublicKey +- SecureVector<Botan::byte> pub_block; +- pub_block.set(reinterpret_cast<Botan::byte const *>((key.pub)().data()), +- (key.pub)().size()); ++ SecureVector<Botan::byte> pub_block ++ (reinterpret_cast<Botan::byte const *>((key.pub)().data()), ++ (key.pub)().size()); + L(FL("has_key: building %d-byte pub key") % pub_block.size()); + shared_ptr<X509_PublicKey> x509_key = + shared_ptr<X509_PublicKey>(Botan::X509::load_key(pub_block)); +============================================================ +--- src/transforms.cc cdfb6854ef4992faba21074145f3c8269b845b11 ++++ src/transforms.cc b99278ffe95c0081bf4986bc74d3699c37a52948 +@@ -53,15 +53,16 @@ using Botan::Hash_Filter; + // paradigm "must" be used. this program is intended for source code + // control and I make no bones about it. + +-NORETURN(static inline void error_in_transform(Botan::Exception & e)); ++NORETURN(static inline void error_in_transform(std::exception & e)); + + static inline void +-error_in_transform(Botan::Exception & e, origin::type caused_by) ++error_in_transform(std::exception & e, origin::type caused_by) + { + // these classes can all indicate data corruption + if (typeid(e) == typeid(Botan::Encoding_Error) + || typeid(e) == typeid(Botan::Decoding_Error) + || typeid(e) == typeid(Botan::Stream_IO_Error) ++ || typeid(e) == typeid(Botan::Invalid_Argument) + || typeid(e) == typeid(Botan::Integrity_Failure)) + { + // clean up the what() string a little: throw away the +@@ -107,7 +108,7 @@ error_in_transform(Botan::Exception & e, + pipe->process_msg(in); \ + out = pipe->read_all_as_string(Pipe::LAST_MESSAGE); \ + } \ +- catch (Botan::Exception & e) \ ++ catch (std::exception & e) \ + { \ + pipe.reset(new Pipe(new T(carg))); \ + error_in_transform(e, made_from); \ +@@ -173,7 +174,7 @@ template<> string xform<Botan::Hex_Decod + { + throw Botan::Decoding_Error(string("invalid hex character '") + (char)c + "'"); + } +- catch(Botan::Exception & e) ++ catch(std::exception & e) + { + error_in_transform(e, made_from); + } +@@ -219,7 +220,7 @@ void pack(T const & in, base64< gzip<T> + tmp = pipe->read_all_as_string(Pipe::LAST_MESSAGE); + out = base64< gzip<T> >(tmp, in.made_from); + } +- catch (Botan::Exception & e) ++ catch (std::exception & e) + { + pipe.reset(new Pipe(new Gzip_Compression, + new Base64_Encoder)); +@@ -237,7 +238,7 @@ void unpack(base64< gzip<T> > const & in + pipe->process_msg(in()); + out = T(pipe->read_all_as_string(Pipe::LAST_MESSAGE), in.made_from); + } +- catch (Botan::Exception & e) ++ catch (std::exception & e) + { + pipe.reset(new Pipe(new Base64_Decoder, + new Gzip_Decompression)); +@@ -264,7 +265,7 @@ calculate_ident(data const & dat, + p->process_msg(dat()); + ident = id(p->read_all_as_string(Pipe::LAST_MESSAGE), dat.made_from); + } +- catch (Botan::Exception & e) ++ catch (std::exception & e) + { + p.reset(new Pipe(new Hash_Filter("SHA-160"))); + error_in_transform(e, dat.made_from); diff --git a/dev-vcs/monotone/files/monotone-1.0-pcre3.patch b/dev-vcs/monotone/files/monotone-1.0-pcre3.patch new file mode 100644 index 000000000000..932538e38a4b --- /dev/null +++ b/dev-vcs/monotone/files/monotone-1.0-pcre3.patch @@ -0,0 +1,26 @@ +Author: Francis Russell +Bug-Debian: http://bugs.debian.org/665448 +Description: The test 'syntax_errors_in_.mtn-ignore' from the monotone + test suite contains a .mtn-ignore file which contains a number of + regular expressions. Some of these are intended to match and fail to + match the names of files created by the test harness. The rest have + invalid syntax and should be ignored. + . + One regex, '(?<=\C)' is presumably intended to be invalid, but with + the most recent version of pcre3 matches most files and therefore + causes the test to fail. In fact, it appears to be a valid regex that + performs a positive look behind to match a single data unit (usually a + byte, even in UTF mode). This patch removes the problematic regex until + the issue can be addressed upstream. +Index: monotone-1.0/test/func/syntax_errors_in_.mtn-ignore/mtn-ignore +=================================================================== +--- monotone-1.0.orig/test/func/syntax_errors_in_.mtn-ignore/mtn-ignore 2011-03-26 06:41:05.000000000 +0000 ++++ monotone-1.0/test/func/syntax_errors_in_.mtn-ignore/mtn-ignore 2012-03-25 20:02:37.695875219 +0100 +@@ -21,7 +21,6 @@ + [[:fnord:]] + \\x{123456} + (?(0)) +-(?<=\C) + \l + (?C256) + (?C1 diff --git a/dev-vcs/monotone/metadata.xml b/dev-vcs/monotone/metadata.xml index ffe46506ae02..968c07b67dee 100644 --- a/dev-vcs/monotone/metadata.xml +++ b/dev-vcs/monotone/metadata.xml @@ -7,6 +7,10 @@ <name>Jonny</name> <description>Future Maintainer</description> </maintainer> + <maintainer> + <email>pva@gentoo.org</email> + <name>Peter Volkov</name> + </maintainer> <longdescription> A free distributed version control system. It provides a simple, single-file transactional version store, with fully disconnected diff --git a/dev-vcs/monotone/monotone-1.0-r4.ebuild b/dev-vcs/monotone/monotone-1.0-r4.ebuild new file mode 100644 index 000000000000..56ec219f24ae --- /dev/null +++ b/dev-vcs/monotone/monotone-1.0-r4.ebuild @@ -0,0 +1,115 @@ +# Copyright 1999-2013 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/dev-vcs/monotone/monotone-1.0-r4.ebuild,v 1.1 2013/08/28 13:35:54 pva Exp $ + +# QA failiures reported in https://code.monotone.ca/p/monotone/issues/181/ +EAPI="4" +inherit bash-completion-r1 elisp-common eutils toolchain-funcs user + +DESCRIPTION="Monotone Distributed Version Control System" +HOMEPAGE="http://monotone.ca" +SRC_URI="http://monotone.ca/downloads/${PV}/${P}.tar.bz2" + +LICENSE="GPL-2" +SLOT="1" +KEYWORDS="~amd64 ~ia64 ~x86" +IUSE="doc ipv6 nls test" + +RDEPEND="sys-libs/zlib + >=dev-libs/libpcre-7.6 + >=dev-libs/botan-1.8.0 + >=dev-db/sqlite-3.3.8 + >=dev-lang/lua-5.1 + net-dns/libidn" +DEPEND="${RDEPEND} + >=dev-libs/boost-1.33.1 + nls? ( >=sys-devel/gettext-0.11.5 ) + doc? ( sys-apps/texinfo ) + test? ( dev-tcltk/expect + app-shells/bash-completion )" + +pkg_setup() { + enewgroup monotone + enewuser monotone -1 -1 /var/lib/monotone monotone +} + +src_prepare() { + if [[ $(gcc-major-version) -lt "3" || + ( $(gcc-major-version) -eq "3" && $(gcc-minor-version) -le 3 ) ]]; then + die 'requires >=gcc-3.4' + fi + epatch "${FILESDIR}/monotone-1.0-bash-completion-tests.patch" + epatch "${FILESDIR}/monotone-1.0-botan-1.10-v2.patch" + epatch "${FILESDIR}/monotone-1.0-glibc-2.14-file-handle.patch" + epatch "${FILESDIR}/monotone-1.0-boost-1.53.patch" + epatch "${FILESDIR}/monotone-1.0-pcre3.patch" +} + +src_configure() { + econf \ + $(use_enable nls) \ + $(use_enable ipv6) +} + +src_compile() { + emake + use doc && emake html +} + +src_test() { + # Disables netsync_bind_opt test + # https://code.monotone.ca/p/monotone/issues/179/ + export DISABLE_NETWORK_TESTS=true + if [[ ${UID} != 0 ]]; then + emake check + else + ewarn "Tests will fail if ran as root, skipping." + fi +} + +src_install() { + emake DESTDIR="${D}" install + + mv "${ED}"/usr/share/doc/${PN} "${ED}"/usr/share/doc/${PF} || die + + rm "${ED}"/etc/bash_completion.d/monotone.bash_completion || die + newbashcomp extra/shell/monotone.bash_completion ${PN} + + if use doc; then + dohtml -r doc/html/* + dohtml -r doc/figures + fi + + dodoc AUTHORS NEWS README* UPGRADE + docinto contrib + docompress -x /usr/share/doc/${PF}/contrib + dodoc -r contrib + newconfd "${FILESDIR}"/monotone.confd monotone + newinitd "${FILESDIR}"/${PN}-0.36.initd monotone + + insinto /etc/monotone + newins "${FILESDIR}"/hooks.lua hooks.lua + newins "${FILESDIR}"/read-permissions read-permissions + newins "${FILESDIR}"/write-permissions write-permissions + + keepdir /var/lib/monotone/keys/ /var/{log,run}/monotone + fowners monotone:monotone /var/lib/monotone{,/keys} /var/{log,run}/monotone +} + +pkg_postinst() { + elog + elog "For details and instructions to upgrade from previous versions," + elog "please read /usr/share/doc/${PF}/UPGRADE.bz2" + elog + elog " 1. edit /etc/conf.d/monotone" + elog " 2. import the first keys to enable access with" + elog " env HOME=\${homedir} mtn pubkey me@example.net | /etc/init.d/monotone import" + elog " Thereafter, those with write permission can add other keys via" + elog " netsync with 'monotone push --key-to-push=IDENT' and then IDENT" + elog " can be used in the read-permission and write-permission files." + elog " 3. adjust permisions in /etc/monotone/read-permissions" + elog " and /etc/monotone/write-permissions" + elog " 4. start the daemon: /etc/init.d/monotone start" + elog " 5. make persistent: rc-update add monotone default" + elog +} |