diff options
Diffstat (limited to 'src/nix-env')
-rw-r--r-- | src/nix-env/help.txt | 10 | ||||
-rw-r--r-- | src/nix-env/main.cc | 69 |
2 files changed, 55 insertions, 24 deletions
diff --git a/src/nix-env/help.txt b/src/nix-env/help.txt index 3f15e6a8e2de..823f5213acf9 100644 --- a/src/nix-env/help.txt +++ b/src/nix-env/help.txt @@ -4,15 +4,16 @@ nix-env [OPTIONS...] [ARGUMENTS...] Operations: - --install / -i FILE: add derivations to the user environment + --install / -i: add derivations to the user environment + --upgrade / -u: upgrade derivation in the user environment --uninstall / -e: remove derivations from the user environment - --upgrade / -u FILE: upgrade derivation in the user environment --query / -q: perform a query on an environment or Nix expression The previous operations take a list of derivation names. The special name `*' may be used to indicate all derivations. - --profile / -p [FILE]: switch to specified user environment + --profile / -p [FILE]: switch to specified user environment + --import / -I FILE: set default Nix expression --version: output version information --help: display help @@ -26,10 +27,11 @@ Query types: Query sources: --installed: use installed derivations (default) - --available / -f FILE: use derivations available in expression FILE + --available / -a: use derivations available in Nix expression Options: --link / -l LINK: use symlink LINK instead of (...)/current + --file / -f FILE: use Nix expression FILE for installation, etc. --verbose / -v: verbose operation (may be repeated) --keep-failed / -K: keep temporary directories of failed builds diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc index 64ae6d4120b3..f0877b058624 100644 --- a/src/nix-env/main.cc +++ b/src/nix-env/main.cc @@ -11,6 +11,7 @@ struct Globals { Path linkPath; + Path nixExprPath; EvalState state; }; @@ -106,12 +107,26 @@ void loadDerivations(EvalState & state, Path nePath, DrvInfos & drvs) } +static Path getHomeDir() +{ + Path homeDir(getenv("HOME")); + if (homeDir == "") throw Error("HOME environment variable not set"); + return homeDir; +} + + static Path getLinksDir() { return canonPath(nixStateDir + "/links"); } +static Path getDefNixExprPath() +{ + return getHomeDir() + "/.nix-defexpr"; +} + + void queryInstalled(EvalState & state, DrvInfos & drvs, const Path & userEnv) { @@ -410,13 +425,11 @@ static void opInstall(Globals & globals, { if (opFlags.size() > 0) throw UsageError(format("unknown flags `%1%'") % opFlags.front()); - if (opArgs.size() < 1) throw UsageError("Nix file expected"); - Path nePath = opArgs.front(); - DrvNames drvNames = drvNamesFromArgs( - Strings(++opArgs.begin(), opArgs.end())); + DrvNames drvNames = drvNamesFromArgs(opArgs); - installDerivations(globals.state, nePath, drvNames, globals.linkPath); + installDerivations(globals.state, globals.nixExprPath, + drvNames, globals.linkPath); } @@ -492,11 +505,10 @@ static void opUpgrade(Globals & globals, throw UsageError(format("unknown flags `%1%'") % opFlags.front()); if (opArgs.size() < 1) throw UsageError("Nix file expected"); - Path nePath = opArgs.front(); - DrvNames drvNames = drvNamesFromArgs( - Strings(++opArgs.begin(), opArgs.end())); + DrvNames drvNames = drvNamesFromArgs(opArgs); - upgradeDerivations(globals.state, nePath, drvNames, globals.linkPath); + upgradeDerivations(globals.state, globals.nixExprPath, + drvNames, globals.linkPath); } @@ -547,7 +559,7 @@ static void opQuery(Globals & globals, else if (*i == "--expr" || *i == "-e") query = qDrvPath; else if (*i == "--status" || *i == "-s") query = qStatus; else if (*i == "--installed") source = sInstalled; - else if (*i == "--available" || *i == "-f") source = sAvailable; + else if (*i == "--available" || *i == "-a") source = sAvailable; else throw UsageError(format("unknown flag `%1%'") % *i); /* Obtain derivation information from the specified source. */ @@ -560,10 +572,7 @@ static void opQuery(Globals & globals, break; case sAvailable: { - if (opArgs.size() < 1) throw UsageError("Nix file expected"); - Path nePath = opArgs.front(); - opArgs.pop_front(); - loadDerivations(globals.state, nePath, drvs); + loadDerivations(globals.state, globals.nixExprPath, drvs); break; } @@ -611,17 +620,28 @@ static void opSwitchProfile(Globals & globals, if (opFlags.size() > 0) throw UsageError(format("unknown flags `%1%'") % opFlags.front()); if (opArgs.size() > 1) - throw UsageError(format("--profile takes at most one argument")); + throw UsageError(format("`--profile' takes at most one argument")); - string linkPath = + Path linkPath = opArgs.size() == 0 ? globals.linkPath : opArgs.front(); + Path linkPathFinal = getHomeDir() + "/.nix-userenv"; - string homeDir(getenv("HOME")); - if (homeDir == "") throw Error("HOME environment variable not set"); + switchLink(linkPathFinal, linkPath); +} - string linkPathFinal = homeDir + "/.nix-userenv"; + +static void opDefaultExpr(Globals & globals, + Strings opFlags, Strings opArgs) +{ + if (opFlags.size() > 0) + throw UsageError(format("unknown flags `%1%'") % opFlags.front()); + if (opArgs.size() != 1) + throw UsageError(format("`--import' takes exactly one argument")); + + Path defNixExpr = opArgs.front(); + Path defNixExprLink = getDefNixExprPath(); - switchLink(linkPathFinal, linkPath); + switchLink(defNixExprLink, defNixExpr); } @@ -635,6 +655,7 @@ void run(Strings args) Globals globals; globals.linkPath = getLinksDir() + "/current"; + globals.nixExprPath = getDefNixExprPath(); for (Strings::iterator i = args.begin(); i != args.end(); ++i) { string arg = *i; @@ -649,12 +670,20 @@ void run(Strings args) op = opUpgrade; else if (arg == "--query" || arg == "-q") op = opQuery; + else if (arg == "--import" || arg == "-I") /* !!! bad name */ + op = opDefaultExpr; else if (arg == "--link" || arg == "-l") { ++i; if (i == args.end()) throw UsageError( format("`%1%' requires an argument") % arg); globals.linkPath = absPath(*i); } + else if (arg == "--file" || arg == "-f") { + ++i; + if (i == args.end()) throw UsageError( + format("`%1%' requires an argument") % arg); + globals.nixExprPath = absPath(*i); + } else if (arg == "--profile" || arg == "-p") op = opSwitchProfile; else if (arg[0] == '-') |