reapack

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

commit 53e1da615a2bddcbbc8dbf857cc682821ad58c5f
parent 0db329b89d49a5c85ef8c40025b9f79b84eba198
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Fri,  6 May 2016 17:37:03 -0400

ignore newer pre-releases when updating from a pre-release and a newer stable exists

Diffstat:
Msrc/browser.cpp | 4+---
Msrc/package.cpp | 11++++++++---
Msrc/package.hpp | 2+-
Msrc/transaction.cpp | 6+++---
Msrc/version.cpp | 2+-
Mtest/package.cpp | 38++++++++++++++++++++++++++++++++++++++
Mtest/version.cpp | 2+-
7 files changed, 53 insertions(+), 12 deletions(-)

diff --git a/src/browser.cpp b/src/browser.cpp @@ -515,9 +515,7 @@ auto Browser::makeEntry(const Package *pkg, const Registry::Entry &regEntry) const -> Entry { const auto &instOpts = *m_reapack->config()->install(); - const bool includePre = instOpts.bleedingEdge || - (regEntry && !regEntry.version.isStable()); - const Version *latest = pkg->lastVersion(includePre); + const Version *latest = pkg->lastVersion(instOpts.bleedingEdge, regEntry.version); const Version *current = nullptr; int flags = 0; diff --git a/src/package.cpp b/src/package.cpp @@ -99,14 +99,19 @@ const Version *Package::version(const size_t index) const return *it; } -const Version *Package::lastVersion(const bool prerelease) const +const Version *Package::lastVersion(const bool pres, const Version &from) const { + if(m_versions.empty()) + return nullptr; + for(const Version *ver : m_versions | boost::adaptors::reversed) { - if(ver->isStable() || prerelease) + if(*ver < from) + break; + else if(ver->isStable() || pres) return ver; } - return nullptr; + return from.isStable() ? nullptr : *m_versions.rbegin(); } 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(bool prerelease = true) const; + const Version *lastVersion(bool pres = true, const Version &from = {}) const; const Version *findVersion(const Version &) const; private: diff --git a/src/transaction.cpp b/src/transaction.cpp @@ -95,10 +95,10 @@ void Transaction::synchronize(const Package *pkg, const InstallOpts &opts) if(!regEntry && !opts.autoInstall) return; - const bool includePre = opts.bleedingEdge || - (regEntry && !regEntry.version.isStable()); - const Version *latest = pkg->lastVersion(includePre); + const Version *latest = pkg->lastVersion(opts.bleedingEdge, regEntry.version); + // don't crash nor install a pre-release if autoInstall is on, + // bleedingEdge is off and there is no stable release if(!latest) return; diff --git a/src/version.cpp b/src/version.cpp @@ -28,7 +28,7 @@ using namespace std; Version::Version() - : m_stable(false), m_time(), m_package(nullptr), m_mainSource(nullptr) + : m_stable(true), m_time(), m_package(nullptr), m_mainSource(nullptr) { } diff --git a/test/package.cpp b/test/package.cpp @@ -118,6 +118,44 @@ TEST_CASE("get latest stable version", M) { REQUIRE(pack.lastVersion(true) == alpha); } +TEST_CASE("pre-release updates", M) { + Index ri("Remote Name"); + Category cat("Category Name", &ri); + Package pack(Package::ScriptType, "a", &cat); + + Version *stable1 = new Version("0.9", &pack); + stable1->addSource(new Source({}, "google.com", stable1)); + pack.addVersion(stable1); + + Version *alpha1 = new Version("1.0-alpha1", &pack); + alpha1->addSource(new Source({}, "google.com", alpha1)); + pack.addVersion(alpha1); + + Version *alpha2 = new Version("1.0-alpha2", &pack); + alpha2->addSource(new Source({}, "google.com", alpha2)); + pack.addVersion(alpha2); + + SECTION("pre-release to next pre-release") + REQUIRE(*pack.lastVersion(false, {"1.0-alpha1"}) == *alpha2); + + SECTION("pre-release to latest stable") { + Version *stable2 = new Version("1.0", &pack); + stable2->addSource(new Source({}, "google.com", stable2)); + pack.addVersion(stable2); + + Version *stable3 = new Version("1.1", &pack); + stable3->addSource(new Source({}, "google.com", stable3)); + pack.addVersion(stable3); + + Version *beta = new Version("2.0-beta", &pack); + beta->addSource(new Source({}, "google.com", beta)); + pack.addVersion(beta); + + REQUIRE(*pack.lastVersion(false, {"1.0-alpha1"}) == *stable3); + } +} + + 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 @@ -22,7 +22,7 @@ TEST_CASE("construct null version", M) { const Version ver; REQUIRE(ver.size() == 0); - REQUIRE_FALSE(ver.isStable()); + REQUIRE(ver.isStable()); REQUIRE(ver.displayTime().empty()); REQUIRE(ver.package() == nullptr); REQUIRE(ver.mainSource() == nullptr);