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