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