1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-27 21:01:16 +02:00

nix-store --gc --max-freed: Support a unit specifier

E.g. "--max-freed 10G" means "free ten gigabytes".
This commit is contained in:
Eelco Dolstra 2014-02-17 14:48:50 +01:00
parent 00d30496ca
commit 1da6ae4f99
3 changed files with 25 additions and 6 deletions

View file

@ -4,6 +4,8 @@
#include <signal.h>
#include <locale>
/* These are not implemented here, but must be implemented by a
program linking against libmain. */
@ -35,14 +37,27 @@ void printMissing(const PathSet & willBuild,
unsigned long long downloadSize, unsigned long long narSize);
template<class N> N getIntArg(const string & opt,
Strings::iterator & i, const Strings::iterator & end)
Strings::iterator & i, const Strings::iterator & end, bool allowUnit)
{
++i;
if (i == end) throw UsageError(format("`%1%' requires an argument") % opt);
string s = *i;
N multiplier = 1;
if (allowUnit && !s.empty()) {
char u = std::toupper(*s.rbegin());
if (std::isalpha(u)) {
if (u == 'K') multiplier = 1ULL << 10;
else if (u == 'M') multiplier = 1ULL << 20;
else if (u == 'G') multiplier = 1ULL << 30;
else if (u == 'T') multiplier = 1ULL << 40;
else throw UsageError(format("invalid unit specifier `%1%'") % u);
s.resize(s.size() - 1);
}
}
N n;
if (!string2Int(*i, n))
if (!string2Int(s, n))
throw UsageError(format("`%1%' requires an integer argument") % opt);
return n;
return n * multiplier;
}
/* Show the manual page for the specified program. */