Skip to content
Permalink
Browse files

nix: Make all options available as flags

Thus, instead of ‘--option <name> <value>’, you can write ‘--<name>
<value>’. So

  --option http-connections 100

becomes

  --http-connections 100

Apart from brevity, the difference is that it's not an error to set a
non-existent option via --option, but unrecognized arguments are
fatal.

Boolean options have special treatment: they're mapped to the
argument-less flags ‘--<name>’ and ‘--no-<name>’. E.g.

  --option auto-optimise-store false

becomes

  --no-auto-optimise-store
  • Loading branch information...
edolstra committed Jun 7, 2017
1 parent c8cc50d commit b8283773bd64d7da6859ed520ee19867742a03ba
Showing with 40 additions and 0 deletions.
  1. +7 −0 src/libstore/globals.cc
  2. +25 −0 src/libutil/config.cc
  3. +6 −0 src/libutil/config.hh
  4. +2 −0 src/nix/main.cc
@@ -98,6 +98,13 @@ template<> void BaseSetting<SandboxMode>::toJSON(JSONPlaceholder & out)
AbstractSetting::toJSON(out);
}

template<> void BaseSetting<SandboxMode>::convertToArg(Args & args)
{
args.mkFlag(0, name, {}, "Enable sandboxing.", 0, [=](Strings ss) { value = smEnabled; });
args.mkFlag(0, "no-" + name, {}, "Disable sandboxing.", 0, [=](Strings ss) { value = smDisabled; });
args.mkFlag(0, "relaxed-" + name, {}, "Enable sandboxing, but allow builds to disable it.", 0, [=](Strings ss) { value = smRelaxed; });
}

void MaxBuildJobsSetting::set(const std::string & str)
{
if (str == "auto") value = std::max(1U, std::thread::hardware_concurrency());
@@ -115,6 +115,13 @@ void Config::toJSON(JSONObject & out)
}
}

void Config::convertToArgs(Args & args)
{
for (auto & s : _settings)
if (!s.second.isAlias)
s.second.setting->convertToArg(args);
}

AbstractSetting::AbstractSetting(
const std::string & name,
const std::string & description,
@@ -128,12 +135,22 @@ void AbstractSetting::toJSON(JSONPlaceholder & out)
out.write(to_string());
}

void AbstractSetting::convertToArg(Args & args)
{
}

template<typename T>
void BaseSetting<T>::toJSON(JSONPlaceholder & out)
{
out.write(value);
}

template<typename T>
void BaseSetting<T>::convertToArg(Args & args)
{
args.mkFlag(0, name, {}, description, 1, [=](Strings ss) { set(*ss.begin()); });
}

template<> void BaseSetting<std::string>::set(const std::string & str)
{
value = str;
@@ -174,6 +191,12 @@ template<> std::string BaseSetting<bool>::to_string()
return value ? "true" : "false";
}

template<> void BaseSetting<bool>::convertToArg(Args & args)
{
args.mkFlag(0, name, {}, description, 0, [=](Strings ss) { value = true; });
args.mkFlag(0, "no-" + name, {}, description, 0, [=](Strings ss) { value = false; });
}

template<> void BaseSetting<Strings>::set(const std::string & str)
{
value = tokenizeString<Strings>(str);
@@ -216,6 +239,8 @@ template class BaseSetting<long long>;
template class BaseSetting<unsigned long long>;
template class BaseSetting<bool>;
template class BaseSetting<std::string>;
template class BaseSetting<Strings>;
template class BaseSetting<StringSet>;

void PathSetting::set(const std::string & str)
{
@@ -63,6 +63,8 @@ public:
void resetOverriden();

void toJSON(JSONObject & out);

void convertToArgs(Args & args);
};

class AbstractSetting
@@ -99,6 +101,8 @@ protected:

virtual void toJSON(JSONPlaceholder & out);

virtual void convertToArg(Args & args);

bool isOverriden() { return overriden; }
};

@@ -132,6 +136,8 @@ public:

std::string to_string() override;

void convertToArg(Args & args) override;

void toJSON(JSONPlaceholder & out) override;
};

@@ -22,6 +22,8 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
});

mkFlag(0, "version", "show version information", std::bind(printVersion, programName));

settings.convertToArgs(*this);
}
};

0 comments on commit b828377

Please sign in to comment.
You can’t perform that action at this time.