From 2d5d9c54ef41ce81ae48b29ad782288856e89845 Mon Sep 17 00:00:00 2001 From: Kaleb S. KEITHLEY Date: Sep 15 2021 15:01:51 +0000 Subject: rebuild from git+lookaside --- diff --git a/.leveldb.metadata b/.leveldb.metadata new file mode 100644 index 0000000..e859e4e --- /dev/null +++ b/.leveldb.metadata @@ -0,0 +1 @@ +042e267eae6ab522fe29274f79ad45cde3977655 SOURCES/leveldb-1.23.tar.gz diff --git a/SOURCES/0001-Allow-leveldbjni-build.patch b/SOURCES/0001-Allow-leveldbjni-build.patch new file mode 100644 index 0000000..e7b2f9a --- /dev/null +++ b/SOURCES/0001-Allow-leveldbjni-build.patch @@ -0,0 +1,17 @@ +From: Hiram Chirino +Date: Fri, 5 Jul 2013 18:32:28 +0400 +Subject: [PATCH] Allow leveldbjni build + + +diff --git a/include/leveldb/slice.h b/include/leveldb/slice.h +index 2df417d..1af5635 100644 +--- a/include/leveldb/slice.h ++++ b/include/leveldb/slice.h +@@ -86,7 +86,6 @@ class LEVELDB_EXPORT Slice { + return ((size_ >= x.size_) && (memcmp(data_, x.data_, x.size_) == 0)); + } + +- private: + const char* data_; + size_t size_; + }; diff --git a/SOURCES/0002-Added-a-DB-SuspendCompations-and-DB-ResumeCompaction.patch b/SOURCES/0002-Added-a-DB-SuspendCompations-and-DB-ResumeCompaction.patch new file mode 100644 index 0000000..8823708 --- /dev/null +++ b/SOURCES/0002-Added-a-DB-SuspendCompations-and-DB-ResumeCompaction.patch @@ -0,0 +1,118 @@ +From: Hiram Chirino +Date: Tue, 30 Oct 2012 16:56:52 -0400 +Subject: [PATCH] Added a DB:SuspendCompations() and DB:ResumeCompactions() + methods. Fixes issue #184 + +https://code.google.com/p/leveldb/issues/detail?id=184 + +diff --git a/db/db_impl.cc b/db/db_impl.cc +index 1a4e459..ae7b96d 100644 +--- a/db/db_impl.cc ++++ b/db/db_impl.cc +@@ -135,6 +135,9 @@ DBImpl::DBImpl(const Options& raw_options, const std::string& dbname) + table_cache_(new TableCache(dbname_, options_, TableCacheSize(options_))), + db_lock_(nullptr), + shutting_down_(false), ++ suspend_cv(&suspend_mutex), ++ suspend_count(0), ++ suspended(false), + background_work_finished_signal_(&mutex_), + mem_(nullptr), + imm_(nullptr), +@@ -1464,6 +1467,39 @@ void DBImpl::GetApproximateSizes(const Range* range, int n, uint64_t* sizes) { + v->Unref(); + } + ++void DBImpl::SuspendCompactions() { ++ MutexLock l(& suspend_mutex); ++ env_->Schedule(&SuspendWork, this); ++ suspend_count++; ++ while( !suspended ) { ++ suspend_cv.Wait(); ++ } ++} ++void DBImpl::SuspendWork(void* db) { ++ reinterpret_cast(db)->SuspendCallback(); ++} ++void DBImpl::SuspendCallback() { ++ MutexLock l(&suspend_mutex); ++ Log(options_.info_log, "Compactions suspended"); ++ suspended = true; ++ suspend_cv.SignalAll(); ++ while( suspend_count > 0 ) { ++ suspend_cv.Wait(); ++ } ++ suspended = false; ++ suspend_cv.SignalAll(); ++ Log(options_.info_log, "Compactions resumed"); ++} ++void DBImpl::ResumeCompactions() { ++ MutexLock l(&suspend_mutex); ++ suspend_count--; ++ suspend_cv.SignalAll(); ++ while( suspended ) { ++ suspend_cv.Wait(); ++ } ++} ++ ++ + // Default implementations of convenience methods that subclasses of DB + // can call if they wish + Status DB::Put(const WriteOptions& opt, const Slice& key, const Slice& value) { +diff --git a/db/db_impl.h b/db/db_impl.h +index c7b0172..d955c2a 100644 +--- a/db/db_impl.h ++++ b/db/db_impl.h +@@ -48,6 +48,8 @@ class DBImpl : public DB { + bool GetProperty(const Slice& property, std::string* value) override; + void GetApproximateSizes(const Range* range, int n, uint64_t* sizes) override; + void CompactRange(const Slice* begin, const Slice* end) override; ++ void SuspendCompactions() override; ++ void ResumeCompactions() override; + + // Extra methods (for testing) that are not in the public DB interface + +@@ -170,6 +172,13 @@ class DBImpl : public DB { + // Lock over the persistent DB state. Non-null iff successfully acquired. + FileLock* db_lock_; + ++ port::Mutex suspend_mutex; ++ port::CondVar suspend_cv; ++ int suspend_count; ++ bool suspended; ++ static void SuspendWork(void* db); ++ void SuspendCallback(); ++ + // State below is protected by mutex_ + port::Mutex mutex_; + std::atomic shutting_down_; +diff --git a/db/db_test.cc b/db/db_test.cc +index 908b41d..2e65370 100644 +--- a/db/db_test.cc ++++ b/db/db_test.cc +@@ -2051,6 +2051,8 @@ class ModelDB : public DB { + }; + + explicit ModelDB(const Options& options) : options_(options) {} ++ virtual void SuspendCompactions() override {} ++ virtual void ResumeCompactions() override {} + ~ModelDB() override = default; + Status Put(const WriteOptions& o, const Slice& k, const Slice& v) override { + return DB::Put(o, k, v); +diff --git a/include/leveldb/db.h b/include/leveldb/db.h +index a13d147..61c29c0 100644 +--- a/include/leveldb/db.h ++++ b/include/leveldb/db.h +@@ -145,6 +145,12 @@ class LEVELDB_EXPORT DB { + // Therefore the following call will compact the entire database: + // db->CompactRange(nullptr, nullptr); + virtual void CompactRange(const Slice* begin, const Slice* end) = 0; ++ ++ // Suspends the background compaction thread. This methods ++ // returns once suspended. ++ virtual void SuspendCompactions() = 0; ++ // Resumes a suspended background compation thread. ++ virtual void ResumeCompactions() = 0; + }; + + // Destroy the contents of the specified database. diff --git a/SOURCES/0003-allow-Get-calls-to-avoid-copies-into-std-string.patch b/SOURCES/0003-allow-Get-calls-to-avoid-copies-into-std-string.patch new file mode 100644 index 0000000..498f81e --- /dev/null +++ b/SOURCES/0003-allow-Get-calls-to-avoid-copies-into-std-string.patch @@ -0,0 +1,165 @@ +From: Steve Vinoski +Date: Thu, 20 Dec 2012 16:14:11 -0500 +Subject: [PATCH] allow Get() calls to avoid copies into std::string + +Add a new abstract base class leveldb::Value that applications can easily +derive from to supply their own memory management for values retrieved via +Get(). Add an internal class derived from Value that provides std::string +management to preserve backward compatibility. Overload DBImpl::Get() to +accept a Value*, and to preserve backward compatibility also keep the +original version taking a std::string*. + +diff --git a/db/db_impl.cc b/db/db_impl.cc +index ae7b96d..5c3a05c 100644 +--- a/db/db_impl.cc ++++ b/db/db_impl.cc +@@ -85,6 +85,22 @@ struct DBImpl::CompactionState { + uint64_t total_bytes; + }; + ++Value::~Value() {} ++ ++class StringValue : public Value { ++ public: ++ explicit StringValue(std::string& val) : value_(val) {} ++ ~StringValue() {} ++ ++ StringValue& assign(const char* data, size_t size) { ++ value_.assign(data, size); ++ return *this; ++ } ++ ++ private: ++ std::string& value_; ++}; ++ + // Fix user-supplied options to be reasonable + template + static void ClipToRange(T* ptr, V minvalue, V maxvalue) { +@@ -1117,6 +1133,13 @@ int64_t DBImpl::TEST_MaxNextLevelOverlappingBytes() { + + Status DBImpl::Get(const ReadOptions& options, const Slice& key, + std::string* value) { ++ StringValue stringvalue(*value); ++ return DBImpl::Get(options, key, &stringvalue); ++} ++ ++Status DBImpl::Get(const ReadOptions& options, ++ const Slice& key, ++ Value* value) { + Status s; + MutexLock l(&mutex_); + SequenceNumber snapshot; +diff --git a/db/db_impl.h b/db/db_impl.h +index d955c2a..3127110 100644 +--- a/db/db_impl.h ++++ b/db/db_impl.h +@@ -42,6 +42,9 @@ class DBImpl : public DB { + Status Write(const WriteOptions& options, WriteBatch* updates) override; + Status Get(const ReadOptions& options, const Slice& key, + std::string* value) override; ++ virtual Status Get(const ReadOptions& options, ++ const Slice& key, ++ Value* value); + Iterator* NewIterator(const ReadOptions&) override; + const Snapshot* GetSnapshot() override; + void ReleaseSnapshot(const Snapshot* snapshot) override; +diff --git a/db/db_test.cc b/db/db_test.cc +index 2e65370..db778d9 100644 +--- a/db/db_test.cc ++++ b/db/db_test.cc +@@ -2065,6 +2065,11 @@ class ModelDB : public DB { + assert(false); // Not implemented + return Status::NotFound(key); + } ++ Status Get(const ReadOptions& options, ++ const Slice& key, Value* value) override { ++ assert(false); // Not implemented ++ return Status::NotFound(key); ++ } + Iterator* NewIterator(const ReadOptions& options) override { + if (options.snapshot == nullptr) { + KVMap* saved = new KVMap; +diff --git a/db/memtable.cc b/db/memtable.cc +index f42774d..4689e2d 100644 +--- a/db/memtable.cc ++++ b/db/memtable.cc +@@ -98,7 +98,7 @@ void MemTable::Add(SequenceNumber s, ValueType type, const Slice& key, + table_.Insert(buf); + } + +-bool MemTable::Get(const LookupKey& key, std::string* value, Status* s) { ++bool MemTable::Get(const LookupKey& key, Value* value, Status* s) { + Slice memkey = key.memtable_key(); + Table::Iterator iter(&table_); + iter.Seek(memkey.data()); +diff --git a/db/memtable.h b/db/memtable.h +index 9d986b1..85c4cce 100644 +--- a/db/memtable.h ++++ b/db/memtable.h +@@ -60,7 +60,7 @@ class MemTable { + // If memtable contains a deletion for key, store a NotFound() error + // in *status and return true. + // Else, return false. +- bool Get(const LookupKey& key, std::string* value, Status* s); ++ bool Get(const LookupKey& key, Value* value, Status* s); + + private: + friend class MemTableIterator; +diff --git a/db/version_set.cc b/db/version_set.cc +index 1963353..c83a4d2 100644 +--- a/db/version_set.cc ++++ b/db/version_set.cc +@@ -256,7 +256,7 @@ struct Saver { + SaverState state; + const Comparator* ucmp; + Slice user_key; +- std::string* value; ++ Value* value; + }; + } // namespace + static void SaveValue(void* arg, const Slice& ikey, const Slice& v) { +@@ -322,7 +322,7 @@ void Version::ForEachOverlapping(Slice user_key, Slice internal_key, void* arg, + } + + Status Version::Get(const ReadOptions& options, const LookupKey& k, +- std::string* value, GetStats* stats) { ++ Value* value, GetStats* stats) { + stats->seek_file = nullptr; + stats->seek_file_level = -1; + +diff --git a/db/version_set.h b/db/version_set.h +index 69f3d70..0f0a463 100644 +--- a/db/version_set.h ++++ b/db/version_set.h +@@ -72,7 +72,7 @@ class Version { + // REQUIRES: This version has been saved (see VersionSet::SaveTo) + void AddIterators(const ReadOptions&, std::vector* iters); + +- Status Get(const ReadOptions&, const LookupKey& key, std::string* val, ++ Status Get(const ReadOptions&, const LookupKey& key, Value* val, + GetStats* stats); + + // Adds "stats" into the current state. Returns true if a new +diff --git a/include/leveldb/db.h b/include/leveldb/db.h +index 61c29c0..1a93feb 100644 +--- a/include/leveldb/db.h ++++ b/include/leveldb/db.h +@@ -40,6 +40,17 @@ struct LEVELDB_EXPORT Range { + Slice limit; // Not included in the range + }; + ++// Abstract holder for a DB value. ++// This allows callers to manage their own value buffers and have ++// DB values copied directly into those buffers. ++class Value { ++ public: ++ virtual Value& assign(const char* data, size_t size) = 0; ++ ++ protected: ++ virtual ~Value(); ++}; ++ + // A DB is a persistent ordered map from keys to values. + // A DB is safe for concurrent access from multiple threads without + // any external synchronization. diff --git a/SOURCES/0004-bloom_test-failure-on-big-endian-archs.patch b/SOURCES/0004-bloom_test-failure-on-big-endian-archs.patch new file mode 100644 index 0000000..cb679b6 --- /dev/null +++ b/SOURCES/0004-bloom_test-failure-on-big-endian-archs.patch @@ -0,0 +1,27 @@ +From: Yehuda Sadeh +Date: Mon, 2 Jul 2012 14:29:06 -0700 +Subject: [PATCH] bloom_test failure on big endian archs + +When running bloom_test on big endian machines it fails due to unacceptable +false positive rate. I've looked into the issue and it seems that the +reason for that is that it passes a different input than when it runs on +little endian. When transforming the input to be little endian it behaves +as expected. +This issue holds up inclusion of ceph to debian due to ceph's use of +leveldb. The fix can be to bump up the acceptable false positives. + +https://groups.google.com/d/topic/leveldb/SbVPvl4j4vU/discussion + +diff --git a/util/bloom_test.cc b/util/bloom_test.cc +index 520473e..e4053e6 100644 +--- a/util/bloom_test.cc ++++ b/util/bloom_test.cc +@@ -136,7 +136,7 @@ TEST_F(BloomTest, VaryingLengths) { + "False positives: %5.2f%% @ length = %6d ; bytes = %6d\n", + rate * 100.0, length, static_cast(FilterSize())); + } +- ASSERT_LE(rate, 0.02); // Must not be over 2% ++ ASSERT_LE(rate, 0.03); // Must not be over 3% + if (rate > 0.0125) + mediocre_filters++; // Allowed, but not too often + else diff --git a/SOURCES/0006-revert-no-rtti.patch b/SOURCES/0006-revert-no-rtti.patch new file mode 100644 index 0000000..d6937ff --- /dev/null +++ b/SOURCES/0006-revert-no-rtti.patch @@ -0,0 +1,15 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index f8285b8..7ab9fe1 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -70,10 +70,6 @@ else(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + # Disable C++ exceptions. + string(REGEX REPLACE "-fexceptions" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") +- +- # Disable RTTI. +- string(REGEX REPLACE "-frtti" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti") + endif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + + # Test whether -Wthread-safety is available. See diff --git a/SPECS/leveldb.spec b/SPECS/leveldb.spec new file mode 100644 index 0000000..2be803b --- /dev/null +++ b/SPECS/leveldb.spec @@ -0,0 +1,220 @@ +%undefine __cmake_in_source_build +Name: leveldb +Version: 1.23 +Release: 3%{?dist} +Summary: A fast and lightweight key/value database library by Google +License: BSD +URL: https://github.com/google/leveldb +Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz + +# available in https://github.com/fusesource/leveldbjni/blob/leveldb.patch +Patch0001: 0001-Allow-leveldbjni-build.patch +# https://github.com/fusesource/leveldbjni/issues/34 +# https://code.google.com/p/leveldb/issues/detail?id=184 +# Add DB::SuspendCompactions() and DB:: ResumeCompactions() methods +Patch0002: 0002-Added-a-DB-SuspendCompations-and-DB-ResumeCompaction.patch +# Cherry-picked from Basho's fork +Patch0003: 0003-allow-Get-calls-to-avoid-copies-into-std-string.patch +# https://groups.google.com/d/topic/leveldb/SbVPvl4j4vU/discussion +Patch0004: 0004-bloom_test-failure-on-big-endian-archs.patch +# -fno-rtti breaks ABI compatibility +Patch0006: 0006-revert-no-rtti.patch + +BuildRequires: cmake +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: make +BuildRequires: snappy-devel +BuildRequires: sqlite-devel + +%description +LevelDB is a fast key-value storage library written at Google that provides an +ordered mapping from string keys to string values. + +%package devel +Summary: Development files for %{name} +Requires: cmake-filesystem +Requires: %{name}%{?_isa} = %{?epoch:%{epoch}:}%{version}-%{release} + +%description devel +%{summary}. + +%prep +%autosetup -p1 + +cat > %{name}.pc << EOF +prefix=%{_prefix} +exec_prefix=${prefix} +libdir=%{_libdir} +includedir=%{_includedir} + +Name: %{name} +Description: %{summary} +Version: %{version} +Libs: -l%{name} +EOF + + +%build +%cmake -DLEVELDB_BUILD_TESTS:BOOL=OFF \ + -DLEVELDB_BUILD_BENCHMARKS:BOOL=OFF +%cmake_build + + +%install +%cmake_install + +mkdir -p %{buildroot}%{_libdir}/pkgconfig +cp -a %{name}.pc %{buildroot}%{_libdir}/pkgconfig/ + + +%check +%ctest + + +%ldconfig_scriptlets + + +%files +%license LICENSE +%doc AUTHORS README.md NEWS +%{_libdir}/lib%{name}.so.* + + +%files devel +%doc doc/ CONTRIBUTING.md TODO +%{_includedir}/%{name}/ +%{_libdir}/lib%{name}.so +%{_libdir}/pkgconfig/%{name}.pc +%{_libdir}/cmake/%{name}/ + + +%changelog +* Thu Aug 05 2021 Björn Esser - 1.23-3 +- Apply patch droppping -fno-rtti properly + +* Thu Aug 5 2021 Kefu Chai - 1.23-2 +- drop -fno-rtti in CMAKE_CXX_FLAGS + +* Fri Jul 30 2021 Kefu Chai - 1.23-1 +- Update to 1.23 + +* Thu Jul 22 2021 Fedora Release Engineering - 1.22-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Tue Jan 26 2021 Fedora Release Engineering - 1.22-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Tue Jul 28 2020 Fedora Release Engineering - 1.22-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Sun Mar 29 2020 Kefu Chai - 1.22-1 +- Update to 1.22 + +* Wed Jan 29 2020 Fedora Release Engineering - 1.21-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Thu Jul 25 2019 Fedora Release Engineering - 1.21-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Tue Apr 09 2019 Peter Lemenkov - 1.21-1 +- Update to 1.21 + +* Fri Feb 01 2019 Fedora Release Engineering - 1.20-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Fri Jul 13 2018 Fedora Release Engineering - 1.20-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed Feb 07 2018 Fedora Release Engineering - 1.20-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Mon Oct 23 2017 Stephen Gallagher - 1.20-1 +- Update to 1.20 +- Disable parallel make invocation to prevent build failures + +* Thu Aug 03 2017 Fedora Release Engineering - 1.18-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 1.18-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Mon May 15 2017 Fedora Release Engineering - 1.18-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_27_Mass_Rebuild + +* Fri Feb 10 2017 Fedora Release Engineering - 1.18-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Sun Aug 07 2016 Igor Gnatenko - 1.18-1 +- Update to 1.18 (RHBZ #1306611) +- Cleanups and fixes in spec + +* Thu Feb 04 2016 Fedora Release Engineering - 1.12.0-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Wed Jun 17 2015 Fedora Release Engineering - 1.12.0-10 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Thu May 14 2015 Tomas Hozza - 1.12.0-9 +- rebuild with newer gcc to resolve linking issues with Ceph + +* Sun Mar 1 2015 Mamoru TASAKA - 1.12.0-8 +- F-23: rebuild for gcc5 ABI change + +* Sun Aug 17 2014 Fedora Release Engineering - 1.12.0-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sat Jun 07 2014 Fedora Release Engineering - 1.12.0-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Sun Aug 25 2013 Peter Lemenkov - 1.12.0-5 +- Don't build with assertions + +* Sat Aug 03 2013 Fedora Release Engineering - 1.12.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Wed Jul 10 2013 Peter Lemenkov - 1.12.0-3 +- Backported Basho's patch (see rhbz#982980) + +* Mon Jul 01 2013 gil cattaneo 1.12.0-2 +- add SuspendCompactions and ResumeCompactions methods for allow leveldbjni build + +* Sat Jun 29 2013 gil cattaneo - 1.12.0-1 +- update to 1.12.0 + +* Wed Feb 27 2013 gil cattaneo - 1.9.0-1 +- update to 1.9.0 + +* Thu Feb 14 2013 Fedora Release Engineering - 1.7.0-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Thu Feb 07 2013 Karsten Hopp 1.7.0-5 +- temporarily ignore result of self checks on PPC* (rhbz #908800) + +* Thu Nov 29 2012 gil cattaneo - 1.7.0-4 +- Applied patch for allow leveldbjni build + +* Sat Oct 27 2012 Peter Lemenkov - 1.7.0-3 +- Dirty workarounds for failed tests on ARM + +* Sat Oct 27 2012 Peter Lemenkov - 1.7.0-2 +- Restored patch no.2 + +* Sat Oct 27 2012 Peter Lemenkov - 1.7.0-1 +- Ver. 1.7.0 (API/ABI compatible bugfix release) + +* Tue Aug 21 2012 Dan Horák - 1.5.0-4 +- add workaround for big endians eg. s390(x) + +* Thu Jul 19 2012 Fedora Release Engineering - 1.5.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Wed Jul 11 2012 Peter Lemenkov - 1.5.0-2 +- Cleaned up spec by removing EL5-related stuff +- Added notes about the patches + +* Fri Jun 15 2012 Peter Lemenkov - 1.5.0-1 +- Ver. 1.5.0 + +* Thu May 17 2012 Peter Lemenkov - 1.4.0-1 +- Initial package