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