概述
开发命令行入口main.py
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import argparse
import logging
import os
from gx.action.publish_cmc import publish_rpm_func
from gx.data.global_vars import GlobalVars
verbose = os.environ.get(\'VERBOSE\')
log = logging.getLogger(\'gxtool\')
log.setLevel(level=logging.DEBUG)
handler = logging.StreamHandler()
if verbose == \'1\':
handler.setLevel(logging.DEBUG)
else:
handler.setLevel(logging.INFO)
str_log = \'[%(levelname)s %(asctime)s %(filename)s:%(lineno)d] %(message)s\'
formatter = logging.Formatter(str_log)
handler.setFormatter(formatter)
log.addHandler(handler)
log.debug(\'VERBOSE={}\'.format(verbose))
cur_path = os.path.realpath(__file__)
log.debug("cur_path: {}".format(cur_path))
VERSION = \'0.8.3-4\'
RELEASE_NOTE = """
==============================================================================
date version info
------------------------------------------------------------------------------
0.6.0-1 init-dep解耦和拆分,enable-repofile、init-dep、copy-conf
==============================================================================
"""
PARAMS = GlobalVars()
PARAMS.put(\'gxtool_dir\', cur_path)
PARAMS.put(\'version\', VERSION)
PARAMS.put(\'release_note\', RELEASE_NOTE.strip(\'\n\'))
def welcome():
print("""
Welcome!
This is the main program for gxtool function.
It provides many features, and you can use \'gxtool --help\' to check.
Thank you!
Copyright (c) Huawei Technologies Co., Ltd. 2012-2020. All rights reserved.
""")
def add_commands():
"""
Process command line options and return
an argparse object containing all arguments
:return: all the arguments parsed into the object
:rtype: an argparse object
"""
parser = argparse.ArgumentParser(prog=\'gxtool\',
description="Develop tool for gx project")
parser.add_argument(\'-v\', \'--version\', action="version",
version="Version: {}".format(VERSION))
desc = \'Subcommands for gxtool. \' \
\'Use "gxtool [subcmd] --help" for detail usage.\'
sub_parser = parser.add_subparsers(title=\'subcommands\',
description=desc,
dest="subparser_name"
)
# 环境检查
add_env_parser(sub_parser)
# 版本信息
add_info_parser(sub_parser)
# 编译核心
add_dep_parser(sub_parser)
add_copy_conf_parser(sub_parser)
add_source_parser(sub_parser)
# 发布cmc
add_publish_parser(sub_parser)
add_publish_comp_parser(sub_parser)
# 查询repo信息
add_check_repo_parser(sub_parser)
add_check_local_repo_parser(sub_parser)
add_search_rpm_parser(sub_parser)
add_download_rpm_parser(sub_parser)
add_extract_rpm_parser(sub_parser)
show_repo_rpm_parser(sub_parser)
# 更新本地repo文件
update_repo_info_parser(sub_parser)
args = parser.parse_args()
PARAMS.update(vars(args))
log.debug(PARAMS.get_all())
func_name = PARAMS.get("func")
log.debug(\'func_name: {}\'.format(func_name))
if func_name:
func_name()
else:
welcome()
def add_env_parser(sub_parser):
help_info = \'check essential for current env.\'
env_parser = sub_parser.add_parser(\'env-check\',
help=help_info)
env_parser.set_defaults(func=env_check_func)
def add_copy_conf_parser(sub_parser):
"""
add subcommand parser for copy-conf
:param: sub_parser: the subcommand parser for gxtool
:return:
"""
dep_parser = sub_parser.add_parser(\'copy-conf\',
help=\'resolve build_conf for project\')
dep_parser.add_argument(\'-c\', \'--build_conf\',
required=True,
help=\'project build_conf path\')
dep_parser.add_argument(\'-d\', \'--dest_path\',
required=True,
help=\'spec file path and name\')
dep_parser.set_defaults(func=copy_conf_func)
def main():
add_commands()
if __name__ == "__main__":
main()
一个单例类 global_vars.py:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
class GlobalVars(object):
"""
Singleton class GlobalVars to store and manage global variables.
"""
_instance = None
_var_dict = {}
def __new__(cls, *args, **kw):
"""
Ensure that when creating a new instance, it\'ll be the only
instance. Otherwise return existing instance.
:param args:
:param kw:
:return: cls._instance
"""
if not cls._instance:
cls._instance = super(GlobalVars, cls).__new__(cls, *args, **kw)
return cls._instance
def get(self, var_name):
"""
Get the global variable value from var dict.
:param var_name:
:return: self._var_dict[var_name] or None
"""
if var_name in self._var_dict.keys():
return self._var_dict[var_name]
return None
def put(self, key, value):
"""
Put a pair of key/value into var dict.
:param key, value:
:return: None
"""
self._var_dict.update({key: value})
def update(self, var_dict):
"""
Update the _var_dict with a dict of key/values.
:param var_dict:
:return:
"""
if isinstance(var_dict, dict):
self._var_dict.update(var_dict)
def get_all(self):
return self._var_dict
def save(self):
"""
Save the _var_dict in local file.
:param var_dict:
:return:
"""
pass
def refresh(self):
"""
init the _var_dict from local file.
:param var_dict:
:return:
"""
pass
一个最简单基础类 utils.py:
class BaseMethod:
@staticmethod
def run_cmd(cmd):
retcode, output = subprocess.getstatusoutput(cmd)
if retcode != 0:
print("RUN CMD: %s, retcode: %s, output: %s"
% (cmd, retcode, output))
return retcode, output
@staticmethod
def write_file(filename, content):
dir_name = os.path.dirname(filename)
if not os.path.exists(dir_name):
os.makedirs(dir_name)
with open(filename, \'w\', encoding=\'utf-8\') as tf:
tf.write(content)
@staticmethod
def read_file_with_json(file_name, mode="r"):
if not os.path.exists(file_name):
raise IOError("No such file or directory: %s" % file_name)
with open(file_name, mode) as fp:
json_body = json.load(fp)
return json_body
@staticmethod
def write_json_to_file(file_name, json_body, mode="w+"):
# json_body 要求是字典
with tempfile.NamedTemporaryFile(mode, dir=os.path.dirname(file_name),
delete=False) as fp:
json_str = json.dumps(json_body, indent=4, sort_keys=True)
fp.write(json_str)
fp.flush()
temp_name = fp.name
os.rename(temp_name, file_name)
@staticmethod
def get_md5sum(file_name):
cmd = \'md5sum {}\'.format(file_name)
ret, out = BaseMethod.run_cmd(cmd)
md5sum = \'\'
if ret == 0:
md5sum = out.split()[0]
return md5sum