about summary refs log tree commit diff
path: root/src/nix-store/nix-store.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2009-11-23T18·16+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2009-11-23T18·16+0000
commit3d55f1eb57c04efc10a093379ea38d6c0aefa588 (patch)
tree058fab07931935c9105c71551f189ba5600a962d /src/nix-store/nix-store.cc
parentae6bf87273b30258408dc292611f3f50015b843c (diff)
* A command `nix-store --query --roots <paths>' to find the garbage
  collector roots that point (directly or indirectly) to the given
  paths.

Diffstat (limited to 'src/nix-store/nix-store.cc')
-rw-r--r--src/nix-store/nix-store.cc47
1 files changed, 23 insertions, 24 deletions
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index b951393092b9..e08908cd78ec 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -261,14 +261,13 @@ static void opQuery(Strings opFlags, Strings opArgs)
 {
     enum { qOutputs, qRequisites, qReferences, qReferrers
          , qReferrersClosure, qDeriver, qBinding, qHash
-         , qTree, qGraph, qResolve } query = qOutputs;
+         , qTree, qGraph, qResolve, qRoots } query = qOutputs;
     bool useOutput = false;
     bool includeOutputs = false;
     bool forceRealise = false;
     string bindingName;
 
-    for (Strings::iterator i = opFlags.begin();
-         i != opFlags.end(); ++i)
+    foreach (Strings::iterator, i, opFlags)
         if (*i == "--outputs") query = qOutputs;
         else if (*i == "--requisites" || *i == "-R") query = qRequisites;
         else if (*i == "--references") query = qReferences;
@@ -286,6 +285,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
         else if (*i == "--tree") query = qTree;
         else if (*i == "--graph") query = qGraph;
         else if (*i == "--resolve") query = qResolve;
+        else if (*i == "--roots") query = qRoots;
         else if (*i == "--use-output" || *i == "-u") useOutput = true;
         else if (*i == "--force-realise" || *i == "-f") forceRealise = true;
         else if (*i == "--include-outputs") includeOutputs = true;
@@ -294,9 +294,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
     switch (query) {
         
         case qOutputs: {
-            for (Strings::iterator i = opArgs.begin();
-                 i != opArgs.end(); ++i)
-            {
+            foreach (Strings::iterator, i, opArgs) {
                 *i = followLinksToStorePath(*i);
                 if (forceRealise) realisePath(*i);
                 Derivation drv = derivationFromPath(*i);
@@ -310,9 +308,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
         case qReferrers:
         case qReferrersClosure: {
             PathSet paths;
-            for (Strings::iterator i = opArgs.begin();
-                 i != opArgs.end(); ++i)
-            {
+            foreach (Strings::iterator, i, opArgs) {
                 Path path = maybeUseOutput(followLinksToStorePath(*i), useOutput, forceRealise);
                 if (query == qRequisites)
                     storePathRequisites(path, includeOutputs, paths);
@@ -328,9 +324,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
         }
 
         case qDeriver:
-            for (Strings::iterator i = opArgs.begin();
-                 i != opArgs.end(); ++i)
-            {
+            foreach (Strings::iterator, i, opArgs) {
                 Path deriver = store->queryDeriver(followLinksToStorePath(*i));
                 cout << format("%1%\n") %
                     (deriver == "" ? "unknown-deriver" : deriver);
@@ -338,9 +332,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
             break;
 
         case qBinding:
-            for (Strings::iterator i = opArgs.begin();
-                 i != opArgs.end(); ++i)
-            {
+            foreach (Strings::iterator, i, opArgs) {
                 Path path = useDeriver(followLinksToStorePath(*i));
                 Derivation drv = derivationFromPath(path);
                 StringPairs::iterator j = drv.env.find(bindingName);
@@ -352,9 +344,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
             break;
 
         case qHash:
-            for (Strings::iterator i = opArgs.begin();
-                 i != opArgs.end(); ++i)
-            {
+            foreach (Strings::iterator, i, opArgs) {
                 Path path = maybeUseOutput(followLinksToStorePath(*i), useOutput, forceRealise);
                 Hash hash = store->queryPathHash(path);
                 assert(hash.type == htSHA256);
@@ -364,28 +354,37 @@ static void opQuery(Strings opFlags, Strings opArgs)
 
         case qTree: {
             PathSet done;
-            for (Strings::iterator i = opArgs.begin();
-                 i != opArgs.end(); ++i)
+            foreach (Strings::iterator, i, opArgs)
                 printTree(followLinksToStorePath(*i), "", "", done);
             break;
         }
             
         case qGraph: {
             PathSet roots;
-            for (Strings::iterator i = opArgs.begin();
-                 i != opArgs.end(); ++i)
+            foreach (Strings::iterator, i, opArgs)
                 roots.insert(maybeUseOutput(followLinksToStorePath(*i), useOutput, forceRealise));
 	    printDotGraph(roots);
             break;
         }
 
         case qResolve: {
-            for (Strings::iterator i = opArgs.begin();
-                 i != opArgs.end(); ++i)
+            foreach (Strings::iterator, i, opArgs)
                 cout << format("%1%\n") % followLinksToStorePath(*i);
             break;
         }
             
+        case qRoots: {
+            PathSet referrers;
+            foreach (Strings::iterator, i, opArgs)
+                computeFSClosure(maybeUseOutput(followLinksToStorePath(*i), useOutput, forceRealise),
+                    referrers, true);
+            Roots roots = store->findRoots();
+            foreach (Roots::iterator, i, roots)
+                if (referrers.find(i->second) != referrers.end())
+                    cout << format("%1%\n") % i->first;
+            break;
+        }
+            
         default:
             abort();
     }