* Nix-store queries `--references' and `referers' to query the pointer

graph.  That is, `nix-store --query --references PATH' shows the set
  of paths referenced by PATH, and `nix-store --query --referers PATH'
  shows the set of paths referencing PATH.
This commit is contained in:
Eelco Dolstra 2005-01-19 16:59:56 +00:00
parent 96de272b48
commit e0f4e587c3
3 changed files with 33 additions and 18 deletions

View File

@ -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, static Substitutes readSubstitutes(const Transaction & txn,
const Path & srcPath) const Path & srcPath)
{ {

View File

@ -84,6 +84,10 @@ void setReferences(const Transaction & txn, const Path & storePath,
result is not cleared. */ result is not cleared. */
void queryReferences(const Path & storePath, PathSet & references); 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. */ /* Constructs a unique store path name. */
Path makeStorePath(const string & type, Path makeStorePath(const string & type,
const Hash & hash, const string & suffix); const Hash & hash, const string & suffix);

View File

@ -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. */ /* Perform various sorts of queries. */
static void opQuery(Strings opFlags, Strings opArgs) 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 useOutput = false;
bool includeOutputs = false; bool includeOutputs = false;
@ -75,6 +83,8 @@ static void opQuery(Strings opFlags, Strings opArgs)
i != opFlags.end(); i++) i != opFlags.end(); i++)
if (*i == "--outputs") query = qOutputs; if (*i == "--outputs") query = qOutputs;
else if (*i == "--requisites" || *i == "-R") query = qRequisites; 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 == "--graph") query = qGraph;
else if (*i == "--use-output" || *i == "-u") useOutput = true; else if (*i == "--use-output" || *i == "-u") useOutput = true;
else if (*i == "--include-outputs") includeOutputs = true; else if (*i == "--include-outputs") includeOutputs = true;
@ -92,33 +102,24 @@ static void opQuery(Strings opFlags, Strings opArgs)
break; break;
} }
case qRequisites: { case qRequisites:
case qReferences:
case qReferers: {
PathSet paths; PathSet paths;
for (Strings::iterator i = opArgs.begin(); for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); i++) i != opArgs.end(); i++)
{ {
Path path = maybeUseOutput(*i, useOutput); 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(); printPathSet(paths);
i != paths.end(); i++)
cout << format("%s\n") % *i;
break; break;
} }
#if 0 #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: { case qGraph: {
PathSet roots; PathSet roots;
for (Strings::iterator i = opArgs.begin(); for (Strings::iterator i = opArgs.begin();