Bug: https://bugs.gentoo.org/697906
Signed-off-by: Michał Górny <mgo...@gentoo.org>
---
 lib/portage/_emirrordist/DeletionIterator.py | 21 +++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/lib/portage/_emirrordist/DeletionIterator.py 
b/lib/portage/_emirrordist/DeletionIterator.py
index dab6eaea2..6bc0fd09f 100644
--- a/lib/portage/_emirrordist/DeletionIterator.py
+++ b/lib/portage/_emirrordist/DeletionIterator.py
@@ -27,16 +27,31 @@ class DeletionIterator(object):
                        # require at least one successful stat()
                        exceptions = []
                        for layout in reversed(self._config.layouts):
+                               path = os.path.join(distdir, 
layout.get_path(filename))
                                try:
-                                       st = os.stat(
-                                                       os.path.join(distdir, 
layout.get_path(filename)))
+                                       st = os.stat(path)
                                except OSError as e:
-                                       exceptions.append(e)
+                                       # is it a dangling symlink?
+                                       try:
+                                               if os.path.islink(path):
+                                                       os.unlink(path)
+                                       except OSError as e:
+                                               exceptions.append(e)
                                else:
                                        if stat.S_ISREG(st.st_mode):
                                                break
                        else:
                                if exceptions:
+                                       # check for dangling symlinks
+                                       for layout in self._config.layouts:
+                                               path = os.path.join(distdir, 
layout.get_path(filename))
+                                               try:
+                                                       st = os.lstat(path)
+                                                       if 
stat.S_ISLNK(st.st_mode):
+                                                               os.unlink(path)
+                                               except OSError as e:
+                                                       pass
+
                                        logging.error("stat failed on '%s' in 
distfiles: %s\n" %
                                                (filename, '; '.join(str(x) for 
x in exceptions)))
                                continue
-- 
2.23.0


Reply via email to