aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvatar Ciaran McCreesh <ciaran.mccreesh@googlemail.com> 2010-07-29 18:35:13 +0100
committerAvatar Ciaran McCreesh <ciaran.mccreesh@googlemail.com> 2010-07-31 11:36:05 +0100
commitaec096a6efcc7dc4e3115bdf3b713424e3bb9d79 (patch)
tree11ba793b1cf4f440f22fbe5b591651d25ee75d64
parent34d3c892d78025f31203780a2caecc62b323b38f (diff)
downloadpaludis-aec096a6efcc7dc4e3115bdf3b713424e3bb9d79.tar.gz
paludis-aec096a6efcc7dc4e3115bdf3b713424e3bb9d79.tar.xz
Use TarMerger to write pbins
-rw-r--r--paludis/repositories/e/Makefile.am2
-rw-r--r--paludis/repositories/e/e_repository.cc54
-rw-r--r--paludis/repositories/e/ebuild.cc7
-rw-r--r--paludis/repositories/e/ebuild.hh2
-rw-r--r--paludis/repositories/e/ebuild/binary_functions.bash36
-rw-r--r--paludis/repositories/e/ebuild/pbin-1/builtin_pivotbin.bash6
-rwxr-xr-xpaludis/repositories/e/ebuild/write_binary_ebuild.bash24
-rw-r--r--paludis/repositories/e/pbin_merger.cc169
-rw-r--r--paludis/repositories/e/pbin_merger.hh91
9 files changed, 310 insertions, 81 deletions
diff --git a/paludis/repositories/e/Makefile.am b/paludis/repositories/e/Makefile.am
index fd90c8f..b71a2aa 100644
--- a/paludis/repositories/e/Makefile.am
+++ b/paludis/repositories/e/Makefile.am
@@ -68,6 +68,7 @@ noinst_HEADERS = \
metadata_xml.hh \
myoption.hh \
myoptions_requirements_verifier.hh \
+ pbin_merger.hh \
pipe_command_handler.hh \
profile.hh \
profile_file.hh \
@@ -126,6 +127,7 @@ libpaludiserepository_la_SOURCES = \
metadata_xml.cc \
myoption.cc \
myoptions_requirements_verifier.cc \
+ pbin_merger.cc \
pipe_command_handler.cc \
profile.cc \
profile_file.cc \
diff --git a/paludis/repositories/e/e_repository.cc b/paludis/repositories/e/e_repository.cc
index 5f2c8d5..3a8414d 100644
--- a/paludis/repositories/e/e_repository.cc
+++ b/paludis/repositories/e/e_repository.cc
@@ -44,6 +44,7 @@
#include <paludis/repositories/e/pretend_fetch_visitor.hh>
#include <paludis/repositories/e/e_stripper.hh>
#include <paludis/repositories/e/myoptions_requirements_verifier.hh>
+#include <paludis/repositories/e/pbin_merger.hh>
#include <paludis/about.hh>
#include <paludis/action.hh>
@@ -62,6 +63,7 @@
#include <paludis/repository_name_cache.hh>
#include <paludis/syncer.hh>
+#include <paludis/util/cookie.hh>
#include <paludis/util/config_file.hh>
#include <paludis/util/create_iterator-impl.hh>
#include <paludis/util/destringify.hh>
@@ -2704,6 +2706,33 @@ ERepository::merge(const MergeParams & m)
if (! is_suitable_destination_for(*m.package_id()))
throw ActionFailedError("Not a suitable destination for '" + stringify(*m.package_id()) + "'");
+ bool fix_mtimes(std::static_pointer_cast<const ERepositoryID>(
+ m.package_id())->eapi()->supported()->ebuild_options()->fix_mtimes());
+
+ std::string bin_dist_base(stringify(name()) + "--" + stringify(m.package_id()->name().category())
+ + "--" + stringify(m.package_id()->name().package()) + "-" + stringify(m.package_id()->version())
+ + "--" + cookie());
+
+ PbinMerger merger(
+ make_named_values<PbinMergerParams>(
+ n::environment() = _imp->params.environment(),
+ n::environment_file() = m.environment_file(),
+ n::fix_mtimes_before() = fix_mtimes ? m.build_start_time() : Timestamp(0, 0),
+ n::image() = m.image_dir(),
+ n::install_under() = FSEntry("/"),
+ n::merged_entries() = m.merged_entries(),
+ n::options() = m.options(),
+ n::output_manager() = m.output_manager(),
+ n::package_id() = m.package_id(),
+ n::root() = FSEntry("/"),
+ n::tar_file() = _imp->params.binary_distdir() / (bin_dist_base + ".tar.bz2")
+ ));
+
+ if (! merger.check())
+ throw ActionFailedError("Not proceeding with install due to merge sanity check failing");
+
+ merger.merge();
+
FSEntry binary_ebuild_location(layout()->binary_ebuild_location(
m.package_id()->name(), m.package_id()->version(),
"pbin-1+" + std::static_pointer_cast<const ERepositoryID>(m.package_id())->eapi()->name()));
@@ -2726,18 +2755,19 @@ ERepository::merge(const MergeParams & m)
WriteBinaryEbuildCommand write_binary_ebuild_command(
make_named_values<WriteBinaryEbuildCommandParams>(
- n::binary_distdir() = _imp->params.binary_distdir(),
- n::binary_ebuild_location() = binary_ebuild_location,
- n::binary_keywords() = binary_keywords,
- n::builddir() = _imp->params.builddir(),
- n::destination_repository() = this,
- n::environment() = _imp->params.environment(),
- n::environment_file() = m.environment_file(),
- n::image() = m.image_dir(),
- n::maybe_output_manager() = m.output_manager(),
- n::merger_options() = std::static_pointer_cast<const ERepositoryID>(m.package_id())->eapi()->supported()->merger_options(),
- n::package_id() = std::static_pointer_cast<const ERepositoryID>(m.package_id())
- ));
+ n::binary_dist_base() = bin_dist_base,
+ n::binary_distdir() = _imp->params.binary_distdir(),
+ n::binary_ebuild_location() = binary_ebuild_location,
+ n::binary_keywords() = binary_keywords,
+ n::builddir() = _imp->params.builddir(),
+ n::destination_repository() = this,
+ n::environment() = _imp->params.environment(),
+ n::environment_file() = m.environment_file(),
+ n::image() = m.image_dir(),
+ n::maybe_output_manager() = m.output_manager(),
+ n::merger_options() = std::static_pointer_cast<const ERepositoryID>(m.package_id())->eapi()->supported()->merger_options(),
+ n::package_id() = std::static_pointer_cast<const ERepositoryID>(m.package_id())
+ ));
write_binary_ebuild_command();
}
diff --git a/paludis/repositories/e/ebuild.cc b/paludis/repositories/e/ebuild.cc
index 6ab5ca9..d1d8e09 100644
--- a/paludis/repositories/e/ebuild.cc
+++ b/paludis/repositories/e/ebuild.cc
@@ -39,7 +39,6 @@
#include <paludis/util/destringify.hh>
#include <paludis/util/indirect_iterator-impl.hh>
#include <paludis/util/set.hh>
-#include <paludis/util/cookie.hh>
#include <paludis/output_manager.hh>
#include <paludis/about.hh>
@@ -1202,14 +1201,10 @@ WriteBinaryEbuildCommand::operator() ()
throw ActionFailedError("Don't know how to write binary ebuilds using EAPI 'pbin-1+" +
params.package_id()->eapi()->exported_name());
- std::string bindistfile(stringify(params.destination_repository()->name()) + "--" + stringify(params.package_id()->name().category())
- + "--" + stringify(params.package_id()->name().package()) + "-" + stringify(params.package_id()->version())
- + "--" + cookie());
-
std::string ebuild_cmd(getenv_with_default("PALUDIS_EBUILD_DIR", LIBEXECDIR "/paludis") +
"/write_binary_ebuild.bash '" +
stringify(params.binary_ebuild_location()) + "' '" +
- stringify(params.binary_distdir() / bindistfile) + "' '" +
+ stringify(params.binary_distdir() / params.binary_dist_base()) + "' '" +
stringify(params.environment_file()) + "' '" +
stringify(params.image()) + "'");
diff --git a/paludis/repositories/e/ebuild.hh b/paludis/repositories/e/ebuild.hh
index 5c49518..1a1d215 100644
--- a/paludis/repositories/e/ebuild.hh
+++ b/paludis/repositories/e/ebuild.hh
@@ -44,6 +44,7 @@ namespace paludis
{
typedef Name<struct a_name> a;
typedef Name<struct aa_name> aa;
+ typedef Name<struct binary_dist_base_name> binary_dist_base;
typedef Name<struct binary_distdir_name> binary_distdir;
typedef Name<struct binary_ebuild_location_name> binary_ebuild_location;
typedef Name<struct binary_keywords_name> binary_keywords;
@@ -294,6 +295,7 @@ namespace paludis
*/
struct WriteBinaryEbuildCommandParams
{
+ NamedValue<n::binary_dist_base, std::string> binary_dist_base;
NamedValue<n::binary_distdir, FSEntry> binary_distdir;
NamedValue<n::binary_ebuild_location, FSEntry> binary_ebuild_location;
NamedValue<n::binary_keywords, std::string> binary_keywords;
diff --git a/paludis/repositories/e/ebuild/binary_functions.bash b/paludis/repositories/e/ebuild/binary_functions.bash
index f92ed88..41b209e 100644
--- a/paludis/repositories/e/ebuild/binary_functions.bash
+++ b/paludis/repositories/e/ebuild/binary_functions.bash
@@ -16,42 +16,6 @@
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA 02111-1307 USA
-make_binary_tarball()
-{
- local imagedir="${1}" envfile="${2}" bindistfile="${3}"
- local tmpdir="${PALUDIS_TMPDIR}/pbin-$(basename "${bindistfile}" )"
-
- echo tar cvf "${bindistfile}".tar --files-from /dev/null 1>&2
- tar cvf "${bindistfile}".tar --files-from /dev/null || die "making tarball failed"
-
- echo find "${imagedir}" -mindepth 1 -maxdepth 1 -printf '%f\0' \| \
- xargs -0 tar rpvf "${bindistfile}".tar -C "${imagedir}" 1>&2
- find "${imagedir}" -mindepth 1 -maxdepth 1 -printf '%f\0' | \
- xargs -0 tar rpvf "${bindistfile}".tar -C "${imagedir}" \
- || die "adding image to tarball failed"
-
- echo rm -fr "${tmpdir}" 1>&2
- rm -fr "${tmpdir}"
-
- echo mkdir "${tmpdir}" 1>&2
- mkdir "${tmpdir}" || die "mkdir ${tmpdir} failed"
-
- echo mkdir "${tmpdir}"/PBIN 1>&2
- mkdir "${tmpdir}"/PBIN 1>&2
-
- echo bzip2 \< "${envfile}" \> "${tmpdir}/PBIN/environment.bz2" 1>&2
- bzip2 < "${envfile}" > "${tmpdir}/PBIN/environment.bz2"
-
- echo "tar rvf "${bindistfile}".tar -C "${tmpdir}" 'PBIN'" 1>&2
- tar rvf "${bindistfile}".tar -C "${tmpdir}" 'PBIN' || die "adding env to tarball failed"
-
- echo rm -fr "${tmpdir}" 1>&2
- rm -fr "${tmpdir}"
-
- echo bzip2 "${bindistfile}".tar 1>&2
- bzip2 "${bindistfile}".tar || die "compressing tarball failed"
-}
-
make_binary_ebuild()
{
local ebuildfile="${1}" bin_uri="${2}" binary_keywords="${3}"
diff --git a/paludis/repositories/e/ebuild/pbin-1/builtin_pivotbin.bash b/paludis/repositories/e/ebuild/pbin-1/builtin_pivotbin.bash
index bcf8476..ade8467 100644
--- a/paludis/repositories/e/ebuild/pbin-1/builtin_pivotbin.bash
+++ b/paludis/repositories/e/ebuild/pbin-1/builtin_pivotbin.bash
@@ -21,12 +21,12 @@ builtin_pivotbin()
[[ ! -d "${!PALUDIS_TEMP_DIR_VAR}" ]] && die "Can't use \${${PALUDIS_TEMP_DIR_VAR}}=${!PALUDIS_TEMP_DIR_VAR}"
ebuild_section "Extracting package environment"
- echo tar jxvf "${!PALUDIS_BINARY_DISTDIR_VARIABLE}"/${!PALUDIS_ARCHIVES_VAR} -C "${!PALUDIS_TEMP_DIR_VAR}" --strip-components 1 PBIN/environment.bz2 1>&2
- tar jxvf "${!PALUDIS_BINARY_DISTDIR_VARIABLE}"/${!PALUDIS_ARCHIVES_VAR} -C "${!PALUDIS_TEMP_DIR_VAR}" --strip-components 1 PBIN/environment.bz2 || die "Couldn't extract env"
+ echo tar jxvf "${!PALUDIS_BINARY_DISTDIR_VARIABLE}"/${!PALUDIS_ARCHIVES_VAR} -C "${!PALUDIS_TEMP_DIR_VAR}" --strip-components 1 PBIN/environment 1>&2
+ tar jxvf "${!PALUDIS_BINARY_DISTDIR_VARIABLE}"/${!PALUDIS_ARCHIVES_VAR} -C "${!PALUDIS_TEMP_DIR_VAR}" --strip-components 1 PBIN/environment || die "Couldn't extract env"
ebuild_section "Switching to package environment"
export BINARY_REPOSITORY="${REPOSITORY}"
- export PALUDIS_LOAD_ENVIRONMENT="${!PALUDIS_TEMP_DIR_VAR}/environment.bz2"
+ export PALUDIS_LOAD_ENVIRONMENT="${!PALUDIS_TEMP_DIR_VAR}/environment"
ebuild_load_environment --pivot
export EAPI="${EAPI#pbin-1+}"
diff --git a/paludis/repositories/e/ebuild/write_binary_ebuild.bash b/paludis/repositories/e/ebuild/write_binary_ebuild.bash
index 220a264..5e5bb3a 100755
--- a/paludis/repositories/e/ebuild/write_binary_ebuild.bash
+++ b/paludis/repositories/e/ebuild/write_binary_ebuild.bash
@@ -115,30 +115,6 @@ main()
die "ebuildfile \"${ebuildfile}\" exists and is not a regular file"
fi
- if ! [[ -d $(dirname "${bindistfile}" ) ]] ; then
- die "dirname(bindistfile) \"$(dirname "${bindistfile}" )\" is not a directory"
- fi
-
- if [[ -e "${bindistfile}".tar ]] ; then
- die "bindistfile \"${bindistfile}.tar\" already exists, not overwriting"
- fi
-
- if [[ -e "${bindistfile}".tar.bz2 ]] ; then
- die "bindistfile \"${bindistfile}.tar.bz2\" already exists, not overwriting"
- fi
-
- if ! [[ -f "${envfile}" ]] ; then
- die "envfile \"${envfile}\" is not a file"
- fi
-
- if ! [[ -d "${imagedir}" ]] ; then
- die "imagedir \"${imagedir}\" is not a directory"
- fi
-
- ebuild_section "Writing binary tarball to '${bindistfile}.tar.bz2'..."
-
- make_binary_tarball "${imagedir}" "${envfile}" "${bindistfile}"
-
ebuild_section "Loading saved environment..."
ebuild_safe_source "${envfile}"
diff --git a/paludis/repositories/e/pbin_merger.cc b/paludis/repositories/e/pbin_merger.cc
new file mode 100644
index 0000000..8753ce9
--- /dev/null
+++ b/paludis/repositories/e/pbin_merger.cc
@@ -0,0 +1,169 @@
+/* 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 <paludis/repositories/e/pbin_merger.hh>
+#include <paludis/util/pimp-impl.hh>
+#include <paludis/util/fs_entry.hh>
+#include <paludis/util/make_named_values.hh>
+#include <paludis/util/system.hh>
+#include <paludis/util/join.hh>
+#include <paludis/util/log.hh>
+#include <paludis/hook.hh>
+#include <paludis/environment.hh>
+#include <paludis/package_id.hh>
+#include <paludis/version_spec.hh>
+#include <paludis/metadata_key.hh>
+#include <paludis/output_manager.hh>
+
+using namespace paludis;
+using namespace paludis::erepository;
+
+namespace paludis
+{
+ template<>
+ struct Imp<PbinMerger>
+ {
+ PbinMergerParams params;
+
+ Imp(const PbinMergerParams & p) :
+ params(p)
+ {
+ }
+ };
+}
+
+namespace
+{
+ std::pair<uid_t, gid_t>
+ get_new_ids_or_minus_one(const Environment * const env, const FSEntry & f)
+ {
+ uid_t uid = (f.owner() == env->reduced_uid()) ? 0 : -1;
+ gid_t gid = (f.group() == env->reduced_gid()) ? 0 : -1;
+
+ return std::make_pair(uid, gid);
+ }
+}
+
+PbinMerger::PbinMerger(const PbinMergerParams & p) :
+ Pimp<PbinMerger>(p),
+ TarMerger(make_named_values<TarMergerParams>(
+ n::compression() = tmc_bz2,
+ n::environment() = p.environment(),
+ n::fix_mtimes_before() = p.fix_mtimes_before(),
+ n::get_new_ids_or_minus_one() = std::bind(&get_new_ids_or_minus_one, p.environment(), std::placeholders::_1),
+ n::image() = p.image(),
+ n::install_under() = FSEntry("/"),
+ n::merged_entries() = p.merged_entries(),
+ n::no_chown() = ! getenv_with_default("PALUDIS_NO_CHOWN", "").empty(),
+ n::options() = p.options(),
+ n::root() = p.root(),
+ n::tar_file() = p.tar_file()
+ )),
+ _imp(Pimp<PbinMerger>::_imp)
+{
+}
+
+PbinMerger::~PbinMerger() = default;
+
+Hook
+PbinMerger::extend_hook(const Hook & h)
+{
+ std::shared_ptr<const FSEntrySequence> bashrc_files(_imp->params.environment()->bashrc_files());
+
+ if (_imp->params.package_id())
+ {
+ std::string cat(stringify(_imp->params.package_id()->name().category()));
+ std::string pn(stringify(_imp->params.package_id()->name().package()));
+ std::string pvr(stringify(_imp->params.package_id()->version()));
+ std::string pv(stringify(_imp->params.package_id()->version().remove_revision()));
+ std::string slot(_imp->params.package_id()->slot_key() ? stringify(_imp->params.package_id()->slot_key()->value()) : "");
+
+ return TarMerger::extend_hook(h)
+ ("P", pn + "-" + pv)
+ ("PNV", pn + "-" + pv)
+ ("PN", pn)
+ ("CATEGORY", cat)
+ ("PR", _imp->params.package_id()->version().revision_only())
+ ("PV", pv)
+ ("PVR", pvr)
+ ("PF", pn + "-" + pvr)
+ ("PNVR", pn + "-" + pvr)
+ ("SLOT", slot)
+ ("PALUDIS_BASHRC_FILES", join(bashrc_files->begin(), bashrc_files->end(), " "));
+ }
+ else
+ return TarMerger::extend_hook(h)
+ ("PALUDIS_BASHRC_FILES", join(bashrc_files->begin(), bashrc_files->end(), " "));
+}
+
+void
+PbinMerger::on_error(bool is_check, const std::string & s)
+{
+ make_check_fail();
+
+ if (is_check)
+ _imp->params.output_manager()->stdout_stream() << "." << std::endl << "!!! " << s << std::endl;
+ else
+ throw MergerError(s);
+}
+
+void
+PbinMerger::on_warn(bool is_check, const std::string & s)
+{
+ if (is_check)
+ Log::get_instance()->message("e.tar_merger.warning", ll_warning, lc_context) << s;
+}
+
+void
+PbinMerger::merge()
+{
+ display_override(">>> Creating " + stringify(_imp->params.tar_file()));
+ TarMerger::merge();
+}
+
+bool
+PbinMerger::check()
+{
+ _imp->params.output_manager()->stdout_stream() << ">>> Checking whether we can merge to tarball " << _imp->params.tar_file() << " ";
+ bool result(TarMerger::check());
+ _imp->params.output_manager()->stdout_stream() << std::endl;
+ return result;
+}
+
+void
+PbinMerger::on_enter_dir(bool is_check, const FSEntry)
+{
+ if (! is_check)
+ return;
+
+ _imp->params.output_manager()->stdout_stream() << "." << std::flush;
+}
+
+void
+PbinMerger::display_override(const std::string & message) const
+{
+ _imp->params.output_manager()->stdout_stream() << message << std::endl;
+}
+
+void
+PbinMerger::on_done_merge()
+{
+ add_file(_imp->params.environment_file(), FSEntry("/PBIN/environment"));
+}
+
diff --git a/paludis/repositories/e/pbin_merger.hh b/paludis/repositories/e/pbin_merger.hh
new file mode 100644
index 0000000..4da8c10
--- /dev/null
+++ b/paludis/repositories/e/pbin_merger.hh
@@ -0,0 +1,91 @@
+/* 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
+ */
+
+#ifndef PALUDIS_GUARD_PALUDIS_REPOSITORIES_E_PBIN_MERGER_HH
+#define PALUDIS_GUARD_PALUDIS_REPOSITORIES_E_PBIN_MERGER_HH 1
+
+#include <paludis/util/attributes.hh>
+#include <paludis/tar_merger.hh>
+#include <paludis/output_manager-fwd.hh>
+#include <paludis/package_id-fwd.hh>
+#include <tr1/memory>
+
+namespace paludis
+{
+ namespace n
+ {
+ typedef Name<struct environment_name> environment;
+ typedef Name<struct environment_file_name> environment_file;
+ typedef Name<struct fix_mtimes_before_name> fix_mtimes_before;
+ typedef Name<struct image_name> image;
+ typedef Name<struct install_under_name> install_under;
+ typedef Name<struct merged_entries_name> merged_entries;
+ typedef Name<struct options_name> options;
+ typedef Name<struct output_manager_name> output_manager;
+ typedef Name<struct package_id_name> package_id;
+ typedef Name<struct root_name> root;
+ typedef Name<struct tar_file_name> tar_file;
+ }
+
+ namespace erepository
+ {
+ struct PbinMergerParams
+ {
+ NamedValue<n::environment, Environment *> environment;
+ NamedValue<n::environment_file, FSEntry> environment_file;
+ NamedValue<n::fix_mtimes_before, Timestamp> fix_mtimes_before;
+ NamedValue<n::image, FSEntry> image;
+ NamedValue<n::install_under, FSEntry> install_under;
+ NamedValue<n::merged_entries, std::shared_ptr<FSEntrySet> > 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;
+ NamedValue<n::root, FSEntry> root;
+ NamedValue<n::tar_file, FSEntry> tar_file;
+ };
+
+ class PALUDIS_VISIBLE PbinMerger :
+ private Pimp<PbinMerger>,
+ public TarMerger
+ {
+ private:
+ Pimp<PbinMerger>::ImpPtr & _imp;
+
+ protected:
+ virtual void on_error(bool is_check, const std::string &);
+ virtual void on_warn(bool is_check, const std::string &);
+ virtual void display_override(const std::string &) const;
+
+ virtual void on_enter_dir(bool is_check, const FSEntry);
+
+ virtual void on_done_merge();
+
+ public:
+ PbinMerger(const PbinMergerParams &);
+ ~PbinMerger();
+
+ virtual Hook extend_hook(const Hook &);
+
+ virtual void merge();
+ virtual bool check();
+ };
+ }
+}
+
+#endif