Sfoglia il codice sorgente

dpkg: Get rid of all remaining deppossi->ed->pkg access

They are replaced with loops using deppossi_pkg_iterator.

Sponsored-by: Linaro Limited

Signed-off-by: Guillem Jover <guillem@debian.org>
Raphaël Hertzog 15 anni fa
parent
commit
b274b0d96d
4 ha cambiato i file con 202 aggiunte e 121 eliminazioni
  1. 139 103
      src/depcon.c
  2. 26 12
      src/enquiry.c
  3. 20 2
      src/help.c
  4. 17 4
      src/packages.c

+ 139 - 103
src/depcon.c

@@ -164,7 +164,7 @@ findbreakcyclerecursive(struct pkginfo *pkg, struct cyclesofarlink *sofar)
   struct cyclesofarlink thislink, *sol;
   struct dependency *dep;
   struct deppossi *possi, *providelink;
-  struct pkginfo *provider;
+  struct pkginfo *provider, *pkg_pos;
 
   if (pkg->clientdata->color == black)
     return false;
@@ -188,11 +188,20 @@ findbreakcyclerecursive(struct pkginfo *pkg, struct cyclesofarlink *sofar)
   for (dep= pkg->installed.depends; dep; dep= dep->next) {
     if (dep->type != dep_depends && dep->type != dep_predepends) continue;
     for (possi= dep->list; possi; possi= possi->next) {
+      struct deppossi_pkg_iterator *possi_iter;
+
       /* Don't find the same cycles again. */
       if (possi->cyclebreak) continue;
       thislink.possi= possi;
-      if (foundcyclebroken(&thislink, sofar, &possi->ed->pkg, possi))
-        return true;
+
+      possi_iter = deppossi_pkg_iter_new(possi, wpb_installed);
+      while ((pkg_pos = deppossi_pkg_iter_next(possi_iter)))
+        if (foundcyclebroken(&thislink, sofar, pkg_pos, possi)) {
+          deppossi_pkg_iter_free(possi_iter);
+          return true;
+        }
+      deppossi_pkg_iter_free(possi_iter);
+
       /* Right, now we try all the providers ... */
       for (providelink = possi->ed->depended.installed;
            providelink;
@@ -296,6 +305,7 @@ depisok(struct dependency *dep, struct varbuf *whynot,
 {
   struct deppossi *possi;
   struct deppossi *provider;
+  struct pkginfo *pkg_pos;
   int nconflicts;
 
   /* Use this buffer so that when internationalisation comes along we
@@ -354,75 +364,94 @@ depisok(struct dependency *dep, struct varbuf *whynot,
      * can return ‘false’. */
 
     for (possi= dep->list; possi; possi= possi->next) {
-      switch (possi->ed->pkg.clientdata->istobe) {
-      case itb_remove:
-        sprintf(linebuf,_("  %.250s is to be removed.\n"),possi->ed->name);
-        break;
-      case itb_deconfigure:
-        sprintf(linebuf,_("  %.250s is to be deconfigured.\n"),possi->ed->name);
-        break;
-      case itb_installnew:
-        if (versionsatisfied(&possi->ed->pkg.available, possi))
-          return true;
-        sprintf(linebuf,_("  %.250s is to be installed, but is version %.250s.\n"),
-                possi->ed->name,
-                versiondescribe(&possi->ed->pkg.available.version, vdew_nonambig));
-        break;
-      case itb_normal: case itb_preinstall:
-        switch (possi->ed->pkg.status) {
-        case stat_installed:
-        case stat_triggerspending:
-          if (versionsatisfied(&possi->ed->pkg.installed, possi))
-            return true;
-          sprintf(linebuf,_("  %.250s is installed, but is version %.250s.\n"),
-                  possi->ed->name,
-                  versiondescribe(&possi->ed->pkg.installed.version, vdew_nonambig));
+      struct deppossi_pkg_iterator *possi_iter;
+
+      possi_iter = deppossi_pkg_iter_new(possi, wpb_by_istobe);
+      while ((pkg_pos = deppossi_pkg_iter_next(possi_iter))) {
+        switch (pkg_pos->clientdata->istobe) {
+        case itb_remove:
+          sprintf(linebuf, _("  %.250s is to be removed.\n"),
+                  pkg_pos->set->name);
           break;
-        case stat_notinstalled:
-          /* Don't say anything about this yet - it might be a virtual package.
-           * Later on, if nothing has put anything in linebuf, we know that it
-           * isn't and issue a diagnostic then. */
-          *linebuf = '\0';
+        case itb_deconfigure:
+          sprintf(linebuf, _("  %.250s is to be deconfigured.\n"),
+                  pkg_pos->set->name);
           break;
-        case stat_triggersawaited:
-            if (canfixbytrigaw &&
-                versionsatisfied(&possi->ed->pkg.installed, possi))
-              *canfixbytrigaw = &possi->ed->pkg;
-            /* Fall through to have a chance to return OK due to
-             * allowunconfigd and to fill the explanation */
-        case stat_unpacked:
-        case stat_halfconfigured:
-          if (allowunconfigd) {
-            if (!informativeversion(&possi->ed->pkg.configversion)) {
-              sprintf(linebuf, _("  %.250s is unpacked, but has never been configured.\n"),
-                      possi->ed->name);
-              break;
-            } else if (!versionsatisfied(&possi->ed->pkg.installed, possi)) {
-              sprintf(linebuf, _("  %.250s is unpacked, but is version %.250s.\n"),
-                      possi->ed->name,
-                      versiondescribe(&possi->ed->pkg.installed.version, vdew_nonambig));
-              break;
-            } else if (!versionsatisfied3(&possi->ed->pkg.configversion,
-                                          &possi->version,possi->verrel)) {
-              sprintf(linebuf, _("  %.250s latest configured version is %.250s.\n"),
-                      possi->ed->name,
-                      versiondescribe(&possi->ed->pkg.configversion, vdew_nonambig));
-              break;
-            } else {
+        case itb_installnew:
+          if (versionsatisfied(&pkg_pos->available, possi)) {
+            deppossi_pkg_iter_free(possi_iter);
+            return true;
+          }
+          sprintf(linebuf, _("  %.250s is to be installed, but is version "
+                             "%.250s.\n"),
+                  pkg_pos->set->name,
+                  versiondescribe(&pkg_pos->available.version, vdew_nonambig));
+          break;
+        case itb_normal:
+        case itb_preinstall:
+          switch (pkg_pos->status) {
+          case stat_installed:
+          case stat_triggerspending:
+            if (versionsatisfied(&pkg_pos->installed, possi)) {
+              deppossi_pkg_iter_free(possi_iter);
               return true;
             }
+            sprintf(linebuf, _("  %.250s is installed, but is version "
+                               "%.250s.\n"), pkg_pos->set->name,
+                    versiondescribe(&pkg_pos->installed.version, vdew_nonambig));
+            break;
+          case stat_notinstalled:
+            /* Don't say anything about this yet - it might be a virtual package.
+             * Later on, if nothing has put anything in linebuf, we know that it
+             * isn't and issue a diagnostic then. */
+            *linebuf = '\0';
+            break;
+          case stat_triggersawaited:
+              if (canfixbytrigaw && versionsatisfied(&pkg_pos->installed, possi))
+                *canfixbytrigaw = pkg_pos;
+              /* Fall through to have a chance to return OK due to
+               * allowunconfigd and to fill the explanation */
+          case stat_unpacked:
+          case stat_halfconfigured:
+            if (allowunconfigd) {
+              if (!informativeversion(&pkg_pos->configversion)) {
+                sprintf(linebuf, _("  %.250s is unpacked, but has never been "
+                                   "configured.\n"),
+                        pkg_pos->set->name);
+                break;
+              } else if (!versionsatisfied(&pkg_pos->installed, possi)) {
+                sprintf(linebuf, _("  %.250s is unpacked, but is version "
+                                   "%.250s.\n"),
+                        pkg_pos->set->name,
+                        versiondescribe(&pkg_pos->installed.version,
+                                        vdew_nonambig));
+                break;
+              } else if (!versionsatisfied3(&pkg_pos->configversion,
+                                            &possi->version, possi->verrel)) {
+                sprintf(linebuf, _("  %.250s latest configured version is "
+                                   "%.250s.\n"),
+                        pkg_pos->set->name,
+                        versiondescribe(&pkg_pos->configversion, vdew_nonambig));
+                break;
+              } else {
+                deppossi_pkg_iter_free(possi_iter);
+                return true;
+              }
+            }
+            /* Fall through. */
+          default:
+            sprintf(linebuf, _("  %.250s is %s.\n"),
+                    pkg_pos->set->name,
+                    gettext(statusstrings[pkg_pos->status]));
+            break;
           }
-          /* Fall through. */
-        default:
-          sprintf(linebuf, _("  %.250s is %s.\n"),
-                  possi->ed->name, gettext(statusstrings[possi->ed->pkg.status]));
           break;
+        default:
+          internerr("unknown istobe depended '%d'", pkg_pos->clientdata->istobe);
         }
-        break;
-      default:
-        internerr("unknown istobe depended '%d'", possi->ed->pkg.clientdata->istobe);
+        varbuf_add_str(whynot, linebuf);
       }
-      varbuf_add_str(whynot, linebuf);
+      deppossi_pkg_iter_free(possi_iter);
 
       /* If there was no version specified we try looking for Providers. */
       if (possi->verrel == dvr_none) {
@@ -494,57 +523,64 @@ depisok(struct dependency *dep, struct varbuf *whynot,
     nconflicts= 0;
 
     if (possi->ed != possi->up->up->set) {
+      struct deppossi_pkg_iterator *possi_iter;
+
       /* If the package conflicts with or breaks itself it must mean
        * other packages which provide the same virtual name. We
        * therefore don't look at the real package and go on to the
        * virtual ones. */
 
-      switch (possi->ed->pkg.clientdata->istobe) {
-      case itb_remove:
-        break;
-      case itb_installnew:
-        if (!versionsatisfied(&possi->ed->pkg.available, possi))
-          break;
-        sprintf(linebuf, _("  %.250s (version %.250s) is to be installed.\n"),
-                possi->ed->name,
-                versiondescribe(&possi->ed->pkg.available.version, vdew_nonambig));
-        varbuf_add_str(whynot, linebuf);
-        if (!canfixbyremove)
-          return false;
-        nconflicts++;
-        *canfixbyremove = &possi->ed->pkg;
-        break;
-      case itb_deconfigure:
-        if (dep->type == dep_breaks)
-          break; /* Already deconfiguring this. */
-        /* Fall through. */
-      case itb_normal: case itb_preinstall:
-        switch (possi->ed->pkg.status) {
-        case stat_notinstalled: case stat_configfiles:
+      possi_iter = deppossi_pkg_iter_new(possi, wpb_by_istobe);
+      while ((pkg_pos = deppossi_pkg_iter_next(possi_iter))) {
+        switch (pkg_pos->clientdata->istobe) {
+        case itb_remove:
           break;
-        case stat_halfinstalled: case stat_unpacked:
-        case stat_halfconfigured:
-          if (dep->type == dep_breaks)
-            break; /* No problem. */
-        case stat_installed:
-        case stat_triggerspending:
-        case stat_triggersawaited:
-          if (!versionsatisfied(&possi->ed->pkg.installed, possi))
+        case itb_installnew:
+          if (!versionsatisfied(&pkg_pos->available, possi))
             break;
-          sprintf(linebuf, _("  %.250s (version %.250s) is present and %s.\n"),
-                  possi->ed->name,
-                  versiondescribe(&possi->ed->pkg.installed.version, vdew_nonambig),
-                  gettext(statusstrings[possi->ed->pkg.status]));
+          sprintf(linebuf, _("  %.250s (version %.250s) is to be installed.\n"),
+                  pkg_pos->set->name,
+                  versiondescribe(&pkg_pos->available.version, vdew_nonambig));
           varbuf_add_str(whynot, linebuf);
           if (!canfixbyremove)
             return false;
           nconflicts++;
-          *canfixbyremove = &possi->ed->pkg;
+          *canfixbyremove = pkg_pos;
+          break;
+        case itb_deconfigure:
+          if (dep->type == dep_breaks)
+            break; /* Already deconfiguring this. */
+          /* Fall through. */
+        case itb_normal:
+        case itb_preinstall:
+          switch (pkg_pos->status) {
+          case stat_notinstalled:
+          case stat_configfiles:
+            break;
+          case stat_halfinstalled:
+          case stat_unpacked:
+          case stat_halfconfigured:
+            if (dep->type == dep_breaks)
+              break; /* No problem. */
+          case stat_installed:
+          case stat_triggerspending:
+          case stat_triggersawaited:
+            if (!versionsatisfied(&pkg_pos->installed, possi))
+              break;
+            sprintf(linebuf, _("  %.250s (version %.250s) is present and %s.\n"),
+                    pkg_pos->set->name,
+                    versiondescribe(&pkg_pos->installed.version, vdew_nonambig),
+                    gettext(statusstrings[pkg_pos->status]));
+            varbuf_add_str(whynot, linebuf);
+            if (!canfixbyremove)
+              return false;
+            nconflicts++;
+            *canfixbyremove = pkg_pos;
+          }
+          break;
+        default:
+          internerr("unknown istobe conflict '%d'", pkg_pos->clientdata->istobe);
         }
-        break;
-      default:
-        internerr("unknown istobe conflict '%d'",
-                  possi->ed->pkg.clientdata->istobe);
       }
     }
 

+ 26 - 12
src/enquiry.c

@@ -3,6 +3,8 @@
  * enquiry.c - status enquiry and listing options
  *
  * Copyright © 1995,1996 Ian Jackson <ian@chiark.greenend.org.uk>
+ * Copyright © 2011 Linaro Limited
+ * Copyright © 2011 Raphaël Hertzog <hertzog@debian.org>
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -437,20 +439,32 @@ predeppackage(const char *const *argv)
     for (possi = dep->list, pkg = NULL;
          !pkg && possi;
          possi=possi->next) {
-      trypkg = &possi->ed->pkg;
-      if (trypkg->files && versionsatisfied(&trypkg->available,possi)) {
-        if (trypkg->clientdata->istobe == itb_normal) { pkg= trypkg; break; }
-      }
-      if (possi->verrel != dvr_none) continue;
-      for (provider = possi->ed->depended.available;
-           !pkg && provider;
-           provider=provider->next) {
-        if (provider->up->type != dep_provides) continue;
-        trypkg= provider->up->up;
-        if (!trypkg->files)
+      struct deppossi_pkg_iterator *possi_iter;
+
+      possi_iter = deppossi_pkg_iter_new(possi, wpb_available);
+      while (!pkg && (trypkg = deppossi_pkg_iter_next(possi_iter))) {
+        if (trypkg->files && trypkg->clientdata->istobe == itb_normal &&
+            versionsatisfied(&trypkg->available, possi)) {
+          pkg = trypkg;
+          break;
+        }
+        if (possi->verrel != dvr_none)
           continue;
-        if (trypkg->clientdata->istobe == itb_normal) { pkg= trypkg; break; }
+        for (provider = possi->ed->depended.available;
+             !pkg && provider;
+             provider = provider->next) {
+          if (provider->up->type != dep_provides)
+            continue;
+          trypkg = provider->up->up;
+          if (!trypkg->files)
+            continue;
+          if (trypkg->clientdata->istobe == itb_normal) {
+            pkg = trypkg;
+            break;
+          }
+        }
       }
+      deppossi_pkg_iter_free(possi_iter);
     }
     if (!pkg) {
       varbuf_reset(&vb);

+ 20 - 2
src/help.c

@@ -152,11 +152,29 @@ ignore_depends(struct pkginfo *pkg)
   return false;
 }
 
+static bool
+ignore_depends_possi(struct deppossi *possi)
+{
+  struct deppossi_pkg_iterator *possi_iter;
+  struct pkginfo *pkg;
+
+  possi_iter = deppossi_pkg_iter_new(possi, wpb_installed);
+  while ((pkg = deppossi_pkg_iter_next(possi_iter))) {
+    if (ignore_depends(pkg)) {
+      deppossi_pkg_iter_free(possi_iter);
+      return true;
+    }
+  }
+  deppossi_pkg_iter_free(possi_iter);
+
+  return false;
+}
+
 bool
 force_depends(struct deppossi *possi)
 {
   return fc_depends ||
-         ignore_depends(&possi->ed->pkg) ||
+         ignore_depends_possi(possi) ||
          ignore_depends(possi->up->up);
 }
 
@@ -164,7 +182,7 @@ bool
 force_breaks(struct deppossi *possi)
 {
   return fc_breaks ||
-         ignore_depends(&possi->ed->pkg) ||
+         ignore_depends_possi(possi) ||
          ignore_depends(possi->up->up);
 }
 

+ 17 - 4
src/packages.c

@@ -558,16 +558,29 @@ dependencies_ok(struct pkginfo *pkg, struct pkginfo *removing,
     found = found_none;
     possfixbytrig = NULL;
     for (possi = dep->list; found != found_ok && possi; possi = possi->next) {
+      struct deppossi_pkg_iterator *possi_iter;
+      struct pkginfo *pkg_pos;
+
       debug(dbg_depcondetail,"    checking possibility  -> %s",possi->ed->name);
       if (possi->cyclebreak) {
         debug(dbg_depcondetail,"      break cycle so ok and found");
         found = found_ok;
         break;
       }
-      thisf = deppossi_ok_found(&possi->ed->pkg, pkg, removing, NULL,
-                                &possfixbytrig,
-                               &matched,possi,&interestingwarnings,&oemsgs);
-      if (thisf > found) found= thisf;
+
+      thisf = found_none;
+      possi_iter = deppossi_pkg_iter_new(possi, wpb_installed);
+      while ((pkg_pos = deppossi_pkg_iter_next(possi_iter))) {
+        thisf = deppossi_ok_found(pkg_pos, pkg, removing, NULL,
+                                  &possfixbytrig, &matched, possi,
+                                  &interestingwarnings, &oemsgs);
+        if (thisf > found)
+          found = thisf;
+        if (found == found_ok)
+          break;
+      }
+      deppossi_pkg_iter_free(possi_iter);
+
       if (found != found_ok && possi->verrel == dvr_none) {
         for (provider = possi->ed->depended.installed;
              found != found_ok && provider;