aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2020-01-05 16:26:17 +0100
committerGitHub <noreply@github.com>2020-01-05 16:26:17 +0100
commit0486e87791f0d50f98ccd46c56f32ecc4e1bc79c (patch)
treed1a1aedbfd4e30c5cebe01104559759dbd52d9de
parentcb90e382b5b6e177ea902b3909fd1897643ae3cd (diff)
parent7d448bc966021e63e9c7b96530cee885f3dcd68d (diff)
Merge pull request #3302 from LnL7/darwin-repair-with-sandbox
build: fix path repairing with the darwin sandbox
-rw-r--r--src/libstore/build.cc28
1 files changed, 14 insertions, 14 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 78f39fed1..0674f936b 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -1513,8 +1513,10 @@ void replaceValidPath(const Path & storePath, const Path tmpPath)
Path oldPath = (format("%1%.old-%2%-%3%") % storePath % getpid() % random()).str();
if (pathExists(storePath))
rename(storePath.c_str(), oldPath.c_str());
- if (rename(tmpPath.c_str(), storePath.c_str()) == -1)
+ if (rename(tmpPath.c_str(), storePath.c_str()) == -1) {
+ rename(oldPath.c_str(), storePath.c_str()); // attempt to recover
throw SysError("moving '%s' to '%s'", tmpPath, storePath);
+ }
deletePath(oldPath);
}
@@ -3565,19 +3567,6 @@ void DerivationGoal::registerOutputs()
if (!missingPaths.count(i.second.path)) continue;
Path actualPath = path;
- if (useChroot) {
- actualPath = chrootRootDir + path;
- if (pathExists(actualPath)) {
- /* Move output paths from the chroot to the Nix store. */
- if (buildMode == bmRepair)
- replaceValidPath(path, actualPath);
- else
- if (buildMode != bmCheck && rename(actualPath.c_str(), worker.store.toRealPath(path).c_str()) == -1)
- throw SysError(format("moving build output '%1%' from the sandbox to the Nix store") % path);
- }
- if (buildMode != bmCheck) actualPath = worker.store.toRealPath(path);
- }
-
if (needsHashRewrite()) {
auto r = redirectedOutputs.find(i.second.path);
if (r != redirectedOutputs.end()) {
@@ -3589,6 +3578,17 @@ void DerivationGoal::registerOutputs()
if (buildMode == bmCheck)
actualPath = redirected;
}
+ } else if (useChroot) {
+ actualPath = chrootRootDir + path;
+ if (pathExists(actualPath)) {
+ /* Move output paths from the chroot to the Nix store. */
+ if (buildMode == bmRepair)
+ replaceValidPath(path, actualPath);
+ else
+ if (buildMode != bmCheck && rename(actualPath.c_str(), worker.store.toRealPath(path).c_str()) == -1)
+ throw SysError(format("moving build output '%1%' from the sandbox to the Nix store") % path);
+ }
+ if (buildMode != bmCheck) actualPath = worker.store.toRealPath(path);
}
struct stat st;