diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-01-25T17·18+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-01-25T17·18+0000 |
commit | fdcaf37361126793a1416ef5b348e5bf2f0fd1a0 (patch) | |
tree | 0e93d8cfb1f0aeabe303c9c74650d07e399c3c61 /src/libstore/misc.cc | |
parent | 50e34891f0e11f400bd50390ede3b7700a2b4db9 (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.cc | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/libstore/misc.cc b/src/libstore/misc.cc index f2b4c7a4ee60..2d7d13a0e7b4 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); } |