reapack

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

commit 4136fb84d1f5054014bdcb9b5594b938dfa29142
parent ad0678937197686e384664a765f53e5708b7a85d
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Mon,  7 Dec 2015 16:31:07 -0500

display every changelogs from the currently installed versions to the latest

Diffstat:
Msrc/registry.cpp | 23+++++++++++++++++++----
Msrc/registry.hpp | 7++++++-
Msrc/report.cpp | 26++++++++++++++++++--------
Msrc/resource.rc | 6+++---
Msrc/transaction.cpp | 14+++++++-------
Msrc/transaction.hpp | 11+++++------
Mtest/registry.cpp | 31+++++++++++++++++++++++++++----
7 files changed, 85 insertions(+), 33 deletions(-)

diff --git a/src/registry.cpp b/src/registry.cpp @@ -1,5 +1,6 @@ #include "registry.hpp" +#include "errors.hpp" #include "package.hpp" #include "path.hpp" @@ -20,13 +21,27 @@ void Registry::push(const std::string &key, const std::string &value) m_map[key] = value; } -Registry::Status Registry::query(Package *pkg) const +Registry::QueryResult Registry::query(Package *pkg) const { const string key = pkg->targetPath().join(); - const auto it = m_map.find(key); + if(it == m_map.end()) - return Uninstalled; + return {Uninstalled, 0}; + + Version *lastVer = pkg->lastVersion(); + const Status status = it->second == lastVer->name() + ? UpToDate : UpdateAvailable; + + size_t versionCode = 0; + + try { + if(status == UpdateAvailable) + versionCode = Version(it->second).code(); + else + versionCode = lastVer->code(); + } + catch(const reapack_error &) {} - return it->second == pkg->lastVersion()->name() ? UpToDate : UpdateAvailable; + return {status, versionCode}; } diff --git a/src/registry.hpp b/src/registry.hpp @@ -16,11 +16,16 @@ public: Uninstalled, }; + struct QueryResult { + Status status; + size_t versionCode; + }; + void push(Package *pkg); void push(const std::string &key, const std::string &value); size_t size() const { return m_map.size(); } - Status query(Package *pkg) const; + QueryResult query(Package *pkg) const; Map::const_iterator begin() const { return m_map.begin(); } Map::const_iterator end() const { return m_map.end(); } diff --git a/src/report.cpp b/src/report.cpp @@ -58,20 +58,30 @@ void Report::formatNewPackages(ostringstream &text) { text << NL << SEP << " New packages: " << SEP << NL; - for(Package *pkg : m_transaction->newPackages()) - text << NL << "- " << pkg->lastVersion()->fullName() << NL; + for(const Transaction::PackageEntry &entry : m_transaction->newPackages()) + text << NL << "- " << entry.first->lastVersion()->fullName() << NL; } void Report::formatUpdates(ostringstream &text) { text << NL << SEP << " Updates: " << SEP << NL; - for(Package *pkg : m_transaction->updates()) { - Version *ver = pkg->lastVersion(); - text << NL << "- " << ver->fullName() << NL; - - if(!ver->changelog().empty()) - text << ver->changelog() << NL; + for(const Transaction::PackageEntry &entry : m_transaction->updates()) { + Package *pkg = entry.first; + const Registry::QueryResult &regEntry = entry.second; + const VersionSet &versions = pkg->versions(); + + for(auto it = versions.rbegin(); it != versions.rend(); it++) { + Version *ver = *it; + + if(ver->code() <= regEntry.versionCode) + break; + + text << NL << "- " << ver->fullName() << NL; + + if(!ver->changelog().empty()) + text << ver->changelog() << NL; + } } } diff --git a/src/resource.rc b/src/resource.rc @@ -13,13 +13,13 @@ BEGIN PUSHBUTTON "Cancel", IDCANCEL, 105, 60, 50, 14, NOT WS_TABSTOP END -IDD_REPORT_DIALOG DIALOGEX 0, 0, 240, 260 +IDD_REPORT_DIALOG DIALOGEX 0, 0, 240, 240 STYLE DS_MODALFRAME | DS_SHELLFONT | WS_POPUP | WS_SYSMENU | WS_CAPTION CAPTION "ReaPack" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Synchronization complete!", IDC_LABEL, 5, 5, 230, 10 - EDITTEXT IDC_REPORT, 6, 18, 228, 215, WS_VSCROLL | ES_MULTILINE | + EDITTEXT IDC_REPORT, 6, 18, 228, 195, WS_VSCROLL | ES_MULTILINE | ES_READONLY | NOT WS_TABSTOP - DEFPUSHBUTTON "OK", IDOK, 95, 240, 50, 14 + DEFPUSHBUTTON "OK", IDOK, 95, 220, 50, 14 END diff --git a/src/transaction.cpp b/src/transaction.cpp @@ -72,13 +72,13 @@ void Transaction::prepare() for(Database *db : m_databases) { for(Package *pkg : db->packages()) { - Registry::Status status = m_registry->query(pkg); + Registry::QueryResult entry = m_registry->query(pkg); bool exists = file_exists(installPath(pkg).join().c_str()); - if(status == Registry::UpToDate && exists) + if(entry.status == Registry::UpToDate && exists) continue; - m_packages.push_back({pkg, status}); + m_packages.push_back({pkg, entry}); } } @@ -111,7 +111,7 @@ void Transaction::install(const PackageEntry &pkgEntry) Version *ver = pkg->lastVersion(); const Path path = installPath(pkg); - const Registry::Status status = pkgEntry.second; + const Registry::QueryResult regEntry = pkgEntry.second; Download *dl = new Download(ver->fullName(), ver->source(0)->url()); dl->onFinish([=] { @@ -131,10 +131,10 @@ void Transaction::install(const PackageEntry &pkgEntry) file << dl->contents(); file.close(); - if(status == Registry::UpdateAvailable) - m_updates.push_back(pkg); + if(regEntry.status == Registry::UpdateAvailable) + m_updates.push_back(pkgEntry); else - m_new.push_back(pkg); + m_new.push_back(pkgEntry); m_registry->push(pkg); }); diff --git a/src/transaction.hpp b/src/transaction.hpp @@ -16,7 +16,7 @@ public: typedef boost::signals2::signal<void ()> Signal; typedef Signal::slot_type Callback; - typedef std::pair<Package *, Registry::Status> PackageEntry; + typedef std::pair<Package *, const Registry::QueryResult> PackageEntry; typedef std::vector<PackageEntry> PackageEntryList; Transaction(Registry *reg, const Path &root); @@ -34,8 +34,8 @@ public: DownloadQueue *downloadQueue() { return &m_queue; } const PackageEntryList &packages() const { return m_packages; } - const PackageList &newPackages() const { return m_new; } - const PackageList &updates() const { return m_updates; } + const PackageEntryList &newPackages() const { return m_new; } + const PackageEntryList &updates() const { return m_updates; } const ErrorList &errors() const { return m_errors; } private: @@ -54,11 +54,10 @@ private: DatabaseList m_databases; DownloadQueue m_queue; PackageEntryList m_packages; - PackageList m_new; - PackageList m_updates; + PackageEntryList m_new; + PackageEntryList m_updates; ErrorList m_errors; - Signal m_onReady; Signal m_onFinish; }; diff --git a/test/registry.cpp b/test/registry.cpp @@ -24,7 +24,10 @@ TEST_CASE("query uninstalled package", M) { MAKE_PACKAGE Registry reg; - REQUIRE(reg.query(&pkg) == Registry::Uninstalled); + + const Registry::QueryResult res = reg.query(&pkg); + REQUIRE(res.status == Registry::Uninstalled); + REQUIRE(res.versionCode == 0); } TEST_CASE("query up to date pacakge", M) { @@ -32,7 +35,10 @@ TEST_CASE("query up to date pacakge", M) { Registry reg; reg.push(&pkg); - REQUIRE(reg.query(&pkg) == Registry::UpToDate); + + const Registry::QueryResult res = reg.query(&pkg); + REQUIRE(res.status == Registry::UpToDate); + REQUIRE(res.versionCode == Version("1.0").code()); } TEST_CASE("bump version", M) { @@ -44,7 +50,24 @@ TEST_CASE("bump version", M) { Registry reg; reg.push(&pkg); pkg.addVersion(ver2); - REQUIRE(reg.query(&pkg) == Registry::UpdateAvailable); + + const Registry::QueryResult res1 = reg.query(&pkg); + REQUIRE(res1.status == Registry::UpdateAvailable); + REQUIRE(res1.versionCode == Version("1.0").code()); + reg.push(&pkg); - REQUIRE(reg.query(&pkg) == Registry::UpToDate); + const Registry::QueryResult res2 = reg.query(&pkg); + REQUIRE(res2.status == Registry::UpToDate); + REQUIRE(res2.versionCode == Version("2.0").code()); +} + +TEST_CASE("query invalid registry", M) { + MAKE_PACKAGE + + Registry reg; + reg.push(pkg.targetPath().join(), "bb"); + + // no exception should be thrown + const Registry::QueryResult res = reg.query(&pkg); + REQUIRE(res.versionCode == 0); }