summaryrefslogtreecommitdiffstats
path: root/Tools
diff options
context:
space:
mode:
authorErlend E. Aasland <erlend.aasland@protonmail.com>2023-05-16 10:25:43 (GMT)
committerGitHub <noreply@github.com>2023-05-16 10:25:43 (GMT)
commitcca90b690679ed62a689b7867e83776b15c8a5e8 (patch)
treec7612a53d0ac64a13e0c0fa0d0cbec760b0bae14 /Tools
parent9084e1b04f8d35721b535a3acd550b920d50f11a (diff)
downloadcpython-cca90b690679ed62a689b7867e83776b15c8a5e8.zip
cpython-cca90b690679ed62a689b7867e83776b15c8a5e8.tar.gz
cpython-cca90b690679ed62a689b7867e83776b15c8a5e8.tar.bz2
gh-64595: Fix write file logic in Argument Clinic (#104507)
Check if any clinic output actually changes any of the output files before deciding if we should touch the source file.
Diffstat (limited to 'Tools')
-rwxr-xr-xTools/clinic/clinic.py23
1 files changed, 12 insertions, 11 deletions
diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
index 4270fb3..13fd66b 100755
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -1965,17 +1965,17 @@ legacy_converters = {}
return_converters = {}
-def write_file(filename, new_contents, force=False):
+def file_changed(filename: str, new_contents: str) -> bool:
+ """Return true if file contents changed (meaning we must update it)"""
try:
with open(filename, 'r', encoding="utf-8") as fp:
old_contents = fp.read()
-
- if old_contents == new_contents and not force:
- # no change: avoid modifying the file modification time
- return
+ return old_contents != new_contents
except FileNotFoundError:
- pass
+ return True
+
+def write_file(filename: str, new_contents: str):
# Atomic write using a temporary file and os.replace()
filename_new = f"{filename}.new"
with open(filename_new, "w", encoding="utf-8") as fp:
@@ -2237,11 +2237,12 @@ def parse_file(filename, *, verify=True, output=None):
clinic = Clinic(language, verify=verify, filename=filename)
src_out, clinic_out = clinic.parse(raw)
- # If clinic output changed, force updating the source file as well.
- force = bool(clinic_out)
- write_file(output, src_out, force=force)
- for fn, data in clinic_out:
- write_file(fn, data)
+ changes = [(fn, data) for fn, data in clinic_out if file_changed(fn, data)]
+ if changes:
+ # Always (re)write the source file.
+ write_file(output, src_out)
+ for fn, data in clinic_out:
+ write_file(fn, data)
def compute_checksum(input, length=None):