diff --git a/doc/manual/release-notes.xml b/doc/manual/release-notes.xml
index 423dd5ab8..5be23c36e 100644
--- a/doc/manual/release-notes.xml
+++ b/doc/manual/release-notes.xml
@@ -45,6 +45,9 @@
configuration setting
build-max-silent-time.
+
+ TODO: nix-env
+ .
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(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 */