aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/install-nix-from-closure.sh2
-rw-r--r--scripts/install.in2
-rw-r--r--src/libexpr/eval.cc4
-rw-r--r--src/libexpr/function-trace.cc17
-rw-r--r--src/libexpr/function-trace.hh14
-rw-r--r--src/libstore/build.cc34
-rw-r--r--src/libstore/globals.cc9
-rw-r--r--src/libstore/globals.hh4
-rw-r--r--tests/pass-as-file.sh1
9 files changed, 52 insertions, 35 deletions
diff --git a/scripts/install-nix-from-closure.sh b/scripts/install-nix-from-closure.sh
index 3f1581854..3fea7e056 100644
--- a/scripts/install-nix-from-closure.sh
+++ b/scripts/install-nix-from-closure.sh
@@ -102,7 +102,7 @@ for i in $(cd "$self/store" >/dev/null && echo ./*); do
rm -rf "$i_tmp"
fi
if ! [ -e "$dest/store/$i" ]; then
- cp -Rp "$self/store/$i" "$i_tmp"
+ cp -RPp "$self/store/$i" "$i_tmp"
chmod -R a-w "$i_tmp"
chmod +w "$i_tmp"
mv "$i_tmp" "$dest/store/$i"
diff --git a/scripts/install.in b/scripts/install.in
index 902758b13..76cb3b1fd 100644
--- a/scripts/install.in
+++ b/scripts/install.in
@@ -56,7 +56,7 @@ fi
unpack=$tmpDir/unpack
mkdir -p "$unpack"
-tar -xf "$tarball" -C "$unpack" || oops "failed to unpack '$url'"
+tar -xJf "$tarball" -C "$unpack" || oops "failed to unpack '$url'"
script=$(echo "$unpack"/*/install)
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index cddbce20d..427a6f299 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -1146,9 +1146,7 @@ void EvalState::callPrimOp(Value & fun, Value & arg, Value & v, const Pos & pos)
void EvalState::callFunction(Value & fun, Value & arg, Value & v, const Pos & pos)
{
- std::unique_ptr<FunctionCallTrace> trace;
- if (evalSettings.traceFunctionCalls)
- trace = std::make_unique<FunctionCallTrace>(pos);
+ auto trace = evalSettings.traceFunctionCalls ? std::make_unique<FunctionCallTrace>(pos) : nullptr;
forceValue(fun, pos);
diff --git a/src/libexpr/function-trace.cc b/src/libexpr/function-trace.cc
new file mode 100644
index 000000000..af1486f78
--- /dev/null
+++ b/src/libexpr/function-trace.cc
@@ -0,0 +1,17 @@
+#include "function-trace.hh"
+
+namespace nix {
+
+FunctionCallTrace::FunctionCallTrace(const Pos & pos) : pos(pos) {
+ auto duration = std::chrono::high_resolution_clock::now().time_since_epoch();
+ auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(duration);
+ printMsg(lvlInfo, "function-trace entered %1% at %2%", pos, ns.count());
+}
+
+FunctionCallTrace::~FunctionCallTrace() {
+ auto duration = std::chrono::high_resolution_clock::now().time_since_epoch();
+ auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(duration);
+ printMsg(lvlInfo, "function-trace exited %1% at %2%", pos, ns.count());
+}
+
+}
diff --git a/src/libexpr/function-trace.hh b/src/libexpr/function-trace.hh
index 2c39b7430..472f2045e 100644
--- a/src/libexpr/function-trace.hh
+++ b/src/libexpr/function-trace.hh
@@ -9,17 +9,7 @@ namespace nix {
struct FunctionCallTrace
{
const Pos & pos;
-
- FunctionCallTrace(const Pos & pos) : pos(pos) {
- auto duration = std::chrono::high_resolution_clock::now().time_since_epoch();
- auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(duration);
- printMsg(lvlInfo, "function-trace entered %1% at %2%", pos, ns.count());
- }
-
- ~FunctionCallTrace() {
- auto duration = std::chrono::high_resolution_clock::now().time_since_epoch();
- auto ns = std::chrono::duration_cast<std::chrono::nanoseconds>(duration);
- printMsg(lvlInfo, "function-trace exited %1% at %2%", pos, ns.count());
- }
+ FunctionCallTrace(const Pos & pos);
+ ~FunctionCallTrace();
};
}
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 05c4cb621..f1085cae1 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -1514,8 +1514,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);
}
@@ -1986,7 +1988,7 @@ void DerivationGoal::startBuilder()
throw BuildError(format("odd number of tokens in 'exportReferencesGraph': '%1%'") % s);
for (Strings::iterator i = ss.begin(); i != ss.end(); ) {
string fileName = *i++;
- static std::regex regex("[A-Za-z_][A-Za-z0-9_.]*");
+ static std::regex regex("[A-Za-z_][A-Za-z0-9_.-]*");
if (!std::regex_match(fileName, regex))
throw Error("invalid file name '%s' in 'exportReferencesGraph'", fileName);
@@ -2456,12 +2458,12 @@ void DerivationGoal::initTmpDir() {
if (!parsedDrv->getStructuredAttrs()) {
StringSet passAsFile = tokenizeString<StringSet>(get(drv->env, "passAsFile").value_or(""));
- int fileNr = 0;
for (auto & i : drv->env) {
if (passAsFile.find(i.first) == passAsFile.end()) {
env[i.first] = i.second;
} else {
- string fn = ".attr-" + std::to_string(fileNr++);
+ auto hash = hashString(htSHA256, i.first);
+ string fn = ".attr-" + hash.to_string(Base32, false);
Path p = tmpDir + "/" + fn;
writeFile(p, i.second);
chownToBuilder(p);
@@ -3566,19 +3568,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()) {
@@ -3590,6 +3579,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;
diff --git a/src/libstore/globals.cc b/src/libstore/globals.cc
index cec85edca..5f1ae5ab5 100644
--- a/src/libstore/globals.cc
+++ b/src/libstore/globals.cc
@@ -117,6 +117,15 @@ void Settings::requireExperimentalFeature(const std::string & name)
throw Error("experimental Nix feature '%s' is disabled", name);
}
+bool Settings::isWSL1()
+{
+ struct utsname utsbuf;
+ uname(&utsbuf);
+ // WSL1 uses -Microsoft suffix
+ // WSL2 uses -microsoft-standard suffix
+ return hasSuffix(utsbuf.release, "-Microsoft");
+}
+
const string nixVersion = PACKAGE_VERSION;
template<> void BaseSetting<SandboxMode>::set(const std::string & str)
diff --git a/src/libstore/globals.hh b/src/libstore/globals.hh
index ae5a78201..247fba2f8 100644
--- a/src/libstore/globals.hh
+++ b/src/libstore/globals.hh
@@ -34,6 +34,8 @@ class Settings : public Config {
StringSet getDefaultSystemFeatures();
+ bool isWSL1();
+
public:
Settings();
@@ -130,7 +132,7 @@ public:
Setting<bool> fsyncMetadata{this, true, "fsync-metadata",
"Whether SQLite should use fsync()."};
- Setting<bool> useSQLiteWAL{this, true, "use-sqlite-wal",
+ Setting<bool> useSQLiteWAL{this, !isWSL1(), "use-sqlite-wal",
"Whether SQLite should use WAL mode."};
Setting<bool> syncBeforeRegistering{this, false, "sync-before-registering",
diff --git a/tests/pass-as-file.sh b/tests/pass-as-file.sh
index 3dfe10baa..2c0bc5031 100644
--- a/tests/pass-as-file.sh
+++ b/tests/pass-as-file.sh
@@ -10,6 +10,7 @@ mkDerivation {
passAsFile = [ \"foo\" ];
foo = [ \"xyzzy\" ];
builder = builtins.toFile \"builder.sh\" ''
+ [ \"\$(basename \$fooPath)\" = .attr-1bp7cri8hplaz6hbz0v4f0nl44rl84q1sg25kgwqzipzd1mv89ic ]
[ \"\$(cat \$fooPath)\" = xyzzy ]
touch \$out
'';