Forráskód Böngészése

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

[guillem@debian.org:
 - Move reverse dependencies into a new anonymous depended struct,
   instead of two members; available_revdeps and installed_revdeps. ]

Signed-off-by: Guillem Jover <guillem@debian.org>
Raphaël Hertzog 15 éve
szülő
commit
29118f3cf8
11 módosított fájl, 38 hozzáadás és 43 törlés
  1. 6 6
      dselect/pkgdepcon.cc
  2. 1 1
      dselect/pkgsublist.cc
  3. 4 1
      lib/dpkg/dpkg-db.h
  4. 9 15
      lib/dpkg/parse.c
  5. 2 1
      lib/dpkg/pkg.c
  6. 2 2
      src/archives.c
  7. 5 5
      src/depcon.c
  8. 1 1
      src/enquiry.c
  9. 2 2
      src/packages.c
  10. 5 8
      src/processarc.c
  11. 1 1
      src/remove.c

+ 6 - 6
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 ||

+ 1 - 1
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;

+ 4 - 1
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 ***/

+ 9 - 15
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;
     }
   }
 

+ 2 - 1
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;
 }

+ 2 - 2
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)

+ 5 - 5
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;

+ 1 - 1
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;

+ 2 - 2
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)

+ 5 - 8
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 &&

+ 1 - 1
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);