about summary refs log tree commit diff
path: root/src/nix-env
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-12-12T19·06+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-12-12T19·06+0000
commit7ace29dae7bc928e5511c148408825f6d846771e (patch)
tree7fddcd48dbff25380f817312328d0996531d929f /src/nix-env
parent1a7e88bbd9290987e72616d42c9e9d344acc2a86 (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/nix-env')
-rw-r--r--src/nix-env/help.txt1
-rw-r--r--src/nix-env/nix-env.cc27
2 files changed, 28 insertions, 0 deletions
diff --git a/src/nix-env/help.txt b/src/nix-env/help.txt
index 9b49f9f4576c..534d16ad3c56 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 90d799224efd..e131bf96cf49 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 */