reapack

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

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:
Msrc/browser.cpp | 12++++++------
Msrc/registry.cpp | 23+++++++++++++----------
Msrc/registry.hpp | 4+---
Msrc/report.cpp | 2+-
Msrc/transaction.cpp | 10+++++-----
Msrc/version.cpp | 34+++++++++++++++++++++++++---------
Msrc/version.hpp | 16++++++++++------
Mtest/registry.cpp | 25+++++++++++--------------
Mtest/version.cpp | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
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 &regEntry) 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