diff options
Diffstat (limited to 'Tools/scripts/generate_global_objects.py')
-rw-r--r-- | Tools/scripts/generate_global_objects.py | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/Tools/scripts/generate_global_objects.py b/Tools/scripts/generate_global_objects.py index 17ddb8b..f765360 100644 --- a/Tools/scripts/generate_global_objects.py +++ b/Tools/scripts/generate_global_objects.py @@ -1,5 +1,6 @@ import contextlib import glob +import io import os.path import re import sys @@ -123,6 +124,7 @@ def iter_global_strings(): varname, string = m.groups() yield varname, string, filename, lno, line + def iter_to_marker(lines, marker): for line in lines: if line.rstrip() == marker: @@ -165,6 +167,19 @@ class Printer: self.write("}" + suffix) +@contextlib.contextmanager +def open_for_changes(filename, orig): + """Like open() but only write to the file if it changed.""" + outfile = io.StringIO() + yield outfile + text = outfile.getvalue() + if text != orig: + with open(filename, 'w', encoding='utf-8') as outfile: + outfile.write(text) + else: + print(f'# not changed: {filename}') + + ####################################### # the global objects @@ -177,13 +192,15 @@ def generate_global_strings(identifiers, strings): # Read the non-generated part of the file. with open(filename) as infile: - before = ''.join(iter_to_marker(infile, START))[:-1] - for _ in iter_to_marker(infile, END): - pass - after = infile.read()[:-1] + orig = infile.read() + lines = iter(orig.rstrip().splitlines()) + before = '\n'.join(iter_to_marker(lines, START)) + for _ in iter_to_marker(lines, END): + pass + after = '\n'.join(lines) # Generate the file. - with open(filename, 'w', encoding='utf-8') as outfile: + with open_for_changes(filename, orig) as outfile: printer = Printer(outfile) printer.write(before) printer.write(START) @@ -202,7 +219,6 @@ def generate_global_strings(identifiers, strings): with printer.block('struct', ' latin1[128];'): printer.write("PyCompactUnicodeObject _latin1;") printer.write("uint8_t _data[2];") - printer.write(END) printer.write(after) @@ -227,13 +243,15 @@ def generate_runtime_init(identifiers, strings): # Read the non-generated part of the file. with open(filename) as infile: - before = ''.join(iter_to_marker(infile, START))[:-1] - for _ in iter_to_marker(infile, END): - pass - after = infile.read()[:-1] + orig = infile.read() + lines = iter(orig.rstrip().splitlines()) + before = '\n'.join(iter_to_marker(lines, START)) + for _ in iter_to_marker(lines, END): + pass + after = '\n'.join(lines) # Generate the file. - with open(filename, 'w', encoding='utf-8') as outfile: + with open_for_changes(filename, orig) as outfile: printer = Printer(outfile) printer.write(before) printer.write(START) @@ -286,6 +304,7 @@ def get_identifiers_and_strings() -> 'tuple[set[str], dict[str, str]]': raise ValueError(f'string mismatch for {name!r} ({string!r} != {strings[name]!r}') return identifiers, strings + ####################################### # the script |