Changeset View
Changeset View
Standalone View
Standalone View
contrib/devtools/copyright_header.py
Show All 14 Lines | |||||
# file filtering | # file filtering | ||||
########################################################################## | ########################################################################## | ||||
EXCLUDE = [ | EXCLUDE = [ | ||||
# auto generated: | # auto generated: | ||||
'src/qt/bitcoinstrings.cpp', | 'src/qt/bitcoinstrings.cpp', | ||||
'src/chainparamsseeds.h', | 'src/chainparamsseeds.h', | ||||
# other external copyrights: | # other external copyrights: | ||||
'src/reverse_iterator.h', | |||||
'src/test/fuzz/FuzzedDataProvider.h', | |||||
'src/tinyformat.h', | 'src/tinyformat.h', | ||||
'src/bench/nanobench.h', | 'src/bench/nanobench.h', | ||||
'test/functional/test_framework/bignum.py', | 'test/functional/test_framework/bignum.py', | ||||
# python init: | # python init: | ||||
'*__init__.py', | '*__init__.py', | ||||
] | ] | ||||
EXCLUDE_COMPILED = re.compile( | EXCLUDE_COMPILED = re.compile( | ||||
'|'.join([fnmatch.translate(m) for m in EXCLUDE])) | '|'.join([fnmatch.translate(m) for m in EXCLUDE])) | ||||
▲ Show 20 Lines • Show All 480 Lines • ▼ Show 20 Lines | |||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
''' | ''' | ||||
def get_cpp_header_lines_to_insert(start_year, end_year): | def get_cpp_header_lines_to_insert(start_year, end_year): | ||||
return reversed(get_header_lines(CPP_HEADER, start_year, end_year)) | return reversed(get_header_lines(CPP_HEADER, start_year, end_year)) | ||||
PYTHON_HEADER = ''' | SCRIPT_HEADER = ''' | ||||
# Copyright (c) {} The Bitcoin developers | # Copyright (c) {} The Bitcoin developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
''' | ''' | ||||
def get_python_header_lines_to_insert(start_year, end_year): | def get_script_header_lines_to_insert(start_year, end_year): | ||||
return reversed(get_header_lines(PYTHON_HEADER, start_year, end_year)) | return reversed(get_header_lines(SCRIPT_HEADER, start_year, end_year)) | ||||
########################################################################## | ########################################################################## | ||||
# query git for year of last change | # query git for year of last change | ||||
########################################################################## | ########################################################################## | ||||
def get_git_change_year_range(filename): | def get_git_change_year_range(filename): | ||||
years = get_git_change_years(filename) | years = get_git_change_years(filename) | ||||
Show All 16 Lines | |||||
def file_has_hashbang(file_lines): | def file_has_hashbang(file_lines): | ||||
if len(file_lines) < 1: | if len(file_lines) < 1: | ||||
return False | return False | ||||
if len(file_lines[0]) <= 2: | if len(file_lines[0]) <= 2: | ||||
return False | return False | ||||
return file_lines[0][:2] == '#!' | return file_lines[0][:2] == '#!' | ||||
def insert_python_header(filename, file_lines, start_year, end_year): | def insert_script_header(filename, file_lines, start_year, end_year): | ||||
header_lines = get_python_header_lines_to_insert(start_year, end_year) | header_lines = get_script_header_lines_to_insert(start_year, end_year) | ||||
insert_idx = find_distribution_line_index(file_lines) | insert_idx = find_distribution_line_index(file_lines) | ||||
if insert_idx is not None: | if insert_idx is not None: | ||||
file_lines.insert(insert_idx, list(header_lines)[-1]) | file_lines.insert(insert_idx, list(header_lines)[-1]) | ||||
else: | else: | ||||
if file_has_hashbang(file_lines): | if file_has_hashbang(file_lines): | ||||
insert_idx = 1 | insert_idx = 1 | ||||
else: | else: | ||||
insert_idx = 0 | insert_idx = 0 | ||||
for line in header_lines: | for line in header_lines: | ||||
file_lines.insert(insert_idx, line) | file_lines.insert(insert_idx, line) | ||||
write_file_lines(filename, file_lines) | write_file_lines(filename, file_lines) | ||||
def insert_cpp_header(filename, file_lines, start_year, end_year): | def insert_cpp_header(filename, file_lines, start_year, end_year): | ||||
file_lines.insert(0, '\n') | |||||
header_lines = get_cpp_header_lines_to_insert(start_year, end_year) | header_lines = get_cpp_header_lines_to_insert(start_year, end_year) | ||||
insert_idx = find_distribution_line_index(file_lines) | insert_idx = find_distribution_line_index(file_lines) | ||||
if insert_idx is not None: | if insert_idx is not None: | ||||
file_lines.insert(insert_idx, list(header_lines)[-1]) | file_lines.insert(insert_idx, list(header_lines)[-1]) | ||||
else: | else: | ||||
for line in header_lines: | for line in header_lines: | ||||
file_lines.insert(0, line) | file_lines.insert(0, line) | ||||
write_file_lines(filename, file_lines) | write_file_lines(filename, file_lines) | ||||
def exec_insert_header(filename, style): | def exec_insert_header(filename, style): | ||||
file_lines = read_file_lines(filename) | file_lines = read_file_lines(filename) | ||||
if file_already_has_bitcoin_copyright(file_lines): | if file_already_has_bitcoin_copyright(file_lines): | ||||
sys.exit('*** {} already has a copyright by The Bitcoin developers'.format( | sys.exit('*** {} already has a copyright by The Bitcoin developers'.format( | ||||
filename)) | filename)) | ||||
start_year, end_year = get_git_change_year_range(filename) | start_year, end_year = get_git_change_year_range(filename) | ||||
if style == 'python': | if style in ['python', 'shell']: | ||||
insert_python_header(filename, file_lines, start_year, end_year) | insert_script_header(filename, file_lines, start_year, end_year) | ||||
else: | else: | ||||
insert_cpp_header(filename, file_lines, start_year, end_year) | insert_cpp_header(filename, file_lines, start_year, end_year) | ||||
########################################################################## | ########################################################################## | ||||
# insert cmd | # insert cmd | ||||
########################################################################## | ########################################################################## | ||||
Show All 26 Lines | |||||
def insert_cmd(argv): | def insert_cmd(argv): | ||||
if len(argv) != 3: | if len(argv) != 3: | ||||
sys.exit(INSERT_USAGE) | sys.exit(INSERT_USAGE) | ||||
filename = argv[2] | filename = argv[2] | ||||
if not os.path.isfile(filename): | if not os.path.isfile(filename): | ||||
sys.exit("*** bad filename: {}".format(filename)) | sys.exit("*** bad filename: {}".format(filename)) | ||||
_, extension = os.path.splitext(filename) | _, extension = os.path.splitext(filename) | ||||
if extension not in ['.h', '.cpp', '.cc', '.c', '.py']: | if extension not in ['.h', '.cpp', '.cc', '.c', '.py', '.sh']: | ||||
sys.exit("*** cannot insert for file extension {}".format(extension)) | sys.exit("*** cannot insert for file extension {}".format(extension)) | ||||
if extension == '.py': | if extension == '.py': | ||||
style = 'python' | style = 'python' | ||||
elif extension == '.sh': | |||||
style = 'shell' | |||||
else: | else: | ||||
style = 'cpp' | style = 'cpp' | ||||
exec_insert_header(filename, style) | exec_insert_header(filename, style) | ||||
########################################################################## | ########################################################################## | ||||
# UI | # UI | ||||
########################################################################## | ########################################################################## | ||||
Show All 30 Lines |