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/nix-store | |
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/nix-store')
-rw-r--r-- | src/nix-store/nix-store.cc | 40 |
1 files changed, 2 insertions, 38 deletions
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index b873baacb932..22effc65dc77 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -165,41 +165,6 @@ static void opPrintFixedPath(Strings opFlags, Strings opArgs) } -/* Place in `paths' the set of paths that are required to `realise' - the given store path, i.e., all paths necessary for valid - deployment of the path. For a derivation, this is the union of - requisites of the inputs, plus the derivation; for other store - paths, it is the set of paths in the FS closure of the path. If - `includeOutputs' is true, include the requisites of the output - paths of derivations as well. - - Note that this function can be used to implement three different - deployment policies: - - - Source deployment (when called on a derivation). - - Binary deployment (when called on an output path). - - Source/binary deployment (when called on a derivation with - `includeOutputs' set to true). -*/ -static void storePathRequisites(const Path & storePath, - bool includeOutputs, PathSet & paths) -{ - computeFSClosure(storePath, paths); - - if (includeOutputs) { - for (PathSet::iterator i = paths.begin(); - i != paths.end(); ++i) - if (isDerivation(*i)) { - Derivation drv = derivationFromPath(*i); - for (DerivationOutputs::iterator j = drv.outputs.begin(); - j != drv.outputs.end(); ++j) - if (store->isValidPath(j->second.path)) - computeFSClosure(j->second.path, paths); - } - } -} - - static Path maybeUseOutput(const Path & storePath, bool useOutput, bool forceRealise) { if (forceRealise) realisePath(storePath); @@ -310,10 +275,9 @@ static void opQuery(Strings opFlags, Strings opArgs) PathSet paths; foreach (Strings::iterator, i, opArgs) { Path path = maybeUseOutput(followLinksToStorePath(*i), useOutput, forceRealise); - if (query == qRequisites) - storePathRequisites(path, includeOutputs, paths); + if (query == qRequisites) computeFSClosure(path, paths, false, includeOutputs); else if (query == qReferences) store->queryReferences(path, paths); - else if (query == qReferrers) store->queryReferrers(path, paths); + else if (query == qReferrers) store->queryReferrers(path, paths); else if (query == qReferrersClosure) computeFSClosure(path, paths, true); } Paths sorted = topoSortPaths(paths); |