15f9996aaSopenharmony_ci#!/usr/bin/env python3
25f9996aaSopenharmony_ci# -*- coding: utf-8 -*-
35f9996aaSopenharmony_ci# Copyright (c) 2021 Huawei Device Co., Ltd.
45f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
55f9996aaSopenharmony_ci# you may not use this file except in compliance with the License.
65f9996aaSopenharmony_ci# You may obtain a copy of the License at
75f9996aaSopenharmony_ci#
85f9996aaSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
95f9996aaSopenharmony_ci#
105f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
115f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
125f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135f9996aaSopenharmony_ci# See the License for the specific language governing permissions and
145f9996aaSopenharmony_ci# limitations under the License.
155f9996aaSopenharmony_ci
165f9996aaSopenharmony_ciimport os
175f9996aaSopenharmony_ciimport re
185f9996aaSopenharmony_ciimport glob
195f9996aaSopenharmony_ci
205f9996aaSopenharmony_cifrom file_utils import read_json_file
215f9996aaSopenharmony_ci
225f9996aaSopenharmony_ci
235f9996aaSopenharmony_cidef _get_external_deps_file_list(search_path: str):
245f9996aaSopenharmony_ci    search_str = "{}/**/*{}".format(search_path, ".json")
255f9996aaSopenharmony_ci    external_deps_file_list = glob.glob(search_str, recursive=True)
265f9996aaSopenharmony_ci    return external_deps_file_list
275f9996aaSopenharmony_ci
285f9996aaSopenharmony_ci
295f9996aaSopenharmony_cidef _read_external_deps_info(build_out_dir: str):
305f9996aaSopenharmony_ci    ext_deps_file_list = _get_external_deps_file_list(build_out_dir)
315f9996aaSopenharmony_ci    ext_deps_file_dict = {}
325f9996aaSopenharmony_ci    for _external_deps_file in ext_deps_file_list:
335f9996aaSopenharmony_ci        if not os.path.exists(_external_deps_file):
345f9996aaSopenharmony_ci            raise Exception(
355f9996aaSopenharmony_ci                "file '{}' doesn't exist.".format(_external_deps_file))
365f9996aaSopenharmony_ci        module_ext_deps_info = read_json_file(_external_deps_file)
375f9996aaSopenharmony_ci        if module_ext_deps_info is None:
385f9996aaSopenharmony_ci            raise Exception(
395f9996aaSopenharmony_ci                "read file '{}' failed.".format(_external_deps_file))
405f9996aaSopenharmony_ci        _filename = os.path.basename(_external_deps_file)
415f9996aaSopenharmony_ci        _filename_snippet = re.search(r'(.*).json', _filename).group(1)
425f9996aaSopenharmony_ci        part_name, module_name = _parse_module_name(_filename_snippet)
435f9996aaSopenharmony_ci        module_alias = '{}:{}'.format(part_name, module_name)
445f9996aaSopenharmony_ci        ext_deps_file_dict[module_alias] = module_ext_deps_info
455f9996aaSopenharmony_ci    return ext_deps_file_dict
465f9996aaSopenharmony_ci
475f9996aaSopenharmony_ci
485f9996aaSopenharmony_cidef _parse_module_name(name_str):
495f9996aaSopenharmony_ci    split_result = name_str.split('__')
505f9996aaSopenharmony_ci    part_name = split_result[0]
515f9996aaSopenharmony_ci    module_name = split_result[1]
525f9996aaSopenharmony_ci    return part_name, module_name
535f9996aaSopenharmony_ci
545f9996aaSopenharmony_ci
555f9996aaSopenharmony_cidef _read_module_deps_info(module_deps_files_path):
565f9996aaSopenharmony_ci    deps_files = os.listdir(module_deps_files_path)
575f9996aaSopenharmony_ci    deps_data = {}
585f9996aaSopenharmony_ci    for _filename in deps_files:
595f9996aaSopenharmony_ci        _deps_file = os.path.join(module_deps_files_path, _filename)
605f9996aaSopenharmony_ci        if not os.path.exists(_deps_file):
615f9996aaSopenharmony_ci            raise Exception("file '{}' doesn't exist.".format(_deps_file))
625f9996aaSopenharmony_ci        module_deps_info = read_json_file(_deps_file)
635f9996aaSopenharmony_ci        if module_deps_info is None:
645f9996aaSopenharmony_ci            raise Exception("read file '{}' failed.".format(_deps_file))
655f9996aaSopenharmony_ci        _filename_snippet = _filename
665f9996aaSopenharmony_ci        part_name, module_name = _parse_module_name(_filename_snippet)
675f9996aaSopenharmony_ci        module_alias = '{}:{}'.format(part_name, module_name)
685f9996aaSopenharmony_ci        deps_data[module_alias] = module_deps_info
695f9996aaSopenharmony_ci    return deps_data
705f9996aaSopenharmony_ci
715f9996aaSopenharmony_ci
725f9996aaSopenharmony_cidef _merge_external_deps_label(deps_data, external_deps_data):
735f9996aaSopenharmony_ci    for _module_alias, _info in deps_data.items():
745f9996aaSopenharmony_ci        _module_alias_external_deps = _module_alias.replace('.json', '')
755f9996aaSopenharmony_ci        external_deps = _info.get('external_deps')
765f9996aaSopenharmony_ci        if not external_deps:
775f9996aaSopenharmony_ci            continue
785f9996aaSopenharmony_ci        ext_deps_label_info = external_deps_data.get(_module_alias_external_deps)
795f9996aaSopenharmony_ci        if not ext_deps_label_info:
805f9996aaSopenharmony_ci            raise Exception(
815f9996aaSopenharmony_ci                "module '{}' external deps info is incorrect.".format(
825f9996aaSopenharmony_ci                    _module_alias_external_deps))
835f9996aaSopenharmony_ci        _info['external_deps_label'] = ext_deps_label_info.get('deps')
845f9996aaSopenharmony_ci
855f9996aaSopenharmony_ci    deps_data_new = {}
865f9996aaSopenharmony_ci    for module_part, module_part_info in deps_data.items():
875f9996aaSopenharmony_ci        module_part_name = module_part.replace('.json', '')
885f9996aaSopenharmony_ci        deps_data_new[module_part_name] = module_part_info
895f9996aaSopenharmony_ci    return deps_data_new
905f9996aaSopenharmony_ci
915f9996aaSopenharmony_ci
925f9996aaSopenharmony_cidef get_all_deps_data(module_deps_files_path):
935f9996aaSopenharmony_ci    deps_data = _read_module_deps_info(module_deps_files_path)
945f9996aaSopenharmony_ci    external_deps_data = _read_external_deps_info(module_deps_files_path)
955f9996aaSopenharmony_ci    all_deps_data = _merge_external_deps_label(deps_data, external_deps_data)
965f9996aaSopenharmony_ci    return all_deps_data
97