#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (c) 2020 Huawei Device Co., Ltd. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import sys import argparse import os from utils import read_json_file from utils import makedirs from utils import encode from utils import decode def is_top_dir(src_path): return os.path.exists(os.path.join(src_path, '.gn')) def find_config_parent_file(src_dir, target_cfg): if (not os.path.isdir(src_dir)) or is_top_dir(src_dir): return '' for file in os.listdir(src_dir): file_path = os.path.join(src_dir, file) if os.path.isfile(file_path): if os.path.basename(file_path) == target_cfg: return src_dir return find_config_parent_file(os.path.dirname(src_dir), target_cfg) def get_notice_file_name(readme_file_path, copyright_file, module_relative_src_path): if not os.path.exists(readme_file_path) or os.path.isdir(readme_file_path): return '', '', '', '' opensource_config = read_json_file(readme_file_path) if opensource_config is None: return '', '', '', '' license_file = '' license_name = None software_name = None for info in opensource_config: license_file = info.get('License File') license_name = info.get('License') software_name = '{} {}'.format(info.get('Name'), info.get('Version Number')) license_file_path = os.path.join(os.path.dirname(readme_file_path), license_file.strip()) if not os.path.exists(license_file_path): return '', '', '', '' copyright_file_path = os.path.join(os.path.dirname(copyright_file), copyright_file.strip()) if not os.path.exists(copyright_file_path): return '', '', '', '' return license_file_path, license_name, software_name, copyright_file_path def get_opensource_config_file(module_source_dir, root_out_dir, target_cfg): config_file = '' expect_file = os.path.join(module_source_dir, target_cfg) if os.path.exists(expect_file): config_file = expect_file else: relpath = os.path.relpath(module_source_dir, root_out_dir) parent_cfg_dir = find_config_parent_file(os.path.dirname(relpath), target_cfg) if parent_cfg_dir != '': config_file = os.path.join(parent_cfg_dir, target_cfg) return config_file def get_notice_file(module_source_dir, root_out_dir, module_relative_source_dir): cfg_file = get_opensource_config_file(module_source_dir, root_out_dir, 'README.OpenSource') copyright_file = get_opensource_config_file(module_source_dir, root_out_dir, 'COPYRIGHT.OpenSource') if cfg_file == '': return '', '', '', '' if copyright_file == '': return '', '', '', '' return get_notice_file_name(cfg_file, copyright_file, module_relative_source_dir) def get_notice_file_dest_path(root_out_dir, target_name): nf_dest_list = [] nf_dest_dir = os.path.join(root_out_dir, 'NOTICE_FILE', target_name) license_num = 1 while os.path.exists(os.path.join(nf_dest_dir, "LICENSE{}.txt".format(license_num))): license_num += 1 nf_dest_list.append(os.path.join(nf_dest_dir, "LICENSE{}.txt".format(license_num))) return nf_dest_list def create_dest_file(filename): dir_name = os.path.dirname(filename) if not os.path.exists(dir_name): makedirs(dir_name) def gen_license(target_path, nf_dict, nf_src, cp_src): target_license_path = os.path.join(target_path, 'NOTICE') makedirs(target_path) with open(nf_src, 'rt') as f: nf_dict["license_content"] = decode(f.read()) with open(cp_src, 'rt') as f: nf_dict["copyright"] = decode(f.read()) with open(target_license_path, 'at') as f: f.write("Software: {}\n\n".format(encode(nf_dict["software"]))) f.write("Copyright notice: \n{}\n".format( encode(nf_dict["copyright"]))) f.write("License: {}\n{}\n\n".format( encode(nf_dict["license_name"]), encode(nf_dict["license_content"]))) def generate_notice_file(root_out_dir, module_source_dir, module_relative_source_dir, target_name): nf_src = '' nf_dict = { "software": '', "copyright": '', "license_name": '', "license_content": '' } nf_src, nf_dict["license_name"], nf_dict["software"], cp_src = \ get_notice_file(module_source_dir, root_out_dir, module_relative_source_dir) target_path = os.path.join(root_out_dir, 'NOTICE_FILE', target_name) if os.path.exists(nf_src) and os.path.exists(cp_src): gen_license(target_path, nf_dict, nf_src, cp_src) def main(): parser = argparse.ArgumentParser() parser.add_argument('--root-out-dir', help='', required=True) parser.add_argument('--module-source-dir', help='', required=True) parser.add_argument('--module-relative-source-dir', help='', required=True) parser.add_argument('--target-name', help='', required=True) args = parser.parse_args() if 'third_party/' not in args.module_relative_source_dir: return 0 generate_notice_file(args.root_out_dir, args.module_source_dir, args.module_relative_source_dir, args.target_name) return 0 if __name__ == '__main__': sys.exit(main())