| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. | 2 # Copyright 2014 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 """Create files with copyright boilerplate and header include guards. | 6 """Create files with copyright boilerplate and header include guards. |
| 7 | 7 |
| 8 Usage: tools/boilerplate.py path/to/file.{h,cc} | 8 Usage: tools/boilerplate.py path/to/file.{h,cc} |
| 9 """ | 9 """ |
| 10 | 10 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 | 32 |
| 33 def _GetHeader(filename): | 33 def _GetHeader(filename): |
| 34 _, ext = os.path.splitext(filename) | 34 _, ext = os.path.splitext(filename) |
| 35 ext = ext[1:] | 35 ext = ext[1:] |
| 36 comment = EXTENSIONS_TO_COMMENTS[ext] + ' ' | 36 comment = EXTENSIONS_TO_COMMENTS[ext] + ' ' |
| 37 return '\n'.join([comment + line for line in LINES]) | 37 return '\n'.join([comment + line for line in LINES]) |
| 38 | 38 |
| 39 | 39 |
| 40 def _CppHeader(filename): | 40 def _CppHeader(filename): |
| 41 guard = filename.upper() + '_' | 41 guard = filename.upper() + '_' |
| 42 for char in '/.+': | 42 for char in '/\\.+': |
| 43 guard = guard.replace(char, '_') | 43 guard = guard.replace(char, '_') |
| 44 return '\n'.join([ | 44 return '\n'.join([ |
| 45 '', | 45 '', |
| 46 '#ifndef ' + guard, | 46 '#ifndef ' + guard, |
| 47 '#define ' + guard, | 47 '#define ' + guard, |
| 48 '', | 48 '', |
| 49 '#endif // ' + guard, | 49 '#endif // ' + guard, |
| 50 '' | 50 '' |
| 51 ]) | 51 ]) |
| 52 | 52 |
| 53 | 53 |
| 54 def _RemoveTestSuffix(filename): | 54 def _RemoveTestSuffix(filename): |
| 55 base, _ = os.path.splitext(filename) | 55 base, _ = os.path.splitext(filename) |
| 56 suffixes = [ '_test', '_unittest', '_browsertest' ] | 56 suffixes = [ '_test', '_unittest', '_browsertest' ] |
| 57 for suffix in suffixes: | 57 for suffix in suffixes: |
| 58 l = len(suffix) | 58 l = len(suffix) |
| 59 if base[-l:] == suffix: | 59 if base[-l:] == suffix: |
| 60 return base[:-l] | 60 return base[:-l] |
| 61 return base | 61 return base |
| 62 | 62 |
| 63 | 63 |
| 64 def _IsIOSFile(filename): | 64 def _IsIOSFile(filename): |
| 65 if os.path.splitext(os.path.basename(filename))[0].endswith('_ios'): | 65 if os.path.splitext(os.path.basename(filename))[0].endswith('_ios'): |
| 66 return True | 66 return True |
| 67 if 'ios' in filename.split(os.path.sep): | 67 if 'ios' in filename.split(os.path.sep): |
| 68 return True | 68 return True |
| 69 return False | 69 return False |
| 70 | 70 |
| 71 | 71 |
| 72 def _FilePathSlashesToCpp(filename): |
| 73 return filename.replace('\\', '/') |
| 74 |
| 75 |
| 72 def _CppImplementation(filename): | 76 def _CppImplementation(filename): |
| 73 return '\n#include "' + _RemoveTestSuffix(filename) + '.h"\n' | 77 return '\n#include "' + _FilePathSlashesToCpp(_RemoveTestSuffix(filename)) \ |
| 78 + '.h"\n' |
| 74 | 79 |
| 75 | 80 |
| 76 def _ObjCppImplementation(filename): | 81 def _ObjCppImplementation(filename): |
| 77 implementation = '\n#import "' + _RemoveTestSuffix(filename) + '.h"\n' | 82 implementation = '\n#import "' + _RemoveTestSuffix(filename) + '.h"\n' |
| 78 if not _IsIOSFile(filename): | 83 if not _IsIOSFile(filename): |
| 79 return implementation | 84 return implementation |
| 80 implementation += '\n' | 85 implementation += '\n' |
| 81 implementation += '#if !defined(__has_feature) || !__has_feature(objc_arc)\n' | 86 implementation += '#if !defined(__has_feature) || !__has_feature(objc_arc)\n' |
| 82 implementation += '#error "This file requires ARC support."\n' | 87 implementation += '#error "This file requires ARC support."\n' |
| 83 implementation += '#endif\n' | 88 implementation += '#endif\n' |
| 84 return implementation | 89 return implementation |
| 85 | 90 |
| 86 | 91 |
| 87 def _CreateFile(filename): | 92 def _CreateFile(filename): |
| 88 contents = _GetHeader(filename) + '\n' | 93 contents = _GetHeader(filename) + '\n' |
| 89 | 94 |
| 90 if filename.endswith('.h'): | 95 if filename.endswith('.h'): |
| 91 contents += _CppHeader(filename) | 96 contents += _CppHeader(filename) |
| 92 elif filename.endswith('.cc'): | 97 elif filename.endswith('.cc'): |
| 93 contents += _CppImplementation(filename) | 98 contents += _CppImplementation(filename) |
| 94 elif filename.endswith('.mm'): | 99 elif filename.endswith('.mm'): |
| 95 contents += _ObjCppImplementation(filename) | 100 contents += _ObjCppImplementation(filename) |
| 96 | 101 |
| 97 fd = open(filename, 'w') | 102 fd = open(filename, 'wb') |
| 98 fd.write(contents) | 103 fd.write(contents) |
| 99 fd.close() | 104 fd.close() |
| 100 | 105 |
| 101 | 106 |
| 102 def Main(): | 107 def Main(): |
| 103 files = sys.argv[1:] | 108 files = sys.argv[1:] |
| 104 if len(files) < 1: | 109 if len(files) < 1: |
| 105 print >> sys.stderr, 'Usage: boilerplate.py path/to/file.h path/to/file.cc' | 110 print >> sys.stderr, 'Usage: boilerplate.py path/to/file.h path/to/file.cc' |
| 106 return 1 | 111 return 1 |
| 107 | 112 |
| 108 # Perform checks first so that the entire operation is atomic. | 113 # Perform checks first so that the entire operation is atomic. |
| 109 for f in files: | 114 for f in files: |
| 110 _, ext = os.path.splitext(f) | 115 _, ext = os.path.splitext(f) |
| 111 if not ext[1:] in EXTENSIONS_TO_COMMENTS: | 116 if not ext[1:] in EXTENSIONS_TO_COMMENTS: |
| 112 print >> sys.stderr, 'Unknown file type for %s' % f | 117 print >> sys.stderr, 'Unknown file type for %s' % f |
| 113 return 2 | 118 return 2 |
| 114 | 119 |
| 115 if os.path.exists(f): | 120 if os.path.exists(f): |
| 116 print >> sys.stderr, 'A file at path %s already exists' % f | 121 print >> sys.stderr, 'A file at path %s already exists' % f |
| 117 return 2 | 122 return 2 |
| 118 | 123 |
| 119 for f in files: | 124 for f in files: |
| 120 _CreateFile(f) | 125 _CreateFile(f) |
| 121 | 126 |
| 122 | 127 |
| 123 if __name__ == '__main__': | 128 if __name__ == '__main__': |
| 124 sys.exit(Main()) | 129 sys.exit(Main()) |
| OLD | NEW |