aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/store.cc10
-rw-r--r--src/libstore/store.hh4
-rw-r--r--src/nix-store/main.cc37
3 files changed, 33 insertions, 18 deletions
diff --git a/src/libstore/store.cc b/src/libstore/store.cc
index 49a9d2734..631984784 100644
--- a/src/libstore/store.cc
+++ b/src/libstore/store.cc
@@ -272,6 +272,16 @@ void queryReferences(const Path & storePath, PathSet & references)
}
+void queryReferers(const Path & storePath, PathSet & referers)
+{
+ Paths referers2;
+ if (!isValidPath(storePath))
+ throw Error(format("path `%1%' is not valid") % storePath);
+ nixDB.queryStrings(noTxn, dbReferers, storePath, referers2);
+ referers.insert(referers2.begin(), referers2.end());
+}
+
+
static Substitutes readSubstitutes(const Transaction & txn,
const Path & srcPath)
{
diff --git a/src/libstore/store.hh b/src/libstore/store.hh
index 239493a88..8f5190f80 100644
--- a/src/libstore/store.hh
+++ b/src/libstore/store.hh
@@ -84,6 +84,10 @@ void setReferences(const Transaction & txn, const Path & storePath,
result is not cleared. */
void queryReferences(const Path & storePath, PathSet & references);
+/* Queries the set of incoming FS references for a store path. The
+ result is not cleared. */
+void queryReferers(const Path & storePath, PathSet & referers);
+
/* Constructs a unique store path name. */
Path makeStorePath(const string & type,
const Hash & hash, const string & suffix);
diff --git a/src/nix-store/main.cc b/src/nix-store/main.cc
index f8ddfd5d7..e922a9755 100644
--- a/src/nix-store/main.cc
+++ b/src/nix-store/main.cc
@@ -64,10 +64,18 @@ static Path maybeUseOutput(const Path & storePath, bool useOutput)
}
+static void printPathSet(const PathSet & paths)
+{
+ for (PathSet::iterator i = paths.begin();
+ i != paths.end(); i++)
+ cout << format("%s\n") % *i;
+}
+
+
/* Perform various sorts of queries. */
static void opQuery(Strings opFlags, Strings opArgs)
{
- enum { qOutputs, qRequisites, qPredecessors, qGraph } query = qOutputs;
+ enum { qOutputs, qRequisites, qReferences, qReferers, qGraph } query = qOutputs;
bool useOutput = false;
bool includeOutputs = false;
@@ -75,6 +83,8 @@ static void opQuery(Strings opFlags, Strings opArgs)
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 == "--graph") query = qGraph;
else if (*i == "--use-output" || *i == "-u") useOutput = true;
else if (*i == "--include-outputs") includeOutputs = true;
@@ -92,33 +102,24 @@ static void opQuery(Strings opFlags, Strings opArgs)
break;
}
- case qRequisites: {
+ case qRequisites:
+ case qReferences:
+ case qReferers: {
PathSet paths;
for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); i++)
{
Path path = maybeUseOutput(*i, useOutput);
- storePathRequisites(path, includeOutputs, paths);
+ if (query == qRequisites)
+ storePathRequisites(path, includeOutputs, paths);
+ else if (query == qReferences) queryReferences(path, paths);
+ else if (query == qReferers) queryReferers(path, paths);
}
- for (PathSet::iterator i = paths.begin();
- i != paths.end(); i++)
- cout << format("%s\n") % *i;
+ printPathSet(paths);
break;
}
#if 0
- case qPredecessors: {
- for (Strings::iterator i = opArgs.begin();
- i != opArgs.end(); i++)
- {
- Paths preds = queryPredecessors(*i);
- for (Paths::iterator j = preds.begin();
- j != preds.end(); j++)
- cout << format("%s\n") % *j;
- }
- break;
- }
-
case qGraph: {
PathSet roots;
for (Strings::iterator i = opArgs.begin();