[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

recommends/suggests patch



Okay. I'm sure this is going to be buggy. But it seems to work. :-/

Basically, when constructing the dependency/conflict resolution screen,
instead of just immediately saying `hey, foo recommends bar', we don't
instead don't say anything about it until we've gone through and found
something to satisfy that recommendation.

Ditto for suggestions.

So if you have a package in main that recommends a non-free package,
but you don't put non-free in your sources.list, with this patch
dselect will let you select the main package without stopping and
mentioning the non-free thing at all.

I'd really appreciate it if someone could work through the logic, though.
It seems to make sense, but I'm not really clear on how other bits of
dselect work :(

diff -ur ../dpkg-1.4.1.11-real/dselect/pkgdepcon.cc dselect/pkgdepcon.cc
--- ../dpkg-1.4.1.11-real/dselect/pkgdepcon.cc	Mon Nov  2 02:04:48 1998
+++ dselect/pkgdepcon.cc	Sat Dec  4 15:00:05 1999
@@ -202,6 +202,7 @@
   perpackagestate *best, *fixbyupgrade;
   deppossi *possi, *provider;
   int r, foundany;
+  int rdone;
 
   if (depdebug && debug) {
     fprintf(debug,"packagelist[%p]::resolvedepcon([%p] %s --%s-->",
@@ -244,9 +245,12 @@
     if (possi) return 0;
 
     // Ensures all in the recursive list; adds info strings; ups priorities
-    r= add(depends, depends->type == dep_suggests ? dp_may : dp_must);
-
-    if (depends->type == dep_suggests) return r;
+    if (depends->type == dep_suggests) {
+      rdone = 0;
+    } else {
+      r= add(depends, depends->type == dep_suggests ? dp_may : dp_must);
+      rdone = 1;
+    }
 
     if (fixbyupgrade) {
       if (depdebug && debug) fprintf(debug,"packagelist[%p]::resolvedepcon([%p]): "
@@ -259,29 +263,44 @@
            possi= possi->next) {
         foundany= 0;
         if (possi->ed->clientdata) foundany= 1;
-        if (dep_update_best_to_change_stop(best, possi->ed)) goto mustdeselect;
+        if (depends->type != dep_suggests &&
+            dep_update_best_to_change_stop(best, possi->ed))
+        {
+          goto mustdeselect;
+        }
         for (provider= possi->ed->available.valid ? possi->ed->available.depended : 0;
              provider;
              provider= provider->nextrev) {
           if (provider->up->type != dep_provides) continue;
           if (provider->up->up->clientdata) foundany= 1;
+          if (depends->type == dep_suggests) continue;
           if (dep_update_best_to_change_stop(best, provider->up->up)) goto mustdeselect;
         }
-        if (!foundany) addunavailable(possi);
+        if (!foundany && depends->type != dep_suggests) addunavailable(possi);
+        if (foundany && !rdone) {
+          r= add(depends, depends->type == dep_suggests ? dp_may : dp_must);
+          rdone = 1;
+        }
+
+        
       }
       if (!best) {
         if (depdebug && debug) fprintf(debug,"packagelist[%p]::resolvedepcon([%p]): "
                               "mustdeselect nobest\n", this,depends);
-        return r;
+        return rdone ? r : 0;
       }
     }
     if (depdebug && debug)
       fprintf(debug,"packagelist[%p]::resolvedepcon([%p]): select best=%s{%d}\n",
               this,depends, best->pkg->name, best->spriority);
-    if (best->spriority >= sp_selecting) return r;
-    best->selected= best->suggested= pkginfo::want_install;
-    best->spriority= sp_selecting;
-    return 2;
+    if (depends->type == dep_suggests) {
+      return rdone ? r : 0;
+    } else {
+      if (best->spriority >= sp_selecting) return r;
+      best->selected= best->suggested= pkginfo::want_install;
+      best->spriority= sp_selecting;
+      return 2;
+    } 
     
   mustdeselect:
     best= depends->up->clientdata;

Cheers,
aj

-- 
Anthony Towns <aj@humbug.org.au> <http://azure.humbug.org.au/~aj/>
I don't speak for anyone save myself. GPG encrypted mail preferred.

 ``The thing is: trying to be too generic is EVIL. It's stupid, it 
        results in slower code, and it results in more bugs.''
                                        -- Linus Torvalds

Attachment: pgp7K_NwaEEiz.pgp
Description: PGP signature


Reply to: