diff options
author | eldritch horrors <pennae@lix.systems> | 2024-08-09 02:07:18 +0200 |
---|---|---|
committer | eldritch horrors <pennae@lix.systems> | 2024-08-09 11:33:09 +0000 |
commit | 5d4686bcd5600c3071e91bd53338bcb12cd44a54 (patch) | |
tree | 18c64877753f2bf676d4f5cbefab5efaab32372e | |
parent | baa4fda34032373f2e4d5fdb5565132522c24983 (diff) |
libutil: allow marking settings as deprecated
this is a bit of a hack, but it's apparently the cleanest way of doing
this in the absence of any kind of priority/provenance information for
values of some given setting. we'll need this to deprecate build-hook.
Change-Id: I03644a9c3f17681c052ecdc610b4f1301266ab9e
-rw-r--r-- | src/libutil/config-impl.hh | 10 | ||||
-rw-r--r-- | src/libutil/config.hh | 26 |
2 files changed, 30 insertions, 6 deletions
diff --git a/src/libutil/config-impl.hh b/src/libutil/config-impl.hh index 756175f95..8e3a1e408 100644 --- a/src/libutil/config-impl.hh +++ b/src/libutil/config-impl.hh @@ -66,9 +66,13 @@ void BaseSetting<T>::appendOrSet(T newValue, bool append) template<typename T> void BaseSetting<T>::set(const std::string & str, bool append) { - if (experimentalFeatureSettings.isEnabled(experimentalFeature)) - appendOrSet(parse(str), append); - else { + if (experimentalFeatureSettings.isEnabled(experimentalFeature)) { + auto parsed = parse(str); + if (deprecated && (append || parsed != value)) { + warn("deprecated setting '%s' found (set to '%s')", name, str); + } + appendOrSet(std::move(parsed), append); + } else { assert(experimentalFeature); warn("Ignoring setting '%s' because experimental feature '%s' is not enabled", name, diff --git a/src/libutil/config.hh b/src/libutil/config.hh index 8a4d24456..d7bf9cdc9 100644 --- a/src/libutil/config.hh +++ b/src/libutil/config.hh @@ -175,6 +175,10 @@ class AbstractSetting public: + struct deprecated_t { + explicit deprecated_t() = default; + }; + const std::string name; const std::string description; const std::set<std::string> aliases; @@ -225,6 +229,7 @@ protected: T value; const T defaultValue; const bool documentDefault; + const bool deprecated; /** * Parse the string into a `T`. @@ -250,11 +255,13 @@ public: const std::string & name, const std::string & description, const std::set<std::string> & aliases = {}, - std::optional<ExperimentalFeature> experimentalFeature = std::nullopt) + std::optional<ExperimentalFeature> experimentalFeature = std::nullopt, + bool deprecated = false) : AbstractSetting(name, description, aliases, experimentalFeature) , value(def) , defaultValue(def) , documentDefault(documentDefault) + , deprecated(deprecated) { } operator const T &() const { return value; } @@ -322,12 +329,25 @@ public: const std::string & description, const std::set<std::string> & aliases = {}, const bool documentDefault = true, - std::optional<ExperimentalFeature> experimentalFeature = std::nullopt) - : BaseSetting<T>(def, documentDefault, name, description, aliases, std::move(experimentalFeature)) + std::optional<ExperimentalFeature> experimentalFeature = std::nullopt, + bool deprecated = false) + : BaseSetting<T>(def, documentDefault, name, description, aliases, std::move(experimentalFeature), deprecated) { options->addSetting(this); } + Setting(AbstractSetting::deprecated_t, + Config * options, + const T & def, + const std::string & name, + const std::string & description, + const std::set<std::string> & aliases = {}, + const bool documentDefault = true, + std::optional<ExperimentalFeature> experimentalFeature = std::nullopt) + : Setting(options, def, name, description, aliases, documentDefault, std::move(experimentalFeature), true) + { + } + void operator =(const T & v) { this->assign(v); } }; |