• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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