aboutsummaryrefslogtreecommitdiff
path: root/src/libcmd/installables.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcmd/installables.cc')
-rw-r--r--src/libcmd/installables.cc70
1 files changed, 4 insertions, 66 deletions
diff --git a/src/libcmd/installables.cc b/src/libcmd/installables.cc
index ff8261b09..85edc28cf 100644
--- a/src/libcmd/installables.cc
+++ b/src/libcmd/installables.cc
@@ -1,5 +1,6 @@
#include "globals.hh"
#include "installables.hh"
+#include "installable-derived-path.hh"
#include "outputs-spec.hh"
#include "util.hh"
#include "command.hh"
@@ -389,38 +390,6 @@ static StorePath getDeriver(
return *derivers.begin();
}
-struct InstallableStorePath : Installable
-{
- ref<Store> store;
- DerivedPath req;
-
- InstallableStorePath(ref<Store> store, DerivedPath && req)
- : store(store), req(std::move(req))
- { }
-
- std::string what() const override
- {
- return req.to_string(*store);
- }
-
- DerivedPathsWithInfo toDerivedPaths() override
- {
- return {{.path = req, .info = {} }};
- }
-
- std::optional<StorePath> getStorePath() override
- {
- return std::visit(overloaded {
- [&](const DerivedPath::Built & bfd) {
- return bfd.drvPath;
- },
- [&](const DerivedPath::Opaque & bo) {
- return bo.path;
- },
- }, req.raw());
- }
-};
-
struct InstallableAttrPath : InstallableValue
{
SourceExprCommand & cmd;
@@ -785,41 +754,10 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
auto prefix = std::move(prefix_);
auto extendedOutputsSpec = std::move(extendedOutputsSpec_);
- auto found = prefix.find('/');
- if (found != std::string::npos) {
+ if (prefix.find('/') != std::string::npos) {
try {
- auto derivedPath = std::visit(overloaded {
- // If the user did not use ^, we treat the output more liberally.
- [&](const ExtendedOutputsSpec::Default &) -> DerivedPath {
- // First, we accept a symlink chain or an actual store path.
- auto storePath = store->followLinksToStorePath(prefix);
- // Second, we see if the store path ends in `.drv` to decide what sort
- // of derived path they want.
- //
- // This handling predates the `^` syntax. The `^*` in
- // `/nix/store/hash-foo.drv^*` unambiguously means "do the
- // `DerivedPath::Built` case", so plain `/nix/store/hash-foo.drv` could
- // also unambiguously mean "do the DerivedPath::Opaque` case".
- //
- // Issue #7261 tracks reconsidering this `.drv` dispatching.
- return storePath.isDerivation()
- ? (DerivedPath) DerivedPath::Built {
- .drvPath = std::move(storePath),
- .outputs = OutputsSpec::All {},
- }
- : (DerivedPath) DerivedPath::Opaque {
- .path = std::move(storePath),
- };
- },
- // If the user did use ^, we just do exactly what is written.
- [&](const ExtendedOutputsSpec::Explicit & outputSpec) -> DerivedPath {
- return DerivedPath::Built {
- .drvPath = store->parseStorePath(prefix),
- .outputs = outputSpec,
- };
- },
- }, extendedOutputsSpec.raw());
- result.push_back(std::make_shared<InstallableStorePath>(store, std::move(derivedPath)));
+ result.push_back(std::make_shared<InstallableDerivedPath>(
+ InstallableDerivedPath::parse(store, prefix, extendedOutputsSpec)));
continue;
} catch (BadStorePath &) {
} catch (...) {