/* vim: set sw=4 sts=4 et foldmethod=syntax : */ /* * Copyright (c) 2007, 2008, 2009, 2010, 2011 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 */ #ifndef PALUDIS_GUARD_PALUDIS_ACTION_HH #define PALUDIS_GUARD_PALUDIS_ACTION_HH 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** \file * Declarations for action-related classes. * * \ingroup g_actions * * \section Examples * * - \ref example_action.cc "example_action.cc" */ namespace paludis { namespace n { typedef Name config_protect; typedef Name destination; typedef Name errors; typedef Name exclude_unmirrorable; typedef Name failed_automatic_fetching; typedef Name failed_integrity_checks; typedef Name fetch_parts; typedef Name if_for_install_id; typedef Name ignore_for_unmerge; typedef Name ignore_unfetched; typedef Name is_overwrite; typedef Name make_output_manager; typedef Name override_contents; typedef Name perform_uninstall; typedef Name replacing; typedef Name requires_manual_fetching; typedef Name safe_resume; typedef Name target_file; typedef Name want_phase; typedef Name ignore_not_in_manifest; } /** * Options for a FetchAction. * * \see FetchAction * \ingroup g_actions * \since 0.30 */ struct FetchActionOptions { /** * Any errors that occur will be added to this list. Must not be null. * * \since 0.40 */ NamedValue > > errors; /** * \since 0.32 */ NamedValue exclude_unmirrorable; /** * Which parts to fetch. * * \since 0.43 */ NamedValue fetch_parts; /** * Ignore if a package is or isn't referenced in the Manifest. * It's useful for generating manifests, to avoid getting errors * before generating it. * * \since 0.46 */ NamedValue ignore_not_in_manifest; /** * Ignore any unfetched packages. Verify digests for anything that's * already there, and if we know for sure manual fetching will be * required, raise the appropriate error. * * \since 0.36 */ NamedValue ignore_unfetched; /** * This is a function to avoid chicken / egg problems when using * Environment::create_output_manager. * * \since 0.36 */ NamedValue ( const FetchAction &)> > make_output_manager; NamedValue safe_resume; /** * \since 0.48 */ NamedValue > want_phase; }; /** * Options for an InstallAction. * * \see InstallAction * \ingroup g_actions * \since 0.30 */ struct InstallActionOptions { NamedValue > destination; /** * This is a function to avoid chicken / egg problems when using * Environment::create_output_manager. * * \since 0.36 */ NamedValue ( const InstallAction &)> > make_output_manager; /** * Callback to carry out an uninstall, for replacing. * * Won't necessarily be used. Some repositories have special code paths * for reinstalls, and in some cases (e.g. accounts) an upgrade doesn't * remove the old version at all. * * \since 0.36 */ NamedValue &, const UninstallActionOptions & )> > perform_uninstall; /** * We must replace these. * * \since 0.36 */ NamedValue > replacing; NamedValue > want_phase; }; /** * Options for an UninstallAction. * * \see UninstallAction * \ingroup g_actions * \since 0.30 */ struct UninstallActionOptions { NamedValue config_protect; /** * If we're being uninstalled as part of an install, this is the ID * that's being installed. Otherwise null. * * \since 0.36 */ NamedValue > if_for_install_id; /** * Sometimes we never want to unmerge certain files. * * \since 0.38 * \since 0.55 uses FSPath */ NamedValue > ignore_for_unmerge; /** * Some repositories need to do special handlings for direct overwrites * (foo-1.2 replacing foo-1.2). Clients should set this to false. * * \since 0.36 */ NamedValue is_overwrite; /** * This is a function to avoid chicken / egg problems when using * Environment::create_output_manager. * * \since 0.36 */ NamedValue ( const UninstallAction &)> > make_output_manager; /** * Sometimes we need to override the contents of an installed package, * for example when doing 'overwrite' merges for VDB. * * Not all repositories support this, or do what you expect with it. Clients * should always set this to null. * * \since 0.61 */ NamedValue > override_contents; }; /** * A failed fetch action part. * * \see FetchActionError * \ingroup g_actions * \since 0.30 */ struct FetchActionFailure { NamedValue failed_automatic_fetching; NamedValue failed_integrity_checks; NamedValue requires_manual_fetching; NamedValue target_file; }; /** * An Action represents an action that can be executed by a PackageID via * PackageID::perform_action. * * \since 0.26 * \ingroup g_actions * \nosubgrouping */ class PALUDIS_VISIBLE Action : public virtual DeclareAbstractAcceptMethods::Type> { public: ///\name Basic operations ///\{ virtual ~Action() = 0; ///\} /** * A simple string name (install, uninstall, pretend-fetch etc). * * \since 0.44 */ virtual const std::string simple_name() const PALUDIS_ATTRIBUTE((warn_unused_result)) = 0; }; /** * An InstallAction is used by InstallTask to perform a build / install on a * PackageID. * * \since 0.26 * \ingroup g_actions * \nosubgrouping */ class PALUDIS_VISIBLE InstallAction : public Action, public ImplementAcceptMethods { private: Pimp _imp; public: ///\name Basic operations ///\{ InstallAction(const InstallActionOptions &); ~InstallAction(); ///\} /// Options for the action. const InstallActionOptions & options; virtual const std::string simple_name() const PALUDIS_ATTRIBUTE((warn_unused_result)); static const std::string class_simple_name() PALUDIS_ATTRIBUTE((warn_unused_result)); }; /** * A FetchAction can be used to fetch source files for a PackageID using * PackageID::perform_action. * * \since 0.26 * \ingroup g_actions * \nosubgrouping */ class PALUDIS_VISIBLE FetchAction : public Action, public ImplementAcceptMethods { private: Pimp _imp; public: ///\name Basic operations ///\{ FetchAction(const FetchActionOptions &); ~FetchAction(); ///\} /// Options for the action. const FetchActionOptions & options; virtual const std::string simple_name() const PALUDIS_ATTRIBUTE((warn_unused_result)); static const std::string class_simple_name() PALUDIS_ATTRIBUTE((warn_unused_result)); static const std::string ignore_unfetched_flag_name() PALUDIS_ATTRIBUTE((warn_unused_result)); }; /** * An UninstallAction is used by UninstallTask to uninstall a PackageID. * * \since 0.26 * \ingroup g_actions * \nosubgrouping */ class PALUDIS_VISIBLE UninstallAction : public Action, public ImplementAcceptMethods { private: Pimp _imp; public: ///\name Basic operations ///\{ UninstallAction(const UninstallActionOptions &); ~UninstallAction(); ///\} /// Options for the action. const UninstallActionOptions & options; virtual const std::string simple_name() const PALUDIS_ATTRIBUTE((warn_unused_result)); static const std::string class_simple_name() PALUDIS_ATTRIBUTE((warn_unused_result)); }; /** * Options for a PretendAction. * * \see PretendAction * \ingroup g_actions * \since 0.36 */ struct PretendActionOptions { NamedValue > destination; /** * This is a function to avoid chicken / egg problems when using * Environment::create_output_manager. * * \since 0.36 */ NamedValue ( const PretendAction &)> > make_output_manager; /** * We will replace these. * * \since 0.55 */ NamedValue > replacing; }; /** * A PretendAction is used by InstallTask to handle install-pretend-phase * checks on a PackageID. * * \since 0.26 * \ingroup g_actions * \nosubgrouping */ class PALUDIS_VISIBLE PretendAction : public Action, public ImplementAcceptMethods { private: Pimp _imp; public: ///\name Basic operations ///\{ /** * \since 0.36 */ PretendAction(const PretendActionOptions &); ~PretendAction(); ///\} /// Did our pretend phase fail? bool failed() const PALUDIS_ATTRIBUTE((warn_unused_result)); /// Mark the action as failed. void set_failed(); /** * \since 0.36 */ const PretendActionOptions & options; virtual const std::string simple_name() const PALUDIS_ATTRIBUTE((warn_unused_result)); static const std::string class_simple_name() PALUDIS_ATTRIBUTE((warn_unused_result)); }; /** * A PretendFetchAction is used to get information about a fetch that will take * place on a PackageID. * * \since 0.26 * \ingroup g_actions * \nosubgrouping */ class PALUDIS_VISIBLE PretendFetchAction : public Action, public ImplementAcceptMethods { private: Pimp _imp; public: ///\name Basic operations ///\{ PretendFetchAction(const FetchActionOptions &); ~PretendFetchAction(); ///\} /// Options for the FetchAction we will use. const FetchActionOptions & options; /// Signal that we will fetch a particular file. virtual void will_fetch(const FSPath & destination, const unsigned long size_in_bytes) = 0; virtual const std::string simple_name() const PALUDIS_ATTRIBUTE((warn_unused_result)); static const std::string class_simple_name() PALUDIS_ATTRIBUTE((warn_unused_result)); }; /** * Options for a ConfigAction. * * \see ConfigAction * \ingroup g_actions * \since 0.36 */ struct ConfigActionOptions { /** * This is a function to avoid chicken / egg problems when using * Environment::create_output_manager. * * \since 0.36 */ NamedValue ( const ConfigAction &)> > make_output_manager; }; /** * A ConfigAction is used via PackageID::perform_action to execute * post-install configuration (for example, via 'paludis --config') * on a PackageID. * * \since 0.26 * \ingroup g_actions * \nosubgrouping */ class PALUDIS_VISIBLE ConfigAction : public Action, public ImplementAcceptMethods { private: Pimp _imp; public: ///\name Basic operations ///\{ /** * \since 0.36 */ ConfigAction(const ConfigActionOptions &); ~ConfigAction(); ///\} /** * \since 0.36 */ const ConfigActionOptions & options; virtual const std::string simple_name() const PALUDIS_ATTRIBUTE((warn_unused_result)); static const std::string class_simple_name() PALUDIS_ATTRIBUTE((warn_unused_result)); }; /** * Options for an InfoAction. * * \see InfoAction * \ingroup g_actions * \since 0.36 */ struct InfoActionOptions { /** * This is a function to avoid chicken / egg problems when using * Environment::create_output_manager. * * \since 0.36 */ NamedValue ( const InfoAction &)> > make_output_manager; }; /** * An InfoAction is used via PackageID::perform_action to execute * additional information (for example, via 'paludis --info') * on a PackageID. * * This action potentially makes sense for both installed and * installable packages. Unlike Ebuild EAPI-0 'pkg_info', this * action is not specifically tied to installed packages. * * \since 0.26 * \ingroup g_actions * \nosubgrouping */ class PALUDIS_VISIBLE InfoAction: public Action, public ImplementAcceptMethods { private: Pimp _imp; public: ///\name Basic operations ///\{ /** * \since 0.36 */ InfoAction(const InfoActionOptions &); ~InfoAction(); ///\} /** * \since 0.36 */ const InfoActionOptions & options; virtual const std::string simple_name() const PALUDIS_ATTRIBUTE((warn_unused_result)); static const std::string class_simple_name() PALUDIS_ATTRIBUTE((warn_unused_result)); }; /** * Base class for SupportsActionTest<>. * * \see SupportsActionTest<> * \since 0.26 * \ingroup g_actions * \nosubgrouping */ class PALUDIS_VISIBLE SupportsActionTestBase : public virtual DeclareAbstractAcceptMethods, SupportsActionTest, SupportsActionTest, SupportsActionTest, SupportsActionTest, SupportsActionTest, SupportsActionTest >::Type> { public: virtual ~SupportsActionTestBase() = 0; }; /** * Instantiated with an Action subclass as its template parameter, * SupportsActionTest<> is used by PackageID::supports_action and * Repository::some_ids_might_support_action to query whether a * particular action is supported by that PackageID or potentially * supported by some IDs in that Repository. * * Use of a separate class, rather than a mere Action, avoids the * need to create bogus options for the more complicated Action * subclasses. * * \since 0.26 * \ingroup g_actions * \nosubgrouping */ template class PALUDIS_VISIBLE SupportsActionTest : public SupportsActionTestBase, public ImplementAcceptMethods > { }; /** * Thrown if an action fails. * * \ingroup g_actions * \ingroup g_exceptions * \since 0.42 */ class PALUDIS_VISIBLE ActionFailedError : public Exception { public: ///\name Basic operations ///\{ ActionFailedError(const std::string & msg) throw (); ///\} }; /** * Thrown if an action is aborted. * * \ingroup g_actions * \ingroup g_exceptions * \since 0.42 */ class PALUDIS_VISIBLE ActionAbortedError : public Exception { public: ///\name Basic operations ///\{ ActionAbortedError(const std::string &) throw (); ///\} }; extern template class Pimp; extern template class Pimp; extern template class Pimp; extern template class Pimp; extern template class Pimp; extern template class Pimp; extern template class Pimp; } #endif