mirror of
https://github.com/NixOS/nix
synced 2025-06-29 10:31:15 +02:00
Eliminate the "store" global variable
Also, move a few free-standing functions into StoreAPI and Derivation. Also, introduce a non-nullable smart pointer, ref<T>, which is just a wrapper around std::shared_ptr ensuring that the pointer is never null. (For reference-counted values, this is better than passing a "T&", because the latter doesn't maintain the refcount. Usually, the caller will have a shared_ptr keeping the value alive, but that's not always the case, e.g., when passing a reference to a std::thread via std::bind.)
This commit is contained in:
parent
4f7824c58e
commit
c10c61449f
36 changed files with 511 additions and 458 deletions
|
@ -94,7 +94,7 @@ void printClosure(const Path & nePath, const StoreExpr & fs)
|
|||
#endif
|
||||
|
||||
|
||||
void printDotGraph(const PathSet & roots)
|
||||
void printDotGraph(StoreAPI & store, const PathSet & roots)
|
||||
{
|
||||
PathSet workList(roots);
|
||||
PathSet doneSet;
|
||||
|
@ -111,7 +111,7 @@ void printDotGraph(const PathSet & roots)
|
|||
cout << makeNode(path, symbolicName(path), "#ff0000");
|
||||
|
||||
PathSet references;
|
||||
store->queryReferences(path, references);
|
||||
store.queryReferences(path, references);
|
||||
|
||||
for (PathSet::iterator i = references.begin();
|
||||
i != references.end(); ++i)
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
namespace nix {
|
||||
|
||||
void printDotGraph(const PathSet & roots);
|
||||
class StoreAPI;
|
||||
|
||||
void printDotGraph(StoreAPI & store, const PathSet & roots);
|
||||
|
||||
}
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
#include "globals.hh"
|
||||
#include "misc.hh"
|
||||
#include "archive.hh"
|
||||
#include "shared.hh"
|
||||
#include "derivations.hh"
|
||||
#include "dotgraph.hh"
|
||||
#include "xmlgraph.hh"
|
||||
#include "globals.hh"
|
||||
#include "local-store.hh"
|
||||
#include "util.hh"
|
||||
#include "serve-protocol.hh"
|
||||
#include "worker-protocol.hh"
|
||||
#include "monitor-fd.hh"
|
||||
#include "serve-protocol.hh"
|
||||
#include "shared.hh"
|
||||
#include "util.hh"
|
||||
#include "worker-protocol.hh"
|
||||
#include "xmlgraph.hh"
|
||||
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
@ -37,6 +37,7 @@ static Path gcRoot;
|
|||
static int rootNr = 0;
|
||||
static bool indirectRoot = false;
|
||||
static bool noOutput = false;
|
||||
static std::shared_ptr<StoreAPI> store;
|
||||
|
||||
|
||||
LocalStore & ensureLocalStore()
|
||||
|
@ -65,7 +66,7 @@ static PathSet realisePath(Path path, bool build = true)
|
|||
|
||||
if (isDerivation(p.first)) {
|
||||
if (build) store->buildPaths(singleton<PathSet>(path));
|
||||
Derivation drv = derivationFromPath(*store, p.first);
|
||||
Derivation drv = store->derivationFromPath(p.first);
|
||||
rootNr++;
|
||||
|
||||
if (p.second.empty())
|
||||
|
@ -83,7 +84,7 @@ static PathSet realisePath(Path path, bool build = true)
|
|||
Path rootName = gcRoot;
|
||||
if (rootNr > 1) rootName += "-" + std::to_string(rootNr);
|
||||
if (i->first != "out") rootName += "-" + i->first;
|
||||
outPath = addPermRoot(*store, outPath, rootName, indirectRoot);
|
||||
outPath = addPermRoot(ref<StoreAPI>(store), outPath, rootName, indirectRoot);
|
||||
}
|
||||
outputs.insert(outPath);
|
||||
}
|
||||
|
@ -99,7 +100,7 @@ static PathSet realisePath(Path path, bool build = true)
|
|||
Path rootName = gcRoot;
|
||||
rootNr++;
|
||||
if (rootNr > 1) rootName += "-" + std::to_string(rootNr);
|
||||
path = addPermRoot(*store, path, rootName, indirectRoot);
|
||||
path = addPermRoot(ref<StoreAPI>(store), path, rootName, indirectRoot);
|
||||
}
|
||||
return singleton<PathSet>(path);
|
||||
}
|
||||
|
@ -129,7 +130,7 @@ static void opRealise(Strings opFlags, Strings opArgs)
|
|||
|
||||
unsigned long long downloadSize, narSize;
|
||||
PathSet willBuild, willSubstitute, unknown;
|
||||
queryMissing(*store, PathSet(paths.begin(), paths.end()),
|
||||
store->queryMissing(PathSet(paths.begin(), paths.end()),
|
||||
willBuild, willSubstitute, unknown, downloadSize, narSize);
|
||||
|
||||
if (ignoreUnknown) {
|
||||
|
@ -141,7 +142,7 @@ static void opRealise(Strings opFlags, Strings opArgs)
|
|||
}
|
||||
|
||||
if (settings.get("print-missing", true))
|
||||
printMissing(*store, willBuild, willSubstitute, unknown, downloadSize, narSize);
|
||||
printMissing(ref<StoreAPI>(store), willBuild, willSubstitute, unknown, downloadSize, narSize);
|
||||
|
||||
if (dryRun) return;
|
||||
|
||||
|
@ -216,7 +217,7 @@ static PathSet maybeUseOutputs(const Path & storePath, bool useOutput, bool forc
|
|||
{
|
||||
if (forceRealise) realisePath(storePath);
|
||||
if (useOutput && isDerivation(storePath)) {
|
||||
Derivation drv = derivationFromPath(*store, storePath);
|
||||
Derivation drv = store->derivationFromPath(storePath);
|
||||
PathSet outputs;
|
||||
for (auto & i : drv.outputs)
|
||||
outputs.insert(i.second.path);
|
||||
|
@ -253,7 +254,7 @@ static void printTree(const Path & path,
|
|||
closure(B). That is, if derivation A is an (possibly indirect)
|
||||
input of B, then A is printed first. This has the effect of
|
||||
flattening the tree, preventing deeply nested structures. */
|
||||
Paths sorted = topoSortPaths(*store, references);
|
||||
Paths sorted = store->topoSortPaths(references);
|
||||
reverse(sorted.begin(), sorted.end());
|
||||
|
||||
for (auto i = sorted.begin(); i != sorted.end(); ++i) {
|
||||
|
@ -318,7 +319,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
|||
for (auto & i : opArgs) {
|
||||
i = followLinksToStorePath(i);
|
||||
if (forceRealise) realisePath(i);
|
||||
Derivation drv = derivationFromPath(*store, i);
|
||||
Derivation drv = store->derivationFromPath(i);
|
||||
for (auto & j : drv.outputs)
|
||||
cout << format("%1%\n") % j.second.path;
|
||||
}
|
||||
|
@ -333,13 +334,13 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
|||
for (auto & i : opArgs) {
|
||||
PathSet ps = maybeUseOutputs(followLinksToStorePath(i), useOutput, forceRealise);
|
||||
for (auto & j : ps) {
|
||||
if (query == qRequisites) computeFSClosure(*store, j, paths, false, includeOutputs);
|
||||
if (query == qRequisites) store->computeFSClosure(j, paths, false, includeOutputs);
|
||||
else if (query == qReferences) store->queryReferences(j, paths);
|
||||
else if (query == qReferrers) store->queryReferrers(j, paths);
|
||||
else if (query == qReferrersClosure) computeFSClosure(*store, j, paths, true);
|
||||
else if (query == qReferrersClosure) store->computeFSClosure(j, paths, true);
|
||||
}
|
||||
}
|
||||
Paths sorted = topoSortPaths(*store, paths);
|
||||
Paths sorted = store->topoSortPaths(paths);
|
||||
for (Paths::reverse_iterator i = sorted.rbegin();
|
||||
i != sorted.rend(); ++i)
|
||||
cout << format("%s\n") % *i;
|
||||
|
@ -357,7 +358,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
|||
case qBinding:
|
||||
for (auto & i : opArgs) {
|
||||
Path path = useDeriver(followLinksToStorePath(i));
|
||||
Derivation drv = derivationFromPath(*store, path);
|
||||
Derivation drv = store->derivationFromPath(path);
|
||||
StringPairs::iterator j = drv.env.find(bindingName);
|
||||
if (j == drv.env.end())
|
||||
throw Error(format("derivation ‘%1%’ has no environment binding named ‘%2%’")
|
||||
|
@ -394,7 +395,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
|||
PathSet paths = maybeUseOutputs(followLinksToStorePath(i), useOutput, forceRealise);
|
||||
roots.insert(paths.begin(), paths.end());
|
||||
}
|
||||
printDotGraph(roots);
|
||||
printDotGraph(*store, roots);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -404,7 +405,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
|||
PathSet paths = maybeUseOutputs(followLinksToStorePath(i), useOutput, forceRealise);
|
||||
roots.insert(paths.begin(), paths.end());
|
||||
}
|
||||
printXmlGraph(roots);
|
||||
printXmlGraph(*store, roots);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -419,7 +420,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
|
|||
for (auto & i : opArgs) {
|
||||
PathSet paths = maybeUseOutputs(followLinksToStorePath(i), useOutput, forceRealise);
|
||||
for (auto & j : paths)
|
||||
computeFSClosure(*store, j, referrers, true,
|
||||
store->computeFSClosure(j, referrers, true,
|
||||
settings.gcKeepOutputs, settings.gcKeepDerivations);
|
||||
}
|
||||
Roots roots = store->findRoots();
|
||||
|
@ -450,7 +451,7 @@ static void opPrintEnv(Strings opFlags, Strings opArgs)
|
|||
if (opArgs.size() != 1) throw UsageError("‘--print-env’ requires one derivation store path");
|
||||
|
||||
Path drvPath = opArgs.front();
|
||||
Derivation drv = derivationFromPath(*store, drvPath);
|
||||
Derivation drv = store->derivationFromPath(drvPath);
|
||||
|
||||
/* Print each environment variable in the derivation in a format
|
||||
that can be sourced by the shell. */
|
||||
|
@ -715,9 +716,9 @@ static void opExport(Strings opFlags, Strings opArgs)
|
|||
else throw UsageError(format("unknown flag ‘%1%’") % i);
|
||||
|
||||
FdSink sink(STDOUT_FILENO);
|
||||
Paths sorted = topoSortPaths(*store, PathSet(opArgs.begin(), opArgs.end()));
|
||||
Paths sorted = store->topoSortPaths(PathSet(opArgs.begin(), opArgs.end()));
|
||||
reverse(sorted.begin(), sorted.end());
|
||||
exportPaths(*store, sorted, sign, sink);
|
||||
store->exportPaths(sorted, sign, sink);
|
||||
}
|
||||
|
||||
|
||||
|
@ -896,7 +897,7 @@ static void opServe(Strings opFlags, Strings opArgs)
|
|||
if (!isDerivation(path)) paths2.insert(path);
|
||||
unsigned long long downloadSize, narSize;
|
||||
PathSet willBuild, willSubstitute, unknown;
|
||||
queryMissing(*store, PathSet(paths2.begin(), paths2.end()),
|
||||
store->queryMissing(PathSet(paths2.begin(), paths2.end()),
|
||||
willBuild, willSubstitute, unknown, downloadSize, narSize);
|
||||
/* FIXME: should use ensurePath(), but it only
|
||||
does one path at a time. */
|
||||
|
@ -941,9 +942,9 @@ static void opServe(Strings opFlags, Strings opArgs)
|
|||
|
||||
case cmdExportPaths: {
|
||||
bool sign = readInt(in);
|
||||
Paths sorted = topoSortPaths(*store, readStorePaths<PathSet>(in));
|
||||
Paths sorted = store->topoSortPaths(readStorePaths<PathSet>(in));
|
||||
reverse(sorted.begin(), sorted.end());
|
||||
exportPaths(*store, sorted, sign, out);
|
||||
store->exportPaths(sorted, sign, out);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -988,7 +989,7 @@ static void opServe(Strings opFlags, Strings opArgs)
|
|||
PathSet paths = readStorePaths<PathSet>(in);
|
||||
PathSet closure;
|
||||
for (auto & i : paths)
|
||||
computeFSClosure(*store, i, closure, false, includeOutputs);
|
||||
store->computeFSClosure(i, closure, false, includeOutputs);
|
||||
out << closure;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -33,7 +33,7 @@ static string makeNode(const string & id)
|
|||
}
|
||||
|
||||
|
||||
void printXmlGraph(const PathSet & roots)
|
||||
void printXmlGraph(StoreAPI & store, const PathSet & roots)
|
||||
{
|
||||
PathSet workList(roots);
|
||||
PathSet doneSet;
|
||||
|
@ -51,7 +51,7 @@ void printXmlGraph(const PathSet & roots)
|
|||
cout << makeNode(path);
|
||||
|
||||
PathSet references;
|
||||
store->queryReferences(path, references);
|
||||
store.queryReferences(path, references);
|
||||
|
||||
for (PathSet::iterator i = references.begin();
|
||||
i != references.end(); ++i)
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
namespace nix {
|
||||
|
||||
void printXmlGraph(const PathSet & roots);
|
||||
class StoreAPI;
|
||||
|
||||
void printXmlGraph(StoreAPI & store, const PathSet & roots);
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue