Package: dpkg
Version: 1.13.22

If A -Conflicts-> B, then dpkg correctly refuses to unpack A if B is
installed and to unpack B if A is installed.  Furthermore, dpkg
correctly refuses to unpack A even if B is merely unpacked or
half-installed etc.

However, if A is unpacked or half-installed, the conflict is not
checked and it is possible to unpack B.  This is a mistake.  Between
two packages, Conflicts is a relationship with symmetrical effects (in
the absence of Replaces).

I think it might also be possible to remove the predependencies of
merely-unpacked packages, but I haven't tested this.

The cause lies in depcon.c, in depisok:

  /* The dependency is always OK if we're trying to remove the depend*ing*
   * package.
   */
  switch (dep->up->clientdata->istobe) {
  case itb_remove: case itb_deconfigure:
    return 1;
  case itb_normal:
    /* Only `installed' packages can be make dependency problems */
    switch (dep->up->status) {
    case stat_installed:
      break;
    case stat_notinstalled: case stat_configfiles: case stat_halfinstalled:
    case stat_halfconfigured: case stat_unpacked:
      return 1;
    default:
      internerr("unknown status depending");
    }

It is not true that only `installed' packages can cause dependency
problems.  Both Conflicts and Pre-Depends, and soon Breaks, can cause
problem even if the `source' package for the dependency is not
completely installed.

I _think_ simply saying something like this:

    case stat_halfinstalled: case stat_halfconfigured: case stat_unpacked:
      if (dep->type == dep_conflicts ||
          dep->type == dep_predepends ||
          dep->type == dep_breaks)
        break;
      /* fall through */
    case stat_notinstalled: case stat_configfiles:
      return 1;

ought to fix it but I haven't tested this.

Ian.


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to