Skip to content

Commit a6d0ff9

Browse files
committed
pyrediff: unescaping \\ is version specific
python's re.escape() escapes different character sets from version 3.3 and then from version 3.7. Adjust the escaping mechanism (originally written for python2) to cope. Reverts the unescaping at EOL workaround from commit ce5f932.
1 parent 98952e0 commit a6d0ff9

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

src/ax_at_check_pyrediff.m4

+9-3
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,16 @@ __version__ = "17"
6060
class Pyrediff:
6161
_add_del_re = re.compile(r"^(\d+a\d+(,\d+)?|\d+(,\d+)?d\d+)@S|@")
6262
_change_re = re.compile(r"^\d+(,\d+)?c\d+(,\d+)?@S|@")
63-
_ws_eol_re = re.compile(r"\\(\s)$")
64-
_escape_re = re.compile(r"(?<!\\)\\(@<:@-\s!\"#&%,/:;<=>@_`'~@:>@)")
6563
_group_re = re.compile(r"\\g<(@<:@^>@:>@+)>")
64+
if sys.version_info < (3,3):
65+
_escape_re = re.compile(r"\\(@<:@-\s!\"#&%,/:;<=>@_`'~@:>@)")
66+
elif sys.version_info < (3,7):
67+
# 3.3 .. 3.6 doesn't escape "_"
68+
_escape_re = re.compile(r"\\(@<:@-\s!\"#&%,/:;<=>@`'~@:>@)")
69+
else:
70+
# 3.7+ doesn't escape '!', '"', '%', "'", ',', '/', ':', ';',
71+
# '<', '=', '>', '@', and "`"
72+
_escape_re = re.compile(r"\\(@<:@-\s#&%,~@:>@)")
6673
6774
def __init__(self):
6875
self.fail = False
@@ -79,7 +86,6 @@ class Pyrediff:
7986
with io.open(input_name, "r", encoding="utf-8") as output_fp:
8087
for line in output_fp:
8188
esc = re.escape(line)
82-
esc = self._ws_eol_re.sub(r"\1", esc)
8389
esc = self._escape_re.sub(r"\1", esc)
8490
sys.stdout.write(esc)
8591

src/pyrediff

+9-3
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,16 @@ __version__ = "17"
3737
class Pyrediff:
3838
_add_del_re = re.compile(r"^(\d+a\d+(,\d+)?|\d+(,\d+)?d\d+)$")
3939
_change_re = re.compile(r"^\d+(,\d+)?c\d+(,\d+)?$")
40-
_ws_eol_re = re.compile(r"\\(\s)$")
41-
_escape_re = re.compile(r"(?<!\\)\\([-\s!\"#&%,/:;<=>@_`'~])")
4240
_group_re = re.compile(r"\\g<([^>]+)>")
41+
if sys.version_info < (3,3):
42+
_escape_re = re.compile(r"\\([-\s!\"#&%,/:;<=>@_`'~])")
43+
elif sys.version_info < (3,7):
44+
# 3.3 .. 3.6 doesn't escape "_"
45+
_escape_re = re.compile(r"\\([-\s!\"#&%,/:;<=>@`'~])")
46+
else:
47+
# 3.7+ doesn't escape '!', '"', '%', "'", ',', '/', ':', ';',
48+
# '<', '=', '>', '@', and "`"
49+
_escape_re = re.compile(r"\\([-\s#&%,~])")
4350

4451
def __init__(self):
4552
self.fail = False
@@ -56,7 +63,6 @@ class Pyrediff:
5663
with io.open(input_name, "r", encoding="utf-8") as output_fp:
5764
for line in output_fp:
5865
esc = re.escape(line)
59-
esc = self._ws_eol_re.sub(r"\1", esc)
6066
esc = self._escape_re.sub(r"\1", esc)
6167
sys.stdout.write(esc)
6268

0 commit comments

Comments
 (0)