131c75014Sopenharmony_ci#!/usr/bin/env python
231c75014Sopenharmony_ci# -*- coding: utf-8 -*-
331c75014Sopenharmony_ci"""
431c75014Sopenharmony_ciCopyright (c) 2020-2021 Huawei Device Co., Ltd.
531c75014Sopenharmony_ciLicensed under the Apache License, Version 2.0 (the "License");
631c75014Sopenharmony_ciyou may not use this file except in compliance with the License.
731c75014Sopenharmony_ciYou may obtain a copy of the License at
831c75014Sopenharmony_ci
931c75014Sopenharmony_ci  http://www.apache.org/licenses/LICENSE-2.0
1031c75014Sopenharmony_ci
1131c75014Sopenharmony_ciUnless required by applicable law or agreed to in writing, software
1231c75014Sopenharmony_cidistributed under the License is distributed on an "AS IS" BASIS,
1331c75014Sopenharmony_ciWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1431c75014Sopenharmony_ciSee the License for the specific language governing permissions and
1531c75014Sopenharmony_cilimitations under the License.
1631c75014Sopenharmony_ci"""
1731c75014Sopenharmony_ci
1831c75014Sopenharmony_ciimport os
1931c75014Sopenharmony_ciimport fnmatch
2031c75014Sopenharmony_ciimport sys
2131c75014Sopenharmony_ciimport argparse
2231c75014Sopenharmony_ciimport distutils.dir_util as dir_util
2331c75014Sopenharmony_ciimport distutils.file_util as file_util
2431c75014Sopenharmony_ciimport json
2531c75014Sopenharmony_ciimport subprocess
2631c75014Sopenharmony_ci
2731c75014Sopenharmony_ci# all sub system list, must be lowercase.
2831c75014Sopenharmony_ci_SUB_SYSTEM_LIST = [
2931c75014Sopenharmony_ci    "kernel",
3031c75014Sopenharmony_ci    "hiviewdfx",
3131c75014Sopenharmony_ci    "communication",
3231c75014Sopenharmony_ci    "security",
3331c75014Sopenharmony_ci    "updater",
3431c75014Sopenharmony_ci    "sstsutils",
3531c75014Sopenharmony_ci    "utils",
3631c75014Sopenharmony_ci    "uikit",
3731c75014Sopenharmony_ci    "multimedia",
3831c75014Sopenharmony_ci    "hdf",
3931c75014Sopenharmony_ci    "appexecfwk",
4031c75014Sopenharmony_ci    "distributedschedule",
4131c75014Sopenharmony_ci    "startup",
4231c75014Sopenharmony_ci    "sensors",
4331c75014Sopenharmony_ci    "sample",
4431c75014Sopenharmony_ci    "iothardware",
4531c75014Sopenharmony_ci    "open_posix_testsuite",
4631c75014Sopenharmony_ci    "validator"
4731c75014Sopenharmony_ci]
4831c75014Sopenharmony_ci_GRADLE_PARAMS = ["SIGN_USER_NAME", "SIGN_PWD", "SIGN_MATERIAL_PATH",
4931c75014Sopenharmony_ci                 "SIGN_PROFILE", "SIGN_CERT_FILE"]
5031c75014Sopenharmony_ci
5131c75014Sopenharmony_ci_DEFAULT_USER_NAME = "user"
5231c75014Sopenharmony_ci_DEFAULT_PWD = "decrypt_pwd"
5331c75014Sopenharmony_ci
5431c75014Sopenharmony_ci
5531c75014Sopenharmony_cidef main():
5631c75014Sopenharmony_ci    parser = argparse.ArgumentParser()
5731c75014Sopenharmony_ci    parser.add_argument('--method_name', help='', required=True)
5831c75014Sopenharmony_ci    parser.add_argument('--arguments', help='',
5931c75014Sopenharmony_ci                        required=True)  # format key=value#key=value
6031c75014Sopenharmony_ci    args = parser.parse_args()
6131c75014Sopenharmony_ci    this_module = sys.modules[__name__]
6231c75014Sopenharmony_ci    method = getattr(this_module, args.method_name)
6331c75014Sopenharmony_ci    arguments = {}
6431c75014Sopenharmony_ci    for argument in args.arguments.split("#"):
6531c75014Sopenharmony_ci        key_value = argument.strip().split("=")
6631c75014Sopenharmony_ci        if len(key_value) != 2:
6731c75014Sopenharmony_ci            raise ValueError("Wrong format : '%s' % argument")
6831c75014Sopenharmony_ci        arguments.setdefault(key_value[0].strip(), key_value[1].strip())
6931c75014Sopenharmony_ci    method(**arguments)
7031c75014Sopenharmony_ci    return 0
7131c75014Sopenharmony_ci
7231c75014Sopenharmony_ci
7331c75014Sopenharmony_cidef read_file(input_file):
7431c75014Sopenharmony_ci    if not os.path.exists(input_file):
7531c75014Sopenharmony_ci        return ""
7631c75014Sopenharmony_ci
7731c75014Sopenharmony_ci    with open(input_file, 'r') as input_f:
7831c75014Sopenharmony_ci        content = input_f.read().strip()
7931c75014Sopenharmony_ci        return content
8031c75014Sopenharmony_ci
8131c75014Sopenharmony_ci
8231c75014Sopenharmony_cidef write_file(output_file, content, append):
8331c75014Sopenharmony_ci    file_dir = os.path.dirname(os.path.abspath(output_file))
8431c75014Sopenharmony_ci    if not os.path.exists(file_dir):
8531c75014Sopenharmony_ci        os.makedirs(file_dir)
8631c75014Sopenharmony_ci    mode = 'a+' if append else 'w'
8731c75014Sopenharmony_ci    with open(output_file, mode) as output_f:
8831c75014Sopenharmony_ci        output_f.write("%s\n" % content)
8931c75014Sopenharmony_ci
9031c75014Sopenharmony_ci
9131c75014Sopenharmony_cidef copy_file(output, sources="", source_dirs="", to_dir=True):
9231c75014Sopenharmony_ci    """
9331c75014Sopenharmony_ci    copy source files or source dir to output.
9431c75014Sopenharmony_ci    if sources is not empty, the output can be file(will be created
9531c75014Sopenharmony_ci    automatically)
9631c75014Sopenharmony_ci    or directory(must be exist).
9731c75014Sopenharmony_ci    :param output: If source_dirs is not empty, output must be directory.
9831c75014Sopenharmony_ci    :param sources: source files is separated by dot
9931c75014Sopenharmony_ci    :param source_dirs: source directory is separated by dot
10031c75014Sopenharmony_ci    :param to_dir: output is directory or not
10131c75014Sopenharmony_ci    :return:
10231c75014Sopenharmony_ci    """
10331c75014Sopenharmony_ci    if not sources and not source_dirs:
10431c75014Sopenharmony_ci        raise Exception(
10531c75014Sopenharmony_ci            "sources or source_dirs parameter must be specified one")
10631c75014Sopenharmony_ci    _output = output.strip()
10731c75014Sopenharmony_ci    _sources = sources.strip()
10831c75014Sopenharmony_ci    _source_dirs = source_dirs.strip()
10931c75014Sopenharmony_ci    _parent_output = os.path.dirname(_output)
11031c75014Sopenharmony_ci    try:
11131c75014Sopenharmony_ci        if to_dir and not os.path.exists(_output):
11231c75014Sopenharmony_ci            os.makedirs(_output)
11331c75014Sopenharmony_ci        if not to_dir and not os.path.exists(_parent_output):
11431c75014Sopenharmony_ci            os.makedirs(_parent_output)
11531c75014Sopenharmony_ci    except OSError:
11631c75014Sopenharmony_ci        if not os.path.isdir(_output):
11731c75014Sopenharmony_ci            raise
11831c75014Sopenharmony_ci    if _sources:
11931c75014Sopenharmony_ci        _copy_files(_sources.split(","), _output)
12031c75014Sopenharmony_ci
12131c75014Sopenharmony_ci    if _source_dirs:
12231c75014Sopenharmony_ci        _copy_dir(_source_dirs.split(","), _output)
12331c75014Sopenharmony_ci
12431c75014Sopenharmony_ci    return 0
12531c75014Sopenharmony_ci
12631c75014Sopenharmony_ci
12731c75014Sopenharmony_cidef _copy_files(sources, output):
12831c75014Sopenharmony_ci    for source_file in sources:
12931c75014Sopenharmony_ci        source_file = source_file.strip()
13031c75014Sopenharmony_ci        if os.path.isfile(source_file):
13131c75014Sopenharmony_ci            file_util.copy_file(source_file, output)
13231c75014Sopenharmony_ci
13331c75014Sopenharmony_ci
13431c75014Sopenharmony_cidef _copy_dir(sources, output):
13531c75014Sopenharmony_ci    for source_file in sources:
13631c75014Sopenharmony_ci        source_file = source_file.strip()
13731c75014Sopenharmony_ci        if os.path.isdir(source_file):
13831c75014Sopenharmony_ci            dir_util.copy_tree(source_file, output)
13931c75014Sopenharmony_ci
14031c75014Sopenharmony_ci
14131c75014Sopenharmony_cidef gen_suite_out(suite_output_prefix, suite_names, out_suffix):
14231c75014Sopenharmony_ci    outputs = []
14331c75014Sopenharmony_ci    _suite_output_prefix = suite_output_prefix.strip()
14431c75014Sopenharmony_ci    _dirname_suffix = out_suffix.strip().rstrip(os.sep)
14531c75014Sopenharmony_ci    for suite in suite_names.split(","):
14631c75014Sopenharmony_ci        path = "%s%s/%s" % (
14731c75014Sopenharmony_ci            _suite_output_prefix, suite.strip(), _dirname_suffix)
14831c75014Sopenharmony_ci        outputs.append(path)
14931c75014Sopenharmony_ci        print(path)
15031c75014Sopenharmony_ci    return outputs
15131c75014Sopenharmony_ci
15231c75014Sopenharmony_ci
15331c75014Sopenharmony_cidef get_subsystem_name(path):
15431c75014Sopenharmony_ci    subsystem_name = ""
15531c75014Sopenharmony_ci    for subsystem in _SUB_SYSTEM_LIST:
15631c75014Sopenharmony_ci        subsystem_path = "/%s/" % (subsystem)
15731c75014Sopenharmony_ci        _path = path.lower()
15831c75014Sopenharmony_ci        if subsystem_path in _path:
15931c75014Sopenharmony_ci            subsystem_name = subsystem
16031c75014Sopenharmony_ci            break
16131c75014Sopenharmony_ci        subsystem_path = "/%s/_lite" % (subsystem)
16231c75014Sopenharmony_ci        if subsystem_path in _path:
16331c75014Sopenharmony_ci            subsystem_name = subsystem
16431c75014Sopenharmony_ci            break
16531c75014Sopenharmony_ci    sys.stdout.write(subsystem_name)
16631c75014Sopenharmony_ci    return subsystem_name
16731c75014Sopenharmony_ci
16831c75014Sopenharmony_ci
16931c75014Sopenharmony_cidef get_modulename_by_buildtarget(module_list_file, build_target):
17031c75014Sopenharmony_ci    if not os.path.exists(module_list_file):
17131c75014Sopenharmony_ci        return ""
17231c75014Sopenharmony_ci    module_info_data = {}
17331c75014Sopenharmony_ci    with open(module_list_file, "r") as module_file:
17431c75014Sopenharmony_ci        module_info_data = json.load(module_file)
17531c75014Sopenharmony_ci    for module in module_info_data:
17631c75014Sopenharmony_ci        if module_info_data[module]["build_target_name"] == build_target:
17731c75014Sopenharmony_ci            sys.stdout.write(module)
17831c75014Sopenharmony_ci            return module
17931c75014Sopenharmony_ci    return ""
18031c75014Sopenharmony_ci
18131c75014Sopenharmony_ci
18231c75014Sopenharmony_cidef glob(path, filename_pattern):
18331c75014Sopenharmony_ci    files = []
18431c75014Sopenharmony_ci    for dir_path, _, files in os.walk(path):
18531c75014Sopenharmony_ci        for filename in fnmatch.filter(files, filename_pattern):
18631c75014Sopenharmony_ci            files.append(os.path.join(dir_path, filename))
18731c75014Sopenharmony_ci    return files
18831c75014Sopenharmony_ci
18931c75014Sopenharmony_ci
19031c75014Sopenharmony_cidef cmd_popen(cmd):
19131c75014Sopenharmony_ci    proc = subprocess.Popen(cmd)
19231c75014Sopenharmony_ci    proc.wait()
19331c75014Sopenharmony_ci    ret_code = proc.returncode
19431c75014Sopenharmony_ci    if ret_code != 0:
19531c75014Sopenharmony_ci        raise Exception("{} failed, return code is {}".format(cmd, ret_code))
19631c75014Sopenharmony_ci
19731c75014Sopenharmony_ci
19831c75014Sopenharmony_cidef build_js_hap(**kwargs):
19931c75014Sopenharmony_ci    if not check_env():
20031c75014Sopenharmony_ci        return
20131c75014Sopenharmony_ci    if "project_path" not in kwargs or "out_put_dir" not in kwargs:
20231c75014Sopenharmony_ci        return
20331c75014Sopenharmony_ci    project_path = kwargs.get("project_path")
20431c75014Sopenharmony_ci    gradle_dir = os.path.join(project_path, "gradle")
20531c75014Sopenharmony_ci    os.chdir(gradle_dir)
20631c75014Sopenharmony_ci    build_clean = ["gradle", "clean"]
20731c75014Sopenharmony_ci    cmd_popen(build_clean)
20831c75014Sopenharmony_ci    if "SIGN_USER_NAME" not in kwargs:
20931c75014Sopenharmony_ci        pass
21031c75014Sopenharmony_ci
21131c75014Sopenharmony_ci    gradle_parm_cmd = get_gradle_cmd(**kwargs)
21231c75014Sopenharmony_ci    # build sign debug hap
21331c75014Sopenharmony_ci    build_hap_cmd = ["gradle"]
21431c75014Sopenharmony_ci    build_hap_cmd.extend(gradle_parm_cmd)
21531c75014Sopenharmony_ci    build_hap_cmd.append("entry:aD")
21631c75014Sopenharmony_ci    cmd_popen(build_hap_cmd)
21731c75014Sopenharmony_ci
21831c75014Sopenharmony_ci    # build sign ohos test hap
21931c75014Sopenharmony_ci    build_test_hap_cmd = ["gradle"]
22031c75014Sopenharmony_ci    build_test_hap_cmd.extend(gradle_parm_cmd)
22131c75014Sopenharmony_ci    build_test_hap_cmd.append("entry:aDOT")
22231c75014Sopenharmony_ci    cmd_popen(build_test_hap_cmd)
22331c75014Sopenharmony_ci
22431c75014Sopenharmony_ci    gradle_output_dir = os.path.join(gradle_dir, "entry", "build", "outputs")
22531c75014Sopenharmony_ci    if not os.path.exists(gradle_output_dir):
22631c75014Sopenharmony_ci        return
22731c75014Sopenharmony_ci    out_put_dir = kwargs.get("out_put_dir")
22831c75014Sopenharmony_ci    if not os.path.exists(out_put_dir):
22931c75014Sopenharmony_ci        os.makedirs(out_put_dir)
23031c75014Sopenharmony_ci    hap_name = kwargs.get("hap_name")
23131c75014Sopenharmony_ci    for root, _, files in os.walk(gradle_output_dir):
23231c75014Sopenharmony_ci        for file in files:
23331c75014Sopenharmony_ci            if file.endswith(".hap") and "unsigned" not in file:
23431c75014Sopenharmony_ci                if "debugOhosTest" in root:
23531c75014Sopenharmony_ci                    target_file = "{}_OhosTest.hap".format(hap_name)
23631c75014Sopenharmony_ci                else:
23731c75014Sopenharmony_ci                    target_file = "{}.hap".format(hap_name)
23831c75014Sopenharmony_ci                file_util.copy_file(os.path.join(root, file),
23931c75014Sopenharmony_ci                                    os.path.join(out_put_dir.rstrip(','),
24031c75014Sopenharmony_ci                                                 target_file))
24131c75014Sopenharmony_ci
24231c75014Sopenharmony_ci
24331c75014Sopenharmony_cidef get_gradle_cmd(**kwargs):
24431c75014Sopenharmony_ci    cmd = []
24531c75014Sopenharmony_ci    if kwargs:
24631c75014Sopenharmony_ci        kwargs.setdefault("SIGN_USER_NAME", _DEFAULT_USER_NAME)
24731c75014Sopenharmony_ci        kwargs.setdefault("SIGN_PWD", _DEFAULT_PWD)
24831c75014Sopenharmony_ci    for param in _GRADLE_PARAMS:
24931c75014Sopenharmony_ci        if param in kwargs:
25031c75014Sopenharmony_ci            cmd.append("-P{}={}".format(param, kwargs.get(param)))
25131c75014Sopenharmony_ci    return cmd
25231c75014Sopenharmony_ci
25331c75014Sopenharmony_ci
25431c75014Sopenharmony_cidef check_env():
25531c75014Sopenharmony_ci    """
25631c75014Sopenharmony_ci    check all the env for js hap build
25731c75014Sopenharmony_ci    return: return true if all env ready, otherwise return false
25831c75014Sopenharmony_ci    """
25931c75014Sopenharmony_ci    env_list = ['OHOS_SDK_HOME']
26031c75014Sopenharmony_ci    for env in env_list:
26131c75014Sopenharmony_ci        if not os.environ.get(env):
26231c75014Sopenharmony_ci            print("the env {} not set, skip build!".format(env))
26331c75014Sopenharmony_ci            return False
26431c75014Sopenharmony_ci    else:
26531c75014Sopenharmony_ci        return True
26631c75014Sopenharmony_ci
26731c75014Sopenharmony_ci
26831c75014Sopenharmony_ciif __name__ == '__main__':
26931c75014Sopenharmony_ci    sys.exit(main())
270