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