diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2007-10-10T13·43+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2007-10-10T13·43+0000 |
commit | 315183f194881591480d9acd1eef685d6b64d7f8 (patch) | |
tree | 542c4e374774f0f2d2de56f520160c728ef53ab0 | |
parent | a8629de827e4d5a67372614727ce6fcc26423f8c (diff) |
* nix-store --optimise: flag "--dry-run" to just query what the disk
savings would be.
-rw-r--r-- | src/libstore/local-store.cc | 37 | ||||
-rw-r--r-- | src/nix-store/nix-store.cc | 7 |
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; |