aboutsummaryrefslogtreecommitdiff
path: root/src/nix-store
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2005-02-07 14:32:44 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2005-02-07 14:32:44 +0000
commitfbc434ee4c39e7516f3634371442899864786584 (patch)
tree9ea7e2d90f78fa6b100c35c135822b984c408882 /src/nix-store
parent450c358e2055488897349bf50951cce16ad9bc90 (diff)
* `nix-store -qb' to query derivation environment bindings. Useful
for finding build-time dependencies (possibly after a build). E.g., $ nix-store -qb aterm $(nix-store -qd $(which strc)) /nix/store/jw7c7s65n1gwhxpn35j9rgcci6ilzxym-aterm-2.3.1 * Arguments to nix-store can be files within store objects, e.g., /nix/store/jw7c...-aterm-2.3.1/bin/baffle. * Idem for garbage collector roots.
Diffstat (limited to 'src/nix-store')
-rw-r--r--src/nix-store/main.cc43
1 files changed, 32 insertions, 11 deletions
diff --git a/src/nix-store/main.cc b/src/nix-store/main.cc
index 4b8d2cf3f..f9bd3323f 100644
--- a/src/nix-store/main.cc
+++ b/src/nix-store/main.cc
@@ -32,15 +32,15 @@ static Path findOutput(const Derivation & drv, string id)
}
-static Path followSymlinks(Path & path)
+static Path fixPath(Path path)
{
path = absPath(path);
- while (!isStorePath(path)) {
- if (!isLink(path)) return path;
+ while (!isInStore(path)) {
+ if (!isLink(path)) break;
string target = readLink(path);
path = absPath(target, dirOf(path));
}
- return path;
+ return toStorePath(path);
}
@@ -76,7 +76,7 @@ static void opRealise(Strings opFlags, Strings opArgs)
for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); i++)
- *i = followSymlinks(*i);
+ *i = fixPath(*i);
if (opArgs.size() > 1) {
PathSet drvPaths;
@@ -162,19 +162,27 @@ static void printPathSet(const PathSet & paths)
static void opQuery(Strings opFlags, Strings opArgs)
{
enum { qOutputs, qRequisites, qReferences, qReferers,
- qReferersClosure, qDeriver, qGraph } query = qOutputs;
+ qReferersClosure, qDeriver, qBinding, qGraph } query = qOutputs;
bool useOutput = false;
bool includeOutputs = false;
bool forceRealise = false;
+ string bindingName;
for (Strings::iterator i = opFlags.begin();
- i != opFlags.end(); i++)
+ i != opFlags.end(); ++i)
if (*i == "--outputs") query = qOutputs;
else if (*i == "--requisites" || *i == "-R") query = qRequisites;
else if (*i == "--references") query = qReferences;
else if (*i == "--referers") query = qReferers;
else if (*i == "--referers-closure") query = qReferersClosure;
else if (*i == "--deriver" || *i == "-d") query = qDeriver;
+ else if (*i == "--binding" || *i == "-b") {
+ if (opArgs.size() == 0)
+ throw UsageError("expected binding name");
+ bindingName = opArgs.front();
+ opArgs.pop_front();
+ query = qBinding;
+ }
else if (*i == "--graph") query = qGraph;
else if (*i == "--use-output" || *i == "-u") useOutput = true;
else if (*i == "--force-realise" || *i == "-f") forceRealise = true;
@@ -187,7 +195,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); i++)
{
- *i = followSymlinks(*i);
+ *i = fixPath(*i);
if (forceRealise) realisePath(*i);
Derivation drv = derivationFromPath(*i);
cout << format("%1%\n") % findOutput(drv, "out");
@@ -203,7 +211,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); i++)
{
- *i = followSymlinks(*i);
+ *i = fixPath(*i);
Path path = maybeUseOutput(*i, useOutput, forceRealise);
if (query == qRequisites)
storePathRequisites(path, includeOutputs, paths);
@@ -219,13 +227,26 @@ static void opQuery(Strings opFlags, Strings opArgs)
for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); i++)
{
- *i = followSymlinks(*i);
+ *i = fixPath(*i);
Path deriver = queryDeriver(noTxn, *i);
cout << format("%1%\n") %
(deriver == "" ? "unknown-deriver" : deriver);
}
break;
-
+
+ case qBinding:
+ for (Strings::iterator i = opArgs.begin();
+ i != opArgs.end(); i++)
+ {
+ *i = fixPath(*i);
+ Derivation drv = derivationFromPath(*i);
+ StringPairs::iterator j = drv.env.find(bindingName);
+ if (j == drv.env.end())
+ throw Error(format("derivation `%1%' has no environment binding named `%2%'")
+ % *i % bindingName);
+ cout << format("%1%\n") % j->second;
+ }
+ break;
#if 0
case qGraph: {