forked from lix-project/lix
Fix the registration of stores
This commit is contained in:
parent
7d5bdf8b56
commit
fa32560169
|
@ -50,6 +50,6 @@ struct DummyStore : public Store
|
|||
{ unsupported("buildDerivation"); }
|
||||
};
|
||||
|
||||
[[maybe_unused]] static RegisterStoreImplementation<DummyStore> regStore();
|
||||
static RegisterStoreImplementation<DummyStore> regStore;
|
||||
|
||||
}
|
||||
|
|
|
@ -170,6 +170,6 @@ protected:
|
|||
|
||||
};
|
||||
|
||||
[[maybe_unused]] static RegisterStoreImplementation<HttpBinaryCacheStore> regStore();
|
||||
static RegisterStoreImplementation<HttpBinaryCacheStore> regStore;
|
||||
|
||||
}
|
||||
|
|
|
@ -326,6 +326,6 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
[[maybe_unused]] static RegisterStoreImplementation<LegacySSHStore> regStore();
|
||||
static RegisterStoreImplementation<LegacySSHStore> regStore;
|
||||
|
||||
}
|
||||
|
|
|
@ -96,6 +96,6 @@ std::vector<std::string> LocalBinaryCacheStore::uriPrefixes()
|
|||
return {"file"};
|
||||
}
|
||||
|
||||
[[maybe_unused]] static RegisterStoreImplementation<LocalBinaryCacheStore> regStore();
|
||||
static RegisterStoreImplementation<LocalBinaryCacheStore> regStore;
|
||||
|
||||
}
|
||||
|
|
|
@ -982,6 +982,6 @@ std::exception_ptr RemoteStore::Connection::processStderr(Sink * sink, Source *
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
[[maybe_unused]] static RegisterStoreImplementation<UDSRemoteStore> regStore();
|
||||
static RegisterStoreImplementation<UDSRemoteStore> regStore;
|
||||
|
||||
}
|
||||
|
|
|
@ -431,7 +431,7 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
|||
|
||||
};
|
||||
|
||||
[[maybe_unused]] static RegisterStoreImplementation<S3BinaryCacheStoreImpl> regStore();
|
||||
static RegisterStoreImplementation<S3BinaryCacheStoreImpl> regStore;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -76,6 +76,6 @@ ref<RemoteStore::Connection> SSHStore::openConnection()
|
|||
return conn;
|
||||
}
|
||||
|
||||
[[maybe_unused]] static RegisterStoreImplementation<SSHStore> regStore();
|
||||
static RegisterStoreImplementation<SSHStore> regStore;
|
||||
|
||||
}
|
||||
|
|
|
@ -1093,7 +1093,7 @@ ref<Store> openStore(const std::string & uri_,
|
|||
return ref<Store>(store);
|
||||
}
|
||||
|
||||
for (auto implem : *implementations) {
|
||||
for (auto implem : *Implementations::registered) {
|
||||
auto store = implem.open(uri, params);
|
||||
if (store) {
|
||||
store->warnUnknownSettings();
|
||||
|
@ -1136,5 +1136,6 @@ std::list<ref<Store>> getDefaultSubstituters()
|
|||
return stores;
|
||||
}
|
||||
|
||||
std::vector<StoreFactory> * Implementations::registered = 0;
|
||||
|
||||
}
|
||||
|
|
|
@ -749,25 +749,32 @@ std::list<ref<Store>> getDefaultSubstituters();
|
|||
|
||||
struct StoreFactory
|
||||
{
|
||||
std::vector<std::string> uriPrefixes;
|
||||
std::function<std::shared_ptr<Store> (const std::string & uri, const Store::Params & params)> open;
|
||||
};
|
||||
typedef std::vector<StoreFactory> Implementations;
|
||||
static Implementations * implementations = new Implementations;
|
||||
struct Implementations
|
||||
{
|
||||
static std::vector<StoreFactory> * registered;
|
||||
|
||||
template<typename T>
|
||||
static void add()
|
||||
{
|
||||
if (!registered) registered = new std::vector<StoreFactory>();
|
||||
StoreFactory factory{
|
||||
.open =
|
||||
([](const std::string & uri, const Store::Params & params)
|
||||
-> std::shared_ptr<Store>
|
||||
{ return std::make_shared<T>(uri, params); }),
|
||||
};
|
||||
registered->push_back(factory);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
struct RegisterStoreImplementation
|
||||
{
|
||||
RegisterStoreImplementation()
|
||||
{
|
||||
StoreFactory factory{
|
||||
.uriPrefixes = T::uriPrefixes(),
|
||||
.open =
|
||||
([](const std::string & uri, const Store::Params & params)
|
||||
-> std::shared_ptr<Store>
|
||||
{ return std::make_shared<T>(uri, params); })
|
||||
};
|
||||
implementations->push_back(factory);
|
||||
Implementations::add<T>();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue