aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2022-03-09 15:27:48 +0000
committerJohn Ericson <John.Ericson@Obsidian.Systems>2022-03-11 13:32:33 +0000
commita03b1fd7f60788304f358d5f4dc063c7c9e650a9 (patch)
treee5ec34a44b96ad4b384aca9343033292b26606fb /src
parent678d1c2aa0f499466c723d3461277dc197515f57 (diff)
Deduplicate the Store downcasting with a template
Diffstat (limited to 'src')
-rw-r--r--src/libstore/daemon.cc9
-rw-r--r--src/libstore/gc-store.cc13
-rw-r--r--src/libstore/gc-store.hh4
-rw-r--r--src/libstore/log-store.cc13
-rw-r--r--src/libstore/log-store.hh2
-rw-r--r--src/libstore/store-cast.hh16
-rw-r--r--src/nix-collect-garbage/nix-collect-garbage.cc3
-rw-r--r--src/nix-store/nix-store.cc9
-rw-r--r--src/nix/store-copy-log.cc5
-rw-r--r--src/nix/store-delete.cc3
-rw-r--r--src/nix/store-gc.cc3
11 files changed, 39 insertions, 41 deletions
diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc
index 1e24a1c79..9f21ecf36 100644
--- a/src/libstore/daemon.cc
+++ b/src/libstore/daemon.cc
@@ -3,6 +3,7 @@
#include "worker-protocol.hh"
#include "build-result.hh"
#include "store-api.hh"
+#include "store-cast.hh"
#include "gc-store.hh"
#include "log-store.hh"
#include "path-with-outputs.hh"
@@ -646,7 +647,7 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
Path path = absPath(readString(from));
logger->startWork();
- auto & gcStore = GcStore::require(*store);
+ auto & gcStore = require<GcStore>(*store);
gcStore.addIndirectRoot(path);
logger->stopWork();
@@ -664,7 +665,7 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
case wopFindRoots: {
logger->startWork();
- auto & gcStore = GcStore::require(*store);
+ auto & gcStore = require<GcStore>(*store);
Roots roots = gcStore.findRoots(!trusted);
logger->stopWork();
@@ -696,7 +697,7 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
logger->startWork();
if (options.ignoreLiveness)
throw Error("you are not allowed to ignore liveness");
- auto & gcStore = GcStore::require(*store);
+ auto & gcStore = require<GcStore>(*store);
gcStore.collectGarbage(options, results);
logger->stopWork();
@@ -954,7 +955,7 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
logger->startWork();
if (!trusted)
throw Error("you are not privileged to add logs");
- auto & logStore = LogStore::require(*store);
+ auto & logStore = require<LogStore>(*store);
{
FramedSource source(from);
StringSink sink;
diff --git a/src/libstore/gc-store.cc b/src/libstore/gc-store.cc
deleted file mode 100644
index dc2b82166..000000000
--- a/src/libstore/gc-store.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "gc-store.hh"
-
-namespace nix {
-
-GcStore & GcStore::require(Store & store)
-{
- auto * gcStore = dynamic_cast<GcStore *>(&store);
- if (!gcStore)
- throw UsageError("Garbage collection not supported by store '%s'", store.getUri());
- return *gcStore;
-}
-
-}
diff --git a/src/libstore/gc-store.hh b/src/libstore/gc-store.hh
index 462cc097b..b3cbbad74 100644
--- a/src/libstore/gc-store.hh
+++ b/src/libstore/gc-store.hh
@@ -61,6 +61,8 @@ struct GCResults
struct GcStore : public virtual Store
{
+ inline static std::string operationName = "Garbage collection";
+
/* Add an indirect root, which is merely a symlink to `path' from
/nix/var/nix/gcroots/auto/<hash of `path'>. `path' is supposed
to be a symlink to a store path. The garbage collector will
@@ -77,8 +79,6 @@ struct GcStore : public virtual Store
/* Perform a garbage collection. */
virtual void collectGarbage(const GCOptions & options, GCResults & results) = 0;
-
- static GcStore & require(Store & store);
};
}
diff --git a/src/libstore/log-store.cc b/src/libstore/log-store.cc
deleted file mode 100644
index 56aec91f2..000000000
--- a/src/libstore/log-store.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "log-store.hh"
-
-namespace nix {
-
-LogStore & LogStore::require(Store & store)
-{
- auto * gcStore = dynamic_cast<LogStore *>(&store);
- if (!gcStore)
- throw UsageError("Build log storage and retrieval not supported by store '%s'", store.getUri());
- return *gcStore;
-}
-
-}
diff --git a/src/libstore/log-store.hh b/src/libstore/log-store.hh
index ad17cbe6e..ff1b92e17 100644
--- a/src/libstore/log-store.hh
+++ b/src/libstore/log-store.hh
@@ -7,6 +7,8 @@ namespace nix {
struct LogStore : public virtual Store
{
+ inline static std::string operationName = "Build log storage and retrieval";
+
/* Return the build log of the specified store path, if available,
or null otherwise. */
virtual std::optional<std::string> getBuildLog(const StorePath & path) = 0;
diff --git a/src/libstore/store-cast.hh b/src/libstore/store-cast.hh
new file mode 100644
index 000000000..ff62fc359
--- /dev/null
+++ b/src/libstore/store-cast.hh
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "store-api.hh"
+
+namespace nix {
+
+template<typename T>
+T & require(Store & store)
+{
+ auto * castedStore = dynamic_cast<T *>(&store);
+ if (!castedStore)
+ throw UsageError("%s not supported by store '%s'", T::operationName, store.getUri());
+ return *castedStore;
+}
+
+}
diff --git a/src/nix-collect-garbage/nix-collect-garbage.cc b/src/nix-collect-garbage/nix-collect-garbage.cc
index b61f0e640..af6f1c88c 100644
--- a/src/nix-collect-garbage/nix-collect-garbage.cc
+++ b/src/nix-collect-garbage/nix-collect-garbage.cc
@@ -1,4 +1,5 @@
#include "store-api.hh"
+#include "store-cast.hh"
#include "gc-store.hh"
#include "profiles.hh"
#include "shared.hh"
@@ -81,7 +82,7 @@ static int main_nix_collect_garbage(int argc, char * * argv)
// Run the actual garbage collector.
if (!dryRun) {
auto store = openStore();
- auto & gcStore = GcStore::require(*store);
+ auto & gcStore = require<GcStore>(*store);
options.action = GCOptions::gcDeleteDead;
GCResults results;
PrintFreed freed(true, results);
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index b3f28bcc2..153b84137 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -3,6 +3,7 @@
#include "dotgraph.hh"
#include "globals.hh"
#include "build-result.hh"
+#include "store-cast.hh"
#include "gc-store.hh"
#include "log-store.hh"
#include "local-store.hh"
@@ -430,7 +431,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
store->computeFSClosure(
args, referrers, true, settings.gcKeepOutputs, settings.gcKeepDerivations);
- auto & gcStore = GcStore::require(*store);
+ auto & gcStore = require<GcStore>(*store);
Roots roots = gcStore.findRoots(false);
for (auto & [target, links] : roots)
if (referrers.find(target) != referrers.end())
@@ -475,7 +476,7 @@ static void opReadLog(Strings opFlags, Strings opArgs)
{
if (!opFlags.empty()) throw UsageError("unknown flag");
- auto & logStore = LogStore::require(*store);
+ auto & logStore = require<LogStore>(*store);
RunPager pager;
@@ -593,7 +594,7 @@ static void opGC(Strings opFlags, Strings opArgs)
if (!opArgs.empty()) throw UsageError("no arguments expected");
- auto & gcStore = GcStore::require(*store);
+ auto & gcStore = require<GcStore>(*store);
if (printRoots) {
Roots roots = gcStore.findRoots(false);
@@ -632,7 +633,7 @@ static void opDelete(Strings opFlags, Strings opArgs)
for (auto & i : opArgs)
options.pathsToDelete.insert(store->followLinksToStorePath(i));
- auto & gcStore = GcStore::require(*store);
+ auto & gcStore = require<GcStore>(*store);
GCResults results;
PrintFreed freed(true, results);
diff --git a/src/nix/store-copy-log.cc b/src/nix/store-copy-log.cc
index 22b3980c0..2e288f743 100644
--- a/src/nix/store-copy-log.cc
+++ b/src/nix/store-copy-log.cc
@@ -1,6 +1,7 @@
#include "command.hh"
#include "shared.hh"
#include "store-api.hh"
+#include "store-cast.hh"
#include "log-store.hh"
#include "sync.hh"
#include "thread-pool.hh"
@@ -27,10 +28,10 @@ struct CmdCopyLog : virtual CopyCommand, virtual InstallablesCommand
void run(ref<Store> srcStore) override
{
- auto & srcLogStore = LogStore::require(*srcStore);
+ auto & srcLogStore = require<LogStore>(*srcStore);
auto dstStore = getDstStore();
- auto & dstLogStore = LogStore::require(*dstStore);
+ auto & dstLogStore = require<LogStore>(*dstStore);
StorePathSet drvPaths;
diff --git a/src/nix/store-delete.cc b/src/nix/store-delete.cc
index 0de7efaba..ca43f1530 100644
--- a/src/nix/store-delete.cc
+++ b/src/nix/store-delete.cc
@@ -2,6 +2,7 @@
#include "common-args.hh"
#include "shared.hh"
#include "store-api.hh"
+#include "store-cast.hh"
#include "gc-store.hh"
using namespace nix;
@@ -33,7 +34,7 @@ struct CmdStoreDelete : StorePathsCommand
void run(ref<Store> store, std::vector<StorePath> && storePaths) override
{
- auto & gcStore = GcStore::require(*store);
+ auto & gcStore = require<GcStore>(*store);
for (auto & path : storePaths)
options.pathsToDelete.insert(path);
diff --git a/src/nix/store-gc.cc b/src/nix/store-gc.cc
index 515f4ffdb..8b9b5d164 100644
--- a/src/nix/store-gc.cc
+++ b/src/nix/store-gc.cc
@@ -2,6 +2,7 @@
#include "common-args.hh"
#include "shared.hh"
#include "store-api.hh"
+#include "store-cast.hh"
#include "gc-store.hh"
using namespace nix;
@@ -34,7 +35,7 @@ struct CmdStoreGC : StoreCommand, MixDryRun
void run(ref<Store> store) override
{
- auto & gcStore = GcStore::require(*store);
+ auto & gcStore = require<GcStore>(*store);
options.action = dryRun ? GCOptions::gcReturnDead : GCOptions::gcDeleteDead;
GCResults results;