xref: /build/ohos/sdk/check_sdk_completeness.py (revision 5f9996aa)
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 json
175f9996aaSopenharmony_ciimport os
185f9996aaSopenharmony_ciimport sys
195f9996aaSopenharmony_ciimport zipfile
205f9996aaSopenharmony_ciimport argparse
215f9996aaSopenharmony_ciimport time
225f9996aaSopenharmony_ci
235f9996aaSopenharmony_cisys.path.append(
245f9996aaSopenharmony_ci    os.path.dirname(
255f9996aaSopenharmony_ci        os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
265f9996aaSopenharmony_cifrom scripts.util.file_utils import read_json_file # noqa: E402
275f9996aaSopenharmony_ci
285f9996aaSopenharmony_cisdk_package_list = []
295f9996aaSopenharmony_cisdk_package_set = set()
305f9996aaSopenharmony_cisdk_package_location = ""
315f9996aaSopenharmony_ciproduct_name = ""
325f9996aaSopenharmony_cisdk_version = ""
335f9996aaSopenharmony_cisdk_platform = ""
345f9996aaSopenharmony_ci
355f9996aaSopenharmony_ci
365f9996aaSopenharmony_cidef parse_sdk_check_list(sdk_check_list: list):
375f9996aaSopenharmony_ci    sdk_check_files = []
385f9996aaSopenharmony_ci    sdk_check_directories = []
395f9996aaSopenharmony_ci    sdk_delivery_list = read_json_file(sdk_check_list)
405f9996aaSopenharmony_ci
415f9996aaSopenharmony_ci    if sdk_delivery_list is None:
425f9996aaSopenharmony_ci        raise Exception("read file '{}' failed.".format(sdk_check_list))
435f9996aaSopenharmony_ci
445f9996aaSopenharmony_ci    if sys.platform == 'linux':
455f9996aaSopenharmony_ci        if sdk_platform == 'default':
465f9996aaSopenharmony_ci            sdk_check_files = sdk_delivery_list['linux']['checkFiles']
475f9996aaSopenharmony_ci            sdk_check_directories = sdk_delivery_list['linux']['checkDirectories']
485f9996aaSopenharmony_ci            win_sdk_check_files = sdk_delivery_list['windows']['checkFiles']
495f9996aaSopenharmony_ci            win_sdk_check_directories = sdk_delivery_list['windows']['checkDirectories']
505f9996aaSopenharmony_ci            ohos_sdk_check_files = sdk_delivery_list['ohos']['checkFiles']
515f9996aaSopenharmony_ci            ohos_sdk_check_directories = sdk_delivery_list['ohos']['checkDirectories']
525f9996aaSopenharmony_ci            sdk_check_files.extend(win_sdk_check_files)
535f9996aaSopenharmony_ci            sdk_check_files.extend(ohos_sdk_check_files)
545f9996aaSopenharmony_ci            sdk_check_directories.extend(win_sdk_check_directories)
555f9996aaSopenharmony_ci            sdk_check_directories.extend(ohos_sdk_check_directories)
565f9996aaSopenharmony_ci        elif sdk_platform == 'win':
575f9996aaSopenharmony_ci            sdk_check_files = sdk_delivery_list['windows']['checkFiles']
585f9996aaSopenharmony_ci            sdk_check_directories = sdk_delivery_list['windows']['checkDirectories']
595f9996aaSopenharmony_ci        elif sdk_platform == 'linux':
605f9996aaSopenharmony_ci            sdk_check_files = sdk_delivery_list['linux']['checkFiles']
615f9996aaSopenharmony_ci            sdk_check_directories = sdk_delivery_list['linux']['checkDirectories']
625f9996aaSopenharmony_ci        elif sdk_platform == 'ohos':
635f9996aaSopenharmony_ci            sdk_check_files = sdk_delivery_list['ohos']['checkFiles']
645f9996aaSopenharmony_ci            sdk_check_directories = sdk_delivery_list['ohos']['checkDirectories']
655f9996aaSopenharmony_ci    else:
665f9996aaSopenharmony_ci        sdk_check_files = sdk_delivery_list['darwin']['checkFiles']
675f9996aaSopenharmony_ci        sdk_check_directories = sdk_delivery_list['darwin']['checkDirectories']
685f9996aaSopenharmony_ci
695f9996aaSopenharmony_ci    return sdk_check_files, sdk_check_directories
705f9996aaSopenharmony_ci
715f9996aaSopenharmony_ci
725f9996aaSopenharmony_cidef add_files_to_sdk_package(sdk_package_directory: dict, compressed_file: str):
735f9996aaSopenharmony_ci    archive_file = os.path.join(sdk_package_directory, compressed_file)
745f9996aaSopenharmony_ci    is_zipfile = zipfile.is_zipfile(archive_file)
755f9996aaSopenharmony_ci    if is_zipfile:
765f9996aaSopenharmony_ci        sdk_package_path = sdk_package_directory[sdk_package_directory.find(product_name) + len(product_name) + 1:]
775f9996aaSopenharmony_ci        zip_file = zipfile.ZipFile(archive_file, 'r')
785f9996aaSopenharmony_ci        global sdk_package_list
795f9996aaSopenharmony_ci        zip_file_path = []
805f9996aaSopenharmony_ci        zip_file_namelist = zip_file.namelist()
815f9996aaSopenharmony_ci        for zip_file in zip_file_namelist:
825f9996aaSopenharmony_ci            zip_file_path.append(os.path.join(sdk_package_path, zip_file))
835f9996aaSopenharmony_ci        sdk_package_list.extend(zip_file_path)
845f9996aaSopenharmony_ci    else:
855f9996aaSopenharmony_ci        raise Exception("Error: {} is not zip".format(archive_file))
865f9996aaSopenharmony_ci
875f9996aaSopenharmony_ci
885f9996aaSopenharmony_cidef get_sdk_package_directories():
895f9996aaSopenharmony_ci    if sys.platform == 'linux':
905f9996aaSopenharmony_ci        if sdk_platform == 'default':
915f9996aaSopenharmony_ci            os_types = ['linux', 'windows', 'ohos']
925f9996aaSopenharmony_ci        elif sdk_platform == 'win':
935f9996aaSopenharmony_ci            os_types = ['windows']
945f9996aaSopenharmony_ci        elif sdk_platform == 'linux':
955f9996aaSopenharmony_ci            os_types = ['linux']
965f9996aaSopenharmony_ci        elif sdk_platform == 'ohos':
975f9996aaSopenharmony_ci            os_types = ['ohos']
985f9996aaSopenharmony_ci    else:
995f9996aaSopenharmony_ci        os_types = ['darwin']
1005f9996aaSopenharmony_ci
1015f9996aaSopenharmony_ci    cur_path = os.path.dirname(os.path.realpath(__file__))
1025f9996aaSopenharmony_ci    sdk_package_location_prefix = cur_path[0:cur_path.find('build')]
1035f9996aaSopenharmony_ci    sdk_package_directories = []
1045f9996aaSopenharmony_ci
1055f9996aaSopenharmony_ci    for os_type in os_types:
1065f9996aaSopenharmony_ci        sdk_package_directories.append(os.path.join(sdk_package_location_prefix, sdk_package_location, os_type))
1075f9996aaSopenharmony_ci    for sdk_package_directory in sdk_package_directories:
1085f9996aaSopenharmony_ci        if not os.path.exists(sdk_package_directory):
1095f9996aaSopenharmony_ci            raise Exception("Error: directory {} not exits!".format(sdk_package_directory))
1105f9996aaSopenharmony_ci
1115f9996aaSopenharmony_ci    return sdk_package_directories
1125f9996aaSopenharmony_ci
1135f9996aaSopenharmony_ci
1145f9996aaSopenharmony_cidef get_all_sdk_package_list():
1155f9996aaSopenharmony_ci    global sdk_package_list
1165f9996aaSopenharmony_ci    compressed_file_dict = {}
1175f9996aaSopenharmony_ci    sdk_package_directories = get_sdk_package_directories()
1185f9996aaSopenharmony_ci    for sdk_package_directory in sdk_package_directories:
1195f9996aaSopenharmony_ci        for file_name in os.listdir(sdk_package_directory):
1205f9996aaSopenharmony_ci            if file_name.endswith(".zip") and file_name.find(sdk_version) != -1:
1215f9996aaSopenharmony_ci                compressed_file_dict.setdefault(sdk_package_directory, []).append(file_name)
1225f9996aaSopenharmony_ci        if sdk_package_directory in compressed_file_dict.keys():
1235f9996aaSopenharmony_ci            for compressed_file in compressed_file_dict[sdk_package_directory]:
1245f9996aaSopenharmony_ci                add_files_to_sdk_package(sdk_package_directory, compressed_file)
1255f9996aaSopenharmony_ci        else:
1265f9996aaSopenharmony_ci            raise Exception("Error: {} not in {}, please check.".format(sdk_package_directory, compressed_file_dict))
1275f9996aaSopenharmony_ci
1285f9996aaSopenharmony_ci    return sdk_package_list
1295f9996aaSopenharmony_ci
1305f9996aaSopenharmony_ci
1315f9996aaSopenharmony_cidef get_redundant_set(sdk_check_list: list):
1325f9996aaSopenharmony_ci    outside_the_list_set = set()
1335f9996aaSopenharmony_ci    sdk_check_files, sdk_check_directories = parse_sdk_check_list(sdk_check_list)
1345f9996aaSopenharmony_ci    sdk_list_set = set(sdk_check_files)
1355f9996aaSopenharmony_ci    sym_intersection = sdk_package_set.symmetric_difference(sdk_list_set)
1365f9996aaSopenharmony_ci    remove_check_from_package_set = sdk_package_set.intersection(sym_intersection)
1375f9996aaSopenharmony_ci    sdk_directorys_tuple = tuple(map(str, sdk_check_directories))
1385f9996aaSopenharmony_ci    for file in remove_check_from_package_set:
1395f9996aaSopenharmony_ci        if not file.startswith(sdk_directorys_tuple):
1405f9996aaSopenharmony_ci            outside_the_list_set.add(file)
1415f9996aaSopenharmony_ci
1425f9996aaSopenharmony_ci    return outside_the_list_set
1435f9996aaSopenharmony_ci
1445f9996aaSopenharmony_ci
1455f9996aaSopenharmony_cidef get_unpacked_directories(sdk_check_list: list):
1465f9996aaSopenharmony_ci    sdk_check_directories = parse_sdk_check_list(sdk_check_list)[1]
1475f9996aaSopenharmony_ci    sdk_check_directories_set = set(sdk_check_directories)
1485f9996aaSopenharmony_ci    for directory in sdk_check_directories:
1495f9996aaSopenharmony_ci        for file in sdk_package_list:
1505f9996aaSopenharmony_ci            if file.startswith(directory):
1515f9996aaSopenharmony_ci                sdk_check_directories_set.discard(directory)
1525f9996aaSopenharmony_ci                break
1535f9996aaSopenharmony_ci
1545f9996aaSopenharmony_ci    return sdk_check_directories_set
1555f9996aaSopenharmony_ci
1565f9996aaSopenharmony_ci
1575f9996aaSopenharmony_cidef get_missing_set(sdk_check_list: list):
1585f9996aaSopenharmony_ci    sdk_list_set = set(parse_sdk_check_list(sdk_check_list)[0])
1595f9996aaSopenharmony_ci    sym_intersection = sdk_package_set.symmetric_difference(sdk_list_set)
1605f9996aaSopenharmony_ci    missing_set = sdk_list_set.intersection(sym_intersection)
1615f9996aaSopenharmony_ci    sdk_unpacked_directories = get_unpacked_directories(sdk_check_list)
1625f9996aaSopenharmony_ci    if len(sdk_unpacked_directories) != 0:
1635f9996aaSopenharmony_ci        for directory in sdk_unpacked_directories:
1645f9996aaSopenharmony_ci            missing_set.add(directory)
1655f9996aaSopenharmony_ci
1665f9996aaSopenharmony_ci    return missing_set
1675f9996aaSopenharmony_ci
1685f9996aaSopenharmony_ci
1695f9996aaSopenharmony_cidef output_the_verification_result(sdk_check_list: list):
1705f9996aaSopenharmony_ci    sdk_package_missing_set = get_missing_set(sdk_check_list)
1715f9996aaSopenharmony_ci    sdk_package_redundant_set = get_redundant_set(sdk_check_list)
1725f9996aaSopenharmony_ci
1735f9996aaSopenharmony_ci    if len(sdk_package_missing_set) == 0 and len(sdk_package_redundant_set) == 0:
1745f9996aaSopenharmony_ci        print("package and verify successful!")
1755f9996aaSopenharmony_ci    else:
1765f9996aaSopenharmony_ci        if len(sdk_package_missing_set) != 0 and len(sdk_package_redundant_set) != 0:
1775f9996aaSopenharmony_ci            print("SDK package is less than SDK delivery list, missing: {}.".format(sdk_package_missing_set))
1785f9996aaSopenharmony_ci            print("SDK package is more than SDK delivery list, extra: {}.".format(sdk_package_redundant_set))
1795f9996aaSopenharmony_ci            sys.exit(1)
1805f9996aaSopenharmony_ci        elif len(sdk_package_missing_set) != 0:
1815f9996aaSopenharmony_ci            print("SDK package is less than SDK delivery list, missing: {}.".format(sdk_package_missing_set))
1825f9996aaSopenharmony_ci            sys.exit(1)
1835f9996aaSopenharmony_ci        else:
1845f9996aaSopenharmony_ci            print("SDK package is more than SDK delivery list, extra: {}.".format(sdk_package_redundant_set))
1855f9996aaSopenharmony_ci            sys.exit(1)
1865f9996aaSopenharmony_ci
1875f9996aaSopenharmony_ci
1885f9996aaSopenharmony_cidef main():
1895f9996aaSopenharmony_ci    parser = argparse.ArgumentParser()
1905f9996aaSopenharmony_ci    parser.add_argument('--sdk-delivery-list')
1915f9996aaSopenharmony_ci    parser.add_argument('root_build_dir')
1925f9996aaSopenharmony_ci    parser.add_argument('--sdk-archive-dir')
1935f9996aaSopenharmony_ci    parser.add_argument('product_name')
1945f9996aaSopenharmony_ci    parser.add_argument('sdk_version')
1955f9996aaSopenharmony_ci    parser.add_argument('--sdk-platform')
1965f9996aaSopenharmony_ci    options = parser.parse_args()
1975f9996aaSopenharmony_ci
1985f9996aaSopenharmony_ci    sdk_check_list = options.sdk_delivery_list
1995f9996aaSopenharmony_ci    root_build_directory = options.root_build_dir[2:]
2005f9996aaSopenharmony_ci    global sdk_package_location
2015f9996aaSopenharmony_ci    sdk_package_location = os.path.join(root_build_directory, options.sdk_archive_dir)
2025f9996aaSopenharmony_ci    global product_name
2035f9996aaSopenharmony_ci    product_name = options.product_name
2045f9996aaSopenharmony_ci    global sdk_version
2055f9996aaSopenharmony_ci    sdk_version = options.sdk_version
2065f9996aaSopenharmony_ci    global sdk_platform
2075f9996aaSopenharmony_ci    sdk_platform = options.sdk_platform
2085f9996aaSopenharmony_ci
2095f9996aaSopenharmony_ci    global sdk_package_set
2105f9996aaSopenharmony_ci    sdk_package_set = set(get_all_sdk_package_list())
2115f9996aaSopenharmony_ci    output_the_verification_result(sdk_check_list)
2125f9996aaSopenharmony_ci
2135f9996aaSopenharmony_ci
2145f9996aaSopenharmony_ciif __name__ == '__main__':
2155f9996aaSopenharmony_ci    sys.exit(main())
216