131 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			131 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | #!/usr/bin/env python3 | ||
|  | # -*- coding: utf-8 -*- | ||
|  | # Copyright (c) 2022 Huawei Device Co., Ltd. | ||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||
|  | # you may not use this file except in compliance with the License. | ||
|  | # You may obtain a copy of the License at | ||
|  | # | ||
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | ||
|  | # | ||
|  | # Unless required by applicable law or agreed to in writing, software | ||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
|  | # See the License for the specific language governing permissions and | ||
|  | # limitations under the License. | ||
|  | 
 | ||
|  | import argparse | ||
|  | import os | ||
|  | import sys | ||
|  | import subprocess | ||
|  | from gn_check.check_gn_online import CheckGnOnline | ||
|  | from bundle_check.bundle_check_online import BundleCheckOnline | ||
|  | from csct_online_prehandle import GiteeCsctPrehandler | ||
|  | 
 | ||
|  | 
 | ||
|  | class CsctOnline(object): | ||
|  |     """This is a component static checker online class""" | ||
|  | 
 | ||
|  |     version = "" | ||
|  |     log_verbose = False | ||
|  |     pr_list = "" | ||
|  | 
 | ||
|  |     def __init__(self, pr_list="", log_verbose=False) -> None: | ||
|  |         self.version = "0.0.1" | ||
|  |         self.pr_list = pr_list | ||
|  |         self.log_verbose = log_verbose | ||
|  | 
 | ||
|  |     def __verbose_print(self, verbose_flag, print_content): | ||
|  |         if verbose_flag is True: | ||
|  |             print(print_content) | ||
|  | 
 | ||
|  |     def __print_pretty(self, errs_info): | ||
|  |         try: | ||
|  |             from prettytable import PrettyTable | ||
|  |             print('already exist prettytable') | ||
|  |         except Exception: | ||
|  |             print('no prettytable') | ||
|  |             ret = subprocess.Popen( | ||
|  |                 [sys.executable, "-m", "pip", "install", "prettytable"], | ||
|  |                 stdout=subprocess.PIPE, | ||
|  |                 stderr=subprocess.PIPE, | ||
|  |                 errors="replace", | ||
|  |             ) | ||
|  |             print('installing prettytable') | ||
|  |             try: | ||
|  |                 _, __ = ret.communicate() | ||
|  |                 print('prettytable installed successfully') | ||
|  |                 from prettytable import PrettyTable | ||
|  |             except Exception: | ||
|  |                 print('prettytable installed failed') | ||
|  | 
 | ||
|  | 
 | ||
|  |         table = PrettyTable(["文件", "定位", "违反规则", "错误说明"]) | ||
|  |         table.add_rows(errs_info) | ||
|  |         table.align["文件"] = "l" | ||
|  |         table.align["定位"] = "l" | ||
|  |         table.align["错误说明"] = "l" | ||
|  |         info = table.get_string() | ||
|  |         print( | ||
|  |             "If you have any question, please access component static check rules:", | ||
|  |             "https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/" | ||
|  |             "subsystems/subsys-build-component-building-rules.md", | ||
|  |             "or https://gitee.com/openharmony/build/tree/master/tools/component_tools/static_check/readme.md", | ||
|  |         ) | ||
|  |         print("There are(is) {} error(s):\n".format(len(errs_info))) | ||
|  |         print(str(info)) | ||
|  | 
 | ||
|  |     def csct_check_process(self): | ||
|  |         pr_list = self.pr_list | ||
|  |         self.__verbose_print( | ||
|  |             self.log_verbose, | ||
|  |             "\nCsct check begin!\tPull request list: {}.".format(pr_list), | ||
|  |         ) | ||
|  |         csct_prehandler = GiteeCsctPrehandler( | ||
|  |             pr_list, "BUILD.gn", "bundle.json" | ||
|  |         ) | ||
|  | 
 | ||
|  |         _, gn_errs = CheckGnOnline(csct_prehandler.get_diff_dict("BUILD.gn")).output() | ||
|  |         _, bundle_errs = BundleCheckOnline.check_diff( | ||
|  |             csct_prehandler.get_diff_dict("bundle.json") | ||
|  |         ) | ||
|  | 
 | ||
|  |         errs_info = gn_errs + bundle_errs | ||
|  |         if len(errs_info) == 0: | ||
|  |             self.__verbose_print(self.log_verbose, "Result: without any errors.") | ||
|  |         else: | ||
|  |             self.__print_pretty(errs_info) | ||
|  | 
 | ||
|  |         self.__verbose_print(self.log_verbose, "Csct check end!\n") | ||
|  |         return errs_info | ||
|  | 
 | ||
|  | 
 | ||
|  | def add_options(version): | ||
|  |     parser = argparse.ArgumentParser( | ||
|  |         description=f"Component Static Check Tool Online version {version}", | ||
|  |     ) | ||
|  |     parser.add_argument( | ||
|  |         "-v", | ||
|  |         "--verbose", | ||
|  |         action="store_true", | ||
|  |         dest="verbose", | ||
|  |         default=False, | ||
|  |         help="verbose mode", | ||
|  |     ) | ||
|  |     parser.add_argument( | ||
|  |         metavar="pr_list", type=str, dest="pr_list", help="pull request url list" | ||
|  |     ) | ||
|  |     args = parser.parse_args() | ||
|  |     return args | ||
|  | 
 | ||
|  | 
 | ||
|  | def main(): | ||
|  |     csct_online = CsctOnline() | ||
|  |     args = add_options(csct_online.version) | ||
|  |     csct_online.pr_list = args.pr_list | ||
|  |     csct_online.log_verbose = args.verbose | ||
|  |     errs_info = csct_online.csct_check_process() | ||
|  | 
 | ||
|  | 
 | ||
|  | if __name__ == "__main__": | ||
|  |     sys.exit(main()) |