about summary refs log tree commit diff
path: root/src/nix-store
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix-store')
-rw-r--r--src/nix-store/main.cc21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/nix-store/main.cc b/src/nix-store/main.cc
index c1fedaf48cc1..3edcff7eeef0 100644
--- a/src/nix-store/main.cc
+++ b/src/nix-store/main.cc
@@ -1,9 +1,5 @@
 #include <iostream>
 
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
 #include "globals.hh"
 #include "build.hh"
 #include "gc.hh"
@@ -24,6 +20,7 @@ void printHelp()
 
 static Path gcRoot;
 static int rootNr = 0;
+static bool indirectRoot = false;
 
 
 static Path findOutput(const Derivation & drv, string id)
@@ -37,11 +34,9 @@ static Path findOutput(const Derivation & drv, string id)
 
 static Path followSymlinks(Path & path)
 {
+    path = absPath(path);
     while (!isStorePath(path)) {
-        struct stat st;
-        if (lstat(path.c_str(), &st))
-            throw SysError(format("getting status of `%1%'") % path);
-        if (!S_ISLNK(st.st_mode)) return path;
+        if (!isLink(path)) return path;
         string target = readLink(path);
         path = canonPath(string(target, 0, 1) == "/"
             ? target
@@ -64,7 +59,9 @@ static Path realisePath(const Path & path)
         if (gcRoot == "")
             printGCWarning();
         else
-            outPath = addPermRoot(outPath, makeRootName(gcRoot, rootNr));
+            outPath = addPermRoot(outPath,
+                makeRootName(gcRoot, rootNr),
+                indirectRoot);
         
         return outPath;
     } else {
@@ -191,6 +188,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
             for (Strings::iterator i = opArgs.begin();
                  i != opArgs.end(); i++)
             {
+                *i = followSymlinks(*i);
                 if (forceRealise) realisePath(*i);
                 Derivation drv = derivationFromPath(*i);
                 cout << format("%1%\n") % findOutput(drv, "out");
@@ -206,6 +204,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
             for (Strings::iterator i = opArgs.begin();
                  i != opArgs.end(); i++)
             {
+                *i = followSymlinks(*i);
                 Path path = maybeUseOutput(*i, useOutput, forceRealise);
                 if (query == qRequisites)
                     storePathRequisites(path, includeOutputs, paths);
@@ -441,8 +440,10 @@ void run(Strings args)
         else if (arg == "--add-root") {
             if (i == args.end())
                 throw UsageError("`--add-root requires an argument");
-            gcRoot = *i++;
+            gcRoot = absPath(*i++);
         }
+        else if (arg == "--indirect")
+            indirectRoot = true;
         else if (arg[0] == '-')
             opFlags.push_back(arg);
         else