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