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:
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 ®Entry)
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);