1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3# Copyright (c) 2021 Huawei Device Co., Ltd. 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15 16import os 17import re 18import glob 19 20from file_utils import read_json_file 21 22 23def _get_external_deps_file_list(search_path: str): 24 search_str = "{}/**/*{}".format(search_path, ".json") 25 external_deps_file_list = glob.glob(search_str, recursive=True) 26 return external_deps_file_list 27 28 29def _read_external_deps_info(build_out_dir: str): 30 ext_deps_file_list = _get_external_deps_file_list(build_out_dir) 31 ext_deps_file_dict = {} 32 for _external_deps_file in ext_deps_file_list: 33 if not os.path.exists(_external_deps_file): 34 raise Exception( 35 "file '{}' doesn't exist.".format(_external_deps_file)) 36 module_ext_deps_info = read_json_file(_external_deps_file) 37 if module_ext_deps_info is None: 38 raise Exception( 39 "read file '{}' failed.".format(_external_deps_file)) 40 _filename = os.path.basename(_external_deps_file) 41 _filename_snippet = re.search(r'(.*).json', _filename).group(1) 42 part_name, module_name = _parse_module_name(_filename_snippet) 43 module_alias = '{}:{}'.format(part_name, module_name) 44 ext_deps_file_dict[module_alias] = module_ext_deps_info 45 return ext_deps_file_dict 46 47 48def _parse_module_name(name_str): 49 split_result = name_str.split('__') 50 part_name = split_result[0] 51 module_name = split_result[1] 52 return part_name, module_name 53 54 55def _read_module_deps_info(module_deps_files_path): 56 deps_files = os.listdir(module_deps_files_path) 57 deps_data = {} 58 for _filename in deps_files: 59 _deps_file = os.path.join(module_deps_files_path, _filename) 60 if not os.path.exists(_deps_file): 61 raise Exception("file '{}' doesn't exist.".format(_deps_file)) 62 module_deps_info = read_json_file(_deps_file) 63 if module_deps_info is None: 64 raise Exception("read file '{}' failed.".format(_deps_file)) 65 _filename_snippet = _filename 66 part_name, module_name = _parse_module_name(_filename_snippet) 67 module_alias = '{}:{}'.format(part_name, module_name) 68 deps_data[module_alias] = module_deps_info 69 return deps_data 70 71 72def _merge_external_deps_label(deps_data, external_deps_data): 73 for _module_alias, _info in deps_data.items(): 74 _module_alias_external_deps = _module_alias.replace('.json', '') 75 external_deps = _info.get('external_deps') 76 if not external_deps: 77 continue 78 ext_deps_label_info = external_deps_data.get(_module_alias_external_deps) 79 if not ext_deps_label_info: 80 raise Exception( 81 "module '{}' external deps info is incorrect.".format( 82 _module_alias_external_deps)) 83 _info['external_deps_label'] = ext_deps_label_info.get('deps') 84 85 deps_data_new = {} 86 for module_part, module_part_info in deps_data.items(): 87 module_part_name = module_part.replace('.json', '') 88 deps_data_new[module_part_name] = module_part_info 89 return deps_data_new 90 91 92def get_all_deps_data(module_deps_files_path): 93 deps_data = _read_module_deps_info(module_deps_files_path) 94 external_deps_data = _read_external_deps_info(module_deps_files_path) 95 all_deps_data = _merge_external_deps_label(deps_data, external_deps_data) 96 return all_deps_data 97