2009-01-24 02:12:19 +03:00
|
|
|
# diffhelpers.py - pure Python implementation of diffhelpers.c
|
|
|
|
#
|
|
|
|
# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
|
|
|
|
#
|
2009-04-26 03:08:54 +04:00
|
|
|
# This software may be used and distributed according to the terms of the
|
2010-01-20 07:20:08 +03:00
|
|
|
# GNU General Public License version 2 or any later version.
|
2009-01-24 02:12:19 +03:00
|
|
|
|
2015-12-12 21:35:41 +03:00
|
|
|
from __future__ import absolute_import
|
|
|
|
|
2018-07-06 03:45:27 +03:00
|
|
|
|
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
|
|
|
try:
|
|
|
|
xrange(0)
|
|
|
|
except NameError:
|
|
|
|
xrange = range
|
|
|
|
|
2018-05-30 12:16:33 +03:00
|
|
|
|
2009-01-24 02:12:19 +03:00
|
|
|
def addlines(fp, hunk, lena, lenb, a, b):
|
|
|
|
while True:
|
|
|
|
todoa = lena - len(a)
|
|
|
|
todob = lenb - len(b)
|
|
|
|
num = max(todoa, todob)
|
|
|
|
if num == 0:
|
|
|
|
break
|
|
|
|
for i in xrange(num):
|
|
|
|
s = fp.readline()
|
|
|
|
c = s[0]
|
|
|
|
if s == "\\ No newline at end of file\n":
|
|
|
|
fix_newline(hunk, a, b)
|
|
|
|
continue
|
|
|
|
if c == "\n":
|
|
|
|
# Some patches may be missing the control char
|
|
|
|
# on empty lines. Supply a leading space.
|
|
|
|
s = " \n"
|
|
|
|
hunk.append(s)
|
|
|
|
if c == "+":
|
|
|
|
b.append(s[1:])
|
|
|
|
elif c == "-":
|
|
|
|
a.append(s)
|
|
|
|
else:
|
|
|
|
b.append(s[1:])
|
|
|
|
a.append(s)
|
|
|
|
return 0
|
|
|
|
|
2018-05-30 12:16:33 +03:00
|
|
|
|
2009-01-24 02:12:19 +03:00
|
|
|
def fix_newline(hunk, a, b):
|
|
|
|
l = hunk[-1]
|
2010-02-26 18:52:43 +03:00
|
|
|
# tolerate CRLF in last line
|
2018-05-30 12:16:33 +03:00
|
|
|
if l.endswith("\r\n"):
|
2010-02-26 18:52:43 +03:00
|
|
|
hline = l[:-2]
|
|
|
|
else:
|
|
|
|
hline = l[:-1]
|
|
|
|
c = hline[0]
|
2009-01-24 02:12:19 +03:00
|
|
|
|
2010-09-23 09:02:31 +04:00
|
|
|
if c in " +":
|
2010-02-26 18:52:43 +03:00
|
|
|
b[-1] = hline[1:]
|
2010-09-23 09:02:31 +04:00
|
|
|
if c in " -":
|
2009-01-24 02:12:19 +03:00
|
|
|
a[-1] = hline
|
|
|
|
hunk[-1] = hline
|
|
|
|
return 0
|
|
|
|
|
2018-05-30 12:16:33 +03:00
|
|
|
|
2009-01-24 02:12:19 +03:00
|
|
|
def testhunk(a, b, bstart):
|
|
|
|
alen = len(a)
|
|
|
|
blen = len(b)
|
|
|
|
if alen > blen - bstart:
|
|
|
|
return -1
|
|
|
|
for i in xrange(alen):
|
|
|
|
if a[i][1:] != b[i + bstart]:
|
|
|
|
return -1
|
|
|
|
return 0
|