diff options
Diffstat (limited to 'Tools/scripts/pathfix.py')
| -rwxr-xr-x | Tools/scripts/pathfix.py | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/Tools/scripts/pathfix.py b/Tools/scripts/pathfix.py index 7f6f191..dd08e0a 100755 --- a/Tools/scripts/pathfix.py +++ b/Tools/scripts/pathfix.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#!/usr/bin/env python3 # Change the #! line occurring in Python scripts. The new interpreter # pathname must be given with a -i option. @@ -30,21 +30,26 @@ 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:') - except getopt.error, msg: - err(msg + '\n') + opts, args = getopt.getopt(sys.argv[1:], 'i:p') + except getopt.error as msg: + err(str(msg) + '\n') err(usage) sys.exit(2) for o, a in opts: if o == '-i': - new_interpreter = a - if not new_interpreter or new_interpreter[0] != '/' or not args: + 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') err(usage) sys.exit(2) @@ -61,14 +66,14 @@ def main(): ispythonprog = re.compile('^[a-zA-Z0-9_]+\.py$') def ispython(name): - return ispythonprog.match(name) >= 0 + return bool(ispythonprog.match(name)) def recursedown(dirname): dbg('recursedown(%r)\n' % (dirname,)) bad = 0 try: names = os.listdir(dirname) - except os.error, msg: + except os.error as msg: err('%s: cannot list directory: %r\n' % (dirname, msg)) return 1 names.sort() @@ -88,8 +93,8 @@ def recursedown(dirname): def fix(filename): ## dbg('fix(%r)\n' % (filename,)) try: - f = open(filename, 'r') - except IOError, msg: + f = open(filename, 'rb') + except IOError as msg: err('%s: cannot open: %r\n' % (filename, msg)) return 1 line = f.readline() @@ -101,8 +106,8 @@ def fix(filename): head, tail = os.path.split(filename) tempname = os.path.join(head, '@' + tail) try: - g = open(tempname, 'w') - except IOError, msg: + g = open(tempname, 'wb') + except IOError as msg: f.close() err('%s: cannot create: %r\n' % (tempname, msg)) return 1 @@ -118,32 +123,43 @@ 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) - os.chmod(tempname, statbuf[ST_MODE] & 07777) - except os.error, msg: + 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)) # Then make a backup of the original file as filename~ try: os.rename(filename, filename + '~') - except os.error, msg: + except os.error as msg: err('%s: warning: backup failed (%r)\n' % (filename, msg)) # Now move the temp file to the original file try: os.rename(tempname, filename) - except os.error, msg: + 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 def fixline(line): - if not line.startswith('#!'): + if not line.startswith(b'#!'): return line - if "python" not in line: + if b"python" not in line: return line - return '#! %s\n' % new_interpreter + return b'#! ' + new_interpreter + b'\n' if __name__ == '__main__': main() |
