diff --git a/doc/manual/release-notes.xml b/doc/manual/release-notes.xml
index 1ebef331e..3ad9e1de0 100644
--- a/doc/manual/release-notes.xml
+++ b/doc/manual/release-notes.xml
@@ -47,8 +47,8 @@ irreversible.
references table (i.e., it tells you what store
paths refer to a given path). Maintaining this table could take a
quadratic amount of time, as well as a quadratic amount of Berkeley
- DB log file space (in particular when running the garbage
- collector).
+ DB log file space (in particular when running the garbage collector)
+ (NIX-23).
Nix now catches the TERM and
HUP signals in addition to the
@@ -85,7 +85,8 @@ irreversible.
(~) has been deprecated.
TODO: function argument default values can refer
- to other function arguments
+ to other function arguments
+ (NIX-45)
TODO: domain checks (r5895).
@@ -148,7 +149,18 @@ irreversible.
Make sure that the garbage collector can run
- succesfully when the disk is full.
+ succesfully when the disk is full
+ (NIX-18).
+
+ nix-env now locks the profile
+ to prevent races between concurrent nix-env
+ operations on the same profile
+ (NIX-7).
+
+ Removed misleading messages from
+ nix-env -i (e.g., installing
+ `foo' followed by uninstalling
+ `foo') (NIX-17).
@@ -162,7 +174,7 @@ irreversible.
pkgname will now install the
highest available version of pkgname,
rather than installing all available versions (which would probably
- give collisions).
+ give collisions) (NIX-31).
nix-env (-i|-u) --dry-run now
shows exactly which missing paths will be built or
@@ -185,11 +197,6 @@ irreversible.
i686-cygwin) and Mac OS X on Intel
(i686-darwin).
- nix-env now locks the profile to
- prevent races between concurrent nix-env
- operations on the same profile
- (NIX-7).
-
TODO: nix-push
--target.
diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc
index 0fb115533..284730c04 100644
--- a/src/nix-env/main.cc
+++ b/src/nix-env/main.cc
@@ -39,6 +39,8 @@ struct InstallSourceInfo
Path nixExprPath; /* for srcNixExprDrvs, srcNixExprs */
Path profile; /* for srcProfile */
string systemFilter; /* for srcNixExprDrvs */
+ ATermMap autoArgs;
+ InstallSourceInfo() : autoArgs(128) { };
};
@@ -64,10 +66,10 @@ void printHelp()
static void loadDerivations(EvalState & state, Path nixExprPath,
- string systemFilter, DrvInfos & elems)
+ string systemFilter, const ATermMap & autoArgs, DrvInfos & elems)
{
getDerivations(state,
- parseExprFromFile(state, absPath(nixExprPath)), "", ATermMap(1), elems);
+ parseExprFromFile(state, absPath(nixExprPath)), "", autoArgs, elems);
/* Filter out all derivations not applicable to the current
system. */
@@ -312,7 +314,7 @@ static void queryInstSources(EvalState & state,
Nix expression. */
DrvInfos allElems;
loadDerivations(state, instSource.nixExprPath,
- instSource.systemFilter, allElems);
+ instSource.systemFilter, instSource.autoArgs, allElems);
elems = filterBySelector(state, allElems, args, newestOnly);
@@ -336,7 +338,7 @@ static void queryInstSources(EvalState & state,
{
Expr e2 = parseExprFromString(state, *i, absPath("."));
Expr call = makeCall(e2, e1);
- getDerivations(state, call, "", ATermMap(1), elems);
+ getDerivations(state, call, "", instSource.autoArgs, elems);
}
break;
@@ -390,9 +392,9 @@ static void queryInstSources(EvalState & state,
for (Strings::const_iterator i = args.begin();
i != args.end(); ++i)
getDerivations(state,
- findAlongAttrPath(state, *i,
+ findAlongAttrPath(state, *i, instSource.autoArgs,
parseExprFromFile(state, instSource.nixExprPath)),
- "", ATermMap(1), elems);
+ "", instSource.autoArgs, elems);
break;
}
}
@@ -772,7 +774,8 @@ static void opQuery(Globals & globals,
if (source == sAvailable || compareVersions) {
loadDerivations(globals.state, globals.instSource.nixExprPath,
- globals.instSource.systemFilter, availElems);
+ globals.instSource.systemFilter, globals.instSource.autoArgs,
+ availElems);
}
DrvInfos elems = filterBySelector(globals.state,
@@ -1115,6 +1118,16 @@ void run(Strings args)
}
else if (arg == "--attr" || arg == "-A")
globals.instSource.type = srcAttrPath;
+ else if (arg == "--arg") { /* !!! code duplication from nix-instantiate */
+ i++;
+ if (i == args.end())
+ throw UsageError("`--arg' requires two arguments");
+ string name = *i++;
+ if (i == args.end())
+ throw UsageError("`--arg' requires two arguments");
+ Expr value = parseExprFromString(globals.state, *i, absPath("."));
+ globals.instSource.autoArgs.set(toATerm(name), value);
+ }
else if (arg == "--uninstall" || arg == "-e")
op = opUninstall;
else if (arg == "--upgrade" || arg == "-u")