* Make `nix-store --query --tree' work on non-derivations (i.e., on

any store path).
This commit is contained in:
Eelco Dolstra 2005-04-08 12:57:16 +00:00
parent 90905634ed
commit 4271385a73
1 changed files with 13 additions and 15 deletions

View File

@ -233,38 +233,36 @@ static Paths topoSort(const PathSet & paths)
} }
static void printDrvTree(const Path & drvPath, static void printTree(const Path & path,
const string & firstPad, const string & tailPad, PathSet & done) const string & firstPad, const string & tailPad, PathSet & done)
{ {
if (done.find(drvPath) != done.end()) { if (done.find(path) != done.end()) {
cout << format("%1%%2% [...]\n") % firstPad % drvPath; cout << format("%1%%2% [...]\n") % firstPad % path;
return; return;
} }
done.insert(drvPath); done.insert(path);
cout << format("%1%%2%\n") % firstPad % drvPath; cout << format("%1%%2%\n") % firstPad % path;
Derivation drv = derivationFromPath(drvPath); PathSet references;
queryReferences(noTxn, path, references);
#if 0
for (PathSet::iterator i = drv.inputSrcs.begin(); for (PathSet::iterator i = drv.inputSrcs.begin();
i != drv.inputSrcs.end(); ++i) i != drv.inputSrcs.end(); ++i)
cout << format("%1%%2%\n") % (tailPad + treeConn) % *i; cout << format("%1%%2%\n") % (tailPad + treeConn) % *i;
#endif
PathSet inputs;
for (DerivationInputs::iterator i = drv.inputDrvs.begin();
i != drv.inputDrvs.end(); ++i)
inputs.insert(i->first);
/* Topologically sort under the relation A < B iff A \in /* Topologically sort under the relation A < B iff A \in
closure(B). That is, if derivation A is an (possibly indirect) closure(B). That is, if derivation A is an (possibly indirect)
input of B, then A is printed first. This has the effect of input of B, then A is printed first. This has the effect of
flattening the tree, preventing deeply nested structures. */ flattening the tree, preventing deeply nested structures. */
Paths sorted = topoSort(inputs); Paths sorted = topoSort(references);
reverse(sorted.begin(), sorted.end()); reverse(sorted.begin(), sorted.end());
for (Paths::iterator i = sorted.begin(); i != sorted.end(); ++i) { for (Paths::iterator i = sorted.begin(); i != sorted.end(); ++i) {
Paths::iterator j = i; ++j; Paths::iterator j = i; ++j;
printDrvTree(*i, tailPad + treeConn, printTree(*i, tailPad + treeConn,
j == sorted.end() ? tailPad + treeNull : tailPad + treeLine, j == sorted.end() ? tailPad + treeNull : tailPad + treeLine,
done); done);
} }
@ -377,7 +375,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
PathSet done; PathSet done;
for (Strings::iterator i = opArgs.begin(); for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); ++i) i != opArgs.end(); ++i)
printDrvTree(fixPath(*i), "", "", done); printTree(fixPath(*i), "", "", done);
break; break;
} }