reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit 9c6e336562f64267a8c3fb5ad8492d4504c9117a
parent 892163e44aa57a8ae6cee0a45a887f36816a9a80
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Tue, 12 Jul 2016 22:47:28 -0400

fix a memory leak occuring when loading equivalent versions

Diffstat:
Msrc/errors.hpp | 2++
Msrc/package.cpp | 7+++++--
Mtest/package.cpp | 18++++++++++++++++++
3 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/src/errors.hpp b/src/errors.hpp @@ -18,11 +18,13 @@ #ifndef REAPACK_ERRORS_HPP #define REAPACK_ERRORS_HPP +#include <boost/format.hpp> #include <stdexcept> class reapack_error : public std::runtime_error { public: reapack_error(const char *what) : std::runtime_error(what) {} + reapack_error(const boost::format &f) : std::runtime_error(f.str()) {} }; #endif diff --git a/src/package.cpp b/src/package.cpp @@ -23,6 +23,7 @@ #include <algorithm> #include <boost/range/adaptor/reversed.hpp> +using boost::format; using namespace std; Package::Type Package::getType(const char *type) @@ -81,11 +82,13 @@ bool Package::addVersion(const Version *ver) { if(ver->package() != this) throw reapack_error("version belongs to another package"); - - if(ver->sources().empty()) + else if(ver->sources().empty()) return false; + else if(m_versions.count(ver)) + throw reapack_error(format("duplicate version '%1%'") % ver->fullName()); m_versions.insert(ver); + return true; } diff --git a/test/package.cpp b/test/package.cpp @@ -175,6 +175,24 @@ TEST_CASE("add owned version", M) { } } +TEST_CASE("add duplicate version", M) { + Index ri("r"); + Category cat("c", &ri); + Package pack(Package::ScriptType, "p", &cat); + + Version *ver = new Version("1", &pack); + ver->addSource(new Source({}, "google.com", ver)); + pack.addVersion(ver); + + try { + pack.addVersion(ver); // could also be an equivalent version with same value + FAIL(); + } + catch(const reapack_error &e) { + REQUIRE(string(e.what()) == "duplicate version 'r/c/p v1'"); + } +} + TEST_CASE("find matching version", M) { Index ri("Remote Name"); Category cat("Category Name", &ri);