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")