aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvatar Ciaran McCreesh <ciaran.mccreesh@googlemail.com> 2008-11-19 16:07:53 +0000
committerAvatar Ciaran McCreesh <ciaran.mccreesh@googlemail.com> 2008-11-19 16:08:53 +0000
commit6a3e07934797a6f22b7946f7c5f8c557516216d5 (patch)
tree0e1b6a81a6206a87648550ad9d5e9f3d21977714
parentd3adb67d9367de9d5ed1734f07f4d4c4a680e687 (diff)
downloadpaludis-6a3e07934797a6f22b7946f7c5f8c557516216d5.tar.gz
paludis-6a3e07934797a6f22b7946f7c5f8c557516216d5.tar.xz
Support deviating installs.
-rw-r--r--doc/api/cplusplus/examples/example_action.cc1
-rw-r--r--paludis/action.hh9
-rw-r--r--paludis/install_task.cc1
-rw-r--r--paludis/repositories/e/check_fetched_files_visitor.cc41
-rw-r--r--paludis/repositories/e/check_fetched_files_visitor.hh4
-rw-r--r--paludis/repositories/e/e_repository_TEST.cc2
-rw-r--r--paludis/repositories/e/ebuild.cc6
-rw-r--r--paludis/repositories/e/ebuild.hh2
-rw-r--r--paludis/repositories/e/ebuild_entries.cc9
-rw-r--r--paludis/repositories/e/fetch_visitor.cc22
-rw-r--r--paludis/repositories/e/fetch_visitor.hh4
-rw-r--r--paludis/repositories/e/fetch_visitor_TEST.cc3
-rw-r--r--python/action.cc2
-rw-r--r--ruby/action.cc1
-rw-r--r--src/clients/accerso/accerso.cc2
15 files changed, 81 insertions, 28 deletions
diff --git a/doc/api/cplusplus/examples/example_action.cc b/doc/api/cplusplus/examples/example_action.cc
index 4bfeb0c..57d858c 100644
--- a/doc/api/cplusplus/examples/example_action.cc
+++ b/doc/api/cplusplus/examples/example_action.cc
@@ -62,6 +62,7 @@ int main(int argc, char * argv[])
* files should still be fetched. */
FetchAction fetch_action(make_named_values<FetchActionOptions>(
value_for<n::fetch_unneeded>(false),
+ value_for<n::maybe_output_deviant>(make_null_shared_ptr()),
value_for<n::safe_resume>(true)
));
try
diff --git a/paludis/action.hh b/paludis/action.hh
index 85fd140..a336fad 100644
--- a/paludis/action.hh
+++ b/paludis/action.hh
@@ -30,6 +30,7 @@
#include <paludis/util/sequence-fwd.hh>
#include <paludis/util/named_value.hh>
#include <paludis/util/fs_entry-fwd.hh>
+#include <paludis/util/output_deviator-fwd.hh>
#include <tr1/functional>
/** \file
@@ -51,6 +52,7 @@ namespace paludis
struct failed_automatic_fetching;
struct failed_integrity_checks;
struct fetch_unneeded;
+ struct maybe_output_deviant;
struct requires_manual_fetching;
struct safe_resume;
struct target_file;
@@ -67,6 +69,13 @@ namespace paludis
struct FetchActionOptions
{
NamedValue<n::fetch_unneeded, bool> fetch_unneeded;
+
+ /**
+ * May be an empty pointer, for no deviation.
+ * \since 0.32
+ */
+ NamedValue<n::maybe_output_deviant, std::tr1::shared_ptr<OutputDeviant> > maybe_output_deviant;
+
NamedValue<n::safe_resume, bool> safe_resume;
};
diff --git a/paludis/install_task.cc b/paludis/install_task.cc
index a701c75..2974e6f 100644
--- a/paludis/install_task.cc
+++ b/paludis/install_task.cc
@@ -96,6 +96,7 @@ namespace paludis
fetch_options(
make_named_values<FetchActionOptions>(
value_for<n::fetch_unneeded>(false),
+ value_for<n::maybe_output_deviant>(make_null_shared_ptr()),
value_for<n::safe_resume>(false)
)),
install_options(
diff --git a/paludis/repositories/e/check_fetched_files_visitor.cc b/paludis/repositories/e/check_fetched_files_visitor.cc
index 669232f..4aa9e40 100644
--- a/paludis/repositories/e/check_fetched_files_visitor.cc
+++ b/paludis/repositories/e/check_fetched_files_visitor.cc
@@ -40,6 +40,7 @@
#include <paludis/util/sha256.hh>
#include <paludis/util/md5.hh>
#include <paludis/util/make_named_values.hh>
+#include <paludis/util/output_deviator.hh>
#include <paludis/repositories/e/manifest2_reader.hh>
@@ -68,6 +69,8 @@ namespace paludis
const std::tr1::shared_ptr<Manifest2Reader> m2r;
const UseManifest use_manifest;
+ const std::tr1::shared_ptr<OutputDeviant> maybe_output_deviant;
+ std::ostream * out;
Implementation(
const Environment * const e,
@@ -76,7 +79,8 @@ namespace paludis
const bool c,
const bool n,
const FSEntry & m2,
- const UseManifest um) :
+ const UseManifest um,
+ const std::tr1::shared_ptr<OutputDeviant> & md) :
env(e),
id(i),
distdir(d),
@@ -85,7 +89,9 @@ namespace paludis
need_nofetch(false),
in_nofetch(n),
m2r(new Manifest2Reader(m2)),
- use_manifest(um)
+ use_manifest(um),
+ maybe_output_deviant(md),
+ out(md ? maybe_output_deviant->stdout_stream() : &std::cout)
{
}
};
@@ -98,8 +104,9 @@ CheckFetchedFilesVisitor::CheckFetchedFilesVisitor(
const bool c,
const bool n,
const FSEntry & m2,
- const UseManifest um) :
- PrivateImplementationPattern<CheckFetchedFilesVisitor>(new Implementation<CheckFetchedFilesVisitor>(e, i, d, c, n, m2, um))
+ const UseManifest um,
+ const std::tr1::shared_ptr<OutputDeviant> & md) :
+ PrivateImplementationPattern<CheckFetchedFilesVisitor>(new Implementation<CheckFetchedFilesVisitor>(e, i, d, c, n, m2, um, md))
{
}
@@ -218,7 +225,7 @@ CheckFetchedFilesVisitor::check_distfile_manifest(const FSEntry & distfile)
{
Log::get_instance()->message("e.manifest.no_size", ll_debug, lc_context)
<< "Malformed Manifest: no file size found";
- std::cout << "incorrect size";
+ *_imp->out << "incorrect size";
_imp->failures->push_back(make_named_values<FetchActionFailure>(
value_for<n::failed_automatic_fetching>(false),
value_for<n::failed_integrity_checks>("Incorrect file size"),
@@ -231,7 +238,7 @@ CheckFetchedFilesVisitor::check_distfile_manifest(const FSEntry & distfile)
std::ifstream file_stream(stringify(distfile).c_str());
if (! file_stream)
{
- std::cout << "unreadable file";
+ *_imp->out << "unreadable file";
_imp->failures->push_back(make_named_values<FetchActionFailure>(
value_for<n::failed_automatic_fetching>(false),
value_for<n::failed_integrity_checks>("Unreadable file"),
@@ -248,7 +255,7 @@ CheckFetchedFilesVisitor::check_distfile_manifest(const FSEntry & distfile)
{
Log::get_instance()->message("e.manifest.rmd160.failure", ll_debug, lc_context)
<< "Malformed Manifest: failed RMD160 checksum";
- std::cout << "failed RMD160";
+ *_imp->out << "failed RMD160";
_imp->failures->push_back(make_named_values<FetchActionFailure>(
value_for<n::failed_automatic_fetching>(false),
value_for<n::failed_integrity_checks>("Failed RMD160 checksum"),
@@ -270,7 +277,7 @@ CheckFetchedFilesVisitor::check_distfile_manifest(const FSEntry & distfile)
{
Log::get_instance()->message("e.manifest.sha1.failure", ll_debug, lc_context)
<< "Malformed Manifest: failed SHA1 checksum";
- std::cout << "failed SHA1";
+ *_imp->out << "failed SHA1";
_imp->failures->push_back(make_named_values<FetchActionFailure>(
value_for<n::failed_automatic_fetching>(false),
value_for<n::failed_integrity_checks>("Failed SHA1 checksum"),
@@ -292,7 +299,7 @@ CheckFetchedFilesVisitor::check_distfile_manifest(const FSEntry & distfile)
{
Log::get_instance()->message("e.manifest.sha256.failure", ll_debug, lc_context)
<< "Malformed Manifest: failed SHA256 checksum";
- std::cout << "failed SHA256";
+ *_imp->out << "failed SHA256";
_imp->failures->push_back(make_named_values<FetchActionFailure>(
value_for<n::failed_automatic_fetching>(false),
value_for<n::failed_integrity_checks>("Failed SHA256 checksum"),
@@ -314,7 +321,7 @@ CheckFetchedFilesVisitor::check_distfile_manifest(const FSEntry & distfile)
{
Log::get_instance()->message("e.manifest.md5.failure", ll_debug, lc_context)
<< "Malformed Manifest: failed MD5 checksum";
- std::cout << "failed MD5";
+ *_imp->out << "failed MD5";
_imp->failures->push_back(make_named_values<FetchActionFailure>(
value_for<n::failed_automatic_fetching>(false),
value_for<n::failed_integrity_checks>("Failed MD5 checksum"),
@@ -330,7 +337,7 @@ CheckFetchedFilesVisitor::check_distfile_manifest(const FSEntry & distfile)
if (! found)
{
- std::cout << "not in Manifest";
+ *_imp->out << "not in Manifest";
_imp->failures->push_back(make_named_values<FetchActionFailure>(
value_for<n::failed_automatic_fetching>(false),
value_for<n::failed_integrity_checks>("Not in Manifest"),
@@ -356,7 +363,7 @@ CheckFetchedFilesVisitor::visit_leaf(const FetchableURIDepSpec & u)
}
_imp->done.insert(u.filename());
- std::cout << "Checking '" << u.filename() << "'... " << std::flush;
+ *_imp->out << "Checking '" << u.filename() << "'... " << std::flush;
if (! (_imp->distdir / u.filename()).is_regular_file())
{
@@ -364,7 +371,7 @@ CheckFetchedFilesVisitor::visit_leaf(const FetchableURIDepSpec & u)
{
Log::get_instance()->message("e.check_fetched_files.requires_manual", ll_debug, lc_context)
<< "Manual fetch required for '" << u.filename() << "'";
- std::cout << "requires manual fetch";
+ *_imp->out << "requires manual fetch";
_imp->need_nofetch = true;
_imp->failures->push_back(make_named_values<FetchActionFailure>(
value_for<n::failed_automatic_fetching>(false),
@@ -377,7 +384,7 @@ CheckFetchedFilesVisitor::visit_leaf(const FetchableURIDepSpec & u)
{
Log::get_instance()->message("e.check_fetched_files.does_not_exist", ll_debug, lc_context)
<< "Automatic fetch failed for '" << u.filename() << "'";
- std::cout << "does not exist";
+ *_imp->out << "does not exist";
_imp->failures->push_back(make_named_values<FetchActionFailure>(
value_for<n::failed_automatic_fetching>(true),
value_for<n::failed_integrity_checks>(""),
@@ -389,7 +396,7 @@ CheckFetchedFilesVisitor::visit_leaf(const FetchableURIDepSpec & u)
else if (0 == (_imp->distdir / u.filename()).file_size())
{
Log::get_instance()->message("e.check_fetched_files.empty", ll_debug, lc_context) << "Empty file for '" << u.filename() << "'";
- std::cout << "empty file";
+ *_imp->out << "empty file";
_imp->failures->push_back(make_named_values<FetchActionFailure>(
value_for<n::failed_automatic_fetching>(false),
value_for<n::failed_integrity_checks>("SIZE (empty file)"),
@@ -405,10 +412,10 @@ CheckFetchedFilesVisitor::visit_leaf(const FetchableURIDepSpec & u)
else
{
Log::get_instance()->message("e.check_fetched_files.success", ll_debug, lc_context) << "Success for '" << u.filename() << "'";
- std::cout << "ok";
+ *_imp->out << "ok";
}
- std::cout << std::endl;
+ *_imp->out << std::endl;
}
const std::tr1::shared_ptr<const Sequence<FetchActionFailure> >
diff --git a/paludis/repositories/e/check_fetched_files_visitor.hh b/paludis/repositories/e/check_fetched_files_visitor.hh
index e062891..6d0a87e 100644
--- a/paludis/repositories/e/check_fetched_files_visitor.hh
+++ b/paludis/repositories/e/check_fetched_files_visitor.hh
@@ -25,6 +25,7 @@
#include <paludis/util/private_implementation_pattern.hh>
#include <paludis/util/visitor-fwd.hh>
#include <paludis/util/fs_entry-fwd.hh>
+#include <paludis/util/output_deviator-fwd.hh>
#include <paludis/dep_spec-fwd.hh>
#include <paludis/dep_tree.hh>
#include <paludis/package_id-fwd.hh>
@@ -51,7 +52,8 @@ namespace paludis
const bool check_unneeded,
const bool fetch_restrict,
const FSEntry & m2,
- const UseManifest um);
+ const UseManifest um,
+ const std::tr1::shared_ptr<OutputDeviant> & maybe_output_deviant);
~CheckFetchedFilesVisitor();
diff --git a/paludis/repositories/e/e_repository_TEST.cc b/paludis/repositories/e/e_repository_TEST.cc
index 2187732..acc6150 100644
--- a/paludis/repositories/e/e_repository_TEST.cc
+++ b/paludis/repositories/e/e_repository_TEST.cc
@@ -917,6 +917,7 @@ namespace test_cases
FetchAction action(make_named_values<FetchActionOptions>(
value_for<n::fetch_unneeded>(false),
+ value_for<n::maybe_output_deviant>(make_null_shared_ptr()),
value_for<n::safe_resume>(true)
));
@@ -1020,6 +1021,7 @@ namespace test_cases
FetchAction action(make_named_values<FetchActionOptions>(
value_for<n::fetch_unneeded>(false),
+ value_for<n::maybe_output_deviant>(make_null_shared_ptr()),
value_for<n::safe_resume>(true)
));
diff --git a/paludis/repositories/e/ebuild.cc b/paludis/repositories/e/ebuild.cc
index 9be3a47..89366d2 100644
--- a/paludis/repositories/e/ebuild.cc
+++ b/paludis/repositories/e/ebuild.cc
@@ -42,6 +42,7 @@
#include <paludis/util/visitor-impl.hh>
#include <paludis/util/set.hh>
#include <paludis/util/cookie.hh>
+#include <paludis/util/output_deviator.hh>
#include <paludis/about.hh>
#include <paludis/environment.hh>
@@ -640,6 +641,11 @@ EbuildNoFetchCommand::extend_command(const Command & cmd)
j(fetch_params.expand_vars()->end()) ; i != j ; ++i)
result.with_setenv(i->first, i->second);
+ if (fetch_params.maybe_output_deviant())
+ result
+ .with_captured_stderr_stream(fetch_params.maybe_output_deviant()->stderr_stream())
+ .with_captured_stdout_stream(fetch_params.maybe_output_deviant()->stdout_stream());
+
return result;
}
diff --git a/paludis/repositories/e/ebuild.hh b/paludis/repositories/e/ebuild.hh
index d580646..289c4b8 100644
--- a/paludis/repositories/e/ebuild.hh
+++ b/paludis/repositories/e/ebuild.hh
@@ -65,6 +65,7 @@ namespace paludis
struct info_vars;
struct load_environment;
struct loadsaveenv_dir;
+ struct maybe_output_deviant;
struct merger_options;
struct output_directory;
struct package_id;
@@ -123,6 +124,7 @@ namespace paludis
NamedValue<n::a, std::string> a;
NamedValue<n::aa, std::string> aa;
NamedValue<n::expand_vars, std::tr1::shared_ptr<const Map<std::string, std::string> > > expand_vars;
+ NamedValue<n::maybe_output_deviant, std::tr1::shared_ptr<OutputDeviant> > maybe_output_deviant;
NamedValue<n::profiles, std::tr1::shared_ptr<const FSEntrySequence> > profiles;
NamedValue<n::root, std::string> root;
NamedValue<n::use, std::string> use;
diff --git a/paludis/repositories/e/ebuild_entries.cc b/paludis/repositories/e/ebuild_entries.cc
index 8f34146..c65fcfe 100644
--- a/paludis/repositories/e/ebuild_entries.cc
+++ b/paludis/repositories/e/ebuild_entries.cc
@@ -437,11 +437,13 @@ EbuildEntries::fetch(const std::tr1::shared_ptr<const ERepositoryID> & id,
stringify(_imp->e_repository->name()));
FetchVisitor f(_imp->params.environment, id, *id->eapi(),
_imp->e_repository->params().distdir, o.fetch_unneeded(), fetch_userpriv_ok, mirrors_name,
- id->fetches_key()->initial_label(), o.safe_resume());
+ id->fetches_key()->initial_label(), o.safe_resume(), o.maybe_output_deviant());
id->fetches_key()->value()->accept(f);
- CheckFetchedFilesVisitor c(_imp->environment, id, _imp->e_repository->params().distdir, o.fetch_unneeded(), fetch_restrict,
+ CheckFetchedFilesVisitor c(_imp->environment, id, _imp->e_repository->params().distdir,
+ o.fetch_unneeded(), fetch_restrict,
((_imp->e_repository->layout()->package_directory(id->name())) / "Manifest"),
- _imp->e_repository->params().use_manifest);
+ _imp->e_repository->params().use_manifest,
+ o.maybe_output_deviant());
id->fetches_key()->value()->accept(c);
if (c.need_nofetch())
@@ -482,6 +484,7 @@ EbuildEntries::fetch(const std::tr1::shared_ptr<const ERepositoryID> & id,
value_for<n::a>(archives),
value_for<n::aa>(all_archives),
value_for<n::expand_vars>(expand_vars),
+ value_for<n::maybe_output_deviant>(o.maybe_output_deviant()),
value_for<n::profiles>(_imp->params.profiles),
value_for<n::root>("/"),
value_for<n::use>(use),
diff --git a/paludis/repositories/e/fetch_visitor.cc b/paludis/repositories/e/fetch_visitor.cc
index c8a60e3..4ea8a5e 100644
--- a/paludis/repositories/e/fetch_visitor.cc
+++ b/paludis/repositories/e/fetch_visitor.cc
@@ -36,6 +36,7 @@
#include <paludis/util/join.hh>
#include <paludis/util/stringify.hh>
#include <paludis/util/make_shared_ptr.hh>
+#include <paludis/util/output_deviator.hh>
#include <iostream>
#include <list>
@@ -56,6 +57,7 @@ namespace paludis
const std::string mirrors_name;
std::tr1::shared_ptr<const URILabel> default_label;
const bool safe_resume;
+ const std::tr1::shared_ptr<OutputDeviant> maybe_output_deviant;
std::list<const URILabel *> labels;
@@ -68,7 +70,8 @@ namespace paludis
const bool u,
const std::string & m,
const std::tr1::shared_ptr<const URILabel> & n,
- const bool sr) :
+ const bool sr,
+ const std::tr1::shared_ptr<OutputDeviant> & md) :
env(e),
id(i),
eapi(p),
@@ -77,7 +80,8 @@ namespace paludis
userpriv(u),
mirrors_name(m),
default_label(n),
- safe_resume(sr)
+ safe_resume(sr),
+ maybe_output_deviant(md)
{
labels.push_front(default_label.get());
}
@@ -93,8 +97,9 @@ FetchVisitor::FetchVisitor(
const bool u,
const std::string & m,
const std::tr1::shared_ptr<const URILabel> & n,
- const bool sr) :
- PrivateImplementationPattern<FetchVisitor>(new Implementation<FetchVisitor>(e, i, p, d, f, u, m, n, sr))
+ const bool sr,
+ const std::tr1::shared_ptr<OutputDeviant> & md) :
+ PrivateImplementationPattern<FetchVisitor>(new Implementation<FetchVisitor>(e, i, p, d, f, u, m, n, sr, md))
{
}
@@ -236,7 +241,14 @@ FetchVisitor::visit_leaf(const FetchableURIDepSpec & u)
cmd
.with_setenv("PALUDIS_USE_SAFE_RESUME", "yesplease");
- std::cout << "Trying to fetch '" << i->first << "' to '" << i->second << "'..." << std::endl;
+ if (_imp->maybe_output_deviant)
+ cmd
+ .with_captured_stderr_stream(_imp->maybe_output_deviant->stderr_stream())
+ .with_captured_stdout_stream(_imp->maybe_output_deviant->stdout_stream());
+
+ (_imp->maybe_output_deviant ? *_imp->maybe_output_deviant->stdout_stream() : std::cout)
+ << "Trying to fetch '" << i->first << "' to '" << i->second << "'..." << std::endl;
+
if (0 != run_command(cmd))
destination.unlink();
break;
diff --git a/paludis/repositories/e/fetch_visitor.hh b/paludis/repositories/e/fetch_visitor.hh
index b791463..f3917be 100644
--- a/paludis/repositories/e/fetch_visitor.hh
+++ b/paludis/repositories/e/fetch_visitor.hh
@@ -25,6 +25,7 @@
#include <paludis/util/private_implementation_pattern.hh>
#include <paludis/util/visitor-fwd.hh>
#include <paludis/util/fs_entry-fwd.hh>
+#include <paludis/util/output_deviator-fwd.hh>
#include <paludis/dep_spec.hh>
#include <paludis/dep_tree.hh>
#include <paludis/package_id-fwd.hh>
@@ -49,7 +50,8 @@ namespace paludis
const bool userpriv,
const std::string & mirrors_name,
const std::tr1::shared_ptr<const URILabel> & initial_label,
- const bool safe_resume);
+ const bool safe_resume,
+ const std::tr1::shared_ptr<OutputDeviant> & maybe_output_deviant);
~FetchVisitor();
diff --git a/paludis/repositories/e/fetch_visitor_TEST.cc b/paludis/repositories/e/fetch_visitor_TEST.cc
index 97dccec..c1156ac 100644
--- a/paludis/repositories/e/fetch_visitor_TEST.cc
+++ b/paludis/repositories/e/fetch_visitor_TEST.cc
@@ -62,7 +62,8 @@ namespace test_cases
generator::Matches(parse_user_package_dep_spec("=cat/pkg-1",
&env, UserPackageDepSpecOptions()), MatchPackageOptions()))]->begin(),
*eapi, FSEntry("fetch_visitor_TEST_dir/out"),
- false, false, "test", make_shared_ptr(new URIListedThenMirrorsLabel("listed-then-mirrors")), false);
+ false, false, "test", make_shared_ptr(new URIListedThenMirrorsLabel("listed-then-mirrors")), false,
+ make_null_shared_ptr());
parse_fetchable_uri("file:///" + stringify(FSEntry("fetch_visitor_TEST_dir/in/input1").realpath()), &env, id, *eapi)->accept(v);
TEST_CHECK(FSEntry("fetch_visitor_TEST_dir/out/input1").is_regular_file());
diff --git a/python/action.cc b/python/action.cc
index dc59cd1..507fcff 100644
--- a/python/action.cc
+++ b/python/action.cc
@@ -23,6 +23,7 @@
#include <paludis/action.hh>
#include <paludis/util/visitor-impl.hh>
#include <paludis/util/make_named_values.hh>
+#include <paludis/util/make_shared_ptr.hh>
#include <paludis/repository.hh>
#include <tr1/memory>
@@ -78,6 +79,7 @@ namespace
{
return new FetchActionOptions(make_named_values<FetchActionOptions>(
value_for<n::fetch_unneeded>(fetch_unneeded),
+ value_for<n::maybe_output_deviant>(make_null_shared_ptr()),
value_for<n::safe_resume>(safe_resume)
));
}
diff --git a/ruby/action.cc b/ruby/action.cc
index 118c4f7..58e763c 100644
--- a/ruby/action.cc
+++ b/ruby/action.cc
@@ -255,6 +255,7 @@ namespace
ptr = new FetchActionOptions(make_named_values<FetchActionOptions>(
value_for<n::fetch_unneeded>(v_fetch_unneeded),
+ value_for<n::maybe_output_deviant>(make_null_shared_ptr()),
value_for<n::safe_resume>(v_safe_resume)
));
diff --git a/src/clients/accerso/accerso.cc b/src/clients/accerso/accerso.cc
index a01858c..98a1985 100644
--- a/src/clients/accerso/accerso.cc
+++ b/src/clients/accerso/accerso.cc
@@ -31,6 +31,7 @@
#include <paludis/util/map.hh>
#include <paludis/util/visitor-impl.hh>
#include <paludis/util/make_named_values.hh>
+#include <paludis/util/make_shared_ptr.hh>
#include <paludis/environments/no_config/no_config_environment.hh>
#include <paludis/selection.hh>
#include <paludis/generator.hh>
@@ -136,6 +137,7 @@ main(int argc, char *argv[])
{
FetchAction a(make_named_values<FetchActionOptions>(
value_for<n::fetch_unneeded>(true),
+ value_for<n::maybe_output_deviant>(make_null_shared_ptr()),
value_for<n::safe_resume>(true)
));
if ((*i)->supports_action(SupportsActionTest<FetchAction>()))