ClientOutputFeatures

Which will allow us to implement things like elog at end only for
clients that display a summary table.
This commit is contained in:
Ciaran McCreesh 2010-02-19 21:53:38 +00:00
parent 43066c1892
commit 5181afb3eb
17 changed files with 132 additions and 47 deletions

@ -1,7 +1,7 @@
/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2009 Ciaran McCreesh
* Copyright (c) 2009, 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
@ -21,6 +21,7 @@
#define PALUDIS_GUARD_PALUDIS_CREATE_OUTPUT_MANAGER_INFO_FWD_HH 1
#include <paludis/util/attributes.hh>
#include <paludis/util/options-fwd.hh>
#include <iosfwd>
namespace paludis
@ -31,6 +32,8 @@ namespace paludis
#include <paludis/create_output_manager_info-se.hh>
typedef Options<ClientOutputFeature> ClientOutputFeatures;
}
#endif

@ -91,15 +91,18 @@ namespace paludis
const std::string action_name;
const std::tr1::shared_ptr<const Set<std::string> > action_flags;
const OutputExclusivity output_exclusivity;
const ClientOutputFeatures client_output_features;
Implementation(const std::tr1::shared_ptr<const PackageID> & i,
const std::string & a,
const std::tr1::shared_ptr<const Set<std::string> > & f,
const OutputExclusivity e) :
const OutputExclusivity e,
const ClientOutputFeatures & c) :
id(i),
action_name(a),
action_flags(f),
output_exclusivity(e)
output_exclusivity(e),
client_output_features(c)
{
}
};
@ -109,10 +112,12 @@ namespace paludis
{
const RepositoryName repo_name;
const OutputExclusivity output_exclusivity;
const ClientOutputFeatures client_output_features;
Implementation(const RepositoryName & r, const OutputExclusivity e) :
Implementation(const RepositoryName & r, const OutputExclusivity e, const ClientOutputFeatures & c) :
repo_name(r),
output_exclusivity(e)
output_exclusivity(e),
client_output_features(c)
{
}
};
@ -132,10 +137,11 @@ CreateOutputManagerInfo::deserialise(Deserialisation & d)
CreateOutputManagerForPackageIDActionInfo::CreateOutputManagerForPackageIDActionInfo(
const std::tr1::shared_ptr<const PackageID> & i,
const Action & a,
const OutputExclusivity e) :
const OutputExclusivity e,
const ClientOutputFeatures & c) :
PrivateImplementationPattern<CreateOutputManagerForPackageIDActionInfo>(
new Implementation<CreateOutputManagerForPackageIDActionInfo>(i, a.simple_name(),
get_flags(a), e))
get_flags(a), e, c))
{
}
@ -143,9 +149,10 @@ CreateOutputManagerForPackageIDActionInfo::CreateOutputManagerForPackageIDAction
const std::tr1::shared_ptr<const PackageID> & i,
const std::string & a,
const std::tr1::shared_ptr<const Set<std::string> > & f,
const OutputExclusivity e) :
const OutputExclusivity e,
const ClientOutputFeatures & c) :
PrivateImplementationPattern<CreateOutputManagerForPackageIDActionInfo>(
new Implementation<CreateOutputManagerForPackageIDActionInfo>(i, a, f, e))
new Implementation<CreateOutputManagerForPackageIDActionInfo>(i, a, f, e, c))
{
}
@ -177,6 +184,12 @@ CreateOutputManagerForPackageIDActionInfo::output_exclusivity() const
return _imp->output_exclusivity;
}
const ClientOutputFeatures
CreateOutputManagerForPackageIDActionInfo::client_output_features() const
{
return _imp->client_output_features;
}
void
CreateOutputManagerForPackageIDActionInfo::serialise(Serialiser & s) const
{
@ -185,6 +198,7 @@ CreateOutputManagerForPackageIDActionInfo::serialise(Serialiser & s) const
.member(SerialiserFlags<>(), "action_name", action_name())
.member(SerialiserFlags<>(), "output_exclusivity", stringify(output_exclusivity()))
.member(SerialiserFlags<serialise::might_be_null>(), "package_id", package_id())
.member(SerialiserFlags<>(), "client_output_features", client_output_features())
;
}
@ -202,14 +216,15 @@ CreateOutputManagerForPackageIDActionInfo::deserialise(Deserialisation & d)
v.member<std::tr1::shared_ptr<const PackageID> >("package_id"),
v.member<std::string>("action_name"),
action_flags,
destringify<OutputExclusivity>(v.member<std::string>("output_exclusivity"))
destringify<OutputExclusivity>(v.member<std::string>("output_exclusivity")),
v.member<ClientOutputFeatures>("client_output_features")
));
}
CreateOutputManagerForRepositorySyncInfo::CreateOutputManagerForRepositorySyncInfo(
const RepositoryName & r, const OutputExclusivity e) :
const RepositoryName & r, const OutputExclusivity e, const ClientOutputFeatures & c) :
PrivateImplementationPattern<CreateOutputManagerForRepositorySyncInfo>(
new Implementation<CreateOutputManagerForRepositorySyncInfo>(r, e))
new Implementation<CreateOutputManagerForRepositorySyncInfo>(r, e, c))
{
}
@ -229,12 +244,19 @@ CreateOutputManagerForRepositorySyncInfo::output_exclusivity() const
return _imp->output_exclusivity;
}
const ClientOutputFeatures
CreateOutputManagerForRepositorySyncInfo::client_output_features() const
{
return _imp->client_output_features;
}
void
CreateOutputManagerForRepositorySyncInfo::serialise(Serialiser & s) const
{
s.object("CreateOutputManagerForRepositorySyncInfo")
.member(SerialiserFlags<>(), "repository_name", stringify(repository_name()))
.member(SerialiserFlags<>(), "output_exclusivity", stringify(output_exclusivity()))
.member(SerialiserFlags<>(), "client_output_features", client_output_features())
;
}
@ -244,7 +266,8 @@ CreateOutputManagerForRepositorySyncInfo::deserialise(Deserialisation & d)
Deserialisator v(d, "CreateOutputManagerForRepositorySyncInfo");
return make_shared_ptr(new CreateOutputManagerForRepositorySyncInfo(
RepositoryName(v.member<std::string>("repo_name")),
destringify<OutputExclusivity>(v.member<std::string>("output_exclusivity"))
destringify<OutputExclusivity>(v.member<std::string>("output_exclusivity")),
v.member<ClientOutputFeatures>("client_output_features")
));
}

