15f9996aaSopenharmony_ci#!/usr/bin/env python
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 sys
175f9996aaSopenharmony_ciimport argparse
185f9996aaSopenharmony_ciimport os
195f9996aaSopenharmony_ciimport shutil
205f9996aaSopenharmony_ci
215f9996aaSopenharmony_cisys.path.append(
225f9996aaSopenharmony_ci    os.path.dirname(os.path.dirname(os.path.dirname(
235f9996aaSopenharmony_ci        os.path.abspath(__file__)))))
245f9996aaSopenharmony_cifrom scripts.util.file_utils import read_json_file, write_json_file  # noqa: E402
255f9996aaSopenharmony_ci
265f9996aaSopenharmony_ci
275f9996aaSopenharmony_cidef get_src_parts(system_install_info_file: str):
285f9996aaSopenharmony_ci    parts_info_list = read_json_file(system_install_info_file)
295f9996aaSopenharmony_ci    if parts_info_list is None:
305f9996aaSopenharmony_ci        raise Exception(
315f9996aaSopenharmony_ci            "read file '{}' failed.".format(system_install_info_file))
325f9996aaSopenharmony_ci    src_parts_info = {}
335f9996aaSopenharmony_ci    for part_info in parts_info_list:
345f9996aaSopenharmony_ci        if 'is_source' not in part_info:
355f9996aaSopenharmony_ci            raise Exception("read part info error, missing key is_source.")
365f9996aaSopenharmony_ci        if part_info.get('is_source') is True:
375f9996aaSopenharmony_ci            part_name = part_info.get('part_name')
385f9996aaSopenharmony_ci            src_parts_info[part_name] = part_info
395f9996aaSopenharmony_ci    return src_parts_info
405f9996aaSopenharmony_ci
415f9996aaSopenharmony_ci
425f9996aaSopenharmony_cidef _collect_testcase(resources_dir: str, parts_info: dict, output_base_dir: str):
435f9996aaSopenharmony_ci    for part_name, part_info in parts_info.items():
445f9996aaSopenharmony_ci        origin_part_name = part_info.get('origin_part_name')
455f9996aaSopenharmony_ci        if part_info.get('variant_name') != 'phone':
465f9996aaSopenharmony_ci            _toolchain = part_info.get('toolchain_label')
475f9996aaSopenharmony_ci            _toolchain_name = _toolchain.split(':')[1]
485f9996aaSopenharmony_ci            _variant_dir = os.path.join(_toolchain_name, resources_dir,
495f9996aaSopenharmony_ci                                        origin_part_name)
505f9996aaSopenharmony_ci        else:
515f9996aaSopenharmony_ci            _variant_dir = os.path.join(resources_dir, part_name)
525f9996aaSopenharmony_ci        if not os.path.exists(_variant_dir):
535f9996aaSopenharmony_ci            continue
545f9996aaSopenharmony_ci
555f9996aaSopenharmony_ci        _src_dir_name = os.path.basename(resources_dir)
565f9996aaSopenharmony_ci        package_output_dir = os.path.join(output_base_dir, _src_dir_name)
575f9996aaSopenharmony_ci        dest_dir = os.path.join(package_output_dir, origin_part_name)
585f9996aaSopenharmony_ci        if os.path.exists(dest_dir):
595f9996aaSopenharmony_ci            shutil.rmtree(dest_dir)
605f9996aaSopenharmony_ci        shutil.copytree(_variant_dir, dest_dir)
615f9996aaSopenharmony_ci
625f9996aaSopenharmony_ci
635f9996aaSopenharmony_cidef collect_testcase(resources_dir_list: list, parts_info: dict, output_base_dir: str):
645f9996aaSopenharmony_ci    for resources_dir in resources_dir_list:
655f9996aaSopenharmony_ci        _collect_testcase(resources_dir, parts_info, output_base_dir)
665f9996aaSopenharmony_ci
675f9996aaSopenharmony_ci
685f9996aaSopenharmony_cidef _collect_test_mlf(resources_dir: str, parts_info: dict, output_base_dir: str):
695f9996aaSopenharmony_ci    for part_name, part_info in parts_info.items():
705f9996aaSopenharmony_ci        origin_part_name = part_info.get('origin_part_name')
715f9996aaSopenharmony_ci        if part_info.get('variant_name') != 'phone':
725f9996aaSopenharmony_ci            _toolchain = part_info.get('toolchain_label')
735f9996aaSopenharmony_ci            _toolchain_name = _toolchain.split(':')[1]
745f9996aaSopenharmony_ci            _variant_dir = os.path.join(_toolchain_name, resources_dir,
755f9996aaSopenharmony_ci                                        origin_part_name)
765f9996aaSopenharmony_ci        else:
775f9996aaSopenharmony_ci            _variant_dir = os.path.join(resources_dir, part_name)
785f9996aaSopenharmony_ci        if not os.path.exists(_variant_dir):
795f9996aaSopenharmony_ci            continue
805f9996aaSopenharmony_ci
815f9996aaSopenharmony_ci        _src_dir_name = os.path.basename(resources_dir)
825f9996aaSopenharmony_ci        package_output_dir = os.path.join(output_base_dir, _src_dir_name)
835f9996aaSopenharmony_ci        dest_dir = os.path.join(package_output_dir, origin_part_name)
845f9996aaSopenharmony_ci        if os.path.exists(dest_dir):
855f9996aaSopenharmony_ci            shutil.rmtree(dest_dir)
865f9996aaSopenharmony_ci        shutil.copytree(_variant_dir, dest_dir)
875f9996aaSopenharmony_ci
885f9996aaSopenharmony_ci
895f9996aaSopenharmony_cidef collect_test_mlf(resources_dir_list: list, parts_info: dict, output_base_dir: str):
905f9996aaSopenharmony_ci    for resources_dir in resources_dir_list:
915f9996aaSopenharmony_ci        _collect_test_mlf(resources_dir, parts_info, output_base_dir)
925f9996aaSopenharmony_ci
935f9996aaSopenharmony_ci
945f9996aaSopenharmony_cidef _collect_libs_symbols(resources_dir: str, parts_info: dict, package_output_base_dir: str):
955f9996aaSopenharmony_ci    for part_name, part_info in parts_info.items():
965f9996aaSopenharmony_ci        origin_part_name = part_info.get('origin_part_name')
975f9996aaSopenharmony_ci        if part_info.get('variant_name') != 'phone':
985f9996aaSopenharmony_ci            _toolchain = part_info.get('toolchain_label')
995f9996aaSopenharmony_ci            _toolchain_name = _toolchain.split(':')[1]
1005f9996aaSopenharmony_ci            _variant_dir = os.path.join(_toolchain_name, resources_dir,
1015f9996aaSopenharmony_ci                                        _toolchain_name,
1025f9996aaSopenharmony_ci                                        part_info.get('subsystem_name'),
1035f9996aaSopenharmony_ci                                        origin_part_name)
1045f9996aaSopenharmony_ci        else:
1055f9996aaSopenharmony_ci            _variant_dir = os.path.join(resources_dir,
1065f9996aaSopenharmony_ci                                        part_info.get('subsystem_name'),
1075f9996aaSopenharmony_ci                                        part_name)
1085f9996aaSopenharmony_ci        if not os.path.exists(_variant_dir):
1095f9996aaSopenharmony_ci            continue
1105f9996aaSopenharmony_ci
1115f9996aaSopenharmony_ci        _src_dir_name = os.path.basename(resources_dir)
1125f9996aaSopenharmony_ci        package_output_dir = os.path.join(package_output_base_dir,
1135f9996aaSopenharmony_ci                                          _src_dir_name)
1145f9996aaSopenharmony_ci        dest_dir = os.path.join(package_output_dir, origin_part_name)
1155f9996aaSopenharmony_ci        if os.path.exists(dest_dir):
1165f9996aaSopenharmony_ci            shutil.rmtree(dest_dir)
1175f9996aaSopenharmony_ci        shutil.copytree(_variant_dir, dest_dir)
1185f9996aaSopenharmony_ci
1195f9996aaSopenharmony_ci
1205f9996aaSopenharmony_cidef collect_libs_symbols(resources_dir_list: list, parts_info: dict, output_base_dir: str):
1215f9996aaSopenharmony_ci    for resources_dir in resources_dir_list:
1225f9996aaSopenharmony_ci        _collect_libs_symbols(resources_dir, parts_info, output_base_dir)
1235f9996aaSopenharmony_ci
1245f9996aaSopenharmony_ci
1255f9996aaSopenharmony_cidef _collect_libs_java(resources_dir: str, parts_info: dict, output_base_dir: str):
1265f9996aaSopenharmony_ci    parts_libs_java_path = {}
1275f9996aaSopenharmony_ci    for part_name, part_info in parts_info.items():
1285f9996aaSopenharmony_ci        origin_part_name = part_info.get('origin_part_name')
1295f9996aaSopenharmony_ci        if part_info.get('variant_name') != 'phone':
1305f9996aaSopenharmony_ci            _toolchain = part_info.get('toolchain_label')
1315f9996aaSopenharmony_ci            _toolchain_name = _toolchain.split(':')[1]
1325f9996aaSopenharmony_ci            _variant_dir = os.path.join(_toolchain_name, resources_dir,
1335f9996aaSopenharmony_ci                                        part_info.get('subsystem_name'),
1345f9996aaSopenharmony_ci                                        origin_part_name)
1355f9996aaSopenharmony_ci        else:
1365f9996aaSopenharmony_ci            _variant_dir = os.path.join(resources_dir,
1375f9996aaSopenharmony_ci                                        part_info.get('subsystem_name'),
1385f9996aaSopenharmony_ci                                        part_name)
1395f9996aaSopenharmony_ci        if not os.path.exists(_variant_dir):
1405f9996aaSopenharmony_ci            continue
1415f9996aaSopenharmony_ci
1425f9996aaSopenharmony_ci        parts_libs_java_path[origin_part_name] = _variant_dir
1435f9996aaSopenharmony_ci    _libs_java_path_info_file = os.path.join(output_base_dir,
1445f9996aaSopenharmony_ci                                             'libs_java_info.json')
1455f9996aaSopenharmony_ci    write_json_file(_libs_java_path_info_file, parts_libs_java_path)
1465f9996aaSopenharmony_ci
1475f9996aaSopenharmony_ci
1485f9996aaSopenharmony_cidef collect_libs_java(resources_dir_list: str, parts_info: dict, output_base_dir: str):
1495f9996aaSopenharmony_ci    for resources_dir in resources_dir_list:
1505f9996aaSopenharmony_ci        _collect_libs_java(resources_dir, parts_info, output_base_dir)
1515f9996aaSopenharmony_ci
1525f9996aaSopenharmony_ci
1535f9996aaSopenharmony_cidef _collect_kits_modules(resources_dir: str, parts_info: dict, output_base_dir: str):
1545f9996aaSopenharmony_ci    parts_modules_path = {}
1555f9996aaSopenharmony_ci    for part_name, part_info in parts_info.items():
1565f9996aaSopenharmony_ci        part_modules_dir = os.path.join(resources_dir, part_name)
1575f9996aaSopenharmony_ci        if not os.path.exists(part_modules_dir):
1585f9996aaSopenharmony_ci            continue
1595f9996aaSopenharmony_ci        origin_part_name = part_info.get('origin_part_name')
1605f9996aaSopenharmony_ci        parts_modules_path[origin_part_name] = part_modules_dir
1615f9996aaSopenharmony_ci    _modules_path_info_file = os.path.join(output_base_dir,
1625f9996aaSopenharmony_ci                                           'kits_modules_info.json')
1635f9996aaSopenharmony_ci    write_json_file(_modules_path_info_file, parts_modules_path)
1645f9996aaSopenharmony_ci
1655f9996aaSopenharmony_ci
1665f9996aaSopenharmony_cidef collect_kits_modules(resources_dir_list: list, parts_info: dict, output_base_dir: str):
1675f9996aaSopenharmony_ci    for resources_dir in resources_dir_list:
1685f9996aaSopenharmony_ci        _collect_kits_modules(resources_dir, parts_info, output_base_dir)
1695f9996aaSopenharmony_ci
1705f9996aaSopenharmony_ci
1715f9996aaSopenharmony_cidef collect_innerkits_modules(resources_dir_list: list, parts_info: dict, output_base_dir: str):
1725f9996aaSopenharmony_ci    for resources_dir in resources_dir_list:
1735f9996aaSopenharmony_ci        _collect_kits_modules(resources_dir, parts_info, output_base_dir)
1745f9996aaSopenharmony_ci
1755f9996aaSopenharmony_ci
1765f9996aaSopenharmony_cidef collect_resources(collect_type: str, resources_dir_list: list, parts_info: dict,
1775f9996aaSopenharmony_ci                      output_base_dir: str):
1785f9996aaSopenharmony_ci    if collect_type == 'libs_symbols':
1795f9996aaSopenharmony_ci        collect_libs_symbols(resources_dir_list, parts_info, output_base_dir)
1805f9996aaSopenharmony_ci    elif collect_type == 'module_list_files':
1815f9996aaSopenharmony_ci        collect_test_mlf(resources_dir_list, parts_info, output_base_dir)
1825f9996aaSopenharmony_ci    elif collect_type == 'testcase':
1835f9996aaSopenharmony_ci        collect_testcase(resources_dir_list, parts_info, output_base_dir)
1845f9996aaSopenharmony_ci    elif collect_type == 'kits_modules':
1855f9996aaSopenharmony_ci        collect_kits_modules(resources_dir_list, parts_info, output_base_dir)
1865f9996aaSopenharmony_ci    elif collect_type == 'innerkits_modules':
1875f9996aaSopenharmony_ci        collect_innerkits_modules(resources_dir_list, parts_info,
1885f9996aaSopenharmony_ci                                  output_base_dir)
1895f9996aaSopenharmony_ci    elif collect_type == 'libs_java':
1905f9996aaSopenharmony_ci        collect_libs_java(resources_dir_list, parts_info, output_base_dir)
1915f9996aaSopenharmony_ci    else:
1925f9996aaSopenharmony_ci        raise Exception("Unsupported resource type.")
1935f9996aaSopenharmony_ci
1945f9996aaSopenharmony_ci
1955f9996aaSopenharmony_cidef main():
1965f9996aaSopenharmony_ci    parser = argparse.ArgumentParser()
1975f9996aaSopenharmony_ci    parser.add_argument('--collect-type', required=True)
1985f9996aaSopenharmony_ci    parser.add_argument('--system-install-info-file', required=True)
1995f9996aaSopenharmony_ci    parser.add_argument('--resources-dir-list', nargs='+', default=[])
2005f9996aaSopenharmony_ci    parser.add_argument('--package-output-base-dir', required=True)
2015f9996aaSopenharmony_ci    parser.add_argument('--output-file', required=True)
2025f9996aaSopenharmony_ci    args = parser.parse_args()
2035f9996aaSopenharmony_ci
2045f9996aaSopenharmony_ci    parts_info = get_src_parts(args.system_install_info_file)
2055f9996aaSopenharmony_ci
2065f9996aaSopenharmony_ci    collect_resources(args.collect_type, args.resources_dir_list, parts_info,
2075f9996aaSopenharmony_ci                      args.package_output_base_dir)
2085f9996aaSopenharmony_ci    write_json_file(args.output_file, '{}')
2095f9996aaSopenharmony_ci    return 0
2105f9996aaSopenharmony_ci
2115f9996aaSopenharmony_ci
2125f9996aaSopenharmony_ciif __name__ == '__main__':
2135f9996aaSopenharmony_ci    sys.exit(main())
214