Exheredludis/paludis/repository.hh
Wouter van Kesteren a7fe415ebf nothrow -> noexcept
Change-Id: I944ad237c1cdf9cd49fd94184171555f1b550c0f
Reviewed-on: https://galileo.mailstation.de/gerrit/1894
Reviewed-by: Saleem Abdulrasool <compnerd@compnerd.org>
Reviewed-by: Kylie McClain <somasis@exherbo.org>
2015-08-21 17:21:47 +02:00

578 lines
19 KiB
C++

/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2013 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_REPOSITORY_HH
#define PALUDIS_GUARD_PALUDIS_REPOSITORY_HH 1
#include <paludis/action-fwd.hh>
#include <paludis/repository-fwd.hh>
#include <paludis/dep_spec-fwd.hh>
#include <paludis/spec_tree-fwd.hh>
#include <paludis/name.hh>
#include <paludis/package_id-fwd.hh>
#include <paludis/partitioning-fwd.hh>
#include <paludis/util/attributes.hh>
#include <paludis/util/exception.hh>
#include <paludis/util/fs_path.hh>
#include <paludis/util/wrapped_forward_iterator-fwd.hh>
#include <paludis/util/options.hh>
#include <paludis/util/named_value.hh>
#include <paludis/util/timestamp.hh>
#include <paludis/util/singleton.hh>
#include <paludis/util/map-fwd.hh>
#include <paludis/output_manager-fwd.hh>
#include <paludis/version_spec.hh>
#include <paludis/metadata_key-fwd.hh>
#include <paludis/metadata_key_holder.hh>
#include <paludis/merger-fwd.hh>
#include <paludis/hook-fwd.hh>
#include <string>
#include <functional>
/** \file
* Declarations for Repository classes.
*
* \ingroup g_repository
*
* \section Examples
*
* - \ref example_repository.cc "example_repository.cc"
*/
namespace paludis
{
namespace n
{
typedef Name<struct name_arch> arch;
typedef Name<struct name_build_start_time> build_start_time;
typedef Name<struct name_check> check;
typedef Name<struct name_destination_interface> destination_interface;
typedef Name<struct name_environment_file> environment_file;
typedef Name<struct name_environment_variable_interface> environment_variable_interface;
typedef Name<struct name_image_dir> image_dir;
typedef Name<struct name_is_volatile> is_volatile;
typedef Name<struct name_manifest_interface> manifest_interface;
typedef Name<struct name_merged_entries> merged_entries;
typedef Name<struct name_options> options;
typedef Name<struct name_output_manager> output_manager;
typedef Name<struct name_package_id> package_id;
typedef Name<struct name_parts> parts;
typedef Name<struct name_path> path;
typedef Name<struct name_perform_uninstall> perform_uninstall;
typedef Name<struct name_permit_destination> permit_destination;
typedef Name<struct name_profile> profile;
typedef Name<struct name_replacing> replacing;
typedef Name<struct name_status> status;
typedef Name<struct name_used_this_for_config_protect> used_this_for_config_protect;
typedef Name<struct name_want_phase> want_phase;
}
/**
* Optional interfaces that may be provided by a Repository.
*
* \see Repository
* \ingroup g_repository
* \since 0.30
*/
struct RepositoryCapabilities
{
NamedValue<n::destination_interface, RepositoryDestinationInterface *> destination_interface;
NamedValue<n::environment_variable_interface, RepositoryEnvironmentVariableInterface *> environment_variable_interface;
NamedValue<n::manifest_interface, RepositoryManifestInterface *> manifest_interface;
};
/**
* Parameters for RepositoryDestinationInterface::merge.
*
* \see RepositoryDestinationInterface
* \ingroup g_repository
* \since 0.30
*/
struct MergeParams
{
/**
* The start of the build time (for binaries, should really be when the
* binary was originally built).
*
* \since 0.44
*/
NamedValue<n::build_start_time, Timestamp> build_start_time;
/**
* Whether to check or perform the merge.
*
* A check must be performed before a merge.
*
* \since 0.59
*/
NamedValue<n::check, bool> check;
NamedValue<n::environment_file, FSPath> environment_file;
NamedValue<n::image_dir, FSPath> image_dir;
/**
* Whether or not a file is volatile.
* \since 2.0.0
*/
NamedValue<n::is_volatile, std::function<bool (const FSPath &)> > is_volatile;
/**
* We record things we merged here.
* \since 0.41
*/
NamedValue<n::merged_entries, std::shared_ptr<FSPathSet> > merged_entries;
NamedValue<n::options, MergerOptions> options;
NamedValue<n::output_manager, std::shared_ptr<OutputManager> > output_manager;
NamedValue<n::package_id, std::shared_ptr<const PackageID> > package_id;
/**
* Package partioning.
* \since 1.1.0
*/
NamedValue<n::parts, std::shared_ptr<Partitioning> > parts;
/**
* Some merges need to do an uninstall mid-way through the merge process.
*
* \see InstallActionOptions::perform_uninstall
* \since 0.36
*/
NamedValue<n::perform_uninstall, std::function<void (
const std::shared_ptr<const PackageID> &,
const UninstallActionOptions &)> > perform_uninstall;
///\since 0.66
NamedValue<n::permit_destination, PermitDestinationFn> permit_destination;
/**
* Someone needs to replace these (either the merge or the install).
*
* \since 0.57
*/
NamedValue<n::replacing, std::shared_ptr<const PackageIDSequence> > replacing;
NamedValue<n::used_this_for_config_protect, std::function<void (const std::string &)> > used_this_for_config_protect;
/**
* Sometimes merging runs phase functions, possibly via perform_uninstall.
*
* \since 0.77
*/
NamedValue<n::want_phase, std::function<WantPhase (const std::string &)> > want_phase;
};
/**
* Thrown if a Set does not exist
*
* \ingroup g_exceptions
* \ingroup g_repository
* \nosubgrouping
*/
class PALUDIS_VISIBLE NoSuchSetError :
public Exception
{
private:
std::string _name;
public:
///\name Basic operations
///\{
NoSuchSetError(const std::string & name) noexcept;
virtual ~NoSuchSetError();
///\}
/**
* Name of the set.
*/
const std::string name() const;
};
/**
* Thrown if a Set is recursively defined
*
* \ingroup g_exceptions
* \ingroup g_repository
* \nosubgrouping
*/
class PALUDIS_VISIBLE RecursivelyDefinedSetError :
public Exception
{
private:
std::string _name;
public:
///\name Basic operations
///\{
RecursivelyDefinedSetError(const std::string & name) noexcept;
virtual ~RecursivelyDefinedSetError();
///\}
/**
* Name of the set.
*/
const std::string name() const;
};
/**
* A Repository provides a representation of a physical repository to an
* Environment.
*
* \ingroup g_repository
* \nosubgrouping
*/
class PALUDIS_VISIBLE Repository :
public RepositoryCapabilities,
public MetadataKeyHolder
{
private:
Pimp<Repository> _imp;
protected:
///\name Basic operations
///\{
Repository(const Environment * const, const RepositoryName &, const RepositoryCapabilities &);
///\}
public:
///\name Basic operations
///\{
virtual ~Repository();
Repository(const Repository &) = delete;
Repository & operator= (const Repository &) = delete;
///\}
///\name Repository information
///\{
/**
* Return our name.
*/
const RepositoryName name() const noexcept PALUDIS_ATTRIBUTE((warn_unused_result));
///\}
///\name Specific metadata keys
///\{
/**
* The format_key, if non-zero, holds our repository's format. Repository
* implementations should not return zero here, but clients should still
* check.
*/
virtual const std::shared_ptr<const MetadataValueKey<std::string> > format_key() const = 0;
/**
* The location_key, if non-zero, holds the file or directory containing
* our repository's data, the format of which depends on the value of
* format_key.
*/
virtual const std::shared_ptr<const MetadataValueKey<FSPath> > location_key() const = 0;
/**
* The installed_root_key, if non-zero, specifies that we contain installed
* packages at the specified root.
*
* This key is currently used in various places to determine whether a repository is
* an 'installed' repository or not.
*/
virtual const std::shared_ptr<const MetadataValueKey<FSPath> > installed_root_key() const = 0;
/**
* The sync_host_key, if present, should have value containing
* the host against which a sync will be performed for each suffix.
*
* This is used to avoid starting multiple parallel syncs against
* the same host.
*
* \since 0.44
* \since 0.55 is a Map<std::string, std::string>.
*/
virtual const std::shared_ptr<const MetadataCollectionKey<Map<std::string, std::string> > > sync_host_key() const = 0;
///\}
///\name Repository content queries
///\{
/**
* Do we have a category with the given name?
*
* \since 0.59 takes repository_content_may_excludes
*/
virtual bool has_category_named(const CategoryNamePart & c,
const RepositoryContentMayExcludes & repository_content_may_excludes) const = 0;
/**
* Do we have a package in the given category with the given name?
*/
virtual bool has_package_named(const QualifiedPackageName & q,
const RepositoryContentMayExcludes & repository_content_may_excludes) const = 0;
/**
* Fetch our category names.
*/
virtual std::shared_ptr<const CategoryNamePartSet> category_names(
const RepositoryContentMayExcludes & repository_content_may_excludes) const = 0;
/**
* Fetch unimportant categories.
*/
virtual std::shared_ptr<const CategoryNamePartSet> unimportant_category_names(
const RepositoryContentMayExcludes & repository_content_may_excludes) const;
/**
* Are we unimportant?
*
* In disambiguation, anything gets preferred over packages from unimportant repositories.
*
* \since 0.46
*/
virtual const bool is_unimportant() const = 0;
/**
* Fetch categories that contain a named package.
*/
virtual std::shared_ptr<const CategoryNamePartSet> category_names_containing_package(
const PackageNamePart & p,
const RepositoryContentMayExcludes & repository_content_may_excludes) const;
/**
* Fetch our package names.
*/
virtual std::shared_ptr<const QualifiedPackageNameSet> package_names(
const CategoryNamePart & c,
const RepositoryContentMayExcludes & repository_content_may_excludes) const = 0;
/**
* Fetch our IDs.
*/
virtual std::shared_ptr<const PackageIDSequence> package_ids(const QualifiedPackageName & p,
const RepositoryContentMayExcludes & repository_content_may_excludes) const = 0;
/**
* Might some of our IDs support a particular action?
*
* Used to optimise various Generator and Filter queries. If a
* repository doesn't support, say, InstallAction, a query can skip
* searching it entirely when looking for installable packages.
*/
virtual bool some_ids_might_support_action(const SupportsActionTestBase &) const = 0;
/**
* Might some of our IDs be not masked?
*
* Used to optimise various Generator and Filter queries.
*
* \since 0.49
*/
virtual bool some_ids_might_not_be_masked() const = 0;
/**
* Possibly expand a licence.
*
* May return a null pointer, if we don't define any licence
* groups, or if the thing being passed in doesn't look like a
* licence group.
*
* This should not be recursive.
*
* Callers should Environment::expand_licence, not this method.
*
* \since 0.66
*/
virtual const std::shared_ptr<const Set<std::string> > maybe_expand_licence_nonrecursively(
const std::string &) const = 0;
///\}
///\name Repository behaviour methods
///\{
/**
* Invalidate any in memory cache.
*/
virtual void invalidate() = 0;
/**
* Regenerate any on disk cache.
*/
virtual void regenerate_cache() const;
/**
* Purge any invalid on-disk cache entries.
*/
virtual void purge_invalid_cache() const;
/**
* Perform a hook.
*
* \since 0.40 (previously in an interface)
* \since 0.53 takes optional_output_manager
*/
virtual HookResult perform_hook(
const Hook & hook,
const std::shared_ptr<OutputManager> & optional_output_manager)
PALUDIS_ATTRIBUTE((warn_unused_result)) = 0;
/**
* Sync, if necessary.
*
* \return True if we synced successfully, false if we skipped sync.
* \since 0.42 (previously in an interface)
* \since 0.55 takes a source (may be empty)
* \since 0.61 takes a revision (may be empty)
*/
virtual bool sync(
const std::string & source,
const std::string & revision,
const std::shared_ptr<OutputManager> &) const = 0;
/**
* Allow the Repository to drop any memory-cached metadata and
* PackageIDs it holds.
*
* \since 0.42
*/
virtual void can_drop_in_memory_cache() const;
///\}
///\name Set methods
///\{
/**
* Call Environment::add_set for every set we define.
*
* Environment will call this method at most once, so no cache or check for
* repeats is required. Nothing else should call this method.
*
* \since 0.40
*/
virtual void populate_sets() const = 0;
///\}
};
/**
* Interface for environment variable querying for repositories.
*
* \see Repository
* \ingroup g_repository
* \nosubgrouping
*/
class PALUDIS_VISIBLE RepositoryEnvironmentVariableInterface
{
public:
///\name Environment query functionality
///\{
/**
* Query an environment variable
*/
virtual std::string get_environment_variable(
const std::shared_ptr<const PackageID> & for_package,
const std::string & var) const
PALUDIS_ATTRIBUTE((warn_unused_result)) = 0;
///\}
virtual ~RepositoryEnvironmentVariableInterface();
};
/**
* Interface for repositories that can be used as an install destination.
*
* \see Repository
* \ingroup g_repository
* \nosubgrouping
*/
class PALUDIS_VISIBLE RepositoryDestinationInterface
{
public:
///\name Destination functions
///\{
/**
* Are we a suitable destination for the specified package?
*
* \since 0.58 takes id by shared_ptr
*/
virtual bool is_suitable_destination_for(const std::shared_ptr<const PackageID> &) const
PALUDIS_ATTRIBUTE((warn_unused_result)) = 0;
/**
* If true, pre and post install phases will be used when writing to this
* destination.
*
* This should return true for 'real' filesystem destinations (whether or
* not root is /, if root merges are supported), and false for intermediate
* destinations such as binary repositories.
*/
virtual bool want_pre_post_phases() const
PALUDIS_ATTRIBUTE((warn_unused_result)) = 0;
/**
* Merge a package.
*/
virtual void merge(const MergeParams &) = 0;
///\}
virtual ~RepositoryDestinationInterface();
};
/**
* Interface for making and verifying Manifest2-style manifests
*
* \see Repository
* \ingroup g_repository
* \nosubgrouping
*/
class PALUDIS_VISIBLE RepositoryManifestInterface
{
public:
/**
* Makes the Manifest for a given package. Requires that all
* the needed DIST files, etc, have already been fetched.
*/
virtual void make_manifest(const QualifiedPackageName &) = 0;
///\name Basic operations
///\{
virtual ~RepositoryManifestInterface();
///\}
};
}
#endif