aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvatar Ciaran McCreesh <ciaran.mccreesh@googlemail.com> 2009-09-26 19:58:24 +0100
committerAvatar Ciaran McCreesh <ciaran.mccreesh@googlemail.com> 2009-09-26 19:58:24 +0100
commit3af824da5ee63dc4a7f1f81d235c791e9fcee25b (patch)
tree45b5209b702ba0fd63bc3ba86f9fe87ca3bff84c
parentad84b5e525e5728e8f3a3ccbc887e1e7bd29d1d5 (diff)
downloadpaludis-3af824da5ee63dc4a7f1f81d235c791e9fcee25b.tar.gz
paludis-3af824da5ee63dc4a7f1f81d235c791e9fcee25b.tar.xz
Nicer mask messages
-rw-r--r--paludis/resolver/Makefile.am2
-rw-r--r--paludis/resolver/decision.cc27
-rw-r--r--paludis/resolver/decision.hh7
-rw-r--r--paludis/resolver/resolver.cc93
-rw-r--r--paludis/resolver/resolver.hh16
-rw-r--r--paludis/resolver/unsuitable_candidates-fwd.hh35
-rw-r--r--paludis/resolver/unsuitable_candidates.cc51
-rw-r--r--paludis/resolver/unsuitable_candidates.hh50
-rw-r--r--src/clients/cave/cmd_display_resolution.cc56
9 files changed, 318 insertions, 19 deletions
diff --git a/paludis/resolver/Makefile.am b/paludis/resolver/Makefile.am
index 0d4dd59..a6e9319 100644
--- a/paludis/resolver/Makefile.am
+++ b/paludis/resolver/Makefile.am
@@ -27,6 +27,7 @@ noinst_HEADERS = \
sanitised_dependencies.hh sanitised_dependencies-fwd.hh \
serialise.hh serialise-fwd.hh serialise-impl.hh \
suggest_restart.hh suggest_restart-fwd.hh \
+ unsuitable_candidates.hh unsuitable_candidates-fwd.hh \
use_existing.hh use_existing-fwd.hh use_existing-se.hh
libpaludisresolver_a_SOURCES = \
@@ -43,6 +44,7 @@ libpaludisresolver_a_SOURCES = \
sanitised_dependencies.cc \
serialise.cc \
suggest_restart.cc \
+ unsuitable_candidates.cc \
use_existing.cc
TESTS_ENVIRONMENT = env \
diff --git a/paludis/resolver/decision.cc b/paludis/resolver/decision.cc
index 56bca98..f4bfdd5 100644
--- a/paludis/resolver/decision.cc
+++ b/paludis/resolver/decision.cc
@@ -20,9 +20,12 @@
#include <paludis/resolver/decision.hh>
#include <paludis/resolver/serialise-impl.hh>
#include <paludis/resolver/destination.hh>
+#include <paludis/resolver/unsuitable_candidates.hh>
#include <paludis/util/make_named_values.hh>
#include <paludis/util/stringify.hh>
#include <paludis/util/private_implementation_pattern-impl.hh>
+#include <paludis/util/sequence.hh>
+#include <paludis/util/wrapped_forward_iterator.hh>
#include <sstream>
using namespace paludis;
@@ -70,7 +73,14 @@ Decision::deserialise(Deserialisation & d)
else if (d.class_name() == "UnableToMakeDecision")
{
Deserialisator v(d, "UnableToMakeDecision");
+
+ std::tr1::shared_ptr<UnsuitableCandidates> unsuitable_candidates(new UnsuitableCandidates);
+ Deserialisator vv(*v.find_remove_member("unsuitable_candidates"), "c");
+ for (int n(1), n_end(vv.member<int>("count") + 1) ; n != n_end ; ++n)
+ unsuitable_candidates->push_back(vv.member<UnsuitableCandidate>(stringify(n)));
+
return make_shared_ptr(new UnableToMakeDecision(
+ unsuitable_candidates,
v.member<bool>("taken")
));
}
@@ -286,17 +296,21 @@ namespace paludis
template <>
struct Implementation<UnableToMakeDecision>
{
+ const std::tr1::shared_ptr<const UnsuitableCandidates> unsuitable_candidates;
const bool taken;
- Implementation(const bool t) :
+ Implementation(const std::tr1::shared_ptr<const UnsuitableCandidates> & u, const bool t) :
+ unsuitable_candidates(u),
taken(t)
{
}
};
}
-UnableToMakeDecision::UnableToMakeDecision(const bool t) :
- PrivateImplementationPattern<UnableToMakeDecision>(new Implementation<UnableToMakeDecision>(t))
+UnableToMakeDecision::UnableToMakeDecision(
+ const std::tr1::shared_ptr<const UnsuitableCandidates> & u,
+ const bool t) :
+ PrivateImplementationPattern<UnableToMakeDecision>(new Implementation<UnableToMakeDecision>(u, t))
{
}
@@ -308,6 +322,12 @@ UnableToMakeDecision::~UnableToMakeDecision()
}
#endif
+const std::tr1::shared_ptr<const UnsuitableCandidates>
+UnableToMakeDecision::unsuitable_candidates() const
+{
+ return _imp->unsuitable_candidates;
+}
+
bool
UnableToMakeDecision::taken() const
{
@@ -319,6 +339,7 @@ UnableToMakeDecision::serialise(Serialiser & s) const
{
s.object("UnableToMakeDecision")
.member(SerialiserFlags<>(), "taken", taken())
+ .member(SerialiserFlags<serialise::might_be_null, serialise::container>(), "unsuitable_candidates", unsuitable_candidates())
;
}
diff --git a/paludis/resolver/decision.hh b/paludis/resolver/decision.hh
index 1d17626..c15f299 100644
--- a/paludis/resolver/decision.hh
+++ b/paludis/resolver/decision.hh
@@ -23,6 +23,7 @@
#include <paludis/resolver/decision-fwd.hh>
#include <paludis/resolver/serialise-fwd.hh>
#include <paludis/resolver/destination-fwd.hh>
+#include <paludis/resolver/unsuitable_candidates-fwd.hh>
#include <paludis/util/private_implementation_pattern.hh>
#include <paludis/util/simple_visitor.hh>
#include <paludis/util/type_list.hh>
@@ -124,12 +125,16 @@ namespace paludis
private PrivateImplementationPattern<UnableToMakeDecision>
{
public:
- UnableToMakeDecision(const bool taken);
+ UnableToMakeDecision(
+ const std::tr1::shared_ptr<const UnsuitableCandidates> &,
+ const bool taken);
~UnableToMakeDecision();
virtual bool taken() const PALUDIS_ATTRIBUTE((warn_unused_result));
virtual void serialise(Serialiser &) const;
+
+ const std::tr1::shared_ptr<const UnsuitableCandidates> unsuitable_candidates() const PALUDIS_ATTRIBUTE((warn_unused_result));
};
}
diff --git a/paludis/resolver/resolver.cc b/paludis/resolver/resolver.cc
index 2075013..3bfb2e8 100644
--- a/paludis/resolver/resolver.cc
+++ b/paludis/resolver/resolver.cc
@@ -30,6 +30,7 @@
#include <paludis/resolver/resolutions.hh>
#include <paludis/resolver/serialise.hh>
#include <paludis/resolver/destination.hh>
+#include <paludis/resolver/unsuitable_candidates.hh>
#include <paludis/util/stringify.hh>
#include <paludis/util/make_named_values.hh>
#include <paludis/util/log.hh>
@@ -546,11 +547,11 @@ namespace
}
bool
-Resolver::_verify_new_constraint(const Resolvent &,
- const std::tr1::shared_ptr<const Resolution> & resolution,
- const std::tr1::shared_ptr<const Constraint> & constraint)
+Resolver::_check_constraint(const Resolvent &,
+ const std::tr1::shared_ptr<const Constraint> & constraint,
+ const std::tr1::shared_ptr<const Decision> & decision) const
{
- const std::tr1::shared_ptr<const PackageID> chosen_id(resolution->decision()->accept_returning<
+ const std::tr1::shared_ptr<const PackageID> chosen_id(decision->accept_returning<
std::tr1::shared_ptr<const PackageID> >(ChosenIDVisitor()));
if (chosen_id)
@@ -573,18 +574,26 @@ Resolver::_verify_new_constraint(const Resolvent &,
return false;
}
- if (! resolution->decision()->accept_returning<bool>(CheckUseExistingVisitor(constraint)))
+ if (! decision->accept_returning<bool>(CheckUseExistingVisitor(constraint)))
return false;
if (! constraint->untaken())
{
- if (! resolution->decision()->taken())
+ if (! decision->taken())
return false;
}
return true;
}
+bool
+Resolver::_verify_new_constraint(const Resolvent & resolvent,
+ const std::tr1::shared_ptr<const Resolution> & resolution,
+ const std::tr1::shared_ptr<const Constraint> & constraint)
+{
+ return _check_constraint(resolvent, constraint, resolution->decision());
+}
+
namespace
{
struct WrongDecisionVisitor
@@ -1559,14 +1568,38 @@ Resolver::_try_to_find_decision_for(
const std::tr1::shared_ptr<Decision>
Resolver::_cannot_decide_for(
- const Resolvent &,
+ const Resolvent & resolvent,
const std::tr1::shared_ptr<const Resolution> & resolution) const
{
+ const std::tr1::shared_ptr<UnsuitableCandidates> unsuitable_candidates(new UnsuitableCandidates);
+
+ const std::tr1::shared_ptr<const PackageID> existing_id(_find_existing_id_for(resolvent, resolution));
+ if (existing_id)
+ unsuitable_candidates->push_back(_make_unsuitable_candidate(resolvent, resolution, existing_id));
+
+ const std::tr1::shared_ptr<const PackageIDSequence> installable_ids(_find_installable_id_candidates_for(resolvent, resolution, true));
+ for (PackageIDSequence::ConstIterator i(installable_ids->begin()), i_end(installable_ids->end()) ;
+ i != i_end ; ++i)
+ unsuitable_candidates->push_back(_make_unsuitable_candidate(resolvent, resolution, *i));
+
return make_shared_ptr(new UnableToMakeDecision(
+ unsuitable_candidates,
! resolution->constraints()->all_untaken()
));
}
+UnsuitableCandidate
+Resolver::_make_unsuitable_candidate(
+ const Resolvent & resolvent,
+ const std::tr1::shared_ptr<const Resolution> &,
+ const std::tr1::shared_ptr<const PackageID> & id) const
+{
+ return make_named_values<UnsuitableCandidate>(
+ value_for<n::package_id>(id),
+ value_for<n::unmet_constraints>(_get_unmatching_constraints(resolvent, id))
+ );
+}
+
const std::tr1::shared_ptr<const PackageID>
Resolver::_find_existing_id_for(const Resolvent & resolvent, const std::tr1::shared_ptr<const Resolution> & resolution) const
{
@@ -1578,17 +1611,23 @@ Resolver::_find_existing_id_for(const Resolvent & resolvent, const std::tr1::sha
return _find_id_for_from(resolvent, resolution, ids).first;
}
+const std::tr1::shared_ptr<const PackageIDSequence>
+Resolver::_find_installable_id_candidates_for(const Resolvent & resolvent,
+ const std::tr1::shared_ptr<const Resolution> &,
+ const bool include_errors) const
+{
+ return (*_imp->env)[selection::AllVersionsSorted(
+ generator::Package(resolvent.package()) |
+ make_slot_filter(resolvent) |
+ filter::SupportsAction<InstallAction>() |
+ ((! include_errors) ? Filter(filter::NotMasked()) : Filter(filter::All()))
+ )];
+}
+
const std::pair<const std::tr1::shared_ptr<const PackageID>, bool>
Resolver::_find_installable_id_for(const Resolvent & resolvent, const std::tr1::shared_ptr<const Resolution> & resolution) const
{
- const std::tr1::shared_ptr<const PackageIDSequence> ids((*_imp->env)[selection::AllVersionsSorted(
- generator::Package(resolvent.package()) |
- make_slot_filter(resolvent) |
- filter::SupportsAction<InstallAction>() |
- filter::NotMasked()
- )]);
-
- return _find_id_for_from(resolvent, resolution, ids);
+ return _find_id_for_from(resolvent, resolution, _find_installable_id_candidates_for(resolvent, resolution, false));
}
const std::pair<const std::tr1::shared_ptr<const PackageID>, bool>
@@ -1681,6 +1720,30 @@ Resolver::rewrite_if_special(const PackageOrBlockDepSpec & s, const Resolvent &
return make_null_shared_ptr();
}
+const std::tr1::shared_ptr<const Constraints>
+Resolver::_get_unmatching_constraints(
+ const Resolvent & resolvent,
+ const std::tr1::shared_ptr<const PackageID> & id) const
+{
+ const std::tr1::shared_ptr<const Resolution> resolution(_resolution_for_resolvent(resolvent));
+ const std::tr1::shared_ptr<Constraints> result(new Constraints);
+
+ for (Constraints::ConstIterator c(resolution->constraints()->begin()),
+ c_end(resolution->constraints()->end()) ;
+ c != c_end ; ++c)
+ {
+ if (! _check_constraint(resolvent, *c, make_shared_ptr(new ChangesToMakeDecision(
+ id,
+ false,
+ ! (*c)->untaken(),
+ make_null_shared_ptr()
+ ))))
+ result->add(*c);
+ }
+
+ return result;
+}
+
void
Resolver::_need_rewrites() const
{
diff --git a/paludis/resolver/resolver.hh b/paludis/resolver/resolver.hh
index bb3ff90..845d676 100644
--- a/paludis/resolver/resolver.hh
+++ b/paludis/resolver/resolver.hh
@@ -32,6 +32,7 @@
#include <paludis/resolver/resolver_functions-fwd.hh>
#include <paludis/resolver/destination_types-fwd.hh>
#include <paludis/resolver/destination-fwd.hh>
+#include <paludis/resolver/unsuitable_candidates-fwd.hh>
#include <paludis/util/private_implementation_pattern.hh>
#include <paludis/util/wrapped_forward_iterator-fwd.hh>
#include <paludis/package_id-fwd.hh>
@@ -85,6 +86,10 @@ namespace paludis
const std::tr1::shared_ptr<Resolution> &,
const std::tr1::shared_ptr<const Constraint> &);
+ bool _check_constraint(const Resolvent &,
+ const std::tr1::shared_ptr<const Constraint> & constraint,
+ const std::tr1::shared_ptr<const Decision> & decision) const;
+
bool _verify_new_constraint(const Resolvent &,
const std::tr1::shared_ptr<const Resolution> &,
const std::tr1::shared_ptr<const Constraint> &);
@@ -164,12 +169,23 @@ namespace paludis
const std::tr1::shared_ptr<const PackageID> _find_existing_id_for(
const Resolvent &, const std::tr1::shared_ptr<const Resolution> &) const;
+ const std::tr1::shared_ptr<const PackageIDSequence> _find_installable_id_candidates_for(
+ const Resolvent &, const std::tr1::shared_ptr<const Resolution> &,
+ const bool include_errors) const;
const std::pair<const std::tr1::shared_ptr<const PackageID>, bool> _find_installable_id_for(
const Resolvent &, const std::tr1::shared_ptr<const Resolution> &) const;
const std::pair<const std::tr1::shared_ptr<const PackageID>, bool> _find_id_for_from(
const Resolvent &, const std::tr1::shared_ptr<const Resolution> &,
const std::tr1::shared_ptr<const PackageIDSequence> &) const;
+ const std::tr1::shared_ptr<const Constraints> _get_unmatching_constraints(
+ const Resolvent &, const std::tr1::shared_ptr<const PackageID> &) const PALUDIS_ATTRIBUTE((warn_unused_result));
+
+ UnsuitableCandidate _make_unsuitable_candidate(
+ const Resolvent &,
+ const std::tr1::shared_ptr<const Resolution> &,
+ const std::tr1::shared_ptr<const PackageID> &) const;
+
void _need_rewrites() const;
public:
diff --git a/paludis/resolver/unsuitable_candidates-fwd.hh b/paludis/resolver/unsuitable_candidates-fwd.hh
new file mode 100644
index 0000000..8bd5892
--- /dev/null
+++ b/paludis/resolver/unsuitable_candidates-fwd.hh
@@ -0,0 +1,35 @@
+/* vim: set sw=4 sts=4 et foldmethod=syntax : */
+
+/*
+ * Copyright (c) 2009 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_RESOLVER_UNSUITABLE_CANDIDATES_FWD_HH
+#define PALUDIS_GUARD_PALUDIS_RESOLVER_UNSUITABLE_CANDIDATES_FWD_HH 1
+
+#include <paludis/util/sequence-fwd.hh>
+
+namespace paludis
+{
+ namespace resolver
+ {
+ struct UnsuitableCandidate;
+
+ typedef Sequence<UnsuitableCandidate> UnsuitableCandidates;
+ }
+}
+
+#endif
diff --git a/paludis/resolver/unsuitable_candidates.cc b/paludis/resolver/unsuitable_candidates.cc
new file mode 100644
index 0000000..5dafd3f
--- /dev/null
+++ b/paludis/resolver/unsuitable_candidates.cc
@@ -0,0 +1,51 @@
+/* vim: set sw=4 sts=4 et foldmethod=syntax : */
+
+/*
+ * Copyright (c) 2009 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/resolver/unsuitable_candidates.hh>
+#include <paludis/resolver/serialise-impl.hh>
+#include <paludis/resolver/constraint.hh>
+#include <paludis/util/sequence-impl.hh>
+#include <paludis/util/wrapped_forward_iterator-impl.hh>
+#include <paludis/util/make_named_values.hh>
+
+using namespace paludis;
+using namespace paludis::resolver;
+
+template class Sequence<UnsuitableCandidate>;
+template class WrappedForwardIterator<UnsuitableCandidates::ConstIteratorTag, const UnsuitableCandidate>;
+
+UnsuitableCandidate
+UnsuitableCandidate::deserialise(Deserialisation & d)
+{
+ Deserialisator v(d, "UnsuitableCandidate");
+ return make_named_values<UnsuitableCandidate>(
+ value_for<n::package_id>(v.member<std::tr1::shared_ptr<const PackageID> >("package_id")),
+ value_for<n::unmet_constraints>(v.member<std::tr1::shared_ptr<Constraints> >("unmet_constraints"))
+ );
+}
+
+void
+UnsuitableCandidate::serialise(Serialiser & s) const
+{
+ s.object("UnsuitableCandidate")
+ .member(SerialiserFlags<serialise::might_be_null>(), "package_id", package_id())
+ .member(SerialiserFlags<>(), "unmet_constraints", *unmet_constraints())
+ ;
+}
+
diff --git a/paludis/resolver/unsuitable_candidates.hh b/paludis/resolver/unsuitable_candidates.hh
new file mode 100644
index 0000000..f3d57d4
--- /dev/null
+++ b/paludis/resolver/unsuitable_candidates.hh
@@ -0,0 +1,50 @@
+/* vim: set sw=4 sts=4 et foldmethod=syntax : */
+
+/*
+ * Copyright (c) 2009 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_RESOLVER_UNSUITABLE_CANDIDATES_HH
+#define PALUDIS_GUARD_PALUDIS_RESOLVER_UNSUITABLE_CANDIDATES_HH 1
+
+#include <paludis/resolver/unsuitable_candidates-fwd.hh>
+#include <paludis/resolver/serialise-fwd.hh>
+#include <paludis/resolver/constraint-fwd.hh>
+#include <paludis/util/named_value.hh>
+#include <paludis/package_id-fwd.hh>
+
+namespace paludis
+{
+ namespace n
+ {
+ struct package_id;
+ struct unmet_constraints;
+ }
+
+ namespace resolver
+ {
+ struct UnsuitableCandidate
+ {
+ NamedValue<n::package_id, std::tr1::shared_ptr<const PackageID> > package_id;
+ NamedValue<n::unmet_constraints, std::tr1::shared_ptr<const Constraints> > unmet_constraints;
+
+ static UnsuitableCandidate deserialise(Deserialisation &) PALUDIS_ATTRIBUTE((warn_unused_result));
+ void serialise(Serialiser &) const;
+ };
+ }
+}
+
+#endif
diff --git a/src/clients/cave/cmd_display_resolution.cc b/src/clients/cave/cmd_display_resolution.cc
index 9ee672b..ada3ac7 100644
--- a/src/clients/cave/cmd_display_resolution.cc
+++ b/src/clients/cave/cmd_display_resolution.cc
@@ -44,6 +44,7 @@
#include <paludis/resolver/resolver.hh>
#include <paludis/resolver/resolvent.hh>
#include <paludis/resolver/destination.hh>
+#include <paludis/resolver/unsuitable_candidates.hh>
#include <paludis/package_id.hh>
#include <paludis/version_spec.hh>
#include <paludis/metadata_key.hh>
@@ -57,6 +58,7 @@
#include <paludis/filtered_generator.hh>
#include <paludis/selection.hh>
#include <paludis/environment.hh>
+#include <paludis/mask.hh>
#include <set>
#include <iterator>
@@ -239,6 +241,58 @@ namespace
}
}
+ std::string mask_stringifier(const Mask & mask)
+ {
+ return stringify(mask.key());
+ }
+
+ struct DisplayOneErrorVisitor
+ {
+ void visit(const UnableToMakeDecision & d) const
+ {
+ if (d.unsuitable_candidates()->empty())
+ cout << " No potential candidates were found" << endl;
+ else
+ {
+ cout << " Potential candidates were:" << endl;
+ for (UnsuitableCandidates::ConstIterator u(d.unsuitable_candidates()->begin()), u_end(d.unsuitable_candidates()->end()) ;
+ u != u_end ; ++u)
+ {
+ cout << " " << *u->package_id() << ": ";
+
+ if (u->package_id()->masked())
+ cout << c::bold_red() << "masked" << c::normal() << " (" << join(indirect_iterator(u->package_id()->begin_masks()),
+ indirect_iterator(u->package_id()->end_masks()), "", mask_stringifier) << ")";
+
+ if (! u->unmet_constraints()->empty())
+ {
+ if (u->package_id()->masked())
+ cout << ", ";
+ cout << c::bold_red() << "unmatching" << c::normal() << " (" << (*u->unmet_constraints()->begin())->spec();
+ int dx(std::distance(u->unmet_constraints()->begin(), u->unmet_constraints()->end()));
+ if (dx > 1)
+ cout << ", " << dx << " more";
+ cout << ")";
+ }
+
+ cout << endl;
+ }
+ }
+ }
+
+ void visit(const ExistingNoChangeDecision &) const
+ {
+ }
+
+ void visit(const ChangesToMakeDecision &) const
+ {
+ }
+
+ void visit(const NothingNoChangeDecision &) const
+ {
+ }
+ };
+
void display_one_error(
const std::tr1::shared_ptr<Environment> &,
const DisplayResolutionCommandLine &,
@@ -253,6 +307,8 @@ namespace
cout << " (no decision could be reached)" << endl;
display_reasons(resolution, verbose);
+
+ resolution->decision()->accept(DisplayOneErrorVisitor());
}
struct ChosenIDVisitor