3030rep = sys .stdout .write
3131
3232new_interpreter = None
33+ preserve_timestamps = False
3334
3435def main ():
3536 global new_interpreter
36- usage = ('usage: %s -i /interpreter file-or-directory ...\n ' %
37+ global preserve_timestamps
38+ usage = ('usage: %s -i /interpreter -p file-or-directory ...\n ' %
3739 sys .argv [0 ])
3840 try :
39- opts , args = getopt .getopt (sys .argv [1 :], 'i:' )
41+ opts , args = getopt .getopt (sys .argv [1 :], 'i:p ' )
4042 except getopt .error as msg :
41- err (msg + '\n ' )
43+ err (str ( msg ) + '\n ' )
4244 err (usage )
4345 sys .exit (2 )
4446 for o , a in opts :
4547 if o == '-i' :
4648 new_interpreter = a .encode ()
49+ if o == '-p' :
50+ preserve_timestamps = True
4751 if not new_interpreter or not new_interpreter .startswith (b'/' ) or \
4852 not args :
4953 err ('-i option or file-or-directory missing\n ' )
@@ -119,9 +123,13 @@ def fix(filename):
119123
120124 # Finishing touch -- move files
121125
126+ mtime = None
127+ atime = None
122128 # First copy the file's mode to the temp file
123129 try :
124130 statbuf = os .stat (filename )
131+ mtime = statbuf .st_mtime
132+ atime = statbuf .st_atime
125133 os .chmod (tempname , statbuf [ST_MODE ] & 0o7777 )
126134 except os .error as msg :
127135 err ('%s: warning: chmod failed (%r)\n ' % (tempname , msg ))
@@ -136,6 +144,13 @@ def fix(filename):
136144 except os .error as msg :
137145 err ('%s: rename failed (%r)\n ' % (filename , msg ))
138146 return 1
147+ if preserve_timestamps :
148+ if atime and mtime :
149+ try :
150+ os .utime (filename , (atime , mtime ))
151+ except os .error as msg :
152+ err ('%s: reset of timestamp failed (%r)\n ' % (filename , msg ))
153+ return 1
139154 # Return succes
140155 return 0
141156
0 commit comments