reapack

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

commit ec01accb317cf9ece158ee19d4901c9f5972fc44
parent ce83d97fcca065862aa559c5024374379754acfd
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Wed, 20 Apr 2016 20:07:24 -0400

don't automatically update packages from stable to a prerelease

Diffstat:
Msrc/browser.cpp | 10+++++++---
Msrc/package.cpp | 12+++++++-----
Msrc/package.hpp | 2+-
Msrc/transaction.cpp | 4++--
Msrc/version.cpp | 6+++---
Msrc/version.hpp | 4++--
Mtest/index_v1.cpp | 4++--
Mtest/package.cpp | 24++++++++++++++++++++++++
Mtest/version.cpp | 21++++++++++-----------
9 files changed, 58 insertions(+), 29 deletions(-)

diff --git a/src/browser.cpp b/src/browser.cpp @@ -463,7 +463,7 @@ void Browser::transferActions() auto Browser::makeEntry(const Package *pkg, const Registry::Entry &regEntry) -> Entry { - const Version *latest = pkg->lastVersion(); + const Version *latest = pkg->lastVersion(!regEntry.version.isStable()); const Version *current = nullptr; int flags = 0; @@ -471,13 +471,17 @@ auto Browser::makeEntry(const Package *pkg, const Registry::Entry &regEntry) if(regEntry) { flags |= InstalledFlag; - if(regEntry.version < *latest) + if(latest && regEntry.version < *latest) flags |= OutOfDateFlag; current = pkg->findVersion(regEntry.version); } - else + else { + if(!latest) // show prerelases if no stable version is available + latest = pkg->lastVersion(true); + flags |= UninstalledFlag; + } return {flags, regEntry, pkg, latest, current}; } diff --git a/src/package.cpp b/src/package.cpp @@ -21,7 +21,7 @@ #include "index.hpp" #include <algorithm> -#include <sstream> +#include <boost/range/adaptor/reversed.hpp> using namespace std; @@ -99,12 +99,14 @@ const Version *Package::version(const size_t index) const return *it; } -const Version *Package::lastVersion() const +const Version *Package::lastVersion(const bool prerelease) const { - if(m_versions.empty()) - return nullptr; + for(const Version *ver : m_versions | boost::adaptors::reversed) { + if(ver->isStable() || prerelease) + return ver; + } - return *m_versions.rbegin(); + return nullptr; } const Version *Package::findVersion(const Version &ver) const diff --git a/src/package.hpp b/src/package.hpp @@ -51,7 +51,7 @@ public: void addVersion(const Version *ver); const VersionSet &versions() const { return m_versions; } const Version *version(size_t index) const; - const Version *lastVersion() const; + const Version *lastVersion(bool prerelease = true) const; const Version *findVersion(const Version &) const; private: diff --git a/src/transaction.cpp b/src/transaction.cpp @@ -93,9 +93,9 @@ void Transaction::synchronize(const Package *pkg, const bool autoInstall) if(!regEntry && !autoInstall) return; - const Version *latest = pkg->lastVersion(); + const Version *latest = pkg->lastVersion(!regEntry.version.isStable()); - if(regEntry.version == *latest) { + if(latest && regEntry.version == *latest) { if(allFilesExists(latest->files())) return; // latest version is really installed, nothing to do here! } diff --git a/src/version.cpp b/src/version.cpp @@ -28,7 +28,7 @@ using namespace std; Version::Version() - : m_prerelease(false), m_time(), m_package(nullptr), m_mainSource(nullptr) + : m_stable(false), m_time(), m_package(nullptr), m_mainSource(nullptr) { } @@ -39,7 +39,7 @@ Version::Version(const string &str, const Package *pkg) } Version::Version(const Version &o, const Package *pkg) - : m_name(o.m_name), m_segments(o.m_segments), m_prerelease(o.m_prerelease), + : m_name(o.m_name), m_segments(o.m_segments), m_stable(o.m_stable), m_author(o.m_author), m_changelog(o.m_changelog), m_time(o.m_time), m_package(pkg), m_mainSource(nullptr) { @@ -85,7 +85,7 @@ void Version::parse(const string &str) m_name = str; swap(m_segments, segments); - m_prerelease = alpha > 0; + m_stable = alpha < 1; } bool Version::tryParse(const string &str) diff --git a/src/version.hpp b/src/version.hpp @@ -46,7 +46,7 @@ public: const std::string &name() const { return m_name; } std::string fullName() const; size_t size() const { return m_segments.size(); } - bool isPrerelease() const { return m_prerelease; } + bool isStable() const { return m_stable; } const Package *package() const { return m_package; } @@ -84,7 +84,7 @@ private: std::string m_name; std::vector<Segment> m_segments; - bool m_prerelease; + bool m_stable; std::string m_author; std::string m_changelog; diff --git a/test/index_v1.cpp b/test/index_v1.cpp @@ -74,7 +74,7 @@ TEST_CASE("read version author", M) { IndexPtr ri = Index::load("author"); CHECK(ri->packages().size() == 1); - REQUIRE(ri->category(0)->package(0)->lastVersion()->author() + REQUIRE(ri->category(0)->package(0)->version(0)->author() == "Watanabe Saki"); } @@ -84,7 +84,7 @@ TEST_CASE("read version time", M) { IndexPtr ri = Index::load("time"); CHECK(ri->packages().size() == 1); - const tm &time = ri->category(0)->package(0)->lastVersion()->time(); + const tm &time = ri->category(0)->package(0)->version(0)->time(); REQUIRE(time.tm_year == 2016 - 1900); REQUIRE(time.tm_mon == 2 - 1); REQUIRE(time.tm_mday == 12); diff --git a/test/package.cpp b/test/package.cpp @@ -94,6 +94,30 @@ TEST_CASE("package versions are sorted", M) { REQUIRE(pack.lastVersion() == final); } +TEST_CASE("get latest stable version", M) { + Index ri("Remote Name"); + Category cat("Category Name", &ri); + Package pack(Package::ScriptType, "a", &cat); + + Version *alpha = new Version("2.0-alpha", &pack); + alpha->addSource(new Source({}, "google.com", alpha)); + pack.addVersion(alpha); + + SECTION("only prereleases are available") + REQUIRE(pack.lastVersion(false) == nullptr); + + SECTION("an older stable release is available") { + Version *final = new Version("1.0", &pack); + final->addSource(new Source({}, "google.com", final)); + pack.addVersion(final); + + REQUIRE(pack.lastVersion(false) == final); + } + + REQUIRE(pack.lastVersion() == alpha); + REQUIRE(pack.lastVersion(true) == alpha); +} + TEST_CASE("drop empty version", M) { Package pack(Package::ScriptType, "a"); pack.addVersion(new Version("1", &pack)); diff --git a/test/version.cpp b/test/version.cpp @@ -29,7 +29,7 @@ TEST_CASE("construct null version", M) { const Version ver; REQUIRE(ver.size() == 0); - REQUIRE_FALSE(ver.isPrerelease()); + REQUIRE_FALSE(ver.isStable()); REQUIRE(ver.displayTime().empty()); REQUIRE(ver.package() == nullptr); REQUIRE(ver.mainSource() == nullptr); @@ -45,11 +45,10 @@ TEST_CASE("parse version", M) { } SECTION("prerelease set/unset") { - REQUIRE_FALSE(ver.isPrerelease()); ver.parse("1.0beta"); - REQUIRE(ver.isPrerelease()); + REQUIRE_FALSE(ver.isStable()); ver.parse("1.0"); - REQUIRE_FALSE(ver.isPrerelease()); + REQUIRE(ver.isStable()); } SECTION("invalid") { @@ -164,10 +163,10 @@ TEST_CASE("compare versions with more or less segments", M) { TEST_CASE("prerelease versions", M) { SECTION("detect") { - REQUIRE_FALSE(Version("1.0").isPrerelease()); - REQUIRE(Version("1.0b").isPrerelease()); - REQUIRE(Version("1.0-beta").isPrerelease()); - REQUIRE(Version("1.0-beta1").isPrerelease()); + REQUIRE(Version("1.0").isStable()); + REQUIRE_FALSE(Version("1.0b").isStable()); + REQUIRE_FALSE(Version("1.0-beta").isStable()); + REQUIRE_FALSE(Version("1.0-beta1").isStable()); } SECTION("compare") { @@ -314,15 +313,15 @@ TEST_CASE("version date", M) { TEST_CASE("copy version constructor", M) { const Package pkg(Package::UnknownType, "Hello"); - Version original("1.1b", &pkg); + Version original("1.1test", &pkg); original.setAuthor("John Doe"); original.setChangelog("Initial release"); original.setTime("2016-02-12T01:16:40Z"); const Version copy1(original); - REQUIRE(copy1.name() == "1.1b"); + REQUIRE(copy1.name() == "1.1test"); REQUIRE(copy1.size() == original.size()); - REQUIRE(copy1.isPrerelease() == original.isPrerelease()); + REQUIRE(copy1.isStable() == original.isStable()); REQUIRE(copy1.author() == original.author()); REQUIRE(copy1.changelog() == original.changelog()); REQUIRE(copy1.displayTime() == original.displayTime());