mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 09:17:30 +03:00
6e07d94050
Before this patch, 'filterpyflakes.py' reads target files relatively to own location. But this prevents third party tools from using it in own source tree, because their files are placed separately from 'filterpyflakes.py'. In fact, 'test-check-pyflakes.t', which is the only user of 'filterpyflakes.py', changes current working directory (cwd) to the root of "test target" source tree before using it. Therefore, composing the root of source tree in 'filterpyflakes.py' is redundant. This patch makes 'filterpyflakes.py' read target files relatively to cwd by invoking 'open()' without any path composition. This also removes importing 'os' module, because there is no user of it after this patch. This is a one of preparation of issue4677.
59 lines
1.7 KiB
Python
Executable File
59 lines
1.7 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
# Filter output by pyflakes to control which warnings we check
|
|
|
|
import sys, re
|
|
|
|
def makekey(typeandline):
|
|
"""
|
|
for sorting lines by: msgtype, path/to/file, lineno, message
|
|
|
|
typeandline is a sequence of a message type and the entire message line
|
|
the message line format is path/to/file:line: message
|
|
|
|
>>> makekey((3, 'example.py:36: any message'))
|
|
(3, 'example.py', 36, ' any message')
|
|
>>> makekey((7, 'path/to/file.py:68: dummy message'))
|
|
(7, 'path/to/file.py', 68, ' dummy message')
|
|
>>> makekey((2, 'fn:88: m')) > makekey((2, 'fn:9: m'))
|
|
True
|
|
"""
|
|
|
|
msgtype, line = typeandline
|
|
fname, line, message = line.split(":", 2)
|
|
# line as int for ordering 9 before 88
|
|
return msgtype, fname, int(line), message
|
|
|
|
|
|
lines = []
|
|
for line in sys.stdin:
|
|
# We whitelist tests (see more messages in pyflakes.messages)
|
|
pats = [
|
|
(r"imported but unused", None),
|
|
(r"local variable '.*' is assigned to but never used", None),
|
|
(r"unable to detect undefined names", None),
|
|
(r"undefined name '.*'",
|
|
r"undefined name '(WindowsError|memoryview)'")
|
|
]
|
|
|
|
for msgtype, (pat, excl) in enumerate(pats):
|
|
if re.search(pat, line) and (not excl or not re.search(excl, line)):
|
|
break # pattern matches
|
|
else:
|
|
continue # no pattern matched, next line
|
|
fn = line.split(':', 1)[0]
|
|
f = open(fn)
|
|
data = f.read()
|
|
f.close()
|
|
if 'no-' 'check-code' in data:
|
|
continue
|
|
lines.append((msgtype, line))
|
|
|
|
for msgtype, line in sorted(lines, key=makekey):
|
|
sys.stdout.write(line)
|
|
print
|
|
|
|
# self test of "undefined name" detection for other than 'memoryview'
|
|
if False:
|
|
print undefinedname
|