#!/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())