@ -68,18 +68,23 @@ namespace paludis
{
public:
/**
* \since 0.44
* \since 0.46
*/
CreateOutputManagerForPackageIDActionInfo(
const std::tr1::shared_ptr<const PackageID> & id,
const std::string & action_name,
const std::tr1::shared_ptr<const Set<std::string> > & action_flags,
const OutputExclusivity output_exclusivity);
const OutputExclusivity output_exclusivity,
const ClientOutputFeatures & output_features);
/**
* \since 0.46
*/
CreateOutputManagerForPackageIDActionInfo(
const std::tr1::shared_ptr<const PackageID> & id,
const Action &,
const OutputExclusivity output_exclusivity);
const OutputExclusivity output_exclusivity,
const ClientOutputFeatures & output_features);
~CreateOutputManagerForPackageIDActionInfo();
@ -97,6 +102,11 @@ namespace paludis
OutputExclusivity output_exclusivity() const PALUDIS_ATTRIBUTE((warn_unused_result));
/**
* \since 0.46
*/
const ClientOutputFeatures client_output_features() const PALUDIS_ATTRIBUTE((warn_unused_result));
virtual void serialise(Serialiser &) const;
static const std::tr1::shared_ptr<CreateOutputManagerForPackageIDActionInfo> deserialise(
@ -117,9 +127,13 @@ namespace paludis
public ImplementAcceptMethods<CreateOutputManagerInfo, CreateOutputManagerForRepositorySyncInfo>
{
public:
/**
* \since 0.46
*/
CreateOutputManagerForRepositorySyncInfo(
const RepositoryName & repo_name,
const OutputExclusivity);
const OutputExclusivity,
const ClientOutputFeatures &);
~CreateOutputManagerForRepositorySyncInfo();
@ -130,6 +144,11 @@ namespace paludis
OutputExclusivity output_exclusivity() const PALUDIS_ATTRIBUTE((warn_unused_result));
/**
* \since 0.46
*/
const ClientOutputFeatures client_output_features() const PALUDIS_ATTRIBUTE((warn_unused_result));
virtual void serialise(Serialiser &) const;
static const std::tr1::shared_ptr<CreateOutputManagerForRepositorySyncInfo> deserialise(

@ -21,3 +21,23 @@ make_enum_OutputExclusivity()
END
}
make_enum_ClientOutputFeature()
{
prefix cof
key cof_summary_at_end "Set if the client shows a summary at the end"
want_destringify
doxygen_comment << "END"
/**
* Options telling most CreateOutputManagerInfo subclasses what features our
* client supports, allowing environments to decide how to handle output
* managers.
*
* \see CreateOutputManagerInfo
* \see ClientOutputFeatures
*/
END
}

@ -1,7 +1,7 @@
/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2006, 2007, 2008, 2009 Ciaran McCreesh
* Copyright (c) 2006, 2007, 2008, 2009, 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
@ -740,7 +740,8 @@ InstallTask::_pretend()
{
on_pretend_pre(*dep);
OutputManagerFromEnvironment output_manager_holder(_imp->env, dep->package_id(), oe_exclusive);
OutputManagerFromEnvironment output_manager_holder(_imp->env, dep->package_id(), oe_exclusive,
ClientOutputFeatures());
bool success(true);
if (dep->package_id()->supports_action(pretend_action_query))
@ -886,7 +887,8 @@ InstallTask::_one(const DepList::Iterator dep, const int x, const int y, const i
SupportsActionTest<FetchAction> test_fetch;
if (dep->package_id()->supports_action(test_fetch))
{
output_manager_holder.reset(new OutputManagerFromEnvironment(_imp->env, dep->package_id(), oe_exclusive));
output_manager_holder.reset(new OutputManagerFromEnvironment(_imp->env, dep->package_id(), oe_exclusive,
ClientOutputFeatures()));
FetchActionOptions fetch_options(make_fetch_action_options(*dep, *output_manager_holder));
FetchAction fetch_action(fetch_options);
dep->package_id()->perform_action(fetch_action);
@ -898,7 +900,8 @@ InstallTask::_one(const DepList::Iterator dep, const int x, const int y, const i
if (! _imp->fetch_only)
{
output_manager_holder.reset(new OutputManagerFromEnvironment(_imp->env, dep->package_id(), oe_exclusive));
output_manager_holder.reset(new OutputManagerFromEnvironment(_imp->env, dep->package_id(),
oe_exclusive, ClientOutputFeatures()));
std::tr1::shared_ptr<PackageIDSequence> replacing;

@ -36,6 +36,7 @@
#include <paludis/util/thread.hh>
#include <paludis/util/pipe.hh>
#include <paludis/util/mutex.hh>
#include <paludis/util/options.hh>
#include <paludis/standard_output_manager.hh>
#include <paludis/create_output_manager_info.hh>
#include <paludis/serialise.hh>
@ -369,16 +370,18 @@ namespace paludis
const Environment * const env;
const std::tr1::shared_ptr<const PackageID> id;
const OutputExclusivity exclusivity;
const ClientOutputFeatures client_output_features;
int read_fd, write_fd;
std::tr1::shared_ptr<OutputManager> result;
Implementation(const Environment * const e, const std::tr1::shared_ptr<const PackageID> & i,
const OutputExclusivity x) :
const OutputExclusivity x, const ClientOutputFeatures & c) :
env(e),
id(i),
exclusivity(x),
client_output_features(c),
read_fd(destringify<int>(getenv_with_default("PALUDIS_IPC_READ_FD", "-1"))),
write_fd(destringify<int>(getenv_with_default("PALUDIS_IPC_WRITE_FD", "-1")))
{
@ -397,8 +400,9 @@ namespace paludis
OutputManagerFromIPC::OutputManagerFromIPC(const Environment * const e,
const std::tr1::shared_ptr<const PackageID> & i,
const OutputExclusivity x) :
PrivateImplementationPattern<OutputManagerFromIPC>(new Implementation<OutputManagerFromIPC>(e, i, x))
const OutputExclusivity x,
const ClientOutputFeatures & c) :
PrivateImplementationPattern<OutputManagerFromIPC>(new Implementation<OutputManagerFromIPC>(e, i, x, c))
{
}
@ -411,7 +415,7 @@ OutputManagerFromIPC::operator() (const Action & a)
{
if (! _imp->result)
{
CreateOutputManagerForPackageIDActionInfo info(_imp->id, a, _imp->exclusivity);
CreateOutputManagerForPackageIDActionInfo info(_imp->id, a, _imp->exclusivity, _imp->client_output_features);
_imp->result.reset(new IPCOutputManager(_imp->read_fd, _imp->write_fd, info));
}
return _imp->result;

@ -94,7 +94,8 @@ namespace paludis
OutputManagerFromIPC(
const Environment * const,
const std::tr1::shared_ptr<const PackageID> &,
const OutputExclusivity
const OutputExclusivity,
const ClientOutputFeatures &
);
~OutputManagerFromIPC();

@ -1,7 +1,7 @@
/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2009 Ciaran McCreesh
* Copyright (c) 2009, 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
@ -20,6 +20,7 @@
#include <paludis/output_manager_from_environment.hh>
#include <paludis/util/private_implementation_pattern-impl.hh>
#include <paludis/util/log.hh>
#include <paludis/util/options.hh>
#include <paludis/environment.hh>
#include <paludis/create_output_manager_info.hh>
#include <paludis/standard_output_manager.hh>
@ -34,14 +35,16 @@ namespace paludis
const Environment * const env;
const std::tr1::shared_ptr<const PackageID> id;
const OutputExclusivity output_exclusivity;
const ClientOutputFeatures client_output_features;
std::tr1::shared_ptr<OutputManager> result;
Implementation(const Environment * const e, const std::tr1::shared_ptr<const PackageID> & i,
const OutputExclusivity x) :
const OutputExclusivity x, const ClientOutputFeatures & c) :
env(e),
id(i),
output_exclusivity(x)
output_exclusivity(x),
client_output_features(c)
{
}
};
@ -50,8 +53,10 @@ namespace paludis
OutputManagerFromEnvironment::OutputManagerFromEnvironment(
const Environment * const e,
const std::tr1::shared_ptr<const PackageID> & i,
const OutputExclusivity x) :
PrivateImplementationPattern<OutputManagerFromEnvironment>(new Implementation<OutputManagerFromEnvironment>(e, i, x))
const OutputExclusivity x,
const ClientOutputFeatures & c) :
PrivateImplementationPattern<OutputManagerFromEnvironment>(new Implementation<OutputManagerFromEnvironment>(
e, i, x, c))
{
}
@ -64,7 +69,8 @@ OutputManagerFromEnvironment::operator() (const Action & a)
{
if (! _imp->result)
{
CreateOutputManagerForPackageIDActionInfo info(_imp->id, a, _imp->output_exclusivity);
CreateOutputManagerForPackageIDActionInfo info(_imp->id, a, _imp->output_exclusivity,
_imp->client_output_features);
_imp->result = _imp->env->create_output_manager(info);
}
return _imp->result;

@ -1,7 +1,7 @@
/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2009 Ciaran McCreesh
* Copyright (c) 2009, 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
@ -38,7 +38,8 @@ namespace paludis
OutputManagerFromEnvironment(
const Environment * const,
const std::tr1::shared_ptr<const PackageID> &,
const OutputExclusivity);
const OutputExclusivity,
const ClientOutputFeatures &);
~OutputManagerFromEnvironment();

@ -119,7 +119,7 @@ namespace
}
std::tr1::shared_ptr<const Repository> rr(env->package_database()->fetch_repository(r));
CreateOutputManagerForRepositorySyncInfo info(rr->name(), oe_exclusive);
CreateOutputManagerForRepositorySyncInfo info(rr->name(), oe_exclusive, ClientOutputFeatures());
std::tr1::shared_ptr<OutputManager> output_manager(env->create_output_manager(info));
if (rr->sync(output_manager))
{

@ -1,7 +1,7 @@
/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2006, 2007, 2008, 2009 Ciaran McCreesh
* Copyright (c) 2006, 2007, 2008, 2009, 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
@ -378,7 +378,8 @@ UninstallTask::execute()
try
{
OutputManagerFromEnvironment output_manager_holder(_imp->env, i->package_id(), oe_exclusive);
OutputManagerFromEnvironment output_manager_holder(_imp->env, i->package_id(), oe_exclusive,
ClientOutputFeatures());
UninstallAction uninstall_action(
make_named_values<UninstallActionOptions>(
value_for<n::config_protect>(""),

@ -1,7 +1,7 @@
/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2007, 2008, 2009 Ciaran McCreesh
* Copyright (c) 2007, 2008, 2009, 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
@ -141,7 +141,7 @@ main(int argc, char *argv[])
cout << "Processing " << colour(cl_package_name, stringify(**i)) << "..." << endl;
++total;
OutputManagerFromEnvironment output_manager_holder(&env, *i, oe_exclusive);
OutputManagerFromEnvironment output_manager_holder(&env, *i, oe_exclusive, ClientOutputFeatures());
FetchAction a(make_named_values<FetchActionOptions>(
value_for<n::errors>(make_shared_ptr(new Sequence<FetchActionFailure>)),
value_for<n::exclude_unmirrorable>(true),

@ -169,9 +169,11 @@ namespace
const std::tr1::shared_ptr<const PackageID> & id)
{
if (cmdline.a_managed_output.specified())
manager_if_ipc.reset(new OutputManagerFromIPC(e, id, oe_exclusive));
manager_if_ipc.reset(new OutputManagerFromIPC(e, id, oe_exclusive,
ClientOutputFeatures() + cof_summary_at_end));
else
manager_if_env.reset(new OutputManagerFromEnvironment(e, id, oe_exclusive));
manager_if_env.reset(new OutputManagerFromEnvironment(e, id, oe_exclusive,
ClientOutputFeatures() + cof_summary_at_end));
}
const std::tr1::shared_ptr<OutputManager> operator() (const Action & a)

@ -162,7 +162,8 @@ namespace
const std::tr1::shared_ptr<Repository> repo(env->package_database()->fetch_repository(name));
output_manager = env->create_output_manager(
CreateOutputManagerForRepositorySyncInfo(repo->name(),
cmdline.a_sequential.specified() ? oe_exclusive : oe_with_others));
cmdline.a_sequential.specified() ? oe_exclusive : oe_with_others,
ClientOutputFeatures() + cof_summary_at_end));
}
catch (const Exception & e)
{

@ -1,7 +1,7 @@
/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2007, 2008, 2009 Ciaran McCreesh
* Copyright (c) 2007, 2008, 2009, 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
@ -51,7 +51,7 @@ namespace
{
int return_code(0);
OutputManagerFromEnvironment output_manager_holder(env, p, oe_exclusive);
OutputManagerFromEnvironment output_manager_holder(env, p, oe_exclusive, ClientOutputFeatures());
ConfigActionOptions options(make_named_values<ConfigActionOptions>(
value_for<n::make_output_manager>(std::tr1::ref(output_manager_holder))
));

@ -1,7 +1,7 @@
/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2007, 2008, 2009 Ciaran McCreesh
* Copyright (c) 2007, 2008, 2009, 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
@ -245,7 +245,7 @@ int do_one_info(
for (PackageIDSequence::ConstIterator p(to_show_entries->begin()), p_end(to_show_entries->end()) ;
p != p_end ; ++p)
{
OutputManagerFromEnvironment output_manager_holder(env.get(), *p, oe_exclusive);
OutputManagerFromEnvironment output_manager_holder(env.get(), *p, oe_exclusive, ClientOutputFeatures());
InfoActionOptions options(make_named_values<InfoActionOptions>(
value_for<n::make_output_manager>(std::tr1::ref(output_manager_holder))
));

@ -1325,7 +1325,8 @@ ConsoleInstallTask::display_merge_list_entry_distsize(const DepListEntry & d,
if (! d.package_id()->supports_action(action_test))
return;
OutputManagerFromEnvironment output_manager_holder(environment(), d.package_id(), oe_exclusive);
OutputManagerFromEnvironment output_manager_holder(environment(), d.package_id(),
oe_exclusive, ClientOutputFeatures());
FindDistfilesSize action(make_fetch_action_options(d, output_manager_holder), _already_downloaded);
d.package_id()->perform_action(action);
if (output_manager_holder.output_manager_if_constructed())