Movatterモバイル変換


[0]ホーム

URL:


Google Git
Sign in
chromium /chromium /src /refs/heads/main /. /tools /boilerplate.py
blob: 01158d41833aeccb2c01724bb66b485825bf1037 [file] [log] [blame]
Jeroen Dhollander82540622022-03-31 15:27:23[diff] [blame]1#!/usr/bin/env python3
Avi Drissman01528bb42022-09-08 15:21:46[diff] [blame]2# Copyright 2014 The Chromium Authors
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Create files with copyright boilerplate and header include guards.
7
8Usage: tools/boilerplate.py path/to/file.{h,cc}
9"""
10
Jeffrey Youngf16b2072021-09-15 21:43:24[diff] [blame]11from __future__import print_function, unicode_literals
Raul Tambre57e09d62019-09-22 17:18:52[diff] [blame]12
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]13from datetimeimport date
Jeffrey Youngf16b2072021-09-15 21:43:24[diff] [blame]14import io
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]15import os
16import os.path
17import sys
18
19LINES=[
Avi Drissman01528bb42022-09-08 15:21:46[diff] [blame]20 f'Copyright {date.today().year} The Chromium Authors',
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]21'Use of this source code is governed by a BSD-style license that can be',
22'found in the LICENSE file.'
23]
24
Jan Wilken Dörriec6601a532021-01-05 16:24:54[diff] [blame]25NO_COMPILE_LINES=[
26'This is a "No Compile Test" suite.',
27'https://dev.chromium.org/developers/testing/no-compile-tests'
28]
29
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]30EXTENSIONS_TO_COMMENTS={
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]31'cc':'//',
sdefresne5feb0b42016-03-15 11:03:40[diff] [blame]32'gn':'#',
33'gni':'#',
Sylvain Defresne5548a452023-02-21 18:59:48[diff] [blame]34'h':'//',
35'js':'//',
36'mm':'//',
Tanmoy Mollik0bf3efe2019-05-10 09:23:12[diff] [blame]37'mojom':'//',
Sylvain Defresne5548a452023-02-21 18:59:48[diff] [blame]38'nc':'//',
39'proto':'//',
40'py':'#',
41'swift':'//',
Mike Doughertyf69ec2a2022-05-12 04:12:53[diff] [blame]42'ts':'//',
Tanmoy Mollik0bf3efe2019-05-10 09:23:12[diff] [blame]43'typemap':'#',
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]44}
45
Jan Wilken Dörriec6601a532021-01-05 16:24:54[diff] [blame]46
47def_GetHeaderImpl(filename, lines):
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]48 _, ext= os.path.splitext(filename)
49 ext= ext[1:]
50 comment= EXTENSIONS_TO_COMMENTS[ext]+' '
Jan Wilken Dörriec6601a532021-01-05 16:24:54[diff] [blame]51return'\n'.join([comment+ linefor linein lines])
52
53
54def_GetHeader(filename):
55return_GetHeaderImpl(filename, LINES)
56
57
58def_GetNoCompileHeader(filename):
59assert(filename.endswith(".nc"))
60return'\n'+_GetHeaderImpl(filename, NO_COMPILE_LINES)
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]61
62
63def_CppHeader(filename):
rohitrao786f94382016-11-16 02:47:15[diff] [blame]64 guard= filename.upper()+'_'
emx359564e2017-04-28 18:17:15[diff] [blame]65for charin'/\\.+':
marq070cc782016-11-15 16:19:25[diff] [blame]66 guard= guard.replace(char,'_')
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]67return'\n'.join([
68'',
69'#ifndef '+ guard,
70'#define '+ guard,
71'',
72'#endif // '+ guard,
73''
74])
75
76
Jesse McKenna79d284b82020-04-23 14:51:50[diff] [blame]77def_RemoveCurrentDirectoryPrefix(filename):
78 current_dir_prefixes=[os.curdir+ os.sep]
79if os.altsepisnotNone:
80 current_dir_prefixes.append(os.curdir+ os.altsep)
81for prefixin current_dir_prefixes:
82if filename.startswith(prefix):
83return filename[len(prefix):]
84return filename
85
86
bnc70c505372016-12-14 16:28:14[diff] [blame]87def_RemoveTestSuffix(filename):
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]88 base, _= os.path.splitext(filename)
bnc70c505372016-12-14 16:28:14[diff] [blame]89 suffixes=['_test','_unittest','_browsertest']
90for suffixin suffixes:
91 l= len(suffix)
92if base[-l:]== suffix:
93return base[:-l]
94return base
95
sdefresned6844b4a2017-03-07 01:11:20[diff] [blame]96
97def_IsIOSFile(filename):
98if os.path.splitext(os.path.basename(filename))[0].endswith('_ios'):
99returnTrue
100if'ios'in filename.split(os.path.sep):
101returnTrue
102returnFalse
103
104
emx359564e2017-04-28 18:17:15[diff] [blame]105def_FilePathSlashesToCpp(filename):
106return filename.replace('\\','/')
107
108
bnc70c505372016-12-14 16:28:14[diff] [blame]109def_CppImplementation(filename):
emx359564e2017-04-28 18:17:15[diff] [blame]110return'\n#include "'+_FilePathSlashesToCpp(_RemoveTestSuffix(filename)) \
111+'.h"\n'
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]112
113
kkhorimotocc826ad2016-02-11 20:17:46[diff] [blame]114def_ObjCppImplementation(filename):
Avi Drissman3d243a42023-08-01 16:53:59[diff] [blame]115return'\n#import "'+_FilePathSlashesToCpp(_RemoveTestSuffix(filename)) \
116+'.h"\n'
kkhorimotocc826ad2016-02-11 20:17:46[diff] [blame]117
118
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]119def_CreateFile(filename):
Jesse McKenna79d284b82020-04-23 14:51:50[diff] [blame]120 filename=_RemoveCurrentDirectoryPrefix(filename)
121
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]122 contents=_GetHeader(filename)+'\n'
123
124if filename.endswith('.h'):
125 contents+=_CppHeader(filename)
kkhorimotocc826ad2016-02-11 20:17:46[diff] [blame]126elif filename.endswith('.cc'):
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]127 contents+=_CppImplementation(filename)
Jan Wilken Dörriec6601a532021-01-05 16:24:54[diff] [blame]128elif filename.endswith('.nc'):
129 contents+=_GetNoCompileHeader(filename)+'\n'
130 contents+=_CppImplementation(filename)
kkhorimotocc826ad2016-02-11 20:17:46[diff] [blame]131elif filename.endswith('.mm'):
132 contents+=_ObjCppImplementation(filename)
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]133
Jeffrey Youngf16b2072021-09-15 21:43:24[diff] [blame]134with io.open(filename, mode='w', newline='\n')as fd:
135 fd.write(contents)
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]136
137
Ryan Tarpine9d342092024-02-22 00:40:28[diff] [blame]138# A file is safe to overwrite if it's an empty file we can write to.
139def_IsSafeToOverwrite(path):
140return os.path.isfile(path)and os.path.getsize(path)==0and os.access(
141 path, os.W_OK)
142
143
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]144defMain():
145 files= sys.argv[1:]
146if len(files)<1:
Raul Tambre57e09d62019-09-22 17:18:52[diff] [blame]147print(
148'Usage: boilerplate.py path/to/file.h path/to/file.cc', file=sys.stderr)
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]149return1
150
151# Perform checks first so that the entire operation is atomic.
152for fin files:
153 _, ext= os.path.splitext(f)
154ifnot ext[1:]in EXTENSIONS_TO_COMMENTS:
Raul Tambre57e09d62019-09-22 17:18:52[diff] [blame]155print('Unknown file type for %s'% f, file=sys.stderr)
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]156return2
157
Ryan Tarpine9d342092024-02-22 00:40:28[diff] [blame]158if os.path.exists(f)andnot_IsSafeToOverwrite(f):
Raul Tambre57e09d62019-09-22 17:18:52[diff] [blame]159print('A file at path %s already exists'% f, file=sys.stderr)
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]160return2
161
rsesek@chromium.orgfb9d58c2014-03-20 17:43:10[diff] [blame]162for fin files:
163_CreateFile(f)
164
165
166if __name__=='__main__':
167 sys.exit(Main())

[8]ページ先頭

©2009-2025 Movatter.jp