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, "_external_deps_temp.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( 31 os.path.join(build_out_dir, 'gen')) 32 ext_deps_file_dict = {} 33 for _external_deps_file in ext_deps_file_list: 34 if not os.path.exists(_external_deps_file): 35 raise Exception( 36 "file '{}' doesn't exist.".format(_external_deps_file)) 37 module_ext_deps_info = read_json_file(_external_deps_file) 38 if module_ext_deps_info is None: 39 raise Exception( 40 "read file '{}' failed.".format(_external_deps_file)) 41 _filename = os.path.basename(_external_deps_file) 42 _filename_snippet = re.search(r'(.*)_external_deps_temp.json', 43 _filename).group(1) 44 part_name, module_name = _parse_module_name(_filename_snippet) 45 module_alias = '{}:{}'.format(part_name, module_name) 46 ext_deps_file_dict[module_alias] = module_ext_deps_info 47 return ext_deps_file_dict 48 49 50def _parse_module_name(name_str: str): 51 split_result = name_str.split('__') 52 part_name = split_result[0] 53 module_name = split_result[1] 54 return part_name, module_name 55 56 57def _read_module_deps_info(module_deps_files_path: str): 58 deps_files = os.listdir(module_deps_files_path) 59 deps_data = {} 60 for _filename in deps_files: 61 _deps_file = os.path.join(module_deps_files_path, _filename) 62 if not os.path.exists(_deps_file): 63 raise Exception("file '{}' doesn't exist.".format(_deps_file)) 64 module_deps_info = read_json_file(_deps_file) 65 if module_deps_info is None: 66 raise Exception("read file '{}' failed.".format(_deps_file)) 67 _filename_snippet = re.search(r'(.*).json', _filename).group(1) 68 part_name, module_name = _parse_module_name(_filename_snippet) 69 module_alias = '{}:{}'.format(part_name, module_name) 70 deps_data[module_alias] = module_deps_info 71 return deps_data 72 73 74def _merge_external_deps_label(deps_data: dict, external_deps_data: dict): 75 for _module_alias, _info in deps_data.items(): 76 external_deps = _info.get('external_deps') 77 if not external_deps: 78 continue 79 ext_deps_label_info = external_deps_data.get(_module_alias) 80 if not ext_deps_label_info: 81 raise Exception( 82 "module '{}' external deps info is incorrect.".format( 83 _module_alias)) 84 _info['external_deps_label'] = ext_deps_label_info.get('deps') 85 return deps_data 86 87 88def get_all_deps_data(module_deps_files_path: str): 89 deps_data = _read_module_deps_info(module_deps_files_path) 90 build_out_dir = os.path.dirname(module_deps_files_path) 91 external_deps_data = _read_external_deps_info(build_out_dir) 92 all_deps_data = _merge_external_deps_label(deps_data, external_deps_data) 93 return all_deps_data 94