Add a dummy Store::buildPaths() method

This default implementation of buildPaths() does nothing if all
requested paths are already valid, and throws an "unsupported
operation" error otherwise. This fixes a regression introduced by
c30330df6f in binary cache and legacy
SSH stores.
This commit is contained in:
Eelco Dolstra 2017-05-01 13:43:34 +02:00
parent b0b81b7500
commit 0dddcf867a
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
5 changed files with 36 additions and 38 deletions

View file

@ -114,11 +114,6 @@ void BinaryCacheStore::init()
} }
} }
void BinaryCacheStore::notImpl()
{
throw Error("operation not implemented for binary cache stores");
}
std::shared_ptr<std::string> BinaryCacheStore::getFile(const std::string & path) std::shared_ptr<std::string> BinaryCacheStore::getFile(const std::string & path)
{ {
std::promise<std::shared_ptr<std::string>> promise; std::promise<std::shared_ptr<std::string>> promise;

View file

@ -27,8 +27,6 @@ protected:
BinaryCacheStore(const Params & params); BinaryCacheStore(const Params & params);
[[noreturn]] void notImpl();
public: public:
virtual bool fileExists(const std::string & path) = 0; virtual bool fileExists(const std::string & path) = 0;
@ -65,7 +63,7 @@ public:
bool isValidPathUncached(const Path & path) override; bool isValidPathUncached(const Path & path) override;
PathSet queryAllValidPaths() override PathSet queryAllValidPaths() override
{ notImpl(); } { unsupported(); }
void queryPathInfoUncached(const Path & path, void queryPathInfoUncached(const Path & path,
std::function<void(std::shared_ptr<ValidPathInfo>)> success, std::function<void(std::shared_ptr<ValidPathInfo>)> success,
@ -73,16 +71,16 @@ public:
void queryReferrers(const Path & path, void queryReferrers(const Path & path,
PathSet & referrers) override PathSet & referrers) override
{ notImpl(); } { unsupported(); }
PathSet queryDerivationOutputs(const Path & path) override PathSet queryDerivationOutputs(const Path & path) override
{ notImpl(); } { unsupported(); }
StringSet queryDerivationOutputNames(const Path & path) override StringSet queryDerivationOutputNames(const Path & path) override
{ notImpl(); } { unsupported(); }
Path queryPathFromHashPart(const string & hashPart) override Path queryPathFromHashPart(const string & hashPart) override
{ notImpl(); } { unsupported(); }
bool wantMassQuery() override { return wantMassQuery_; } bool wantMassQuery() override { return wantMassQuery_; }
@ -99,32 +97,29 @@ public:
void narFromPath(const Path & path, Sink & sink) override; void narFromPath(const Path & path, Sink & sink) override;
void buildPaths(const PathSet & paths, BuildMode buildMode) override
{ notImpl(); }
BuildResult buildDerivation(const Path & drvPath, const BasicDerivation & drv, BuildResult buildDerivation(const Path & drvPath, const BasicDerivation & drv,
BuildMode buildMode) override BuildMode buildMode) override
{ notImpl(); } { unsupported(); }
void ensurePath(const Path & path) override void ensurePath(const Path & path) override
{ notImpl(); } { unsupported(); }
void addTempRoot(const Path & path) override void addTempRoot(const Path & path) override
{ notImpl(); } { unsupported(); }
void addIndirectRoot(const Path & path) override void addIndirectRoot(const Path & path) override
{ notImpl(); } { unsupported(); }
Roots findRoots() override Roots findRoots() override
{ notImpl(); } { unsupported(); }
void collectGarbage(const GCOptions & options, GCResults & results) override void collectGarbage(const GCOptions & options, GCResults & results) override
{ notImpl(); } { unsupported(); }
ref<FSAccessor> getFSAccessor() override; ref<FSAccessor> getFSAccessor() override;
void addSignatures(const Path & storePath, const StringSet & sigs) override void addSignatures(const Path & storePath, const StringSet & sigs) override
{ notImpl(); } { unsupported(); }
std::shared_ptr<std::string> getBuildLog(const Path & path) override; std::shared_ptr<std::string> getBuildLog(const Path & path) override;

View file

@ -148,12 +148,6 @@ struct LegacySSHStore : public Store
sink(*savedNAR.data); sink(*savedNAR.data);
} }
/* Unsupported methods. */
[[noreturn]] void unsupported()
{
throw Error("operation not supported on SSH stores");
}
PathSet queryAllValidPaths() override { unsupported(); } PathSet queryAllValidPaths() override { unsupported(); }
void queryReferrers(const Path & path, PathSet & referrers) override void queryReferrers(const Path & path, PathSet & referrers) override
@ -177,9 +171,6 @@ struct LegacySSHStore : public Store
const PathSet & references, bool repair) override const PathSet & references, bool repair) override
{ unsupported(); } { unsupported(); }
void buildPaths(const PathSet & paths, BuildMode buildMode) override
{ unsupported(); }
BuildResult buildDerivation(const Path & drvPath, const BasicDerivation & drv, BuildResult buildDerivation(const Path & drvPath, const BasicDerivation & drv,
BuildMode buildMode) override BuildMode buildMode) override
{ unsupported(); } { unsupported(); }

View file

@ -523,6 +523,17 @@ const Store::Stats & Store::getStats()
} }
void Store::buildPaths(const PathSet & paths, BuildMode buildMode)
{
for (auto & path : paths)
if (isDerivation(path))
unsupported();
if (queryValidPaths(paths).size() != paths.size())
unsupported();
}
void copyStorePath(ref<Store> srcStore, ref<Store> dstStore, void copyStorePath(ref<Store> srcStore, ref<Store> dstStore,
const Path & storePath, bool repair, bool dontCheckSigs) const Path & storePath, bool repair, bool dontCheckSigs)
{ {

View file

@ -18,6 +18,12 @@
namespace nix { namespace nix {
MakeError(SubstError, Error)
MakeError(BuildError, Error) /* denotes a permanent build failure */
MakeError(InvalidPath, Error)
MakeError(Unsupported, Error)
struct BasicDerivation; struct BasicDerivation;
struct Derivation; struct Derivation;
class FSAccessor; class FSAccessor;
@ -414,7 +420,7 @@ public:
output paths can be created by running the builder, after output paths can be created by running the builder, after
recursively building any sub-derivations. For inputs that are recursively building any sub-derivations. For inputs that are
not derivations, substitute them. */ not derivations, substitute them. */
virtual void buildPaths(const PathSet & paths, BuildMode buildMode = bmNormal) = 0; virtual void buildPaths(const PathSet & paths, BuildMode buildMode = bmNormal);
/* Build a single non-materialized derivation (i.e. not from an /* Build a single non-materialized derivation (i.e. not from an
on-disk .drv file). Note that drvPath is only used for on-disk .drv file). Note that drvPath is only used for
@ -584,6 +590,12 @@ protected:
Stats stats; Stats stats;
/* Unsupported methods. */
[[noreturn]] void unsupported()
{
throw Unsupported("requested operation is not supported by store %s", getUri());
}
}; };
@ -720,10 +732,4 @@ ValidPathInfo decodeValidPathInfo(std::istream & str,
for paths created by makeFixedOutputPath() / addToStore(). */ for paths created by makeFixedOutputPath() / addToStore(). */
std::string makeFixedOutputCA(bool recursive, const Hash & hash); std::string makeFixedOutputCA(bool recursive, const Hash & hash);
MakeError(SubstError, Error)
MakeError(BuildError, Error) /* denotes a permanent build failure */
MakeError(InvalidPath, Error)
} }