2017-05-23 21:49:20 +03:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
from __future__ import absolute_import, print_function
|
|
|
|
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
|
2018-01-10 02:10:05 +03:00
|
|
|
from hgext import traceprof
|
|
|
|
from mercurial import ui as uimod
|
|
|
|
|
2017-05-23 21:49:20 +03:00
|
|
|
if __name__ == '__main__':
|
|
|
|
sys.argv = sys.argv[1:]
|
|
|
|
if not sys.argv:
|
|
|
|
print("usage: traceprof.py <script> <arguments...>", file=sys.stderr)
|
|
|
|
sys.exit(2)
|
|
|
|
sys.path.insert(0, os.path.abspath(os.path.dirname(sys.argv[0])))
|
2018-01-10 02:10:05 +03:00
|
|
|
u = uimod.ui()
|
2017-05-26 19:03:58 +03:00
|
|
|
u.setconfig('traceprof', 'timethreshold', 0)
|
|
|
|
with traceprof.profile(u, sys.stderr):
|
flake8: enable F821 check
Summary:
This check is useful and detects real errors (ex. fbconduit). Unfortunately
`arc lint` will run it with both py2 and py3 so a lot of py2 builtins will
still be warned.
I didn't find a clean way to disable py3 check. So this diff tries to fix them.
For `xrange`, the change was done by a script:
```
import sys
import redbaron
headertypes = {'comment', 'endl', 'from_import', 'import', 'string',
'assignment', 'atomtrailers'}
xrangefix = '''try:
xrange(0)
except NameError:
xrange = range
'''
def isxrange(x):
try:
return x[0].value == 'xrange'
except Exception:
return False
def main(argv):
for i, path in enumerate(argv):
print('(%d/%d) scanning %s' % (i + 1, len(argv), path))
content = open(path).read()
try:
red = redbaron.RedBaron(content)
except Exception:
print(' warning: failed to parse')
continue
hasxrange = red.find('atomtrailersnode', value=isxrange)
hasxrangefix = 'xrange = range' in content
if hasxrangefix or not hasxrange:
print(' no need to change')
continue
# find a place to insert the compatibility statement
changed = False
for node in red:
if node.type in headertypes:
continue
# node.insert_before is an easier API, but it has bugs changing
# other "finally" and "except" positions. So do the insert
# manually.
# # node.insert_before(xrangefix)
line = node.absolute_bounding_box.top_left.line - 1
lines = content.splitlines(1)
content = ''.join(lines[:line]) + xrangefix + ''.join(lines[line:])
changed = True
break
if changed:
# "content" is faster than "red.dumps()"
open(path, 'w').write(content)
print(' updated')
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
```
For other py2 builtins that do not have a py3 equivalent, some `# noqa`
were added as a workaround for now.
Reviewed By: DurhamG
Differential Revision: D6934535
fbshipit-source-id: 546b62830af144bc8b46788d2e0fd00496838939
2018-02-10 04:31:44 +03:00
|
|
|
exec(open(sys.argv[0]).read())
|