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

Bug#113843: dpkg not removing empty directories



The included patch fixes this bug in dpkg, bug which is in the TODO list
for it. I'm not really sure if I got the debug messages right, though,
that's not a major problem. I've tested it on many system, it behaves
correctly, which is, removes all empty directories left after removing
the conffiles files.


diff -ur dpkg-1.10.8/main/remove.c dpkg-1.10.8-patch/main/remove.c
--- dpkg-1.10.8/main/remove.c	2002-05-06 19:18:16.000000000 +0300
+++ dpkg-1.10.8-patch/main/remove.c	2002-09-18 06:09:07.000000000 +0300
@@ -242,17 +242,19 @@
       debug(dbg_eachfiledetail, "removal_bulk removing `%s'", fnvb.buf);
       if (!rmdir(fnvb.buf) || errno == ENOENT || errno == ELOOP) continue;
       if (errno == ENOTEMPTY) {
-        fprintf(stderr,
-                _("dpkg - warning: while removing %.250s, directory `%.250s' not empty "
-                "so not removed.\n"),
-                pkg->name, namenode->name);
+        if (pkg->want != want_purge) 
+          fprintf(stderr,
+                  _("dpkg - warning: while removing %.250s, directory `%.250s' not empty "
+                  "so not removed.\n"),
+                  pkg->name, namenode->name);
         push_leftover(&leftover,namenode);
         continue;
       } else if (errno == EBUSY || errno == EPERM) {
-        fprintf(stderr, _("dpkg - warning: while removing %.250s,"
-                " unable to remove directory `%.250s':"
-                " %s - directory may be a mount point ?\n"),
-                pkg->name, namenode->name, strerror(errno));
+          if (pkg->want != want_purge)
+            fprintf(stderr, _("dpkg - warning: while removing %.250s,"
+                  " unable to remove directory `%.250s':"
+                  " %s - directory may be a mount point ?\n"),
+                  pkg->name, namenode->name, strerror(errno));
         push_leftover(&leftover,namenode);
         continue;
       }
@@ -442,7 +444,44 @@
     maintainer_script_installed(pkg, POSTRMFILE, "post-removal",
                                 "purge", (char*)0);
 
-    /* fixme: retry empty directories */
+    reversefilelist_init(&rlistit,pkg->clientdata->files);
+
+    if (pkg->want == want_purge) {
+      debug(dbg_general,"removal_bulk removing empty directories of package %s"
+            ,pkg->name);
+      while ((namenode= reversefilelist_next(&rlistit))) {
+        varbufreset(&fnvb);
+        varbufaddstr(&fnvb,instdir);
+        varbufaddstr(&fnvb,namenodetouse(namenode,pkg)->name);
+        varbufaddc(&fnvb,0);
+        /* By the time we get here, there won't be but directories left for
+         * us to remove anyway, the rest will just be conffiles, which are
+         * still in the file list.
+         */
+        if (stat(fnvb.buf,&stab) || !S_ISDIR(stab.st_mode)) continue;
+        /* Only delete a directory or a link to one if we're the only
+         * package which uses it.  Other files should only be listed
+         * in this package (but we don't check).
+         */
+        if (isdirectoryinuse(namenode,pkg)) continue;
+        
+        debug(dbg_eachfiledetail, "removal_bulk removing '%s'", fnvb.buf);
+        if (!rmdir(fnvb.buf) || errno == ENOENT || errno == ELOOP) continue;
+        if (errno == ENOTEMPTY) {
+          fprintf(stderr,
+                  _("dpkg - warning: while removing %.250s, directory %.250s' not empty "
+                  "so not removed.\n"),
+                  pkg->name, namenode->name);
+          continue;
+        } else if (errno == EBUSY || errno == EPERM) {
+          fprintf(stderr, _("dpkg - warning: while removing %.250s,"
+                  " unable to remove directory %.250s':"
+                  " %s - directory may be a mount point ?\n"),
+                  pkg->name, namenode->name, strerror(errno));
+          continue;
+        }
+      }
+    }
 
   }
 
-- 
PGP public key: http://www.wolfheart.ro/pubkey.asc

Attachment: signature.asc
Description: This is a digitally signed message part


Reply to: