/* vim: set sw=4 sts=4 et foldmethod=syntax : */ /* * Copyright (c) 2010 Ciaran McCreesh * * This file is part of the Paludis package manager. Paludis is free software; * you can redistribute it and/or modify it under the terms of the GNU General * Public License version 2, as published by the Free Software Foundation. * * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace paludis; using namespace paludis::gemcutter_repository; namespace { std::shared_ptr make_store(const GemcutterRepository * const repo, const GemcutterRepositoryParams & p) { return std::make_shared(p.environment(), repo, p.location()); } } namespace paludis { template <> struct Imp { const GemcutterRepositoryParams params; const std::shared_ptr > format_key; const std::shared_ptr > location_key; const ActiveObjectPtr > > store; Imp(const GemcutterRepository * const repo, const GemcutterRepositoryParams & p) : params(p), format_key(std::make_shared >("format", "format", mkt_significant, "gemcutter")), location_key(std::make_shared >("location", "location", mkt_significant, params.location())), store(DeferredConstructionPtr > (std::bind(&make_store, repo, std::cref(params)))) { } }; } GemcutterRepositoryConfigurationError::GemcutterRepositoryConfigurationError(const std::string & s) throw () : ConfigurationError("GemcutterRepository configuration error: " + s) { } GemcutterRepository::GemcutterRepository(const GemcutterRepositoryParams & p) : Pimp(this, p), Repository( p.environment(), p.name(), make_named_values( n::destination_interface() = static_cast(0), n::environment_variable_interface() = static_cast(0), n::make_virtuals_interface() = static_cast(0), n::manifest_interface() = static_cast(0), n::provides_interface() = static_cast(0), n::virtuals_interface() = static_cast(0) )), _imp(Pimp::_imp) { _add_metadata_keys(); } GemcutterRepository::~GemcutterRepository() { } bool GemcutterRepository::can_be_favourite_repository() const { return false; } const bool GemcutterRepository::is_unimportant() const { return false; } void GemcutterRepository::_add_metadata_keys() { clear_metadata_keys(); add_metadata_key(_imp->format_key); add_metadata_key(_imp->location_key); } void GemcutterRepository::need_keys_added() const { } const std::shared_ptr > GemcutterRepository::format_key() const { return _imp->format_key; } const std::shared_ptr > GemcutterRepository::location_key() const { return _imp->location_key; } const std::shared_ptr > GemcutterRepository::installed_root_key() const { return make_null_shared_ptr(); } void GemcutterRepository::invalidate() { _imp.reset(new Imp(this, _imp->params)); _add_metadata_keys(); } void GemcutterRepository::invalidate_masks() { } bool GemcutterRepository::has_category_named(const CategoryNamePart & c) const { return _imp->store->has_category_named(c); } bool GemcutterRepository::has_package_named(const QualifiedPackageName & q) const { return _imp->store->has_package_named(q); } std::shared_ptr GemcutterRepository::category_names() const { return _imp->store->category_names(); } std::shared_ptr GemcutterRepository::unimportant_category_names() const { return _imp->store->unimportant_category_names(); } std::shared_ptr GemcutterRepository::category_names_containing_package(const PackageNamePart & p) const { return Repository::category_names_containing_package(p); } std::shared_ptr GemcutterRepository::package_names(const CategoryNamePart & c) const { return _imp->store->package_names(c); } std::shared_ptr GemcutterRepository::package_ids(const QualifiedPackageName & p) const { return _imp->store->package_ids(p); } namespace { struct SupportsActionQuery { bool visit(const SupportsActionTest &) const { return true; } bool visit(const SupportsActionTest &) const { return true; } bool visit(const SupportsActionTest &) const { return false; } bool visit(const SupportsActionTest &) const { return false; } bool visit(const SupportsActionTest &) const { return false; } bool visit(const SupportsActionTest &) const { return false; } bool visit(const SupportsActionTest &) const { return false; } }; } bool GemcutterRepository::some_ids_might_support_action(const SupportsActionTestBase & a) const { SupportsActionQuery q; return a.accept_returning(q); } bool GemcutterRepository::some_ids_might_not_be_masked() const { return true; } bool GemcutterRepository::sync(const std::string &, const std::shared_ptr &) const { return false; } std::shared_ptr GemcutterRepository::repository_factory_create( Environment * const env, const std::function & f) { Context context("When making repository repository from repo_file '" + f("repo_file") + "':"); std::string name_str(f("name")); if (name_str.empty()) name_str = "gemcutter"; std::string location_str(f("location")); if (location_str.empty()) throw GemcutterRepositoryConfigurationError("Key 'location' not specified or empty"); return std::make_shared( make_named_values( n::environment() = env, n::location() = FSPath(location_str), n::name() = RepositoryName(name_str) )); } RepositoryName GemcutterRepository::repository_factory_name( const Environment * const, const std::function & f) { if (f("name").empty()) return RepositoryName("gemcutter"); else return RepositoryName(f("name")); } std::shared_ptr GemcutterRepository::repository_factory_dependencies( const Environment * const, const std::function &) { return std::make_shared(); } void GemcutterRepository::populate_sets() const { } HookResult GemcutterRepository::perform_hook(const Hook &, const std::shared_ptr &) { return make_named_values(n::max_exit_status() = 0, n::output() = ""); } const std::shared_ptr > GemcutterRepository::accept_keywords_key() const { return make_null_shared_ptr(); } const std::shared_ptr > > GemcutterRepository::sync_host_key() const { return make_null_shared_ptr(); } template class Pimp;