diff options
author | Erlend E. Aasland <erlend.aasland@protonmail.com> | 2023-05-16 10:25:43 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-16 10:25:43 (GMT) |
commit | cca90b690679ed62a689b7867e83776b15c8a5e8 (patch) | |
tree | c7612a53d0ac64a13e0c0fa0d0cbec760b0bae14 /Tools | |
parent | 9084e1b04f8d35721b535a3acd550b920d50f11a (diff) | |
download | cpython-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-x | Tools/clinic/clinic.py | 23 |
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): |