PathInputScheme::getFingerprint(): Don't barf on relative paths

This wasn't caught by CI because #10149 and #10152 pass
individually... It doesn't happen on lazy-trees either because we
never try to fetch relative path flakes (#10089).
This commit is contained in:
Eelco Dolstra 2024-03-07 13:28:52 +01:00
parent da62528487
commit 0282499e18

View file

@ -89,6 +89,15 @@ struct PathInputScheme : InputScheme
writeFile((CanonPath(getAbsPath(input)) / path).abs(), contents); writeFile((CanonPath(getAbsPath(input)) / path).abs(), contents);
} }
std::optional<std::string> isRelative(const Input & input) const
{
auto path = getStrAttr(input.attrs, "path");
if (hasPrefix(path, "/"))
return std::nullopt;
else
return path;
}
bool isLocked(const Input & input) const override bool isLocked(const Input & input) const override
{ {
return (bool) input.getNarHash(); return (bool) input.getNarHash();
@ -151,6 +160,9 @@ struct PathInputScheme : InputScheme
std::optional<std::string> getFingerprint(ref<Store> store, const Input & input) const override std::optional<std::string> getFingerprint(ref<Store> store, const Input & input) const override
{ {
if (isRelative(input))
return std::nullopt;
/* If this path is in the Nix store, use the hash of the /* If this path is in the Nix store, use the hash of the
store object and the subpath. */ store object and the subpath. */
auto path = getAbsPath(input); auto path = getAbsPath(input);