1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-28 09:31:16 +02:00

Clear any immutable bits in the Nix store

Doing this once makes subsequent operations like garbage collecting
more efficient since we don't have to call makeMutable() first.
This commit is contained in:
Eelco Dolstra 2013-01-03 12:59:23 +01:00
parent 0a4e90395c
commit def5160b61
10 changed files with 76 additions and 89 deletions

View file

@ -7,7 +7,6 @@
#include "local-store.hh"
#include "util.hh"
#include "archive.hh"
#include "immutable.hh"
#include <map>
#include <sstream>
@ -1383,10 +1382,8 @@ void replaceValidPath(const Path & storePath, const Path tmpPath)
way first. We'd better not be interrupted here, because if
we're repairing (say) Glibc, we end up with a broken system. */
Path oldPath = (format("%1%.old-%2%-%3%") % storePath % getpid() % rand()).str();
if (pathExists(storePath)) {
makeMutable(storePath);
if (pathExists(storePath))
rename(storePath.c_str(), oldPath.c_str());
}
if (rename(tmpPath.c_str(), storePath.c_str()) == -1)
throw SysError(format("moving `%1%' to `%2%'") % tmpPath % storePath);
if (pathExists(oldPath))
@ -1911,10 +1908,6 @@ void DerivationGoal::startBuilder()
if (S_ISDIR(st.st_mode))
dirsInChroot[*i] = *i;
else {
/* Creating a hard link to *i is impossible if its
immutable bit is set. So clear it first. */
makeMutable(*i);
Path p = chrootRootDir + *i;
if (link(i->c_str(), p.c_str()) == -1) {
/* Hard-linking fails if we exceed the maximum