aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nix.spec.in20
-rw-r--r--release.nix4
-rw-r--r--src/libexpr/eval.cc14
-rw-r--r--src/libexpr/eval.hh1
-rw-r--r--src/libexpr/parser.y4
-rw-r--r--src/libexpr/primops.cc13
-rw-r--r--src/libexpr/primops/fromTOML.cc4
-rw-r--r--src/libstore/download.cc14
-rw-r--r--src/libstore/store-api.cc14
-rw-r--r--src/libutil/serialise.cc4
-rw-r--r--src/nix-prefetch-url/nix-prefetch-url.cc24
11 files changed, 64 insertions, 52 deletions
diff --git a/nix.spec.in b/nix.spec.in
index cd053dbfc..477768c6a 100644
--- a/nix.spec.in
+++ b/nix.spec.in
@@ -152,11 +152,11 @@ systemctl start nix-daemon.socket
%{_prefix}/lib/systemd/system/nix-daemon.service
%endif
%{_datadir}/nix
-%if ! %{without docgen}
-%{_mandir}/man1/*.1*
-%{_mandir}/man5/*.5*
-%{_mandir}/man8/*.8*
-%endif
+#%if ! %{without docgen}
+#%{_mandir}/man1/*.1*
+#%{_mandir}/man5/*.5*
+#%{_mandir}/man8/*.8*
+#%endif
%config(noreplace) %{_sysconfdir}/profile.d/nix.sh
%config(noreplace) %{_sysconfdir}/profile.d/nix-daemon.sh
/nix
@@ -166,8 +166,8 @@ systemctl start nix-daemon.socket
%{_prefix}/lib/pkgconfig/*.pc
-%if ! %{without docgen}
-%files doc
-%docdir %{_defaultdocdir}/%{name}-doc-%{version}
-%{_defaultdocdir}/%{name}-doc-%{version}
-%endif
+#%if ! %{without docgen}
+#%files doc
+#%docdir %{_defaultdocdir}/%{name}-doc-%{version}
+#%{_defaultdocdir}/%{name}-doc-%{version}
+#%endif
diff --git a/release.nix b/release.nix
index 321f16883..076f1de8d 100644
--- a/release.nix
+++ b/release.nix
@@ -206,7 +206,7 @@ let
};
- rpm_fedora27x86_64 = makeRPM_x86_64 (diskImageFunsFun: diskImageFunsFun.fedora27x86_64) [ ];
+ #rpm_fedora27x86_64 = makeRPM_x86_64 (diskImageFunsFun: diskImageFunsFun.fedora27x86_64) [ ];
#deb_debian8i386 = makeDeb_i686 (diskImageFuns: diskImageFuns.debian8i386) [ "libsodium-dev" ] [ "libsodium13" ];
@@ -332,7 +332,7 @@ let
src = jobs.tarball;
diskImage = (diskImageFun vmTools.diskImageFuns)
{ extraPackages =
- [ "sqlite" "sqlite-devel" "bzip2-devel" "libcurl-devel" "openssl-devel" "xz-devel" "libseccomp-devel" "libsodium-devel" "boost-devel" ]
+ [ "sqlite" "sqlite-devel" "bzip2-devel" "libcurl-devel" "openssl-devel" "xz-devel" "libseccomp-devel" "libsodium-devel" "boost-devel" "bison" "flex" ]
++ extraPackages; };
# At most 2047MB can be simulated in qemu-system-i386
memSize = 2047;
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 30dbb17fb..095320dc8 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -1718,20 +1718,6 @@ bool EvalState::eqValues(Value & v1, Value & v2)
}
-void EvalState::printStats2()
-{
- struct rusage ru;
- getrusage(RUSAGE_SELF, &ru);
-
- GC_prof_stats_s gc;
- GC_get_prof_stats(&gc, sizeof(gc));
-
- printError("STATS %d %d %d %d %d %d",
- nrValues, nrValuesFreed.load(), nrValues - nrValuesFreed,
- ru.ru_maxrss,
- gc.heapsize_full, gc.free_bytes_full);
-}
-
void EvalState::printStats()
{
bool showStats = getEnv("NIX_SHOW_STATS", "0") != "0";
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index 46bda86d0..d0f298e16 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -276,7 +276,6 @@ public:
/* Print statistics. */
void printStats();
- void printStats2();
void realiseContext(const PathSet & context);
diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y
index eee48887d..cbd576d7d 100644
--- a/src/libexpr/parser.y
+++ b/src/libexpr/parser.y
@@ -273,11 +273,11 @@ void yyerror(YYLTYPE * loc, yyscan_t scanner, ParseData * data, const char * err
%token IND_STRING_OPEN IND_STRING_CLOSE
%token ELLIPSIS
-%nonassoc IMPL
+%right IMPL
%left OR
%left AND
%nonassoc EQ NEQ
-%left '<' '>' LEQ GEQ
+%nonassoc '<' '>' LEQ GEQ
%right UPDATE
%left NOT
%left '+' '-'
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 09b01cae8..8ace6db4d 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -1506,19 +1506,20 @@ static void prim_foldlStrict(EvalState & state, const Pos & pos, Value * * args,
state.forceFunction(*args[0], pos);
state.forceList(*args[2], pos);
- Value * vCur = args[1];
+ if (args[2]->listSize()) {
+ Value * vCur = args[1];
- if (args[2]->listSize())
for (unsigned int n = 0; n < args[2]->listSize(); ++n) {
Value vTmp;
state.callFunction(*args[0], *vCur, vTmp, pos);
vCur = n == args[2]->listSize() - 1 ? &v : state.allocValue();
state.callFunction(vTmp, *args[2]->listElems()[n], *vCur, pos);
}
- else
- v = *vCur;
-
- state.forceValue(v);
+ state.forceValue(v);
+ } else {
+ state.forceValue(*args[1]);
+ v = *args[1];
+ }
}
diff --git a/src/libexpr/primops/fromTOML.cc b/src/libexpr/primops/fromTOML.cc
index ae8aba612..4128de05d 100644
--- a/src/libexpr/primops/fromTOML.cc
+++ b/src/libexpr/primops/fromTOML.cc
@@ -20,7 +20,7 @@ static void prim_fromTOML(EvalState & state, const Pos & pos, Value * * args, Va
if (auto t2 = t->as_table()) {
size_t size = 0;
- for (auto & i : *t2) size++;
+ for (auto & i : *t2) { (void) i; size++; }
state.mkAttrs(v, size);
@@ -50,7 +50,7 @@ static void prim_fromTOML(EvalState & state, const Pos & pos, Value * * args, Va
}
else if (t->is_value()) {
- if (auto val = t->as<NixInt>())
+ if (auto val = t->as<int64_t>())
mkInt(v, val->get());
else if (auto val = t->as<NixFloat>())
mkFloat(v, val->get());
diff --git a/src/libstore/download.cc b/src/libstore/download.cc
index 07acd5d0e..ecec0f205 100644
--- a/src/libstore/download.cc
+++ b/src/libstore/download.cc
@@ -718,15 +718,17 @@ void Downloader::download(DownloadRequest && request, Sink & sink)
while (true) {
checkInterrupt();
- if (state->quit) {
- if (state->exc) std::rethrow_exception(state->exc);
- break;
- }
-
/* If no data is available, then wait for the download thread
to wake us up. */
- if (state->data.empty())
+ if (state->data.empty()) {
+
+ if (state->quit) {
+ if (state->exc) std::rethrow_exception(state->exc);
+ break;
+ }
+
state.wait(state->avail);
+ }
/* If data is available, then flush it to the sink and wake up
the download thread if it's blocked on a full buffer. */
diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc
index 9b0b7d632..185435382 100644
--- a/src/libstore/store-api.cc
+++ b/src/libstore/store-api.cc
@@ -629,11 +629,12 @@ void copyPaths(ref<Store> srcStore, ref<Store> dstStore, const PathSet & storePa
Activity act(*logger, lvlInfo, actCopyPaths, fmt("copying %d paths", missing.size()));
std::atomic<size_t> nrDone{0};
+ std::atomic<size_t> nrFailed{0};
std::atomic<uint64_t> bytesExpected{0};
std::atomic<uint64_t> nrRunning{0};
auto showProgress = [&]() {
- act.progress(nrDone, missing.size(), nrRunning);
+ act.progress(nrDone, missing.size(), nrRunning, nrFailed);
};
ThreadPool pool;
@@ -662,7 +663,16 @@ void copyPaths(ref<Store> srcStore, ref<Store> dstStore, const PathSet & storePa
if (!dstStore->isValidPath(storePath)) {
MaintainCount<decltype(nrRunning)> mc(nrRunning);
showProgress();
- copyStorePath(srcStore, dstStore, storePath, repair, checkSigs);
+ try {
+ copyStorePath(srcStore, dstStore, storePath, repair, checkSigs);
+ } catch (Error &e) {
+ nrFailed++;
+ if (!settings.keepGoing)
+ throw e;
+ logger->log(lvlError, format("could not copy %s: %s") % storePath % e.what());
+ showProgress();
+ return;
+ }
}
nrDone++;
diff --git a/src/libutil/serialise.cc b/src/libutil/serialise.cc
index 21803edd0..b2c49d911 100644
--- a/src/libutil/serialise.cc
+++ b/src/libutil/serialise.cc
@@ -157,6 +157,10 @@ size_t StringSource::read(unsigned char * data, size_t len)
}
+#if BOOST_VERSION >= 106300 && BOOST_VERSION < 106600
+#error Coroutines are broken in this version of Boost!
+#endif
+
std::unique_ptr<Source> sinkToSource(std::function<void(Sink &)> fun)
{
struct SinkToSource : Source
diff --git a/src/nix-prefetch-url/nix-prefetch-url.cc b/src/nix-prefetch-url/nix-prefetch-url.cc
index 50b2c2803..a3b025723 100644
--- a/src/nix-prefetch-url/nix-prefetch-url.cc
+++ b/src/nix-prefetch-url/nix-prefetch-url.cc
@@ -9,6 +9,10 @@
#include <iostream>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
using namespace nix;
@@ -160,14 +164,20 @@ int main(int argc, char * * argv)
auto actualUri = resolveMirrorUri(*state, uri);
- /* Download the file. */
- DownloadRequest req(actualUri);
- req.decompress = false;
- auto result = getDownloader()->download(req);
-
AutoDelete tmpDir(createTempDir(), true);
Path tmpFile = (Path) tmpDir + "/tmp";
- writeFile(tmpFile, *result.data);
+
+ /* Download the file. */
+ {
+ AutoCloseFD fd = open(tmpFile.c_str(), O_WRONLY | O_CREAT | O_EXCL, 0600);
+ if (!fd) throw SysError("creating temporary file '%s'", tmpFile);
+
+ FdSink sink(fd.get());
+
+ DownloadRequest req(actualUri);
+ req.decompress = false;
+ getDownloader()->download(std::move(req), sink);
+ }
/* Optionally unpack the file. */
if (unpack) {
@@ -191,7 +201,7 @@ int main(int argc, char * * argv)
/* FIXME: inefficient; addToStore() will also hash
this. */
- hash = unpack ? hashPath(ht, tmpFile).first : hashString(ht, *result.data);
+ hash = unpack ? hashPath(ht, tmpFile).first : hashFile(ht, tmpFile);
if (expectedHash != Hash(ht) && expectedHash != hash)
throw Error(format("hash mismatch for '%1%'") % uri);