forked from lix-project/lix
a93110ab19
Fixes #8309 This regression was because both `CmdDevelop` and `CmdPrintDevEnv` were switched to be `InstallableValueCommand` subclasses, but actually neither should have been. The `nixpkgsFlakeRef` method should indeed not be on the base installable class, because "flake refs" and "nixpkgs" are not installable-wide notions, but that doesn't mean these commands should only accept installable values.
91 lines
2.4 KiB
C++
91 lines
2.4 KiB
C++
#pragma once
|
|
///@file
|
|
|
|
#include "installable-value.hh"
|
|
|
|
namespace nix {
|
|
|
|
/**
|
|
* Extra info about a \ref DerivedPath "derived path" that ultimately
|
|
* come from a Flake.
|
|
*
|
|
* Invariant: every ExtraPathInfo gotten from an InstallableFlake should
|
|
* be possible to downcast to an ExtraPathInfoFlake.
|
|
*/
|
|
struct ExtraPathInfoFlake : ExtraPathInfoValue
|
|
{
|
|
/**
|
|
* Extra struct to get around C++ designated initializer limitations
|
|
*/
|
|
struct Flake {
|
|
FlakeRef originalRef;
|
|
FlakeRef resolvedRef;
|
|
};
|
|
|
|
Flake flake;
|
|
|
|
ExtraPathInfoFlake(Value && v, Flake && f)
|
|
: ExtraPathInfoValue(std::move(v)), flake(f)
|
|
{ }
|
|
};
|
|
|
|
struct InstallableFlake : InstallableValue
|
|
{
|
|
FlakeRef flakeRef;
|
|
Strings attrPaths;
|
|
Strings prefixes;
|
|
ExtendedOutputsSpec extendedOutputsSpec;
|
|
const flake::LockFlags & lockFlags;
|
|
mutable std::shared_ptr<flake::LockedFlake> _lockedFlake;
|
|
|
|
InstallableFlake(
|
|
SourceExprCommand * cmd,
|
|
ref<EvalState> state,
|
|
FlakeRef && flakeRef,
|
|
std::string_view fragment,
|
|
ExtendedOutputsSpec extendedOutputsSpec,
|
|
Strings attrPaths,
|
|
Strings prefixes,
|
|
const flake::LockFlags & lockFlags);
|
|
|
|
std::string what() const override { return flakeRef.to_string() + "#" + *attrPaths.begin(); }
|
|
|
|
std::vector<std::string> getActualAttrPaths();
|
|
|
|
Value * getFlakeOutputs(EvalState & state, const flake::LockedFlake & lockedFlake);
|
|
|
|
DerivedPathsWithInfo toDerivedPaths() override;
|
|
|
|
std::pair<Value *, PosIdx> toValue(EvalState & state) override;
|
|
|
|
/**
|
|
* Get a cursor to every attrpath in getActualAttrPaths() that
|
|
* exists. However if none exists, throw an exception.
|
|
*/
|
|
std::vector<ref<eval_cache::AttrCursor>>
|
|
getCursors(EvalState & state) override;
|
|
|
|
std::shared_ptr<flake::LockedFlake> getLockedFlake() const;
|
|
|
|
FlakeRef nixpkgsFlakeRef() const;
|
|
};
|
|
|
|
/**
|
|
* Default flake ref for referring to Nixpkgs. For flakes that don't
|
|
* have their own Nixpkgs input, or other installables.
|
|
*
|
|
* It is a layer violation for Nix to know about Nixpkgs; currently just
|
|
* `nix develop` does. Be wary of using this /
|
|
* `InstallableFlake::nixpkgsFlakeRef` more places.
|
|
*/
|
|
static inline FlakeRef defaultNixpkgsFlakeRef()
|
|
{
|
|
return FlakeRef::fromAttrs({{"type","indirect"}, {"id", "nixpkgs"}});
|
|
}
|
|
|
|
ref<eval_cache::EvalCache> openEvalCache(
|
|
EvalState & state,
|
|
std::shared_ptr<flake::LockedFlake> lockedFlake);
|
|
|
|
}
|