aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvatar David Leverton <levertond@googlemail.com> 2008-10-25 18:21:05 +0100
committerAvatar David Leverton <levertond@googlemail.com> 2008-10-25 18:21:05 +0100
commit649c5a3ffc557f296275e65b60743ece2cc0e6fe (patch)
treedfa395ef1552c0be4fd13be08a6fa899eec50dd7
parent97a4db0abeb773dd45c4aa8b0fe0db07397e28f2 (diff)
downloadpaludis-649c5a3ffc557f296275e65b60743ece2cc0e6fe.tar.gz
paludis-649c5a3ffc557f296275e65b60743ece2cc0e6fe.tar.xz
Support [foo+] and [foo-] in exheres.
Fixes: ticket:642
-rw-r--r--paludis/elike_package_dep_spec.cc2
-rw-r--r--paludis/elike_package_dep_spec.se1
-rw-r--r--paludis/elike_use_requirement.cc170
-rw-r--r--paludis/elike_use_requirement.se1
-rw-r--r--paludis/elike_use_requirement_TEST.cc38
-rw-r--r--paludis/repositories/e/eapis/exheres-0.conf2
-rw-r--r--paludis/repositories/e/eapis/paludis-1.conf2
7 files changed, 163 insertions, 53 deletions
diff --git a/paludis/elike_package_dep_spec.cc b/paludis/elike_package_dep_spec.cc
index 2811141..3c5e3d2 100644
--- a/paludis/elike_package_dep_spec.cc
+++ b/paludis/elike_package_dep_spec.cc
@@ -206,6 +206,8 @@ paludis::elike_remove_trailing_square_bracket_if_exists(std::string & s, Partial
euro += euro_allow_self_deps;
if (options[epdso_allow_use_deps_portage])
euro += options[epdso_allow_use_deps] ? euro_both_syntaxes : euro_portage_syntax;
+ if (options[epdso_allow_use_dep_defaults])
+ euro += euro_allow_default_values;
if (options[epdso_strict_parsing])
euro += euro_strict_parsing;
diff --git a/paludis/elike_package_dep_spec.se b/paludis/elike_package_dep_spec.se
index 212f5b8..c510ce9 100644
--- a/paludis/elike_package_dep_spec.se
+++ b/paludis/elike_package_dep_spec.se
@@ -12,6 +12,7 @@ make_enum_ELikePackageDepSpecOption()
key epdso_allow_repository_deps "Allow ::repo deps"
key epdso_allow_use_deps "Allow [use] deps"
key epdso_allow_use_deps_portage "Allow [use] deps with Portage syntax"
+ key epdso_allow_use_dep_defaults "Allow [use+] and [use-] deps"
key epdso_allow_ranged_deps "Allow [op version] deps"
key epdso_allow_tilde_greater_deps "Allow ~> deps"
key epdso_strict_parsing "Error rather than warn for violations"
diff --git a/paludis/elike_use_requirement.cc b/paludis/elike_use_requirement.cc
index a3a0159..1aabf33 100644
--- a/paludis/elike_use_requirement.cc
+++ b/paludis/elike_use_requirement.cc
@@ -25,6 +25,7 @@
#include <paludis/util/tokeniser.hh>
#include <paludis/util/log.hh>
#include <paludis/util/wrapped_forward_iterator.hh>
+#include <paludis/util/tribool.hh>
#include <paludis/dep_spec.hh>
#include <paludis/name.hh>
#include <paludis/environment.hh>
@@ -39,7 +40,7 @@ using namespace paludis;
namespace
{
- bool icky_use_query(const ChoiceNameWithPrefix & f, const PackageID & id)
+ bool icky_use_query(const ChoiceNameWithPrefix & f, const PackageID & id, Tribool default_value = Tribool(indeterminate))
{
if (! id.choices_key())
{
@@ -52,20 +53,22 @@ namespace
if (v)
return v->enabled();
- if (! id.choices_key()->value()->has_matching_contains_every_value_prefix(f))
+ if (default_value.is_indeterminate() && ! id.choices_key()->value()->has_matching_contains_every_value_prefix(f))
Log::get_instance()->message("elike_use_requirement.query", ll_warning, lc_context) <<
"ID '" << id << "' has no flag named '" << f << "'";
- return false;
+ return default_value.is_true();
}
class UseRequirement
{
private:
const ChoiceNameWithPrefix _name;
+ const Tribool _default_value;
public:
- UseRequirement(const ChoiceNameWithPrefix & n) :
- _name(n)
+ UseRequirement(const ChoiceNameWithPrefix & n, Tribool d) :
+ _name(n),
+ _default_value(d)
{
}
virtual ~UseRequirement() { }
@@ -75,27 +78,42 @@ namespace
return _name;
}
+ const Tribool default_value() const PALUDIS_ATTRIBUTE((warn_unused_result))
+ {
+ return _default_value;
+ }
+
virtual bool requirement_met(const Environment * const, const PackageID &) const PALUDIS_ATTRIBUTE((warn_unused_result)) = 0;
virtual const std::string as_human_string() const PALUDIS_ATTRIBUTE((warn_unused_result)) = 0;
+
+ const std::string default_value_human_string_fragment() const PALUDIS_ATTRIBUTE((warn_unused_result))
+ {
+ if (_default_value.is_true())
+ return ", assuming enabled if missing";
+ else if (_default_value.is_false())
+ return ", assuming disabled if missing";
+ else
+ return "";
+ }
};
class PALUDIS_VISIBLE EnabledUseRequirement :
public UseRequirement
{
public:
- EnabledUseRequirement(const ChoiceNameWithPrefix & n) :
- UseRequirement(n)
+ EnabledUseRequirement(const ChoiceNameWithPrefix & n, Tribool d) :
+ UseRequirement(n, d)
{
}
virtual bool requirement_met(const Environment * const, const PackageID & pkg) const
{
- return icky_use_query(flag(), pkg);
+ return icky_use_query(flag(), pkg, default_value());
}
virtual const std::string as_human_string() const
{
- return "Flag '" + stringify(flag()) + "' enabled";
+ return "Flag '" + stringify(flag()) + "' enabled" + default_value_human_string_fragment();
}
};
@@ -103,19 +121,19 @@ namespace
public UseRequirement
{
public:
- DisabledUseRequirement(const ChoiceNameWithPrefix & n) :
- UseRequirement(n)
+ DisabledUseRequirement(const ChoiceNameWithPrefix & n, Tribool d) :
+ UseRequirement(n, d)
{
}
virtual bool requirement_met(const Environment * const, const PackageID & pkg) const
{
- return ! icky_use_query(flag(), pkg);
+ return ! icky_use_query(flag(), pkg, default_value());
}
virtual const std::string as_human_string() const
{
- return "Flag '" + stringify(flag()) + "' disabled";
+ return "Flag '" + stringify(flag()) + "' disabled" + default_value_human_string_fragment();
}
};
@@ -126,8 +144,8 @@ namespace
const std::tr1::shared_ptr<const PackageID> _id;
public:
- ConditionalUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i) :
- UseRequirement(n),
+ ConditionalUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i, Tribool d) :
+ UseRequirement(n, d),
_id(i)
{
}
@@ -142,19 +160,19 @@ namespace
public ConditionalUseRequirement
{
public:
- IfMineThenUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i) :
- ConditionalUseRequirement(n, i)
+ IfMineThenUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i, Tribool d) :
+ ConditionalUseRequirement(n, i, d)
{
}
virtual bool requirement_met(const Environment * const, const PackageID & pkg) const
{
- return ! icky_use_query(flag(), *package_id()) || icky_use_query(flag(), pkg);
+ return ! icky_use_query(flag(), *package_id()) || icky_use_query(flag(), pkg, default_value());
}
virtual const std::string as_human_string() const
{
- return "Flag '" + stringify(flag()) + "' enabled if it is enabled for '" + stringify(*package_id()) + "'";
+ return "Flag '" + stringify(flag()) + "' enabled if it is enabled for '" + stringify(*package_id()) + "'" + default_value_human_string_fragment();
}
};
@@ -162,19 +180,19 @@ namespace
public ConditionalUseRequirement
{
public:
- IfNotMineThenUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i) :
- ConditionalUseRequirement(n, i)
+ IfNotMineThenUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i, Tribool d) :
+ ConditionalUseRequirement(n, i, d)
{
}
virtual bool requirement_met(const Environment * const, const PackageID & pkg) const
{
- return icky_use_query(flag(), *package_id()) || icky_use_query(flag(), pkg);
+ return icky_use_query(flag(), *package_id()) || icky_use_query(flag(), pkg, default_value());
}
virtual const std::string as_human_string() const
{
- return "Flag '" + stringify(flag()) + "' enabled if it is disabled for '" + stringify(*package_id()) + "'";
+ return "Flag '" + stringify(flag()) + "' enabled if it is disabled for '" + stringify(*package_id()) + "'" + default_value_human_string_fragment();
}
};
@@ -182,19 +200,19 @@ namespace
public ConditionalUseRequirement
{
public:
- IfMineThenNotUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i) :
- ConditionalUseRequirement(n, i)
+ IfMineThenNotUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i, Tribool d) :
+ ConditionalUseRequirement(n, i, d)
{
}
virtual bool requirement_met(const Environment * const, const PackageID & pkg) const
{
- return ! icky_use_query(flag(), *package_id()) || ! icky_use_query(flag(), pkg);
+ return ! icky_use_query(flag(), *package_id()) || ! icky_use_query(flag(), pkg, default_value());
}
virtual const std::string as_human_string() const
{
- return "Flag '" + stringify(flag()) + "' disabled if it is enabled for '" + stringify(*package_id()) + "'";
+ return "Flag '" + stringify(flag()) + "' disabled if it is enabled for '" + stringify(*package_id()) + "'" + default_value_human_string_fragment();
}
};
@@ -202,19 +220,19 @@ namespace
public ConditionalUseRequirement
{
public:
- IfNotMineThenNotUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i) :
- ConditionalUseRequirement(n, i)
+ IfNotMineThenNotUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i, Tribool d) :
+ ConditionalUseRequirement(n, i, d)
{
}
virtual bool requirement_met(const Environment * const, const PackageID & pkg) const
{
- return icky_use_query(flag(), *package_id()) || ! icky_use_query(flag(), pkg);
+ return icky_use_query(flag(), *package_id()) || ! icky_use_query(flag(), pkg, default_value());
}
virtual const std::string as_human_string() const
{
- return "Flag '" + stringify(flag()) + "' disabled if it is disabled for '" + stringify(*package_id()) + "'";
+ return "Flag '" + stringify(flag()) + "' disabled if it is disabled for '" + stringify(*package_id()) + "'" + default_value_human_string_fragment();
}
};
@@ -222,19 +240,19 @@ namespace
public ConditionalUseRequirement
{
public:
- EqualUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i) :
- ConditionalUseRequirement(n, i)
+ EqualUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i, Tribool d) :
+ ConditionalUseRequirement(n, i, d)
{
}
virtual bool requirement_met(const Environment * const, const PackageID & pkg) const
{
- return icky_use_query(flag(), pkg) == icky_use_query(flag(), *package_id());
+ return icky_use_query(flag(), pkg, default_value()) == icky_use_query(flag(), *package_id());
}
virtual const std::string as_human_string() const
{
- return "Flag '" + stringify(flag()) + "' enabled or disabled like it is for '" + stringify(*package_id()) + "'";
+ return "Flag '" + stringify(flag()) + "' enabled or disabled like it is for '" + stringify(*package_id()) + "'" + default_value_human_string_fragment();
}
};
@@ -242,19 +260,19 @@ namespace
public ConditionalUseRequirement
{
public:
- NotEqualUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i) :
- ConditionalUseRequirement(n, i)
+ NotEqualUseRequirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID> & i, Tribool d) :
+ ConditionalUseRequirement(n, i, d)
{
}
virtual bool requirement_met(const Environment * const, const PackageID & pkg) const
{
- return icky_use_query(flag(), pkg) != icky_use_query(flag(), *package_id());
+ return icky_use_query(flag(), pkg, default_value()) != icky_use_query(flag(), *package_id());
}
virtual const std::string as_human_string() const
{
- return "Flag '" + stringify(flag()) + "' enabled or disabled opposite to how it is for '" + stringify(*package_id()) + "'";
+ return "Flag '" + stringify(flag()) + "' enabled or disabled opposite to how it is for '" + stringify(*package_id()) + "'" + default_value_human_string_fragment();
}
};
@@ -295,10 +313,27 @@ namespace
}
};
+ template <typename T_>
+ std::tr1::shared_ptr<const UseRequirement>
+ make_unconditional_requirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID > &, Tribool d)
+ {
+ return make_shared_ptr(new T_(n, d));
+ }
+
+ template <typename T_>
+ std::tr1::shared_ptr<const UseRequirement>
+ make_conditional_requirement(const ChoiceNameWithPrefix & n, const std::tr1::shared_ptr<const PackageID > & i, Tribool d)
+ {
+ return make_shared_ptr(new T_(n, i, d));
+ }
+
std::tr1::shared_ptr<const UseRequirement>
parse_one_use_requirement(const std::string & s, std::string & flag,
const std::tr1::shared_ptr<const PackageID> & id, const ELikeUseRequirementOptions & options)
{
+ typedef std::tr1::shared_ptr<const UseRequirement> (* Factory)(const ChoiceNameWithPrefix &, const std::tr1::shared_ptr<const PackageID> &, Tribool);
+ Factory factory;
+
if (flag.empty())
throw ELikeUseRequirementError(s, "Invalid [] contents");
@@ -325,7 +360,7 @@ namespace
flag.erase(flag.length() - 1, 1);
if (flag.empty())
throw ELikeUseRequirementError(s, "Invalid [] contents");
- return make_shared_ptr(new NotEqualUseRequirement(ChoiceNameWithPrefix(flag), id));
+ factory = make_conditional_requirement<NotEqualUseRequirement>;
}
else if ('!' == flag.at(0))
{
@@ -341,10 +376,10 @@ namespace
flag.erase(0, 1);
if (flag.empty())
throw ELikeUseRequirementError(s, "Invalid [] contents");
- return make_shared_ptr(new NotEqualUseRequirement(ChoiceNameWithPrefix(flag), id));
+ factory = make_conditional_requirement<NotEqualUseRequirement>;
}
else
- return make_shared_ptr(new EqualUseRequirement(ChoiceNameWithPrefix(flag), id));
+ factory = make_conditional_requirement<EqualUseRequirement>;
}
else if ('?' == flag.at(flag.length() - 1))
{
@@ -376,7 +411,7 @@ namespace
if (flag.empty())
throw ELikeUseRequirementError(s, "Invalid [] contents");
- return make_shared_ptr(new IfNotMineThenNotUseRequirement(ChoiceNameWithPrefix(flag), id));
+ factory = make_conditional_requirement<IfNotMineThenNotUseRequirement>;
}
else
{
@@ -389,7 +424,7 @@ namespace
<< "[use!?] not safe for use here";
}
- return make_shared_ptr(new IfNotMineThenUseRequirement(ChoiceNameWithPrefix(flag), id));
+ factory = make_conditional_requirement<IfNotMineThenUseRequirement>;
}
}
else if ('!' == flag.at(0))
@@ -406,8 +441,7 @@ namespace
flag.erase(0, 1);
if (flag.empty())
throw ELikeUseRequirementError(s, "Invalid [] contents");
-
- return make_shared_ptr(new IfNotMineThenNotUseRequirement(ChoiceNameWithPrefix(flag), id));
+ factory = make_conditional_requirement<IfNotMineThenNotUseRequirement>;
}
else
{
@@ -426,10 +460,10 @@ namespace
if (flag.empty())
throw ELikeUseRequirementError(s, "Invalid [] contents");
- return make_shared_ptr(new IfMineThenNotUseRequirement(ChoiceNameWithPrefix(flag), id));
+ factory = make_conditional_requirement<IfMineThenNotUseRequirement>;
}
else
- return make_shared_ptr(new IfMineThenUseRequirement(ChoiceNameWithPrefix(flag), id));
+ factory = make_conditional_requirement<IfMineThenUseRequirement>;
}
}
else if ('-' == flag.at(0))
@@ -437,13 +471,47 @@ namespace
flag.erase(0, 1);
if (flag.empty())
throw ELikeUseRequirementError(s, "Invalid [] contents");
- return make_shared_ptr(new DisabledUseRequirement(ChoiceNameWithPrefix(flag)));
+ factory = make_unconditional_requirement<DisabledUseRequirement>;
+ }
+ else
+ factory = make_unconditional_requirement<EnabledUseRequirement>;
+
+ if ('+' == flag.at(flag.length() - 1))
+ {
+ if (! options[euro_allow_default_values])
+ {
+ if (options[euro_strict_parsing])
+ throw ELikeUseRequirementError(s, "[use+] not safe for use here");
+ else
+ Log::get_instance()->message("e.use_requirement.flag_not_equal_not_allowed", ll_warning, lc_context)
+ << "[use+] not safe for use here";
+ }
+
+ flag.erase(flag.length() - 1, 1);
+ if (flag.empty())
+ throw ELikeUseRequirementError(s, "Invalid [] contents");
+ return factory(ChoiceNameWithPrefix(flag), id, Tribool(true));
+ }
+ else if ('-' == flag.at(flag.length() - 1))
+ {
+ if (! options[euro_allow_default_values])
+ {
+ if (options[euro_strict_parsing])
+ throw ELikeUseRequirementError(s, "[use-] not safe for use here");
+ else
+ Log::get_instance()->message("e.use_requirement.flag_not_equal_not_allowed", ll_warning, lc_context)
+ << "[use-] not safe for use here";
+ }
+
+ flag.erase(flag.length() - 1, 1);
+ if (flag.empty())
+ throw ELikeUseRequirementError(s, "Invalid [] contents");
+ return factory(ChoiceNameWithPrefix(flag), id, Tribool(false));
}
else
- return make_shared_ptr(new EnabledUseRequirement(ChoiceNameWithPrefix(flag)));
+ return factory(ChoiceNameWithPrefix(flag), id, Tribool(indeterminate));
}
}
-
ELikeUseRequirementError::ELikeUseRequirementError(const std::string & s, const std::string & m) throw () :
Exception("Error parsing use requirement '" + s + "': " + m)
{
diff --git a/paludis/elike_use_requirement.se b/paludis/elike_use_requirement.se
index cdda575..ff75d61 100644
--- a/paludis/elike_use_requirement.se
+++ b/paludis/elike_use_requirement.se
@@ -7,6 +7,7 @@ make_enum_ELikeUseRequirementOption()
want_destringify
key euro_allow_self_deps "Allow self-dependent use deps"
+ key euro_allow_default_values "Allow the dep to specify a default value for when the flag is missing"
key euro_portage_syntax "Parse using Portage syntax"
key euro_both_syntaxes "Accept both Portage and Paludis syntax"
key euro_strict_parsing "Error rather than warn for violations"
diff --git a/paludis/elike_use_requirement_TEST.cc b/paludis/elike_use_requirement_TEST.cc
index 8ca98ca..ba340e9 100644
--- a/paludis/elike_use_requirement_TEST.cc
+++ b/paludis/elike_use_requirement_TEST.cc
@@ -806,5 +806,43 @@ namespace test_cases
TEST_CHECK(! req20->requirement_met(&env, *id2));
}
} test_complex_use_requirements_portage_syntax_nonstrict;
+
+ struct UseRequirementsWithDefaultsTest : TestCase
+ {
+ UseRequirementsWithDefaultsTest() : TestCase("use requirements with defaults") { }
+
+ void run()
+ {
+ TestEnvironment env;
+ std::tr1::shared_ptr<FakeRepository> fake(new FakeRepository(&env, RepositoryName("fake")));
+ env.package_database()->add_repository(1, fake);
+ std::tr1::shared_ptr<FakePackageID> id(fake->add_version("cat", "pkg1", "1"));
+ set_conditionals(id, "enabled disabled");
+
+ std::tr1::shared_ptr<const AdditionalPackageDepSpecRequirement> req1(
+ parse_elike_use_requirement("missing+", std::tr1::shared_ptr<const PackageID>(), ELikeUseRequirementOptions() + euro_allow_default_values + euro_strict_parsing));
+ TEST_CHECK_EQUAL(req1->as_raw_string(), "[missing+]");
+ TEST_CHECK_EQUAL(req1->as_human_string(), "Flag 'missing' enabled, assuming enabled if missing");
+ TEST_CHECK(req1->requirement_met(&env, *id));
+
+ std::tr1::shared_ptr<const AdditionalPackageDepSpecRequirement> req2(
+ parse_elike_use_requirement("missing-", std::tr1::shared_ptr<const PackageID>(), ELikeUseRequirementOptions() + euro_allow_default_values + euro_strict_parsing));
+ TEST_CHECK_EQUAL(req2->as_raw_string(), "[missing-]");
+ TEST_CHECK_EQUAL(req2->as_human_string(), "Flag 'missing' enabled, assuming disabled if missing");
+ TEST_CHECK(! req2->requirement_met(&env, *id));
+
+ std::tr1::shared_ptr<const AdditionalPackageDepSpecRequirement> req3(
+ parse_elike_use_requirement("-missing+", std::tr1::shared_ptr<const PackageID>(), ELikeUseRequirementOptions() + euro_allow_default_values + euro_strict_parsing));
+ TEST_CHECK_EQUAL(req3->as_raw_string(), "[-missing+]");
+ TEST_CHECK_EQUAL(req3->as_human_string(), "Flag 'missing' disabled, assuming enabled if missing");
+ TEST_CHECK(! req3->requirement_met(&env, *id));
+
+ std::tr1::shared_ptr<const AdditionalPackageDepSpecRequirement> req4(
+ parse_elike_use_requirement("-missing-", std::tr1::shared_ptr<const PackageID>(), ELikeUseRequirementOptions() + euro_allow_default_values + euro_strict_parsing));
+ TEST_CHECK_EQUAL(req4->as_raw_string(), "[-missing-]");
+ TEST_CHECK_EQUAL(req4->as_human_string(), "Flag 'missing' disabled, assuming disabled if missing");
+ TEST_CHECK(req4->requirement_met(&env, *id));
+ }
+ } test_use_requirements_with_defaults;
}
diff --git a/paludis/repositories/e/eapis/exheres-0.conf b/paludis/repositories/e/eapis/exheres-0.conf
index 017a946..4795a98 100644
--- a/paludis/repositories/e/eapis/exheres-0.conf
+++ b/paludis/repositories/e/eapis/exheres-0.conf
@@ -7,7 +7,7 @@ can_be_pbin = true
package_dep_spec_parse_options = allow_slot_deps allow_use_deps \
allow_ranged_deps allow_tilde_greater_deps strict_parsing \
- allow_slot_equal_deps allow_slot_star_deps
+ allow_slot_equal_deps allow_slot_star_deps allow_use_dep_defaults
dependency_spec_tree_parse_options = disallow_any_use uri_supports_arrow
iuse_flag_parse_options = strict_parsing
merger_options =
diff --git a/paludis/repositories/e/eapis/paludis-1.conf b/paludis/repositories/e/eapis/paludis-1.conf
index e51fa0c..ed40e88 100644
--- a/paludis/repositories/e/eapis/paludis-1.conf
+++ b/paludis/repositories/e/eapis/paludis-1.conf
@@ -7,7 +7,7 @@ can_be_pbin = true
package_dep_spec_parse_options = allow_slot_deps allow_use_deps allow_use_deps_portage allow_ranged_deps \
allow_repository_deps allow_tilde_greater_deps strict_parsing \
- allow_slot_equal_deps allow_slot_star_deps
+ allow_slot_equal_deps allow_slot_star_deps allow_use_dep_defaults
dependency_spec_tree_parse_options = disallow_any_use uri_supports_arrow hard_soft_blocks
iuse_flag_parse_options = allow_iuse_defaults
merger_options = rewrite_symlinks allow_empty_dirs