Merge pull request #3570 from leo-b/master-scandir

ignore exceptions in scandir_inorder() caused by an implicit stat() (PR against master)
This commit is contained in:
TW 2018-01-21 12:00:17 +01:00 committed by GitHub
commit 27f8151983
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 1 deletions

View File

@ -11,6 +11,9 @@ from .process import prepare_subprocess_env
from ..constants import * # NOQA
from ..logger import create_logger
logger = create_logger()
def get_base_dir():
"""Get home directory / base directory for borg:
@ -128,8 +131,21 @@ def hardlinkable(mode):
return stat.S_ISREG(mode) or stat.S_ISBLK(mode) or stat.S_ISCHR(mode) or stat.S_ISFIFO(mode)
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(os.scandir(path), key=lambda dirent: dirent.inode())
return sorted(os.scandir(path), key=scandir_keyfunc)
def secure_erase(path):