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