123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#!/usr/bin/env python 223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved. 323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)# found in the LICENSE file. 523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)"""Create files with copyright boilerplate and header include guards. 723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Usage: tools/boilerplate.py path/to/file.{h,cc} 923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)""" 1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)from datetime import date 1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)import os 1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)import os.path 1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)import sys 1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)LINES = [ 1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 'Copyright %d The Chromium Authors. All rights reserved.' % 1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) date.today().year, 1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 'Use of this source code is governed by a BSD-style license that can be', 2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 'found in the LICENSE file.' 2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)] 2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)EXTENSIONS_TO_COMMENTS = { 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 'h': '//', 2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 'cc': '//', 2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 'mm': '//', 2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 'js': '//', 2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 'py': '#' 2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)def _GetHeader(filename): 3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) _, ext = os.path.splitext(filename) 3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ext = ext[1:] 3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) comment = EXTENSIONS_TO_COMMENTS[ext] + ' ' 3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return '\n'.join([comment + line for line in LINES]) 3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)def _CppHeader(filename): 3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) guard = filename.replace('/', '_').replace('.', '_').upper() + '_' 4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return '\n'.join([ 4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) '', 4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) '#ifndef ' + guard, 4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) '#define ' + guard, 4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) '', 4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) '#endif // ' + guard, 4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) '' 4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ]) 4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)def _CppImplementation(filename): 5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base, _ = os.path.splitext(filename) 5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) include = '#include "' + base + '.h"' 5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return '\n'.join(['', include]) 5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)def _CreateFile(filename): 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) contents = _GetHeader(filename) + '\n' 5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if filename.endswith('.h'): 6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) contents += _CppHeader(filename) 6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) elif filename.endswith('.cc') or filename.endswith('.mm'): 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) contents += _CppImplementation(filename) 6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) fd = open(filename, 'w') 6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) fd.write(contents) 6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) fd.close() 6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)def Main(): 7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) files = sys.argv[1:] 7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if len(files) < 1: 7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) print >> sys.stderr, 'Usage: boilerplate.py path/to/file.h path/to/file.cc' 7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return 1 7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) # Perform checks first so that the entire operation is atomic. 7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) for f in files: 7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) _, ext = os.path.splitext(f) 7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if not ext[1:] in EXTENSIONS_TO_COMMENTS: 7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) print >> sys.stderr, 'Unknown file type for %s' % f 8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return 2 8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if os.path.exists(f): 8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) print >> sys.stderr, 'A file at path %s already exists' % f 8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return 2 8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) for f in files: 8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) _CreateFile(f) 8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)if __name__ == '__main__': 9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) sys.exit(Main()) 92