commit 996e6dd72ede4a25c723c38a1849e5ef5f566176
parent 65f18732effc3eef62c8d1014d9a6d6febd839f9
Author: cfillion <cfillion@users.noreply.github.com>
Date: Sat, 26 Feb 2022 22:07:14 -0500
fix unsetting pin/bleeding edge mode when also installing or updating
Diffstat:
5 files changed, 42 insertions(+), 34 deletions(-)
diff --git a/src/browser.cpp b/src/browser.cpp
@@ -868,7 +868,7 @@ bool Browser::apply()
const Version *target = *entry->target;
if(target)
- tx->install(target, entry->flags.value_or(0));
+ tx->install(target, entry->flags.value_or(entry->regEntry.flags));
else
tx->uninstall(entry->regEntry);
diff --git a/src/install.cpp b/src/install.cpp
@@ -40,7 +40,7 @@ bool InstallTask::start()
// prevent file conflicts (don't worry, the registry push is reverted)
try {
std::vector<Path> conflicts;
- tx()->registry()->push(m_version, &conflicts);
+ tx()->registry()->push(m_version, m_flags, &conflicts);
if(!conflicts.empty()) {
for(const Path &path : conflicts) {
@@ -121,11 +121,7 @@ void InstallTask::commit()
tx()->receipt()->addInstall(m_version, m_oldEntry);
- const Registry::Entry newEntry = tx()->registry()->push(m_version);
-
- if(m_flags)
- tx()->registry()->setFlags(newEntry, m_flags);
-
+ const Registry::Entry &newEntry = tx()->registry()->push(m_version, m_flags);
tx()->registerAll(true, newEntry);
}
diff --git a/src/registry.cpp b/src/registry.cpp
@@ -34,13 +34,13 @@ Registry::Registry(const Path &path)
// entry queries
m_insertEntry = m_db.prepare(
- "INSERT INTO entries(remote, category, package, desc, type, version, author)"
- "VALUES(?, ?, ?, ?, ?, ?, ?);"
+ "INSERT INTO entries(remote, category, package, desc, type, version, author, flags)"
+ "VALUES(?, ?, ?, ?, ?, ?, ?, ?);"
);
m_updateEntry = m_db.prepare(
"UPDATE entries "
- "SET desc = ?, type = ?, version = ?, author = ? WHERE id = ?"
+ "SET desc = ?, type = ?, version = ?, author = ?, flags = ? WHERE id = ?"
);
m_setFlags = m_db.prepare("UPDATE entries SET flags = ? WHERE id = ?");
@@ -146,7 +146,8 @@ void Registry::migrate()
}
}
-auto Registry::push(const Version *ver, std::vector<Path> *conflicts) -> Entry
+auto Registry::push(const Version *ver, const int flags,
+ std::vector<Path> *conflicts) -> Entry
{
m_db.savepoint();
@@ -165,21 +166,25 @@ auto Registry::push(const Version *ver, std::vector<Path> *conflicts) -> Entry
// register or update package and version
if(entryId) {
- m_updateEntry->bind(1, pkg->description());
- m_updateEntry->bind(2, pkg->type());
- m_updateEntry->bind(3, ver->name().toString());
- m_updateEntry->bind(4, ver->author());
- m_updateEntry->bind(5, entryId);
+ int col = 1;
+ m_updateEntry->bind(col++, pkg->description());
+ m_updateEntry->bind(col++, pkg->type());
+ m_updateEntry->bind(col++, ver->name().toString());
+ m_updateEntry->bind(col++, ver->author());
+ m_updateEntry->bind(col++, flags);
+ m_updateEntry->bind(col++, entryId);
m_updateEntry->exec();
}
else {
- m_insertEntry->bind(1, ri->name());
- m_insertEntry->bind(2, cat->name());
- m_insertEntry->bind(3, pkg->name());
- m_insertEntry->bind(4, pkg->description());
- m_insertEntry->bind(5, pkg->type());
- m_insertEntry->bind(6, ver->name().toString());
- m_insertEntry->bind(7, ver->author());
+ int col = 1;
+ m_insertEntry->bind(col++, ri->name());
+ m_insertEntry->bind(col++, cat->name());
+ m_insertEntry->bind(col++, pkg->name());
+ m_insertEntry->bind(col++, pkg->description());
+ m_insertEntry->bind(col++, pkg->type());
+ m_insertEntry->bind(col++, ver->name().toString());
+ m_insertEntry->bind(col++, ver->author());
+ m_insertEntry->bind(col++, flags);
m_insertEntry->exec();
entryId = m_db.lastInsertId();
@@ -189,10 +194,11 @@ auto Registry::push(const Version *ver, std::vector<Path> *conflicts) -> Entry
for(const Source *src : ver->sources()) {
const Path &path = src->targetPath();
- m_insertFile->bind(1, entryId);
- m_insertFile->bind(2, path.join(false));
- m_insertFile->bind(3, src->sections());
- m_insertFile->bind(4, src->typeOverride());
+ int col = 1;
+ m_insertFile->bind(col++, entryId);
+ m_insertFile->bind(col++, path.join(false));
+ m_insertFile->bind(col++, src->sections());
+ m_insertFile->bind(col++, src->typeOverride());
try {
m_insertFile->exec();
@@ -215,8 +221,10 @@ auto Registry::push(const Version *ver, std::vector<Path> *conflicts) -> Entry
}
else {
m_db.release();
- return {entryId, ri->name(), cat->name(),
- pkg->name(), pkg->description(), pkg->type(), ver->name(), ver->author()};
+ return {
+ entryId, ri->name(), cat->name(), pkg->name(), pkg->description(),
+ pkg->type(), ver->name(), ver->author(), flags
+ };
}
}
diff --git a/src/registry.hpp b/src/registry.hpp
@@ -66,7 +66,7 @@ public:
std::vector<Entry> getEntries(const std::string &) const;
std::vector<File> getFiles(const Entry &) const;
std::vector<File> getMainFiles(const Entry &) const;
- Entry push(const Version *, std::vector<Path> *conflicts = nullptr);
+ Entry push(const Version *, int flags = 0, std::vector<Path> *conflicts = nullptr);
void setFlags(const Entry &, int flags);
void forget(const Entry &);
diff --git a/test/registry.cpp b/test/registry.cpp
@@ -35,7 +35,7 @@ TEST_CASE("query installed package", M) {
Registry reg;
- const Registry::Entry &entry = reg.push(&ver);
+ const Registry::Entry &entry = reg.push(&ver, 2);
REQUIRE(entry);
REQUIRE(entry.id == 1);
REQUIRE(entry.remote == "Remote Name");
@@ -44,6 +44,7 @@ TEST_CASE("query installed package", M) {
REQUIRE(entry.type == Package::ScriptType);
REQUIRE(entry.version.toString() == "1.0");
REQUIRE(entry.author == "John Doe");
+ REQUIRE(entry.flags == 2);
const Registry::Entry &selectEntry = reg.getEntry(&pkg);
REQUIRE(selectEntry.id == entry.id);
@@ -54,6 +55,7 @@ TEST_CASE("query installed package", M) {
REQUIRE(selectEntry.type == entry.type);
REQUIRE(selectEntry.version == entry.version);
REQUIRE(selectEntry.author == entry.author);
+ REQUIRE(selectEntry.flags == entry.flags);
}
TEST_CASE("bump version", M) {
@@ -63,16 +65,18 @@ TEST_CASE("bump version", M) {
ver2.addSource(new Source("file", "url", &ver2));
Registry reg;
- reg.push(&ver);
+ reg.push(&ver, 1);
const Registry::Entry &entry1 = reg.getEntry(&pkg);
REQUIRE(entry1.version.toString() == "1.0");
CHECK(entry1.author == "John Doe");
+ CHECK(entry1.flags == 1);
- reg.push(&ver2);
+ reg.push(&ver2, 2);
const Registry::Entry &entry2 = reg.getEntry(&pkg);
REQUIRE(entry2.version.toString() == "2.0");
CHECK(entry2.author == "");
+ REQUIRE(entry2.flags == 2);
REQUIRE(entry2.id == entry1.id);
}
@@ -151,7 +155,7 @@ TEST_CASE("file conflicts", M) {
CHECK(reg.getEntry(&pkg).id == 0); // still uninstalled
std::vector<Path> conflicts;
- const auto &pushResult = reg.push(&ver, &conflicts);
+ const auto &pushResult = reg.push(&ver, 0, &conflicts);
CHECK(pushResult.id == 0);
REQUIRE(conflicts.size() == 1);