summaryrefslogtreecommitdiffstats
path: root/Tools/clinic
diff options
context:
space:
mode:
authorErlend E. Aasland <erlend@python.org>2023-07-05 11:23:22 (GMT)
committerGitHub <noreply@github.com>2023-07-05 11:23:22 (GMT)
commit9d1d4f9c73a71192b22ab52a2eb9278737f98ddb (patch)
tree74abe9340f971fd737005719f80a1532671b7222 /Tools/clinic
parenta941bd6c53ac4646926292557a7bb2a86f8025c3 (diff)
downloadcpython-9d1d4f9c73a71192b22ab52a2eb9278737f98ddb.zip
cpython-9d1d4f9c73a71192b22ab52a2eb9278737f98ddb.tar.gz
cpython-9d1d4f9c73a71192b22ab52a2eb9278737f98ddb.tar.bz2
gh-64595: Fix regression in file write logic in Argument Clinic (#106449)
Revert the two commits that introduced the regressions: - gh-104152 - gh-104507
Diffstat (limited to 'Tools/clinic')
-rwxr-xr-xTools/clinic/clinic.py35
1 files changed, 12 insertions, 23 deletions
diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
index 5f5d024..7ada7e9 100755
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -2021,22 +2021,20 @@ extensions: LangDict = { name: CLanguage for name in "c cc cpp cxx h hh hpp hxx"
extensions['py'] = PythonLanguage
-def file_changed(filename: str, new_contents: str) -> bool:
- """Return true if file contents changed (meaning we must update it)"""
+def write_file(filename: str, new_contents: str) -> None:
try:
- with open(filename, encoding="utf-8") as fp:
+ with open(filename, 'r', encoding="utf-8") as fp:
old_contents = fp.read()
- return old_contents != new_contents
- except FileNotFoundError:
- return True
-
-def write_file(filename: str, new_contents: str) -> None:
+ if old_contents == new_contents:
+ # no change: avoid modifying the file modification time
+ return
+ except FileNotFoundError:
+ pass
# Atomic write using a temporary file and os.replace()
filename_new = f"{filename}.new"
with open(filename_new, "w", encoding="utf-8") as fp:
fp.write(new_contents)
-
try:
os.replace(filename_new, filename)
except:
@@ -2214,8 +2212,6 @@ impl_definition block
traceback.format_exc().rstrip())
printer.print_block(block)
- clinic_out = []
-
# these are destinations not buffers
for name, destination in self.destinations.items():
if destination.type == 'suppress':
@@ -2223,7 +2219,6 @@ impl_definition block
output = destination.dump()
if output:
-
block = Block("", dsl_name="clinic", output=output)
if destination.type == 'buffer':
@@ -2255,11 +2250,10 @@ impl_definition block
block.input = 'preserve\n'
printer_2 = BlockPrinter(self.language)
printer_2.print_block(block, core_includes=True)
- pair = destination.filename, printer_2.f.getvalue()
- clinic_out.append(pair)
+ write_file(destination.filename, printer_2.f.getvalue())
continue
- return printer.f.getvalue(), clinic_out
+ return printer.f.getvalue()
def _module_and_class(self, fields):
@@ -2321,14 +2315,9 @@ def parse_file(
assert isinstance(language, CLanguage)
clinic = Clinic(language, verify=verify, filename=filename)
- src_out, clinic_out = clinic.parse(raw)
-
- 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)
+ cooked = clinic.parse(raw)
+
+ write_file(output, cooked)
def compute_checksum(