15f9996aaSopenharmony_ci#!/usr/bin/env python 25f9996aaSopenharmony_ci# -*- coding: utf-8 -*- 35f9996aaSopenharmony_ci 45f9996aaSopenharmony_ci# 55f9996aaSopenharmony_ci# Copyright (c) 2020 Huawei Device Co., Ltd. 65f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 75f9996aaSopenharmony_ci# you may not use this file except in compliance with the License. 85f9996aaSopenharmony_ci# You may obtain a copy of the License at 95f9996aaSopenharmony_ci# 105f9996aaSopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 115f9996aaSopenharmony_ci# 125f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software 135f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 145f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 155f9996aaSopenharmony_ci# See the License for the specific language governing permissions and 165f9996aaSopenharmony_ci# limitations under the License. 175f9996aaSopenharmony_ci# 185f9996aaSopenharmony_ci 195f9996aaSopenharmony_ciimport os 205f9996aaSopenharmony_ciimport collections 215f9996aaSopenharmony_ciimport subprocess 225f9996aaSopenharmony_ciimport shutil 235f9996aaSopenharmony_ciimport sys 245f9996aaSopenharmony_ciimport json 255f9996aaSopenharmony_ci 265f9996aaSopenharmony_ci 275f9996aaSopenharmony_cidef encode(data, encoding: str = 'utf-8'): 285f9996aaSopenharmony_ci if sys.version_info.major == 2: 295f9996aaSopenharmony_ci return data.encode(encoding) 305f9996aaSopenharmony_ci return data 315f9996aaSopenharmony_ci 325f9996aaSopenharmony_ci 335f9996aaSopenharmony_cidef decode(data, encoding: str = 'utf-8'): 345f9996aaSopenharmony_ci if sys.version_info.major == 2: 355f9996aaSopenharmony_ci return data.decode(encoding) 365f9996aaSopenharmony_ci return data 375f9996aaSopenharmony_ci 385f9996aaSopenharmony_ci 395f9996aaSopenharmony_cidef remove_path(path): 405f9996aaSopenharmony_ci if os.path.exists(path): 415f9996aaSopenharmony_ci shutil.rmtree(path) 425f9996aaSopenharmony_ci 435f9996aaSopenharmony_ci 445f9996aaSopenharmony_ci# Read json file data 455f9996aaSopenharmony_cidef read_json_file(input_file: str): 465f9996aaSopenharmony_ci if not os.path.exists(input_file): 475f9996aaSopenharmony_ci print('file [{}] no exist.'.format(input_file)) 485f9996aaSopenharmony_ci return None 495f9996aaSopenharmony_ci data = None 505f9996aaSopenharmony_ci with open(input_file, 'rb') as input_f: 515f9996aaSopenharmony_ci data = json.load(input_f) 525f9996aaSopenharmony_ci return data 535f9996aaSopenharmony_ci 545f9996aaSopenharmony_ci 555f9996aaSopenharmony_cidef exec_command(cmd: str, log_path: str = 'out/build.log', **kwargs): 565f9996aaSopenharmony_ci with open(log_path, 'at', encoding='utf-8') as log_file: 575f9996aaSopenharmony_ci process = subprocess.Popen(cmd, 585f9996aaSopenharmony_ci stdout=subprocess.PIPE, 595f9996aaSopenharmony_ci stderr=subprocess.PIPE, 605f9996aaSopenharmony_ci encoding='utf-8', 615f9996aaSopenharmony_ci **kwargs) 625f9996aaSopenharmony_ci for line in iter(process.stdout.readline, ''): 635f9996aaSopenharmony_ci sys.stdout.write(line) 645f9996aaSopenharmony_ci log_file.write(line) 655f9996aaSopenharmony_ci 665f9996aaSopenharmony_ci process.wait() 675f9996aaSopenharmony_ci ret_code = process.returncode 685f9996aaSopenharmony_ci 695f9996aaSopenharmony_ci if ret_code != 0: 705f9996aaSopenharmony_ci with open(log_path, 'at', encoding='utf-8') as log_file: 715f9996aaSopenharmony_ci for line in iter(process.stderr.readline, ''): 725f9996aaSopenharmony_ci sys.stdout.write(line) 735f9996aaSopenharmony_ci log_file.write(line) 745f9996aaSopenharmony_ci print('you can check build log in {}'.format(log_path)) 755f9996aaSopenharmony_ci raise Exception("{} failed, return code is {}".format(cmd, ret_code)) 765f9996aaSopenharmony_ci 775f9996aaSopenharmony_ci 785f9996aaSopenharmony_cidef check_output(cmd: str, **kwargs): 795f9996aaSopenharmony_ci try: 805f9996aaSopenharmony_ci ret = subprocess.check_output(cmd, 815f9996aaSopenharmony_ci stderr=subprocess.STDOUT, 825f9996aaSopenharmony_ci universal_newlines=True, 835f9996aaSopenharmony_ci **kwargs) 845f9996aaSopenharmony_ci except subprocess.CalledProcessError as e: 855f9996aaSopenharmony_ci ret = e.output 865f9996aaSopenharmony_ci raise Exception("{} failed, failed log is {}".format(cmd, ret)) 875f9996aaSopenharmony_ci 885f9996aaSopenharmony_ci return ret 895f9996aaSopenharmony_ci 905f9996aaSopenharmony_ci 915f9996aaSopenharmony_cidef makedirs(path: str, exist_ok: bool = True): 925f9996aaSopenharmony_ci try: 935f9996aaSopenharmony_ci os.makedirs(path, exist_ok=True) 945f9996aaSopenharmony_ci except OSError: 955f9996aaSopenharmony_ci if not os.path.isdir(path): 965f9996aaSopenharmony_ci raise Exception("{} makedirs failed".format(path)) 975f9996aaSopenharmony_ci if not exist_ok: 985f9996aaSopenharmony_ci raise Exception("{} exists, makedirs failed".format(path)) 995f9996aaSopenharmony_ci 1005f9996aaSopenharmony_ci 1015f9996aaSopenharmony_ciclass CallbackDict(object): 1025f9996aaSopenharmony_ci handlers = None 1035f9996aaSopenharmony_ci 1045f9996aaSopenharmony_ci def __init__(self): 1055f9996aaSopenharmony_ci self.handlers = collections.defaultdict(list) 1065f9996aaSopenharmony_ci 1075f9996aaSopenharmony_ci def register(self, event, callback): 1085f9996aaSopenharmony_ci self.handlers[event].append(callback) 1095f9996aaSopenharmony_ci 1105f9996aaSopenharmony_ci def excute(self, event, **kwargs): 1115f9996aaSopenharmony_ci if event not in self.handlers: 1125f9996aaSopenharmony_ci raise Exception('{} not found in callback dict'.format(event)) 1135f9996aaSopenharmony_ci for handler in self.handlers.get(event, []): 1145f9996aaSopenharmony_ci handler(**kwargs) 115