The following commit has been merged in the master branch:
commit cf4bc140019891334c00b6701a602a55237c7991
Author: Raphaël Hertzog <[email protected]>
Date: Fri Feb 4 22:24:01 2011 +0100
dpkg: Switch functions to take pkgset to reduce deppossi->ed->pkg access
Change some functions to use pkgset instead of pkginfo in order to avoid
some deppossi->ed->pkg lookup which are inherently wrong.
Analyzing reverse dependencies does not need a pkginfo but only a pkgset.
This consideration is the basis for the refactoring done here.
Sponsored-by: Linaro Limited
Signed-off-by: Guillem Jover <[email protected]>
diff --git a/src/packages.c b/src/packages.c
index 6416ad0..0531aa4 100644
--- a/src/packages.c
+++ b/src/packages.c
@@ -3,6 +3,8 @@
* packages.c - common to actions that process packages
*
* Copyright © 1994,1995 Ian Jackson <[email protected]>
+ * Copyright © 2011 Linaro Limited
+ * Copyright © 2011 Raphaël Hertzog <[email protected]>
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -316,7 +318,7 @@ enum found_status {
*/
static enum found_status
deppossi_ok_found(struct pkginfo *possdependee, struct pkginfo *requiredby,
- struct pkginfo *removing, struct pkginfo *providing,
+ struct pkginfo *removing, struct pkgset *providing,
struct pkginfo **fixbytrig,
bool *matched, struct deppossi *checkversion,
int *interestingwarnings, struct varbuf *oemsgs)
@@ -332,7 +334,7 @@ deppossi_ok_found(struct pkginfo *possdependee, struct
pkginfo *requiredby,
if (providing) {
varbuf_printf(oemsgs,
_(" Package %s which provides %s is to be removed.\n"),
- possdependee->set->name, providing->set->name);
+ possdependee->set->name, providing->name);
} else {
varbuf_printf(oemsgs, _(" Package %s is to be removed.\n"),
possdependee->set->name);
@@ -374,7 +376,7 @@ deppossi_ok_found(struct pkginfo *possdependee, struct
pkginfo *requiredby,
if (providing) {
varbuf_printf(oemsgs,
_(" Package %s which provides %s awaits trigger
processing.\n"),
- possdependee->set->name, providing->set->name);
+ possdependee->set->name, providing->name);
} else {
varbuf_printf(oemsgs,
_(" Package %s awaits trigger processing.\n"),
@@ -416,7 +418,7 @@ deppossi_ok_found(struct pkginfo *possdependee, struct
pkginfo *requiredby,
if (providing) {
varbuf_printf(oemsgs,
_(" Package %s which provides %s is not configured
yet.\n"),
- possdependee->set->name, providing->set->name);
+ possdependee->set->name, providing->name);
} else {
varbuf_printf(oemsgs, _(" Package %s is not configured yet.\n"),
possdependee->set->name);
@@ -430,7 +432,7 @@ deppossi_ok_found(struct pkginfo *possdependee, struct
pkginfo *requiredby,
if (providing) {
varbuf_printf(oemsgs,
_(" Package %s which provides %s is not installed.\n"),
- possdependee->set->name, providing->set->name);
+ possdependee->set->name, providing->name);
} else {
varbuf_printf(oemsgs, _(" Package %s is not installed.\n"),
possdependee->set->name);
@@ -453,19 +455,20 @@ unsuitable:
static void
breaks_check_one(struct varbuf *aemsgs, enum dep_check *ok,
struct deppossi *breaks, struct pkginfo *broken,
- struct pkginfo *breaker, struct pkginfo *virtbroken)
+ struct pkginfo *breaker, struct pkgset *virtbroken)
{
struct varbuf depmsg = VARBUF_INIT;
debug(dbg_depcondetail, " checking breaker %s virtbroken %s",
- breaker->set->name, virtbroken ? virtbroken->set->name : "<none>");
+ breaker->set->name, virtbroken ? virtbroken->name : "<none>");
if (breaker->status == stat_notinstalled ||
breaker->status == stat_configfiles) return;
if (broken == breaker) return;
if (!versionsatisfied(&broken->installed, breaks)) return;
if (ignore_depends(breaker)) return;
- if (virtbroken && ignore_depends(virtbroken)) return;
+ if (virtbroken && ignore_depends(&virtbroken->pkg))
+ return;
varbufdependency(&depmsg, breaks->up);
varbuf_end_str(&depmsg);
@@ -477,7 +480,7 @@ breaks_check_one(struct varbuf *aemsgs, enum dep_check *ok,
if (virtbroken) {
varbuf_printf(aemsgs, _(" %s (%s) provides %s.\n"), broken->set->name,
versiondescribe(&broken->installed.version, vdew_nonambig),
- virtbroken->set->name);
+ virtbroken->name);
} else if (breaks->verrel != dvr_none) {
varbuf_printf(aemsgs, _(" Version of %s to be configured is %s.\n"),
broken->set->name,
@@ -490,12 +493,12 @@ breaks_check_one(struct varbuf *aemsgs, enum dep_check
*ok,
static void
breaks_check_target(struct varbuf *aemsgs, enum dep_check *ok,
- struct pkginfo *broken, struct pkginfo *target,
- struct pkginfo *virtbroken)
+ struct pkginfo *broken, struct pkgset *target,
+ struct pkgset *virtbroken)
{
struct deppossi *possi;
- for (possi = target->set->depended.installed; possi; possi =
possi->rev_next) {
+ for (possi = target->depended.installed; possi; possi = possi->rev_next) {
if (possi->up->type != dep_breaks) continue;
if (virtbroken && possi->verrel != dvr_none) continue;
breaks_check_one(aemsgs, ok, possi, broken, possi->up->up, virtbroken);
@@ -506,17 +509,17 @@ enum dep_check
breakses_ok(struct pkginfo *pkg, struct varbuf *aemsgs)
{
struct dependency *dep;
- struct pkginfo *virtbroken;
+ struct pkgset *virtbroken;
enum dep_check ok = dep_check_ok;
debug(dbg_depcon, " checking Breaks");
- breaks_check_target(aemsgs, &ok, pkg, pkg, NULL);
+ breaks_check_target(aemsgs, &ok, pkg, pkg->set, NULL);
for (dep= pkg->installed.depends; dep; dep= dep->next) {
if (dep->type != dep_provides) continue;
- virtbroken = &dep->list->ed->pkg;
- debug(dbg_depcondetail, " checking virtbroken %s",
virtbroken->set->name);
+ virtbroken = dep->list->ed;
+ debug(dbg_depcondetail, " checking virtbroken %s", virtbroken->name);
breaks_check_target(aemsgs, &ok, pkg, virtbroken, virtbroken);
}
return ok;
@@ -574,7 +577,7 @@ dependencies_ok(struct pkginfo *pkg, struct pkginfo
*removing,
debug(dbg_depcondetail, " checking provider %s",
provider->up->up->set->name);
thisf = deppossi_ok_found(provider->up->up, pkg, removing,
- &possi->ed->pkg,
+ possi->ed,
&possfixbytrig, &matched, NULL,
&interestingwarnings, &oemsgs);
if (thisf > found)
diff --git a/src/remove.c b/src/remove.c
index 6e81215..9c8cbf1 100644
--- a/src/remove.c
+++ b/src/remove.c
@@ -48,13 +48,13 @@
* pkgdepcheck may be a virtual pkg.
*/
static void checkforremoval(struct pkginfo *pkgtoremove,
- struct pkginfo *pkgdepcheck,
+ struct pkgset *pkgdepcheck,
int *rokp, struct varbuf *raemsgs) {
struct deppossi *possi;
struct pkginfo *depender;
int before, ok;
- for (possi = pkgdepcheck->set->depended.installed; possi; possi =
possi->rev_next) {
+ for (possi = pkgdepcheck->depended.installed; possi; possi =
possi->rev_next) {
if (possi->up->type != dep_depends && possi->up->type != dep_predepends)
continue;
depender= possi->up->up;
debug(dbg_depcon, "checking depending package `%s'", depender->set->name);
@@ -109,11 +109,11 @@ void deferred_remove(struct pkginfo *pkg) {
debug(dbg_general, "checking dependencies for remove `%s'", pkg->set->name);
rok= 2;
- checkforremoval(pkg,pkg,&rok,&raemsgs);
+ checkforremoval(pkg, pkg->set, &rok, &raemsgs);
for (dep= pkg->installed.depends; dep; dep= dep->next) {
if (dep->type != dep_provides) continue;
debug(dbg_depcon,"checking virtual package `%s'",dep->list->ed->name);
- checkforremoval(pkg, &dep->list->ed->pkg, &rok, &raemsgs);
+ checkforremoval(pkg, dep->list->ed, &rok, &raemsgs);
}
if (rok == 1) {
--
dpkg's main repository
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]