Modularize config settings
Allow global config settings to be defined in multiple Config classes. For example, this means that libutil can have settings and evaluator settings can be moved out of libstore. The Config classes are registered in a new GlobalConfig class to which config files etc. are applied. Relevant to https://github.com/NixOS/nix/issues/2009 in that it removes the need for ad hoc handling of useCaseHack, which was the underlying cause of that issue.
This commit is contained in:
parent
e606cd412f
commit
737ed88f35
15 changed files with 195 additions and 133 deletions
|
|
@ -672,8 +672,10 @@ HookInstance::HookInstance()
|
|||
toHook.readSide = -1;
|
||||
|
||||
sink = FdSink(toHook.writeSide.get());
|
||||
for (auto & setting : settings.getSettings())
|
||||
sink << 1 << setting.first << setting.second;
|
||||
std::map<std::string, Config::SettingInfo> settings;
|
||||
globalConfig.getSettings(settings);
|
||||
for (auto & setting : settings)
|
||||
sink << 1 << setting.first << setting.second.value;
|
||||
sink << 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,9 +28,10 @@ namespace nix {
|
|||
|
||||
Settings settings;
|
||||
|
||||
static GlobalConfig::Register r1(&settings);
|
||||
|
||||
Settings::Settings()
|
||||
: Config({})
|
||||
, nixPrefix(NIX_PREFIX)
|
||||
: nixPrefix(NIX_PREFIX)
|
||||
, nixStore(canonPath(getEnv("NIX_STORE_DIR", getEnv("NIX_STORE", NIX_STORE_DIR))))
|
||||
, nixDataDir(canonPath(getEnv("NIX_DATA_DIR", NIX_DATA_DIR)))
|
||||
, nixLogDir(canonPath(getEnv("NIX_LOG_DIR", NIX_LOG_DIR)))
|
||||
|
|
@ -69,20 +70,15 @@ Settings::Settings()
|
|||
allowedImpureHostPrefixes = tokenizeString<StringSet>(DEFAULT_ALLOWED_IMPURE_PREFIXES);
|
||||
}
|
||||
|
||||
void Settings::loadConfFile()
|
||||
void loadConfFile()
|
||||
{
|
||||
applyConfigFile(nixConfDir + "/nix.conf");
|
||||
globalConfig.applyConfigFile(settings.nixConfDir + "/nix.conf");
|
||||
|
||||
/* We only want to send overrides to the daemon, i.e. stuff from
|
||||
~/.nix/nix.conf or the command line. */
|
||||
resetOverriden();
|
||||
globalConfig.resetOverriden();
|
||||
|
||||
applyConfigFile(getConfigDir() + "/nix/nix.conf");
|
||||
}
|
||||
|
||||
void Settings::set(const string & name, const string & value)
|
||||
{
|
||||
Config::set(name, value);
|
||||
globalConfig.applyConfigFile(getConfigDir() + "/nix/nix.conf");
|
||||
}
|
||||
|
||||
unsigned int Settings::getDefaultCores()
|
||||
|
|
@ -162,23 +158,11 @@ void initPlugins()
|
|||
throw Error("could not dynamically open plugin file '%s': %s", file, dlerror());
|
||||
}
|
||||
}
|
||||
/* We handle settings registrations here, since plugins can add settings */
|
||||
if (RegisterSetting::settingRegistrations) {
|
||||
for (auto & registration : *RegisterSetting::settingRegistrations)
|
||||
settings.addSetting(registration);
|
||||
delete RegisterSetting::settingRegistrations;
|
||||
}
|
||||
settings.handleUnknownSettings();
|
||||
|
||||
/* Since plugins can add settings, try to re-apply previously
|
||||
unknown settings. */
|
||||
globalConfig.reapplyUnknownSettings();
|
||||
globalConfig.warnUnknownSettings();
|
||||
}
|
||||
|
||||
RegisterSetting::SettingRegistrations * RegisterSetting::settingRegistrations;
|
||||
|
||||
RegisterSetting::RegisterSetting(AbstractSetting * s)
|
||||
{
|
||||
if (!settingRegistrations)
|
||||
settingRegistrations = new SettingRegistrations;
|
||||
settingRegistrations->emplace_back(s);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,26 +13,6 @@ namespace nix {
|
|||
|
||||
typedef enum { smEnabled, smRelaxed, smDisabled } SandboxMode;
|
||||
|
||||
extern bool useCaseHack; // FIXME
|
||||
|
||||
struct CaseHackSetting : public BaseSetting<bool>
|
||||
{
|
||||
CaseHackSetting(Config * options,
|
||||
const std::string & name,
|
||||
const std::string & description,
|
||||
const std::set<std::string> & aliases = {})
|
||||
: BaseSetting<bool>(useCaseHack, name, description, aliases)
|
||||
{
|
||||
options->addSetting(this);
|
||||
}
|
||||
|
||||
void set(const std::string & str) override
|
||||
{
|
||||
BaseSetting<bool>::set(str);
|
||||
nix::useCaseHack = value;
|
||||
}
|
||||
};
|
||||
|
||||
struct MaxBuildJobsSetting : public BaseSetting<unsigned int>
|
||||
{
|
||||
MaxBuildJobsSetting(Config * options,
|
||||
|
|
@ -56,10 +36,6 @@ public:
|
|||
|
||||
Settings();
|
||||
|
||||
void loadConfFile();
|
||||
|
||||
void set(const string & name, const string & value);
|
||||
|
||||
Path nixPrefix;
|
||||
|
||||
/* The directory where we store sources and derived files. */
|
||||
|
|
@ -353,9 +329,6 @@ public:
|
|||
Setting<bool> enableImportFromDerivation{this, true, "allow-import-from-derivation",
|
||||
"Whether the evaluator allows importing the result of a derivation."};
|
||||
|
||||
CaseHackSetting useCaseHack{this, "use-case-hack",
|
||||
"Whether to enable a Darwin-specific hack for dealing with file name collisions."};
|
||||
|
||||
Setting<unsigned long> connectTimeout{this, 0, "connect-timeout",
|
||||
"Timeout for connecting to servers during downloads. 0 means use curl's builtin default."};
|
||||
|
||||
|
|
@ -398,15 +371,8 @@ extern Settings settings;
|
|||
anything else */
|
||||
void initPlugins();
|
||||
|
||||
void loadConfFile();
|
||||
|
||||
extern const string nixVersion;
|
||||
|
||||
struct RegisterSetting
|
||||
{
|
||||
typedef std::vector<AbstractSetting *> SettingRegistrations;
|
||||
static SettingRegistrations * settingRegistrations;
|
||||
RegisterSetting(AbstractSetting * s);
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -187,10 +187,11 @@ void RemoteStore::setOptions(Connection & conn)
|
|||
<< settings.useSubstitutes;
|
||||
|
||||
if (GET_PROTOCOL_MINOR(conn.daemonVersion) >= 12) {
|
||||
auto overrides = settings.getSettings(true);
|
||||
std::map<std::string, Config::SettingInfo> overrides;
|
||||
globalConfig.getSettings(overrides, true);
|
||||
conn.to << overrides.size();
|
||||
for (auto & i : overrides)
|
||||
conn.to << i.first << i.second;
|
||||
conn.to << i.first << i.second.value;
|
||||
}
|
||||
|
||||
conn.processStderr();
|
||||
|
|
|
|||
|
|
@ -849,7 +849,7 @@ ref<Store> openStore(const std::string & uri_,
|
|||
for (auto fun : *RegisterStoreImplementation::implementations) {
|
||||
auto store = fun(uri, params);
|
||||
if (store) {
|
||||
store->handleUnknownSettings();
|
||||
store->warnUnknownSettings();
|
||||
return ref<Store>(store);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue