forked from lix-project/lix
Merge pull request #8774 from NixLayeredStore/experimental-stores
Add infra for experimental store implementations
This commit is contained in:
commit
635df5ee95
4 changed files with 39 additions and 4 deletions
|
@ -137,12 +137,29 @@ let
|
|||
|
||||
storeDocs =
|
||||
let
|
||||
showStore = name: { settings, doc }:
|
||||
''
|
||||
showStore = name: { settings, doc, experimentalFeature }:
|
||||
let
|
||||
experimentalFeatureNote = optionalString (experimentalFeature != null) ''
|
||||
> **Warning**
|
||||
> This store is part of an
|
||||
> [experimental feature](@docroot@/contributing/experimental-features.md).
|
||||
|
||||
To use this store, you need to make sure the corresponding experimental feature,
|
||||
[`${experimentalFeature}`](@docroot@/contributing/experimental-features.md#xp-feature-${experimentalFeature}),
|
||||
is enabled.
|
||||
For example, include the following in [`nix.conf`](#):
|
||||
|
||||
```
|
||||
extra-experimental-features = ${experimentalFeature}
|
||||
```
|
||||
'';
|
||||
in ''
|
||||
## ${name}
|
||||
|
||||
${doc}
|
||||
|
||||
${experimentalFeatureNote}
|
||||
|
||||
**Settings**:
|
||||
|
||||
${showSettings { useAnchors = false; } settings}
|
||||
|
|
|
@ -1496,6 +1496,7 @@ ref<Store> openStore(const std::string & uri_,
|
|||
if (implem.uriSchemes.count(parsedUri.scheme)) {
|
||||
auto store = implem.create(parsedUri.scheme, baseURI, params);
|
||||
if (store) {
|
||||
experimentalFeatureSettings.require(store->experimentalFeature());
|
||||
store->init();
|
||||
store->warnUnknownSettings();
|
||||
return ref<Store>(store);
|
||||
|
|
|
@ -109,13 +109,28 @@ struct StoreConfig : public Config
|
|||
|
||||
virtual ~StoreConfig() { }
|
||||
|
||||
/**
|
||||
* The name of this type of store.
|
||||
*/
|
||||
virtual const std::string name() = 0;
|
||||
|
||||
/**
|
||||
* Documentation for this type of store.
|
||||
*/
|
||||
virtual std::string doc()
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* An experimental feature this type store is gated, if it is to be
|
||||
* experimental.
|
||||
*/
|
||||
virtual std::optional<ExperimentalFeature> experimentalFeature() const
|
||||
{
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
const PathSetting storeDir_{this, settings.nixStore,
|
||||
"store",
|
||||
R"(
|
||||
|
|
|
@ -180,8 +180,10 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
|
|||
for (auto & implem : *Implementations::registered) {
|
||||
auto storeConfig = implem.getConfig();
|
||||
auto storeName = storeConfig->name();
|
||||
stores[storeName]["doc"] = storeConfig->doc();
|
||||
stores[storeName]["settings"] = storeConfig->toJSON();
|
||||
auto & j = stores[storeName];
|
||||
j["doc"] = storeConfig->doc();
|
||||
j["settings"] = storeConfig->toJSON();
|
||||
j["experimentalFeature"] = storeConfig->experimentalFeature();
|
||||
}
|
||||
res["stores"] = std::move(stores);
|
||||
|
||||
|
|
Loading…
Reference in a new issue