diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2006-12-12 19:06:02 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2006-12-12 19:06:02 +0000 |
commit | 7ace29dae7bc928e5511c148408825f6d846771e (patch) | |
tree | 7fddcd48dbff25380f817312328d0996531d929f /src | |
parent | 1a7e88bbd9290987e72616d42c9e9d344acc2a86 (diff) |
* New operation `nix-env --set' which sets a user environment to a
single derivation specified by the argument. This is useful when we
want to have a profile for a single derivation, such as a server
configuration. Then we can just say (e.g.)
$ nix-env -p /.../server-profile -f server.nix --set -A server
We can't do queries or upgrades on such a profile, but we can do
rollbacks. The advantage over -i is that we don't have to worry
about other packages having been installed in the profile
previously; --set gets rid of them.
Diffstat (limited to 'src')
-rw-r--r-- | src/nix-env/help.txt | 1 | ||||
-rw-r--r-- | src/nix-env/nix-env.cc | 27 |
2 files changed, 28 insertions, 0 deletions
diff --git a/src/nix-env/help.txt b/src/nix-env/help.txt index 9b49f9f45..534d16ad3 100644 --- a/src/nix-env/help.txt +++ b/src/nix-env/help.txt @@ -6,6 +6,7 @@ Operations: --install / -i: add derivations to the user environment --upgrade / -u: upgrade derivation in the user environment + --set: create a user environment containing a single derivation --uninstall / -e: remove derivations from the user environment --query / -q: perform a query on an environment or Nix expression diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc index 90d799224..e131bf96c 100644 --- a/src/nix-env/nix-env.cc +++ b/src/nix-env/nix-env.cc @@ -596,6 +596,31 @@ static void opUpgrade(Globals & globals, } +static void opSet(Globals & globals, + Strings opFlags, Strings opArgs) +{ + if (opFlags.size() > 0) + throw UsageError(format("unknown flag `%1%'") % opFlags.front()); + + DrvInfos elems; + queryInstSources(globals.state, globals.instSource, opArgs, elems, true); + + if (elems.size() != 1) + throw Error("--set requires exactly one derivation"); + + DrvInfo & drv(elems.front()); + + if (drv.queryDrvPath(globals.state) != "") + store->buildDerivations(singleton<PathSet>(drv.queryDrvPath(globals.state))); + else + store->ensurePath(drv.queryOutPath(globals.state)); + + debug(format("switching to new user environment")); + Path generation = createGeneration(globals.profile, drv.queryOutPath(globals.state)); + switchLink(globals.profile, generation); +} + + static void uninstallDerivations(Globals & globals, DrvNames & selectors, Path & profile) { @@ -1152,6 +1177,8 @@ void run(Strings args) op = opUninstall; else if (arg == "--upgrade" || arg == "-u") op = opUpgrade; + else if (arg == "--set") + op = opSet; else if (arg == "--query" || arg == "-q") op = opQuery; else if (arg == "--import" || arg == "-I") /* !!! bad name */ |