/Demo/scripts/update.py

http://unladen-swallow.googlecode.com/ · Python · 92 lines · 78 code · 8 blank · 6 comment · 22 complexity · 2e0371f5730d92ac4d3812dc112e504e MD5 · raw file

  1. #! /usr/bin/env python
  2. # Update a bunch of files according to a script.
  3. # The input file contains lines of the form <filename>:<lineno>:<text>,
  4. # meaning that the given line of the given file is to be replaced
  5. # by the given text. This is useful for performing global substitutions
  6. # on grep output:
  7. import os
  8. import sys
  9. import re
  10. pat = '^([^: \t\n]+):([1-9][0-9]*):'
  11. prog = re.compile(pat)
  12. class FileObj:
  13. def __init__(self, filename):
  14. self.filename = filename
  15. self.changed = 0
  16. try:
  17. self.lines = open(filename, 'r').readlines()
  18. except IOError, msg:
  19. print '*** Can\'t open "%s":' % filename, msg
  20. self.lines = None
  21. return
  22. print 'diffing', self.filename
  23. def finish(self):
  24. if not self.changed:
  25. print 'no changes to', self.filename
  26. return
  27. try:
  28. os.rename(self.filename, self.filename + '~')
  29. fp = open(self.filename, 'w')
  30. except (os.error, IOError), msg:
  31. print '*** Can\'t rewrite "%s":' % self.filename, msg
  32. return
  33. print 'writing', self.filename
  34. for line in self.lines:
  35. fp.write(line)
  36. fp.close()
  37. self.changed = 0
  38. def process(self, lineno, rest):
  39. if self.lines is None:
  40. print '(not processed): %s:%s:%s' % (
  41. self.filename, lineno, rest),
  42. return
  43. i = eval(lineno) - 1
  44. if not 0 <= i < len(self.lines):
  45. print '*** Line number out of range: %s:%s:%s' % (
  46. self.filename, lineno, rest),
  47. return
  48. if self.lines[i] == rest:
  49. print '(no change): %s:%s:%s' % (
  50. self.filename, lineno, rest),
  51. return
  52. if not self.changed:
  53. self.changed = 1
  54. print '%sc%s' % (lineno, lineno)
  55. print '<', self.lines[i],
  56. print '---'
  57. self.lines[i] = rest
  58. print '>', self.lines[i],
  59. def main():
  60. if sys.argv[1:]:
  61. try:
  62. fp = open(sys.argv[1], 'r')
  63. except IOError, msg:
  64. print 'Can\'t open "%s":' % sys.argv[1], msg
  65. sys.exit(1)
  66. else:
  67. fp = sys.stdin
  68. curfile = None
  69. while 1:
  70. line = fp.readline()
  71. if not line:
  72. if curfile: curfile.finish()
  73. break
  74. n = prog.match(line)
  75. if n < 0:
  76. print 'Funny line:', line,
  77. continue
  78. filename, lineno = prog.group(1, 2)
  79. if not curfile or filename <> curfile.filename:
  80. if curfile: curfile.finish()
  81. curfile = FileObj(filename)
  82. curfile.process(lineno, line[n:])
  83. if __name__ == "__main__":
  84. main()