[Python-checkins] r60877 - in python/trunk: Misc/NEWS Tools/scripts/reindent.py

facundo.batista python-checkins at python.org
Sun Feb 17 17:21:14 CET 2008


Author: facundo.batista
Date: Sun Feb 17 17:21:13 2008
New Revision: 60877

Modified:
   python/trunk/Misc/NEWS
   python/trunk/Tools/scripts/reindent.py
Log:

Now we handle different the backup copy, because of security
issues regarding user/group and permissions. Fixes 1050828.


Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Sun Feb 17 17:21:13 2008
@@ -1378,6 +1378,11 @@
 Tools
 -----
 
+- Tools/scripts/reindent.py now creates the backup file using shutil.copy
+  to preserve user/group and permissions. Added also a --nobackup option
+  to not create the backup if the user is concerned regarding this.  Check
+  issue 1050828 for more details.
+
 - Tools/scripts/win_add2path.py was added. The simple script modifes the
   PATH environment var of the HKCU tree and adds the python bin and script
   directory.

Modified: python/trunk/Tools/scripts/reindent.py
==============================================================================
--- python/trunk/Tools/scripts/reindent.py	(original)
+++ python/trunk/Tools/scripts/reindent.py	Sun Feb 17 17:21:13 2008
@@ -4,10 +4,11 @@
 
 """reindent [-d][-r][-v] [ path ... ]
 
--d (--dryrun)  Dry run.  Analyze, but don't make any changes to, files.
--r (--recurse) Recurse.  Search for all .py files in subdirectories too.
--v (--verbose) Verbose.  Print informative msgs; else no output.
--h (--help)    Help.     Print this usage information and exit.
+-d (--dryrun)   Dry run.   Analyze, but don't make any changes to, files.
+-r (--recurse)  Recurse.   Search for all .py files in subdirectories too.
+-n (--nobackup) No backup. Does not make a ".bak" file before reindenting.
+-v (--verbose)  Verbose.   Print informative msgs; else no output.
+-h (--help)     Help.      Print this usage information and exit.
 
 Change Python (.py) files to use 4-space indents and no hard tab characters.
 Also trim excess spaces and tabs from ends of lines, and remove empty lines
@@ -31,17 +32,23 @@
 The hard part of reindenting is figuring out what to do with comment
 lines.  So long as the input files get a clean bill of health from
 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
+you'd prefer. You can always use the --nobackup option to prevent this.
 """
 
 __version__ = "1"
 
 import tokenize
-import os
+import os, shutil
 import sys
 
-verbose = 0
-recurse = 0
-dryrun  = 0
+verbose    = 0
+recurse    = 0
+dryrun     = 0
+makebackup = True
 
 def usage(msg=None):
     if msg is not None:
@@ -57,10 +64,10 @@
 
 def main():
     import getopt
-    global verbose, recurse, dryrun
+    global verbose, recurse, dryrun, makebackup
     try:
-        opts, args = getopt.getopt(sys.argv[1:], "drvh",
-                                   ["dryrun", "recurse", "verbose", "help"])
+        opts, args = getopt.getopt(sys.argv[1:], "drnvh",
+                        ["dryrun", "recurse", "nobackup", "verbose", "help"])
     except getopt.error, msg:
         usage(msg)
         return
@@ -69,6 +76,8 @@
             dryrun += 1
         elif o in ('-r', '--recurse'):
             recurse += 1
+        elif o in ('-n', '--nobackup'):
+            makebackup = False
         elif o in ('-v', '--verbose'):
             verbose += 1
         elif o in ('-h', '--help'):
@@ -112,11 +121,10 @@
                 print "But this is a dry run, so leaving it alone."
         if not dryrun:
             bak = file + ".bak"
-            if os.path.exists(bak):
-                os.remove(bak)
-            os.rename(file, bak)
-            if verbose:
-                print "renamed", file, "to", bak
+            if makebackup:
+                shutil.copyfile(file, bak)
+                if verbose:
+                    print "backed up", file, "to", bak
             f = open(file, "w")
             r.write(f)
             f.close()


More information about the Python-checkins mailing list