commit 20eddbe2d8091e27c384d3e190f5877e58d4ec1f
parent 11c29449060e184ee392b12798e26b8ec5557ab3
Author: cfillion <cfillion@users.noreply.github.com>
Date: Fri, 8 Apr 2016 00:00:12 -0400
store original author information in the registry & refactoring
(instead of the display version of the author field)
Diffstat:
9 files changed, 139 insertions(+), 68 deletions(-)
diff --git a/src/browser.cpp b/src/browser.cpp
@@ -208,7 +208,7 @@ void Browser::onContextMenu(HWND target, const int x, const int y)
auto_char reinstallLabel[255] = {};
auto_snprintf(reinstallLabel, sizeof(reinstallLabel), AUTO_STR("&Reinstall v%s"),
- make_autostring(entry->regEntry.versionName).c_str());
+ make_autostring(entry->regEntry.version.name()).c_str());
const UINT actionIndex = menu.addAction(reinstallLabel, ACTION_REINSTALL);
if(!entry->current || entry->test(ObsoleteFlag))
@@ -353,11 +353,11 @@ auto Browser::makeEntry(const Package *pkg, const Registry::Entry ®Entry)
if(regEntry.id) {
flags |= InstalledFlag;
- if(regEntry.versionCode < latest->code())
+ if(regEntry.version < *latest)
flags |= OutOfDateFlag;
for(const Version *ver : pkg->versions()) {
- if(ver->code() == regEntry.versionCode) {
+ if(*ver == regEntry.version) {
current = ver;
break;
}
@@ -434,9 +434,9 @@ string Browser::getValue(const Column col, const Entry &entry) const
return pkg ? pkg->category()->name() : regEntry.category;
case VersionColumn:
if(entry.test(InstalledFlag))
- display = regEntry.versionName;
+ display = regEntry.version.name();
- if(ver && ver->code() != regEntry.versionCode) {
+ if(ver && *ver != regEntry.version) {
if(!display.empty())
display += '\x20';
@@ -445,7 +445,7 @@ string Browser::getValue(const Column col, const Entry &entry) const
return display;
case AuthorColumn:
- return ver ? ver->displayAuthor() : regEntry.author;
+ return ver ? ver->displayAuthor() : regEntry.version.displayAuthor();
case TypeColumn:
return pkg ? pkg->displayType() : Package::displayType(regEntry.type);
case RemoteColumn:
diff --git a/src/registry.cpp b/src/registry.cpp
@@ -136,7 +136,7 @@ auto Registry::push(const Version *ver, vector<Path> *conflicts) -> Entry
if(entryId) {
m_updateEntry->bind(1, pkg->type());
m_updateEntry->bind(2, ver->name());
- m_updateEntry->bind(3, ver->displayAuthor());
+ m_updateEntry->bind(3, ver->author());
m_updateEntry->bind(4, entryId);
m_updateEntry->exec();
}
@@ -146,7 +146,7 @@ auto Registry::push(const Version *ver, vector<Path> *conflicts) -> Entry
m_insertEntry->bind(3, pkg->name());
m_insertEntry->bind(4, pkg->type());
m_insertEntry->bind(5, ver->name());
- m_insertEntry->bind(6, ver->displayAuthor());
+ m_insertEntry->bind(6, ver->author());
m_insertEntry->exec();
entryId = m_db.lastInsertId();
@@ -184,8 +184,7 @@ auto Registry::push(const Version *ver, vector<Path> *conflicts) -> Entry
}
else {
release();
- return {entryId, ri->name(), cat->name(),
- pkg->name(), pkg->type(), ver->name(), ver->code(), ver->displayAuthor()};
+ return {entryId, ri->name(), cat->name(), pkg->name(), pkg->type(), *ver};
}
}
@@ -208,9 +207,11 @@ auto Registry::getEntry(const Package *pkg) const -> Entry
entry.category = m_findEntry->stringColumn(col++);
entry.package = m_findEntry->stringColumn(col++);
entry.type = static_cast<Package::Type>(m_findEntry->intColumn(col++));
- entry.versionName = m_findEntry->stringColumn(col++);
- Version::parse(entry.versionName, &entry.versionCode);
- entry.author = m_findEntry->stringColumn(col++);
+
+ try { entry.version = Version(m_findEntry->stringColumn(col++)); }
+ catch(const reapack_error &) {}
+
+ entry.version.setAuthor(m_findEntry->stringColumn(col++));
return false;
});
@@ -232,9 +233,11 @@ auto Registry::getEntries(const string &remoteName) const -> vector<Entry>
entry.category = m_allEntries->stringColumn(col++);
entry.package = m_allEntries->stringColumn(col++);
entry.type = static_cast<Package::Type>(m_allEntries->intColumn(col++));
- entry.versionName = m_allEntries->stringColumn(col++);
- Version::parse(entry.versionName, &entry.versionCode);
- entry.author = m_allEntries->stringColumn(col++);
+
+ try { entry.version = Version(m_allEntries->stringColumn(col++)); }
+ catch(const reapack_error &) {}
+
+ entry.version.setAuthor(m_allEntries->stringColumn(col++));
list.push_back(entry);
diff --git a/src/registry.hpp b/src/registry.hpp
@@ -38,9 +38,7 @@ public:
std::string category;
std::string package;
Package::Type type;
- std::string versionName;
- Version::Code versionCode;
- std::string author;
+ Version version;
};
Registry(const Path &path = Path());
diff --git a/src/report.cpp b/src/report.cpp
@@ -145,7 +145,7 @@ void Report::printUpdates()
stream() << pkg->fullName() << ':' << NL;
for(const Version *ver : versions | boost::adaptors::reversed) {
- if(ver->code() <= regEntry.versionCode)
+ if(*ver <= regEntry.version)
break;
printVersion(ver);
diff --git a/src/transaction.cpp b/src/transaction.cpp
@@ -93,14 +93,14 @@ void Transaction::synchronize(const Package *pkg, const bool autoInstall)
if(!regEntry.id && !autoInstall)
return;
- const Version *ver = pkg->lastVersion();
+ const Version *latest = pkg->lastVersion();
- if(regEntry.versionCode == ver->code()) {
- if(allFilesExists(ver->files()))
+ if(regEntry.version == *latest) {
+ if(allFilesExists(latest->files()))
return; // latest version is really installed, nothing to do here!
}
- install(ver, regEntry);
+ install(latest, regEntry);
}
void Transaction::fetchIndex(const Remote &remote, const IndexCallback &cb)
@@ -147,7 +147,7 @@ void Transaction::install(const Version *ver,
InstallTicket::Type type;
- if(regEntry.id && regEntry.versionCode < ver->code())
+ if(regEntry.id && regEntry.version < *ver)
type = InstallTicket::Upgrade;
else
type = InstallTicket::Install;
diff --git a/src/version.cpp b/src/version.cpp
@@ -26,18 +26,12 @@
using namespace std;
-bool Version::parse(const std::string &str, Code *out)
+Version::Version()
+ : m_code(0), m_time(), m_package(nullptr), m_mainSource(nullptr)
{
- try {
- *out = Version(str, nullptr).code();
- return true;
- }
- catch(const reapack_error &) {
- return false;
- }
}
-Version::Version(const std::string &str, Package *pkg)
+Version::Version(const std::string &str, const Package *pkg)
: m_name(str), m_code(0), m_time(), m_package(pkg), m_mainSource(nullptr)
{
static const regex pattern("(\\d+)");
@@ -64,6 +58,13 @@ Version::Version(const std::string &str, Package *pkg)
}
}
+Version::Version(const Version &o, const Package *pkg)
+ : m_name(o.name()), m_code(o.code()),
+ m_author(o.author()), m_changelog(o.changelog()), m_time(o.time()),
+ m_package(pkg), m_mainSource(nullptr)
+{
+}
+
Version::~Version()
{
for(const auto &pair : m_sources)
@@ -168,6 +169,21 @@ bool Version::operator<(const Version &o) const
return m_code < o.code();
}
+bool Version::operator<=(const Version &o) const
+{
+ return !(m_code > o.code());
+}
+
+bool Version::operator>(const Version &o) const
+{
+ return m_code > o.code();
+}
+
+bool Version::operator>=(const Version &o) const
+{
+ return !(m_code < o.code());
+}
+
bool Version::operator==(const Version &o) const
{
return m_code == o.code();
diff --git a/src/version.hpp b/src/version.hpp
@@ -31,9 +31,9 @@ class Version {
public:
typedef uint64_t Code;
- static bool parse(const std::string &in, Code *out);
-
- Version(const std::string &, Package * = nullptr);
+ Version();
+ Version(const std::string &, const Package * = nullptr);
+ Version(const Version &, const Package * = nullptr);
~Version();
const std::string &name() const { return m_name; }
@@ -60,20 +60,24 @@ public:
const std::set<Path> &files() const { return m_files; }
- bool operator<(const Version &) const;
bool operator==(const Version &) const;
bool operator!=(const Version &) const;
+ bool operator<(const Version &) const;
+ bool operator<=(const Version &) const;
+ bool operator>(const Version &) const;
+ bool operator>=(const Version &) const;
private:
std::string m_name;
Code m_code;
+
+ std::string m_author;
+ std::string m_changelog;
std::tm m_time;
const Package *m_package;
const Source *m_mainSource;
- std::string m_author;
- std::string m_changelog;
SourceMap m_sources;
std::set<Path> m_files;
};
diff --git a/test/registry.cpp b/test/registry.cpp
@@ -30,7 +30,7 @@ TEST_CASE("query uninstalled package", M) {
const Registry::Entry &res = reg.getEntry(&pkg);
REQUIRE(res.id == 0);
- REQUIRE(res.versionCode == 0);
+ REQUIRE(res.version == Version());
}
TEST_CASE("query installed package", M) {
@@ -44,9 +44,8 @@ TEST_CASE("query installed package", M) {
REQUIRE(entry.category == "Category Name");
REQUIRE(entry.package == "Hello");
REQUIRE(entry.type == Package::ScriptType);
- REQUIRE(entry.versionName == "1.0");
- REQUIRE(entry.versionCode == Version("1.0").code());
- REQUIRE(entry.author == "John Doe");
+ REQUIRE(entry.version.name() == "1.0");
+ REQUIRE(entry.version.author() == "John Doe");
const Registry::Entry &selectEntry = reg.getEntry(&pkg);
REQUIRE(selectEntry.id == entry.id);
@@ -54,9 +53,8 @@ TEST_CASE("query installed package", M) {
REQUIRE(selectEntry.category == entry.category);
REQUIRE(selectEntry.package == entry.package);
REQUIRE(selectEntry.type == entry.type);
- REQUIRE(selectEntry.versionName == entry.versionName);
- REQUIRE(selectEntry.versionCode == entry.versionCode);
- REQUIRE(selectEntry.author == entry.author);
+ REQUIRE(selectEntry.version == entry.version);
+ REQUIRE(selectEntry.version.author() == entry.version.author());
}
TEST_CASE("bump version", M) {
@@ -70,13 +68,13 @@ TEST_CASE("bump version", M) {
pkg.addVersion(ver2);
const Registry::Entry &entry1 = reg.getEntry(&pkg);
- REQUIRE(entry1.versionName == "1.0");
- CHECK(entry1.author == "John Doe");
+ REQUIRE(entry1.version.name() == "1.0");
+ CHECK(entry1.version.author() == "John Doe");
reg.push(ver2);
const Registry::Entry &entry2 = reg.getEntry(&pkg);
- REQUIRE(entry2.versionName == "2.0");
- CHECK(entry2.author == "Unknown");
+ REQUIRE(entry2.version.name() == "2.0");
+ CHECK(entry2.version.author() == "");
REQUIRE(entry2.id == entry1.id);
}
@@ -111,9 +109,8 @@ TEST_CASE("query all packages", M) {
REQUIRE(entries[0].category == "Category Name");
REQUIRE(entries[0].package == "Hello");
REQUIRE(entries[0].type == Package::ScriptType);
- REQUIRE(entries[0].versionName == "1.0");
- REQUIRE(entries[0].versionCode == Version("1.0").code());
- REQUIRE(entries[0].author == "John Doe");
+ REQUIRE(entries[0].version.name() == "1.0");
+ REQUIRE(entries[0].version.author() == "John Doe");
}
TEST_CASE("forget registry entry", M) {
diff --git a/test/version.cpp b/test/version.cpp
@@ -98,20 +98,6 @@ TEST_CASE("version with 5 components", M) {
}
}
-TEST_CASE("public version parser", M) {
- Version::Code code = 0;
-
- REQUIRE(Version::parse("1.0", &code));
- REQUIRE(code == UINT64_C(1000000000000));
-
- REQUIRE_FALSE(Version::parse("hello", &code));
- REQUIRE(code == UINT64_C(1000000000000));
-
- code = 0;
- REQUIRE_FALSE(Version::parse("hello", &code));
- REQUIRE(code == UINT64_C(0));
-}
-
TEST_CASE("version full name", M) {
SECTION("no package") {
Version ver("1.0");
@@ -241,6 +227,73 @@ TEST_CASE("version date", M) {
}
}
+TEST_CASE("construct null version", M) {
+ const Version ver;
+
+ REQUIRE(ver.code() == 0);
+ REQUIRE(ver.displayTime().empty());
+ REQUIRE(ver.package() == nullptr);
+ REQUIRE(ver.mainSource() == nullptr);
+}
+
+TEST_CASE("copy version constructor", M) {
+ const Package pkg(Package::UnknownType, "Hello");
+
+ Version original("1.1", &pkg);
+ original.setAuthor("John Doe");
+ original.setChangelog("Initial release");
+ original.setTime("2016-02-12T01:16:40Z");
+
+ const Version copy1(original);
+ REQUIRE(copy1.name() == "1.1");
+ REQUIRE(copy1.code() == original.code());
+ REQUIRE(copy1.author() == original.author());
+ REQUIRE(copy1.changelog() == original.changelog());
+ REQUIRE(copy1.displayTime() == original.displayTime());
+ REQUIRE(copy1.package() == nullptr);
+ REQUIRE(copy1.mainSource() == nullptr);
+ REQUIRE(copy1.sources().empty());
+
+ const Version copy2(original, &pkg);
+ REQUIRE(copy2.package() == &pkg);
+}
+
+TEST_CASE("version operators", M) {
+ SECTION("equality") {
+ REQUIRE(Version("1.0") == Version("1.0"));
+ REQUIRE_FALSE(Version("1.0") == Version("1.1"));
+ }
+
+ SECTION("inequality") {
+ REQUIRE_FALSE(Version("1.0") != Version("1.0"));
+ REQUIRE(Version("1.0") != Version("1.1"));
+ }
+
+ SECTION("less than") {
+ REQUIRE(Version("1.0") < Version("1.1"));
+ REQUIRE_FALSE(Version("1.0") < Version("1.0"));
+ REQUIRE_FALSE(Version("1.1") < Version("1.0"));
+ }
+
+ SECTION("less than or equal") {
+ REQUIRE(Version("1.0") <= Version("1.1"));
+ REQUIRE(Version("1.0") <= Version("1.0"));
+ REQUIRE_FALSE(Version("1.1") <= Version("1.0"));
+ }
+
+ SECTION("greater than") {
+ REQUIRE_FALSE(Version("1.0") > Version("1.1"));
+ REQUIRE_FALSE(Version("1.0") > Version("1.0"));
+ REQUIRE(Version("1.1") > Version("1.0"));
+ }
+
+ SECTION("greater than or equal") {
+ REQUIRE_FALSE(Version("1.0") >= Version("1.1"));
+ REQUIRE(Version("1.0") >= Version("1.0"));
+ REQUIRE(Version("1.1") >= Version("1.0"));
+ }
+}
+
#ifdef __APPLE__
TEST_CASE("drop windows sources on os x", M) {
MAKE_VERSION