--- a/packageship/application/cli/commands/initialize.py +++ b/packageship/application/cli/commands/initialize.py @@ -15,7 +15,6 @@ Description: Entry method for custom commands Class: InitDatabaseCommand """ import os -import random import time import pwd import threading @@ -23,27 +22,23 @@ from packageship.application.cli.base import BaseCommand from packageship.application.common.exc import InitializeError, ResourceCompetitionError -class PrintThread(threading.Thread): +class InitServiceThread(threading.Thread): """ - Description: Print Thread - Attributes: - + Description: Execute the initialization thread """ - def __init__(self, *args, **kwargs): - super(PrintThread, self).__init__(*args, **kwargs) - self.__clear = False + def __init__(self, func, param, *args, **kwargs): + super(InitServiceThread, self).__init__(*args, **kwargs) + self._func = func + self._args = param + self.error = False def run(self): - while True: - print("\r", "initializing{}".format( - "." * random.randint(1, 4)), end='', flush=True) - time.sleep(0.5) - if self.__clear: - break - - def stop(self): - self.__clear = True + try: + self._func(*self._args) + except (InitializeError, ResourceCompetitionError) as error: + self.error = True + print('\r', error) class InitDatabaseCommand(BaseCommand): @@ -63,6 +58,7 @@ class InitDatabaseCommand(BaseCommand): 'init', help='initialization of the database') self.params = [ ('-filepath', 'str', 'specify the path of conf.yaml', '', 'store')] + self._char = ["/", "-", "\\"] def register(self): """ @@ -77,6 +73,13 @@ class InitDatabaseCommand(BaseCommand): super(InitDatabaseCommand, self).register() self.parse.set_defaults(func=self.do_command) + @property + def login_user(self): + """ + Description: The user logged in to the system + """ + return pwd.getpwuid(os.getuid())[0] + def do_command(self, params): """ Description: Action to execute command @@ -88,10 +91,7 @@ class InitDatabaseCommand(BaseCommand): """ - def get_username(): - return pwd.getpwuid(os.getuid())[0] - - if get_username() not in ["root", "pkgshipuser"]: + if self.login_user not in ["root", "pkgshipuser"]: print("The current user does not have initial execution permission") return @@ -100,14 +100,19 @@ class InitDatabaseCommand(BaseCommand): file_path = params.filepath if file_path: file_path = os.path.abspath(file_path) - try: - print_t = PrintThread() - print_t.start() - init.import_depend(path=file_path) - print_t.stop() - except (InitializeError, ResourceCompetitionError) as error: - print('\r', error) - else: + + _init_service_thread = InitServiceThread( + func=init.import_depend, param=(file_path,)) + _init_service_thread.setDaemon(True) + _init_service_thread.start() + + while _init_service_thread.isAlive(): + for number in range(3): + print("\r", "initializing{}".format("." * 10), + self._char[number], end='', flush=True) + time.sleep(0.5) + print("\n") + if not _init_service_thread.error: if init.success: print('\r', 'Database initialize success') else: --- a/packageship/application/initialize/integration.py +++ b/packageship/application/initialize/integration.py @@ -653,7 +653,7 @@ class RepoConfig: if not os.path.exists(path): raise FileNotFoundError( - "system initialization configuration file" + "system initialization configuration file " "does not exist: %s" % path) # load yaml configuration file with open(path, 'r', encoding='utf-8') as file_context: @@ -663,7 +663,7 @@ class RepoConfig: except yaml.YAMLError as yaml_error: LOGGER.error(yaml_error) raise ValueError( - "The format of the yaml configuration" + "The format of the yaml configuration " "file is wrong please check and try again:{0}".format(yaml_error)) \ from yaml_error @@ -748,9 +748,9 @@ class RepoConfig: raise ValueError( "content of the database initialization configuration file cannot be empty .") if not isinstance(self._repo, list): - raise ValueError("""format of the initial database configuration file isincorrect. - When multiple databases need to be initialized, - it needs to be configured in the form of multiple .""") + raise ValueError("format of the initial database configuration file is incorrect." + " When multiple databases need to be initialized," + " it needs to be configured in the form of multiple .") self._validate_database() for repo in self._repo: try: --- a/packageship/pkgship +++ b/packageship/pkgship @@ -15,7 +15,7 @@ import signal from signal import SIG_DFL try: def sig_handler(signum, frame): - print('Exit command mode') + print("\n", 'Exit command mode') sys.exit(0) signal.signal(signal.SIGINT, sig_handler)