The following commit has been merged in the master branch:
commit 29118f3cf876edc41765065743c12b90e04a7198
Author: Raphaël Hertzog <[email protected]>
Date:   Thu Jan 27 15:46:37 2011 +0000

    Move the reverse dependencies from struct pkgbin to struct pkgset
    
    Reverse dependencies only consider the package name and not the package
    architecture, so they should logically be part of pkgset and not pkgbin.
    
    To reflect this, the next commit will fix struct depossi so that its ed
    member points to a pkgset.
    
    Sponsored-by: Linaro Limited
    
    [[email protected]:
     - Move reverse dependencies into a new anonymous depended struct,
       instead of two members; available_revdeps and installed_revdeps. ]
    
    Signed-off-by: Guillem Jover <[email protected]>

diff --git a/dselect/pkgdepcon.cc b/dselect/pkgdepcon.cc
index 71f44a0..c998dd5 100644
--- a/dselect/pkgdepcon.cc
+++ b/dselect/pkgdepcon.cc
@@ -60,12 +60,12 @@ packagelist::find_pkgbin(pkginfo *pkg)
 int packagelist::checkdependers(pkginfo *pkg, int changemade) {
   struct deppossi *possi;
 
-  for (possi = pkg->available.depended; possi; possi = possi->rev_next) {
+  for (possi = pkg->set->depended.available; possi; possi = possi->rev_next) {
     if (!useavailable(possi->up->up))
       continue;
     changemade = max(changemade, resolvedepcon(possi->up));
   }
-  for (possi = pkg->installed.depended; possi; possi = possi->rev_next) {
+  for (possi = pkg->set->depended.installed; possi; possi = possi->rev_next) {
     if (useavailable(possi->up->up))
       continue;
     changemade = max(changemade, resolvedepcon(possi->up));
@@ -271,7 +271,7 @@ int packagelist::resolvedepcon(dependency *depends) {
         foundany= 0;
         if (possi->ed->clientdata) foundany= 1;
         if (dep_update_best_to_change_stop(best, possi->ed)) goto mustdeselect;
-        for (provider = possi->ed->available.depended;
+        for (provider = possi->ed->set->depended.available;
              provider;
              provider = provider->rev_next) {
           if (provider->up->type != dep_provides) continue;
@@ -336,7 +336,7 @@ int packagelist::resolvedepcon(dependency *depends) {
     if (depends->up != depends->list->ed) {
       r= deselect_one_of(depends->up, depends->list->ed, depends);  if (r) 
return r;
     }
-    for (provider = depends->list->ed->available.depended;
+    for (provider = depends->list->ed->set->depended.available;
          provider;
          provider = provider->rev_next) {
       if (provider->up->type != dep_provides) continue;
@@ -394,7 +394,7 @@ packagelist::deppossatisfied(deppossi *possi, 
perpackagestate **fixbyupgrade)
     return false;
   deppossi *provider;
 
-  for (provider = possi->ed->installed.depended;
+  for (provider = possi->ed->set->depended.installed;
        provider;
        provider = provider->rev_next) {
     if (provider->up->type == dep_provides &&
@@ -404,7 +404,7 @@ packagelist::deppossatisfied(deppossi *possi, 
perpackagestate **fixbyupgrade)
                               provider->up->up))
       return true;
   }
-  for (provider = possi->ed->available.depended;
+  for (provider = possi->ed->set->depended.available;
        provider;
        provider = provider->rev_next) {
     if (provider->up->type != dep_provides ||
diff --git a/dselect/pkgsublist.cc b/dselect/pkgsublist.cc
index e420392..4ad4216 100644
--- a/dselect/pkgsublist.cc
+++ b/dselect/pkgsublist.cc
@@ -148,7 +148,7 @@ packagelist::add(dependency *depends, showpriority 
displayimportance)
       // providers aren't relevant if a version was specified, or
       // if we're looking at a provider relationship already
       deppossi *provider;
-      for (provider = possi->ed->available.depended;
+      for (provider = possi->ed->set->depended.available;
            provider;
            provider = provider->rev_next) {
         if (provider->up->type != dep_provides) continue;
diff --git a/lib/dpkg/dpkg-db.h b/lib/dpkg/dpkg-db.h
index 9471c32..6a13c68 100644
--- a/lib/dpkg/dpkg-db.h
+++ b/lib/dpkg/dpkg-db.h
@@ -107,7 +107,6 @@ struct filedetails {
  */
 struct pkgbin {
   struct dependency *depends;
-  struct deppossi *depended;
   /* The ‘essential’ flag, true = yes, false = no (absent). */
   bool essential;
   enum pkgmultiarch {
@@ -219,6 +218,10 @@ struct pkgset {
   struct pkgset *next;
   const char *name;
   struct pkginfo pkg;
+  struct {
+    struct deppossi *available;
+    struct deppossi *installed;
+  } depended;
 };
 
 /*** from dbdir.c ***/
diff --git a/lib/dpkg/parse.c b/lib/dpkg/parse.c
index eea4019..a97c848 100644
--- a/lib/dpkg/parse.c
+++ b/lib/dpkg/parse.c
@@ -292,12 +292,6 @@ pkg_parse_copy(struct parsedb_state *ps,
   /* Sort out the dependency mess. */
   copy_dependency_links(dst_pkg, &dst_pkgbin->depends, src_pkgbin->depends,
                         (ps->flags & pdb_recordavailable) ? true : false);
-  /* Leave the ‘depended’ pointer alone, we've just gone to such
-   * trouble to get it right :-). The ‘depends’ pointer in
-   * dst_pkgbin was indeed also updated by copy_dependency_links,
-   * but since the value was that from src_pkgbin anyway there's
-   * no need to copy it back. */
-  src_pkgbin->depended = dst_pkgbin->depended;
 
   /* Copy across data. */
   memcpy(dst_pkgbin, src_pkgbin, sizeof(struct pkgbin));
@@ -612,8 +606,7 @@ void copy_dependency_links(struct pkginfo *pkg,
                            bool available)
 {
   struct dependency *dyp;
-  struct deppossi *dop;
-  struct pkgbin *addtopifp;
+  struct deppossi *dop, **revdeps;
 
   /* Delete ‘backward’ (‘depended’) links from other packages to
    * dependencies listed in old version of this one. We do this by
@@ -626,9 +619,9 @@ void copy_dependency_links(struct pkginfo *pkg,
         dop->rev_prev->rev_next = dop->rev_next;
       else
         if (available)
-          dop->ed->available.depended = dop->rev_next;
+          dop->ed->set->depended.available = dop->rev_next;
         else
-          dop->ed->installed.depended = dop->rev_next;
+          dop->ed->set->depended.installed = dop->rev_next;
       if (dop->rev_next)
         dop->rev_next->rev_prev = dop->rev_prev;
     }
@@ -639,12 +632,13 @@ void copy_dependency_links(struct pkginfo *pkg,
   for (dyp= newdepends; dyp; dyp= dyp->next) {
     dyp->up= pkg;
     for (dop= dyp->list; dop; dop= dop->next) {
-      addtopifp= available ? &dop->ed->available : &dop->ed->installed;
-      dop->rev_next = addtopifp->depended;
+      revdeps = available ? &dop->ed->set->depended.available :
+                            &dop->ed->set->depended.installed;
+      dop->rev_next = *revdeps;
       dop->rev_prev = NULL;
-      if (addtopifp->depended)
-        addtopifp->depended->rev_prev = dop;
-      addtopifp->depended= dop;
+      if (*revdeps)
+        (*revdeps)->rev_prev = dop;
+      *revdeps = dop;
     }
   }
 
diff --git a/lib/dpkg/pkg.c b/lib/dpkg/pkg.c
index d2abd04..e62dd6d 100644
--- a/lib/dpkg/pkg.c
+++ b/lib/dpkg/pkg.c
@@ -33,7 +33,6 @@ pkgbin_blank(struct pkgbin *pkgbin)
        pkgbin->essential = false;
        pkgbin->multiarch = multiarch_no;
        pkgbin->depends = NULL;
-       pkgbin->depended = NULL;
        pkgbin->description = NULL;
        pkgbin->maintainer = NULL;
        pkgbin->source = NULL;
@@ -73,6 +72,8 @@ void
 pkgset_blank(struct pkgset *set)
 {
        set->name = NULL;
+       set->depended.available = NULL;
+       set->depended.installed = NULL;
        pkg_blank(&set->pkg);
        set->pkg.set = set;
 }
diff --git a/src/archives.c b/src/archives.c
index a275b55..91e2f30 100644
--- a/src/archives.c
+++ b/src/archives.c
@@ -1123,7 +1123,7 @@ void check_conflict(struct dependency *dep, struct 
pkginfo *pkg,
                 fixbyrm->name);
         pdep = NULL;
       } else {
-        for (pdep= fixbyrm->installed.depended;
+        for (pdep = fixbyrm->set->depended.installed;
              pdep;
              pdep = pdep->rev_next) {
           if (pdep->up->type != dep_depends && pdep->up->type != 
dep_predepends)
@@ -1140,7 +1140,7 @@ void check_conflict(struct dependency *dep, struct 
pkginfo *pkg,
                providecheck;
                providecheck= providecheck->next) {
             if (providecheck->type != dep_provides) continue;
-            for (pdep= providecheck->list->ed->installed.depended;
+            for (pdep = providecheck->list->ed->set->depended.installed;
                  pdep;
                  pdep = pdep->rev_next) {
               if (pdep->up->type != dep_depends && pdep->up->type != 
dep_predepends)
diff --git a/src/depcon.c b/src/depcon.c
index 9fdbc4b..ee9db26 100644
--- a/src/depcon.c
+++ b/src/depcon.c
@@ -131,7 +131,7 @@ findbreakcyclerecursive(struct pkginfo *pkg, struct 
cyclesofarlink *sofar)
       if (foundcyclebroken(&thislink, sofar, possi->ed,possi))
         return true;
       /* Right, now we try all the providers ... */
-      for (providelink= possi->ed->installed.depended;
+      for (providelink = possi->ed->set->depended.installed;
            providelink;
            providelink = providelink->rev_next) {
         if (providelink->up->type != dep_provides) continue;
@@ -363,7 +363,7 @@ depisok(struct dependency *dep, struct varbuf *whynot,
       /* If there was no version specified we try looking for Providers. */
       if (possi->verrel == dvr_none) {
         /* See if the package we're about to install Provides it. */
-        for (provider= possi->ed->available.depended;
+        for (provider = possi->ed->set->depended.available;
              provider;
              provider = provider->rev_next) {
           if (provider->up->type != dep_provides) continue;
@@ -372,7 +372,7 @@ depisok(struct dependency *dep, struct varbuf *whynot,
         }
 
         /* Now look at the packages already on the system. */
-        for (provider= possi->ed->installed.depended;
+        for (provider = possi->ed->set->depended.installed;
              provider;
              provider = provider->rev_next) {
           if (provider->up->type != dep_provides) continue;
@@ -485,7 +485,7 @@ depisok(struct dependency *dep, struct varbuf *whynot,
     /* If there was no version specified we try looking for Providers. */
     if (possi->verrel == dvr_none) {
       /* See if the package we're about to install Provides it. */
-      for (provider= possi->ed->available.depended;
+      for (provider = possi->ed->set->depended.available;
            provider;
            provider = provider->rev_next) {
         if (provider->up->type != dep_provides) continue;
@@ -502,7 +502,7 @@ depisok(struct dependency *dep, struct varbuf *whynot,
       }
 
       /* Now look at the packages already on the system. */
-      for (provider= possi->ed->installed.depended;
+      for (provider = possi->ed->set->depended.installed;
            provider;
            provider = provider->rev_next) {
         if (provider->up->type != dep_provides) continue;
diff --git a/src/enquiry.c b/src/enquiry.c
index 2e15912..d692e1e 100644
--- a/src/enquiry.c
+++ b/src/enquiry.c
@@ -418,7 +418,7 @@ predeppackage(const char *const *argv)
         if (trypkg->clientdata->istobe == itb_normal) { pkg= trypkg; break; }
       }
       if (possi->verrel != dvr_none) continue;
-      for (provider=possi->ed->available.depended;
+      for (provider = possi->ed->set->depended.available;
            !pkg && provider;
            provider=provider->next) {
         if (provider->up->type != dep_provides) continue;
diff --git a/src/packages.c b/src/packages.c
index b129474..f7c3b36 100644
--- a/src/packages.c
+++ b/src/packages.c
@@ -495,7 +495,7 @@ breaks_check_target(struct varbuf *aemsgs, enum dep_check 
*ok,
 {
   struct deppossi *possi;
 
-  for (possi = target->installed.depended; possi; possi = possi->rev_next) {
+  for (possi = target->set->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);
@@ -566,7 +566,7 @@ dependencies_ok(struct pkginfo *pkg, struct pkginfo 
*removing,
                                &matched,possi,&interestingwarnings,&oemsgs);
       if (thisf > found) found= thisf;
       if (found != found_ok && possi->verrel == dvr_none) {
-        for (provider = possi->ed->installed.depended;
+        for (provider = possi->ed->set->depended.installed;
              found != found_ok && provider;
              provider = provider->rev_next) {
           if (provider->up->type != dep_provides)
diff --git a/src/processarc.c b/src/processarc.c
index c24064a..32f762a 100644
--- a/src/processarc.c
+++ b/src/processarc.c
@@ -532,7 +532,7 @@ void process_archive(const char *filename) {
       break;
     case dep_provides:
       /* Look for things that conflict with what we provide. */
-      for (psearch = dsearch->list->ed->installed.depended;
+      for (psearch = dsearch->list->ed->set->depended.installed;
            psearch;
            psearch = psearch->rev_next) {
         if (psearch->up->type != dep_conflicts)
@@ -564,7 +564,7 @@ void process_archive(const char *filename) {
     }
   }
   /* Look for things that conflict with us. */
-  for (psearch = pkg->installed.depended; psearch; psearch = 
psearch->rev_next) {
+  for (psearch = pkg->set->depended.installed; psearch; psearch = 
psearch->rev_next) {
     if (psearch->up->type != dep_conflicts) continue;
     check_conflict(psearch->up, pkg, pfilename);
   }
@@ -1135,10 +1135,7 @@ void process_archive(const char *filename) {
    * structure pointer for this package into the right field. */
   copy_dependency_links(pkg,&pkg->installed.depends,newdeplist,0);
 
-  /* The ‘depended’ pointer in the structure doesn't represent anything
-   * that is actually specified by this package - it's there so we
-   * can find out what other packages refer to this one. So,
-   * we don't copy it. We go straight on to copy the text fields. */
+  /* We copy the text fields. */
   pkg->installed.essential= pkg->available.essential;
   pkg->installed.multiarch = pkg->available.multiarch;
   pkg->installed.description= pkg->available.description;
@@ -1202,7 +1199,7 @@ void process_archive(const char *filename) {
     /* So dependency things will give right answers ... */
     otherpkg->clientdata->istobe= itb_remove;
     debug(dbg_veryverbose, "process_archive disappear checking dependencies");
-    for (pdep= otherpkg->installed.depended;
+    for (pdep = otherpkg->set->depended.installed;
          pdep;
          pdep = pdep->rev_next) {
       if (pdep->up->type != dep_depends && pdep->up->type != dep_predepends &&
@@ -1219,7 +1216,7 @@ void process_archive(const char *filename) {
            providecheck;
            providecheck= providecheck->next) {
         if (providecheck->type != dep_provides) continue;
-        for (pdep= providecheck->list->ed->installed.depended;
+        for (pdep = providecheck->list->ed->set->depended.installed;
              pdep;
              pdep = pdep->rev_next) {
           if (pdep->up->type != dep_depends && pdep->up->type != 
dep_predepends &&
diff --git a/src/remove.c b/src/remove.c
index d41465e..a8e062f 100644
--- a/src/remove.c
+++ b/src/remove.c
@@ -54,7 +54,7 @@ static void checkforremoval(struct pkginfo *pkgtoremove,
   struct pkginfo *depender;
   int before, ok;
 
-  for (possi = pkgdepcheck->installed.depended; possi; possi = 
possi->rev_next) {
+  for (possi = pkgdepcheck->set->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->name);

-- 
dpkg's main repository


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

Reply via email to