[Python-checkins] r53015 - sandbox/trunk/2to3/refactor.py
guido.van.rossum
python-checkins at python.org
Wed Dec 13 04:29:35 CET 2006
Author: guido.van.rossum
Date: Wed Dec 13 04:29:35 2006
New Revision: 53015
Modified:
sandbox/trunk/2to3/refactor.py
Log:
Use difflib.unified_diff() instead of os.system("diff ...").
This simplifies things a bit.
Modified: sandbox/trunk/2to3/refactor.py
==============================================================================
--- sandbox/trunk/2to3/refactor.py (original)
+++ sandbox/trunk/2to3/refactor.py Wed Dec 13 04:29:35 2006
@@ -15,8 +15,8 @@
# Python imports
import os
import sys
+import difflib
import optparse
-import tempfile
# Local imports
import pytree
@@ -196,59 +196,64 @@
def write_tree(self, tree, filename):
"""Writes a (presumably modified) tree to a file.
- First it shows a unified diff between the old file and the tree.
+ If there are no changes, this is a no-op.
- If the diff shows any changes, it rewrites the file, but only
- if the write option is set.
+ Otherwise, it first shows a unified diff between the old file
+ and the tree, and then rewrites the file, but the latter is
+ only done if the write option is set.
"""
- text = str(tree)
- tfn = tempfile.mktemp()
- f = open(tfn, "w")
try:
+ f = open(filename, "r")
+ except IOError, err:
+ self.log_error("Can't read %s: %s", filename, err)
+ return
+ try:
+ old_text = f.read()
+ finally:
+ f.close()
+ new_text = str(tree)
+ if old_text == new_text:
+ if self.options.verbose:
+ self.log_message("No changes to %s", filename)
+ return
+ diff_texts(old_text, new_text, filename)
+ if not self.options.write:
+ if self.options.verbose:
+ self.log_message("Not writing changes to %s", filename)
+ return
+ backup = filename + ".bak"
+ if os.path.lexists(backup):
try:
- f.write(text)
- finally:
- f.close()
- # XXX Use difflib instead
- sts = os.system("diff -u %s %s" % (filename, tfn))
- if sts == 0:
- if self.options.verbose:
- self.log_message("No changes to %s", filename)
- return
- if sts != 1<<8:
- self.log_error("Diff %s returned exit (%s,%s)",
- filename, sts>>8, sts&0xFF)
- return
- if not self.options.write:
- if self.options.verbose:
- self.log_message("Not writing changes to %s", filename)
- return
- backup = filename + ".bak"
- if os.path.lexists(backup):
- try:
- os.remove(backup)
- except os.error, err:
- self.log_message("Can't remove backup %s", backup)
- try:
- os.rename(filename, backup)
+ os.remove(backup)
except os.error, err:
- self.log_message("Can't rename %s to %s", filename, backup)
+ self.log_message("Can't remove backup %s", backup)
+ try:
+ os.rename(filename, backup)
+ except os.error, err:
+ self.log_message("Can't rename %s to %s", filename, backup)
+ try:
+ f = open(filename, "w")
+ except os.error, err:
+ self.log_error("Can't create %s: %s", filename, err)
+ return
+ try:
try:
- f = open(filename, "w")
+ f.write(new_text)
except os.error, err:
- self.log_error("Can't create %s: %s", filename, err)
- return
- try:
- try:
- f.write(text)
- except os.error, err:
- self.log_error("Can't write %s: %s", filename, err)
- finally:
- f.close()
- if self.options.verbose:
- self.log_message("Wrote changes to %s", filename)
+ self.log_error("Can't write %s: %s", filename, err)
finally:
- os.remove(tfn)
+ f.close()
+ if self.options.verbose:
+ self.log_message("Wrote changes to %s", filename)
+
+
+def diff_texts(a, b, filename):
+ a = a.splitlines()
+ b = b.splitlines()
+ for line in difflib.unified_diff(a, b, filename, filename,
+ "(original)", "(refactored)",
+ lineterm=""):
+ print line
if __name__ == "__main__":
More information about the Python-checkins
mailing list