aboutsummaryrefslogtreecommitdiff
path: root/src/nix
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2019-07-12 16:28:39 +0200
committerEelco Dolstra <edolstra@gmail.com>2019-07-12 16:36:34 +0200
commitaa82f8b2d2a2c42f0d713e8404b668cef1a4b108 (patch)
tree66f883d00898d6de01b1e4fac0b387393090e2aa /src/nix
parent731bc65ec04900834ca5e5b8e9dae1aa8c2c1027 (diff)
nix dev-shell: Make it possible to enter a profile
For example: $ nix dev-shell --profile /tmp/my-shell dwarffs (later) $ nix dev-shell /tmp/my-shell
Diffstat (limited to 'src/nix')
-rw-r--r--src/nix/command.hh7
-rw-r--r--src/nix/installables.cc5
-rw-r--r--src/nix/shell.cc30
3 files changed, 34 insertions, 8 deletions
diff --git a/src/nix/command.hh b/src/nix/command.hh
index d6153e42b..00c202f20 100644
--- a/src/nix/command.hh
+++ b/src/nix/command.hh
@@ -64,6 +64,13 @@ struct Installable
{
throw Error("argument '%s' cannot be evaluated", what());
}
+
+ /* Return a value only if this installable is a store path or a
+ symlink to it. */
+ virtual std::optional<Path> getStorePath()
+ {
+ return {};
+ }
};
struct EvalCommand : virtual StoreCommand, MixEvalArgs
diff --git a/src/nix/installables.cc b/src/nix/installables.cc
index d43f86c0c..aa5ef5184 100644
--- a/src/nix/installables.cc
+++ b/src/nix/installables.cc
@@ -102,6 +102,11 @@ struct InstallableStorePath : Installable
{
return {{isDerivation(storePath) ? storePath : "", {{"out", storePath}}}};
}
+
+ std::optional<Path> getStorePath() override
+ {
+ return storePath;
+ }
};
struct InstallableValue : Installable
diff --git a/src/nix/shell.cc b/src/nix/shell.cc
index 442835d38..93732f6a3 100644
--- a/src/nix/shell.cc
+++ b/src/nix/shell.cc
@@ -174,17 +174,27 @@ struct Common : InstallableCommand, MixProfile
return {"devShell", "defaultPackage"};
}
- BuildEnvironment getBuildEnvironment(ref<Store> store)
+ Path getShellOutPath(ref<Store> store)
{
- auto drvs = toDerivations(store, {installable});
+ auto path = installable->getStorePath();
+ if (path && hasSuffix(*path, "-env"))
+ return *path;
+ else {
+ auto drvs = toDerivations(store, {installable});
+
+ if (drvs.size() != 1)
+ throw Error("'%s' needs to evaluate to a single derivation, but it evaluated to %d derivations",
+ installable->what(), drvs.size());
- if (drvs.size() != 1)
- throw Error("'%s' needs to evaluate to a single derivation, but it evaluated to %d derivations",
- installable->what(), drvs.size());
+ auto & drvPath = *drvs.begin();
- auto & drvPath = *drvs.begin();
+ return getDerivationEnvironment(store, store->derivationFromPath(drvPath));
+ }
+ }
- auto shellOutPath = getDerivationEnvironment(store, store->derivationFromPath(drvPath));
+ BuildEnvironment getBuildEnvironment(ref<Store> store)
+ {
+ auto shellOutPath = getShellOutPath(store);
updateProfile(shellOutPath);
@@ -212,7 +222,11 @@ struct CmdDevShell : Common
},
Example{
"To store the build environment in a profile:",
- "nix dev-shell --profile /tmp/my-shell"
+ "nix dev-shell --profile /tmp/my-shell nixpkgs:hello"
+ },
+ Example{
+ "To use a build environment previously recorded in a profile:",
+ "nix dev-shell /tmp/my-shell"
},
};
}