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