[Aptitude-devel] Bug#570377: Aptitude removals

Chris Tillman toff.tillman at gmail.com
Sun Oct 11 18:28:14 UTC 2015


On Sun, Oct 11, 2015 at 10:07 PM, Vincent Lefevre <vincent at vinc17.net>
wrote:

> On 2015-10-11 21:36:19 +1300, Chris Tillman wrote:
> > I bought a new (used) computer, and installed a new system. This annoying
> > behaviour came back, of course, because I had set the old one up to get
> rid
> > of it.
> >
> > For anyone being affected by these bugs, or annoyed by removals being
> > offered first, I'd suggest trying this in your ~/.aptitude/config file:
> >
> > Aptitude "";
> > Aptitude::ProblemResolver "";
> > Aptitude::ProblemResolver::Remove-Level "10001";
> [...]
>
> In https://lists.debian.org/debian-user/2014/07/msg00398.html
> Andrei POPESCU suggested:
>
>   Aptitude::ProblemResolver::SolutionCost "removals";
>
> but this can lead to downgrades:
>
>   https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=762932
>
> How does your solution behave compared to this one?
>
> --
> Vincent Lefèvre <vincent at vinc17.net> - Web: <https://www.vinc17.net/>
> 100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/>
> Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)
>

Hi Vincent!

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.

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.


[image: Inline image 1]

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

Grepping the source shows that Remove-Level is a cfg_level, which is
referred in quite a few places, potentially having complex effects:

