72b65981f9
This reverts commit 5e3986f59c
. This
un-implements RFC 92 but fixes the critical bug #9052 which many people
are hitting. This is a decent stop-gap until a minimal reproduction of
that bug is found and a proper fix can be made.
Mostly fixed #9052, but I would like to leave that issue open until we
have a regression test, so I can then properly fix the bug (unbreaking
RFC 92) later.
(cherry picked from commit 8440afbed756254784d9fea3eaab06649dffd390)
70 lines
1.9 KiB
C++
70 lines
1.9 KiB
C++
#include "derived-path-map.hh"
|
|
|
|
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);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
}
|
|
|
|
// instantiations
|
|
|
|
namespace nix {
|
|
|
|
GENERATE_CMP_EXT(
|
|
template<>,
|
|
DerivedPathMap<std::set<std::string>>::ChildNode,
|
|
me->value,
|
|
me->childMap);
|
|
|
|
GENERATE_CMP_EXT(
|
|
template<>,
|
|
DerivedPathMap<std::set<std::string>>,
|
|
me->map);
|
|
|
|
template struct DerivedPathMap<std::set<std::string>>;
|
|
|
|
};
|