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