chris at ctillman:~/eiffel/projects/Eifflix/src/packages/aptitude/pre/aptitude-0.7.2$
ack Remove-Level src
src/generic/apt/aptitude_resolver_universe.cc
878:  return parse_levels(aptcfg->Find(PACKAGE
"::ProblemResolver::Remove-Level", ""),

chris at ctillman:~/eiffel/projects/Eifflix/src/packages/aptitude/pre/aptitude-0.7.2$
ack parse_levels src
src/generic/apt/aptitude_resolver_universe.h
1374:  static cfg_level parse_levels(const std::string &level1,

src/generic/apt/aptitude_resolver_universe.cc
847:cfg_level aptitude_universe::parse_levels(const std::string &level1,
864:    parse_levels(aptcfg->Find(PACKAGE "::ProblemResolver::Safe-Level",
""),
871:  return parse_levels(aptcfg->Find(PACKAGE
"::ProblemResolver::Keep-All-Level", ""),
878:  return parse_levels(aptcfg->Find(PACKAGE
"::ProblemResolver::Remove-Level", ""),
885:  return parse_levels(aptcfg->Find(PACKAGE
"::ProblemResolver::Break-Hold-Level", ""),
892:  return parse_levels(aptcfg->Find(PACKAGE
"::ProblemResolver::Non-Default-Level", ""),
899:  return parse_levels(aptcfg->Find(PACKAGE
"::ProblemResolver::Remove-Essential-Level", ""),

chris at ctillman:~/eiffel/projects/Eifflix/src/packages/aptitude/pre/aptitude-0.7.2$
ack cfg_level srcsrc/generic/apt/aptitude_resolver_universe.h
1067:class cfg_level
1072:  cfg_level(int _level, bool _is_discard)
1078:  /** \brief Create a cfg_level that has no effect. */
1079:  cfg_level()
1084:  static cfg_level make_level(int level)
1086:    return cfg_level(level, false);
1089:  static cfg_level make_conflict()
1091:    return cfg_level(INT_MAX, true);
1097:  bool operator<(const cfg_level &other) const
1108:std::ostream &operator<<(std::ostream &out, const cfg_level &level);
1366:  static cfg_level parse_level(const std::string &s);
1374:  static cfg_level parse_levels(const std::string &level1,
1376:                                cfg_level default_level);
1379:  static cfg_level get_safe_level();
1380:  static cfg_level get_keep_all_level();
1381:  static cfg_level get_remove_level();
1382:  static cfg_level get_break_hold_level();
1383:  static cfg_level get_non_default_level();
1384:  static cfg_level get_remove_essential_level();

src/generic/apt/aptitude_resolver_universe.cc
813:std::ostream &operator<<(std::ostream &out, const cfg_level &level)
823:cfg_level aptitude_universe::parse_level(const std::string &s)
826:    return cfg_level::make_level(cost_limits::maximum_level);
828:    return cfg_level::make_level(cost_limits::minimum_level);
830:    return cfg_level::make_conflict();
840:      return cfg_level::make_level(cost_limits::minimum_level);
843:    return cfg_level::make_level(n);
847:cfg_level aptitude_universe::parse_levels(const std::string &level1,
849:                                          cfg_level default_level)
858:    return std::max<cfg_level>(parse_level(level1),
parse_level(level2));
861:cfg_level aptitude_universe::get_safe_level()
866:                 cfg_level::make_level(10000));
869:cfg_level aptitude_universe::get_keep_all_level()
873:                      cfg_level::make_level(20000));
876:cfg_level aptitude_universe::get_remove_level()
880:                      cfg_level::make_level(10000));
883:cfg_level aptitude_universe::get_break_hold_level()
887:                      cfg_level::make_level(40000));
890:cfg_level aptitude_universe::get_non_default_level()
894:                      cfg_level::make_level(50000));
897:cfg_level aptitude_universe::get_remove_essential_level()
901:                      cfg_level::make_level(60000));

src/generic/apt/aptitude_resolver.cc
457:  cfg_level safety_level;
702:  cost apply_cfg_level(const cfg_level &level,
743:  cfg_level keep_all_level(aptitude_universe::get_keep_all_level());
744:  cost keep_all_cost(apply_cfg_level(keep_all_level, cost_settings,
safety_component));
1173:  cfg_level safe_level(aptitude_universe::get_safe_level());
1174:  cfg_level keep_all_level(aptitude_universe::get_keep_all_level());
1175:  cfg_level remove_level(aptitude_universe::get_remove_level());
1176:  cfg_level
break_hold_level(aptitude_universe::get_break_hold_level());
1177:  cfg_level
non_default_level(aptitude_universe::get_non_default_level());
1178:  cfg_level
remove_essential_level(aptitude_universe::get_remove_essential_level());
1433:                                  apply_cfg_level(safe_level,
cost_settings, safety_component)
1453:                                  apply_cfg_level(remove_level,
cost_settings, safety_component)
1485:                                  apply_cfg_level(safe_level,
cost_settings, safety_component));
1505:                                  apply_cfg_level(non_default_level,
cost_settings, safety_component)
1529:                                  apply_cfg_level(break_hold_level,
cost_settings, safety_component)
1552:
apply_cfg_level(remove_essential_level, cost_settings, safety_component));


... But SolutionCost is more of a fine-tuning feature, which only
influences the final decision:

chris at ctillman:~/eiffel/projects/Eifflix/src/packages/aptitude/pre/aptitude-0.7.2$
ack SolutionCost src
src/generic/apt/resolver_manager.cc
898:  std::string cost_configuration = aptcfg->Find(PACKAGE
"::ProblemResolver::SolutionCost",

chris at ctillman:~/eiffel/projects/Eifflix/src/packages/aptitude/pre/aptitude-0.7.2$
ack cost_configuration src
src/generic/apt/resolver_manager.cc
898:  std::string cost_configuration = aptcfg->Find(PACKAGE
"::ProblemResolver::SolutionCost",
904:      cost_components = parse_cost_settings(cost_configuration);

chris at ctillman:~/eiffel/projects/Eifflix/src/packages/aptitude/pre/aptitude-0.7.2$
ack cost_components src
src/generic/apt/resolver_manager.cc
901:  std::shared_ptr<std::vector<cost_component_structure> >
cost_components;
904:      cost_components = parse_cost_settings(cost_configuration);
916:      cost_components =
std::make_shared<std::vector<cost_component_structure> >();
920:
cost_components->push_back(cost_component_structure(cost_component_structure::combine_none,
level0));
924:
cost_components->push_back(cost_component_structure(cost_component_structure::combine_none,
level1));
928:  aptitude_resolver_cost_settings cost_settings(cost_components);

-- 
Chris Tillman
Developer
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.alioth.debian.org/pipermail/aptitude-devel/attachments/20151012/2221ef17/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 110264 bytes
Desc: not available
URL: <http://lists.alioth.debian.org/pipermail/aptitude-devel/attachments/20151012/2221ef17/attachment.png>


More information about the Aptitude-devel mailing list