2021-03-08 23:24:49 +02:00
|
|
|
#include "derived-path-map.hh"
|
2023-10-25 07:43:36 +03:00
|
|
|
#include "util.hh"
|
2021-03-08 23:24:49 +02:00
|
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
|
|
|
template<typename V>
|
|
|
|
typename DerivedPathMap<V>::ChildNode & DerivedPathMap<V>::ensureSlot(const SingleDerivedPath & k)
|
|
|
|
{
|
|
|
|
std::function<ChildNode &(const SingleDerivedPath & )> initIter;
|
|
|
|
initIter = [&](const auto & k) -> auto & {
|
|
|
|
return std::visit(overloaded {
|
|
|
|
[&](const SingleDerivedPath::Opaque & bo) -> auto & {
|
|
|
|
// will not overwrite if already there
|
|
|
|
return map[bo.path];
|
|
|
|
},
|
|
|
|
[&](const SingleDerivedPath::Built & bfd) -> auto & {
|
|
|
|
auto & n = initIter(*bfd.drvPath);
|
|
|
|
return n.childMap[bfd.output];
|
|
|
|
},
|
|
|
|
}, k.raw());
|
|
|
|
};
|
|
|
|
return initIter(k);
|
|
|
|
}
|
|
|
|
|
Allow dynamic derivation deps in `inputDrvs`
We use the same nested map representation we used for goals, again in
order to save space. We might someday want to combine with `inputDrvs`,
by doing `V = bool` instead of `V = std::set<OutputName>`, but we are
not doing that yet for sake of a smaller diff.
The ATerm format for Derivations also needs to be extended, in addition
to the in-memory format. To accomodate this, we added a new basic
versioning scheme, so old versions of Nix will get nice errors. (And
going forward, if the ATerm format changes again the errors will be even
better.)
`parsedStrings`, an internal function used as part of parsing
derivations in A-Term format, used to consume the final `]` but expect
the initial `[` to already be consumed. This made for what looked like
unbalanced brackets at callsites, which was confusing. Now it consumes
both which is hopefully less confusing.
As part of testing, we also created a unit test for the A-Term format for
regular non-experimental derivations too.
Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
Co-authored-by: Valentin Gagarin <valentin.gagarin@tweag.io>
Apply suggestions from code review
Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
2021-10-02 01:05:53 +03:00
|
|
|
template<typename V>
|
|
|
|
typename DerivedPathMap<V>::ChildNode * DerivedPathMap<V>::findSlot(const SingleDerivedPath & k)
|
|
|
|
{
|
|
|
|
std::function<ChildNode *(const SingleDerivedPath & )> initIter;
|
|
|
|
initIter = [&](const auto & k) {
|
|
|
|
return std::visit(overloaded {
|
|
|
|
[&](const SingleDerivedPath::Opaque & bo) {
|
|
|
|
auto it = map.find(bo.path);
|
|
|
|
return it != map.end()
|
|
|
|
? &it->second
|
|
|
|
: nullptr;
|
|
|
|
},
|
|
|
|
[&](const SingleDerivedPath::Built & bfd) {
|
|
|
|
auto * n = initIter(*bfd.drvPath);
|
|
|
|
if (!n) return (ChildNode *)nullptr;
|
|
|
|
|
|
|
|
auto it = n->childMap.find(bfd.output);
|
|
|
|
return it != n->childMap.end()
|
|
|
|
? &it->second
|
|
|
|
: nullptr;
|
|
|
|
},
|
|
|
|
}, k.raw());
|
|
|
|
};
|
|
|
|
return initIter(k);
|
|
|
|
}
|
|
|
|
|
2021-03-08 23:24:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// instantiations
|
|
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
2024-05-17 01:46:38 +03:00
|
|
|
template<>
|
|
|
|
bool DerivedPathMap<std::set<std::string>>::ChildNode::operator == (
|
|
|
|
const DerivedPathMap<std::set<std::string>>::ChildNode &) const noexcept = default;
|
Allow dynamic derivation deps in `inputDrvs`
We use the same nested map representation we used for goals, again in
order to save space. We might someday want to combine with `inputDrvs`,
by doing `V = bool` instead of `V = std::set<OutputName>`, but we are
not doing that yet for sake of a smaller diff.
The ATerm format for Derivations also needs to be extended, in addition
to the in-memory format. To accomodate this, we added a new basic
versioning scheme, so old versions of Nix will get nice errors. (And
going forward, if the ATerm format changes again the errors will be even
better.)
`parsedStrings`, an internal function used as part of parsing
derivations in A-Term format, used to consume the final `]` but expect
the initial `[` to already be consumed. This made for what looked like
unbalanced brackets at callsites, which was confusing. Now it consumes
both which is hopefully less confusing.
As part of testing, we also created a unit test for the A-Term format for
regular non-experimental derivations too.
Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
Co-authored-by: Valentin Gagarin <valentin.gagarin@tweag.io>
Apply suggestions from code review
Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
2021-10-02 01:05:53 +03:00
|
|
|
|
2024-05-17 01:46:38 +03:00
|
|
|
// TODO libc++ 16 (used by darwin) missing `std::map::operator <=>`, can't do yet.
|
|
|
|
#if 0
|
|
|
|
template<>
|
|
|
|
std::strong_ordering DerivedPathMap<std::set<std::string>>::ChildNode::operator <=> (
|
|
|
|
const DerivedPathMap<std::set<std::string>>::ChildNode &) const noexcept = default;
|
|
|
|
#endif
|
Allow dynamic derivation deps in `inputDrvs`
We use the same nested map representation we used for goals, again in
order to save space. We might someday want to combine with `inputDrvs`,
by doing `V = bool` instead of `V = std::set<OutputName>`, but we are
not doing that yet for sake of a smaller diff.
The ATerm format for Derivations also needs to be extended, in addition
to the in-memory format. To accomodate this, we added a new basic
versioning scheme, so old versions of Nix will get nice errors. (And
going forward, if the ATerm format changes again the errors will be even
better.)
`parsedStrings`, an internal function used as part of parsing
derivations in A-Term format, used to consume the final `]` but expect
the initial `[` to already be consumed. This made for what looked like
unbalanced brackets at callsites, which was confusing. Now it consumes
both which is hopefully less confusing.
As part of testing, we also created a unit test for the A-Term format for
regular non-experimental derivations too.
Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
Co-authored-by: Valentin Gagarin <valentin.gagarin@tweag.io>
Apply suggestions from code review
Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
2021-10-02 01:05:53 +03:00
|
|
|
|
2024-05-17 01:46:38 +03:00
|
|
|
template struct DerivedPathMap<std::set<std::string>>::ChildNode;
|
Allow dynamic derivation deps in `inputDrvs`
We use the same nested map representation we used for goals, again in
order to save space. We might someday want to combine with `inputDrvs`,
by doing `V = bool` instead of `V = std::set<OutputName>`, but we are
not doing that yet for sake of a smaller diff.
The ATerm format for Derivations also needs to be extended, in addition
to the in-memory format. To accomodate this, we added a new basic
versioning scheme, so old versions of Nix will get nice errors. (And
going forward, if the ATerm format changes again the errors will be even
better.)
`parsedStrings`, an internal function used as part of parsing
derivations in A-Term format, used to consume the final `]` but expect
the initial `[` to already be consumed. This made for what looked like
unbalanced brackets at callsites, which was confusing. Now it consumes
both which is hopefully less confusing.
As part of testing, we also created a unit test for the A-Term format for
regular non-experimental derivations too.
Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
Co-authored-by: Valentin Gagarin <valentin.gagarin@tweag.io>
Apply suggestions from code review
Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
2021-10-02 01:05:53 +03:00
|
|
|
template struct DerivedPathMap<std::set<std::string>>;
|
|
|
|
|
|
|
|
};
|