Bugs #168772 and #193695 - During unmerge, only ignore specific
authorZac Medico <zmedico@gentoo.org>
Mon, 24 Sep 2007 23:25:57 +0000 (23:25 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 24 Sep 2007 23:25:57 +0000 (23:25 -0000)
exceptions raised from unlink() and rmdir() calls.

svn path=/main/trunk/; revision=7804

pym/portage/dbapi/vartree.py

index 5ff8e1e33e26040b7c22cb0546ebd180064b6939..71ccdf18378d7c43cba640a1e4917f8fc03d036b 100644 (file)
@@ -1184,6 +1184,7 @@ class dblink(object):
 
                        #process symlinks second-to-last, directories last.
                        mydirs = []
+                       ignored_unlink_errnos = (errno.ENOENT, errno.EISDIR)
                        modprotect = os.path.join(self.vartree.root, "lib/modules/")
                        def show_unmerge(zing, desc, file_type, file_name):
                                        writemsg_stdout("%s %s %s %s\n" % \
@@ -1240,7 +1241,9 @@ class dblink(object):
                                                        os.chmod(obj, 0)
                                                os.unlink(obj)
                                        except EnvironmentError, e:
-                                               pass
+                                               if e.errno not in ignored_unlink_errnos:
+                                                       raise
+                                               del e
                                        show_unmerge("<<<", "", file_type, obj)
                                        continue
 
@@ -1269,6 +1272,9 @@ class dblink(object):
                                                os.unlink(obj)
                                                show_unmerge("<<<", "", file_type, obj)
                                        except (OSError, IOError),e:
+                                               if e.errno not in ignored_unlink_errnos:
+                                                       raise
+                                               del e
                                                show_unmerge("!!!", "", file_type, obj)
                                elif pkgfiles[objkey][0] == "obj":
                                        if statobj is None or not stat.S_ISREG(statobj.st_mode):
@@ -1294,7 +1300,9 @@ class dblink(object):
                                                        os.chmod(obj, 0)
                                                os.unlink(obj)
                                        except (OSError, IOError), e:
-                                               pass
+                                               if e.errno not in ignored_unlink_errnos:
+                                                       raise
+                                               del e
                                        show_unmerge("<<<", "", file_type, obj)
                                elif pkgfiles[objkey][0] == "fif":
                                        if not stat.S_ISFIFO(lstatobj[stat.ST_MODE]):
@@ -1311,8 +1319,14 @@ class dblink(object):
                                try:
                                        os.rmdir(obj)
                                        show_unmerge("<<<", "", "dir", obj)
-                               except EnvironmentError:
-                                       show_unmerge("---", "!empty", "dir", obj)
+                               except EnvironmentError, e:
+                                       if e.errno not in (errno.ENOENT,
+                                               errno.EEXIST, errno.ENOTEMPTY,
+                                               errno.ENOTDIR):
+                                               raise
+                                       if e.errno != errno.ENOENT:
+                                               show_unmerge("---", "!empty", "dir", obj)
+                                       del e
 
                #remove self from vartree database so that our own virtual gets zapped if we're the last node
                self.vartree.zap(self.mycpv)