Merge pull request #10668 from edolstra/unit-prefixes

Support unit prefixes in configuration settings
This commit is contained in:
Eelco Dolstra 2024-05-09 19:29:36 +02:00 committed by GitHub
commit de8c3c034c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 20 additions and 7 deletions

View file

@ -66,5 +66,12 @@ Configuration options can be set on the command line, overriding the values set
The `extra-` prefix is supported for settings that take a list of items (e.g. `--extra-trusted users alice` or `--option extra-trusted-users alice`).
## Integer settings
Settings that have an integer type support the suffixes `K`, `M`, `G`
and `T`. These cause the specified value to be multiplied by 2^10,
2^20, 2^30 and 2^40, respectively. For instance, `--min-free 1M` is
equivalent to `--min-free 1048576`.
# Available settings

View file

@ -116,11 +116,12 @@ T BaseSetting<T>::parse(const std::string & str) const
{
static_assert(std::is_integral<T>::value, "Integer required.");
if (auto n = string2Int<T>(str))
return *n;
else
try {
return string2IntWithUnitPrefix<T>(str);
} catch (...) {
throw UsageError("setting '%s' has invalid value '%s'", name, str);
}
}
template<typename T>
std::string BaseSetting<T>::to_string() const

View file

@ -120,7 +120,7 @@ std::optional<N> string2Int(const std::string_view s)
template<class N>
N string2IntWithUnitPrefix(std::string_view s)
{
N multiplier = 1;
uint64_t multiplier = 1;
if (!s.empty()) {
char u = std::toupper(*s.rbegin());
if (std::isalpha(u)) {

View file

@ -67,3 +67,8 @@ exp_features=$(nix config show | grep '^experimental-features' | cut -d '=' -f 2
val=$(nix config show | grep '^warn-dirty' | cut -d '=' -f 2 | xargs)
val2=$(nix config show warn-dirty)
[[ $val == $val2 ]]
# Test unit prefixes.
[[ $(nix config show --min-free 64K min-free) = 65536 ]]
[[ $(nix config show --min-free 1M min-free) = 1048576 ]]
[[ $(nix config show --min-free 2G min-free) = 2147483648 ]]

View file

@ -62,11 +62,11 @@ EOF
)
nix build --impure -v -o $TEST_ROOT/result-A -L --expr "$expr" \
--min-free 1000 --max-free 2000 --min-free-check-interval 1 &
--min-free 1K --max-free 2K --min-free-check-interval 1 &
pid1=$!
nix build --impure -v -o $TEST_ROOT/result-B -L --expr "$expr2" \
--min-free 1000 --max-free 2000 --min-free-check-interval 1 &
--min-free 1K --max-free 2K --min-free-check-interval 1 &
pid2=$!
# Once the first build is done, unblock the second one.