diff options
author | 2012-09-14 19:23:46 +0100 | |
---|---|---|
committer | 2012-09-14 19:23:46 +0100 | |
commit | 86a45d96c02086d83b13856e43ff21aeb927aefd (patch) | |
tree | 1acd9a30da2aacf52c3bd574c0b42deb643e3bee | |
parent | c824c864c34b7a8cfdb29d4c5a8033fc4202c1e1 (diff) | |
download | paludis-86a45d96c02086d83b13856e43ff21aeb927aefd.tar.gz paludis-86a45d96c02086d83b13856e43ff21aeb927aefd.tar.xz |
EAPi 5 has subslots
-rw-r--r-- | paludis/elike_package_dep_spec.cc | 61 | ||||
-rw-r--r-- | paludis/elike_package_dep_spec.se | 1 | ||||
-rw-r--r-- | paludis/repositories/e/e_installed_repository_id.cc | 2 | ||||
-rw-r--r-- | paludis/repositories/e/e_repository_TEST_5.cc | 94 | ||||
-rwxr-xr-x | paludis/repositories/e/e_repository_TEST_5_setup.sh | 29 | ||||
-rw-r--r-- | paludis/repositories/e/e_slot_key.cc | 22 | ||||
-rw-r--r-- | paludis/repositories/e/e_slot_key.hh | 1 | ||||
-rw-r--r-- | paludis/repositories/e/eapi.cc | 1 | ||||
-rw-r--r-- | paludis/repositories/e/eapi.hh | 2 | ||||
-rw-r--r-- | paludis/repositories/e/eapis/0.conf | 1 | ||||
-rw-r--r-- | paludis/repositories/e/eapis/5.conf | 3 | ||||
-rw-r--r-- | paludis/repositories/e/eapis/exheres-0.conf | 1 | ||||
-rw-r--r-- | paludis/repositories/e/eapis/paludis-1.conf | 1 | ||||
-rw-r--r-- | paludis/repositories/e/ebuild_id.cc | 2 | ||||
-rw-r--r-- | paludis/resolver/package_or_block_dep_spec.cc | 2 | ||||
-rw-r--r-- | paludis/serialise.cc | 2 |
16 files changed, 213 insertions, 12 deletions
diff --git a/paludis/elike_package_dep_spec.cc b/paludis/elike_package_dep_spec.cc index c1b08a99a..aa4663a1f 100644 --- a/paludis/elike_package_dep_spec.cc +++ b/paludis/elike_package_dep_spec.cc @@ -286,6 +286,7 @@ paludis::elike_remove_trailing_slot_if_exists(std::string & s, PartiallyMadePack if ("*" == match) { + /* c/p:* */ if (! options[epdso_allow_slot_star_deps]) { if (options[epdso_strict_parsing]) @@ -308,9 +309,26 @@ paludis::elike_remove_trailing_slot_if_exists(std::string & s, PartiallyMadePack } if (1 == match.length()) + { + /* c/p:= */ result.slot_requirement(std::make_shared<ELikeSlotAnyAtAllLockedRequirement>()); + } else - result.slot_requirement(std::make_shared<ELikeSlotExactPartialRequirement>(SlotName(s.substr(slot_p + 2)), std::make_shared<ELikeSlotAnyAtAllLockedRequirement>())); + { + std::string text(s.substr(slot_p + 2)); + auto p(text.find('/')); + if (options[epdso_allow_subslot_deps] && std::string::npos != p) + { + /* c/p:=s/u */ + result.slot_requirement(std::make_shared<ELikeSlotExactFullRequirement>(std::make_pair(SlotName(text.substr(0, p)), SlotName(text.substr(p + 1))), + std::make_shared<ELikeSlotAnyAtAllLockedRequirement>())); + } + else + { + /* c/p:=s */ + result.slot_requirement(std::make_shared<ELikeSlotExactPartialRequirement>(SlotName(text), std::make_shared<ELikeSlotAnyAtAllLockedRequirement>())); + } + } } else { @@ -322,7 +340,46 @@ paludis::elike_remove_trailing_slot_if_exists(std::string & s, PartiallyMadePack Log::get_instance()->message("e.package_dep_spec.slot_not_allowed", ll_warning, lc_context) << "Slot dependencies not safe for use here"; } - result.slot_requirement(std::make_shared<ELikeSlotExactPartialRequirement>(SlotName(s.substr(slot_p + 1)), make_null_shared_ptr())); + + std::string text(s.substr(slot_p + 1)); + auto q(text.find('=')); + + if (options[epdso_allow_subslot_deps] && options[epdso_allow_slot_equal_deps] && std::string::npos != q) + { + std::string left_text(text.substr(0, q)), right_text(text.substr(q + 1)); + auto p(right_text.find('/')); + if (std::string::npos != p) + { + /* c/p:l=s/u */ + result.slot_requirement(std::make_shared<ELikeSlotExactFullRequirement>(std::make_pair(SlotName(right_text.substr(0, p)), SlotName(right_text.substr(p + 1))), + std::make_shared<ELikeSlotAnyPartialLockedRequirement>(SlotName(left_text)))); + } + else if (right_text.empty()) + { + /* c/p:l= */ + result.slot_requirement(std::make_shared<ELikeSlotAnyPartialLockedRequirement>(SlotName(left_text))); + } + else + { + /* c/p:l=s */ + result.slot_requirement(std::make_shared<ELikeSlotExactPartialRequirement>(SlotName(right_text), + std::make_shared<ELikeSlotAnyPartialLockedRequirement>(SlotName(left_text)))); + } + } + else + { + auto p(text.find('/')); + if (options[epdso_allow_subslot_deps] && std::string::npos != p) + { + /* c/p:s/u */ + result.slot_requirement(std::make_shared<ELikeSlotExactFullRequirement>(std::make_pair(SlotName(text.substr(0, p)), SlotName(text.substr(p + 1))), make_null_shared_ptr())); + } + else + { + /* c/p:s */ + result.slot_requirement(std::make_shared<ELikeSlotExactPartialRequirement>(SlotName(text), make_null_shared_ptr())); + } + } } s.erase(slot_p); } diff --git a/paludis/elike_package_dep_spec.se b/paludis/elike_package_dep_spec.se index ad244d1fd..25aaaf2e5 100644 --- a/paludis/elike_package_dep_spec.se +++ b/paludis/elike_package_dep_spec.se @@ -9,6 +9,7 @@ make_enum_ELikePackageDepSpecOption() key epdso_allow_slot_deps "Allow :slot deps" key epdso_allow_slot_star_deps "Allow :* slot deps" key epdso_allow_slot_equal_deps "Allow := and :=blah slot deps" + key epdso_allow_subslot_deps "Allow subslots in slot deps" 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" diff --git a/paludis/repositories/e/e_installed_repository_id.cc b/paludis/repositories/e/e_installed_repository_id.cc index 0cd2266ed..c25d58bd8 100644 --- a/paludis/repositories/e/e_installed_repository_id.cc +++ b/paludis/repositories/e/e_installed_repository_id.cc @@ -226,7 +226,7 @@ EInstalledRepositoryID::need_keys_added() const if (! vars->slot()->name().empty()) if ((_imp->dir / vars->slot()->name()).stat().exists()) { - _imp->keys->slot = ESlotKeyStore::get_instance()->fetch(vars->slot(), file_contents(_imp->dir / vars->slot()->name()), mkt_internal); + _imp->keys->slot = ESlotKeyStore::get_instance()->fetch(*eapi(), vars->slot(), file_contents(_imp->dir / vars->slot()->name()), mkt_internal); add_metadata_key(_imp->keys->slot); } diff --git a/paludis/repositories/e/e_repository_TEST_5.cc b/paludis/repositories/e/e_repository_TEST_5.cc index bc9c86d2b..0c34243e8 100644 --- a/paludis/repositories/e/e_repository_TEST_5.cc +++ b/paludis/repositories/e/e_repository_TEST_5.cc @@ -49,6 +49,8 @@ #include <paludis/selection.hh> #include <paludis/repository_factory.hh> #include <paludis/choice.hh> +#include <paludis/slot.hh> +#include <paludis/unformatted_pretty_printer.hh> #include <functional> #include <set> @@ -319,3 +321,95 @@ TEST(ERepository, RequiredUse) } } +TEST(ERepository, SubSlots) +{ + FSPath root(FSPath::cwd() / "e_repository_TEST_5_dir" / "root"); + + TestEnvironment env; + env.set_system_root(FSPath("e_repository_TEST_5_dir/root").realpath()); + + std::shared_ptr<Map<std::string, std::string> > keys(std::make_shared<Map<std::string, std::string>>()); + keys->insert("format", "e"); + keys->insert("names_cache", "/var/empty"); + keys->insert("location", stringify(FSPath::cwd() / "e_repository_TEST_5_dir" / "repo")); + keys->insert("profiles", stringify(FSPath::cwd() / "e_repository_TEST_5_dir" / "repo/profiles/profile")); + keys->insert("layout", "traditional"); + keys->insert("eapi_when_unknown", "0"); + keys->insert("eapi_when_unspecified", "0"); + keys->insert("profile_eapi", "0"); + keys->insert("distdir", stringify(FSPath::cwd() / "e_repository_TEST_5_dir" / "distdir")); + keys->insert("builddir", stringify(FSPath::cwd() / "e_repository_TEST_5_dir" / "build")); + std::shared_ptr<Repository> repo(ERepository::repository_factory_create(&env, + std::bind(from_keys, keys, std::placeholders::_1))); + env.add_repository(1, repo); + + keys = std::make_shared<Map<std::string, std::string>>(); + keys->insert("format", "vdb"); + keys->insert("names_cache", "/var/empty"); + keys->insert("location", stringify(FSPath::cwd() / "e_repository_TEST_5_dir" / "vdb")); + keys->insert("builddir", stringify(FSPath::cwd() / "e_repository_TEST_5_dir" / "build")); + keys->insert("root", stringify(FSPath("e_repository_TEST_5_dir/root").realpath())); + std::shared_ptr<Repository> installed_repo(VDBRepository::VDBRepository::repository_factory_create(&env, + std::bind(from_keys, keys, std::placeholders::_1))); + env.add_repository(0, installed_repo); + + { + InstallAction install_action(make_named_values<InstallActionOptions>( + n::destination() = installed_repo, + n::make_output_manager() = &make_standard_output_manager, + n::perform_uninstall() = &cannot_uninstall, + n::replacing() = std::make_shared<PackageIDSequence>(), + n::want_phase() = &want_all_phases + )); + + { + const std::shared_ptr<const PackageID> id(*env[selection::RequireExactlyOne(generator::Matches( + PackageDepSpec(parse_user_package_dep_spec("=cat/subslots-5", + &env, { })), make_null_shared_ptr(), { }))]->last()); + ASSERT_TRUE(bool(id)); + EXPECT_EQ("5", visitor_cast<const MetadataValueKey<std::string> >(**id->find_metadata("EAPI"))->parse_value()); + EXPECT_EQ("foo/bar", id->slot_key()->parse_value().raw_value()); + EXPECT_EQ(SlotName("foo"), id->slot_key()->parse_value().match_values().first); + EXPECT_EQ(SlotName("bar"), id->slot_key()->parse_value().match_values().second); + EXPECT_EQ(SlotName("foo"), id->slot_key()->parse_value().parallel_value()); + + id->perform_action(install_action); + } + + installed_repo->invalidate(); + + { + const std::shared_ptr<const PackageID> id(*env[selection::RequireExactlyOne(generator::Matches( + PackageDepSpec(parse_user_package_dep_spec("=cat/subslots-5::installed", + &env, { })), make_null_shared_ptr(), { }))]->last()); + ASSERT_TRUE(bool(id)); + EXPECT_EQ("5", visitor_cast<const MetadataValueKey<std::string> >(**id->find_metadata("EAPI"))->parse_value()); + EXPECT_EQ("foo/bar", id->slot_key()->parse_value().raw_value()); + EXPECT_EQ(SlotName("foo"), id->slot_key()->parse_value().match_values().first); + EXPECT_EQ(SlotName("bar"), id->slot_key()->parse_value().match_values().second); + EXPECT_EQ(SlotName("foo"), id->slot_key()->parse_value().parallel_value()); + } + + { + const std::shared_ptr<const PackageID> id(*env[selection::RequireExactlyOne(generator::Matches( + PackageDepSpec(parse_user_package_dep_spec("=cat/subslot-dep-5", + &env, { })), make_null_shared_ptr(), { }))]->last()); + ASSERT_TRUE(bool(id)); + EXPECT_EQ("5", visitor_cast<const MetadataValueKey<std::string> >(**id->find_metadata("EAPI"))->parse_value()); + EXPECT_EQ("cat/subslots:= cat/subslots:foo=", id->build_dependencies_key()->pretty_print_value(UnformattedPrettyPrinter(), { })); + id->perform_action(install_action); + } + + installed_repo->invalidate(); + + { + const std::shared_ptr<const PackageID> id(*env[selection::RequireExactlyOne(generator::Matches( + PackageDepSpec(parse_user_package_dep_spec("=cat/subslot-dep-5::installed", + &env, { })), make_null_shared_ptr(), { }))]->last()); + ASSERT_TRUE(bool(id)); + EXPECT_EQ("5", visitor_cast<const MetadataValueKey<std::string> >(**id->find_metadata("EAPI"))->parse_value()); + EXPECT_EQ("cat/subslots:=foo/bar cat/subslots:foo=foo/bar", id->build_dependencies_key()->pretty_print_value(UnformattedPrettyPrinter(), { })); + } + } +} + diff --git a/paludis/repositories/e/e_repository_TEST_5_setup.sh b/paludis/repositories/e/e_repository_TEST_5_setup.sh index 0cfff1072..86aa5f8cb 100755 --- a/paludis/repositories/e/e_repository_TEST_5_setup.sh +++ b/paludis/repositories/e/e_repository_TEST_5_setup.sh @@ -414,5 +414,34 @@ src_prepare() { } END +mkdir -p "cat/subslots" || exit 1 +cat << 'END' > cat/subslots/subslots-5.ebuild || exit 1 +EAPI="5" +DESCRIPTION="The Description" +HOMEPAGE="http://example.com/" +SRC_URI="" +SLOT="foo/bar" +IUSE="" +LICENSE="GPL-2" +KEYWORDS="test" + +S="${WORKDIR}" +END + +mkdir -p "cat/subslot-dep" || exit 1 +cat << 'END' > cat/subslot-dep/subslot-dep-5.ebuild || exit 1 +EAPI="5" +DESCRIPTION="The Description" +HOMEPAGE="http://example.com/" +SRC_URI="" +SLOT="0" +IUSE="" +LICENSE="GPL-2" +KEYWORDS="test" +DEPEND="cat/subslots:= cat/subslots:foo=" + +S="${WORKDIR}" +END + cd .. cd .. diff --git a/paludis/repositories/e/e_slot_key.cc b/paludis/repositories/e/e_slot_key.cc index b286f7833..ecc90d111 100644 --- a/paludis/repositories/e/e_slot_key.cc +++ b/paludis/repositories/e/e_slot_key.cc @@ -111,19 +111,31 @@ ESlotKeyStore::~ESlotKeyStore() = default; const std::shared_ptr<const MetadataValueKey<Slot> > ESlotKeyStore::fetch( + const EAPI & eapi, const std::shared_ptr<const EAPIMetadataVariable> & v, - const std::string & s, - const MetadataKeyType t) const + const std::string & ss, + const MetadataKeyType mkt) const { + std::string s(ss), t(ss); + if (eapi.supported()->ebuild_options()->has_subslots()) + { + auto p(s.find('/')); + if (std::string::npos != p) + { + s = ss.substr(0, p); + t = ss.substr(p + 1); + } + } + Lock lock(_imp->mutex); - ESlotKeyStoreIndex x(v, s, t); + ESlotKeyStoreIndex x(v, ss, mkt); auto i(_imp->store.find(x)); if (i == _imp->store.end()) i = _imp->store.insert(std::make_pair(x, std::make_shared<const ESlotKey>(make_named_values<Slot>( - n::match_values() = std::make_pair(s, s), + n::match_values() = std::make_pair(s, t), n::parallel_value() = s, - n::raw_value() = s), v, t))).first; + n::raw_value() = ss), v, mkt))).first; return i->second; } diff --git a/paludis/repositories/e/e_slot_key.hh b/paludis/repositories/e/e_slot_key.hh index 92aeee1f0..fd2115b99 100644 --- a/paludis/repositories/e/e_slot_key.hh +++ b/paludis/repositories/e/e_slot_key.hh @@ -41,6 +41,7 @@ namespace paludis public: const std::shared_ptr<const MetadataValueKey<Slot> > fetch( + const EAPI &, const std::shared_ptr<const EAPIMetadataVariable> &, const std::string &, const MetadataKeyType) const PALUDIS_ATTRIBUTE((warn_unused_result)); diff --git a/paludis/repositories/e/eapi.cc b/paludis/repositories/e/eapi.cc index 053c9eb9d..89f1bc33f 100644 --- a/paludis/repositories/e/eapi.cc +++ b/paludis/repositories/e/eapi.cc @@ -179,6 +179,7 @@ namespace n::fix_mtimes() = destringify_key<bool>(k, "fix_mtimes"), n::fs_location_description() = check_get(k, "fs_location_description"), n::fs_location_name() = check_get(k, "fs_location_name"), + n::has_subslots() = destringify_key<bool>(k, "has_subslots"), n::ignore_pivot_env_functions() = check_get(k, "ignore_pivot_env_functions"), n::ignore_pivot_env_variables() = check_get(k, "ignore_pivot_env_variables"), n::load_modules() = check_get(k, "load_modules"), diff --git a/paludis/repositories/e/eapi.hh b/paludis/repositories/e/eapi.hh index c575f89a3..fbd836b8c 100644 --- a/paludis/repositories/e/eapi.hh +++ b/paludis/repositories/e/eapi.hh @@ -143,6 +143,7 @@ namespace paludis typedef Name<struct name_has_expensive_tests> has_expensive_tests; typedef Name<struct name_has_optional_tests> has_optional_tests; typedef Name<struct name_has_recommended_tests> has_recommended_tests; + typedef Name<struct name_has_subslots> has_subslots; typedef Name<struct name_homepage> homepage; typedef Name<struct name_ignore_pivot_env_functions> ignore_pivot_env_functions; typedef Name<struct name_ignore_pivot_env_variables> ignore_pivot_env_variables; @@ -426,6 +427,7 @@ namespace paludis NamedValue<n::fix_mtimes, bool> fix_mtimes; NamedValue<n::fs_location_description, std::string> fs_location_description; NamedValue<n::fs_location_name, std::string> fs_location_name; + NamedValue<n::has_subslots, bool> has_subslots; NamedValue<n::ignore_pivot_env_functions, std::string> ignore_pivot_env_functions; NamedValue<n::ignore_pivot_env_variables, std::string> ignore_pivot_env_variables; NamedValue<n::load_modules, std::string> load_modules; diff --git a/paludis/repositories/e/eapis/0.conf b/paludis/repositories/e/eapis/0.conf index fe1906f81..c568fd1b0 100644 --- a/paludis/repositories/e/eapis/0.conf +++ b/paludis/repositories/e/eapis/0.conf @@ -283,6 +283,7 @@ no_s_workdir_fallback = false use_with_enable_empty_third_argument = false best_has_version_host_root = false new_stdin = false +has_subslots = false unpack_suffixes = tar tar.gz,tgz,tar.Z tar.bz2,tbz2,tbz zip,ZIP,jar gz,Z,z bz2 rar,RAR lha,LHa,LHA,lzh a,deb tar.lzma lzma 7z,7Z diff --git a/paludis/repositories/e/eapis/5.conf b/paludis/repositories/e/eapis/5.conf index e3e0c3281..d78733c95 100644 --- a/paludis/repositories/e/eapis/5.conf +++ b/paludis/repositories/e/eapis/5.conf @@ -14,7 +14,7 @@ description_iuse = Listed relevant USE flags vdb_from_env_variables = ${vdb_from_env_variables} IUSE_EFFECTIVE package_dep_spec_parse_options = ${package_dep_spec_parse_options} \ - allow_slot_equal_deps allow_slot_star_deps + allow_slot_equal_deps allow_slot_star_deps allow_subslot_deps ebuild_module_suffixes = 5 4 3 2 1 0 utility_path_suffixes = 5 4 3 2 1 0 @@ -33,4 +33,5 @@ new_stdin = true require_use_expand_in_iuse = true profile_iuse_injection = true +has_subslots = true diff --git a/paludis/repositories/e/eapis/exheres-0.conf b/paludis/repositories/e/eapis/exheres-0.conf index 49c30d0fd..bb825fa92 100644 --- a/paludis/repositories/e/eapis/exheres-0.conf +++ b/paludis/repositories/e/eapis/exheres-0.conf @@ -358,6 +358,7 @@ fix_mtimes = true shell_options = extglob globstar best_has_version_host_root = false new_stdin = false +has_subslots = false unpack_suffixes = tar tar.gz,tgz,tar.Z tar.bz2,tbz2,tbz zip,ZIP,jar gz,Z,z bz2 rar,RAR lha,LHa,LHA,lzh a,deb tar.lzma lzma 7z,7Z tar.xz xz diff --git a/paludis/repositories/e/eapis/paludis-1.conf b/paludis/repositories/e/eapis/paludis-1.conf index 61f339626..5b66b19f3 100644 --- a/paludis/repositories/e/eapis/paludis-1.conf +++ b/paludis/repositories/e/eapis/paludis-1.conf @@ -34,6 +34,7 @@ fix_mtimes = false fs_location_name = EBUILD fs_location_description = Ebuild Location allow_tokens_in_mask_files = false +has_subslots = false vdb_from_env_variables = \ CATEGORY CHOST COUNTER DEPEND DESCRIPTION EAPI FEATURES \ diff --git a/paludis/repositories/e/ebuild_id.cc b/paludis/repositories/e/ebuild_id.cc index 180fd28d9..f0c36b2b0 100644 --- a/paludis/repositories/e/ebuild_id.cc +++ b/paludis/repositories/e/ebuild_id.cc @@ -1239,7 +1239,7 @@ void EbuildID::load_slot(const std::shared_ptr<const EAPIMetadataVariable> & m, const std::string & v) const { Lock l(_imp->mutex); - _imp->slot = ESlotKeyStore::get_instance()->fetch(m, v, mkt_internal); + _imp->slot = ESlotKeyStore::get_instance()->fetch(*eapi(), m, v, mkt_internal); add_metadata_key(_imp->slot); } diff --git a/paludis/resolver/package_or_block_dep_spec.cc b/paludis/resolver/package_or_block_dep_spec.cc index b1b5a58bf..36cee2fe8 100644 --- a/paludis/resolver/package_or_block_dep_spec.cc +++ b/paludis/resolver/package_or_block_dep_spec.cc @@ -110,7 +110,7 @@ PackageOrBlockDepSpec::deserialise(Deserialisation & d, const std::shared_ptr<co epdso_allow_ranged_deps, epdso_allow_use_deps, epdso_allow_use_deps_portage, epdso_allow_use_dep_defaults, epdso_allow_repository_deps, epdso_allow_slot_star_deps, epdso_allow_slot_equal_deps, epdso_allow_slot_deps, epdso_allow_key_requirements, - epdso_allow_use_dep_question_defaults }, + epdso_allow_use_dep_question_defaults, epdso_allow_subslot_deps }, { vso_flexible_dashes, vso_flexible_dots, vso_ignore_case, vso_letters_anywhere, vso_dotted_suffixes })); diff --git a/paludis/serialise.cc b/paludis/serialise.cc index 4941e857e..85277eed9 100644 --- a/paludis/serialise.cc +++ b/paludis/serialise.cc @@ -375,7 +375,7 @@ DeserialisatorHandler<std::shared_ptr<const PackageID> >::handle(Deserialisation epdso_allow_ranged_deps, epdso_allow_use_deps, epdso_allow_use_deps_portage, epdso_allow_use_dep_defaults, epdso_allow_repository_deps, epdso_allow_slot_star_deps, epdso_allow_slot_equal_deps, epdso_allow_slot_deps, epdso_allow_key_requirements, - epdso_allow_use_dep_question_defaults }, + epdso_allow_use_dep_question_defaults, epdso_allow_subslot_deps }, { vso_flexible_dashes, vso_flexible_dots, vso_ignore_case, vso_letters_anywhere, vso_dotted_suffixes }), make_null_shared_ptr(), { }))]->begin(); } |