diff --git a/.travis.yml b/.travis.yml
index 99218a963..ee4ea1ac6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,2 +1,8 @@
-os: osx
-script: ./tests/install-darwin.sh
+matrix:
+ include:
+ - language: osx
+ script: ./tests/install-darwin.sh
+ - language: nix
+ script: nix-build release.nix -A build.x86_64-linux
+notifications:
+ email: false
diff --git a/doc/manual/expressions/builtins.xml b/doc/manual/expressions/builtins.xml
index 465fa1e0b..f39b393bf 100644
--- a/doc/manual/expressions/builtins.xml
+++ b/doc/manual/expressions/builtins.xml
@@ -746,6 +746,11 @@ builtins.genList (x: x * x) 5
separate file, and use it from Nix expressions in other
files.
+ Unlike some languages, import is a regular
+ function in Nix. Paths using the angle bracket syntax (e.g.,
+ import <foo>) are normal path
+ values (see ).
+
A Nix expression loaded by import must
not contain any free variables (identifiers
that are not defined in the Nix expression itself and are not
diff --git a/doc/manual/packages/s3-substituter.xml b/doc/manual/packages/s3-substituter.xml
index 1722090ef..868b5a66d 100644
--- a/doc/manual/packages/s3-substituter.xml
+++ b/doc/manual/packages/s3-substituter.xml
@@ -159,7 +159,6 @@ the S3 URL:
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:ListMultipartUploadParts",
- "s3:ListObjects",
"s3:PutObject"
],
"Resource": [
diff --git a/scripts/install-multi-user.sh b/scripts/install-multi-user.sh
index d060e5165..13762cba3 100644
--- a/scripts/install-multi-user.sh
+++ b/scripts/install-multi-user.sh
@@ -19,9 +19,6 @@ readonly BLUE_UL='\033[38;4;34m'
readonly GREEN='\033[38;32m'
readonly GREEN_UL='\033[38;4;32m'
readonly RED='\033[38;31m'
-readonly RED_UL='\033[38;4;31m'
-readonly YELLOW='\033[38;33m'
-readonly YELLOW_UL='\033[38;4;33m'
readonly NIX_USER_COUNT="32"
readonly NIX_BUILD_GROUP_ID="30000"
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 31f8f5862..66683e936 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -1607,6 +1607,19 @@ bool EvalState::isDerivation(Value & v)
}
+std::optional EvalState::tryAttrsToString(const Pos & pos, Value & v,
+ PathSet & context, bool coerceMore, bool copyToStore)
+{
+ auto i = v.attrs->find(sToString);
+ if (i != v.attrs->end()) {
+ Value v1;
+ callFunction(*i->value, v, v1, pos);
+ return coerceToString(pos, v1, context, coerceMore, copyToStore);
+ }
+
+ return {};
+}
+
string EvalState::coerceToString(const Pos & pos, Value & v, PathSet & context,
bool coerceMore, bool copyToStore)
{
@@ -1625,13 +1638,11 @@ string EvalState::coerceToString(const Pos & pos, Value & v, PathSet & context,
}
if (v.type == tAttrs) {
- auto i = v.attrs->find(sToString);
- if (i != v.attrs->end()) {
- Value v1;
- callFunction(*i->value, v, v1, pos);
- return coerceToString(pos, v1, context, coerceMore, copyToStore);
+ auto maybeString = tryAttrsToString(pos, v, context, coerceMore, copyToStore);
+ if (maybeString) {
+ return *maybeString;
}
- i = v.attrs->find(sOutPath);
+ auto i = v.attrs->find(sOutPath);
if (i == v.attrs->end()) throwTypeError("cannot coerce a set to a string, at %1%", pos);
return coerceToString(pos, *i->value, context, coerceMore, copyToStore);
}
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index 1cc3c8507..50c6f784e 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -9,6 +9,7 @@
#include "function-trace.hh"
#include