1#!/usr/bin/env python 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 json 17import os 18import sys 19import zipfile 20import argparse 21import time 22import platform 23 24sys.path.append( 25 os.path.dirname( 26 os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) 27from scripts.util.file_utils import read_json_file # noqa: E402 28 29sdk_package_list = [] 30sdk_package_set = set() 31sdk_package_location = "" 32product_name = "" 33sdk_version = "" 34sdk_platform = "" 35 36 37def parse_sdk_check_list(sdk_check_list: list): 38 sdk_check_files = [] 39 sdk_check_directories = [] 40 sdk_delivery_list = read_json_file(sdk_check_list) 41 42 if sdk_delivery_list is None: 43 raise Exception("read file '{}' failed.".format(sdk_check_list)) 44 45 if sys.platform == 'linux' and platform.machine().lower() == "aarch64": 46 sdk_check_files = sdk_delivery_list['linux']['checkFiles'] 47 sdk_check_directories = sdk_delivery_list['linux']['checkDirectories'] 48 elif sys.platform == 'linux': 49 if sdk_platform == 'default': 50 sdk_check_files = sdk_delivery_list['linux']['checkFiles'] 51 sdk_check_directories = sdk_delivery_list['linux']['checkDirectories'] 52 win_sdk_check_files = sdk_delivery_list['windows']['checkFiles'] 53 win_sdk_check_directories = sdk_delivery_list['windows']['checkDirectories'] 54 ohos_sdk_check_files = sdk_delivery_list['ohos']['checkFiles'] 55 ohos_sdk_check_directories = sdk_delivery_list['ohos']['checkDirectories'] 56 sdk_check_files.extend(win_sdk_check_files) 57 sdk_check_files.extend(ohos_sdk_check_files) 58 sdk_check_directories.extend(win_sdk_check_directories) 59 sdk_check_directories.extend(ohos_sdk_check_directories) 60 else: 61 sdk_check_files = [] 62 sdk_check_directories = [] 63 if 'win' in sdk_platform: 64 win_sdk_check_files = sdk_delivery_list['windows']['checkFiles'] 65 win_sdk_check_directories = sdk_delivery_list['windows']['checkDirectories'] 66 sdk_check_files.extend(win_sdk_check_files) 67 sdk_check_directories.extend(win_sdk_check_directories) 68 if 'linux' in sdk_platform: 69 linux_sdk_check_files = sdk_delivery_list['linux']['checkFiles'] 70 linux_sdk_check_directories = sdk_delivery_list['linux']['checkDirectories'] 71 sdk_check_files.extend(linux_sdk_check_files) 72 sdk_check_directories.extend(linux_sdk_check_directories) 73 if 'ohos' in sdk_platform: 74 ohos_sdk_check_files = sdk_delivery_list['ohos']['checkFiles'] 75 ohos_sdk_check_directories = sdk_delivery_list['ohos']['checkDirectories'] 76 sdk_check_files.extend(ohos_sdk_check_files) 77 sdk_check_directories.extend(ohos_sdk_check_directories) 78 else: 79 sdk_check_files = sdk_delivery_list['darwin']['checkFiles'] 80 sdk_check_directories = sdk_delivery_list['darwin']['checkDirectories'] 81 82 return sdk_check_files, sdk_check_directories 83 84 85def add_files_to_sdk_package(sdk_package_directory: dict, compressed_file: str): 86 archive_file = os.path.join(sdk_package_directory, compressed_file) 87 is_zipfile = zipfile.is_zipfile(archive_file) 88 if is_zipfile: 89 sdk_package_path = sdk_package_directory[sdk_package_directory.find(product_name) + len(product_name) + 1:] 90 zip_file = zipfile.ZipFile(archive_file, 'r') 91 global sdk_package_list 92 zip_file_path = [] 93 zip_file_namelist = zip_file.namelist() 94 for zip_file in zip_file_namelist: 95 zip_file_path.append(os.path.join(sdk_package_path, zip_file)) 96 sdk_package_list.extend(zip_file_path) 97 else: 98 raise Exception("Error: {} is not zip".format(archive_file)) 99 100 101def get_sdk_package_directories(): 102 os_types = [] 103 if sys.platform == 'linux' and platform.machine().lower() == "aarch64": 104 os_types = ['linux'] 105 elif sys.platform == 'linux': 106 if sdk_platform == 'default': 107 os_types = ['linux', 'windows', 'ohos'] 108 if 'win' in sdk_platform: 109 os_types.append('windows') 110 if 'linux' in sdk_platform: 111 os_types.append('linux') 112 if 'ohos' in sdk_platform: 113 os_types.append('ohos') 114 else: 115 os_types = ['darwin'] 116 117 cur_path = os.path.dirname(os.path.realpath(__file__)) 118 sdk_package_location_prefix = cur_path[0:cur_path.find('build')] 119 sdk_package_directories = [] 120 121 for os_type in os_types: 122 sdk_package_directories.append(os.path.join(sdk_package_location_prefix, sdk_package_location, os_type)) 123 for sdk_package_directory in sdk_package_directories: 124 if not os.path.exists(sdk_package_directory): 125 raise Exception("Error: directory {} not exits!".format(sdk_package_directory)) 126 127 return sdk_package_directories 128 129 130def get_all_sdk_package_list(): 131 global sdk_package_list 132 compressed_file_dict = {} 133 sdk_package_directories = get_sdk_package_directories() 134 for sdk_package_directory in sdk_package_directories: 135 for file_name in os.listdir(sdk_package_directory): 136 if file_name.endswith(".zip") and file_name.find(sdk_version) != -1: 137 compressed_file_dict.setdefault(sdk_package_directory, []).append(file_name) 138 if sdk_package_directory in compressed_file_dict.keys(): 139 for compressed_file in compressed_file_dict[sdk_package_directory]: 140 add_files_to_sdk_package(sdk_package_directory, compressed_file) 141 else: 142 raise Exception("Error: {} not in {}, please check.".format(sdk_package_directory, compressed_file_dict)) 143 144 return sdk_package_list 145 146 147def get_redundant_set(sdk_check_list: list): 148 outside_the_list_set = set() 149 sdk_check_files, sdk_check_directories = parse_sdk_check_list(sdk_check_list) 150 sdk_list_set = set(sdk_check_files) 151 sym_intersection = sdk_package_set.symmetric_difference(sdk_list_set) 152 remove_check_from_package_set = sdk_package_set.intersection(sym_intersection) 153 sdk_directorys_tuple = tuple(map(str, sdk_check_directories)) 154 for file in remove_check_from_package_set: 155 if not file.startswith(sdk_directorys_tuple): 156 outside_the_list_set.add(file) 157 158 return outside_the_list_set 159 160 161def get_unpacked_directories(sdk_check_list: list): 162 sdk_check_directories = parse_sdk_check_list(sdk_check_list)[1] 163 sdk_check_directories_set = set(sdk_check_directories) 164 for directory in sdk_check_directories: 165 for file in sdk_package_list: 166 if file.startswith(directory): 167 sdk_check_directories_set.discard(directory) 168 break 169 170 return sdk_check_directories_set 171 172 173def get_missing_set(sdk_check_list: list): 174 sdk_list_set = set(parse_sdk_check_list(sdk_check_list)[0]) 175 sym_intersection = sdk_package_set.symmetric_difference(sdk_list_set) 176 missing_set = sdk_list_set.intersection(sym_intersection) 177 sdk_unpacked_directories = get_unpacked_directories(sdk_check_list) 178 if len(sdk_unpacked_directories) != 0: 179 for directory in sdk_unpacked_directories: 180 missing_set.add(directory) 181 182 return missing_set 183 184 185def output_the_verification_result(sdk_check_list: list): 186 sdk_package_missing_set = get_missing_set(sdk_check_list) 187 sdk_package_redundant_set = get_redundant_set(sdk_check_list) 188 189 if len(sdk_package_missing_set) == 0 and len(sdk_package_redundant_set) == 0: 190 print("package and verify successful!") 191 else: 192 if len(sdk_package_missing_set) != 0 and len(sdk_package_redundant_set) != 0: 193 print("SDK package is less than SDK delivery list, missing: {}.".format(sdk_package_missing_set)) 194 print("SDK package is more than SDK delivery list, extra: {}.".format(sdk_package_redundant_set)) 195 sys.exit(1) 196 elif len(sdk_package_missing_set) != 0: 197 print("SDK package is less than SDK delivery list, missing: {}.".format(sdk_package_missing_set)) 198 sys.exit(1) 199 else: 200 print("SDK package is more than SDK delivery list, extra: {}.".format(sdk_package_redundant_set)) 201 sys.exit(1) 202 203 204def main(): 205 parser = argparse.ArgumentParser() 206 parser.add_argument('--sdk-delivery-list') 207 parser.add_argument('root_build_dir') 208 parser.add_argument('--sdk-archive-dir') 209 parser.add_argument('product_name') 210 parser.add_argument('sdk_version') 211 parser.add_argument('--sdk-platform') 212 options = parser.parse_args() 213 214 sdk_check_list = options.sdk_delivery_list 215 root_build_directory = options.root_build_dir[2:] 216 global sdk_package_location 217 sdk_package_location = os.path.join(root_build_directory, options.sdk_archive_dir) 218 global product_name 219 product_name = options.product_name 220 global sdk_version 221 sdk_version = options.sdk_version 222 global sdk_platform 223 sdk_platform = options.sdk_platform 224 225 global sdk_package_set 226 sdk_package_set = set(get_all_sdk_package_list()) 227 output_the_verification_result(sdk_check_list) 228 229 230if __name__ == '__main__': 231 sys.exit(main()) 232