<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>