OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Given a filename as an argument, sort the #include/#imports in that file. | 6 """Given a filename as an argument, sort the #include/#imports in that file. |
7 | 7 |
8 Shows a diff and prompts for confirmation before doing the deed. | 8 Shows a diff and prompts for confirmation before doing the deed. |
| 9 Works great with tools/git/for-all-touched-files.py. |
9 """ | 10 """ |
10 | 11 |
11 import optparse | 12 import optparse |
12 import os | 13 import os |
13 import sys | 14 import sys |
14 import termios | 15 import termios |
15 import tty | 16 import tty |
16 | 17 |
17 def YesNo(prompt): | 18 def YesNo(prompt): |
18 """Prompts with a yes/no question, returns True if yes.""" | 19 """Prompts with a yes/no question, returns True if yes.""" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 while IsInclude(line): | 65 while IsInclude(line): |
65 headerblock.append(line) | 66 headerblock.append(line) |
66 line = infile.next() | 67 line = infile.next() |
67 for header in sorted(headerblock, key=IncludeCompareKey): | 68 for header in sorted(headerblock, key=IncludeCompareKey): |
68 outfile.write(header) | 69 outfile.write(header) |
69 # Intentionally fall through, to write the line that caused | 70 # Intentionally fall through, to write the line that caused |
70 # the above while loop to exit. | 71 # the above while loop to exit. |
71 outfile.write(line) | 72 outfile.write(line) |
72 | 73 |
73 | 74 |
| 75 def DiffAndConfirm(filename, should_confirm): |
| 76 """Shows a diff of what the tool would change the file named |
| 77 filename to. Shows a confirmation prompt if should_confirm is true. |
| 78 Saves the resulting file if should_confirm is false or the user |
| 79 answers Y to the confirmation prompt. |
| 80 """ |
| 81 fixfilename = filename + '.new' |
| 82 infile = open(filename, 'r') |
| 83 outfile = open(fixfilename, 'w') |
| 84 SortHeader(infile, outfile) |
| 85 infile.close() |
| 86 outfile.close() # Important so the below diff gets the updated contents. |
| 87 |
| 88 try: |
| 89 diff = os.system('diff -u %s %s' % (filename, fixfilename)) |
| 90 if diff >> 8 == 0: # Check exit code. |
| 91 print '%s: no change' % filename |
| 92 return |
| 93 |
| 94 if not should_confirm or YesNo('Use new file (y/N)?'): |
| 95 os.rename(fixfilename, filename) |
| 96 finally: |
| 97 try: |
| 98 os.remove(fixfilename) |
| 99 except OSError: |
| 100 # If the file isn't there, we don't care. |
| 101 pass |
| 102 |
| 103 |
74 def main(): | 104 def main(): |
75 parser = optparse.OptionParser(usage='%prog filename1 filename2 ...') | 105 parser = optparse.OptionParser(usage='%prog filename1 filename2 ...') |
76 opts, args = parser.parse_args() | 106 parser.add_option('-f', '--force', action='store_false', default=True, |
| 107 dest='should_confirm', |
| 108 help='Turn off confirmation prompt.') |
| 109 opts, filenames = parser.parse_args() |
77 | 110 |
78 if len(args) < 1: | 111 if len(filenames) < 1: |
79 parser.print_help() | 112 parser.print_help() |
80 sys.exit(1) | 113 sys.exit(1) |
81 | 114 |
82 for filename in args: | 115 for filename in filenames: |
83 fixfilename = filename + '.new' | 116 DiffAndConfirm(filename, opts.should_confirm) |
84 infile = open(filename, 'r') | |
85 outfile = open(fixfilename, 'w') | |
86 SortHeader(infile, outfile) | |
87 infile.close() | |
88 outfile.close() # Important so the below diff gets the updated contents. | |
89 | |
90 try: | |
91 diff = os.system('diff -u %s %s' % (filename, fixfilename)) | |
92 if diff >> 8 == 0: # Check exit code. | |
93 print '%s: no change' % filename | |
94 continue | |
95 | |
96 if YesNo('Use new file (y/N)?'): | |
97 os.rename(fixfilename, filename) | |
98 finally: | |
99 try: | |
100 os.remove(fixfilename) | |
101 except OSError: | |
102 # If the file isn't there, we don't care. | |
103 pass | |
104 | 117 |
105 | 118 |
106 if __name__ == '__main__': | 119 if __name__ == '__main__': |
107 main() | 120 main() |
OLD | NEW |