diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2019-07-12 16:28:39 +0200 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2019-07-12 16:36:34 +0200 |
commit | aa82f8b2d2a2c42f0d713e8404b668cef1a4b108 (patch) | |
tree | 66f883d00898d6de01b1e4fac0b387393090e2aa /src/nix | |
parent | 731bc65ec04900834ca5e5b8e9dae1aa8c2c1027 (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.hh | 7 | ||||
-rw-r--r-- | src/nix/installables.cc | 5 | ||||
-rw-r--r-- | src/nix/shell.cc | 30 |
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" }, }; } |