Skip to content

Commit 3134969

Browse files
Avoid bailing out with uncaught PermissionError
1 parent 7e37d8b commit 3134969

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

codespell_lib/_codespell.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -647,14 +647,26 @@ def parse_file(filename, colors, summary, misspellings, exclude_lines,
647647
if not os.path.isfile(filename):
648648
return bad_count
649649

650-
text = is_text_file(filename)
650+
try:
651+
text = is_text_file(filename)
652+
except PermissionError as e:
653+
print("WARNING: %s: %s" % (e.strerror, filename),
654+
file=sys.stderr)
655+
return bad_count
656+
except OSError:
657+
return bad_count
658+
651659
if not text:
652660
if not options.quiet_level & QuietLevels.BINARY_FILE:
653661
print("WARNING: Binary file: %s" % filename, file=sys.stderr)
654662
return bad_count
655663
try:
656664
lines, encoding = file_opener.open(filename)
657-
except Exception:
665+
except PermissionError as e:
666+
print("WARNING: %s: %s" % (e.strerror, filename),
667+
file=sys.stderr)
668+
return bad_count
669+
except OSError:
658670
return bad_count
659671

660672
for i, line in enumerate(lines):

codespell_lib/tests/test_basic.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,13 @@ def test_basic(tmpdir, capsys):
117117
assert stdout == stderr == ''
118118
assert cs.main(d) == 0
119119

120+
# unreadable file
121+
if sys.platform == 'linux': # cannot create unreadable file on Windows
122+
with open(op.join(d, 'unreadable.txt'), 'w') as f:
123+
os.chmod(f, 0o000)
124+
code, _, stderr = cs.main(f.name, std=True)
125+
assert 'WARNING:' in stderr
126+
120127
# empty directory
121128
os.mkdir(op.join(d, 'test'))
122129
assert cs.main(d) == 0

0 commit comments

Comments
 (0)