reapack

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

commit b52fe339de78c2ef71c133a758ca5fa6098d62be
parent ec01accb317cf9ece158ee19d4901c9f5972fc44
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Wed, 20 Apr 2016 21:03:34 -0400

implement bleeding edge mode

Diffstat:
Msrc/browser.cpp | 6++++--
Msrc/browser.hpp | 2+-
Msrc/config.cpp | 11++++++++---
Msrc/config.hpp | 16++++++++++------
Msrc/manager.cpp | 21++++++++++++++++-----
Msrc/manager.hpp | 1+
Msrc/reapack.cpp | 9++++++---
Msrc/transaction.cpp | 12+++++++-----
Msrc/transaction.hpp | 5+++--
9 files changed, 56 insertions(+), 27 deletions(-)

diff --git a/src/browser.cpp b/src/browser.cpp @@ -461,9 +461,11 @@ void Browser::transferActions() } auto Browser::makeEntry(const Package *pkg, const Registry::Entry &regEntry) - -> Entry + const -> Entry { - const Version *latest = pkg->lastVersion(!regEntry.version.isStable()); + const auto &instOpts = *m_reapack->config()->install(); + const bool includePre = instOpts.bleedingEdge || !regEntry.version.isStable(); + const Version *latest = pkg->lastVersion(includePre); const Version *current = nullptr; int flags = 0; diff --git a/src/browser.hpp b/src/browser.hpp @@ -89,7 +89,7 @@ private: Uninstalled, }; - static Entry makeEntry(const Package *, const Registry::Entry &); + Entry makeEntry(const Package *, const Registry::Entry &) const; void populate(); void transferActions(); diff --git a/src/config.cpp b/src/config.cpp @@ -33,6 +33,7 @@ static const char *VERSION_KEY = "version"; static const char *INSTALL_GRP = "install"; static const char *AUTOINSTALL_KEY = "autoinstall"; +static const char *PRERELEASES_KEY = "prereleases"; static const char *BROWSER_GRP = "browser"; static const char *TYPEFILTER_KEY = "typefilter"; @@ -50,7 +51,7 @@ static string ArrayKey(const string &key, const unsigned int i) static const int BUFFER_SIZE = 2083; Config::Config() - : m_isFirstRun(false), m_version(0), m_autoInstall(false), m_browser(), + : m_isFirstRun(false), m_version(0), m_install(), m_browser(), m_remotesIniSize(0) { } @@ -90,7 +91,10 @@ void Config::read(const Path &path) { m_path = path.join(); - m_autoInstall = getUInt(INSTALL_GRP, AUTOINSTALL_KEY) > 0; + m_install = { + getUInt(INSTALL_GRP, AUTOINSTALL_KEY) > 0, + getUInt(INSTALL_GRP, PRERELEASES_KEY) > 0, + }; m_browser = { getUInt(BROWSER_GRP, TYPEFILTER_KEY), @@ -105,7 +109,8 @@ void Config::write() { setUInt(GENERAL_GRP, VERSION_KEY, m_version); - setUInt(INSTALL_GRP, AUTOINSTALL_KEY, m_autoInstall); + setUInt(INSTALL_GRP, AUTOINSTALL_KEY, m_install.autoInstall); + setUInt(INSTALL_GRP, PRERELEASES_KEY, m_install.bleedingEdge); setUInt(BROWSER_GRP, TYPEFILTER_KEY, m_browser.typeFilter); diff --git a/src/config.hpp b/src/config.hpp @@ -24,7 +24,12 @@ class Path; -struct BrowserConfig { +struct InstallOpts { + bool autoInstall; + bool bleedingEdge; +}; + +struct BrowserOpts { unsigned int typeFilter; }; @@ -36,10 +41,9 @@ public: void write(); bool isFirstRun() const { return m_isFirstRun; } - bool autoInstall() const { return m_autoInstall; } - void setAutoInstall(const bool enable) { m_autoInstall = enable; } RemoteList *remotes() { return &m_remotes; } - BrowserConfig *browser() { return &m_browser; } + InstallOpts *install() { return &m_install; } + BrowserOpts *browser() { return &m_browser; } private: std::string getString(const char *, const std::string &) const; @@ -55,8 +59,8 @@ private: std::string m_path; bool m_isFirstRun; unsigned int m_version; - bool m_autoInstall; - BrowserConfig m_browser; + InstallOpts m_install; + BrowserOpts m_browser; void readRemotes(); void restoreSelfRemote(); diff --git a/src/manager.cpp b/src/manager.cpp @@ -30,7 +30,7 @@ using namespace std; enum { ACTION_ENABLE = 80, ACTION_DISABLE, ACTION_UNINSTALL, ACTION_ABOUT, - ACTION_AUTOINSTALL, ACTION_SELECT, ACTION_UNSELECT }; + ACTION_AUTOINSTALL, ACTION_BLEEDINGEDGE, ACTION_SELECT, ACTION_UNSELECT }; Manager::Manager(ReaPack *reapack) : Dialog(IDD_CONFIG_DIALOG), @@ -77,7 +77,11 @@ void Manager::onCommand(const int id, int) uninstall(); break; case ACTION_AUTOINSTALL: - m_autoInstall = !m_autoInstall.value_or(m_config->autoInstall()); + m_autoInstall = !m_autoInstall.value_or(m_config->install()->autoInstall); + enable(m_apply); + break; + case ACTION_BLEEDINGEDGE: + m_bleedingEdge = !m_bleedingEdge.value_or(m_config->install()->bleedingEdge); enable(m_apply); break; case ACTION_SELECT: @@ -247,10 +251,14 @@ void Manager::options() Menu menu; - const UINT index = menu.addAction( + UINT index = menu.addAction( AUTO_STR("&Install new packages automatically"), ACTION_AUTOINSTALL); + if(m_autoInstall.value_or(m_config->install()->autoInstall)) + menu.check(index); - if(m_autoInstall.value_or(m_config->autoInstall())) + index = menu.addAction( + AUTO_STR("Enable &pre-releases (bleeding edge mode)"), ACTION_BLEEDINGEDGE); + if(m_bleedingEdge.value_or(m_config->install()->bleedingEdge)) menu.check(index); menu.show(rect.left, rect.bottom - 1, handle()); @@ -278,7 +286,10 @@ bool Manager::confirm() const void Manager::apply() { if(m_autoInstall) - m_config->setAutoInstall(m_autoInstall.value()); + m_config->install()->autoInstall = m_autoInstall.value(); + + if(m_bleedingEdge) + m_config->install()->bleedingEdge = m_bleedingEdge.value(); for(const auto &pair : m_enableOverrides) { const Remote &remote = pair.first; diff --git a/src/manager.hpp b/src/manager.hpp @@ -63,6 +63,7 @@ private: std::map<Remote, bool> m_enableOverrides; std::set<Remote> m_uninstall; boost::optional<bool> m_autoInstall; + boost::optional<bool> m_bleedingEdge; }; #endif diff --git a/src/reapack.cpp b/src/reapack.cpp @@ -147,7 +147,7 @@ void ReaPack::synchronizeAll() return; for(const Remote &remote : remotes) - t->synchronize(remote, m_config->autoInstall()); + t->synchronize(remote, *m_config->install()); t->runTasks(); } @@ -332,8 +332,11 @@ void ReaPack::about(const Remote &remote, HWND parent) if(ret == About::InstallResult) { enable(remote); - if(m_transaction) // transaction is created by enable() - m_transaction->synchronize(remote, true); + if(m_transaction) { // transaction is created by enable() + InstallOpts opts = *m_config->install(); + opts.autoInstall = true; + m_transaction->synchronize(remote, opts); + } runTasks(); } diff --git a/src/transaction.cpp b/src/transaction.cpp @@ -17,6 +17,7 @@ #include "transaction.hpp" +#include "config.hpp" #include "encoding.hpp" #include "errors.hpp" #include "filesystem.hpp" @@ -64,7 +65,7 @@ Transaction::~Transaction() delete m_registry; } -void Transaction::synchronize(const Remote &remote, const bool autoInstall) +void Transaction::synchronize(const Remote &remote, const InstallOpts &opts) { // show the report dialog or "nothing to do" even if no task are ran m_receipt.setEnabled(true); @@ -82,18 +83,19 @@ void Transaction::synchronize(const Remote &remote, const bool autoInstall) } for(const Package *pkg : ri->packages()) - synchronize(pkg, autoInstall); + synchronize(pkg, opts); }); } -void Transaction::synchronize(const Package *pkg, const bool autoInstall) +void Transaction::synchronize(const Package *pkg, const InstallOpts &opts) { const auto &regEntry = m_registry->getEntry(pkg); - if(!regEntry && !autoInstall) + if(!regEntry && !opts.autoInstall) return; - const Version *latest = pkg->lastVersion(!regEntry.version.isStable()); + const bool includePre = opts.bleedingEdge || !regEntry.version.isStable(); + const Version *latest = pkg->lastVersion(includePre); if(latest && regEntry.version == *latest) { if(allFilesExists(latest->files())) diff --git a/src/transaction.hpp b/src/transaction.hpp @@ -32,6 +32,7 @@ class Index; class Path; class Remote; class Task; +struct InstallOpts; typedef std::shared_ptr<const Index> IndexPtr; @@ -56,7 +57,7 @@ public: void onFinish(const VoidSignal::slot_type &slot) { m_onFinish.connect(slot); } void setCleanupHandler(const CleanupHandler &cb) { m_cleanupHandler = cb; } - void synchronize(const Remote &, bool autoInstall); + void synchronize(const Remote &, const InstallOpts &); void install(const Version *); void uninstall(const Remote &); void uninstall(const Registry::Entry &); @@ -78,7 +79,7 @@ private: void fetchIndex(const Remote &, const IndexCallback &cb); void saveIndex(Download *, const std::string &remoteName); - void synchronize(const Package *, bool autoInstall); + void synchronize(const Package *, const InstallOpts &); void install(const Version *, const Registry::Entry &); void installTicket(const InstallTicket &); void addTask(Task *);