Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: tools/git/move_source_file.py

Issue 1213613011: Allow move_source_file.py and sort-headers.py to work on blink. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Feedback Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tools/sort-headers.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 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 """Moves C++ files to a new location, updating any include paths that point 6 """Moves C++ files to a new location, updating any include paths that point
7 to them, and re-ordering headers as needed. If multiple source files are 7 to them, and re-ordering headers as needed. If multiple source files are
8 specified, the destination must be a directory. Updates include guards in 8 specified, the destination must be a directory. Updates include guards in
9 moved header files. Assumes Chromium coding style. 9 moved header files. Assumes Chromium coding style.
10 10
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 if os.path.isdir(to_path): 58 if os.path.isdir(to_path):
59 to_path = os.path.join(to_path, os.path.basename(from_path)) 59 to_path = os.path.join(to_path, os.path.basename(from_path))
60 else: 60 else:
61 dest_extension = os.path.splitext(to_path)[1] 61 dest_extension = os.path.splitext(to_path)[1]
62 if dest_extension not in HANDLED_EXTENSIONS: 62 if dest_extension not in HANDLED_EXTENSIONS:
63 raise Exception('Destination must be either a full path with ' 63 raise Exception('Destination must be either a full path with '
64 'a recognized extension or a directory.') 64 'a recognized extension or a directory.')
65 return to_path 65 return to_path
66 66
67 67
68 def UpdateIncludePathForBlink(path):
69 """Updates |path| as it would be when used in an include statement in Blink.
70
71 As Blink has its 'public' and 'Source' folders in the include search path,
72 these prefixes of file paths are not included in include statements. For
73 example, if |path| is 'public/foo/bar.h', the matching include statement
74 is '#include "foo/bar.h"'.
75 """
76 for prefix in ('public/', 'Source/'):
77 if path.startswith(prefix):
78 return path[len(prefix):]
79
80 return path
81
82
68 def MoveFile(from_path, to_path): 83 def MoveFile(from_path, to_path):
69 """Performs a git mv command to move a file from |from_path| to |to_path|. 84 """Performs a git mv command to move a file from |from_path| to |to_path|.
70 """ 85 """
71 if not os.system('git mv %s %s' % (from_path, to_path)) == 0: 86 if not os.system('git mv %s %s' % (from_path, to_path)) == 0:
72 raise Exception('Fatal: Failed to run git mv command.') 87 raise Exception('Fatal: Failed to run git mv command.')
73 88
74 89
75 def UpdatePostMove(from_path, to_path): 90 def UpdatePostMove(from_path, to_path, in_blink):
76 """Given a file that has moved from |from_path| to |to_path|, 91 """Given a file that has moved from |from_path| to |to_path|,
77 updates the moved file's include guard to match the new path and 92 updates the moved file's include guard to match the new path and
78 updates all references to the file in other source files. Also tries 93 updates all references to the file in other source files. Also tries
79 to update references in .gyp(i) files using a heuristic. 94 to update references in .gyp(i) files using a heuristic.
80 """ 95 """
81 # Include paths always use forward slashes. 96 # Include paths always use forward slashes.
82 from_path = from_path.replace('\\', '/') 97 from_path = from_path.replace('\\', '/')
83 to_path = to_path.replace('\\', '/') 98 to_path = to_path.replace('\\', '/')
84 99
85 if os.path.splitext(from_path)[1] in ['.h', '.hh']: 100 if os.path.splitext(from_path)[1] in ['.h', '.hh']:
86 UpdateIncludeGuard(from_path, to_path) 101 UpdateIncludeGuard(from_path, to_path)
87 102
103 from_include_path = from_path
104 to_include_path = to_path
105 if in_blink:
106 from_include_path = UpdateIncludePathForBlink(from_include_path)
107 to_include_path = UpdateIncludePathForBlink(to_include_path)
108
88 # Update include/import references. 109 # Update include/import references.
89 files_with_changed_includes = mffr.MultiFileFindReplace( 110 files_with_changed_includes = mffr.MultiFileFindReplace(
90 r'(#(include|import)\s*["<])%s([>"])' % re.escape(from_path), 111 r'(#(include|import)\s*["<])%s([>"])' % re.escape(from_include_path),
91 r'\1%s\3' % to_path, 112 r'\1%s\3' % to_include_path,
92 ['*.cc', '*.h', '*.m', '*.mm', '*.cpp']) 113 ['*.cc', '*.h', '*.m', '*.mm', '*.cpp'])
93 114
94 # Reorder headers in files that changed. 115 # Reorder headers in files that changed.
95 for changed_file in files_with_changed_includes: 116 for changed_file in files_with_changed_includes:
96 def AlwaysConfirm(a, b): return True 117 def AlwaysConfirm(a, b): return True
97 sort_headers.FixFileWithConfirmFunction(changed_file, AlwaysConfirm, True) 118 sort_headers.FixFileWithConfirmFunction(changed_file, AlwaysConfirm, True,
119 in_blink)
98 120
99 # Update comments; only supports // comments, which are primarily 121 # Update comments; only supports // comments, which are primarily
100 # used in our code. 122 # used in our code.
101 # 123 #
102 # This work takes a bit of time. If this script starts feeling too 124 # This work takes a bit of time. If this script starts feeling too
103 # slow, one good way to speed it up is to make the comment handling 125 # slow, one good way to speed it up is to make the comment handling
104 # optional under a flag. 126 # optional under a flag.
105 mffr.MultiFileFindReplace( 127 mffr.MultiFileFindReplace(
106 r'(//.*)%s' % re.escape(from_path), 128 r'(//.*)%s' % re.escape(from_path),
107 r'\1%s' % to_path, 129 r'\1%s' % to_path,
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 'include guard manually. (%s)' % new_path) 210 'include guard manually. (%s)' % new_path)
189 211
190 with open(new_path, 'w') as f: 212 with open(new_path, 'w') as f:
191 f.write(new_contents) 213 f.write(new_contents)
192 214
193 def main(): 215 def main():
194 if not os.path.isdir('.git'): 216 if not os.path.isdir('.git'):
195 print 'Fatal: You must run from the root of a git checkout.' 217 print 'Fatal: You must run from the root of a git checkout.'
196 return 1 218 return 1
197 219
220 in_blink = os.getcwd().endswith("third_party/WebKit")
221
198 parser = optparse.OptionParser(usage='%prog FROM_PATH... TO_PATH') 222 parser = optparse.OptionParser(usage='%prog FROM_PATH... TO_PATH')
199 parser.add_option('--already_moved', action='store_true', 223 parser.add_option('--already_moved', action='store_true',
200 dest='already_moved', 224 dest='already_moved',
201 help='Causes the script to skip moving the file.') 225 help='Causes the script to skip moving the file.')
202 parser.add_option('--no_error_for_non_source_file', action='store_false', 226 parser.add_option('--no_error_for_non_source_file', action='store_false',
203 default='True', 227 default='True',
204 dest='error_for_non_source_file', 228 dest='error_for_non_source_file',
205 help='Causes the script to simply print a warning on ' 229 help='Causes the script to simply print a warning on '
206 'encountering a non-source file rather than raising an ' 230 'encountering a non-source file rather than raising an '
207 'error.') 231 'error.')
(...skipping 12 matching lines...) Expand all
220 parser.print_help() 244 parser.print_help()
221 return 1 245 return 1
222 246
223 for from_path in from_paths: 247 for from_path in from_paths:
224 if not opts.error_for_non_source_file and not IsHandledFile(from_path): 248 if not opts.error_for_non_source_file and not IsHandledFile(from_path):
225 print '%s does not appear to be a source file, skipping' % (from_path) 249 print '%s does not appear to be a source file, skipping' % (from_path)
226 continue 250 continue
227 to_path = MakeDestinationPath(from_path, orig_to_path) 251 to_path = MakeDestinationPath(from_path, orig_to_path)
228 if not opts.already_moved: 252 if not opts.already_moved:
229 MoveFile(from_path, to_path) 253 MoveFile(from_path, to_path)
230 UpdatePostMove(from_path, to_path) 254 UpdatePostMove(from_path, to_path, in_blink)
231 return 0 255 return 0
232 256
233 257
234 if __name__ == '__main__': 258 if __name__ == '__main__':
235 sys.exit(main()) 259 sys.exit(main())
OLDNEW
« no previous file with comments | « no previous file | tools/sort-headers.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698