Add a clearer error message for InvalidPathError during evaluation

Part of #270, #271

Change-Id: I864d7340f26d3c0f9c45db7b6b545face38d8294
This commit is contained in:
julia 2024-05-18 18:57:38 +10:00
parent 0fa289f559
commit 6c311a4afa
2 changed files with 14 additions and 1 deletions

View file

@ -47,12 +47,16 @@ MakeError(MissingArgumentError, EvalError);
MakeError(RestrictedPathError, Error); MakeError(RestrictedPathError, Error);
MakeError(InfiniteRecursionError, EvalError); MakeError(InfiniteRecursionError, EvalError);
/**
* Represents an exception due to an invalid path; that is, it does not exist.
* It corresponds to `!Store::validPath()`.
*/
struct InvalidPathError : public EvalError struct InvalidPathError : public EvalError
{ {
public: public:
Path path; Path path;
InvalidPathError(EvalState & state, const Path & path) InvalidPathError(EvalState & state, const Path & path)
: EvalError(state, "path '%s' is not valid", path) : EvalError(state, "path '%s' did not exist in the store during evaluation", path)
{ {
} }
}; };

View file

@ -62,10 +62,18 @@ MakeError(SubstError, Error);
* denotes a permanent build failure * denotes a permanent build failure
*/ */
MakeError(BuildError, Error); MakeError(BuildError, Error);
/**
* denotes that a path in the store did not exist (but it could, had it
* been put there, i.e. it is still legal).
*/
MakeError(InvalidPath, Error); MakeError(InvalidPath, Error);
MakeError(Unsupported, Error); MakeError(Unsupported, Error);
MakeError(SubstituteGone, Error); MakeError(SubstituteGone, Error);
MakeError(SubstituterDisabled, Error); MakeError(SubstituterDisabled, Error);
/**
* denotes that a path could not possibly be a store path.
* e.g. outside of the nix store, illegal characters in the name, etc.
*/
MakeError(BadStorePath, Error); MakeError(BadStorePath, Error);
MakeError(InvalidStoreURI, Error); MakeError(InvalidStoreURI, Error);
@ -328,6 +336,7 @@ public:
/** /**
* Check whether a path is valid. * Check whether a path is valid.
* A path is valid when it exists in the store *now*.
*/ */
bool isValidPath(const StorePath & path); bool isValidPath(const StorePath & path);