From: Jason R. Coombs Date: Wed, 27 Jul 2011 18:05:37 +0000 (-0400) Subject: Fixes #10639: reindent.py should not convert newlines X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fee7745ebb1c344d35e2245c4cf9aeb6f0f929a1;p=python Fixes #10639: reindent.py should not convert newlines Backport of changeset 070dc6e359fb, reindent.py now will use the newline detected in the original file and will report an error if mixed newlines are encountered. --- diff --git a/Misc/NEWS b/Misc/NEWS index 9a99595d58..e3c404fff9 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -143,6 +143,12 @@ Build functions (*BSD and OS X). Also add new stat file flags for OS X (UF_HIDDEN and UF_COMPRESSED). +Tools/Demos +----------- + +- Issue #10639: reindent.py no longer converts newlines and will raise + an error if attempting to convert a file with mixed newlines. + Tests ----- diff --git a/Tools/scripts/reindent.py b/Tools/scripts/reindent.py index 3e9affb9c5..df15edbc8d 100755 --- a/Tools/scripts/reindent.py +++ b/Tools/scripts/reindent.py @@ -35,7 +35,7 @@ tabnanny.py, reindent should do a good job. The backup file is a copy of the one that is being reindented. The ".bak" file is generated with shutil.copy(), but some corner cases regarding -user/group and permissions could leave the backup file more readable that +user/group and permissions could leave the backup file more readable than you'd prefer. You can always use the --nobackup option to prevent this. """ @@ -44,6 +44,7 @@ __version__ = "1" import tokenize import os, shutil import sys +import io verbose = 0 recurse = 0 @@ -108,13 +109,19 @@ def check(file): if verbose: print "checking", file, "...", try: - f = open(file) + f = io.open(file) except IOError, msg: errprint("%s: I/O Error: %s" % (file, str(msg))) return r = Reindenter(f) f.close() + + newline = r.newlines + if isinstance(newline, tuple): + errprint("%s: mixed newlines detected; cannot process file" % file) + return + if r.run(): if verbose: print "changed." @@ -126,7 +133,7 @@ def check(file): shutil.copyfile(file, bak) if verbose: print "backed up", file, "to", bak - f = open(file, "w") + f = io.open(file, "w", newline=newline) r.write(f) f.close() if verbose: @@ -173,6 +180,10 @@ class Reindenter: # indeed, they're our headache! self.stats = [] + # Save the newlines found in the file so they can be used to + # create output without mutating the newlines. + self.newlines = f.newlines + def run(self): tokenize.tokenize(self.getline, self.tokeneater) # Remove trailing empty lines.