diff --git a/README.md b/README.md
index a953c0f71..61054f8f2 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,3 @@ of the manual. It helps you to get started with building Nix from source.
## License
Nix is released under the LGPL v2.1
-
-This product includes software developed by the OpenSSL Project for
-use in the [OpenSSL Toolkit](https://www.OpenSSL.org/).
diff --git a/doc/manual/command-ref/nix-env.xml b/doc/manual/command-ref/nix-env.xml
index d257a5e49..9c03ccce1 100644
--- a/doc/manual/command-ref/nix-env.xml
+++ b/doc/manual/command-ref/nix-env.xml
@@ -1066,7 +1066,8 @@ user environment elements, etc. -->
the derivation, which can be used to unambiguously select it using
the --attr option
available in commands that install derivations like
- nix-env --install .
+ nix-env --install . This option only works
+ together with --available
diff --git a/doc/manual/command-ref/nix-store.xml b/doc/manual/command-ref/nix-store.xml
index 113a3c2e4..e8bbd16e8 100644
--- a/doc/manual/command-ref/nix-store.xml
+++ b/doc/manual/command-ref/nix-store.xml
@@ -360,7 +360,6 @@ EOF
--print-roots
--print-live
--print-dead
- --delete
--max-freed bytes
@@ -407,14 +406,6 @@ the Nix store not reachable via file system references from a set of
- --delete
-
- This operation performs an actual garbage
- collection. All dead paths are removed from the
- store. This is the default.
-
-
-
By default, all unreachable paths are deleted. The following
@@ -444,10 +435,10 @@ and keep-derivations
variables in the Nix configuration file.
-With --delete , the collector prints the total
-number of freed bytes when it finishes (or when it is interrupted).
-With --print-dead , it prints the number of bytes that
-would be freed.
+By default, the collector prints the total number of freed bytes
+when it finishes (or when it is interrupted). With
+--print-dead , it prints the number of bytes that would
+be freed.
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index f6c96bd68..ab4d2bc4b 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -6,6 +6,7 @@
#include "symbol-table.hh"
#include "config.hh"
+#include
#include
#include
#include
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index 5ef8cb989..e47b00acf 100644
--- a/src/nix-env/nix-env.cc
+++ b/src/nix-env/nix-env.cc
@@ -914,6 +914,8 @@ static void opQuery(Globals & globals, Strings opFlags, Strings opArgs)
throw UsageError(format("unknown flag '%1%'") % arg);
}
+ if (printAttrPath && source != sAvailable)
+ throw UsageError("--attr-path(-P) only works with --available");
/* Obtain derivation information from the specified source. */
DrvInfos availElems, installedElems;
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index 9336baa83..806ab7563 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -572,7 +572,6 @@ static void opGC(Strings opFlags, Strings opArgs)
if (*i == "--print-roots") printRoots = true;
else if (*i == "--print-live") options.action = GCOptions::gcReturnLive;
else if (*i == "--print-dead") options.action = GCOptions::gcReturnDead;
- else if (*i == "--delete") options.action = GCOptions::gcDeleteDead;
else if (*i == "--max-freed") {
long long maxFreed = getIntArg(*i, i, opFlags.end(), true);
options.maxFreed = maxFreed >= 0 ? maxFreed : 0;
diff --git a/src/nix/repl.cc b/src/nix/repl.cc
index 9f76e1b4f..a2632cff8 100644
--- a/src/nix/repl.cc
+++ b/src/nix/repl.cc
@@ -32,6 +32,9 @@ extern "C" {
#include "command.hh"
#include "finally.hh"
+#define GC_INCLUDE_NEW
+#include
+
namespace nix {
#define ESC_RED "\033[31m"
@@ -42,10 +45,10 @@ namespace nix {
#define ESC_CYA "\033[36m"
#define ESC_END "\033[0m"
-struct NixRepl
+struct NixRepl : gc
{
string curDir;
- EvalState state;
+ std::unique_ptr state;
Bindings * autoArgs;
Strings loadedFiles;
@@ -123,8 +126,8 @@ string removeWhitespace(string s)
NixRepl::NixRepl(const Strings & searchPath, nix::ref store)
- : state(searchPath, store)
- , staticEnv(false, &state.staticBaseEnv)
+ : state(std::make_unique(searchPath, store))
+ , staticEnv(false, &state->staticBaseEnv)
, historyFile(getDataDir() + "/nix/repl-history")
{
curDir = absPath(".");
@@ -353,8 +356,8 @@ StringSet NixRepl::completePrefix(string prefix)
Expr * e = parseString(expr);
Value v;
- e->eval(state, *env, v);
- state.forceAttrs(v);
+ e->eval(*state, *env, v);
+ state->forceAttrs(v);
for (auto & i : *v.attrs) {
string name = i.name;
@@ -409,11 +412,11 @@ bool isVarName(const string & s)
Path NixRepl::getDerivationPath(Value & v) {
- auto drvInfo = getDerivation(state, v, false);
+ auto drvInfo = getDerivation(*state, v, false);
if (!drvInfo)
throw Error("expression does not evaluate to a derivation, so I can't build it");
Path drvPath = drvInfo->queryDrvPath();
- if (drvPath == "" || !state.store->isValidPath(state.store->parseStorePath(drvPath)))
+ if (drvPath == "" || !state->store->isValidPath(state->store->parseStorePath(drvPath)))
throw Error("expression did not evaluate to a valid derivation");
return drvPath;
}
@@ -459,12 +462,12 @@ bool NixRepl::processLine(string line)
}
else if (command == ":l" || command == ":load") {
- state.resetFileCache();
+ state->resetFileCache();
loadFile(arg);
}
else if (command == ":r" || command == ":reload") {
- state.resetFileCache();
+ state->resetFileCache();
reloadFiles();
}
@@ -476,13 +479,13 @@ bool NixRepl::processLine(string line)
if (v.type == tPath || v.type == tString) {
PathSet context;
- auto filename = state.coerceToString(noPos, v, context);
- pos.file = state.symbols.create(filename);
+ auto filename = state->coerceToString(noPos, v, context);
+ pos.file = state->symbols.create(filename);
} else if (v.type == tLambda) {
pos = v.lambda.fun->pos;
} else {
// assume it's a derivation
- pos = findDerivationFilename(state, v, arg);
+ pos = findDerivationFilename(*state, v, arg);
}
// Open in EDITOR
@@ -492,7 +495,7 @@ bool NixRepl::processLine(string line)
runProgram(editor, args);
// Reload right after exiting the editor
- state.resetFileCache();
+ state->resetFileCache();
reloadFiles();
}
@@ -505,7 +508,7 @@ bool NixRepl::processLine(string line)
Value v, f, result;
evalString(arg, v);
evalString("drv: (import {}).runCommand \"shell\" { buildInputs = [ drv ]; } \"\"", f);
- state.callFunction(f, v, result, Pos());
+ state->callFunction(f, v, result, Pos());
Path drvPath = getDerivationPath(result);
runProgram(settings.nixBinDir + "/nix-shell", Strings{drvPath});
@@ -521,10 +524,10 @@ bool NixRepl::processLine(string line)
but doing it in a child makes it easier to recover from
problems / SIGINT. */
if (runProgram(settings.nixBinDir + "/nix", Strings{"build", "--no-link", drvPath}) == 0) {
- auto drv = readDerivation(*state.store, drvPath);
+ auto drv = readDerivation(*state->store, drvPath);
std::cout << std::endl << "this derivation produced the following outputs:" << std::endl;
for (auto & i : drv.outputs)
- std::cout << fmt(" %s -> %s\n", i.first, state.store->printStorePath(i.second.path));
+ std::cout << fmt(" %s -> %s\n", i.first, state->store->printStorePath(i.second.path));
}
} else if (command == ":i") {
runProgram(settings.nixBinDir + "/nix-env", Strings{"-i", drvPath});
@@ -554,11 +557,11 @@ bool NixRepl::processLine(string line)
isVarName(name = removeWhitespace(string(line, 0, p))))
{
Expr * e = parseString(string(line, p + 1));
- Value & v(*state.allocValue());
+ Value & v(*state->allocValue());
v.type = tThunk;
v.thunk.env = env;
v.thunk.expr = e;
- addVarToScope(state.symbols.create(name), v);
+ addVarToScope(state->symbols.create(name), v);
} else {
Value v;
evalString(line, v);
@@ -575,21 +578,21 @@ void NixRepl::loadFile(const Path & path)
loadedFiles.remove(path);
loadedFiles.push_back(path);
Value v, v2;
- state.evalFile(lookupFileArg(state, path), v);
- state.autoCallFunction(*autoArgs, v, v2);
+ state->evalFile(lookupFileArg(*state, path), v);
+ state->autoCallFunction(*autoArgs, v, v2);
addAttrsToScope(v2);
}
void NixRepl::initEnv()
{
- env = &state.allocEnv(envSize);
- env->up = &state.baseEnv;
+ env = &state->allocEnv(envSize);
+ env->up = &state->baseEnv;
displ = 0;
staticEnv.vars.clear();
varNames.clear();
- for (auto & i : state.staticBaseEnv.vars)
+ for (auto & i : state->staticBaseEnv.vars)
varNames.insert(i.first);
}
@@ -613,7 +616,7 @@ void NixRepl::reloadFiles()
void NixRepl::addAttrsToScope(Value & attrs)
{
- state.forceAttrs(attrs);
+ state->forceAttrs(attrs);
for (auto & i : *attrs.attrs)
addVarToScope(i.name, *i.value);
std::cout << format("Added %1% variables.") % attrs.attrs->size() << std::endl;
@@ -632,7 +635,7 @@ void NixRepl::addVarToScope(const Symbol & name, Value & v)
Expr * NixRepl::parseString(string s)
{
- Expr * e = state.parseExprFromString(s, curDir, staticEnv);
+ Expr * e = state->parseExprFromString(s, curDir, staticEnv);
return e;
}
@@ -640,8 +643,8 @@ Expr * NixRepl::parseString(string s)
void NixRepl::evalString(string s, Value & v)
{
Expr * e = parseString(s);
- e->eval(state, *env, v);
- state.forceValue(v);
+ e->eval(*state, *env, v);
+ state->forceValue(v);
}
@@ -671,7 +674,7 @@ std::ostream & NixRepl::printValue(std::ostream & str, Value & v, unsigned int m
str.flush();
checkInterrupt();
- state.forceValue(v);
+ state->forceValue(v);
switch (v.type) {
@@ -700,13 +703,13 @@ std::ostream & NixRepl::printValue(std::ostream & str, Value & v, unsigned int m
case tAttrs: {
seen.insert(&v);
- bool isDrv = state.isDerivation(v);
+ bool isDrv = state->isDerivation(v);
if (isDrv) {
str << "«derivation ";
- Bindings::iterator i = v.attrs->find(state.sDrvPath);
+ Bindings::iterator i = v.attrs->find(state->sDrvPath);
PathSet context;
- Path drvPath = i != v.attrs->end() ? state.coerceToPath(*i->pos, *i->value, context) : "???";
+ Path drvPath = i != v.attrs->end() ? state->coerceToPath(*i->pos, *i->value, context) : "???";
str << drvPath << "»";
}
@@ -810,7 +813,7 @@ struct CmdRepl : StoreCommand, MixEvalArgs
{
evalSettings.pureEval = false;
auto repl = std::make_unique(searchPath, openStore());
- repl->autoArgs = getAutoArgs(repl->state);
+ repl->autoArgs = getAutoArgs(*repl->state);
repl->mainLoop(files);
}
};