From 9af22a037fc961b51651324bdd17a43567a688fd Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 19 Aug 1994 15:02:57 +0000 Subject: [PATCH] newslist.py: Added search for .newslistrc.py; pindent.py: use /usr/local/bin/python; pathfix.py: new script to fix #! lines in a group of scripts. --- Demo/scripts/newslist.py | 7 ++ Tools/scripts/pathfix.py | 150 +++++++++++++++++++++++++++++++++++++++ Tools/scripts/pindent.py | 2 +- 3 files changed, 158 insertions(+), 1 deletion(-) create mode 100755 Tools/scripts/pathfix.py diff --git a/Demo/scripts/newslist.py b/Demo/scripts/newslist.py index 312fd0d3b2f..4c5376d48b0 100755 --- a/Demo/scripts/newslist.py +++ b/Demo/scripts/newslist.py @@ -95,6 +95,13 @@ # That should be all. # ####################################################################### +for dir in os.curdir, os.environ['HOME']: + rcfile = os.path.join(dir, '.newslistrc.py') + if os.path.exists(rcfile): + print rcfile + execfile(rcfile) + break + from nntplib import NNTP from stat import * diff --git a/Tools/scripts/pathfix.py b/Tools/scripts/pathfix.py new file mode 100755 index 00000000000..b80ce7ea72a --- /dev/null +++ b/Tools/scripts/pathfix.py @@ -0,0 +1,150 @@ +#! /usr/local/bin/python + +# Change the #! line occurring in Python scripts. The new interpreter +# pathname must be given with a -i option. +# +# Command line arguments are files or directories to be processed. +# Directories are searched recursively for files whose name looks +# like a python module. +# Symbolic links are always ignored (except as explicit directory +# arguments). Of course, the original file is kept as a back-up +# (with a "~" attached to its name). +# +# Undoubtedly you can do this using find and sed or perl, but this is +# a nice example of Python code that recurses down a directory tree +# and uses regular expressions. Also note several subtleties like +# preserving the file's mode and avoiding to even write a temp file +# when no changes are needed for a file. +# +# NB: by changing only the function fixfile() you can turn this +# into a program for a different change to Python programs... + +import sys +import regex +import os +from stat import * +import string +import getopt + +err = sys.stderr.write +dbg = err +rep = sys.stdout.write + +new_interpreter = None + +def main(): + global new_interpreter + usage = ('usage: %s -i /interpreter file-or-directory ...\n' % + sys.argv[0]) + try: + opts, args = getopt.getopt(sys.argv[1:], 'i:') + except getopt.error, msg: + err(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: + err('-i option or file-or-directory missing\n') + err(usage) + sys.exit(2) + bad = 0 + for arg in args: + if os.path.isdir(arg): + if recursedown(arg): bad = 1 + elif os.path.islink(arg): + err(arg + ': will not process symbolic links\n') + bad = 1 + else: + if fix(arg): bad = 1 + sys.exit(bad) + +ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$') +def ispython(name): + return ispythonprog.match(name) >= 0 + +def recursedown(dirname): + dbg('recursedown(' + `dirname` + ')\n') + bad = 0 + try: + names = os.listdir(dirname) + except os.error, msg: + err(dirname + ': cannot list directory: ' + `msg` + '\n') + return 1 + names.sort() + subdirs = [] + for name in names: + if name in (os.curdir, os.pardir): continue + fullname = os.path.join(dirname, name) + if os.path.islink(fullname): pass + elif os.path.isdir(fullname): + subdirs.append(fullname) + elif ispython(name): + if fix(fullname): bad = 1 + for fullname in subdirs: + if recursedown(fullname): bad = 1 + return bad + +def fix(filename): +## dbg('fix(' + `filename` + ')\n') + try: + f = open(filename, 'r') + except IOError, msg: + err(filename + ': cannot open: ' + `msg` + '\n') + return 1 + line = f.readline() + fixed = fixline(line) + if line == fixed: + rep(filename+': no change\n') + f.close() + return + head, tail = os.path.split(filename) + tempname = os.path.join(head, '@' + tail) + try: + g = open(tempname, 'w') + except IOError, msg: + f.close() + err(tempname+': cannot create: '+`msg`+'\n') + return 1 + rep(filename + ': updating\n') + g.write(fixed) + BUFSIZE = 8*1024 + while 1: + buf = f.read(BUFSIZE) + if not buf: break + g.write(buf) + g.close() + f.close() + + # Finishing touch -- move files + + # 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: + err(tempname + ': warning: chmod failed (' + `msg` + ')\n') + # Then make a backup of the original file as filename~ + try: + os.rename(filename, filename + '~') + except os.error, msg: + err(filename + ': warning: backup failed (' + `msg` + ')\n') + # Now move the temp file to the original file + try: + os.rename(tempname, filename) + except os.error, msg: + err(filename + ': rename failed (' + `msg` + ')\n') + return 1 + # Return succes + return 0 + +prog = regex.compile('\(#![ \t]*\)\(/[^ \t\n]*\)\(.*\n\)') + +def fixline(line): + if prog.match(line) < 0: + return line + head, tail = prog.group(1, 3) + return head + new_interpreter + tail + +main() diff --git a/Tools/scripts/pindent.py b/Tools/scripts/pindent.py index 35ae27174e4..6432f4cc2d2 100755 --- a/Tools/scripts/pindent.py +++ b/Tools/scripts/pindent.py @@ -1,4 +1,4 @@ -#! /ufs/guido/bin/sgi/python +#! /usr/local/bin/python #! /usr/local/bin/python # This file contains a class and a main program that perform two