]> granicus.if.org Git - python/commitdiff
Fixes #10639: reindent.py should not convert newlines
authorJason R. Coombs <jaraco@jaraco.com>
Wed, 27 Jul 2011 18:05:37 +0000 (14:05 -0400)
committerJason R. Coombs <jaraco@jaraco.com>
Wed, 27 Jul 2011 18:05:37 +0000 (14:05 -0400)
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.

Misc/NEWS
Tools/scripts/reindent.py

index 9a99595d5829814f7016d5c5e12f8c248cf2638a..e3c404fff9489a6468750bb585ee2dc7df2c5753 100644 (file)
--- 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
 -----
 
index 3e9affb9c511b924f117244ee21a11db417eb7b7..df15edbc8d6502b7a6aedc94b8aff766c60d06d3 100755 (executable)
@@ -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.