]> granicus.if.org Git - python/commitdiff
Fix Issue10140 - Tools/scripts/pathfix.py: add option to preserve timestamps
authorSenthil Kumaran <orsenthil@gmail.com>
Tue, 19 Oct 2010 04:39:35 +0000 (04:39 +0000)
committerSenthil Kumaran <orsenthil@gmail.com>
Tue, 19 Oct 2010 04:39:35 +0000 (04:39 +0000)
Tools/scripts/pathfix.py

index 6cbac10ecbb810a94323678910b284dcf2007985..dd08e0aba3829947d711879c5ec166624ec3d628 100755 (executable)
@@ -30,20 +30,24 @@ dbg = err
 rep = sys.stdout.write
 
 new_interpreter = None
+preserve_timestamps = False
 
 def main():
     global new_interpreter
-    usage = ('usage: %s -i /interpreter file-or-directory ...\n' %
+    global preserve_timestamps
+    usage = ('usage: %s -i /interpreter -p file-or-directory ...\n' %
              sys.argv[0])
     try:
-        opts, args = getopt.getopt(sys.argv[1:], 'i:')
+        opts, args = getopt.getopt(sys.argv[1:], 'i:p')
     except getopt.error as msg:
-        err(msg + '\n')
+        err(str(msg) + '\n')
         err(usage)
         sys.exit(2)
     for o, a in opts:
         if o == '-i':
             new_interpreter = a.encode()
+        if o == '-p':
+            preserve_timestamps = True
     if not new_interpreter or not new_interpreter.startswith(b'/') or \
            not args:
         err('-i option or file-or-directory missing\n')
@@ -119,9 +123,13 @@ def fix(filename):
 
     # Finishing touch -- move files
 
+    mtime = None
+    atime = None
     # First copy the file's mode to the temp file
     try:
         statbuf = os.stat(filename)
+        mtime = statbuf.st_mtime
+        atime = statbuf.st_atime
         os.chmod(tempname, statbuf[ST_MODE] & 0o7777)
     except os.error as msg:
         err('%s: warning: chmod failed (%r)\n' % (tempname, msg))
@@ -136,6 +144,13 @@ def fix(filename):
     except os.error as msg:
         err('%s: rename failed (%r)\n' % (filename, msg))
         return 1
+    if preserve_timestamps:
+        if atime and mtime:
+            try:
+                os.utime(filename, (atime, mtime))
+            except os.error as msg:
+                err('%s: reset of timestamp failed (%r)\n' % (filename, msg))
+                return 1
     # Return succes
     return 0