You're right btw that it's a dpkg bug, but it's a bit more subtle. The
cleanup that dpkg performs after installation is meant to preserve the
hold state for non-installed packages. This is handled by the
pkg_is_informative function, which classifies everything with "pkg->want
!= PKG_WANT_UNKNOWN" as informative, so would actually preserve hold for
non-installed packages. However, pkg_parse_verify contains logic to fix
up state left by older dpkg versions, without taking into account that
this also includes valid state by current dpkg versions:

  /* XXX: Mark not-installed leftover packages for automatic removal on
   * next database dump. This code can be removed after dpkg 1.16.x, when
   * there's guarantee that no leftover is found on the status file on
   * major distributions. */
  if (!(ps->flags & pdb_recordavailable) &&
      pkg->status == PKG_STAT_NOTINSTALLED &&
      pkg->eflag == PKG_EFLAG_OK &&
      (pkg->want == PKG_WANT_PURGE ||
       pkg->want == PKG_WANT_DEINSTALL ||
       pkg->want == PKG_WANT_HOLD)) {
    pkg_set_want(pkg, PKG_WANT_UNKNOWN);
  }

We are now at dpkg 1.20.x, well after 1.16.x. If this block of code is
removed (or at least the pkg->want == PKG_WANT_HOLD condition), direct
installation by dpkg works as expected, and presumably installation
using apt will work as expected as well.

** Also affects: dpkg (Ubuntu)
   Importance: Undecided
       Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Touch seeded packages, which is subscribed to apt in Ubuntu.
https://bugs.launchpad.net/bugs/1904195

Title:
  apt cancels holds on uninstalled packages

Status in apt package in Ubuntu:
  Invalid
Status in dpkg package in Ubuntu:
  New

Bug description:
  When a package is not installed and apt dist-upgrade offers to install
  it, if this is not desired, it is possible to hold the package using
  multiple tools, which puts it in a state documented in dpkg.1 as:

         hold
             A package marked to be on hold is kept on the same version, that
             is, no automatic new installs, upgrades or removals will be
             performed on them, unless these actions are requested explicitly,
             or are permitted to be done automatically with the --force-hold
             option.

  Note the "no automatic new installs", suggesting that this is a
  correct and valid use for packages that are not installed. I use "apt-
  mark hold" to put packages in this state.

  This is respected by apt when choosing what to install, but any
  installation causes this state to be lost for uninstalled packages,
  even installations of completely unrelated packages.

  Steps to reproduce:

  - Add a repository to sources.list that adds new essential packages, and run 
`apt update`.
  - Observe that `apt dist-upgrade` will want to install new packages.
  - Put the packages on hold, using `apt-mark hold <package>`.
  - Observe that `apt dist-upgrade` will no longer want to install new packages.
  - Install an unrelated package.
  - Observe that `apt dist-upgrade` will again want to install new packages.

  Seen on Ubuntu 20.10, apt 2.1.10.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/apt/+bug/1904195/+subscriptions

-- 
Mailing list: https://launchpad.net/~touch-packages
Post to     : touch-packages@lists.launchpad.net
Unsubscribe : https://launchpad.net/~touch-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to