浏览代码

Changed clang-format-diff.py to output diff by default. Added -i option to apply changes to files instead.

Summary:
"svn diff|clang-format-diff.py" will just output the diff.
Now it's possible to use:
  svn diff|clang-format-diff.py|patch -p0
as an equivalent to:
  svn diff|clang-format-diff.py -i
;)

Reviewers: djasper

Reviewed By: djasper

CC: cfe-commits

Differential Revision: http://llvm-reviews.chandlerc.com/D1840

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192505 91177308-0d34-0410-b5e6-96231b3b80d8
Alexander Kornienko 12 年之前
父节点
当前提交
cf207a62a9
共有 1 个文件被更改,包括 22 次插入3 次删除
  1. 22 3
      tools/clang-format/clang-format-diff.py

+ 22 - 3
tools/clang-format/clang-format-diff.py

@@ -17,13 +17,16 @@ This script reads input from a unified diff and reformats all the changed
 lines. This is useful to reformat all the lines touched by a specific patch.
 lines. This is useful to reformat all the lines touched by a specific patch.
 Example usage for git users:
 Example usage for git users:
 
 
-  git diff -U0 HEAD^ | clang-format-diff.py -p1
+  git diff -U0 HEAD^ | clang-format-diff.py -p1 -i
 
 
 """
 """
 
 
 import argparse
 import argparse
+import difflib
 import re
 import re
+import string
 import subprocess
 import subprocess
+import StringIO
 import sys
 import sys
 
 
 
 
@@ -33,7 +36,11 @@ binary = 'clang-format'
 
 
 def main():
 def main():
   parser = argparse.ArgumentParser(description=
   parser = argparse.ArgumentParser(description=
-                                   'Reformat changed lines in diff.')
+                                   'Reformat changed lines in diff. Without -i '
+                                   'option just output the diff that would be'
+                                   'introduced.')
+  parser.add_argument('-i', action='store_true', default=False,
+                      help='apply edits to files instead of displaying a diff')
   parser.add_argument('-p', default=0,
   parser.add_argument('-p', default=0,
                       help='strip the smallest prefix containing P slashes')
                       help='strip the smallest prefix containing P slashes')
   parser.add_argument(
   parser.add_argument(
@@ -71,7 +78,9 @@ def main():
 
 
   # Reformat files containing changes in place.
   # Reformat files containing changes in place.
   for filename, lines in lines_by_file.iteritems():
   for filename, lines in lines_by_file.iteritems():
-    command = [binary, '-i', filename]
+    command = [binary, filename]
+    if args.i:
+      command.append('-i')
     command.extend(lines)
     command.extend(lines)
     if args.style:
     if args.style:
       command.extend(['-style', args.style])
       command.extend(['-style', args.style])
@@ -84,6 +93,16 @@ def main():
     if p.returncode != 0:
     if p.returncode != 0:
       sys.exit(p.returncode);
       sys.exit(p.returncode);
 
 
+    if not args.i:
+      with open(filename) as f:
+        code = f.readlines()
+      formatted_code = StringIO.StringIO(stdout).readlines()
+      diff = difflib.unified_diff(code, formatted_code,
+                                  filename, filename,
+                                  '(before formatting)', '(after formatting)')
+      diff_string = string.join(diff, '')
+      if len(diff_string) > 0:
+        print diff_string
 
 
 if __name__ == '__main__':
 if __name__ == '__main__':
   main()
   main()