-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdiffmates.py
39 lines (32 loc) · 1.36 KB
/
diffmates.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import argparse, chess, gzip, re
def open_file(filename):
open_func = gzip.open if filename.endswith(".gz") else open
return open_func(filename, "rt")
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="A diff-like script to show the differences between two Chest-like .epd(.gz) files.",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
parser.add_argument("file1")
parser.add_argument("file2")
args = parser.parse_args()
p = re.compile("([0-9a-zA-Z/\- ]*) bm #([0-9\-]*);")
d = [{}, {}]
for idx, filename in enumerate([args.file1, args.file2]):
with open_file(filename) as f:
for line in f:
m = p.match(line)
assert m, f"error for line '{line[:-1]}' in file {filename}"
fen, bm = m.group(1), int(m.group(2))
assert fen not in d[idx], f'error: duplicate FEN "{fen}" in {filename}'
d[idx][fen] = bm, line
for fen, (bm1, line1) in d[0].items():
bm2, line2 = d[1].get(fen, (None, None))
if bm2 is None:
print("> " + line1 + "<\n---")
elif bm2 != bm1:
print("> " + line1 + "< " + line2 + "---")
for fen, (_, line2) in d[1].items():
bm1, _ = d[0].get(fen, (None, None))
if bm1 is None:
print(">\n< " + line2 + "---")