浏览代码

Merge pull request #3558 from leo-b/1.1-maint-scandir

ignore exceptions in scandir_inorder() caused by an implicit stat()
TW 7 年之前
父节点
当前提交
37a475e3ac
共有 1 个文件被更改,包括 14 次插入1 次删除
  1. 14 1
      src/borg/helpers.py

+ 14 - 1
src/borg/helpers.py

@@ -2101,8 +2101,21 @@ except ImportError:
         scandir = scandir_generic
 
 
+def scandir_keyfunc(dirent):
+    try:
+        return (0, dirent.inode())
+    except OSError as e:
+        # maybe a permission denied error while doing a stat() on the dirent
+        logger.debug('scandir_inorder: Unable to stat %s: %s', dirent.path, e)
+        # order this dirent after all the others lexically by file name
+        # we may not break the whole scandir just because of an exception in one dirent
+        # ignore the exception for now, since another stat will be done later anyways
+        # (or the entry will be skipped by an exclude pattern)
+        return (1, dirent.name)
+
+
 def scandir_inorder(path='.'):
-    return sorted(scandir(path), key=lambda dirent: dirent.inode())
+    return sorted(scandir(path), key=scandir_keyfunc)
 
 
 def clean_lines(lines, lstrip=None, rstrip=None, remove_empty=True, remove_comments=True):