<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sun, Oct 11, 2015 at 10:07 PM, Vincent Lefevre <span dir="ltr"><<a href="mailto:vincent@vinc17.net" target="_blank">vincent@vinc17.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 2015-10-11 21:36:19 +1300, Chris Tillman wrote:<br>
> I bought a new (used) computer, and installed a new system. This annoying<br>
> behaviour came back, of course, because I had set the old one up to get rid<br>
> of it.<br>
><br>
> For anyone being affected by these bugs, or annoyed by removals being<br>
> offered first, I'd suggest trying this in your ~/.aptitude/config file:<br>
><br>
> Aptitude "";<br>
> Aptitude::ProblemResolver "";<br>
> Aptitude::ProblemResolver::Remove-Level "10001";<br>
[...]<br>
<br>
In <a href="https://lists.debian.org/debian-user/2014/07/msg00398.html" rel="noreferrer" target="_blank">https://lists.debian.org/debian-user/2014/07/msg00398.html</a><br>
Andrei POPESCU suggested:<br>
<br>
Aptitude::ProblemResolver::SolutionCost "removals";<br>
<br>
but this can lead to downgrades:<br>
<br>
<a href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=762932" rel="noreferrer" target="_blank">https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=762932</a><br>
<br>
How does your solution behave compared to this one?<br>
<span class=""><font color="#888888"><br>
--<br>
Vincent Lefèvre <<a href="mailto:vincent@vinc17.net">vincent@vinc17.net</a>> - Web: <<a href="https://www.vinc17.net/" rel="noreferrer" target="_blank">https://www.vinc17.net/</a>><br>
100% accessible validated (X)HTML - Blog: <<a href="https://www.vinc17.net/blog/" rel="noreferrer" target="_blank">https://www.vinc17.net/blog/</a>><br>
Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)<br>
</font></span></blockquote></div><br><div><div><div><div>Hi Vincent!<br><br></div>You are over-represented in
the list of potentially related bugs I compiled last night. I sense you
are as frustrated as I am about this behaviour.<br><br></div>For the
simple example I gave, where my setting offered to upgrade rather than
remove, with your setting substituted it did an "automatic fix" for
broken packages.<br><br><br><img alt="Inline image 1" src="cid:ii_15058124e78a8e3c" height="563" width="481"><br><br></div>So
the difference there was, it told me to fuggedabout it (my request). It also
canceled that pending action. So I think the Remove-Level "10001"
setting is probably more desirable based on that quick test ... because my
stated intention was to upgrade (I pressed + on the binutils line)..<br><br></div>Grepping the source shows that Remove-Level is a cfg_level, which is referred in quite a few places, potentially having complex effects:<br><br>chris@ctillman:~/eiffel/projects/Eifflix/src/packages/aptitude/pre/aptitude-0.7.2$ ack Remove-Level src<br>src/generic/apt/aptitude_resolver_universe.cc<br>878: return parse_levels(aptcfg->Find(PACKAGE "::ProblemResolver::Remove-Level", ""),<br><br>chris@ctillman:~/eiffel/projects/Eifflix/src/packages/aptitude/pre/aptitude-0.7.2$ ack parse_levels src<br>src/generic/apt/aptitude_resolver_universe.h<br>1374: static cfg_level parse_levels(const std::string &level1,<br><br>src/generic/apt/aptitude_resolver_universe.cc<br>847:cfg_level aptitude_universe::parse_levels(const std::string &level1,<br>864: parse_levels(aptcfg->Find(PACKAGE "::ProblemResolver::Safe-Level", ""),<br>871: return parse_levels(aptcfg->Find(PACKAGE "::ProblemResolver::Keep-All-Level", ""),<br>878: return parse_levels(aptcfg->Find(PACKAGE "::ProblemResolver::Remove-Level", ""),<br>885: return parse_levels(aptcfg->Find(PACKAGE "::ProblemResolver::Break-Hold-Level", ""),<br>892: return parse_levels(aptcfg->Find(PACKAGE "::ProblemResolver::Non-Default-Level", ""),<br>899: return parse_levels(aptcfg->Find(PACKAGE "::ProblemResolver::Remove-Essential-Level", ""),<br><br>chris@ctillman:~/eiffel/projects/Eifflix/src/packages/aptitude/pre/aptitude-0.7.2$ ack cfg_level srcsrc/generic/apt/aptitude_resolver_universe.h<br>1067:class cfg_level<br>1072: cfg_level(int _level, bool _is_discard)<br>1078: /** \brief Create a cfg_level that has no effect. */<br>1079: cfg_level()<br>1084: static cfg_level make_level(int level)<br>1086: return cfg_level(level, false);<br>1089: static cfg_level make_conflict()<br>1091: return cfg_level(INT_MAX, true);<br>1097: bool operator<(const cfg_level &other) const<br>1108:std::ostream &operator<<(std::ostream &out, const cfg_level &level);<br>1366: static cfg_level parse_level(const std::string &s);<br>1374: static cfg_level parse_levels(const std::string &level1,<br>1376: cfg_level default_level);<br>1379: static cfg_level get_safe_level();<br>1380: static cfg_level get_keep_all_level();<br>1381: static cfg_level get_remove_level();<br>1382: static cfg_level get_break_hold_level();<br>1383: static cfg_level get_non_default_level();<br>1384: static cfg_level get_remove_essential_level();<br><br>src/generic/apt/aptitude_resolver_universe.cc<br>813:std::ostream &operator<<(std::ostream &out, const cfg_level &level)<br>823:cfg_level aptitude_universe::parse_level(const std::string &s)<br>826: return cfg_level::make_level(cost_limits::maximum_level);<br>828: return cfg_level::make_level(cost_limits::minimum_level);<br>830: return cfg_level::make_conflict();<br>840: return cfg_level::make_level(cost_limits::minimum_level);<br>843: return cfg_level::make_level(n);<br>847:cfg_level aptitude_universe::parse_levels(const std::string &level1,<br>849: cfg_level default_level)<br>858: return std::max<cfg_level>(parse_level(level1), parse_level(level2));<br>861:cfg_level aptitude_universe::get_safe_level()<br>866: cfg_level::make_level(10000));<br>869:cfg_level aptitude_universe::get_keep_all_level()<br>873: cfg_level::make_level(20000));<br>876:cfg_level aptitude_universe::get_remove_level()<br>880: cfg_level::make_level(10000));<br>883:cfg_level aptitude_universe::get_break_hold_level()<br>887: cfg_level::make_level(40000));<br>890:cfg_level aptitude_universe::get_non_default_level()<br>894: cfg_level::make_level(50000));<br>897:cfg_level aptitude_universe::get_remove_essential_level()<br>901: cfg_level::make_level(60000));<br><br>src/generic/apt/aptitude_resolver.cc<br>457: cfg_level safety_level;<br>702: cost apply_cfg_level(const cfg_level &level,<br>743: cfg_level keep_all_level(aptitude_universe::get_keep_all_level());<br>744: cost keep_all_cost(apply_cfg_level(keep_all_level, cost_settings, safety_component));<br>1173: cfg_level safe_level(aptitude_universe::get_safe_level());<br>1174: cfg_level keep_all_level(aptitude_universe::get_keep_all_level());<br>1175: cfg_level remove_level(aptitude_universe::get_remove_level());<br>1176: cfg_level break_hold_level(aptitude_universe::get_break_hold_level());<br>1177: cfg_level non_default_level(aptitude_universe::get_non_default_level());<br>1178: cfg_level remove_essential_level(aptitude_universe::get_remove_essential_level());<br>1433: apply_cfg_level(safe_level, cost_settings, safety_component)<br>1453: apply_cfg_level(remove_level, cost_settings, safety_component)<br>1485: apply_cfg_level(safe_level, cost_settings, safety_component));<br>1505: apply_cfg_level(non_default_level, cost_settings, safety_component)<br>1529: apply_cfg_level(break_hold_level, cost_settings, safety_component)<br>1552: apply_cfg_level(remove_essential_level, cost_settings, safety_component));<br><br><br></div><div class="gmail_extra">... But SolutionCost is more of a fine-tuning feature, which only influences the final decision:<br></div><div class="gmail_extra"><br>chris@ctillman:~/eiffel/projects/Eifflix/src/packages/aptitude/pre/aptitude-0.7.2$ ack SolutionCost src<br>src/generic/apt/resolver_manager.cc<br>898: std::string cost_configuration = aptcfg->Find(PACKAGE "::ProblemResolver::SolutionCost",<br><br clear="all">chris@ctillman:~/eiffel/projects/Eifflix/src/packages/aptitude/pre/aptitude-0.7.2$ ack cost_configuration src<br>src/generic/apt/resolver_manager.cc<br>898: std::string cost_configuration = aptcfg->Find(PACKAGE "::ProblemResolver::SolutionCost",<br>904: cost_components = parse_cost_settings(cost_configuration);<br><br>chris@ctillman:~/eiffel/projects/Eifflix/src/packages/aptitude/pre/aptitude-0.7.2$ ack cost_components src<br>src/generic/apt/resolver_manager.cc<br>901: std::shared_ptr<std::vector<cost_component_structure> > cost_components;<br>904: cost_components = parse_cost_settings(cost_configuration);<br>916: cost_components = std::make_shared<std::vector<cost_component_structure> >();<br>920: cost_components->push_back(cost_component_structure(cost_component_structure::combine_none, level0));<br>924: cost_components->push_back(cost_component_structure(cost_component_structure::combine_none, level1));<br>928: aptitude_resolver_cost_settings cost_settings(cost_components);<br><br>-- <br><div class="gmail_signature">Chris Tillman<br>Developer</div>
</div></div>