Przeglądaj źródła

dselect: treat unknown packages as known and marked for purge

This is a temporary work-around so that dselect doesn't try to
reinstall packages of priority > standard that were removed or not
installed.

The complete solution (tracked in #551638) will involve storing the
seen/not-seen information somewhere else than in the dpkg status database
and ideally in a new database shared by all frontends.
Robert Luberda 16 lat temu
rodzic
commit
29fe363219
2 zmienionych plików z 10 dodań i 4 usunięć
  1. 4 0
      debian/changelog
  2. 6 4
      dselect/pkglist.cc

+ 4 - 0
debian/changelog

@@ -27,6 +27,10 @@ dpkg (1.15.6.2) UNRELEASED; urgency=low
     should now start using dpkg-buildflags instead. Closes: #560070
   * For Ubuntu set default value of LDFLAGS to -Wl,-Bsymbolic-functions.
   * Cleanup some old Conflicts/Replaces, thanks to Helge Kreutzmann.
+  * Modify dselect to treat all unknown package as known and marked for purge.
+    This is a temporary work-around so that dselect doesn't try to reinstall
+    packages of priority > standard that were removed or not installed. Thanks
+    to Robert Luderda for the patch. Closes: #559519, #556889
 
   [ Colin Watson ]
   * Modern tar files typically use NormalFile1 rather than NormalFile0 for

+ 6 - 4
dselect/pkglist.cc

@@ -398,15 +398,16 @@ packagelist::packagelist(keybindings *kb) : baselist(kb) {
       pkg->clientdata= 0; continue;
     }
     if (!pkg->available.valid) blankpackageperfile(&pkg->available);
-    state->direct= state->original= pkg->want;
-    if (readwrite && pkg->want == pkginfo::want_unknown) {
+    // treat all unknown packages as already seen
+    state->direct= state->original= (pkg->want == pkginfo::want_unknown ? pkginfo::want_purge : pkg->want);
+    if (readwrite && state->original == pkginfo::want_unknown) {
       state->suggested=
         pkg->status == pkginfo::stat_installed ||
           pkg->priority <= pkginfo::pri_standard /* FIXME: configurable */
             ? pkginfo::want_install : pkginfo::want_purge;
       state->spriority= sp_inherit;
     } else {
-      state->suggested= pkg->want;
+      state->suggested= state->original;
       state->spriority= sp_fixed;
     }
     state->dpriority= dp_must;
@@ -455,7 +456,8 @@ void perpackagestate::free(int recursive) {
         pkg->clientdata= uprec;
       } else {
         assert(!recursive);
-        if (pkg->want != selected) {
+        if (pkg->want != selected &&
+            !(pkg->want == pkginfo::want_unknown && selected == pkginfo::want_purge)) {
           pkg->want= selected;
         }
         pkg->clientdata= 0;