about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/local-store.cc37
-rw-r--r--src/nix-store/nix-store.cc7
2 files changed, 26 insertions, 18 deletions
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index c77ab3c6cecd..9a85c48d92ad 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -1016,25 +1016,30 @@ static void hashAndLink(bool dryRun, HashToPath & hashToPath,
             return;
         }
         
-        printMsg(lvlTalkative, format("linking `%1%' to `%2%'") % path % prevPath.first);
+        if (!dryRun) {
+            
+            printMsg(lvlTalkative, format("linking `%1%' to `%2%'") % path % prevPath.first);
 
-        Path tempLink = (format("%1%.tmp-%2%-%3%")
-            % path % getpid() % rand()).str();
+            Path tempLink = (format("%1%.tmp-%2%-%3%")
+                % path % getpid() % rand()).str();
 
-        toggleWritable(dirOf(path), true);
+            toggleWritable(dirOf(path), true);
         
-        if (link(prevPath.first.c_str(), tempLink.c_str()) == -1)
-            throw SysError(format("cannot link `%1%' to `%2%'")
-                % tempLink % prevPath.first);
-
-        /* Atomically replace the old file with the new hard link. */
-        if (rename(tempLink.c_str(), path.c_str()) == -1)
-            throw SysError(format("cannot rename `%1%' to `%2%'")
-                % tempLink % path);
-
-        /* Make the directory read-only again and reset its timestamp
-           back to 0. */
-        _canonicalisePathMetaData(dirOf(path), false);
+            if (link(prevPath.first.c_str(), tempLink.c_str()) == -1)
+                throw SysError(format("cannot link `%1%' to `%2%'")
+                    % tempLink % prevPath.first);
+
+            /* Atomically replace the old file with the new hard link. */
+            if (rename(tempLink.c_str(), path.c_str()) == -1)
+                throw SysError(format("cannot rename `%1%' to `%2%'")
+                    % tempLink % path);
+
+            /* Make the directory read-only again and reset its
+               timestamp back to 0. */
+            _canonicalisePathMetaData(dirOf(path), false);
+            
+        } else
+            printMsg(lvlTalkative, format("would link `%1%' to `%2%'") % path % prevPath.first);
         
         stats.filesLinked++;
         stats.bytesFreed += st.st_size;
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index 678ce2ae9c62..0d474946bfa5 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -640,16 +640,19 @@ static void opOptimise(Strings opFlags, Strings opArgs)
     if (!opArgs.empty())
         throw UsageError("no arguments expected");
 
+    bool dryRun = false;
+
     for (Strings::iterator i = opFlags.begin();
          i != opFlags.end(); ++i)
-        throw UsageError(format("unknown flag `%1%'") % *i);
+        if (*i == "--dry-run") dryRun = true;
+        else throw UsageError(format("unknown flag `%1%'") % *i);
 
     LocalStore * store2(dynamic_cast<LocalStore *>(store.get()));
     if (!store2) throw Error("you don't have sufficient rights to use --optimise");
 
     OptimiseStats stats;
     try {
-        store2->optimiseStore(true, stats);
+        store2->optimiseStore(dryRun, stats);
     } catch (...) {
         showOptimiseStats(stats);
         throw;