aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/misc.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2010-01-25 17:18:44 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2010-01-25 17:18:44 +0000
commitfdcaf37361126793a1416ef5b348e5bf2f0fd1a0 (patch)
tree0e93d8cfb1f0aeabe303c9c74650d07e399c3c61 /src/libstore/misc.cc
parent50e34891f0e11f400bd50390ede3b7700a2b4db9 (diff)
* Made `nix-store -qR --include-outputs' much faster if there are
multiple paths specified on the command line (from O(n * m) to O(n + m), where n is the number of arguments and m is the size of the closure).
Diffstat (limited to 'src/libstore/misc.cc')
-rw-r--r--src/libstore/misc.cc11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/libstore/misc.cc b/src/libstore/misc.cc
index f2b4c7a4e..2d7d13a0e 100644
--- a/src/libstore/misc.cc
+++ b/src/libstore/misc.cc
@@ -19,7 +19,7 @@ Derivation derivationFromPath(const Path & drvPath)
void computeFSClosure(const Path & storePath,
- PathSet & paths, bool flipDirection)
+ PathSet & paths, bool flipDirection, bool includeOutputs)
{
if (paths.find(storePath) != paths.end()) return;
paths.insert(storePath);
@@ -30,8 +30,15 @@ void computeFSClosure(const Path & storePath,
else
store->queryReferences(storePath, references);
+ if (includeOutputs && isDerivation(storePath)) {
+ Derivation drv = derivationFromPath(storePath);
+ foreach (DerivationOutputs::iterator, i, drv.outputs)
+ if (store->isValidPath(i->second.path))
+ computeFSClosure(i->second.path, paths, flipDirection, true);
+ }
+
foreach (PathSet::iterator, i, references)
- computeFSClosure(*i, paths, flipDirection);
+ computeFSClosure(*i, paths, flipDirection, includeOutputs);
}