+ static bool GetBoolOption(std::map<std::string, std::string> const &Options, char const * const name, bool const defVal)
+ {
+ std::map<std::string, std::string>::const_iterator const opt = Options.find(name);
+ if (opt == Options.end())
+ return defVal;
+ return StringToBool(opt->second, defVal);
+ }
+
+ static std::vector<std::string> GetMapKeys(std::map<std::string, std::string> const &Options)
+ {
+ std::vector<std::string> ret;
+ ret.reserve(Options.size());
+ for (auto &&O: Options)
+ ret.emplace_back(O.first);
+ std::sort(ret.begin(), ret.end());
+ return ret;
+ }
+
+ static bool MapsAreEqual(std::map<std::string, std::string> const &OptionsA,
+ std::map<std::string, std::string> const &OptionsB,
+ std::string const &URI, std::string const &Dist)
+ {
+ auto const KeysA = GetMapKeys(OptionsA);
+ auto const KeysB = GetMapKeys(OptionsB);
+ auto const m = std::mismatch(KeysA.begin(), KeysA.end(), KeysB.begin());
+ if (m.first != KeysA.end())
+ {
+ if (std::find(KeysB.begin(), KeysB.end(), *m.first) == KeysB.end())
+ return _error->Error(_("Conflicting values set for option %s regarding source %s %s"), m.first->c_str(), "<set>", "<unset>");
+ else
+ return _error->Error(_("Conflicting values set for option %s regarding source %s %s"), m.second->c_str(), "<set>", "<unset>");
+ }
+ if (m.second != KeysB.end())
+ {
+ if (std::find(KeysA.begin(), KeysA.end(), *m.second) == KeysA.end())
+ return _error->Error(_("Conflicting values set for option %s regarding source %s %s"), m.first->c_str(), "<set>", "<unset>");
+ else
+ return _error->Error(_("Conflicting values set for option %s regarding source %s %s"), m.second->c_str(), "<set>", "<unset>");
+ }
+ for (auto&& key: KeysA)
+ {
+ if (key == "BASE_URI" || key == "REPO_URI")
+ continue;
+ auto const a = OptionsA.find(key);
+ auto const b = OptionsB.find(key);
+ if (unlikely(a == OptionsA.end() || b == OptionsB.end()) || a->second != b->second)
+ return _error->Error(_("Conflicting values set for option %s regarding source %s %s"), key.c_str(), URI.c_str(), Dist.c_str());
+ }
+ return true;
+ }
+