mirror of
https://github.com/open-source-parsers/jsoncpp.git
synced 2025-04-24 00:57:05 +02:00

Google advises its employees to add Google Inc. as an author, but that hasn't been done yet and would be super inconvenient. So instead I've refactored the file to refer to "The JsonCpp Authors", which are listed in the AUTHORS file. The AUTHORS file itself is generated via: git log --pretty="%an <%ae>%n%cn <%ce>" | sort | uniq Plus the addition of "Google Inc." as a copyright author. (Google owns the work of anyone contributing from an @google.com address, for example.) The list contains some probable duplicates where people have used more than one email address. I didn't deduplicate because -- well, who's to say they're duplicates, anyway? :)
95 lines
3.8 KiB
Python
95 lines
3.8 KiB
Python
"""Updates the license text in source file.
|
|
"""
|
|
from __future__ import print_function
|
|
|
|
# An existing license is found if the file starts with the string below,
|
|
# and ends with the first blank line.
|
|
LICENSE_BEGIN = "// Copyright "
|
|
|
|
BRIEF_LICENSE = LICENSE_BEGIN + """2007-2010 The JsonCpp Authors
|
|
// Distributed under MIT license, or public domain if desired and
|
|
// recognized in your jurisdiction.
|
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
|
|
|
""".replace('\r\n','\n')
|
|
|
|
def update_license(path, dry_run, show_diff):
|
|
"""Update the license statement in the specified file.
|
|
Parameters:
|
|
path: path of the C++ source file to update.
|
|
dry_run: if True, just print the path of the file that would be updated,
|
|
but don't change it.
|
|
show_diff: if True, print the path of the file that would be modified,
|
|
as well as the change made to the file.
|
|
"""
|
|
with open(path, 'rt') as fin:
|
|
original_text = fin.read().replace('\r\n','\n')
|
|
newline = fin.newlines and fin.newlines[0] or '\n'
|
|
if not original_text.startswith(LICENSE_BEGIN):
|
|
# No existing license found => prepend it
|
|
new_text = BRIEF_LICENSE + original_text
|
|
else:
|
|
license_end_index = original_text.index('\n\n') # search first blank line
|
|
new_text = BRIEF_LICENSE + original_text[license_end_index+2:]
|
|
if original_text != new_text:
|
|
if not dry_run:
|
|
with open(path, 'wb') as fout:
|
|
fout.write(new_text.replace('\n', newline))
|
|
print('Updated', path)
|
|
if show_diff:
|
|
import difflib
|
|
print('\n'.join(difflib.unified_diff(original_text.split('\n'),
|
|
new_text.split('\n'))))
|
|
return True
|
|
return False
|
|
|
|
def update_license_in_source_directories(source_dirs, dry_run, show_diff):
|
|
"""Updates license text in C++ source files found in directory source_dirs.
|
|
Parameters:
|
|
source_dirs: list of directory to scan for C++ sources. Directories are
|
|
scanned recursively.
|
|
dry_run: if True, just print the path of the file that would be updated,
|
|
but don't change it.
|
|
show_diff: if True, print the path of the file that would be modified,
|
|
as well as the change made to the file.
|
|
"""
|
|
from devtools import antglob
|
|
prune_dirs = antglob.prune_dirs + 'scons-local* ./build* ./libs ./dist'
|
|
for source_dir in source_dirs:
|
|
cpp_sources = antglob.glob(source_dir,
|
|
includes = '''**/*.h **/*.cpp **/*.inl''',
|
|
prune_dirs = prune_dirs)
|
|
for source in cpp_sources:
|
|
update_license(source, dry_run, show_diff)
|
|
|
|
def main():
|
|
usage = """%prog DIR [DIR2...]
|
|
Updates license text in sources of the project in source files found
|
|
in the directory specified on the command-line.
|
|
|
|
Example of call:
|
|
python devtools\licenseupdater.py include src -n --diff
|
|
=> Show change that would be made to the sources.
|
|
|
|
python devtools\licenseupdater.py include src
|
|
=> Update license statement on all sources in directories include/ and src/.
|
|
"""
|
|
from optparse import OptionParser
|
|
parser = OptionParser(usage=usage)
|
|
parser.allow_interspersed_args = False
|
|
parser.add_option('-n', '--dry-run', dest="dry_run", action='store_true', default=False,
|
|
help="""Only show what files are updated, do not update the files""")
|
|
parser.add_option('--diff', dest="show_diff", action='store_true', default=False,
|
|
help="""On update, show change made to the file.""")
|
|
parser.enable_interspersed_args()
|
|
options, args = parser.parse_args()
|
|
update_license_in_source_directories(args, options.dry_run, options.show_diff)
|
|
print('Done')
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
import os.path
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
main()
|
|
|