blob: 57afb5fbea8a7630eae66eab3ac33bf1f1cd8fb1 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2019 The Goma Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Utility for processing licensing information in third_party directories.
Usage: licenses.py <goma LICENSE file> <third_party directory> <output file>
"""
import argparse
import os
import sys
# Skip these directories in third_party.
PRUNE_DIRS = [
'config',
'llvm-build',
]
# These libraries don't have LICENSE in the directory.
# See path instead.
SPECIAL_CASES = {
'lss': {
'path': 'LICENSE.lss',
},
'zlib': {
'path': 'LICENSE.zlib',
},
}
def ReadFile(path):
"""Returns file contents."""
with open(path) as f:
return f.read()
def IsLicenseFile(name):
"""Returns true if name looks like a license file."""
return name in ['LICENSE', 'LICENSE.md', 'COPYING', 'COPYING.txt']
def FindLicense(third_party_dir, library_name):
"""Find a license file in {third_party_dir}/{library_name}.
Returns its contents."""
if library_name in SPECIAL_CASES:
return ReadFile(os.path.join(third_party_dir,
SPECIAL_CASES[library_name]['path']))
for curdir, dirs, files in os.walk(os.path.join(third_party_dir,
library_name)):
for f in files:
if IsLicenseFile(f):
return ReadFile(os.path.join(curdir, f))
# license file wa not found.
return None
def AddLicenseFile(license, name, contents):
"""Add contents to license with title name."""
if license != '':
license += '\n\n'
license += name + '\n'
license += '=' * len(name) + '\n'
license += contents
return license
def main():
parser = argparse.ArgumentParser()
parser.add_argument('goma_license')
parser.add_argument('third_party_dir')
parser.add_argument('output_file')
args = parser.parse_args()
# First, process goma client LICENSE file.
result = ''
if os.path.exists(args.goma_license):
result = AddLicenseFile(result, 'Goma Client', ReadFile(args.goma_license))
# Then, process third_party license files.
for d in sorted(os.listdir(args.third_party_dir)):
if not os.path.isdir(os.path.join(args.third_party_dir, d)):
continue
if d in PRUNE_DIRS:
continue
license = FindLicense(args.third_party_dir, d)
if not license:
raise Exception('license file not found in {}'.format(d))
result = AddLicenseFile(result, d, license)
with open(args.output_file, 'w') as f:
f.write(result)
if __name__ == '__main__':
sys.exit(main())