• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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