Refuse to install obsoleted packages (RhBug:486565)
authorPanu Matilainen <pmatilai@redhat.com>
Thu, 18 Mar 2010 13:28:23 +0000 (15:28 +0200)
committerPanu Matilainen <pmatilai@redhat.com>
Thu, 18 Mar 2010 13:28:23 +0000 (15:28 +0200)
- Packages which are obsoleted by some installed package now behave
  much like conflicts, ie install is refused unless --nodeps is used
- Unlike conflicts, obsoletes are only tested against installed package
  names and not provides. Otherwise it would be impossible to create
  compat-packages which provide something that is obsoleted.
- Only check against installed obsoletes, as any obsoletes in the
  transaction could and should be handled automatically similarly to
  foo-1.0 and foo-2.0 in the same transaction set resulting only in foo-2.0
  getting installed.

lib/depends.c

index 05a2d5a..3bf54a3 100644 (file)
@@ -508,12 +508,15 @@ static void checkPackageSet(rpmts ts, depCache dcache, rpmte te,
        char * pkgNEVRA = headerGetAsString(h, RPMTAG_NEVRA);
        rpmds requires = rpmdsNew(h, RPMTAG_REQUIRENAME, 0);
        rpmds conflicts = rpmdsNew(h, RPMTAG_CONFLICTNAME, 0);
+       rpmds obsoletes = rpmdsNew(h, RPMTAG_OBSOLETENAME, 0);
 
        checkDS(ts, dcache, te, pkgNEVRA, requires, dep, 0, adding);
        checkDS(ts, dcache, te, pkgNEVRA, conflicts, dep, 0, adding);
+       checkDS(ts, dcache, te, pkgNEVRA, obsoletes, dep, 0, adding);
 
        conflicts = rpmdsFree(conflicts);
        requires = rpmdsFree(requires);
+       obsoletes = rpmdsFree(requires);
        pkgNEVRA = _free(pkgNEVRA);
     }
 }
@@ -571,6 +574,9 @@ int rpmtsCheck(rpmts ts)
        while (rpmdsNext(provides) >= 0) {
            checkInstDeps(ts, dcache, p, RPMTAG_CONFLICTNAME, rpmdsN(provides));
        }
+
+       /* Check package name (not provides!) against installed obsoletes */
+       checkInstDeps(ts, dcache, p, RPMTAG_OBSOLETENAME, rpmteN(p));
     }
     pi = rpmtsiFree(pi);