mirror of
https://github.com/NixOS/nix
synced 2025-06-28 17:51:15 +02:00
When you apply `builtins.toString` to a path value representing a path in the Nix store (as is the case with flake inputs), historically you got a string without context (e.g. `/nix/store/...-source`). This is broken, since it allows you to pass a store path to a derivation/toFile without a proper store reference. This is especially a problem with lazy trees, since the store path is a virtual path that doesn't exist and can be different every time. For backwards compatibility, and to warn users about this unsafe use of `toString`, we now keep track of such strings as a special type of context.
51 lines
1.6 KiB
C++
51 lines
1.6 KiB
C++
#include <rapidcheck.h>
|
|
|
|
#include "nix/store/tests/path.hh"
|
|
#include "nix/expr/tests/value/context.hh"
|
|
|
|
namespace rc {
|
|
using namespace nix;
|
|
|
|
Gen<NixStringContextElem::DrvDeep> Arbitrary<NixStringContextElem::DrvDeep>::arbitrary()
|
|
{
|
|
return gen::map(gen::arbitrary<StorePath>(), [](StorePath drvPath) {
|
|
return NixStringContextElem::DrvDeep{
|
|
.drvPath = drvPath,
|
|
};
|
|
});
|
|
}
|
|
|
|
Gen<NixStringContextElem::Path> Arbitrary<NixStringContextElem::Path>::arbitrary()
|
|
{
|
|
return gen::map(gen::arbitrary<StorePath>(), [](StorePath storePath) {
|
|
return NixStringContextElem::Path{
|
|
.storePath = storePath,
|
|
};
|
|
});
|
|
}
|
|
|
|
Gen<NixStringContextElem> Arbitrary<NixStringContextElem>::arbitrary()
|
|
{
|
|
return gen::mapcat(
|
|
gen::inRange<uint8_t>(0, std::variant_size_v<NixStringContextElem::Raw>),
|
|
[](uint8_t n) -> Gen<NixStringContextElem> {
|
|
switch (n) {
|
|
case 0:
|
|
return gen::map(
|
|
gen::arbitrary<NixStringContextElem::Opaque>(), [](NixStringContextElem a) { return a; });
|
|
case 1:
|
|
return gen::map(
|
|
gen::arbitrary<NixStringContextElem::DrvDeep>(), [](NixStringContextElem a) { return a; });
|
|
case 2:
|
|
return gen::map(
|
|
gen::arbitrary<NixStringContextElem::Built>(), [](NixStringContextElem a) { return a; });
|
|
case 3:
|
|
return gen::map(
|
|
gen::arbitrary<NixStringContextElem::Path>(), [](NixStringContextElem a) { return a; });
|
|
default:
|
|
assert(false);
|
|
}
|
|
});
|
|
}
|
|
|
|
}
|