diff options
author | Guido van Rossum <guido@python.org> | 1993-06-05 18:02:52 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1993-06-05 18:02:52 (GMT) |
commit | 061ec39b07c9c117d1774ac680a0236c0bcedb0d (patch) | |
tree | 12b3e905aa48bbf9bfe1e4317e23010f903f6203 /Demo/scripts/update.py | |
parent | e6dc0ca122018d1094ca1f64c47ffada4100c126 (diff) | |
download | cpython-061ec39b07c9c117d1774ac680a0236c0bcedb0d.zip cpython-061ec39b07c9c117d1774ac680a0236c0bcedb0d.tar.gz cpython-061ec39b07c9c117d1774ac680a0236c0bcedb0d.tar.bz2 |
Initial revision
Diffstat (limited to 'Demo/scripts/update.py')
-rwxr-xr-x | Demo/scripts/update.py | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/Demo/scripts/update.py b/Demo/scripts/update.py new file mode 100755 index 0000000..e8f6283 --- /dev/null +++ b/Demo/scripts/update.py @@ -0,0 +1,91 @@ +#! /usr/local/bin/python + +# Update a bunch of files according to a script. +# The input file contains lines of the form <filename>:<lineno>:<text>, +# meaning that the given line of the given file is to be replaced +# by the given text. This is useful for performing global substitutions +# on grep output: + +import os +import sys +import regex + +pat = '^\([^: \t\n]+\):\([1-9][0-9]*\):' +prog = regex.compile(pat) + +class FileObj: + def __init__(self, filename): + self.filename = filename + self.changed = 0 + try: + self.lines = open(filename, 'r').readlines() + except IOError, msg: + print '*** Can\'t open "%s":' % filename, msg + self.lines = None + return + print 'diffing', self.filename + + def finish(self): + if not self.changed: + print 'no changes to', self.filename + return + try: + os.rename(self.filename, self.filename + '~') + fp = open(self.filename, 'w') + except (os.error, IOError), msg: + print '*** Can\'t rewrite "%s":' % self.filename, msg + return + print 'writing', self.filename + for line in self.lines: + fp.write(line) + fp.close() + self.changed = 0 + + def process(self, lineno, rest): + if self.lines is None: + print '(not processed): %s:%s:%s' % ( + self.filename, lineno, rest), + return + i = eval(lineno) - 1 + if not 0 <= i < len(self.lines): + print '*** Line number out of range: %s:%s:%s' % ( + self.filename, lineno, rest), + return + if self.lines[i] == rest: + print '(no change): %s:%s:%s' % ( + self.filename, lineno, rest), + return + if not self.changed: + self.changed = 1 + print '%sc%s' % (lineno, lineno) + print '<', self.lines[i], + print '---' + self.lines[i] = rest + print '>', self.lines[i], + +def main(): + if sys.argv[1:]: + try: + fp = open(sys.argv[1], 'r') + except IOError, msg: + print 'Can\'t open "%s":' % sys.argv[1], msg + sys.exit(1) + else: + fp = sys.stdin + curfile = None + while 1: + line = fp.readline() + if not line: + if curfile: curfile.finish() + break + n = prog.match(line) + if n < 0: + print 'Funny line:', line, + continue + filename, lineno = prog.group(1, 2) + if not curfile or filename <> curfile.filename: + if curfile: curfile.finish() + curfile = FileObj(filename) + curfile.process(lineno, line[n:]) + +main() |