Skip to content

Commit

Permalink
pythongh-64595: Fix write file logic in Argument Clinic (python#104507)
Browse files Browse the repository at this point in the history
Check if any clinic output actually changes any of the output files
before deciding if we should touch the source file.
  • Loading branch information
erlend-aasland committed May 16, 2023
1 parent 9084e1b commit cca90b6
Showing 1 changed file with 12 additions and 11 deletions.
23 changes: 12 additions & 11 deletions Tools/clinic/clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -1965,17 +1965,17 @@ def dump(self):
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:
Expand Down Expand Up @@ -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):
Expand Down

0 comments on commit cca90b6

Please sign in to comment.