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