summaryrefslogtreecommitdiffstats
path: root/Tools/scripts/generate_global_objects.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/scripts/generate_global_objects.py')
-rw-r--r--Tools/scripts/generate_global_objects.py41
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