From f05cd3fe514ce1818e4062095f6a6155c01533cf Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Mon, 6 Mar 2023 21:07:52 +0100 Subject: [PATCH] [DEV] start review island --- bin/island | 15 +- island/__init__.py | 377 +++-- island/actions.py | 222 +-- island/actions/islandAction_checkout.py | 117 +- island/actions/islandAction_command.py | 105 +- island/actions/islandAction_commit.py | 135 +- island/actions/islandAction_deliver-push.py | 103 +- island/actions/islandAction_deliver.py | 256 ++-- island/actions/islandAction_fetch.py | 129 +- island/actions/islandAction_init.py | 155 +- .../actions/islandAction_manifest-checkout.py | 82 +- .../islandAction_manifest-deliver-push.py | 79 +- .../actions/islandAction_manifest-deliver.py | 322 ++-- .../actions/islandAction_manifest-status.py | 73 +- island/actions/islandAction_manifest-sync.py | 61 +- island/actions/islandAction_push.py | 173 ++- island/actions/islandAction_status.py | 132 +- island/actions/islandAction_sync-local.py | 278 ++-- island/actions/islandAction_sync.py | 338 +++-- island/actions/islandAction_volatile-add.py | 103 +- island/actions/islandAction_volatile-list.py | 48 +- island/actions/status.py | 977 +++++++----- island/actions/update_links.py | 65 +- island/commands.py | 651 ++++---- island/config.py | 342 ++--- island/env.py | 179 ++- island/host.py | 24 +- island/link_config.py | 28 +- island/manifest.py | 1309 ++++++++++------- island/multiprocess.py | 206 +-- island/repo_config.py | 91 +- island/tools.py | 608 ++++---- setup.py | 86 +- 33 files changed, 4507 insertions(+), 3362 deletions(-) diff --git a/bin/island b/bin/island index 250843d..17287b3 100755 --- a/bin/island +++ b/bin/island @@ -1,11 +1,10 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -## -## @author Edouard DUPIN -## -## @copyright 2012, Edouard DUPIN, all right reserved -## -## @license MPL v2.0 (see license file) -## +"""Inland main interface. -import island +@author Edouard DUPIN +@copyright 2012, Edouard DUPIN, all right reserved +@license MPL v2.0 (see license file) +""" + +import island # Noqa: import diff --git a/island/__init__.py b/island/__init__.py index 9cf86b4..e218742 100755 --- a/island/__init__.py +++ b/island/__init__.py @@ -1,222 +1,283 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -## -## @author Edouard DUPIN -## -## @copyright 2012, Edouard DUPIN, all right reserved -## -## @license MPL v2.0 (see license file) -## +"""Inland main(). + +@author Edouard DUPIN +@copyright 2012, Edouard DUPIN, all right reserved +@license MPL v2.0 (see license file) +""" + +import copy +import fnmatch import os import sys -import fnmatch -import copy -# Local import -from . import host -from . import tools -from realog import debug -from . import env -from . import actions -import death.Arguments as arguments +from typing import Union + import death.ArgElement as arg_element +import death.Arguments as arguments +from realog import debug + +# Local import +from . import ( + actions, + env, + host, + tools, +) + + is_init = False -debug.set_display_on_error(" ==========================\n == Some error occured ==\n ==========================") +debug.set_display_on_error( + " ==========================\n == Some error occurred ==\n ==========================" +) def init(): - global is_init; - if is_init == True: - return - # import local island files - list_of_island_files = tools.import_path_local(os.path.join(tools.get_current_path(__file__), 'actions'), base_name = env.get_system_base_name() + "*.py") - actions.init(list_of_island_files) - # import project actions files - list_of_island_files = tools.import_path_local(env.get_island_root_path(), 2, [".island", ".git", "archive"], base_name = env.get_system_base_name() + "*.py") - actions.init(list_of_island_files) - is_init = True + global is_init + if is_init == True: + return + # import local island files + list_of_island_files = tools.import_path_local( + os.path.join(tools.get_current_path(__file__), "actions"), + base_name=env.get_system_base_name() + "*.py", + ) + actions.init(list_of_island_files) + # import project actions files + list_of_island_files = tools.import_path_local( + env.get_island_root_path(), + 2, + [".island", ".git", "archive"], + base_name=env.get_system_base_name() + "*.py", + ) + actions.init(list_of_island_files) + is_init = True + # initialize the system ... init() - debug.verbose("List of actions: " + str(actions.get_list_of_action())) my_args = arguments.Arguments() my_args.add_section("option", "Can be set one time in all case") my_args.add("h", "help", desc="Display this help") -my_args.add("v", "verbose", list=[ - ["0","None"], - ["1","error"], - ["2","warning"], - ["3","info"], - ["4","debug"], - ["5","verbose"], - ["6","extreme_verbose"], - ], desc="display debug level (verbose) default =2") +my_args.add( + "v", + "verbose", + list=[ + ["0", "None"], + ["1", "error"], + ["2", "warning"], + ["3", "info"], + ["4", "debug"], + ["5", "verbose"], + ["6", "extreme_verbose"], + ], + desc="display debug level (verbose) default =2", +) my_args.add("c", "color", desc="Display message in color") -my_args.add("n", "no-fetch-manifest", haveParam=False, desc="Disable the fetch of the manifest") -my_args.add("F", "filter", haveParam=True, desc="Filter the action on a list of path or subpath: -f library") -my_args.add("f", "folder", haveParam=False, desc="Display the folder instead of the git repository name") -my_args.add("w", "wait", haveParam=True, desc="Wait between 2 acces on the server (needed when the server is really slow to remove ssh connection) (default=" + str(env.get_wait_between_sever_command()) + ")") +my_args.add( + "n", "no-fetch-manifest", haveParam=False, desc="Disable the fetch of the manifest" +) +my_args.add( + "F", + "filter", + haveParam=True, + desc="Filter the action on a list of path or subpath: -f library", +) +my_args.add( + "f", + "folder", + haveParam=False, + desc="Display the folder instead of the git repository name", +) +my_args.add( + "w", + "wait", + haveParam=True, + desc="Wait between 2 access on the server (needed when the server is really slow to remove ssh connection) (default=" + + str(env.get_wait_between_sever_command()) + + ")", +) my_args.set_stop_at(actions.get_list_of_action()) local_argument = my_args.parse() + ## ## @brief Display the help of this makefile. ## def usage(): - color = debug.get_color_set() - # generic argument displayed : - my_args.display() - print(" Action availlable" ) - list_actions = actions.get_list_of_action(); - for elem in list_actions: - print(" " + color['green'] + elem + color['default']) - print(" " + actions.get_action_help(elem)) - """ + color = debug.get_color_set() + # generic argument displayed : + my_args.display() + print(" Action available") + list_actions = actions.get_list_of_action() + for elem in list_actions: + print(f" {color['green']}{color['green']}{color['default']}") + print(f" {actions.get_action_help(elem)}") + """ print(" " + color['green'] + "init" + color['default']) print(" initialize a 'island' interface with a manifest in a git ") print(" " + color['green'] + "sync" + color['default']) - print(" Syncronise the currect environement") + print(" Synchronize the current environnement") print(" " + color['green'] + "status" + color['default']) - print(" Dump the status of the environement") + print(" Dump the status of the environnement") """ - print(" ex: " + sys.argv[0] + " -c init http://github.com/atria-soft/manifest.git") - print(" ex: " + sys.argv[0] + " sync") - exit(0) + print(f" ex: {sys.argv[0]} -c init http://github.com/atria-soft/manifest.git") + print(f" ex: {sys.argv[0]} sync") + exit(0) + + +def check_boolean(value: Union[bool, str]) -> bool: + if ( + value == "" + or value == "1" + or value == "true" + or value == "True" + or value is True + ): + return True + return False -def check_boolean(value): - if value == "" \ - or value == "1" \ - or value == "true" \ - or value == "True" \ - or value == True: - return True - return False # preparse the argument to get the verbose element for debug mode def parse_generic_arg(argument, active): - debug.extreme_verbose("parse arg : " + argument.get_option_name() + " " + argument.get_arg() + " active=" + str(active)) - if argument.get_option_name() == "help": - if active == False: - usage() - return True - elif argument.get_option_name()=="jobs": - if active == True: - #multiprocess.set_core_number(int(argument.get_arg())) - pass - return True - elif argument.get_option_name()=="wait": - if active == True: - env.set_wait_between_sever_command(int(argument.get_arg())) - return True - elif argument.get_option_name() == "verbose": - if active == True: - debug.set_level(int(argument.get_arg())) - return True - elif argument.get_option_name() == "folder": - if active == True: - env.set_display_folder_instead_of_git_name(True) - return True - elif argument.get_option_name() == "color": - if active == True: - if check_boolean(argument.get_arg()) == True: - debug.enable_color() - else: - debug.disable_color() - return True - elif argument.get_option_name() == "filter": - if active == True: - env.set_filter_command(str(argument.get_arg())) - return True - elif argument.get_option_name() == "no-fetch-manifest": - if active == False: - env.set_fetch_manifest(False) - return True - return False + debug.extreme_verbose( + "parse arg : " + + argument.get_option_name() + + " " + + argument.get_arg() + + " active=" + + str(active) + ) + if argument.get_option_name() == "help": + if active == False: + usage() + return True + elif argument.get_option_name() == "jobs": + if active == True: + # multiprocess.set_core_number(int(argument.get_arg())) + pass + return True + elif argument.get_option_name() == "wait": + if active == True: + env.set_wait_between_sever_command(int(argument.get_arg())) + return True + elif argument.get_option_name() == "verbose": + if active == True: + debug.set_level(int(argument.get_arg())) + return True + elif argument.get_option_name() == "folder": + if active == True: + env.set_display_folder_instead_of_git_name(True) + return True + elif argument.get_option_name() == "color": + if active == True: + if check_boolean(argument.get_arg()) == True: + debug.enable_color() + else: + debug.disable_color() + return True + elif argument.get_option_name() == "filter": + if active == True: + env.set_filter_command(str(argument.get_arg())) + return True + elif argument.get_option_name() == "no-fetch-manifest": + if active == False: + env.set_fetch_manifest(False) + return True + return False + # open configuration of island: config_file = env.get_island_path_user_config() if os.path.isfile(config_file) == True: - sys.path.append(os.path.dirname(config_file)) - debug.debug("Find basic configuration file: '" + config_file + "'") - # the file exist, we can open it and get the initial configuration: - configuration_file = __import__(env.get_system_config_name()[:-3]) - - if "get_exclude_path" in dir(configuration_file): - data = configuration_file.get_exclude_path() - debug.debug(" get default config 'get_exclude_path' val='" + str(data) + "'") - env.set_exclude_search_path(data) - - if "get_default_color" in dir(configuration_file): - data = configuration_file.get_default_color() - debug.debug(" get default config 'get_default_color' val='" + str(data) + "'") - parse_generic_arg(arg_element.ArgElement("color", str(data)), True) - - if "get_default_debug_level" in dir(configuration_file): - data = configuration_file.get_default_debug_level() - debug.debug(" get default config 'get_default_debug_level' val='" + str(data) + "'") - parse_generic_arg(arg_element.ArgElement("verbose", str(data)), True) - - if "get_default_folder" in dir(configuration_file): - data = configuration_file.get_default_folder() - debug.debug(" get default config 'get_default_folder' val='" + str(data) + "'") - parse_generic_arg(arg_element.ArgElement("folder", str(data)), True) - - if "get_default_wait" in dir(configuration_file): - data = configuration_file.get_default_wait() - debug.debug(" get default config 'get_default_wait' val='" + str(data) + "'") - parse_generic_arg(arg_element.ArgElement("wait", str(data)), True) - - if "get_default_filter" in dir(configuration_file): - data = configuration_file.get_default_filter() - debug.debug(" get default config 'get_default_filter' val='" + str(data) + "'") - parse_generic_arg(arg_element.ArgElement("filter", str(data)), True) - + sys.path.append(os.path.dirname(config_file)) + debug.debug("Find basic configuration file: '" + config_file + "'") + # the file exist, we can open it and get the initial configuration: + configuration_file = __import__(env.get_system_config_name()[:-3]) + + if "get_exclude_path" in dir(configuration_file): + data = configuration_file.get_exclude_path() + debug.debug(" get default config 'get_exclude_path' val='" + str(data) + "'") + env.set_exclude_search_path(data) + + if "get_default_color" in dir(configuration_file): + data = configuration_file.get_default_color() + debug.debug(" get default config 'get_default_color' val='" + str(data) + "'") + parse_generic_arg(arg_element.ArgElement("color", str(data)), True) + + if "get_default_debug_level" in dir(configuration_file): + data = configuration_file.get_default_debug_level() + debug.debug( + " get default config 'get_default_debug_level' val='" + str(data) + "'" + ) + parse_generic_arg(arg_element.ArgElement("verbose", str(data)), True) + + if "get_default_folder" in dir(configuration_file): + data = configuration_file.get_default_folder() + debug.debug(" get default config 'get_default_folder' val='" + str(data) + "'") + parse_generic_arg(arg_element.ArgElement("folder", str(data)), True) + + if "get_default_wait" in dir(configuration_file): + data = configuration_file.get_default_wait() + debug.debug(" get default config 'get_default_wait' val='" + str(data) + "'") + parse_generic_arg(arg_element.ArgElement("wait", str(data)), True) + + if "get_default_filter" in dir(configuration_file): + data = configuration_file.get_default_filter() + debug.debug(" get default config 'get_default_filter' val='" + str(data) + "'") + parse_generic_arg(arg_element.ArgElement("filter", str(data)), True) # parse default unique argument: for argument in local_argument: - parse_generic_arg(argument, True) + parse_generic_arg(argument, True) # remove all generic arguments: new_argument_list = [] for argument in local_argument: - if parse_generic_arg(argument, False) == True: - continue - new_argument_list.append(argument) + if parse_generic_arg(argument, False) == True: + continue + new_argument_list.append(argument) # now the first argument is: the action: if len(new_argument_list) == 0: - debug.warning("--------------------------------------") - debug.warning("Missing the action to do ...") - debug.warning("--------------------------------------") - usage() + debug.warning("--------------------------------------") + debug.warning("Missing the action to do ...") + debug.warning("--------------------------------------") + usage() # TODO : move tin in actions ... -list_actions = actions.get_list_of_action(); +list_actions = actions.get_list_of_action() action_to_do = new_argument_list[0].get_arg() new_argument_list = new_argument_list[1:] if action_to_do not in list_actions: - debug.warning("--------------------------------------") - debug.warning("Wrong action type : '" + str(action_to_do) + "' availlable list: " + str(list_actions) ) - debug.warning("--------------------------------------") - usage() + debug.warning("--------------------------------------") + debug.warning( + "Wrong action type : '" + + str(action_to_do) + + "' availlable list: " + + str(list_actions) + ) + debug.warning("--------------------------------------") + usage() # todo : Remove this -if action_to_do != "init" \ - and os.path.exists(env.get_island_path()) == False: - debug.error("Can not execute a island cmd if we have not initialize a config: '" + str("." + env.get_system_base_name()) + "' in upper 6 parent path") - exit(-1) +if action_to_do != "init" and os.path.exists(env.get_island_path()) == False: + debug.error( + "Can not execute a island cmd if we have not initialize a config: '" + + str("." + env.get_system_base_name()) + + "' in upper 6 parent path" + ) + exit(-1) -ret = actions.execute(action_to_do, my_args.get_last_parsed()+1) +ret = actions.execute(action_to_do, my_args.get_last_parsed() + 1) -exit (ret) +exit(ret) # stop all started threads; -#multiprocess.un_init() - - +# multiprocess.un_init() diff --git a/island/actions.py b/island/actions.py index 6a66c39..e5684da 100644 --- a/island/actions.py +++ b/island/actions.py @@ -1,54 +1,62 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -## -## @author Edouard DUPIN -## -## @copyright 2012, Edouard DUPIN, all right reserved -## -## @license MPL v2.0 (see license file) -## +"""Action interface. + +@author Edouard DUPIN +@copyright 2012, Edouard DUPIN, all right reserved +@license MPL v2.0 (see license file) +""" + +import os +import sys + +import death.Arguments as arguments # Local import from realog import debug -import os -import sys + from . import env -import death.Arguments as arguments + list_actions = [] __base_action_name = env.get_system_base_name() + "Action_" + def init(files): - global list_actions; - debug.verbose("List of action for island: " + str(len(files))) - for elem_path in files : - debug.verbose("parse file : " + elem_path) - base_name = os.path.basename(elem_path) - if len(base_name) <= 3 + len(__base_action_name): - # reject it, too small - continue - base_name = base_name[:-3] - if base_name[:len(__base_action_name)] != __base_action_name: - # reject it, wrong start file - continue - name_action = base_name[len(__base_action_name):] - debug.debug(" '" + os.path.basename(elem_path)[:-3] + "' file=" + elem_path) - list_actions.append({ - "name":name_action, - "path":elem_path, - }) + global list_actions + debug.verbose("List of action for island: " + str(len(files))) + for elem_path in files: + debug.verbose("parse file : " + elem_path) + base_name = os.path.basename(elem_path) + if len(base_name) <= 3 + len(__base_action_name): + # reject it, too small + continue + base_name = base_name[:-3] + if base_name[: len(__base_action_name)] != __base_action_name: + # reject it, wrong start file + continue + name_action = base_name[len(__base_action_name) :] + debug.debug(" '" + os.path.basename(elem_path)[:-3] + "' file=" + elem_path) + list_actions.append( + { + "name": name_action, + "path": elem_path, + } + ) + ## ## @brief Get the wall list of action availlable ## @return ([string]) the list of action name ## def get_list_of_action(): - global list_actions; - out = [] - for elem in list_actions: - out.append(elem["name"]) - return out + global list_actions + out = [] + for elem in list_actions: + out.append(elem["name"]) + return out + ## ## @brief Get a description of an action @@ -57,18 +65,19 @@ def get_list_of_action(): ## @param[in] default_value (*) Renurned value of the call if function does not exist ## @return (*) the getted value or the default_value ## -def get_function_value(action_name, function_name, default_value = None): - global list_actions; - for elem in list_actions: - if elem["name"] == action_name: - # finish the parsing - sys.path.append(os.path.dirname(elem["path"])) - the_action = __import__(__base_action_name + action_name) - if function_name not in dir(the_action): - return default_value - method_to_call = getattr(the_action, function_name) - return method_to_call() - return default_value +def get_function_value(action_name, function_name, default_value=None): + global list_actions + for elem in list_actions: + if elem["name"] == action_name: + # finish the parsing + sys.path.append(os.path.dirname(elem["path"])) + the_action = __import__(__base_action_name + action_name) + if function_name not in dir(the_action): + return default_value + method_to_call = getattr(the_action, function_name) + return method_to_call() + return default_value + ## ## @brief Get the global help value of a module @@ -76,65 +85,74 @@ def get_function_value(action_name, function_name, default_value = None): ## @return The first line of description ## def get_action_help(action_name): - value = get_function_value(action_name, "help", "---") - return value.split("\n")[0] + value = get_function_value(action_name, "help", "---") + return value.split("\n")[0] def usage(arguments, action_name): - color = debug.get_color_set() - # generic argument displayed for specific action: - #print("Specific argument for the command: '" + action_name + "'" ) - #print(" " + get_desc(action_name)) - value = get_function_value(action_name, "help") - debug.info("Description:") - debug.info("\t" + str(value)) - arguments.display(action_name) - value = get_function_value(action_name, "help_example") - if value != None: - debug.info("Example:") - for elem in value.split("\n"): - debug.info("\t" + value) - exit(0) + color = debug.get_color_set() + # generic argument displayed for specific action: + # print("Specific argument for the command: '" + action_name + "'" ) + # print(" " + get_desc(action_name)) + value = get_function_value(action_name, "help") + debug.info("Description:") + debug.info("\t" + str(value)) + arguments.display(action_name) + value = get_function_value(action_name, "help_example") + if value != None: + debug.info("Example:") + for elem in value.split("\n"): + debug.info("\t" + value) + exit(0) + def execute(action_name, argument_start_id): - global list_actions; - # TODO: Move here the check if action is availlable - - for elem in list_actions: - if elem["name"] != action_name: - continue - debug.info("action: " + str(elem)); - # finish the parsing - sys.path.append(os.path.dirname(elem["path"])) - the_action = __import__(__base_action_name + action_name) - my_under_args_parser = arguments.Arguments() - my_under_args_parser.add("h", "help", desc="Help of this action") - - if "add_specific_arguments" in dir(the_action): - the_action.add_specific_arguments(my_under_args_parser, elem["name"]) - have_unknow_argument = False - if "have_unknow_argument" in dir(the_action): - have_unknow_argument = the_action.have_unknow_argument() - my_under_args = my_under_args_parser.parse(argument_start_id, have_unknow_argument) - # search help if needed ==> permit to not duplicating code - for elem in my_under_args: - if elem.get_option_name() == "help": - usage(my_under_args_parser, action_name) - return 0 - # now we can execute: - if "execute" not in dir(the_action): - debug.error("execute is not implmented for this action ... '" + str(action_name) + "'") - return -11 - debug.info("execute: " + action_name) - for elem in my_under_args: - debug.debug(" " + str(elem.get_option_name()) + "='" + str(elem.get_arg()) + "'") - ret = the_action.execute(my_under_args) - if ret == None: - return 0 - if ret < 0: - debug.info(" ==========================") - debug.info(" == Some error occured ==") - debug.info(" ==========================") - return ret - debug.error("Can not do the action...") - return -10 + global list_actions + # TODO: Move here the check if action is availlable + + for elem in list_actions: + if elem["name"] != action_name: + continue + debug.info("action: " + str(elem)) + # finish the parsing + sys.path.append(os.path.dirname(elem["path"])) + the_action = __import__(__base_action_name + action_name) + my_under_args_parser = arguments.Arguments() + my_under_args_parser.add("h", "help", desc="Help of this action") + + if "add_specific_arguments" in dir(the_action): + the_action.add_specific_arguments(my_under_args_parser, elem["name"]) + have_unknow_argument = False + if "have_unknow_argument" in dir(the_action): + have_unknow_argument = the_action.have_unknow_argument() + my_under_args = my_under_args_parser.parse( + argument_start_id, have_unknow_argument + ) + # search help if needed ==> permit to not duplicating code + for elem in my_under_args: + if elem.get_option_name() == "help": + usage(my_under_args_parser, action_name) + return 0 + # now we can execute: + if "execute" not in dir(the_action): + debug.error( + "execute is not implmented for this action ... '" + + str(action_name) + + "'" + ) + return -11 + debug.info("execute: " + action_name) + for elem in my_under_args: + debug.debug( + " " + str(elem.get_option_name()) + "='" + str(elem.get_arg()) + "'" + ) + ret = the_action.execute(my_under_args) + if ret == None: + return 0 + if ret < 0: + debug.info(" ==========================") + debug.info(" == Some error occured ==") + debug.info(" ==========================") + return ret + debug.error("Can not do the action...") + return -10 diff --git a/island/actions/islandAction_checkout.py b/island/actions/islandAction_checkout.py index 4d940c1..6b0e39b 100644 --- a/island/actions/islandAction_checkout.py +++ b/island/actions/islandAction_checkout.py @@ -8,23 +8,28 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands -import status import os +from realog import debug +import status + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Ckeckout a specific branch in all repository" + return "Ckeckout a specific branch in all repository" + ## ## @brief Add argument to the specific action @@ -32,8 +37,13 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(my_args, section): - my_args.add("r", "remote", haveParam=True, desc="Name of the remote server") - my_args.add_arg("branch", optionnal=False, desc="Branch to checkout (if '__TAG__' ==> checkout specific repository tags)") + my_args.add("r", "remote", haveParam=True, desc="Name of the remote server") + my_args.add_arg( + "branch", + optionnal=False, + desc="Branch to checkout (if '__TAG__' ==> checkout specific repository tags)", + ) + ## ## @brief Execute the action required. @@ -45,44 +55,53 @@ def add_specific_arguments(my_args, section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - argument_remote_name = "" - branch_to_checkout = "" - for elem in _arguments: - if elem.get_option_name() == "remote": - debug.info("find remote name: '" + elem.get_arg() + "'") - argument_remote_name = elem.get_arg() - elif elem.get_option_name() == "branch": - branch_to_checkout = elem.get_arg() - else: - debug.error("Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - - # update the local configuration file: - configuration.set_branch(branch_to_checkout) - configuration.store() - - file_source_manifest = os.path.join(env.get_island_path_manifest(), configuration.get_manifest_name()) - if os.path.exists(file_source_manifest) == False: - debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") - - mani = manifest.Manifest(file_source_manifest) - - all_project = mani.get_all_configs() - debug.info("checkout of: " + str(len(all_project)) + " projects") - id_element = 0 - have_error = False - for elem in all_project: - id_element += 1 - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - if status.checkout_elem(elem, argument_remote_name, branch_to_checkout, base_display) == False: - have_error = True - if have_error == True: - return env.ret_action_fail - + argument_remote_name = "" + branch_to_checkout = "" + for elem in _arguments: + if elem.get_option_name() == "remote": + debug.info("find remote name: '" + elem.get_arg() + "'") + argument_remote_name = elem.get_arg() + elif elem.get_option_name() == "branch": + branch_to_checkout = elem.get_arg() + else: + debug.error( + "Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + # check system is OK + manifest.check_lutin_is_init() + configuration = config.get_unique_config() + # update the local configuration file: + configuration.set_branch(branch_to_checkout) + configuration.store() + + file_source_manifest = os.path.join( + env.get_island_path_manifest(), configuration.get_manifest_name() + ) + if os.path.exists(file_source_manifest) == False: + debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") + + mani = manifest.Manifest(file_source_manifest) + + all_project = mani.get_all_configs() + debug.info("checkout of: " + str(len(all_project)) + " projects") + id_element = 0 + have_error = False + for elem in all_project: + id_element += 1 + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + if ( + status.checkout_elem( + elem, argument_remote_name, branch_to_checkout, base_display + ) + == False + ): + have_error = True + if have_error == True: + return env.ret_action_fail diff --git a/island/actions/islandAction_command.py b/island/actions/islandAction_command.py index 410a9c0..305791c 100644 --- a/island/actions/islandAction_command.py +++ b/island/actions/islandAction_command.py @@ -8,29 +8,35 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import multiprocess -from island import config -from island import manifest -from island import commands import os +from realog import debug + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Write the command you want to be executed in every repository" + return "Write the command you want to be executed in every repository" + ## ## @brief Set the option argument are not able to check if the argument are correct or not ## @return (boolean) have parameter without arguments ## def have_unknow_argument(): - return True + return True + ## ## @brief Execute the action required. @@ -42,42 +48,45 @@ def have_unknow_argument(): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - cmd = "" - for elem in _arguments: - debug.info("Get data element: " + str(elem.get_arg())) - cmd += elem.get_arg() + " " - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - - file_source_manifest = os.path.join(env.get_island_path_manifest(), configuration.get_manifest_name()) - if os.path.exists(file_source_manifest) == False: - debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") - - mani = manifest.Manifest(file_source_manifest) - - all_project = mani.get_all_configs() - debug.info("status of: " + str(len(all_project)) + " projects") - id_element = 0 - for elem in all_project: - debug.info("------------------------------------------") - id_element += 1 - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - debug.info("execute command : " + base_display) - tools.wait_for_server_if_needed() - #debug.debug("elem : " + str(elem)) - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - if os.path.exists(git_repo_path) == False: - debug.info("" + base_display + "\r\t\t\t\t\t\t\t\t\t" + " (not download)") - continue - - debug.verbose("execute : " + cmd) - ret = multiprocess.run_command(cmd, cwd=git_repo_path) - if ret[0] == 0: - debug.info("ret=" + ret[1]) - debug.info("err=" + ret[2]) - else: - debug.info("Execution ERROR") - \ No newline at end of file + cmd = "" + for elem in _arguments: + debug.info("Get data element: " + str(elem.get_arg())) + cmd += elem.get_arg() + " " + + # check system is OK + manifest.check_lutin_is_init() + + configuration = config.get_unique_config() + + file_source_manifest = os.path.join( + env.get_island_path_manifest(), configuration.get_manifest_name() + ) + if os.path.exists(file_source_manifest) == False: + debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") + + mani = manifest.Manifest(file_source_manifest) + + all_project = mani.get_all_configs() + debug.info("status of: " + str(len(all_project)) + " projects") + id_element = 0 + for elem in all_project: + debug.info("------------------------------------------") + id_element += 1 + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + debug.info("execute command : " + base_display) + tools.wait_for_server_if_needed() + # debug.debug("elem : " + str(elem)) + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + if os.path.exists(git_repo_path) == False: + debug.info( + "" + base_display + "\r\t\t\t\t\t\t\t\t\t" + " (not download)" + ) + continue + + debug.verbose("execute : " + cmd) + ret = multiprocess.run_command(cmd, cwd=git_repo_path) + if ret[0] == 0: + debug.info("ret=" + ret[1]) + debug.info("err=" + ret[2]) + else: + debug.info("Execution ERROR") diff --git a/island/actions/islandAction_commit.py b/island/actions/islandAction_commit.py index 4ec8651..e1fe2e4 100644 --- a/island/actions/islandAction_commit.py +++ b/island/actions/islandAction_commit.py @@ -8,22 +8,27 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands import os +from realog import debug + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Commit in all repository" + return "Commit in all repository" + ## ## @brief Add argument to the specific action @@ -31,9 +36,10 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(my_args, section): - my_args.add("m", "message", haveParam=True, desc="Message to commit data") - my_args.add("a", "all", desc="Commit all elements") - my_args.add("", "amend", desc="Ammend data at the previous commit") + my_args.add("m", "message", haveParam=True, desc="Message to commit data") + my_args.add("a", "all", desc="Commit all elements") + my_args.add("", "amend", desc="Ammend data at the previous commit") + ## ## @brief Execute the action required. @@ -45,51 +51,62 @@ def add_specific_arguments(my_args, section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - argument_message = "" - argument_amend = "" - argument_all = "" - for elem in _arguments: - if elem.get_option_name() == "message": - debug.info("find message: '" + elem.get_arg() + "'") - argument_message = " --message \"" + elem.get_arg() + "\" "; - elif elem.get_option_name() == "all": - argument_all = " --all " - elif elem.get_option_name() == "amend": - argument_amend = " --amend " - else: - debug.error("Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - - file_source_manifest = os.path.join(env.get_island_path_manifest(), configuration.get_manifest_name()) - if os.path.exists(file_source_manifest) == False: - debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") - mani = manifest.Manifest(file_source_manifest) - - all_project = mani.get_all_configs() - debug.info("commit : " + str(len(all_project)) + " projects") - id_element = 0 - for elem in all_project: - id_element += 1 - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - debug.info("commit: " + base_display) - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - if os.path.exists(git_repo_path) == False: - debug.error("can not commit project that not exist") - continue - - if os.path.exists(os.path.join(git_repo_path,".git")) == False: - # path already exist but it is not used to as a git repo ==> this is an error - debug.warning("path '" + git_repo_path + "' is already existing but not used for a git repository. Clean it and restart") - continue; - - # simply update the repository ... - debug.verbose("commit in project:") - # fetch the repository - cmd = "git commit " + argument_amend + argument_all + argument_message - debug.debug("execute : " + cmd) - multiprocess.run_command_direct(cmd, cwd=git_repo_path) - + argument_message = "" + argument_amend = "" + argument_all = "" + for elem in _arguments: + if elem.get_option_name() == "message": + debug.info("find message: '" + elem.get_arg() + "'") + argument_message = ' --message "' + elem.get_arg() + '" ' + elif elem.get_option_name() == "all": + argument_all = " --all " + elif elem.get_option_name() == "amend": + argument_amend = " --amend " + else: + debug.error( + "Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + + # check system is OK + manifest.check_lutin_is_init() + + configuration = config.get_unique_config() + + file_source_manifest = os.path.join( + env.get_island_path_manifest(), configuration.get_manifest_name() + ) + if os.path.exists(file_source_manifest) == False: + debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") + mani = manifest.Manifest(file_source_manifest) + + all_project = mani.get_all_configs() + debug.info("commit : " + str(len(all_project)) + " projects") + id_element = 0 + for elem in all_project: + id_element += 1 + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + debug.info("commit: " + base_display) + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + if os.path.exists(git_repo_path) == False: + debug.error("can not commit project that not exist") + continue + + if os.path.exists(os.path.join(git_repo_path, ".git")) == False: + # path already exist but it is not used to as a git repo ==> this is an error + debug.warning( + "path '" + + git_repo_path + + "' is already existing but not used for a git repository. Clean it and restart" + ) + continue + + # simply update the repository ... + debug.verbose("commit in project:") + # fetch the repository + cmd = "git commit " + argument_amend + argument_all + argument_message + debug.debug("execute : " + cmd) + multiprocess.run_command_direct(cmd, cwd=git_repo_path) diff --git a/island/actions/islandAction_deliver-push.py b/island/actions/islandAction_deliver-push.py index 871bda4..83ab8f6 100644 --- a/island/actions/islandAction_deliver-push.py +++ b/island/actions/islandAction_deliver-push.py @@ -8,22 +8,28 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands -import status import os +from realog import debug +import status + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Push a delover (develop & master & tag) on the remotre server" + return "Push a delover (develop & master & tag) on the remotre server" + ## ## @brief Add argument to the specific action @@ -31,7 +37,8 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(my_args, section): - my_args.add("r", "remote", haveParam=True, desc="Name of the remote server") + my_args.add("r", "remote", haveParam=True, desc="Name of the remote server") + ## ## @brief Execute the action required. @@ -43,38 +50,46 @@ def add_specific_arguments(my_args, section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - argument_remote_name = "" - for elem in _arguments: - if elem.get_option_name() == "remote": - debug.info("find remote name: '" + elem.get_arg() + "'") - argument_remote_name = elem.get_arg() - else: - debug.error("Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - - file_source_manifest = os.path.join(env.get_island_path_manifest(), configuration.get_manifest_name()) - if os.path.exists(file_source_manifest) == False: - debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") - mani = manifest.Manifest(file_source_manifest) - - destination_branch = mani.deliver_master - source_branch = mani.deliver_develop - - all_project = mani.get_all_configs() - debug.info("fetch : " + str(len(all_project)) + " projects") - id_element = 0 - for elem in all_project: - id_element += 1 - # configure remote name: - if argument_remote_name == "": - argument_remote_name = elem.select_remote["name"] - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - debug.info("deliver-push: " + base_display) - tools.wait_for_server_if_needed() - status.deliver_push(elem, argument_remote_name, destination_branch, source_branch, base_display) - + argument_remote_name = "" + for elem in _arguments: + if elem.get_option_name() == "remote": + debug.info("find remote name: '" + elem.get_arg() + "'") + argument_remote_name = elem.get_arg() + else: + debug.error( + "Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + # check system is OK + manifest.check_lutin_is_init() + + configuration = config.get_unique_config() + + file_source_manifest = os.path.join( + env.get_island_path_manifest(), configuration.get_manifest_name() + ) + if os.path.exists(file_source_manifest) == False: + debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") + mani = manifest.Manifest(file_source_manifest) + + destination_branch = mani.deliver_master + source_branch = mani.deliver_develop + + all_project = mani.get_all_configs() + debug.info("fetch : " + str(len(all_project)) + " projects") + id_element = 0 + for elem in all_project: + id_element += 1 + # configure remote name: + if argument_remote_name == "": + argument_remote_name = elem.select_remote["name"] + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + debug.info("deliver-push: " + base_display) + tools.wait_for_server_if_needed() + status.deliver_push( + elem, argument_remote_name, destination_branch, source_branch, base_display + ) diff --git a/island/actions/islandAction_deliver.py b/island/actions/islandAction_deliver.py index 1adda75..795246d 100644 --- a/island/actions/islandAction_deliver.py +++ b/island/actions/islandAction_deliver.py @@ -8,23 +8,28 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import multiprocess -from island import config -from island import manifest -from island import commands -import status import os +from realog import debug +import status + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Deliver the current repository (develop & master MUST be up to date and you MUST be on master)" + return "Deliver the current repository (develop & master MUST be up to date and you MUST be on master)" + ## ## @brief Add argument to the specific action @@ -32,8 +37,9 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(_my_args, _section): - _my_args.add("f", "from", haveParam=True, desc="source branche to deliver") - _my_args.add("t", "to", haveParam=True, desc="desticantion branche of the deliver") + _my_args.add("f", "from", haveParam=True, desc="source branche to deliver") + _my_args.add("t", "to", haveParam=True, desc="desticantion branche of the deliver") + ## ## @brief Execute the action required. @@ -45,94 +51,140 @@ def add_specific_arguments(_my_args, _section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - argument_from = None - argument_to = None - for elem in _arguments: - if elem.get_option_name() == "from": - debug.info("find source branch name: '" + elem.get_arg() + "'") - argument_from = elem.get_arg() - elif elem.get_option_name() == "to": - debug.info("find destination branch name: '" + elem.get_arg() + "'") - argument_to = elem.get_arg() - else: - debug.error("Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - - file_source_manifest = os.path.join(env.get_island_path_manifest(), configuration.get_manifest_name()) - if os.path.exists(file_source_manifest) == False: - debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") - - mani = manifest.Manifest(file_source_manifest) - - destination_branch = mani.deliver_master - source_branch = mani.deliver_develop - if argument_from != None: - source_branch = argument_from - if argument_to != None: - destination_branch = argument_to - - all_project = mani.get_all_configs() - debug.info("Check if all project are on master: " + str(len(all_project)) + " projects") - id_element = 0 - deliver_availlable = True - for elem in all_project: - id_element += 1 - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - debug.verbose("deliver-ckeck: " + base_display) - if status.deliver_check(elem, argument_remote_name, id_element, base_display, source_branch, destination_branch) == False: - deliver_availlable = False - if deliver_availlable == False: - debug.error("deliver-ckeck: Correct the warning to validate the Merge") - return - debug.info("deliver-ckeck: ==> All is OK") - id_element = 0 - for elem in all_project: - id_element += 1 - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - debug.info("deliver: ========================================================================") - debug.info("deliver: == " + base_display) - debug.info("deliver: ========================================================================") - - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - # Check the validity of the version, - version_description, add_in_version_management = status.get_current_version_repo(git_repo_path) - if version_description == None: - continue - debug.info("deliver: ==> version: " + str(version_description)) - - # go to the dev branch - select_branch = commands.get_current_branch(git_repo_path) - - # Checkout destination branch: - commands.checkout(git_repo_path, destination_branch) - - # create new repo tag - new_version_description = status.create_new_version_repo(git_repo_path, version_description, add_in_version_management, source_branch, destination_branch) - debug.info("new version: " + str(new_version_description)) - if new_version_description == None: - continue - # merge branch - if mani.deliver_mode == "merge": - merge_force = True - else: - merge_force = False - commands.merge_branch_on_master(git_repo_path, source_branch, merge_force, branch_destination=destination_branch) - - version_path_file = os.path.join(git_repo_path, "version.txt") - # update version file: - tools.file_write_data(version_path_file, tools.version_to_string(new_version_description)) - commands.add_file(git_repo_path, version_path_file) - commands.commit_all(git_repo_path, "[RELEASE] Release v" + tools.version_to_string(new_version_description)) - commands.tag(git_repo_path, "v" + tools.version_to_string(new_version_description)) - commands.checkout(git_repo_path, source_branch) - commands.reset_hard(git_repo_path, destination_branch) - new_version_description.append("dev") - tools.file_write_data(version_path_file, tools.version_to_string(new_version_description)) - commands.add_file(git_repo_path, version_path_file) - commands.commit_all(git_repo_path, status.default_update_message) - commands.checkout(git_repo_path, destination_branch) - \ No newline at end of file + argument_from = None + argument_to = None + for elem in _arguments: + if elem.get_option_name() == "from": + debug.info("find source branch name: '" + elem.get_arg() + "'") + argument_from = elem.get_arg() + elif elem.get_option_name() == "to": + debug.info("find destination branch name: '" + elem.get_arg() + "'") + argument_to = elem.get_arg() + else: + debug.error( + "Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + + # check system is OK + manifest.check_lutin_is_init() + + configuration = config.get_unique_config() + + file_source_manifest = os.path.join( + env.get_island_path_manifest(), configuration.get_manifest_name() + ) + if os.path.exists(file_source_manifest) == False: + debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") + + mani = manifest.Manifest(file_source_manifest) + + destination_branch = mani.deliver_master + source_branch = mani.deliver_develop + if argument_from != None: + source_branch = argument_from + if argument_to != None: + destination_branch = argument_to + + all_project = mani.get_all_configs() + debug.info( + "Check if all project are on master: " + str(len(all_project)) + " projects" + ) + id_element = 0 + deliver_availlable = True + for elem in all_project: + id_element += 1 + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + debug.verbose("deliver-ckeck: " + base_display) + if ( + status.deliver_check( + elem, + argument_remote_name, + id_element, + base_display, + source_branch, + destination_branch, + ) + == False + ): + deliver_availlable = False + if deliver_availlable == False: + debug.error("deliver-ckeck: Correct the warning to validate the Merge") + return + debug.info("deliver-ckeck: ==> All is OK") + id_element = 0 + for elem in all_project: + id_element += 1 + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + debug.info( + "deliver: ========================================================================" + ) + debug.info("deliver: == " + base_display) + debug.info( + "deliver: ========================================================================" + ) + + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + # Check the validity of the version, + ( + version_description, + add_in_version_management, + ) = status.get_current_version_repo(git_repo_path) + if version_description == None: + continue + debug.info("deliver: ==> version: " + str(version_description)) + + # go to the dev branch + select_branch = commands.get_current_branch(git_repo_path) + + # Checkout destination branch: + commands.checkout(git_repo_path, destination_branch) + + # create new repo tag + new_version_description = status.create_new_version_repo( + git_repo_path, + version_description, + add_in_version_management, + source_branch, + destination_branch, + ) + debug.info("new version: " + str(new_version_description)) + if new_version_description == None: + continue + # merge branch + if mani.deliver_mode == "merge": + merge_force = True + else: + merge_force = False + commands.merge_branch_on_master( + git_repo_path, + source_branch, + merge_force, + branch_destination=destination_branch, + ) + + version_path_file = os.path.join(git_repo_path, "version.txt") + # update version file: + tools.file_write_data( + version_path_file, tools.version_to_string(new_version_description) + ) + commands.add_file(git_repo_path, version_path_file) + commands.commit_all( + git_repo_path, + "[RELEASE] Release v" + tools.version_to_string(new_version_description), + ) + commands.tag( + git_repo_path, "v" + tools.version_to_string(new_version_description) + ) + commands.checkout(git_repo_path, source_branch) + commands.reset_hard(git_repo_path, destination_branch) + new_version_description.append("dev") + tools.file_write_data( + version_path_file, tools.version_to_string(new_version_description) + ) + commands.add_file(git_repo_path, version_path_file) + commands.commit_all(git_repo_path, status.default_update_message) + commands.checkout(git_repo_path, destination_branch) diff --git a/island/actions/islandAction_fetch.py b/island/actions/islandAction_fetch.py index d61828f..06aeafb 100644 --- a/island/actions/islandAction_fetch.py +++ b/island/actions/islandAction_fetch.py @@ -8,22 +8,27 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands import os +from realog import debug + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Fecth all the repository (get all modification on the server)" + return "Fecth all the repository (get all modification on the server)" + ## ## @brief Add argument to the specific action @@ -31,7 +36,8 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(my_args, section): - my_args.add("r", "remote", haveParam=True, desc="Name of the remote server") + my_args.add("r", "remote", haveParam=True, desc="Name of the remote server") + ## ## @brief Execute the action required. @@ -43,50 +49,61 @@ def add_specific_arguments(my_args, section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - argument_remote_name = "" - for elem in _arguments: - if elem.get_option_name() == "remote": - debug.info("find remote name: '" + elem.get_arg() + "'") - argument_remote_name = elem.get_arg() - else: - debug.error("Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - debug.info("fetch manifest : '" + str(env.get_island_path_manifest()) + "'") - commands.fetch(env.get_island_path_manifest(), "origin") - - configuration = config.get_unique_config() - file_source_manifest = os.path.join(env.get_island_path_manifest(), configuration.get_manifest_name()) - if os.path.exists(file_source_manifest) == False: - debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") - mani = manifest.Manifest(file_source_manifest) - - all_project = mani.get_all_configs() - debug.info("fetch : " + str(len(all_project)) + " projects") - id_element = 0 - for elem in all_project: - id_element += 1 - # configure remote name: - if argument_remote_name == "": - argument_remote_name = elem.select_remote["name"] - - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - debug.info("fetch: " + base_display) - tools.wait_for_server_if_needed() - #debug.debug("elem : " + str(elem)) - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - if os.path.exists(git_repo_path) == False: - debug.error("can not fetch project that not exist") - continue - - if os.path.exists(os.path.join(git_repo_path,".git")) == False: - # path already exist but it is not used to as a git repo ==> this is an error - debug.error("path '" + git_repo_path + "' is already existing but not used for a git repository. Clean it and restart") - - # simply update the repository ... - debug.verbose("Fetching project: ") - - commands.fetch(git_repo_path, argument_remote_name) - + argument_remote_name = "" + for elem in _arguments: + if elem.get_option_name() == "remote": + debug.info("find remote name: '" + elem.get_arg() + "'") + argument_remote_name = elem.get_arg() + else: + debug.error( + "Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + + # check system is OK + manifest.check_lutin_is_init() + + debug.info("fetch manifest : '" + str(env.get_island_path_manifest()) + "'") + commands.fetch(env.get_island_path_manifest(), "origin") + + configuration = config.get_unique_config() + file_source_manifest = os.path.join( + env.get_island_path_manifest(), configuration.get_manifest_name() + ) + if os.path.exists(file_source_manifest) == False: + debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") + mani = manifest.Manifest(file_source_manifest) + + all_project = mani.get_all_configs() + debug.info("fetch : " + str(len(all_project)) + " projects") + id_element = 0 + for elem in all_project: + id_element += 1 + # configure remote name: + if argument_remote_name == "": + argument_remote_name = elem.select_remote["name"] + + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + debug.info("fetch: " + base_display) + tools.wait_for_server_if_needed() + # debug.debug("elem : " + str(elem)) + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + if os.path.exists(git_repo_path) == False: + debug.error("can not fetch project that not exist") + continue + + if os.path.exists(os.path.join(git_repo_path, ".git")) == False: + # path already exist but it is not used to as a git repo ==> this is an error + debug.error( + "path '" + + git_repo_path + + "' is already existing but not used for a git repository. Clean it and restart" + ) + + # simply update the repository ... + debug.verbose("Fetching project: ") + + commands.fetch(git_repo_path, argument_remote_name) diff --git a/island/actions/islandAction_init.py b/island/actions/islandAction_init.py index ffd219f..f9e311d 100644 --- a/island/actions/islandAction_init.py +++ b/island/actions/islandAction_init.py @@ -8,21 +8,27 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import commands -from island import multiprocess -from island import manifest import os +from realog import debug + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Init a island repository (need 'fetch' after)" + return "Init a island repository (need 'fetch' after)" + ## ## @brief Add argument to the specific action @@ -30,8 +36,9 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(my_args, section): - my_args.add("b", "branch", haveParam=True, desc="Select branch to display") - my_args.add("m", "manifest", haveParam=True, desc="Name of the manifest") + my_args.add("b", "branch", haveParam=True, desc="Select branch to display") + my_args.add("m", "manifest", haveParam=True, desc="Name of the manifest") + ## ## @brief Execute the action required. @@ -43,58 +50,80 @@ def add_specific_arguments(my_args, section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - if len(_arguments) == 0: - debug.error("Missing argument to execute the current action ...") - - # the configuration availlable: - branch = "master" - manifest_name = "default.xml" - address_manifest = "" - for elem in _arguments: - if elem.get_option_name() == "branch": - debug.info("find branch name: '" + elem.get_arg() + "'") - branch = elem.get_arg() - elif elem.get_option_name() == "manifest": - debug.info("find mmanifest name: '" + elem.get_arg() + "'") - manifest_name = elem.get_arg() - elif elem.get_option_name() == "": - if address_manifest != "": - debug.error("Manifest adress already set : '" + address_manifest + "' !!! '" + elem.get_arg() + "'") - address_manifest = elem.get_arg() - else: - debug.error("Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - if address_manifest == "": - debug.error("Init: Missing manifest name") - - debug.info("Init with: '" + address_manifest + "' branch='" + branch + "' name of manifest='" + manifest_name + "'") - - - # check if .XXX exist (create it if needed) - if manifest.is_lutin_init() == True: - debug.error("System already init: path already exist: '" + str(env.get_island_path()) + "'") - - tools.create_directory(env.get_island_path()) - # check if the git of the manifest if availlable - - # create the file configuration: - conf = config.get_unique_config() - conf.set_manifest(address_manifest) - conf.set_branch(branch) - conf.set_manifest_name(manifest_name) - conf.store() - - debug.info("Clone the manifest") - ret_values = commands.clone(env.get_island_path_manifest(), address_manifest, branch_name=branch) - - if ret_values == False: - debug.info("'" + str(ret_values) + "'") - debug.error("Init does not work") - return False - - debug.info("Init done correctly ...") - - return None - + if len(_arguments) == 0: + debug.error("Missing argument to execute the current action ...") + # the configuration availlable: + branch = "master" + manifest_name = "default.xml" + address_manifest = "" + for elem in _arguments: + if elem.get_option_name() == "branch": + debug.info("find branch name: '" + elem.get_arg() + "'") + branch = elem.get_arg() + elif elem.get_option_name() == "manifest": + debug.info("find mmanifest name: '" + elem.get_arg() + "'") + manifest_name = elem.get_arg() + elif elem.get_option_name() == "": + if address_manifest != "": + debug.error( + "Manifest adress already set : '" + + address_manifest + + "' !!! '" + + elem.get_arg() + + "'" + ) + address_manifest = elem.get_arg() + else: + debug.error( + "Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + if address_manifest == "": + debug.error("Init: Missing manifest name") + + debug.info( + "Init with: '" + + address_manifest + + "' branch='" + + branch + + "' name of manifest='" + + manifest_name + + "'" + ) + + # check if .XXX exist (create it if needed) + if manifest.is_lutin_init() == True: + debug.error( + "System already init: path already exist: '" + + str(env.get_island_path()) + + "'" + ) + + tools.create_directory(env.get_island_path()) + # check if the git of the manifest if availlable + + # create the file configuration: + conf = config.get_unique_config() + conf.set_manifest(address_manifest) + conf.set_branch(branch) + conf.set_manifest_name(manifest_name) + conf.store() + + debug.info("Clone the manifest") + ret_values = commands.clone( + env.get_island_path_manifest(), address_manifest, branch_name=branch + ) + + if ret_values == False: + debug.info("'" + str(ret_values) + "'") + debug.error("Init does not work") + return False + + debug.info("Init done correctly ...") + + return None diff --git a/island/actions/islandAction_manifest-checkout.py b/island/actions/islandAction_manifest-checkout.py index 702db59..e98b735 100644 --- a/island/actions/islandAction_manifest-checkout.py +++ b/island/actions/islandAction_manifest-checkout.py @@ -8,23 +8,28 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands -import status import os +from realog import debug +import status + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Manifest Ckeckout a specific branch of repository" + return "Manifest Ckeckout a specific branch of repository" + ## ## @brief Add argument to the specific action @@ -32,8 +37,13 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(my_args, section): - my_args.add("r", "remote", haveParam=True, desc="Name of the remote server") - my_args.add_arg("branch", optionnal=False, desc="Branch to checkout (if '__TAG__' ==> checkout specific repository tags)") + my_args.add("r", "remote", haveParam=True, desc="Name of the remote server") + my_args.add_arg( + "branch", + optionnal=False, + desc="Branch to checkout (if '__TAG__' ==> checkout specific repository tags)", + ) + ## ## @brief Execute the action required. @@ -45,28 +55,34 @@ def add_specific_arguments(my_args, section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - argument_remote_name = "" - branch_to_checkout = "" - for elem in _arguments: - if elem.get_option_name() == "remote": - debug.info("find remote name: '" + elem.get_arg() + "'") - argument_remote_name = elem.get_arg() - elif elem.get_option_name() == "branch": - branch_to_checkout = elem.get_arg() - else: - debug.error("Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - - - elem = configuration.get_manifest_config() - base_display = tools.get_list_base_display(0, 0, elem) - if status.checkout_elem(elem, argument_remote_name, branch_to_checkout, base_display) == False: - return env.ret_action_fail - + argument_remote_name = "" + branch_to_checkout = "" + for elem in _arguments: + if elem.get_option_name() == "remote": + debug.info("find remote name: '" + elem.get_arg() + "'") + argument_remote_name = elem.get_arg() + elif elem.get_option_name() == "branch": + branch_to_checkout = elem.get_arg() + else: + debug.error( + "Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + # check system is OK + manifest.check_lutin_is_init() + configuration = config.get_unique_config() + elem = configuration.get_manifest_config() + base_display = tools.get_list_base_display(0, 0, elem) + if ( + status.checkout_elem( + elem, argument_remote_name, branch_to_checkout, base_display + ) + == False + ): + return env.ret_action_fail diff --git a/island/actions/islandAction_manifest-deliver-push.py b/island/actions/islandAction_manifest-deliver-push.py index ba702c2..cb0df02 100644 --- a/island/actions/islandAction_manifest-deliver-push.py +++ b/island/actions/islandAction_manifest-deliver-push.py @@ -8,23 +8,28 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands -import status import os +from realog import debug +import status + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Push the manifest delivery" + return "Push the manifest delivery" + ## ## @brief Add argument to the specific action @@ -32,7 +37,8 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(my_args, section): - pass + pass + ## ## @brief Execute the action required. @@ -44,29 +50,34 @@ def add_specific_arguments(my_args, section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - for elem in _arguments: - debug.error("pull Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - - file_source_manifest = os.path.join(env.get_island_path_manifest(), configuration.get_manifest_name()) - if os.path.exists(file_source_manifest) == False: - debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") - - - elem = configuration.get_manifest_config() - - # Check the manifest is up to date ... - base_display = tools.get_list_base_display(0, 0, elem) - - mani = manifest.Manifest(file_source_manifest) - - destination_branch = mani.deliver_master - source_branch = mani.deliver_develop - - status.deliver_push(elem, "origin", destination_branch, source_branch, base_display) + for elem in _arguments: + debug.error( + "pull Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + # check system is OK + manifest.check_lutin_is_init() + configuration = config.get_unique_config() + + file_source_manifest = os.path.join( + env.get_island_path_manifest(), configuration.get_manifest_name() + ) + if os.path.exists(file_source_manifest) == False: + debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") + + elem = configuration.get_manifest_config() + + # Check the manifest is up to date ... + base_display = tools.get_list_base_display(0, 0, elem) + + mani = manifest.Manifest(file_source_manifest) + + destination_branch = mani.deliver_master + source_branch = mani.deliver_develop + + status.deliver_push(elem, "origin", destination_branch, source_branch, base_display) diff --git a/island/actions/islandAction_manifest-deliver.py b/island/actions/islandAction_manifest-deliver.py index 709e157..2f8553d 100644 --- a/island/actions/islandAction_manifest-deliver.py +++ b/island/actions/islandAction_manifest-deliver.py @@ -8,23 +8,28 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands -import status import os +from realog import debug +import status + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Deliver the manifest (merge develop vertion and create a branch with the specific current tags)" + return "Deliver the manifest (merge develop vertion and create a branch with the specific current tags)" + ## ## @brief Add argument to the specific action @@ -32,11 +37,12 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(my_args, section): - pass + pass # must be on the branch we choice to merge ... + ## ## @brief Execute the action required. ## @@ -47,134 +53,174 @@ def add_specific_arguments(my_args, section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - argument_remote_name = "" - for elem in _arguments: - debug.error("pull Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - - file_source_manifest = os.path.join(env.get_island_path_manifest(), configuration.get_manifest_name()) - if os.path.exists(file_source_manifest) == False: - debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") - - elem = configuration.get_manifest_config() - - mani = manifest.Manifest(file_source_manifest) - - destination_branch = mani.deliver_master - source_branch = mani.deliver_develop - - # Check the manifest is up to date ... - base_display = tools.get_list_base_display(0, 0, elem) - debug.verbose("deliver-ckeck: " + base_display) - if status.deliver_check(elem, argument_remote_name, 0, base_display, source_branch, destination_branch) == False: - debug.error("Can not deliver a MANIFEST that is not ready to merge", crash=False) - return env.ret_action_fail - - - all_tags = check_all_tags(mani) - if all_tags == None: - debug.error("Need the Tags are set in sub-repository", crash=False) - return env.ret_action_fail - - - # deliver the manifest (if Needed ...) - base_display = tools.get_list_base_display(0, 0, elem) - - debug.info("manifest-deliver: ========================================================================") - debug.info("manifest-deliver: == " + base_display) - debug.info("manifest-deliver: ========================================================================") - - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - # Check the validity of the version, - version_description, add_in_version_management = status.get_current_version_repo(git_repo_path) - if version_description == None: - return env.ret_action_fail - debug.info("manifest-deliver: ==> version: " + str(version_description)) - - # go to the dev branch - select_branch = commands.get_current_branch(git_repo_path) - - - # create new repo tag - new_version_description = status.create_new_version_repo(git_repo_path, version_description, add_in_version_management, source_branch, destination_branch) - debug.info("new version: " + str(new_version_description)) - if new_version_description == None: - return - # merge branch - commands.checkout(git_repo_path, destination_branch) - if mani.deliver_mode == "merge": - merge_force = True - else: - merge_force = False - commands.merge_branch_on_master(git_repo_path, source_branch, merge_force, branch_destination=destination_branch) - - manifest.tag_manifest(file_source_manifest, all_tags); - - version_path_file = os.path.join(git_repo_path, "version.txt") - # update version file: - tools.file_write_data(version_path_file, tools.version_to_string(new_version_description)) - commands.add_file(git_repo_path, version_path_file) - commands.commit_all(git_repo_path, "[RELEASE] Release v" + tools.version_to_string(new_version_description)) - commands.tag(git_repo_path, "v" + tools.version_to_string(new_version_description)) - commands.checkout(git_repo_path, source_branch) - commands.reset_hard(git_repo_path, destination_branch) - new_version_description.append("dev") - manifest.tag_clear(file_source_manifest); - tools.file_write_data(version_path_file, tools.version_to_string(new_version_description)) - commands.add_file(git_repo_path, version_path_file) - commands.commit_all(git_repo_path, status.default_update_message) - commands.checkout(git_repo_path, destination_branch) - - - debug.info("manifest-deliver: ==> DONE") - + argument_remote_name = "" + for elem in _arguments: + debug.error( + "pull Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + + # check system is OK + manifest.check_lutin_is_init() + + configuration = config.get_unique_config() + + file_source_manifest = os.path.join( + env.get_island_path_manifest(), configuration.get_manifest_name() + ) + if os.path.exists(file_source_manifest) == False: + debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") + + elem = configuration.get_manifest_config() + + mani = manifest.Manifest(file_source_manifest) + + destination_branch = mani.deliver_master + source_branch = mani.deliver_develop + + # Check the manifest is up to date ... + base_display = tools.get_list_base_display(0, 0, elem) + debug.verbose("deliver-ckeck: " + base_display) + if ( + status.deliver_check( + elem, + argument_remote_name, + 0, + base_display, + source_branch, + destination_branch, + ) + == False + ): + debug.error( + "Can not deliver a MANIFEST that is not ready to merge", crash=False + ) + return env.ret_action_fail + + all_tags = check_all_tags(mani) + if all_tags == None: + debug.error("Need the Tags are set in sub-repository", crash=False) + return env.ret_action_fail + + # deliver the manifest (if Needed ...) + base_display = tools.get_list_base_display(0, 0, elem) + + debug.info( + "manifest-deliver: ========================================================================" + ) + debug.info("manifest-deliver: == " + base_display) + debug.info( + "manifest-deliver: ========================================================================" + ) + + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + # Check the validity of the version, + version_description, add_in_version_management = status.get_current_version_repo( + git_repo_path + ) + if version_description == None: + return env.ret_action_fail + debug.info("manifest-deliver: ==> version: " + str(version_description)) + + # go to the dev branch + select_branch = commands.get_current_branch(git_repo_path) + + # create new repo tag + new_version_description = status.create_new_version_repo( + git_repo_path, + version_description, + add_in_version_management, + source_branch, + destination_branch, + ) + debug.info("new version: " + str(new_version_description)) + if new_version_description == None: + return + # merge branch + commands.checkout(git_repo_path, destination_branch) + if mani.deliver_mode == "merge": + merge_force = True + else: + merge_force = False + commands.merge_branch_on_master( + git_repo_path, source_branch, merge_force, branch_destination=destination_branch + ) + + manifest.tag_manifest(file_source_manifest, all_tags) + + version_path_file = os.path.join(git_repo_path, "version.txt") + # update version file: + tools.file_write_data( + version_path_file, tools.version_to_string(new_version_description) + ) + commands.add_file(git_repo_path, version_path_file) + commands.commit_all( + git_repo_path, + "[RELEASE] Release v" + tools.version_to_string(new_version_description), + ) + commands.tag(git_repo_path, "v" + tools.version_to_string(new_version_description)) + commands.checkout(git_repo_path, source_branch) + commands.reset_hard(git_repo_path, destination_branch) + new_version_description.append("dev") + manifest.tag_clear(file_source_manifest) + tools.file_write_data( + version_path_file, tools.version_to_string(new_version_description) + ) + commands.add_file(git_repo_path, version_path_file) + commands.commit_all(git_repo_path, status.default_update_message) + commands.checkout(git_repo_path, destination_branch) + + debug.info("manifest-deliver: ==> DONE") def check_all_tags(mani): - all_project = mani.get_all_configs() - debug.info("Check all: " + str(len(all_project)) + " projects have a current tag ...") - id_element = 0 - check_have_error = False - list_tags = [] - for elem in all_project: - id_element += 1 - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - if elem.volatile == True: - debug.info(base_display + "\r\t\t\t\t\t\t\t\t\t" + " (Not Managed)") - continue - tags_comment = "" - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - if os.path.exists(git_repo_path) == False: - debug.error(base_display + volatile + "\r\t\t\t\t\t\t\t\t\t" + " (not download)", crash=False) - check_have_error = True - continue - ret_current_tags = commands.get_tags_current(git_repo_path) - debug.verbose("tags found: " + str(ret_current_tags)) - if len(ret_current_tags) == 0: - list_tags.append({ - "name":elem.name, - "tag":"" - }) - else: - list_tags.append({ - "name":elem.name, - "tag":ret_current_tags[0] - }) - for elem_tag in ret_current_tags: - if len(tags_comment) != 0: - tags_comment += "," - tags_comment += elem_tag - if len(ret_current_tags) == 0: - debug.error(base_display + "\r\t\t\t\t\t\t\t\t\t" + " (NO TAG DETECTED)", crash=False) - check_have_error = True - continue - else: - debug.info(base_display + "\r\t\t\t\t\t\t\t\t\t" + " " + tags_comment) - if check_have_error == True: - return None - return list_tags - \ No newline at end of file + all_project = mani.get_all_configs() + debug.info( + "Check all: " + str(len(all_project)) + " projects have a current tag ..." + ) + id_element = 0 + check_have_error = False + list_tags = [] + for elem in all_project: + id_element += 1 + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + if elem.volatile == True: + debug.info(base_display + "\r\t\t\t\t\t\t\t\t\t" + " (Not Managed)") + continue + tags_comment = "" + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + if os.path.exists(git_repo_path) == False: + debug.error( + base_display + + volatile + + "\r\t\t\t\t\t\t\t\t\t" + + " (not download)", + crash=False, + ) + check_have_error = True + continue + ret_current_tags = commands.get_tags_current(git_repo_path) + debug.verbose("tags found: " + str(ret_current_tags)) + if len(ret_current_tags) == 0: + list_tags.append({"name": elem.name, "tag": ""}) + else: + list_tags.append({"name": elem.name, "tag": ret_current_tags[0]}) + for elem_tag in ret_current_tags: + if len(tags_comment) != 0: + tags_comment += "," + tags_comment += elem_tag + if len(ret_current_tags) == 0: + debug.error( + base_display + "\r\t\t\t\t\t\t\t\t\t" + " (NO TAG DETECTED)", + crash=False, + ) + check_have_error = True + continue + else: + debug.info(base_display + "\r\t\t\t\t\t\t\t\t\t" + " " + tags_comment) + if check_have_error == True: + return None + return list_tags diff --git a/island/actions/islandAction_manifest-status.py b/island/actions/islandAction_manifest-status.py index e82fd9b..8e0df4f 100644 --- a/island/actions/islandAction_manifest-status.py +++ b/island/actions/islandAction_manifest-status.py @@ -8,23 +8,28 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands -import status import os +from realog import debug +import status + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Display status spécifically of the manifest" + return "Display status spécifically of the manifest" + ## ## @brief Add argument to the specific action @@ -32,7 +37,13 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(_my_args, _section): - _my_args.add("t", "tags", haveParam=False, desc="Display if the commit is on a tag (and display it)") + _my_args.add( + "t", + "tags", + haveParam=False, + desc="Display if the commit is on a tag (and display it)", + ) + ## ## @brief Execute the action required. @@ -44,20 +55,28 @@ def add_specific_arguments(_my_args, _section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - argument_remote_name = "" - argument_display_tag = False - for elem in _arguments: - if elem.get_option_name() == "tags": - argument_display_tag = True - else: - debug.error("Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - elem = configuration.get_manifest_config() - base_display = tools.get_list_base_display(0, 0, elem) - ret = status.display_status(elem, argument_remote_name, argument_display_tag, 0, base_display) - if ret != None: - return env.ret_action_need_updtate \ No newline at end of file + argument_remote_name = "" + argument_display_tag = False + for elem in _arguments: + if elem.get_option_name() == "tags": + argument_display_tag = True + else: + debug.error( + "Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + + # check system is OK + manifest.check_lutin_is_init() + + configuration = config.get_unique_config() + elem = configuration.get_manifest_config() + base_display = tools.get_list_base_display(0, 0, elem) + ret = status.display_status( + elem, argument_remote_name, argument_display_tag, 0, base_display + ) + if ret != None: + return env.ret_action_need_updtate diff --git a/island/actions/islandAction_manifest-sync.py b/island/actions/islandAction_manifest-sync.py index f2f8222..4eac2f1 100644 --- a/island/actions/islandAction_manifest-sync.py +++ b/island/actions/islandAction_manifest-sync.py @@ -8,22 +8,27 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands import os +from realog import debug + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Syncronize all the repository referenced" + return "Syncronize all the repository referenced" + ## ## @brief Add argument to the specific action @@ -31,7 +36,8 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(my_args, section): - pass + pass + ## ## @brief Execute the action required. @@ -43,18 +49,25 @@ def add_specific_arguments(my_args, section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - for elem in _arguments: - debug.error("pull Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - - debug.info("update manifest : '" + str(env.get_island_path_manifest()) + "'") - is_modify_manifest = commands.check_repository_is_modify(env.get_island_path_manifest()) - if is_modify_manifest == True: - commands.fetch(env.get_island_path_manifest(), "origin") - else: - commands.pull(env.get_island_path_manifest(), "origin") - \ No newline at end of file + for elem in _arguments: + debug.error( + "pull Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + + # check system is OK + manifest.check_lutin_is_init() + + configuration = config.get_unique_config() + + debug.info("update manifest : '" + str(env.get_island_path_manifest()) + "'") + is_modify_manifest = commands.check_repository_is_modify( + env.get_island_path_manifest() + ) + if is_modify_manifest == True: + commands.fetch(env.get_island_path_manifest(), "origin") + else: + commands.pull(env.get_island_path_manifest(), "origin") diff --git a/island/actions/islandAction_push.py b/island/actions/islandAction_push.py index 995bf81..13501b3 100644 --- a/island/actions/islandAction_push.py +++ b/island/actions/islandAction_push.py @@ -8,22 +8,27 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands import os +from realog import debug + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Push all repository to the upper server" + return "Push all repository to the upper server" + ## ## @brief Add argument to the specific action @@ -31,7 +36,8 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(_my_args, _section): - _my_args.add("r", "remote", haveParam=True, desc="Name of the remote server") + _my_args.add("r", "remote", haveParam=True, desc="Name of the remote server") + ## ## @brief Execute the action required. @@ -43,72 +49,83 @@ def add_specific_arguments(_my_args, _section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - argument_remote_name = "" - for elem in _arguments: - if elem.get_option_name() == "remote": - debug.info("find remote name: '" + elem.get_arg() + "'") - argument_remote_name = elem.get_arg() - else: - debug.error("Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - - file_source_manifest = os.path.join(env.get_island_path_manifest(), configuration.get_manifest_name()) - if os.path.exists(file_source_manifest) == False: - debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") - mani = manifest.Manifest(file_source_manifest) - - all_project = mani.get_all_configs() - debug.info("fetch : " + str(len(all_project)) + " projects") - id_element = 0 - for elem in all_project: - id_element += 1 - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - debug.info("push: " + base_display) - tools.wait_for_server_if_needed() - #debug.debug("elem : " + str(elem)) - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - if os.path.exists(git_repo_path) == False: - debug.error("can not push project that not exist") - continue - - if os.path.exists(os.path.join(git_repo_path,".git")) == False: - # path already exist but it is not used to as a git repo ==> this is an error - debug.error("path '" + git_repo_path + "' exist but not used for a git repository. Clean it and restart") - - # get the current branch: - # get local branch - cmd = "git branch -a" - debug.verbose("execute : " + cmd) - ret_branch = multiprocess.run_command(cmd, cwd=git_repo_path) - list_branch = ret_branch[1].split('\n') - list_branch2 = [] - list_branch3 = [] - select_branch = "" - for elem_branch in list_branch: - if len(elem_branch.split(" -> ")) != 1: - continue - if elem_branch[2:10] == "remotes/": - elem_branch = elem_branch[:2] + elem_branch[10:] - if elem_branch[:2] == "* ": - list_branch2.append([elem_branch[2:], True]) - select_branch = elem_branch[2:] - else: - list_branch2.append([elem_branch[2:], False]) - list_branch3.append(elem_branch[2:]) - - # simply update the repository ... - debug.verbose("Push project: ") - # fetch the repository - cmd = "git push" - if argument_remote_name != "": - cmd += " " + argument_remote_name - else: - cmd += " " + elem.select_remote["name"] - cmd += " " + select_branch + ":" + select_branch - debug.info("execute : " + cmd) - multiprocess.run_command_direct(cmd, cwd=git_repo_path) - + argument_remote_name = "" + for elem in _arguments: + if elem.get_option_name() == "remote": + debug.info("find remote name: '" + elem.get_arg() + "'") + argument_remote_name = elem.get_arg() + else: + debug.error( + "Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + + # check system is OK + manifest.check_lutin_is_init() + + configuration = config.get_unique_config() + + file_source_manifest = os.path.join( + env.get_island_path_manifest(), configuration.get_manifest_name() + ) + if os.path.exists(file_source_manifest) == False: + debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") + mani = manifest.Manifest(file_source_manifest) + + all_project = mani.get_all_configs() + debug.info("fetch : " + str(len(all_project)) + " projects") + id_element = 0 + for elem in all_project: + id_element += 1 + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + debug.info("push: " + base_display) + tools.wait_for_server_if_needed() + # debug.debug("elem : " + str(elem)) + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + if os.path.exists(git_repo_path) == False: + debug.error("can not push project that not exist") + continue + + if os.path.exists(os.path.join(git_repo_path, ".git")) == False: + # path already exist but it is not used to as a git repo ==> this is an error + debug.error( + "path '" + + git_repo_path + + "' exist but not used for a git repository. Clean it and restart" + ) + + # get the current branch: + # get local branch + cmd = "git branch -a" + debug.verbose("execute : " + cmd) + ret_branch = multiprocess.run_command(cmd, cwd=git_repo_path) + list_branch = ret_branch[1].split("\n") + list_branch2 = [] + list_branch3 = [] + select_branch = "" + for elem_branch in list_branch: + if len(elem_branch.split(" -> ")) != 1: + continue + if elem_branch[2:10] == "remotes/": + elem_branch = elem_branch[:2] + elem_branch[10:] + if elem_branch[:2] == "* ": + list_branch2.append([elem_branch[2:], True]) + select_branch = elem_branch[2:] + else: + list_branch2.append([elem_branch[2:], False]) + list_branch3.append(elem_branch[2:]) + + # simply update the repository ... + debug.verbose("Push project: ") + # fetch the repository + cmd = "git push" + if argument_remote_name != "": + cmd += " " + argument_remote_name + else: + cmd += " " + elem.select_remote["name"] + cmd += " " + select_branch + ":" + select_branch + debug.info("execute : " + cmd) + multiprocess.run_command_direct(cmd, cwd=git_repo_path) diff --git a/island/actions/islandAction_status.py b/island/actions/islandAction_status.py index 103de9f..fdef69f 100644 --- a/island/actions/islandAction_status.py +++ b/island/actions/islandAction_status.py @@ -8,23 +8,28 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import multiprocess -from island import config -from island import manifest -from island import commands -import status import os +from realog import debug +import status + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Get the status of all the repositories" + return "Get the status of all the repositories" + ## ## @brief Add argument to the specific action @@ -32,8 +37,14 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(_my_args, _section): - _my_args.add("r", "remote", haveParam=True, desc="Name of the remote server") - _my_args.add("t", "tags", haveParam=False, desc="Display if the commit is on a tag (and display it)") + _my_args.add("r", "remote", haveParam=True, desc="Name of the remote server") + _my_args.add( + "t", + "tags", + haveParam=False, + desc="Display if the commit is on a tag (and display it)", + ) + ## ## @brief Execute the action required. @@ -45,48 +56,59 @@ def add_specific_arguments(_my_args, _section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - argument_remote_name = "" - argument_display_tag = False - for elem in _arguments: - if elem.get_option_name() == "remote": - debug.info("find remote name: '" + elem.get_arg() + "'") - argument_remote_name = elem.get_arg() - elif elem.get_option_name() == "tags": - argument_display_tag = True - else: - debug.error("Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - configuration = config.get_unique_config() - - file_source_manifest = os.path.join(env.get_island_path_manifest(), configuration.get_manifest_name()) - if os.path.exists(file_source_manifest) == False: - debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") - - mani = manifest.Manifest(file_source_manifest) - is_modify_manifest = commands.check_repository_is_modify(env.get_island_path_manifest()) - if is_modify_manifest == True: - debug.info("!!!!!!!!!!!! MANIFEST is modify !!!!!!!!") - - - all_project = mani.get_all_configs() - debug.info("status of: " + str(len(all_project)) + " projects") - id_element = 0 - - elem = configuration.get_manifest_config() - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - status.display_status(elem, argument_remote_name, argument_display_tag, id_element, base_display) - - is_behind = False - for elem in all_project: - id_element += 1 - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - ret = status.display_status(elem, argument_remote_name, argument_display_tag, id_element, base_display) - if ret != None: - is_behind = True - - if is_behind == True: - return env.ret_action_need_updtate - + argument_remote_name = "" + argument_display_tag = False + for elem in _arguments: + if elem.get_option_name() == "remote": + debug.info("find remote name: '" + elem.get_arg() + "'") + argument_remote_name = elem.get_arg() + elif elem.get_option_name() == "tags": + argument_display_tag = True + else: + debug.error( + "Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + # check system is OK + manifest.check_lutin_is_init() + configuration = config.get_unique_config() + + file_source_manifest = os.path.join( + env.get_island_path_manifest(), configuration.get_manifest_name() + ) + if os.path.exists(file_source_manifest) == False: + debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") + + mani = manifest.Manifest(file_source_manifest) + is_modify_manifest = commands.check_repository_is_modify( + env.get_island_path_manifest() + ) + if is_modify_manifest == True: + debug.info("!!!!!!!!!!!! MANIFEST is modify !!!!!!!!") + + all_project = mani.get_all_configs() + debug.info("status of: " + str(len(all_project)) + " projects") + id_element = 0 + + elem = configuration.get_manifest_config() + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + status.display_status( + elem, argument_remote_name, argument_display_tag, id_element, base_display + ) + + is_behind = False + for elem in all_project: + id_element += 1 + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + ret = status.display_status( + elem, argument_remote_name, argument_display_tag, id_element, base_display + ) + if ret != None: + is_behind = True + + if is_behind == True: + return env.ret_action_need_updtate diff --git a/island/actions/islandAction_sync-local.py b/island/actions/islandAction_sync-local.py index 0438064..65938f0 100644 --- a/island/actions/islandAction_sync-local.py +++ b/island/actions/islandAction_sync-local.py @@ -8,23 +8,28 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands -import update_links import os +from realog import debug +import update_links + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Update all the branche to the trackin branch in local (no remote access)" + return "Update all the branche to the trackin branch in local (no remote access)" + ## ## @brief Add argument to the specific action @@ -32,7 +37,13 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(my_args, section): - my_args.add("r", "reset", haveParam=False, desc="Rebase the repository instead of 'reset --hard'") + my_args.add( + "r", + "reset", + haveParam=False, + desc="Rebase the repository instead of 'reset --hard'", + ) + ## ## @brief Execute the action required. @@ -46,115 +57,144 @@ def add_specific_arguments(my_args, section): ## -13 : env.ret_action_partial_done : ACTION partially done ## def execute(_arguments): - reset_instead_of_rebase = False - for elem in _arguments: - if elem.get_option_name() == "rebase": - reset_instead_of_rebase = True - debug.info("==> Request reset instead of rebase") - else: - debug.error("SYNC Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'", ret_value=env.ret_action_wrong_parameters) - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - - debug.info("update manifest : '" + str(env.get_island_path_manifest()) + "'") - is_modify_manifest = commands.check_repository_is_modify(env.get_island_path_manifest()) - if is_modify_manifest == True: - debug.warning("Manifest is modify") - else: - ret_track = commands.get_current_tracking_branch(env.get_island_path_manifest()) - is_forward = commands.is_forward(env.get_island_path_manifest(), ret_track) - if is_forward == True: - # fetch the repository - debug.warning("sync-local: Not update ==> the MANIFEST is forward the remote branch " + str(commands.get_forward(env.get_island_path_manifest(), ret_track))) - else: - debug.verbose("Check behind:") - is_behind = commands.is_behind(env.get_island_path_manifest(), ret_track) - if is_behind == False: - # fetch the repository - debug.info("sync-local: MANIFEST is up-to-date") - else: - if reset_instead_of_rebase == True: - debug.info("sync-local: MANIFEST Reset to " + ret_track) - commands.reset_hard(env.get_island_path_manifest(), ret_track) - else: - debug.info("sync-local: MANIFEST Rebase to " + ret_track) - commands.rebase(env.get_island_path_manifest(), ret_track) - - file_source_manifest = os.path.join(env.get_island_path_manifest(), configuration.get_manifest_name()) - if os.path.exists(file_source_manifest) == False: - debug.error("Missing manifest file : '" + str(file_source_manifest) + "'", ret_value=env.ret_manifest_is_not_existing) - - mani = manifest.Manifest(file_source_manifest) - - all_project = mani.get_all_configs() - debug.info("synchronize : " + str(len(all_project)) + " projects") - id_element = 0 - count_error = 0 - for elem in all_project: - id_element += 1 - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - debug.info("----------------------------------------------------------------") - debug.info("sync-local: " + base_display) - #debug.debug("elem : " + str(elem)) - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - if os.path.exists(git_repo_path) == False: - # The Repository does not exist ==> Nothing to do... - debug.warning("sync-local: ==> Not download") - count_error += 1 - continue - - if os.path.exists(os.path.join(git_repo_path,".git")) == False: - # path already exist but it is not used to as a git repo ==> this is an error - debug.warning("sync-local: is already existing but not used for a git repository. Remove it and sync") - count_error += 1 - continue - - # simply update the repository ... - debug.verbose("Check modify:") - is_modify = commands.check_repository_is_modify(git_repo_path) - if is_modify == True: - # fetch the repository - debug.warning("sync-local: Not update ==> the repository is modified (pass through)") - count_error += 1 - continue - debug.verbose("Check tracking and local branch:") - # get tracking branch - ret_track = commands.get_current_tracking_branch(git_repo_path) - select_branch = commands.get_current_branch(git_repo_path) - debug.debug("sync-local: check: " + select_branch + " ==> " + ret_track) - debug.verbose("Check forward:") - is_forward = commands.is_forward(git_repo_path, ret_track) - if is_forward == True: - # fetch the repository - debug.warning("sync-local: Not update ==> the repository is forward the remote branch " + str(commands.get_forward(git_repo_path, ret_track))) - count_error += 1 - continue - debug.verbose("Check behind:") - is_behind = commands.is_behind(git_repo_path, ret_track) - if is_behind == False: - # fetch the repository - debug.info("sync-local: Nothing to do.") - continue - if reset_instead_of_rebase == True: - debug.info("sync-local: Reset to " + ret_track) - commands.reset_hard(git_repo_path, ret_track) - else: - debug.info("sync-local: Reset to " + ret_track) - commands.rebase(git_repo_path, ret_track) - if count_error != 0: - debug.info(" ***********************************************************") - debug.info(" ** local sync partial warning on " + str(count_error) + " repository") - debug.info(" ***********************************************************") - return env.ret_action_partial_done - - ## Update the links: - have_error = update_links.update(configuration, mani, "sync-local") - if have_error == True: - return -1 - return None + reset_instead_of_rebase = False + for elem in _arguments: + if elem.get_option_name() == "rebase": + reset_instead_of_rebase = True + debug.info("==> Request reset instead of rebase") + else: + debug.error( + "SYNC Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'", + ret_value=env.ret_action_wrong_parameters, + ) + # check system is OK + manifest.check_lutin_is_init() + configuration = config.get_unique_config() + debug.info("update manifest : '" + str(env.get_island_path_manifest()) + "'") + is_modify_manifest = commands.check_repository_is_modify( + env.get_island_path_manifest() + ) + if is_modify_manifest == True: + debug.warning("Manifest is modify") + else: + ret_track = commands.get_current_tracking_branch(env.get_island_path_manifest()) + is_forward = commands.is_forward(env.get_island_path_manifest(), ret_track) + if is_forward == True: + # fetch the repository + debug.warning( + "sync-local: Not update ==> the MANIFEST is forward the remote branch " + + str(commands.get_forward(env.get_island_path_manifest(), ret_track)) + ) + else: + debug.verbose("Check behind:") + is_behind = commands.is_behind(env.get_island_path_manifest(), ret_track) + if is_behind == False: + # fetch the repository + debug.info("sync-local: MANIFEST is up-to-date") + else: + if reset_instead_of_rebase == True: + debug.info("sync-local: MANIFEST Reset to " + ret_track) + commands.reset_hard(env.get_island_path_manifest(), ret_track) + else: + debug.info("sync-local: MANIFEST Rebase to " + ret_track) + commands.rebase(env.get_island_path_manifest(), ret_track) + + file_source_manifest = os.path.join( + env.get_island_path_manifest(), configuration.get_manifest_name() + ) + if os.path.exists(file_source_manifest) == False: + debug.error( + "Missing manifest file : '" + str(file_source_manifest) + "'", + ret_value=env.ret_manifest_is_not_existing, + ) + + mani = manifest.Manifest(file_source_manifest) + + all_project = mani.get_all_configs() + debug.info("synchronize : " + str(len(all_project)) + " projects") + id_element = 0 + count_error = 0 + for elem in all_project: + id_element += 1 + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + debug.info("----------------------------------------------------------------") + debug.info("sync-local: " + base_display) + # debug.debug("elem : " + str(elem)) + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + if os.path.exists(git_repo_path) == False: + # The Repository does not exist ==> Nothing to do... + debug.warning("sync-local: ==> Not download") + count_error += 1 + continue + + if os.path.exists(os.path.join(git_repo_path, ".git")) == False: + # path already exist but it is not used to as a git repo ==> this is an error + debug.warning( + "sync-local: is already existing but not used for a git repository. Remove it and sync" + ) + count_error += 1 + continue + + # simply update the repository ... + debug.verbose("Check modify:") + is_modify = commands.check_repository_is_modify(git_repo_path) + if is_modify == True: + # fetch the repository + debug.warning( + "sync-local: Not update ==> the repository is modified (pass through)" + ) + count_error += 1 + continue + debug.verbose("Check tracking and local branch:") + # get tracking branch + ret_track = commands.get_current_tracking_branch(git_repo_path) + select_branch = commands.get_current_branch(git_repo_path) + debug.debug("sync-local: check: " + select_branch + " ==> " + ret_track) + debug.verbose("Check forward:") + is_forward = commands.is_forward(git_repo_path, ret_track) + if is_forward == True: + # fetch the repository + debug.warning( + "sync-local: Not update ==> the repository is forward the remote branch " + + str(commands.get_forward(git_repo_path, ret_track)) + ) + count_error += 1 + continue + debug.verbose("Check behind:") + is_behind = commands.is_behind(git_repo_path, ret_track) + if is_behind == False: + # fetch the repository + debug.info("sync-local: Nothing to do.") + continue + if reset_instead_of_rebase == True: + debug.info("sync-local: Reset to " + ret_track) + commands.reset_hard(git_repo_path, ret_track) + else: + debug.info("sync-local: Reset to " + ret_track) + commands.rebase(git_repo_path, ret_track) + if count_error != 0: + debug.info( + " ***********************************************************" + ) + debug.info( + " ** local sync partial warning on " + + str(count_error) + + " repository" + ) + debug.info( + " ***********************************************************" + ) + return env.ret_action_partial_done + + ## Update the links: + have_error = update_links.update(configuration, mani, "sync-local") + if have_error == True: + return -1 + return None diff --git a/island/actions/islandAction_sync.py b/island/actions/islandAction_sync.py index c9f9571..c98e801 100644 --- a/island/actions/islandAction_sync.py +++ b/island/actions/islandAction_sync.py @@ -8,29 +8,36 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands -import update_links import os +from realog import debug +import update_links + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Syncronize all the repository referenced" + return "Syncronize all the repository referenced" + ## ## @brief at the end of the help wa have the example section ## @return (string) the Example description string ## def help_example(): - return "island init https://git.heeroyui.org/atria-tools/island.git" + return "island init https://git.heeroyui.org/atria-tools/island.git" + ## ## @brief Add argument to the specific action @@ -38,7 +45,13 @@ def help_example(): ## @param[in] section Name of the currect action ## def add_specific_arguments(my_args, section): - my_args.add("d", "download", haveParam=False, desc="Just download the 'not download' repository") + my_args.add( + "d", + "download", + haveParam=False, + desc="Just download the 'not download' repository", + ) + ## ## @brief Execute the action required. @@ -50,141 +63,168 @@ def add_specific_arguments(my_args, section): ## -12 : ACTION Wrong parameters ## def execute(_arguments): - just_download = False - for elem in _arguments: - if elem.get_option_name() == "download": - just_download = True - debug.info("find remote name: '" + elem.get_arg() + "'") - else: - debug.error("SYNC Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - configuration = config.get_unique_config() - - # TODO: Load Old manifect to check diff ... - - debug.info("update manifest : '" + str(env.get_island_path_manifest()) + "'") - is_modify_manifest = commands.check_repository_is_modify(env.get_island_path_manifest()) - if is_modify_manifest == True: - commands.fetch(env.get_island_path_manifest(), "origin") - else: - commands.pull(env.get_island_path_manifest(), "origin") - - file_source_manifest = os.path.join(env.get_island_path_manifest(), configuration.get_manifest_name()) - if os.path.exists(file_source_manifest) == False: - debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") - - mani = manifest.Manifest(file_source_manifest) - - all_project = mani.get_all_configs() - debug.info("synchronize : " + str(len(all_project)) + " projects") - id_element = 0 - for elem in all_project: - id_element += 1 - base_display = tools.get_list_base_display(id_element, len(all_project), elem) - debug.info("sync : " + base_display) - tools.wait_for_server_if_needed() - #debug.debug("elem : " + str(elem)) - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - if elem.tag != None: - debug.warning("Need to select a specific tag version ... " + elem.tag) - if os.path.exists(git_repo_path) == False: - # this is a new clone ==> this is easy ... - #clone the manifest repository - address_manifest = "" - ### example git@git.plouf.com:basic_folder - address_manifest = elem.select_remote["fetch"] - if elem.select_remote["fetch"][0:4] == "git@" \ - and len(elem.select_remote["fetch"][4:].split(":")) <= 1: - address_manifest += ":" - else: - address_manifest += "/" - address_manifest += elem.name - debug.info("clone the repo") - ret = commands.clone(git_repo_path, address_manifest, branch_name=elem.branch, origin=elem.select_remote["name"]) - if ret[0] != "" \ - and ret[0] != False: - # all is good, ready to get the system work corectly - debug.info("'" + str(ret) + "'") - debug.error("Clone repository does not work ... ") - continue - # add global mirror list - for mirror in elem.select_remote["mirror"]: - debug.verbose("Add global mirror: " + str(mirror)) - cmd = "git remote add " + mirror["name"] + " " + mirror["fetch"] - if mirror["fetch"][0:4] == "git@": - cmd += ":" - else: - cmd += "/" - cmd += elem.name - ret = multiprocess.run_command_direct(cmd, cwd=git_repo_path) - if ret != "" \ - and ret != False: - # all is good, ready to get the system work corectly - debug.info("'" + str(ret) + "'") - debug.warning("Can not add global mirror ... ") - continue - debug.verbose("Add global mirror: " + str(mirror) + " (done)") - #debug.info("plop " + str(elem.select_remote.keys())) - # check submodule if requested: - if elem.select_remote["sync"] == True \ - and os.path.exists(os.path.join(git_repo_path, ".gitmodules")) == True: - debug.info(" ==> update submodule") - cmd = "git submodule init" - ret = multiprocess.run_command_direct(cmd, cwd=git_repo_path) - if ret != "" \ - and ret != False: - # all is good, ready to get the system work corectly - debug.info("'" + str(ret) + "'") - debug.error("Can not init submodules ... ") - continue - cmd = "git submodule update" - ret = multiprocess.run_command_direct(cmd, cwd=git_repo_path) - if ret[:16] == "Submodule path '": - #all is good ... - debug.info(" " + ret) - elif ret != "" \ - and ret != False: - # all is good, ready to get the system work corectly - debug.info("'" + str(ret) + "'") - debug.error("Can not init submodules ... ") - continue - continue - - if just_download == True: - debug.info("SYNC: Already downloaded") - continue - - if os.path.exists(os.path.join(git_repo_path,".git")) == False: - # path already exist but it is not used to as a git repo ==> this is an error - debug.error("path '" + git_repo_path + "' is already existing but not used for a git repository. Clean it and restart") - - # simply update the repository ... - debug.verbose("Fetching project: ") - - # get tracking branch - ret_track = commands.get_current_tracking_branch(git_repo_path) - is_modify = commands.check_repository_is_modify(git_repo_path) - select_branch = commands.get_current_branch(git_repo_path) - - if is_modify == True: - # fetch the repository - commands.fetch(git_repo_path, elem.select_remote["name"]) - debug.warning("[" + elem.name + "] Not update ==> the repository is modified (just fetch)") - continue - commands.pull(git_repo_path, elem.select_remote["name"]) - - debug.verbose("select branch = '" + select_branch + "' track: '" + str(ret_track) + "'") - # check submodule if requested: - if elem.select_remote["sync"] == True \ - and os.path.exists(os.path.join(git_repo_path, ".gitmodules")) == True: - debug.info(" ==> sync submodule") - commands.submodule_sync(git_repo_path) - - ## Update the links: - have_error = update_links.update(configuration, mani, "sync-local") - if have_error == True: - return -1 - return None \ No newline at end of file + just_download = False + for elem in _arguments: + if elem.get_option_name() == "download": + just_download = True + debug.info("find remote name: '" + elem.get_arg() + "'") + else: + debug.error( + "SYNC Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + + # check system is OK + manifest.check_lutin_is_init() + + configuration = config.get_unique_config() + + # TODO: Load Old manifect to check diff ... + + debug.info("update manifest : '" + str(env.get_island_path_manifest()) + "'") + is_modify_manifest = commands.check_repository_is_modify( + env.get_island_path_manifest() + ) + if is_modify_manifest == True: + commands.fetch(env.get_island_path_manifest(), "origin") + else: + commands.pull(env.get_island_path_manifest(), "origin") + + file_source_manifest = os.path.join( + env.get_island_path_manifest(), configuration.get_manifest_name() + ) + if os.path.exists(file_source_manifest) == False: + debug.error("Missing manifest file : '" + str(file_source_manifest) + "'") + + mani = manifest.Manifest(file_source_manifest) + + all_project = mani.get_all_configs() + debug.info("synchronize : " + str(len(all_project)) + " projects") + id_element = 0 + for elem in all_project: + id_element += 1 + base_display = tools.get_list_base_display(id_element, len(all_project), elem) + debug.info("sync : " + base_display) + tools.wait_for_server_if_needed() + # debug.debug("elem : " + str(elem)) + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + if elem.tag != None: + debug.warning("Need to select a specific tag version ... " + elem.tag) + if os.path.exists(git_repo_path) == False: + # this is a new clone ==> this is easy ... + # clone the manifest repository + address_manifest = "" + ### example git@git.plouf.com:basic_folder + address_manifest = elem.select_remote["fetch"] + if ( + elem.select_remote["fetch"][0:4] == "git@" + and len(elem.select_remote["fetch"][4:].split(":")) <= 1 + ): + address_manifest += ":" + else: + address_manifest += "/" + address_manifest += elem.name + debug.info("clone the repo") + ret = commands.clone( + git_repo_path, + address_manifest, + branch_name=elem.branch, + origin=elem.select_remote["name"], + ) + if ret[0] != "" and ret[0] != False: + # all is good, ready to get the system work corectly + debug.info("'" + str(ret) + "'") + debug.error("Clone repository does not work ... ") + continue + # add global mirror list + for mirror in elem.select_remote["mirror"]: + debug.verbose("Add global mirror: " + str(mirror)) + cmd = "git remote add " + mirror["name"] + " " + mirror["fetch"] + if mirror["fetch"][0:4] == "git@": + cmd += ":" + else: + cmd += "/" + cmd += elem.name + ret = multiprocess.run_command_direct(cmd, cwd=git_repo_path) + if ret != "" and ret != False: + # all is good, ready to get the system work corectly + debug.info("'" + str(ret) + "'") + debug.warning("Can not add global mirror ... ") + continue + debug.verbose("Add global mirror: " + str(mirror) + " (done)") + # debug.info("plop " + str(elem.select_remote.keys())) + # check submodule if requested: + if ( + elem.select_remote["sync"] == True + and os.path.exists(os.path.join(git_repo_path, ".gitmodules")) == True + ): + debug.info(" ==> update submodule") + cmd = "git submodule init" + ret = multiprocess.run_command_direct(cmd, cwd=git_repo_path) + if ret != "" and ret != False: + # all is good, ready to get the system work corectly + debug.info("'" + str(ret) + "'") + debug.error("Can not init submodules ... ") + continue + cmd = "git submodule update" + ret = multiprocess.run_command_direct(cmd, cwd=git_repo_path) + if ret[:16] == "Submodule path '": + # all is good ... + debug.info(" " + ret) + elif ret != "" and ret != False: + # all is good, ready to get the system work corectly + debug.info("'" + str(ret) + "'") + debug.error("Can not init submodules ... ") + continue + continue + + if just_download == True: + debug.info("SYNC: Already downloaded") + continue + + if os.path.exists(os.path.join(git_repo_path, ".git")) == False: + # path already exist but it is not used to as a git repo ==> this is an error + debug.error( + "path '" + + git_repo_path + + "' is already existing but not used for a git repository. Clean it and restart" + ) + + # simply update the repository ... + debug.verbose("Fetching project: ") + + # get tracking branch + ret_track = commands.get_current_tracking_branch(git_repo_path) + is_modify = commands.check_repository_is_modify(git_repo_path) + select_branch = commands.get_current_branch(git_repo_path) + + if is_modify == True: + # fetch the repository + commands.fetch(git_repo_path, elem.select_remote["name"]) + debug.warning( + "[" + + elem.name + + "] Not update ==> the repository is modified (just fetch)" + ) + continue + commands.pull(git_repo_path, elem.select_remote["name"]) + + debug.verbose( + "select branch = '" + select_branch + "' track: '" + str(ret_track) + "'" + ) + # check submodule if requested: + if ( + elem.select_remote["sync"] == True + and os.path.exists(os.path.join(git_repo_path, ".gitmodules")) == True + ): + debug.info(" ==> sync submodule") + commands.submodule_sync(git_repo_path) + + ## Update the links: + have_error = update_links.update(configuration, mani, "sync-local") + if have_error == True: + return -1 + return None diff --git a/island/actions/islandAction_volatile-add.py b/island/actions/islandAction_volatile-add.py index 05c9457..dacbb7e 100644 --- a/island/actions/islandAction_volatile-add.py +++ b/island/actions/islandAction_volatile-add.py @@ -8,21 +8,27 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import commands -from island import multiprocess -from island import manifest import os +from realog import debug + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "Add a 'volatile' repository with a local path (this element is update as an element in the manifest but is not managed by the manifest)" + return "Add a 'volatile' repository with a local path (this element is update as an element in the manifest but is not managed by the manifest)" + ## ## @brief Add argument to the specific action @@ -30,15 +36,21 @@ def help(): ## @param[in] section Name of the currect action ## def add_specific_arguments(my_args, section): - my_args.add_arg("git repository", optionnal=False, desc="Git repositoty to download") - my_args.add_arg("path", optionnal=False, desc="Path to install the new git repository") + my_args.add_arg( + "git repository", optionnal=False, desc="Git repositoty to download" + ) + my_args.add_arg( + "path", optionnal=False, desc="Path to install the new git repository" + ) + ## ## @brief at the end of the help wa have the example section ## @return (string) the Example description string ## def help_example(): - return "island volatile-add https://git.heeroyui.org/atria-tools/island.git git" + return "island volatile-add https://git.heeroyui.org/atria-tools/island.git git" + ## ## @brief Execute the action required. @@ -52,35 +64,44 @@ def help_example(): ## -13 : env.ret_action_partial_done : ACTION partially done ## def execute(_arguments): - if len(_arguments) == 0: - debug.error("Missing argument to execute the current action [git repository] [path]") - - # the configuration availlable: - path = "" - address_git = "" - for elem in _arguments: - if elem.get_option_name() == "git repository": - address_git = elem.get_arg() - elif elem.get_option_name() == "path": - path = elem.get_arg() - else: - debug.error("Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - if address_git == "": - debug.error("volatile-add: Missing git repository address", env.ret_action_wrong_parameters) - - debug.info("Add 'volatile' repository: '" + address_git + "' path='" + path + "'") - - # check system is OK - manifest.check_lutin_is_init() - - # Update the current configuration: - conf = config.get_unique_config() - # TODO: Check if the local path does not exist in the manifest - - if False == conf.add_volatile(address_git, path): - return env.ret_action_executing_system_error - conf.store() - return None + if len(_arguments) == 0: + debug.error( + "Missing argument to execute the current action [git repository] [path]" + ) + # the configuration availlable: + path = "" + address_git = "" + for elem in _arguments: + if elem.get_option_name() == "git repository": + address_git = elem.get_arg() + elif elem.get_option_name() == "path": + path = elem.get_arg() + else: + debug.error( + "Wrong argument: '" + + elem.get_option_name() + + "' '" + + elem.get_arg() + + "'" + ) + if address_git == "": + debug.error( + "volatile-add: Missing git repository address", + env.ret_action_wrong_parameters, + ) + + debug.info("Add 'volatile' repository: '" + address_git + "' path='" + path + "'") + + # check system is OK + manifest.check_lutin_is_init() + + # Update the current configuration: + conf = config.get_unique_config() + # TODO: Check if the local path does not exist in the manifest + + if False == conf.add_volatile(address_git, path): + return env.ret_action_executing_system_error + conf.store() + return None diff --git a/island/actions/islandAction_volatile-list.py b/island/actions/islandAction_volatile-list.py index 3a9e784..e63b98f 100644 --- a/island/actions/islandAction_volatile-list.py +++ b/island/actions/islandAction_volatile-list.py @@ -8,21 +8,27 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import commands -from island import multiprocess -from island import manifest import os +from realog import debug + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + + ## ## @brief Get the global description of the current action ## @return (string) the description string (fist line if reserved for the overview, all is for the specific display) ## def help(): - return "List all the volatil repository" + return "List all the volatil repository" + ## ## @brief Execute the action required. @@ -36,18 +42,18 @@ def help(): ## -13 : env.ret_action_partial_done : ACTION partially done ## def execute(_arguments): - for elem in _arguments: - debug.error("Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'") - - # check system is OK - manifest.check_lutin_is_init() - - conf = config.get_unique_config() - volatiles = conf.get_volatile() - debug.info("List of all volatiles repository: ") - for elem in volatiles: - debug.info("\t" + elem["path"] + "\r\t\t\t\t" + elem["git_address"]) - - return None + for elem in _arguments: + debug.error( + "Wrong argument: '" + elem.get_option_name() + "' '" + elem.get_arg() + "'" + ) + # check system is OK + manifest.check_lutin_is_init() + conf = config.get_unique_config() + volatiles = conf.get_volatile() + debug.info("List of all volatiles repository: ") + for elem in volatiles: + debug.info("\t" + elem["path"] + "\r\t\t\t\t" + elem["git_address"]) + + return None diff --git a/island/actions/status.py b/island/actions/status.py index b5efb63..20b46ee 100644 --- a/island/actions/status.py +++ b/island/actions/status.py @@ -8,15 +8,19 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env -from island import config -from island import multiprocess -from island import manifest -from island import commands import os +from realog import debug + +from island import ( + commands, + config, + env, + manifest, + multiprocess, + tools, +) + default_behind_message = "[DEV] update dev tag version" default_update_message = "[VERSION] update dev tag version" @@ -24,134 +28,195 @@ default_update_message = "[VERSION] update dev tag version" base_name_of_a_tagged_branch = "branch_on_tag_" -def display_status(elem, argument_remote_name, argument_display_tag, id_element, base_display): - volatile = "" - if elem.volatile == True: - volatile = " (volatile)" - debug.verbose("status : " + base_display) - #debug.debug("elem : " + str(elem)) - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - if os.path.exists(git_repo_path) == False: - debug.info(base_display + volatile + "\r\t\t\t\t\t\t\t\t\t" + " (not download)") - return - - is_modify = commands.check_repository_is_modify(git_repo_path) - list_branch = commands.get_list_branch_all(git_repo_path) - select_branch = commands.get_current_branch(git_repo_path) - debug.verbose("List all branch: " + str(list_branch)) - if select_branch[:len(base_name_of_a_tagged_branch)] != base_name_of_a_tagged_branch: - # get tracking branch - tracking_remote_branch = commands.get_tracking_branch(git_repo_path, argument_remote_name, select_branch) - if tracking_remote_branch == None: - debug.info(base_display + volatile + "\r\t\t\t\t\t\t\t (NO BRANCH)") - return - else: - tracking_remote_branch = select_branch[len(base_name_of_a_tagged_branch):] - modify_status = " " - if is_modify == True: - modify_status = " *** " - - debug.verbose("select branch = '" + select_branch + "' is modify : " + str(is_modify) + " track: '" + str(tracking_remote_branch) + "'") - - ret_current_branch_sha1 = commands.get_revision_list_to_branch(git_repo_path, select_branch) - ret_track_branch_sha1 = commands.get_revision_list_to_branch(git_repo_path, tracking_remote_branch) - # remove all identical sha1 ==> not needed for this - in_forward = 0 - for elem_sha1 in ret_current_branch_sha1: - if elem_sha1 not in ret_track_branch_sha1: - in_forward += 1 - in_behind = 0 - for elem_sha1 in ret_track_branch_sha1: - if elem_sha1 not in ret_current_branch_sha1: - in_behind += 1 - - behind_forward_comment = "" - if in_forward != 0: - behind_forward_comment += "forward=" + str(in_forward) - if in_behind != 0: - if in_forward != 0: - behind_forward_comment += " " - behind_forward_comment += "behind=" + str(in_behind) - if behind_forward_comment != "": - behind_forward_comment = "\r\t\t\t\t\t\t\t\t\t\t\t\t[" + behind_forward_comment + "]" - - - tags_comment = "" - # check the current tags of the repository - if argument_display_tag == True: - ret_current_tags = commands.get_tags_current(git_repo_path) - debug.verbose("tags found: " + str(ret_current_tags)) - for elem_tag in ret_current_tags: - if len(tags_comment) != 0: - tags_comment += "," - tags_comment += elem_tag - if len(tags_comment) != 0: - tags_comment = "\r\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[" + tags_comment + "]" - else: - tags_comment = "\r\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t- - - - -" - debug.info(base_display + volatile + "\r\t\t\t\t\t\t\t" + modify_status + "(" + select_branch + " -> " + tracking_remote_branch + ")" + behind_forward_comment + tags_comment) - if is_modify == True: - cmd = "git status --short" - debug.verbose("execute : " + cmd) - ret_diff = multiprocess.run_command(cmd, cwd=git_repo_path) - tmp_color_red = "\033[31m" - tmp_color_default= "\033[00m" - debug.info(tmp_color_red + ret_diff[1] + tmp_color_default) - return in_behind + +def display_status( + elem, argument_remote_name, argument_display_tag, id_element, base_display +): + volatile = "" + if elem.volatile == True: + volatile = " (volatile)" + debug.verbose("status : " + base_display) + # debug.debug("elem : " + str(elem)) + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + if os.path.exists(git_repo_path) == False: + debug.info( + base_display + volatile + "\r\t\t\t\t\t\t\t\t\t" + " (not download)" + ) + return + + is_modify = commands.check_repository_is_modify(git_repo_path) + list_branch = commands.get_list_branch_all(git_repo_path) + select_branch = commands.get_current_branch(git_repo_path) + debug.verbose("List all branch: " + str(list_branch)) + if ( + select_branch[: len(base_name_of_a_tagged_branch)] + != base_name_of_a_tagged_branch + ): + # get tracking branch + tracking_remote_branch = commands.get_tracking_branch( + git_repo_path, argument_remote_name, select_branch + ) + if tracking_remote_branch == None: + debug.info(base_display + volatile + "\r\t\t\t\t\t\t\t (NO BRANCH)") + return + else: + tracking_remote_branch = select_branch[len(base_name_of_a_tagged_branch) :] + modify_status = " " + if is_modify == True: + modify_status = " *** " + + debug.verbose( + "select branch = '" + + select_branch + + "' is modify : " + + str(is_modify) + + " track: '" + + str(tracking_remote_branch) + + "'" + ) + + ret_current_branch_sha1 = commands.get_revision_list_to_branch( + git_repo_path, select_branch + ) + ret_track_branch_sha1 = commands.get_revision_list_to_branch( + git_repo_path, tracking_remote_branch + ) + # remove all identical sha1 ==> not needed for this + in_forward = 0 + for elem_sha1 in ret_current_branch_sha1: + if elem_sha1 not in ret_track_branch_sha1: + in_forward += 1 + in_behind = 0 + for elem_sha1 in ret_track_branch_sha1: + if elem_sha1 not in ret_current_branch_sha1: + in_behind += 1 + + behind_forward_comment = "" + if in_forward != 0: + behind_forward_comment += "forward=" + str(in_forward) + if in_behind != 0: + if in_forward != 0: + behind_forward_comment += " " + behind_forward_comment += "behind=" + str(in_behind) + if behind_forward_comment != "": + behind_forward_comment = ( + "\r\t\t\t\t\t\t\t\t\t\t\t\t[" + behind_forward_comment + "]" + ) + + tags_comment = "" + # check the current tags of the repository + if argument_display_tag == True: + ret_current_tags = commands.get_tags_current(git_repo_path) + debug.verbose("tags found: " + str(ret_current_tags)) + for elem_tag in ret_current_tags: + if len(tags_comment) != 0: + tags_comment += "," + tags_comment += elem_tag + if len(tags_comment) != 0: + tags_comment = "\r\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t[" + tags_comment + "]" + else: + tags_comment = "\r\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t- - - - -" + debug.info( + base_display + + volatile + + "\r\t\t\t\t\t\t\t" + + modify_status + + "(" + + select_branch + + " -> " + + tracking_remote_branch + + ")" + + behind_forward_comment + + tags_comment + ) + if is_modify == True: + cmd = "git status --short" + debug.verbose("execute : " + cmd) + ret_diff = multiprocess.run_command(cmd, cwd=git_repo_path) + tmp_color_red = "\033[31m" + tmp_color_default = "\033[00m" + debug.info(tmp_color_red + ret_diff[1] + tmp_color_default) + return in_behind +def deliver_check( + elem, + argument_remote_name, + id_element, + base_display, + source_branch, + destination_branch, +): + deliver_availlable = True + debug.debug("deliver-ckeck: " + base_display) + debug.debug(" ==> check repo exist") + # Check the repo exist + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + if os.path.exists(git_repo_path) == False: + debug.warning("deliver-ckeck: " + base_display + " ==> MUST be download") + return False + debug.debug(" ==> check is modify") + # check if the curent repo is modify + is_modify = commands.check_repository_is_modify(git_repo_path) + if is_modify == True: + debug.warning("deliver-ckeck: " + base_display + " ==> MUST not be modify") + return False -def deliver_check(elem, argument_remote_name, id_element, base_display, source_branch, destination_branch): - deliver_availlable = True - debug.debug("deliver-ckeck: " + base_display) - debug.debug(" ==> check repo exist") - # Check the repo exist - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - if os.path.exists(git_repo_path) == False: - debug.warning("deliver-ckeck: " + base_display + " ==> MUST be download") - return False - debug.debug(" ==> check is modify") - # check if the curent repo is modify - is_modify = commands.check_repository_is_modify(git_repo_path) - if is_modify == True: - debug.warning("deliver-ckeck: " + base_display + " ==> MUST not be modify") - return False - - - debug.debug(" ==> check current branch is '" + source_branch + "'") - # check if we are on source_branch - select_branch = commands.get_current_branch(git_repo_path) - if select_branch != source_branch: - debug.warning("deliver-ckeck: " + base_display + " ==> MUST be on source branch: '" + source_branch + "' and is: '" + select_branch + "'") - return False - debug.debug(" ==> check have tracking branch") - # check if we have a remote traking branch - tracking_remote_branch = commands.get_tracking_branch(git_repo_path, argument_remote_name, select_branch) - if tracking_remote_branch == None: - debug.warning("deliver-ckeck: " + base_display + " ==> MUST have a remote tracking branch") - deliver_availlable = False - - - # go on destination branch - commands.checkout(git_repo_path, destination_branch) - # TODO: check return value - - debug.debug(" ==> check current branch is '" + source_branch + "'") - # check if we are on "master" - select_branch = commands.get_current_branch(git_repo_path) - if select_branch != destination_branch: - debug.warning("deliver-ckeck: " + base_display + " ==> Can not checkout branch: '" + destination_branch + "' and is: '" + select_branch + "'") - deliver_availlable = False - debug.debug(" ==> check have tracking branch") - # check if we have a remote traking branch - tracking_remote_branch = commands.get_tracking_branch(git_repo_path, argument_remote_name, select_branch) - if tracking_remote_branch == None: - debug.warning("deliver-ckeck: " + base_display + " ==> MUST have a remote tracking branch") - deliver_availlable = False - - - - """ + debug.debug(" ==> check current branch is '" + source_branch + "'") + # check if we are on source_branch + select_branch = commands.get_current_branch(git_repo_path) + if select_branch != source_branch: + debug.warning( + "deliver-ckeck: " + + base_display + + " ==> MUST be on source branch: '" + + source_branch + + "' and is: '" + + select_branch + + "'" + ) + return False + debug.debug(" ==> check have tracking branch") + # check if we have a remote traking branch + tracking_remote_branch = commands.get_tracking_branch( + git_repo_path, argument_remote_name, select_branch + ) + if tracking_remote_branch == None: + debug.warning( + "deliver-ckeck: " + base_display + " ==> MUST have a remote tracking branch" + ) + deliver_availlable = False + + # go on destination branch + commands.checkout(git_repo_path, destination_branch) + # TODO: check return value + + debug.debug(" ==> check current branch is '" + source_branch + "'") + # check if we are on "master" + select_branch = commands.get_current_branch(git_repo_path) + if select_branch != destination_branch: + debug.warning( + "deliver-ckeck: " + + base_display + + " ==> Can not checkout branch: '" + + destination_branch + + "' and is: '" + + select_branch + + "'" + ) + deliver_availlable = False + debug.debug(" ==> check have tracking branch") + # check if we have a remote traking branch + tracking_remote_branch = commands.get_tracking_branch( + git_repo_path, argument_remote_name, select_branch + ) + if tracking_remote_branch == None: + debug.warning( + "deliver-ckeck: " + base_display + " ==> MUST have a remote tracking branch" + ) + deliver_availlable = False + + """ # check if we have a local branch list_branch_local = commands.get_list_branch_local(git_repo_path) if destination_branch not in list_branch_local: @@ -163,277 +228,397 @@ def deliver_check(elem, argument_remote_name, id_element, base_display, source_b #sha_tracking = get_sha1_for_branch(git_repo_path, tracking_remote_branch) #sha_current = get_sha1_for_branch(git_repo_path, select_branch) """ - - # check out back the source branch - commands.checkout(git_repo_path, source_branch) - return deliver_availlable + + # check out back the source branch + commands.checkout(git_repo_path, source_branch) + return deliver_availlable def checkout_elem(elem, argument_remote_name, branch_to_checkout, base_display): - debug.verbose("checkout : " + base_display) - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - if os.path.exists(git_repo_path) == False: - debug.warning("checkout " + base_display + " ==> repository does not exist ...") - return False - - # check if the repository is modify - is_modify = commands.check_repository_is_modify(git_repo_path) - if is_modify == True: - debug.warning("checkout " + base_display + " ==> modify data can not checkout new branch") - return False - - list_branch_local = commands.get_list_branch_local(git_repo_path) - select_branch = commands.get_current_branch(git_repo_path) - - is_tag = False - if branch_to_checkout == "__TAG__": - branch_to_checkout = base_name_of_a_tagged_branch + str(elem.tag) - is_tag = True - if elem.volatile == True: - debug.info("checkout " + base_display + " ==> Can not checkout for 'volatile' repository") - return True - if elem.tag == None: - debug.info("checkout " + base_display + " ==> Can not checkout for '''None''' Tag") - return True - # check if we are on the good branch: - if branch_to_checkout == select_branch: - debug.info("checkout " + base_display + " ==> No change already on good branch") - return True - - # check if we have already checkout the branch before - debug.verbose(" check : " + branch_to_checkout + " in " + str(list_branch_local)) - if branch_to_checkout in list_branch_local: - cmd = "git checkout " + branch_to_checkout - debug.verbose("execute : " + cmd) - ret = multiprocess.run_command(cmd, cwd=git_repo_path) - if ret[0] != 0 \ - and ret[1] != "" \ - and ret != False: - debug.info("'" + str(ret) + "'") - debug.error("checkout " + base_display + " ==> Can not checkout to the correct branch") - return False - debug.info("checkout " + base_display + " ==> switch branch") - # TODO : Check the number of commit to the origin/XXX branch .... - return True - - list_tags = commands.get_tags(git_repo_path) - if branch_to_checkout in list_tags: - is_tag = True - if elem.tag == None: - elem.tag = branch_to_checkout - branch_to_checkout = base_name_of_a_tagged_branch + str(elem.tag) - - # Check if the remote branch exist ... - if is_tag == False: - list_branch_remote = commands.get_list_branch_remote(git_repo_path) - if elem.select_remote["name"] + "/" + branch_to_checkout in list_branch_remote: - debug.info(" ==> find ...") - else: - debug.info("checkout " + base_display + " ==> NO remote branch") - return True - # checkout the new branch: - cmd = "git checkout --quiet " + elem.select_remote["name"] + "/" + branch_to_checkout + " -b " + branch_to_checkout - # + " --track " + elem.select_remote["name"] + "/" + branch_to_checkout - debug.verbose("execute : " + cmd) - ret = multiprocess.run_command(cmd, cwd=git_repo_path) - if ret[1] != "" \ - and ret != False: - debug.info("'" + str(ret) + "'") - debug.error("checkout " + base_display + " ==> Can not checkout to the correct branch") - return False - debug.info("checkout " + base_display + " ==> create new branch") - return True - # Checkout a specific tags: - if elem.tag in list_tags: - debug.info(" ==> find ...") - else: - debug.info("checkout " + base_display + " ==> NO remote tags") - return True - # checkout the new branch: - cmd = "git checkout --quiet " + elem.tag + " -b " + branch_to_checkout - # + " --track " + elem.select_remote["name"] + "/" + branch_to_checkout - debug.verbose("execute : " + cmd) - ret = multiprocess.run_command(cmd, cwd=git_repo_path) - if ret[1] != "" \ - and ret != False: - debug.info("'" + str(ret) + "'") - debug.error("checkout " + base_display + " ==> Can not checkout to the correct tags") - return False - debug.info("checkout " + base_display + " ==> create new branch: " + branch_to_checkout) - return True + debug.verbose("checkout : " + base_display) + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + if os.path.exists(git_repo_path) == False: + debug.warning("checkout " + base_display + " ==> repository does not exist ...") + return False + + # check if the repository is modify + is_modify = commands.check_repository_is_modify(git_repo_path) + if is_modify == True: + debug.warning( + "checkout " + base_display + " ==> modify data can not checkout new branch" + ) + return False + + list_branch_local = commands.get_list_branch_local(git_repo_path) + select_branch = commands.get_current_branch(git_repo_path) + + is_tag = False + if branch_to_checkout == "__TAG__": + branch_to_checkout = base_name_of_a_tagged_branch + str(elem.tag) + is_tag = True + if elem.volatile == True: + debug.info( + "checkout " + + base_display + + " ==> Can not checkout for 'volatile' repository" + ) + return True + if elem.tag == None: + debug.info( + "checkout " + base_display + " ==> Can not checkout for '''None''' Tag" + ) + return True + # check if we are on the good branch: + if branch_to_checkout == select_branch: + debug.info("checkout " + base_display + " ==> No change already on good branch") + return True + + # check if we have already checkout the branch before + debug.verbose( + " check : " + branch_to_checkout + " in " + str(list_branch_local) + ) + if branch_to_checkout in list_branch_local: + cmd = "git checkout " + branch_to_checkout + debug.verbose("execute : " + cmd) + ret = multiprocess.run_command(cmd, cwd=git_repo_path) + if ret[0] != 0 and ret[1] != "" and ret != False: + debug.info("'" + str(ret) + "'") + debug.error( + "checkout " + + base_display + + " ==> Can not checkout to the correct branch" + ) + return False + debug.info("checkout " + base_display + " ==> switch branch") + # TODO : Check the number of commit to the origin/XXX branch .... + return True + + list_tags = commands.get_tags(git_repo_path) + if branch_to_checkout in list_tags: + is_tag = True + if elem.tag == None: + elem.tag = branch_to_checkout + branch_to_checkout = base_name_of_a_tagged_branch + str(elem.tag) + + # Check if the remote branch exist ... + if is_tag == False: + list_branch_remote = commands.get_list_branch_remote(git_repo_path) + if elem.select_remote["name"] + "/" + branch_to_checkout in list_branch_remote: + debug.info(" ==> find ...") + else: + debug.info("checkout " + base_display + " ==> NO remote branch") + return True + # checkout the new branch: + cmd = ( + "git checkout --quiet " + + elem.select_remote["name"] + + "/" + + branch_to_checkout + + " -b " + + branch_to_checkout + ) + # + " --track " + elem.select_remote["name"] + "/" + branch_to_checkout + debug.verbose("execute : " + cmd) + ret = multiprocess.run_command(cmd, cwd=git_repo_path) + if ret[1] != "" and ret != False: + debug.info("'" + str(ret) + "'") + debug.error( + "checkout " + + base_display + + " ==> Can not checkout to the correct branch" + ) + return False + debug.info("checkout " + base_display + " ==> create new branch") + return True + # Checkout a specific tags: + if elem.tag in list_tags: + debug.info(" ==> find ...") + else: + debug.info("checkout " + base_display + " ==> NO remote tags") + return True + # checkout the new branch: + cmd = "git checkout --quiet " + elem.tag + " -b " + branch_to_checkout + # + " --track " + elem.select_remote["name"] + "/" + branch_to_checkout + debug.verbose("execute : " + cmd) + ret = multiprocess.run_command(cmd, cwd=git_repo_path) + if ret[1] != "" and ret != False: + debug.info("'" + str(ret) + "'") + debug.error( + "checkout " + base_display + " ==> Can not checkout to the correct tags" + ) + return False + debug.info( + "checkout " + base_display + " ==> create new branch: " + branch_to_checkout + ) + return True def get_current_version_repo(git_repo_path): - version_path_file = os.path.join(git_repo_path, "version.txt") - add_in_version_management = False - version_description = None - if os.path.exists(version_path_file) == False: - debug.info("deliver: ==> No 'version.txt' file ==> not manage release version....") - # Action to do: - valid = False - while valid == False: - debug.info("Create a new version: (0.0.0)") - debug.info(" (1) Add in managing version") - debug.info(" (2) Do NOTHING & continue") - input1 = input() - if input1 in ["1", "2"]: - valid = True - else: - debug.info("!!! Must select in range " + str(["1", "2"])) - if input1 == "1": - version_description = [0, 0, 0] - add_in_version_management = True - elif input1 == "2": - debug.info("Continue Not managing for this repository") - return (None, None) - else: - debug.warning("An error occured for this repository") - return (None, None) - else: - version_description = tools.version_string_to_list(tools.file_read_data(version_path_file)) - return (version_description, add_in_version_management) + version_path_file = os.path.join(git_repo_path, "version.txt") + add_in_version_management = False + version_description = None + if os.path.exists(version_path_file) == False: + debug.info( + "deliver: ==> No 'version.txt' file ==> not manage release version...." + ) + # Action to do: + valid = False + while valid == False: + debug.info("Create a new version: (0.0.0)") + debug.info(" (1) Add in managing version") + debug.info(" (2) Do NOTHING & continue") + input1 = input() + if input1 in ["1", "2"]: + valid = True + else: + debug.info("!!! Must select in range " + str(["1", "2"])) + if input1 == "1": + version_description = [0, 0, 0] + add_in_version_management = True + elif input1 == "2": + debug.info("Continue Not managing for this repository") + return (None, None) + else: + debug.warning("An error occured for this repository") + return (None, None) + else: + version_description = tools.version_string_to_list( + tools.file_read_data(version_path_file) + ) + return (version_description, add_in_version_management) - -def create_new_version_repo(git_repo_path, version_description, add_in_version_management, source_branch, destination_branch): - # get tracking branch - ret_destination_branch_sha1 = commands.get_revision_list_to_branch(git_repo_path, destination_branch) - ret_source_branch_sha1 = commands.get_revision_list_to_branch(git_repo_path, source_branch) - # remove all identical sha1 ==> not needed for this - have_forward = False - for elem_sha1 in ret_destination_branch_sha1: - if elem_sha1 not in ret_source_branch_sha1: - message = commands.get_specific_commit_message(git_repo_path, elem_sha1) - debug.warning("deliver: Forward commit: '" + message + "'") - have_forward = True - if have_forward == True: - debug.error("'" + destination_branch + "' branch must not be forward '" + source_branch + "' branch") - return None - behind_message = "" - behind_count = 0 - for elem_sha1 in ret_source_branch_sha1: - if elem_sha1 not in ret_destination_branch_sha1: - message = commands.get_specific_commit_message(git_repo_path, elem_sha1) - behind_count += 1 - behind_message = message - if behind_count == 0 and add_in_version_management == False: - debug.info("deliver: ==> Nothing to do (1).") - return None - if behind_count == 1 \ - and ( behind_message == default_behind_message - or behind_message == default_update_message): - debug.info("deliver: ==> Nothing to do (2).") - return None - for elem_sha1 in ret_source_branch_sha1: - if elem_sha1 not in ret_destination_branch_sha1: - message = commands.get_specific_commit_message(git_repo_path, elem_sha1) - debug.info("deliver: Behind commit: '" + message + "'") - # Choice of the new version: - valid = False - while valid == False: - debug.info("update version: curent: " + str(version_description)) - debug.info(" (1) Major version (change API)") - debug.info(" (2) Medium version (add feature)") - debug.info(" (3) Minor version (Bug fix & doc)") - debug.info(" (4) Do not release & continue") - input1 = input() - if input1 in ["1", "2", "3", "4"]: - valid = True - else: - debug.info("!!! Must select in range " + str(["1", "2", "3", "4"])) - # limit and force at 3 the nuber of variables - version_description_tmp = version_description - version_description = [] - if len(version_description_tmp) >= 1: - version_description.append(version_description_tmp[0]) - else: - version_description.append(0) - if len(version_description_tmp) >= 2: - version_description.append(version_description_tmp[1]) - else: - version_description.append(0) - if len(version_description_tmp) >= 3: - version_description.append(version_description_tmp[2]) - else: - version_description.append(0) - debug.info("update version: curent: " + str(version_description)) - # increment the version - if input1 == "1": - version_description[0] += 1 - version_description[1] = 0 - version_description[2] = 0 - elif input1 == "2": - version_description[1] += 1 - version_description[2] = 0 - elif input1 == "3": - version_description[2] += 1 - elif input1 == "4": - debug.info("No release for this repository") - return None - else: - debug.warning("An error occured for this repository") - return None - debug.info("update version: curent: " + str(version_description)) - return version_description +def create_new_version_repo( + git_repo_path, + version_description, + add_in_version_management, + source_branch, + destination_branch, +): + # get tracking branch + ret_destination_branch_sha1 = commands.get_revision_list_to_branch( + git_repo_path, destination_branch + ) + ret_source_branch_sha1 = commands.get_revision_list_to_branch( + git_repo_path, source_branch + ) + # remove all identical sha1 ==> not needed for this + have_forward = False + for elem_sha1 in ret_destination_branch_sha1: + if elem_sha1 not in ret_source_branch_sha1: + message = commands.get_specific_commit_message(git_repo_path, elem_sha1) + debug.warning("deliver: Forward commit: '" + message + "'") + have_forward = True + if have_forward == True: + debug.error( + "'" + + destination_branch + + "' branch must not be forward '" + + source_branch + + "' branch" + ) + return None + behind_message = "" + behind_count = 0 + for elem_sha1 in ret_source_branch_sha1: + if elem_sha1 not in ret_destination_branch_sha1: + message = commands.get_specific_commit_message(git_repo_path, elem_sha1) + behind_count += 1 + behind_message = message + if behind_count == 0 and add_in_version_management == False: + debug.info("deliver: ==> Nothing to do (1).") + return None + if behind_count == 1 and ( + behind_message == default_behind_message + or behind_message == default_update_message + ): + debug.info("deliver: ==> Nothing to do (2).") + return None + for elem_sha1 in ret_source_branch_sha1: + if elem_sha1 not in ret_destination_branch_sha1: + message = commands.get_specific_commit_message(git_repo_path, elem_sha1) + debug.info("deliver: Behind commit: '" + message + "'") + # Choice of the new version: + valid = False + while valid == False: + debug.info("update version: curent: " + str(version_description)) + debug.info(" (1) Major version (change API)") + debug.info(" (2) Medium version (add feature)") + debug.info(" (3) Minor version (Bug fix & doc)") + debug.info(" (4) Do not release & continue") + input1 = input() + if input1 in ["1", "2", "3", "4"]: + valid = True + else: + debug.info("!!! Must select in range " + str(["1", "2", "3", "4"])) + # limit and force at 3 the nuber of variables + version_description_tmp = version_description + version_description = [] + if len(version_description_tmp) >= 1: + version_description.append(version_description_tmp[0]) + else: + version_description.append(0) + if len(version_description_tmp) >= 2: + version_description.append(version_description_tmp[1]) + else: + version_description.append(0) + if len(version_description_tmp) >= 3: + version_description.append(version_description_tmp[2]) + else: + version_description.append(0) + debug.info("update version: curent: " + str(version_description)) + # increment the version + if input1 == "1": + version_description[0] += 1 + version_description[1] = 0 + version_description[2] = 0 + elif input1 == "2": + version_description[1] += 1 + version_description[2] = 0 + elif input1 == "3": + version_description[2] += 1 + elif input1 == "4": + debug.info("No release for this repository") + return None + else: + debug.warning("An error occured for this repository") + return None + debug.info("update version: curent: " + str(version_description)) + return version_description -def deliver_push(elem, argument_remote_name, destination_branch, source_branch, base_display): - # Check the repo exist - git_repo_path = os.path.join(env.get_island_root_path(), elem.path) - if os.path.exists(git_repo_path) == False: - debug.warning("deliver-push: " + base_display + " ==> MUST be download") - return - # check if we are on destination_branch - select_branch = commands.get_current_branch(git_repo_path) - if select_branch != destination_branch: - debug.warning("deliver-push: " + base_display + " ==> MUST be on '" + destination_branch + "'") - return - # check if we have a local branch - list_branch_local = commands.get_list_branch_local(git_repo_path) - if source_branch not in list_branch_local: - debug.warning("deliver-push: " + base_display + " ==> No '" + source_branch + "' (not managed)") - return - if destination_branch not in list_branch_local: - debug.warning("deliver-push: " + base_display + " ==> No '" + destination_branch + "' (not managed)") - return - list_of_element_to_push = [] - # check sha1 of destination_branch - sha_1_destination = commands.get_sha1_for_branch(git_repo_path, destination_branch) - tracking_remote_branch = commands.get_tracking_branch(git_repo_path, argument_remote_name, destination_branch) - if tracking_remote_branch == None: - debug.warning("deliver-push: " + base_display + " ==> '" + destination_branch + "' have no tracking branch") - deliver_availlable = False - sha_1_destination_tracking = commands.get_sha1_for_branch(git_repo_path, tracking_remote_branch) - if sha_1_destination == sha_1_destination_tracking: - debug.info("deliver-push: " + base_display + " ==> '" + destination_branch + "' && '" + tracking_remote_branch + "' have the same sha1") - else: - list_of_element_to_push.append(destination_branch) - # check sha1 of source_branch - sha_1_source = commands.get_sha1_for_branch(git_repo_path, source_branch) - tracking_remote_branch = commands.get_tracking_branch(git_repo_path, argument_remote_name, source_branch) - if tracking_remote_branch == None: - debug.info("deliver-push: " + base_display + " ==> '" + source_branch + "' have no tracking branch") - deliver_availlable = False - sha_1_source_tracking = commands.get_sha1_for_branch(git_repo_path, tracking_remote_branch) - if sha_1_source == sha_1_source_tracking: - debug.info("deliver-push: " + base_display + " ==> '" + source_branch + "' && '" + tracking_remote_branch + "' have the same sha1") - else: - list_of_element_to_push.append(source_branch) - ret_current_tags = commands.get_tags_current(git_repo_path) - if len(ret_current_tags) == 0: - debug.info("deliver-push: " + base_display + " ==> No tag on the current '" + destination_branch + "'") - return - if len(ret_current_tags) > 1: - debug.info("deliver-push: " + base_display + " ==> Too mush tags on the current '" + destination_branch + "' : " + str(ret_current_tags) + " ==> only support 1") - return - list_remote_tags = commands.get_tags_remote(git_repo_path, argument_remote_name) - debug.verbose("remote tags: " + str(list_remote_tags)) - if ret_current_tags[0] not in list_remote_tags: - debug.info("deliver-push: " + base_display + " ==> tag already exist.") - list_of_element_to_push.append(ret_current_tags[0]) - if len(list_of_element_to_push) == 0: - debug.info("deliver-push: " + base_display + " ==> Everything up-to-date") - return - debug.info("deliver-push: " + base_display + " ==> element to push:" + str(list_of_element_to_push)) - #push all on the server: - commands.push(git_repo_path, argument_remote_name, list_of_element_to_push) +def deliver_push( + elem, argument_remote_name, destination_branch, source_branch, base_display +): + # Check the repo exist + git_repo_path = os.path.join(env.get_island_root_path(), elem.path) + if os.path.exists(git_repo_path) == False: + debug.warning("deliver-push: " + base_display + " ==> MUST be download") + return + # check if we are on destination_branch + select_branch = commands.get_current_branch(git_repo_path) + if select_branch != destination_branch: + debug.warning( + "deliver-push: " + + base_display + + " ==> MUST be on '" + + destination_branch + + "'" + ) + return + # check if we have a local branch + list_branch_local = commands.get_list_branch_local(git_repo_path) + if source_branch not in list_branch_local: + debug.warning( + "deliver-push: " + + base_display + + " ==> No '" + + source_branch + + "' (not managed)" + ) + return + if destination_branch not in list_branch_local: + debug.warning( + "deliver-push: " + + base_display + + " ==> No '" + + destination_branch + + "' (not managed)" + ) + return + list_of_element_to_push = [] + # check sha1 of destination_branch + sha_1_destination = commands.get_sha1_for_branch(git_repo_path, destination_branch) + tracking_remote_branch = commands.get_tracking_branch( + git_repo_path, argument_remote_name, destination_branch + ) + if tracking_remote_branch == None: + debug.warning( + "deliver-push: " + + base_display + + " ==> '" + + destination_branch + + "' have no tracking branch" + ) + deliver_availlable = False + sha_1_destination_tracking = commands.get_sha1_for_branch( + git_repo_path, tracking_remote_branch + ) + if sha_1_destination == sha_1_destination_tracking: + debug.info( + "deliver-push: " + + base_display + + " ==> '" + + destination_branch + + "' && '" + + tracking_remote_branch + + "' have the same sha1" + ) + else: + list_of_element_to_push.append(destination_branch) + # check sha1 of source_branch + sha_1_source = commands.get_sha1_for_branch(git_repo_path, source_branch) + tracking_remote_branch = commands.get_tracking_branch( + git_repo_path, argument_remote_name, source_branch + ) + if tracking_remote_branch == None: + debug.info( + "deliver-push: " + + base_display + + " ==> '" + + source_branch + + "' have no tracking branch" + ) + deliver_availlable = False + sha_1_source_tracking = commands.get_sha1_for_branch( + git_repo_path, tracking_remote_branch + ) + if sha_1_source == sha_1_source_tracking: + debug.info( + "deliver-push: " + + base_display + + " ==> '" + + source_branch + + "' && '" + + tracking_remote_branch + + "' have the same sha1" + ) + else: + list_of_element_to_push.append(source_branch) + ret_current_tags = commands.get_tags_current(git_repo_path) + if len(ret_current_tags) == 0: + debug.info( + "deliver-push: " + + base_display + + " ==> No tag on the current '" + + destination_branch + + "'" + ) + return + if len(ret_current_tags) > 1: + debug.info( + "deliver-push: " + + base_display + + " ==> Too mush tags on the current '" + + destination_branch + + "' : " + + str(ret_current_tags) + + " ==> only support 1" + ) + return + list_remote_tags = commands.get_tags_remote(git_repo_path, argument_remote_name) + debug.verbose("remote tags: " + str(list_remote_tags)) + if ret_current_tags[0] not in list_remote_tags: + debug.info("deliver-push: " + base_display + " ==> tag already exist.") + list_of_element_to_push.append(ret_current_tags[0]) + if len(list_of_element_to_push) == 0: + debug.info("deliver-push: " + base_display + " ==> Everything up-to-date") + return + debug.info( + "deliver-push: " + + base_display + + " ==> element to push:" + + str(list_of_element_to_push) + ) + # push all on the server: + commands.push(git_repo_path, argument_remote_name, list_of_element_to_push) diff --git a/island/actions/update_links.py b/island/actions/update_links.py index a5c4141..e0929c4 100644 --- a/island/actions/update_links.py +++ b/island/actions/update_links.py @@ -8,36 +8,43 @@ ## @license MPL v2.0 (see license file) ## -from realog import debug -from island import tools -from island import env import os +from realog import debug + +from island import env, tools + + ## Update the links: def update(configuration, mani, type_call): - # TODO: do not remove link when not needed - if len(configuration.get_links()) != 0 \ - or len(mani.get_links()) != 0: - debug.info(type_call + ": remove old links ...") - for elem in configuration.get_links(): - base_path = os.path.join(env.get_island_root_path(), elem["destination"]) - debug.info(type_call + ": link: " + str(base_path)) - if os.path.islink(base_path) == True: - os.unlink(base_path) - else: - debug.error(type_call + ": remove link is not authorised ==> not a link", crash=False) - have_error = True - configuration.clear_links() - debug.info(type_call + ": add new links ...") - for elem in mani.get_links(): - base_path = os.path.join(env.get_island_root_path(), elem["destination"]) - source_path = os.path.join(env.get_island_root_path(), elem["source"]) - debug.info(type_call + ": link: " + str(base_path)) - if os.path.exists(base_path) == True: - debug.error(type_call + ": create link is not possible ==> path already exist", crash=False) - have_error = True - else: - tools.create_directory_of_file(base_path) - os.symlink(source_path, base_path) - configuration.add_link(elem["source"], elem["destination"]) - configuration.store() \ No newline at end of file + # TODO: do not remove link when not needed + if len(configuration.get_links()) != 0 or len(mani.get_links()) != 0: + debug.info(type_call + ": remove old links ...") + for elem in configuration.get_links(): + base_path = os.path.join(env.get_island_root_path(), elem["destination"]) + debug.info(type_call + ": link: " + str(base_path)) + if os.path.islink(base_path) == True: + os.unlink(base_path) + else: + debug.error( + type_call + ": remove link is not authorised ==> not a link", + crash=False, + ) + have_error = True + configuration.clear_links() + debug.info(type_call + ": add new links ...") + for elem in mani.get_links(): + base_path = os.path.join(env.get_island_root_path(), elem["destination"]) + source_path = os.path.join(env.get_island_root_path(), elem["source"]) + debug.info(type_call + ": link: " + str(base_path)) + if os.path.exists(base_path) == True: + debug.error( + type_call + ": create link is not possible ==> path already exist", + crash=False, + ) + have_error = True + else: + tools.create_directory_of_file(base_path) + os.symlink(source_path, base_path) + configuration.add_link(elem["source"], elem["destination"]) + configuration.store() diff --git a/island/commands.py b/island/commands.py index 6951cab..1dccc9b 100644 --- a/island/commands.py +++ b/island/commands.py @@ -1,342 +1,393 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -## -## @author Edouard DUPIN -## -## @copyright 2012, Edouard DUPIN, all right reserved -## -## @license MPL v2.0 (see license file) -## +"""Command interface. + +@author Edouard DUPIN +@copyright 2012, Edouard DUPIN, all right reserved +@license MPL v2.0 (see license file) +""" -import os -import shutil import errno import fnmatch +import os +import shutil import stat + # Local import from realog import debug -from . import env -from . import multiprocess -from . import debug - - +from . import ( + debug, + env, + multiprocess, +) """ - + """ + + def check_repository_is_modify(path_repository): - # check if the repository is modify - cmd = "git diff --quiet" - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "check_repository_is_modify", error_only=True, availlable_return=[0,1], display_if_nothing=False) - ret_diff = return_value - if ret_diff[0] == 0: - return False - return True + # check if the repository is modify + cmd = "git diff --quiet" + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error( + return_value, + "check_repository_is_modify", + error_only=True, + availlable_return=[0, 1], + display_if_nothing=False, + ) + ret_diff = return_value + if ret_diff[0] == 0: + return False + return True + def get_list_branch_meta(path_repository): - # get local branch - cmd = "git branch -a" - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "get_list_branch_meta", error_only=True) - ret_branch = return_value - list_branch = ret_branch[1].split('\n') - out = [] - for elem_branch in list_branch: - is_remote = False - branch_name = "" - is_selected = False - if len(elem_branch.split(" -> ")) != 1: - continue - # separate the remote element - if elem_branch[2:10] == "remotes/": - elem_branch = elem_branch[:2] + elem_branch[10:] - is_remote = True - # separate select branch - if elem_branch[:2] == "* ": - is_selected = True - branch_name = elem_branch[2:] - else: - branch_name = elem_branch[2:] - out.append({ - "remote": is_remote, - "name": branch_name, - "select": is_selected - }) - debug.extreme_verbose("List all branch Meta: " + str(out)) - return out + # get local branch + cmd = "git branch -a" + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error( + return_value, "get_list_branch_meta", error_only=True + ) + ret_branch = return_value + list_branch = ret_branch[1].split("\n") + out = [] + for elem_branch in list_branch: + is_remote = False + branch_name = "" + is_selected = False + if len(elem_branch.split(" -> ")) != 1: + continue + # separate the remote element + if elem_branch[2:10] == "remotes/": + elem_branch = elem_branch[:2] + elem_branch[10:] + is_remote = True + # separate select branch + if elem_branch[:2] == "* ": + is_selected = True + branch_name = elem_branch[2:] + else: + branch_name = elem_branch[2:] + out.append({"remote": is_remote, "name": branch_name, "select": is_selected}) + debug.extreme_verbose("List all branch Meta: " + str(out)) + return out def get_list_branch_all(path_repository): - tmp = get_list_branch_meta(path_repository) - out = [] - for elem in tmp: - out.append(elem["name"]) - debug.verbose("List all branch: " + str(out)) - return out + tmp = get_list_branch_meta(path_repository) + out = [] + for elem in tmp: + out.append(elem["name"]) + debug.verbose("List all branch: " + str(out)) + return out + def get_list_branch_local(path_repository): - tmp = get_list_branch_meta(path_repository) - out = [] - for elem in tmp: - if elem["remote"] == False: - out.append(elem["name"]) - debug.verbose("List local branch: " + str(out)) - return out + tmp = get_list_branch_meta(path_repository) + out = [] + for elem in tmp: + if elem["remote"] == False: + out.append(elem["name"]) + debug.verbose("List local branch: " + str(out)) + return out + def get_list_branch_remote(path_repository): - tmp = get_list_branch_meta(path_repository) - out = [] - for elem in tmp: - if elem["remote"] == True: - out.append(elem["name"]) - debug.verbose("List remote branch: " + str(out)) - return out + tmp = get_list_branch_meta(path_repository) + out = [] + for elem in tmp: + if elem["remote"] == True: + out.append(elem["name"]) + debug.verbose("List remote branch: " + str(out)) + return out + def get_current_branch(path_repository): - tmp = get_list_branch_meta(path_repository) - for elem in tmp: - if elem["select"] == True: - debug.verbose("List local branch: " + str(elem["name"])) - return elem["name"] - debug.verbose("List local branch: None" ) - return None + tmp = get_list_branch_meta(path_repository) + for elem in tmp: + if elem["select"] == True: + debug.verbose("List local branch: " + str(elem["name"])) + return elem["name"] + debug.verbose("List local branch: None") + return None + def get_current_tracking_branch(path_repository): - # get tracking branch - cmd = "git rev-parse --abbrev-ref --symbolic-full-name @{u}" - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - if return_value[1] == "@{u}": - debug.warning("in '" + path_repository + "' no tracking branch is specify") - return None - multiprocess.generic_display_error(return_value, "get_current_tracking_branch", error_only=True) - return return_value[1] + # get tracking branch + cmd = "git rev-parse --abbrev-ref --symbolic-full-name @{u}" + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + if return_value[1] == "@{u}": + debug.warning("in '" + path_repository + "' no tracking branch is specify") + return None + multiprocess.generic_display_error( + return_value, "get_current_tracking_branch", error_only=True + ) + return return_value[1] + def get_revision_list_to_branch(path_repository, branch): - cmd = "git rev-list " + branch - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "get_revision_list_to_branch", error_only=True) - return return_value[1].split('\n') + cmd = "git rev-list " + branch + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error( + return_value, "get_revision_list_to_branch", error_only=True + ) + return return_value[1].split("\n") + def get_specific_commit_message(path_repository, sha_1): - if sha_1 == None or sha_1 == "": - return "" - cmd = "git log --format=%B -n 1 " + sha_1 - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "get_specific_commit_message", error_only=True) - return return_value[1].split('\n')[0] + if sha_1 == None or sha_1 == "": + return "" + cmd = "git log --format=%B -n 1 " + sha_1 + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error( + return_value, "get_specific_commit_message", error_only=True + ) + return return_value[1].split("\n")[0] + def get_sha1_for_branch(path_repository, branch_name): - if branch_name == None or branch_name == "": - return None - cmd = "git rev-parse " + branch_name - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "get_sha1_for_branch", error_only=True) - return return_value[1].split('\n')[0] + if branch_name == None or branch_name == "": + return None + cmd = "git rev-parse " + branch_name + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error( + return_value, "get_sha1_for_branch", error_only=True + ) + return return_value[1].split("\n")[0] def get_tags_current(path_repository): - cmd = "git tag --points-at" - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "get_tags_current", error_only=True) - list_tags = [] - for elem in return_value[1].split('\n'): - if elem != "": - list_tags.append(elem) - return list_tags + cmd = "git tag --points-at" + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error( + return_value, "get_tags_current", error_only=True + ) + list_tags = [] + for elem in return_value[1].split("\n"): + if elem != "": + list_tags.append(elem) + return list_tags + def get_tags(path_repository): - cmd = "git tag" - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "get_tags", error_only=True) - return return_value[1].split('\n') + cmd = "git tag" + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error(return_value, "get_tags", error_only=True) + return return_value[1].split("\n") + def get_tags_remote(path_repository, remote_name): - if remote_name == "" or remote_name == None: - return get_current_tracking_branch(path_repository) - cmd = "git ls-remote --tags " + remote_name - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "get_tags_remote", error_only=True) - list_element = return_value[1].split('\n') - debug.verbose(" receive: " + str(list_element)) - #6bc01117e85d00686ae2d423193a161e82df9a44 refs/tags/0.1.0 - #7ef9caa51cf3744de0f46352e5aa07bd4980fe89 refs/tags/v0.2.0 - #870e8e039b0a98370a9d23844f0af66824c57a5f refs/tags/v0.2.0^{} - #16707e17e58f16b3409f8c64df7f595ba7dcf499 refs/tags/v0.3.0 - #dfb97c3dfea776e5c4862dc9f60f8c5ad83b55eb refs/tags/v0.3.0^{} - out = [] - for elem in list_element: - cut = elem.split("\t") - if len(cut) != 2: - continue - if cut[1][-3:] == "^{}": - # specific usage for the annotated commit - continue - if cut[1][:10] == "refs/tags/": - out.append(cut[1][10:]) - else: - out.append(cut[1]) - return out + if remote_name == "" or remote_name == None: + return get_current_tracking_branch(path_repository) + cmd = "git ls-remote --tags " + remote_name + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error(return_value, "get_tags_remote", error_only=True) + list_element = return_value[1].split("\n") + debug.verbose(" receive: " + str(list_element)) + # 6bc01117e85d00686ae2d423193a161e82df9a44 refs/tags/0.1.0 + # 7ef9caa51cf3744de0f46352e5aa07bd4980fe89 refs/tags/v0.2.0 + # 870e8e039b0a98370a9d23844f0af66824c57a5f refs/tags/v0.2.0^{} + # 16707e17e58f16b3409f8c64df7f595ba7dcf499 refs/tags/v0.3.0 + # dfb97c3dfea776e5c4862dc9f60f8c5ad83b55eb refs/tags/v0.3.0^{} + out = [] + for elem in list_element: + cut = elem.split("\t") + if len(cut) != 2: + continue + if cut[1][-3:] == "^{}": + # specific usage for the annotated commit + continue + if cut[1][:10] == "refs/tags/": + out.append(cut[1][10:]) + else: + out.append(cut[1]) + return out + def get_tracking_branch(path_repository, remote_name, select_branch): - # get tracking branch - if remote_name == "" or remote_name == None: - return get_current_tracking_branch(path_repository) - list_branch_remote = get_list_branch_remote(path_repository) - debug.extreme_verbose("check if exist " + remote_name + "/" + select_branch + " in " + str(list_branch_remote)) - if remote_name + "/" + select_branch not in list_branch_remote: - debug.debug(" ==> can not get remote branch") - return None - return remote_name + "/" + select_branch + # get tracking branch + if remote_name == "" or remote_name == None: + return get_current_tracking_branch(path_repository) + list_branch_remote = get_list_branch_remote(path_repository) + debug.extreme_verbose( + "check if exist " + + remote_name + + "/" + + select_branch + + " in " + + str(list_branch_remote) + ) + if remote_name + "/" + select_branch not in list_branch_remote: + debug.debug(" ==> can not get remote branch") + return None + return remote_name + "/" + select_branch -def merge_branch_on_master(path_repository, branch_name, merge_force=True, branch_destination = "master"): - if branch_name == None or branch_name == "": - raise "Missing branch name" - cmd = "git merge " - if merge_force == True: - cmd += "--no-ff " - cmd += branch_name + " --message \"Merge branch '" + branch_name + "' into '" + branch_destination + "'\"" - debug.verbose("execute : " + cmd) - # TODO: check if the command work correctly - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "merge_branch_on_master", error_only=True) - return return_value +def merge_branch_on_master( + path_repository, branch_name, merge_force=True, branch_destination="master" +): + if branch_name == None or branch_name == "": + raise "Missing branch name" + cmd = "git merge " + if merge_force == True: + cmd += "--no-ff " + cmd += ( + branch_name + + " --message \"Merge branch '" + + branch_name + + "' into '" + + branch_destination + + "'\"" + ) + debug.verbose("execute : " + cmd) + # TODO: check if the command work correctly + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error( + return_value, "merge_branch_on_master", error_only=True + ) + return return_value def add_file(path_repository, file_path): - if file_path == None or file_path == "": - raise "Missing file_path name" - cmd = "git add " + file_path - debug.verbose("execute : " + cmd) - # TODO: check if the command work correctly - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "add_file", error_only=True) - return return_value + if file_path == None or file_path == "": + raise "Missing file_path name" + cmd = "git add " + file_path + debug.verbose("execute : " + cmd) + # TODO: check if the command work correctly + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error(return_value, "add_file", error_only=True) + return return_value def commit_all(path_repository, comment): - if comment == None or comment == "": - raise "Missing comment description" - cmd = 'git commit -a --message "' + comment +'"' - debug.verbose("execute : " + cmd) - # TODO: check if the command work correctly - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "commit_all", error_only=True) - return return_value + if comment == None or comment == "": + raise "Missing comment description" + cmd = 'git commit -a --message "' + comment + '"' + debug.verbose("execute : " + cmd) + # TODO: check if the command work correctly + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error(return_value, "commit_all", error_only=True) + return return_value + def tag(path_repository, tag_name): - if tag_name == None or tag_name == "": - raise "Missing tag name" - tag_name = tag_name.replace(" ", "_") - cmd = 'git tag ' + tag_name + ' --message "[TAG] create tag ' + tag_name +'"' - debug.verbose("execute : " + cmd) - # TODO: check if the command work correctly - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "tag", error_only=True) - return return_value + if tag_name == None or tag_name == "": + raise "Missing tag name" + tag_name = tag_name.replace(" ", "_") + cmd = "git tag " + tag_name + ' --message "[TAG] create tag ' + tag_name + '"' + debug.verbose("execute : " + cmd) + # TODO: check if the command work correctly + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error(return_value, "tag", error_only=True) + return return_value + def checkout(path_repository, branch_name): - if branch_name == None or branch_name == "": - raise "Missing branch name" - cmd = 'git checkout ' + branch_name - debug.verbose("execute : " + cmd) - # TODO: check if the command work correctly - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "checkout", error_only=True) - return return_value + if branch_name == None or branch_name == "": + raise "Missing branch name" + cmd = "git checkout " + branch_name + debug.verbose("execute : " + cmd) + # TODO: check if the command work correctly + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error(return_value, "checkout", error_only=True) + return return_value + def reset_hard(path_repository, destination): - if destination == None or destination == "": - raise "Missing destination 'sha1' or 'branch name'" - cmd = 'git reset --hard ' + destination - debug.verbose("execute : " + cmd) - # TODO: check if the command work correctly - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "reset_hard", error_only=True) - return return_value + if destination == None or destination == "": + raise "Missing destination 'sha1' or 'branch name'" + cmd = "git reset --hard " + destination + debug.verbose("execute : " + cmd) + # TODO: check if the command work correctly + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error(return_value, "reset_hard", error_only=True) + return return_value + def rebase(path_repository, destination): - if destination == None or destination == "": - raise "Missing destination 'sha1' or 'branch name'" - cmd = 'git rebase ' + destination - debug.verbose("execute : " + cmd) - # TODO: check if the command work correctly - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "rebase", error_only=True) - return return_value + if destination == None or destination == "": + raise "Missing destination 'sha1' or 'branch name'" + cmd = "git rebase " + destination + debug.verbose("execute : " + cmd) + # TODO: check if the command work correctly + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error(return_value, "rebase", error_only=True) + return return_value -def clone(path_repository, address, branch_name = None, origin=None): - if address == None or address == "": - raise "Missing address" - cmd = 'git clone ' + address - if branch_name != None and branch_name == "": - cmd += " --branch " + branch_name - if origin != None and origin == "": - cmd += " --origin " + origin - if path_repository != None and path_repository != "": - cmd += " " + path_repository - debug.verbose("execute : " + cmd) - if os.path.exists(path_repository) == True: - debug.warning("Can not clone repository path already exist") - return False - return_value = multiprocess.run_command(cmd) - multiprocess.generic_display_error(return_value, "clone", error_only=True) - return return_value +def clone(path_repository, address, branch_name=None, origin=None): + if address == None or address == "": + raise "Missing address" + cmd = "git clone " + address + if branch_name != None and branch_name == "": + cmd += " --branch " + branch_name + if origin != None and origin == "": + cmd += " --origin " + origin + if path_repository != None and path_repository != "": + cmd += " " + path_repository + debug.verbose("execute : " + cmd) + if os.path.exists(path_repository) == True: + debug.warning("Can not clone repository path already exist") + return False + return_value = multiprocess.run_command(cmd) + multiprocess.generic_display_error(return_value, "clone", error_only=True) + return return_value def fetch(path_repository, remote_name, prune=True): - cmd = 'git fetch ' + remote_name - if prune == True: - cmd += " --prune" - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "fetch") - return return_value + cmd = "git fetch " + remote_name + if prune == True: + cmd += " --prune" + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error(return_value, "fetch") + return return_value + def pull(path_repository, remote_name, prune=True): - if remote_name == None or remote_name == "": - raise "Missing remote_name" - cmd = 'git pull ' + remote_name - if prune == True: - cmd += " --prune" - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "pull") - return return_value + if remote_name == None or remote_name == "": + raise "Missing remote_name" + cmd = "git pull " + remote_name + if prune == True: + cmd += " --prune" + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error(return_value, "pull") + return return_value + def push(path_repository, remote_name, elements): - if remote_name == None or remote_name == "": - raise "Missing remote_name" - if len(elements) == 0: - raise "No elements to push on server" - cmd = 'git push ' + remote_name - for elem in elements: - cmd += " " + elem - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "push") - return return_value + if remote_name == None or remote_name == "": + raise "Missing remote_name" + if len(elements) == 0: + raise "No elements to push on server" + cmd = "git push " + remote_name + for elem in elements: + cmd += " " + elem + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error(return_value, "push") + return return_value def submodule_sync(path_repository, remote_name): - cmd = "git submodule sync" - debug.verbose("execute : " + cmd) - return_value = multiprocess.run_command(cmd, cwd=path_repository) - multiprocess.generic_display_error(return_value, "submodule_sync") - """ + cmd = "git submodule sync" + debug.verbose("execute : " + cmd) + return_value = multiprocess.run_command(cmd, cwd=path_repository) + multiprocess.generic_display_error(return_value, "submodule_sync") + """ if ret[:31] == "Synchronizing submodule url for": #all is good ... debug.info(" " + ret) @@ -348,41 +399,43 @@ def submodule_sync(path_repository, remote_name): """ - def get_forward(path_repository, branch_name): - if branch_name == None or branch_name == "": - raise "get_fast_forward: Missing branch_name" - select_branch = get_current_branch(path_repository) - # get tracking branch - ret_current_branch_sha1 = get_revision_list_to_branch(path_repository, select_branch) - ret_track_branch_sha1 = get_revision_list_to_branch(path_repository, branch_name) - # count the number of commit fast forward - forward_count = 0 - for elem_sha1 in ret_current_branch_sha1: - if elem_sha1 not in ret_track_branch_sha1: - forward_count += 1 - return forward_count + if branch_name == None or branch_name == "": + raise "get_fast_forward: Missing branch_name" + select_branch = get_current_branch(path_repository) + # get tracking branch + ret_current_branch_sha1 = get_revision_list_to_branch( + path_repository, select_branch + ) + ret_track_branch_sha1 = get_revision_list_to_branch(path_repository, branch_name) + # count the number of commit fast forward + forward_count = 0 + for elem_sha1 in ret_current_branch_sha1: + if elem_sha1 not in ret_track_branch_sha1: + forward_count += 1 + return forward_count + def is_forward(path_repository, branch_name): - return get_forward(path_repository, branch_name) != 0; - + return get_forward(path_repository, branch_name) != 0 def get_behind(path_repository, branch_name): - if branch_name == None or branch_name == "": - raise "get_fast_forward: Missing branch_name" - select_branch = get_current_branch(path_repository) - # get tracking branch - ret_current_branch_sha1 = get_revision_list_to_branch(path_repository, select_branch) - ret_track_branch_sha1 = get_revision_list_to_branch(path_repository, branch_name) - # count the number of commit behind - behind_count = 0 - for elem_sha1 in ret_track_branch_sha1: - if elem_sha1 not in ret_current_branch_sha1: - behind_count += 1 - return behind_count + if branch_name == None or branch_name == "": + raise "get_fast_forward: Missing branch_name" + select_branch = get_current_branch(path_repository) + # get tracking branch + ret_current_branch_sha1 = get_revision_list_to_branch( + path_repository, select_branch + ) + ret_track_branch_sha1 = get_revision_list_to_branch(path_repository, branch_name) + # count the number of commit behind + behind_count = 0 + for elem_sha1 in ret_track_branch_sha1: + if elem_sha1 not in ret_current_branch_sha1: + behind_count += 1 + return behind_count + def is_behind(path_repository, branch_name): - return get_behind(path_repository, branch_name) != 0; - - + return get_behind(path_repository, branch_name) != 0 diff --git a/island/config.py b/island/config.py index b49f53d..894ba19 100644 --- a/island/config.py +++ b/island/config.py @@ -1,185 +1,187 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -## -## @author Edouard DUPIN -## -## @copyright 2012, Edouard DUPIN, all right reserved -## -## @license MPL v2.0 (see license file) -## -import platform -import sys -import os +"""Config main interface. + +@author Edouard DUPIN +@copyright 2012, Edouard DUPIN, all right reserved +@license MPL v2.0 (see license file) +""" import copy import json +import os +import platform +import sys + # Local import from realog import debug -from . import tools -from . import env -from . import multiprocess -from . import repo_config + +from . import ( + env, + multiprocess, + repo_config, + tools, +) + env.get_island_path_config() unique_config = None + def get_unique_config(): - global unique_config - if unique_config == None: - unique_config = Config() - return unique_config + global unique_config + if unique_config == None: + unique_config = Config() + return unique_config -class Config(): - def __init__(self): - self._repo = "" - self._branch = "master" - self._manifest_name = "default.xml" - self._volatiles = [] - self._curent_link = [] - self.load() - - # set it deprecated at 2020/07 - def load_old(self): - config_property = tools.file_read_data(env.get_island_path_config_old()) - element_config = config_property.split("\n") - for line in element_config: - if len(line) == 0 \ - or line[0] == "#": - # simple comment line ==> pass - pass - elif line[:5] == "repo=": - self._repo = line[5:] - elif line[:7] == "branch=": - self._branch = line[7:] - elif line[:5] == "file=": - self._manifest_name = line[5:] - else: - debug.warning("island config error: can not parse: '" + str(line) + "'") - return True - - def convert_config_file(self): - debug.warning("INTERNAL: Convert your configuration file: " + str(env.get_island_path_config_old()) + " -> " + str(env.get_island_path_config())) - self.load_old() - self.store() - tools.remove_file(env.get_island_path_config_old()) - - def load(self): - # transform the old format of configuration (use json now ==> simple - if os.path.exists(env.get_island_path_config_old()) == True: - self.convert_config_file() - if os.path.exists(env.get_island_path_config()) == False: - return True - self._volatiles = [] - self._curent_link = [] - with open(env.get_island_path_config()) as json_file: - data = json.load(json_file) - if "repo" in data.keys(): - self._repo = data["repo"] - if "branch" in data.keys(): - self._branch = data["branch"] - if "manifest_name" in data.keys(): - self._manifest_name = data["manifest_name"] - if "volatiles" in data.keys(): - for elem in data["volatiles"]: - if "git_address" in elem.keys() and "path" in elem.keys(): - self.add_volatile(elem["git_address"], elem["path"]) - if "link" in data.keys(): - for elem in data["link"]: - if "source" in elem.keys() and "destination" in elem.keys(): - self.add_link(elem["source"], elem["destination"]) - return True - return False - - def store(self): - data = {} - data["repo"] = self._repo - data["branch"] = self._branch - data["manifest_name"] = self._manifest_name - data["volatiles"] = self._volatiles - data["link"] = self._curent_link - with open(env.get_island_path_config(), 'w') as outfile: - json.dump(data, outfile, indent=4) - return True - return False - - def set_manifest(self, value): - self._repo = value - - def get_manifest(self): - return self._repo - - def set_branch(self, value): - self._branch = value - - def get_branch(self): - return self._branch - - def set_manifest_name(self, value): - self._manifest_name = value - - def get_manifest_name(self): - return self._manifest_name - - def add_volatile(self, git_adress, local_path): - for elem in self._volatiles: - if elem["path"] == local_path: - debug.error("can not have multiple local repositoty on the same PATH", crash=False) - return False - self._volatiles.append( { - "git_address": git_adress, - "path": local_path - }) - return True - - def get_volatile(self): - return copy.deepcopy(self._volatiles) - - - def get_links(self): - return self._curent_link - - def add_link(self, source, destination): - for elem in self._curent_link: - if elem["destination"] == destination: - debug.error("can not have multiple destination folder in link " + destination, crash=False) - return False - self._curent_link.append( { - "source": source, - "destination": destination - }) - return True - - def remove_link(self, destination): - for elem in self._curent_link: - if elem["destination"] == destination: - del self._curent_link[elem] - return - debug.warning("Request remove link that does not exist") - - def clear_links(self): - self._curent_link = [] - - - def get_manifest_config(self): - conf = repo_config.RepoConfig() - base_volatile, repo_volatile = repo_config.split_repo(self.get_manifest()) - conf.name = repo_volatile - conf.path = os.path.join("." + env.get_system_base_name(), "manifest") #env.get_island_path_manifest() - conf.branch = "master" - conf.volatile = False - conf.remotes = [ - { - 'name': 'origin', - 'fetch': base_volatile, - 'mirror': [] - } - ] - conf.select_remote = { - 'name': 'origin', - 'fetch': base_volatile, - 'sync': False, - 'mirror': [] - } - return conf +class Config: + def __init__(self): + self._repo = "" + self._branch = "master" + self._manifest_name = "default.xml" + self._volatiles = [] + self._curent_link = [] + self.load() + # set it deprecated at 2020/07 + def load_old(self): + config_property = tools.file_read_data(env.get_island_path_config_old()) + element_config = config_property.split("\n") + for line in element_config: + if len(line) == 0 or line[0] == "#": + # simple comment line ==> pass + pass + elif line[:5] == "repo=": + self._repo = line[5:] + elif line[:7] == "branch=": + self._branch = line[7:] + elif line[:5] == "file=": + self._manifest_name = line[5:] + else: + debug.warning("island config error: can not parse: '" + str(line) + "'") + return True + + def convert_config_file(self): + debug.warning( + "INTERNAL: Convert your configuration file: " + + str(env.get_island_path_config_old()) + + " -> " + + str(env.get_island_path_config()) + ) + self.load_old() + self.store() + tools.remove_file(env.get_island_path_config_old()) + + def load(self): + # transform the old format of configuration (use json now ==> simple + if os.path.exists(env.get_island_path_config_old()) == True: + self.convert_config_file() + if os.path.exists(env.get_island_path_config()) == False: + return True + self._volatiles = [] + self._curent_link = [] + with open(env.get_island_path_config()) as json_file: + data = json.load(json_file) + if "repo" in data.keys(): + self._repo = data["repo"] + if "branch" in data.keys(): + self._branch = data["branch"] + if "manifest_name" in data.keys(): + self._manifest_name = data["manifest_name"] + if "volatiles" in data.keys(): + for elem in data["volatiles"]: + if "git_address" in elem.keys() and "path" in elem.keys(): + self.add_volatile(elem["git_address"], elem["path"]) + if "link" in data.keys(): + for elem in data["link"]: + if "source" in elem.keys() and "destination" in elem.keys(): + self.add_link(elem["source"], elem["destination"]) + return True + return False + + def store(self): + data = {} + data["repo"] = self._repo + data["branch"] = self._branch + data["manifest_name"] = self._manifest_name + data["volatiles"] = self._volatiles + data["link"] = self._curent_link + with open(env.get_island_path_config(), "w") as outfile: + json.dump(data, outfile, indent=4) + return True + return False + + def set_manifest(self, value): + self._repo = value + + def get_manifest(self): + return self._repo + + def set_branch(self, value): + self._branch = value + + def get_branch(self): + return self._branch + + def set_manifest_name(self, value): + self._manifest_name = value + + def get_manifest_name(self): + return self._manifest_name + + def add_volatile(self, git_adress, local_path): + for elem in self._volatiles: + if elem["path"] == local_path: + debug.error( + "can not have multiple local repositoty on the same PATH", + crash=False, + ) + return False + self._volatiles.append({"git_address": git_adress, "path": local_path}) + return True + + def get_volatile(self): + return copy.deepcopy(self._volatiles) + + def get_links(self): + return self._curent_link + + def add_link(self, source, destination): + for elem in self._curent_link: + if elem["destination"] == destination: + debug.error( + "can not have multiple destination folder in link " + destination, + crash=False, + ) + return False + self._curent_link.append({"source": source, "destination": destination}) + return True + + def remove_link(self, destination): + for elem in self._curent_link: + if elem["destination"] == destination: + del self._curent_link[elem] + return + debug.warning("Request remove link that does not exist") + + def clear_links(self): + self._curent_link = [] + + def get_manifest_config(self): + conf = repo_config.RepoConfig() + base_volatile, repo_volatile = repo_config.split_repo(self.get_manifest()) + conf.name = repo_volatile + conf.path = os.path.join( + "." + env.get_system_base_name(), "manifest" + ) # env.get_island_path_manifest() + conf.branch = "master" + conf.volatile = False + conf.remotes = [{"name": "origin", "fetch": base_volatile, "mirror": []}] + conf.select_remote = { + "name": "origin", + "fetch": base_volatile, + "sync": False, + "mirror": [], + } + return conf diff --git a/island/env.py b/island/env.py index 0264ca3..3fc29ed 100644 --- a/island/env.py +++ b/island/env.py @@ -1,138 +1,179 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -## -## @author Edouard DUPIN -## -## @copyright 2012, Edouard DUPIN, all right reserved -## -## @license MPL v2.0 (see license file) -## +"""Environment management. + +@author Edouard DUPIN +@copyright 2012, Edouard DUPIN, all right reserved +@license MPL v2.0 (see license file) +""" + +import os # Local import from realog import debug -import os - system_base_name = "island" + def set_system_base_name(val): - global system_base_name - system_base_name = val - debug.debug("Set basename: '" + str(system_base_name) + "'") + global system_base_name + system_base_name = val + debug.debug("Set basename: '" + str(system_base_name) + "'") + def get_system_base_name(): - global system_base_name - return system_base_name + global system_base_name + return system_base_name + def get_system_config_name(): - global system_base_name - return system_base_name + "Config.py" + global system_base_name + return system_base_name + "Config.py" fetch_manifest = True + def set_fetch_manifest(val): - global fetch_manifest - fetch_manifest = val + global fetch_manifest + fetch_manifest = val + def get_fetch_manifest(): - global fetch_manifest - return fetch_manifest + global fetch_manifest + return fetch_manifest wait_between_sever_command = 0 + def set_wait_between_sever_command(val): - global wait_between_sever_command - wait_between_sever_command = val + global wait_between_sever_command + wait_between_sever_command = val + def get_wait_between_sever_command(): - global wait_between_sever_command - return wait_between_sever_command + global wait_between_sever_command + return wait_between_sever_command + filter_command = "" + def set_filter_command(val): - global filter_command - filter_command = val + global filter_command + filter_command = val + def get_filter_command(): - global filter_command - return filter_command + global filter_command + return filter_command + def need_process_with_filter(data): - global filter_command - if filter_command == "": - return True - if len(data) < len(filter_command): - return False - if data[:len(filter_command)] == filter_command: - return True - return False + global filter_command + if filter_command == "": + return True + if len(data) < len(filter_command): + return False + if data[: len(filter_command)] == filter_command: + return True + return False + display_folder_instead_of_git_name = True + def set_display_folder_instead_of_git_name(val): - global display_folder_instead_of_git_name - display_folder_instead_of_git_name = val + global display_folder_instead_of_git_name + display_folder_instead_of_git_name = val + def get_display_folder_instead_of_git_name(): - global display_folder_instead_of_git_name - return display_folder_instead_of_git_name + global display_folder_instead_of_git_name + return display_folder_instead_of_git_name + island_root_path = os.path.join(os.getcwd()) if os.path.exists(os.path.join(island_root_path, "." + get_system_base_name())) == True: - # all is good ... - pass -elif os.path.exists(os.path.join(island_root_path, "..", "." + get_system_base_name())) == True: - island_root_path = os.path.join(os.getcwd(), "..") -elif os.path.exists(os.path.join(island_root_path, "..", "..", "." + get_system_base_name())) == True: - island_root_path = os.path.join(os.getcwd(), "..", "..") -elif os.path.exists(os.path.join(island_root_path, "..", "..", "..", "." + get_system_base_name())) == True: - island_root_path = os.path.join(os.getcwd(), "..", "..", "..") -elif os.path.exists(os.path.join(island_root_path, "..", "..", "..", "..", "." + get_system_base_name())) == True: - island_root_path = os.path.join(os.getcwd(), "..", "..", "..", "..") -elif os.path.exists(os.path.join(island_root_path, "..", "..", "..", "..", "..", "." + get_system_base_name())) == True: - island_root_path = os.path.join(os.getcwd(), "..", "..", "..", "..", "..") -elif os.path.exists(os.path.join(island_root_path, "..", "..", "..", "..", "..", "..", "." + get_system_base_name())) == True: - island_root_path = os.path.join(os.getcwd(), "..", "..", "..", "..", "..", "..") + # all is good ... + pass +elif os.path.exists(os.path.join(island_root_path, "..", "." + get_system_base_name())): + island_root_path = os.path.join(os.getcwd(), "..") +elif os.path.exists( + os.path.join(island_root_path, "..", "..", "." + get_system_base_name()) +): + island_root_path = os.path.join(os.getcwd(), "..", "..") +elif os.path.exists( + os.path.join(island_root_path, "..", "..", "..", "." + get_system_base_name()) +): + island_root_path = os.path.join(os.getcwd(), "..", "..", "..") +elif os.path.exists( + os.path.join(island_root_path, "..", "..", "..", "..", "." + get_system_base_name()) +): + island_root_path = os.path.join(os.getcwd(), "..", "..", "..", "..") +elif os.path.exists( + os.path.join( + island_root_path, "..", "..", "..", "..", "..", "." + get_system_base_name() + ) +): + island_root_path = os.path.join(os.getcwd(), "..", "..", "..", "..", "..") +elif os.path.exists( + os.path.join( + island_root_path, + "..", + "..", + "..", + "..", + "..", + "..", + "." + get_system_base_name(), + ) +): + island_root_path = os.path.join(os.getcwd(), "..", "..", "..", "..", "..", "..") else: - #debug.error("the root path of " + get_system_base_name() + " must not be upper that 6 parent path") - pass + # debug.error("the root path of " + get_system_base_name() + " must not be upper that 6 parent path") + pass island_path_user_config = os.path.join(island_root_path, get_system_config_name()) island_path = os.path.join(island_root_path, "." + get_system_base_name()) island_path_config_old = os.path.join(island_path, "config.txt") island_path_config = os.path.join(island_path, "config.json") island_path_manifest = os.path.join(island_path, "manifest") + ## ## @brief to use later to know where the ".island" parent path is ... ## @return the parent path of the ".island" ## def get_island_root_path(): - global island_root_path - return island_root_path + global island_root_path + return island_root_path + def get_island_path(): - global island_path - return island_path + global island_path + return island_path + def get_island_path_config(): - global island_path_config - return island_path_config + global island_path_config + return island_path_config + def get_island_path_config_old(): - global island_path_config_old - return island_path_config_old + global island_path_config_old + return island_path_config_old + def get_island_path_manifest(): - global island_path_manifest - return island_path_manifest + global island_path_manifest + return island_path_manifest + def get_island_path_user_config(): - global island_path_user_config - return island_path_user_config + global island_path_user_config + return island_path_user_config ret_manifest_is_not_existing = -5 @@ -143,5 +184,3 @@ ret_action_partial_done = -13 ret_action_fail = -14 ret_action_need_updtate = 15 - - diff --git a/island/host.py b/island/host.py index 9c3099b..e4b4136 100644 --- a/island/host.py +++ b/island/host.py @@ -1,26 +1,26 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -## -## @author Edouard DUPIN -## -## @copyright 2012, Edouard DUPIN, all right reserved -## -## @license MPL v2.0 (see license file) -## +"""Type of host detection. + +@author Edouard DUPIN +@copyright 2012, Edouard DUPIN, all right reserved +@license MPL v2.0 (see license file) +""" import platform import sys + # Local import from realog import debug + # print os.name # ==> 'posix' if platform.system() == "Linux": - OS = "Linux" + OS = "Linux" elif platform.system() == "Windows": - OS = "Windows" + OS = "Windows" elif platform.system() == "Darwin": - OS = "MacOs" + OS = "MacOs" else: - debug.error("Unknow the Host OS ... '" + platform.system() + "'") + debug.error("Unknow the Host OS ... '" + platform.system() + "'") debug.debug("host.OS = " + OS) - diff --git a/island/link_config.py b/island/link_config.py index 76f9aff..3f4a766 100644 --- a/island/link_config.py +++ b/island/link_config.py @@ -1,22 +1,14 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -## -## @author Edouard DUPIN -## -## @copyright 2012, Edouard DUPIN, all right reserved -## -## @license MPL v2.0 (see license file) -## - - -from realog import debug -from . import tools -from . import env - - -class LinkConfig(): - def __init__(self): - self.source = "" - self.destination = "" +"""Link interface. + +@author Edouard DUPIN +@copyright 2012, Edouard DUPIN, all right reserved +@license MPL v2.0 (see license file) +""" +class LinkConfig: + def __init__(self) -> None: + self.source = "" + self.destination = "" diff --git a/island/manifest.py b/island/manifest.py index aa27bd4..62c1669 100644 --- a/island/manifest.py +++ b/island/manifest.py @@ -1,517 +1,824 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -## -## @author Edouard DUPIN -## -## @copyright 2012, Edouard DUPIN, all right reserved -## -## @license MPL v2.0 (see license file) -## -import platform -import sys -import os +"""Manifest interface. + +@author Edouard DUPIN +@copyright 2012, Edouard DUPIN, all right reserved +@license MPL v2.0 (see license file) +""" + import copy -# Local import -from realog import debug -from . import repo_config -from . import link_config -from . import tools -from . import env -from . import multiprocess -from . import config +import os from lxml import etree +# Local import +from realog import debug + +from . import ( + config, + env, + link_config, + multiprocess, + repo_config, + tools, +) + + def is_lutin_init(): - if os.path.exists(env.get_island_path()) == False: - debug.verbose("Lutin is not init: path does not exist: '" + env.get_island_path() + "'") - return False - if os.path.exists(env.get_island_path_config()) == False \ - and os.path.exists(env.get_island_path_config_old()) == False: - debug.verbose("Lutin is not init: config does not exist: '" + env.get_island_path_config() + "' or '" + env.get_island_path_config_old() + "'") - return False - if os.path.exists(env.get_island_path_manifest()) == False: - debug.verbose("Lutin is not init: Manifest does not exist: '" + env.get_island_path_manifest() + "'") - return False - return True + if os.path.exists(env.get_island_path()) == False: + debug.verbose( + "Lutin is not init: path does not exist: '" + env.get_island_path() + "'" + ) + return False + if ( + os.path.exists(env.get_island_path_config()) == False + and os.path.exists(env.get_island_path_config_old()) == False + ): + debug.verbose( + "Lutin is not init: config does not exist: '" + + env.get_island_path_config() + + "' or '" + + env.get_island_path_config_old() + + "'" + ) + return False + if os.path.exists(env.get_island_path_manifest()) == False: + debug.verbose( + "Lutin is not init: Manifest does not exist: '" + + env.get_island_path_manifest() + + "'" + ) + return False + return True + def check_lutin_is_init(): - # check if .XXX exist (create it if needed) - if is_lutin_init() == False: - debug.error("System not init: missing config: '" + str(env.get_island_path()) + "'. Call first") - exit(-1) + # check if .XXX exist (create it if needed) + if not is_lutin_init(): + debug.error( + "System not init: missing config: '" + + str(env.get_island_path()) + + "'. Call first" + ) + exit(-1) -class Manifest(): - def __init__(self, manifest_xml): - self.manifest_xml = manifest_xml - self.projects = [] - self.default = None - self.default_base = { - "remote":"origin", - "revision":"master", - "sync":False, - } - self.remotes = [] - self.includes = [] - self.links = [] - self.deliver_master = "master" - self.deliver_develop = "develop" - self.deliver_mode = "merge" - # load the manifest - self._load() - # check error in manifest (double path ...) - self._check_double_path([]) - - def get_links(self): - return self.links - - def _load(self): - tree = etree.parse(self.manifest_xml) - debug.debug("manifest : '" + self.manifest_xml + "'") - root = tree.getroot() - if root.tag != "manifest": - debug.error("(l:" + str(child.sourceline) + ") in '" + str(file) + "' have not main xml node='manifest'") - for child in root: - if type(child) == etree._Comment: - debug.verbose("(l:" + str(child.sourceline) + ") comment='" + str(child.text) + "'"); - continue - if child.tag == "remote": - name = "origin" - fetch = "" - for attr in child.attrib: - if attr == "name": - name = child.attrib[attr] - elif attr == "fetch": - fetch = child.attrib[attr] - if len(fetch) >= 2 \ - and fetch[:2] == "..": - # we have a relative island manifest ==> use local manifest origin to get the full origin - cmd = "git remote get-url origin" - debug.verbose("execute : " + cmd) - base_origin = multiprocess.run_command(cmd, cwd=env.get_island_path_manifest()) - debug.verbose("base_origin=" + base_origin[1]) - base_origin = base_origin[1] - while len(fetch) >= 2 \ - and fetch[:2] == "..": - fetch = fetch[2:] - while len(fetch) >= 1 \ - and ( fetch[0] == "/" \ - or fetch[0] == "\\"): - fetch = fetch[1:] - offset_1 = base_origin.rfind('/') - offset_2 = base_origin.rfind(':') - if offset_1 > offset_2: - base_origin = base_origin[:offset_1] - else: - base_origin = base_origin[:offset_2] - debug.verbose("new base_origin=" + base_origin) - debug.verbose("tmp fetch=" + fetch) - if fetch != "": - fetch = base_origin + "/" + fetch - else: - fetch = base_origin - debug.verbose("new fetch=" + fetch) - while len(fetch) > 1 \ - and ( fetch[-1] == "\\" \ - or fetch[-1] == "/") : - fetch = fetch[:-1] - else: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest : Unknow '" + child.tag + "' attibute : '" + attr + "', availlable:[name,fetch]") - debug.debug("(l:" + str(child.sourceline) + ") find '" + child.tag + "' : name='" + name + "' fetch='" + fetch + "'"); - # parse the sub global mirror list - mirror_list = [] - for child_2 in child: - if child_2.tag == "mirror": - # find a new mirror - mirror_name = "" - mirror_fetch = "" - for attr_2 in child_2.attrib: - if attr_2 == "name": - mirror_name = child_2.attrib[attr_2] - elif attr_2 == "fetch": - mirror_fetch = child_2.attrib[attr_2] - while len(mirror_fetch) > 1 \ - and ( mirror_fetch[-1] == "\\" \ - or mirror_fetch[-1] == "/") : - mirror_fetch = mirror_fetch[:-1] - else: - debug.error("(l:" + str(child_2.sourceline) + ") Parsing the manifest : Unknow '" + child_2.tag + "' attibute : '" + attr_2 + "', availlable:[name,fetch]") - debug.debug("mirror: '" + mirror_name + "' '" + mirror_fetch + "'") - if mirror_name == "": - debug.error("(l:" + str(child_2.sourceline) + ") Missing mirrot 'name'") - if mirror_fetch == "": - debug.error("(l:" + str(child_2.sourceline) + ") Missing mirror 'fetch'") - mirror_list.append({ - "name":mirror_name, - "fetch":mirror_fetch, - }) - else: - debug.error("(l:" + str(child_2.sourceline) + ") Parsing the manifest : Unknow '" + child_2.tag + "', availlable:[mirror]") - self.remotes.append({ - "name":name, - "fetch":fetch, - "mirror":mirror_list - }) - continue - - if child.tag == "include": - name = "" - for attr in child.attrib: - if attr == "name": - name = child.attrib[attr] - else: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest : Unknow '" + child.tag + "' attibute : '" + attr + "', availlable:[name]") - debug.debug("(l:" + str(child.sourceline) + ") find '" + child.tag + "' : name='" + name + "'"); - # check if the file exist ... - new_name_xml = os.path.join(os.path.dirname(self.manifest_xml),name) - if os.path.exists(new_name_xml) == False: - debug.error("(l:" + str(child.sourceline) + ") The file does not exist : '" + new_name_xml + "'") - self.includes.append({ - "name":name, - "path":new_name_xml, - "manifest":None - }) - continue - if child.tag == "default": - remote = "origin" - revision = "master" - sync = False - for attr in child.attrib: - if attr == "remote": - remote = child.attrib[attr] - elif attr == "revision": - revision = child.attrib[attr] - elif attr == "sync-s": # synchronize submodule ... automaticaly - sync = child.attrib[attr] - if sync.lower() == "true" \ - or sync == "1" \ - or sync.lower() == "yes": - sync = True - elif sync.lower() == "false" \ - or sync == "0" \ - or sync.lower() == "no": - sync = False - else: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest : Unknow '" + child.tag + "' attbute : '" + attr + "', value:'" + sync + "' availlable:[true,1,yes,false,0,no]") - else: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest : Unknow '" + child.tag + "' attibute : '" + attr + "', availlable:[remote,revision,sync-s]") - if self.default != None: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest : Node '" + child.tag + "' already set") - self.default = { - "remote":remote, - "revision":revision, - "sync":sync, - } - debug.debug("(l:" + str(child.sourceline) + ") find '" + child.tag + "' : remote='" + remote + "' revision='" + revision + "' sync=" + str(sync)); - continue - if child.tag == "project": - name = "" - path = "" - tag_sha1 = None - for attr in child.attrib: - if attr == "name": - name = child.attrib[attr] - elif attr == "path": - path = child.attrib[attr] - elif attr == "tag": - tag_sha1 = child.attrib[attr] - else: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest: Unknow '" + child.tag + "' attibute : '" + attr + "', availlable:[name,tag,sync-s]") - if name == "": - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest: '" + child.tag + "' missing attribute: 'name' ==> specify the git to clone ...") - self.projects.append({ - "name":name, - "path":path, - "tag":tag_sha1, - }) - debug.debug("(l:" + str(child.sourceline) + ") find '" + child.tag + "' : name='" + name + "' path='" + path + "' tag='" + str(tag_sha1) + "'"); - continue - if child.tag == "option": - # not managed ==> future use - type_option = "" - value_option = "" - for attr in child.attrib: - if attr == "type": - type_option = child.attrib[attr] - elif attr == "value": - value_option = child.attrib[attr] - else: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest: Unknow '" + child.tag + "' attibute : '" + attr + "', availlable:[type,value]") - if type_option == "deliver_master": - self.deliver_master = value_option - elif type_option == "deliver_develop": - self.deliver_develop = value_option - elif type_option == "deliver_mode": - self.deliver_mode = value_option - if self.deliver_mode not in ["merge","fast_forward"]: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest: option 'deliver_mode' value availlable: [merge,fast_forward]") - else: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest: Unknow 'type' value availlable: [deliver_master,deliver_develop,deliver_mode]") - continue - if child.tag == "link": - # not managed ==> future use - source = "" - destination = "" - for attr in child.attrib: - if attr == "source": - source = child.attrib[attr] - elif attr == "destination": - destination = child.attrib[attr] - else: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest: Unknow '" + child.tag + "' attibute : '" + attr + "', availlable:[source,destination]") - if source == "": - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest: '" + child.tag + "' missing attribute: 'source' ==> specify the git to clone ...") - if destination == "": - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest: '" + child.tag + "' missing attribute: 'destination' ==> specify the git to clone ...") - self.links.append({ - "source":source, - "destination":destination, - }) - debug.debug("Add link: '" + str(destination) + "' ==> '" + str(source) + "'") - continue - debug.info("(l:" + str(child.sourceline) + ") '" + str(child.tag) + "' values=" + str(child.attrib)); - debug.error("(l:" + str(child.sourceline) + ") Parsing error Unknow NODE : '" + str(child.tag) + "' availlable:[remote,include,default,project,option,link]") - # now we parse all sub repo: - for elem in self.includes: - elem["manifest"] = Manifest(elem["path"]) - - - # inside data child.text - - - def _create_path_with_elem(self, element): - path = element["path"] - if path == "": - path = element["name"] - if len(path) >= 4 \ - and path[-4:] == ".git": - path = path[:-4] - return path - - def _check_double_path(self, list_path = [], space=""): - debug.debug(space + "check path : '" + self.manifest_xml + "'") - for elem in self.projects: - path = self._create_path_with_elem(elem) - debug.debug(space + " check path:'" + str(path) + "'") - if path in list_path: - debug.error("Check Manifest error : double use of the path '" + str(path) + "'") - list_path.append(path) - for elem in self.includes: - elem["manifest"]._check_double_path(list_path, space + " ") - - def get_all_configs(self, default=None, upper_remotes=[]): - out = [] - if default == None: - if self.default != None: - default = copy.deepcopy(self.default) - else: - default = copy.deepcopy(self.default_base) - # debug.error(" self.default=" + str(self.default)) - # add all local project - for elem in self.projects: - debug.verbose("parse element " + str(elem)) - if env.need_process_with_filter(elem["name"]) == False: - debug.info("Filter repository: " + str(elem["name"])) - continue - conf = repo_config.RepoConfig() - conf.name = elem["name"] - conf.tag = elem["tag"] - conf.path = self._create_path_with_elem(elem) - - # add default remote for the project (search in herited element) - for remote in self.remotes: - debug.verbose(" Local Remote: " + str(remote)) - if remote["name"] == default["remote"]: - conf.remotes.append(remote) - if len(conf.remotes) == 0: - for remote in upper_remotes: - debug.verbose(" upper Remote: " + str(remote)) - if remote["name"] == default["remote"]: - conf.remotes.append(remote) - if len(conf.remotes) == 0: - debug.error(" No remote detected: " + str(len(conf.remotes)) + " for " + conf.name + " with default remote name : " + default["remote"] + " self remote: " + str(self.remotes)) - - # select default remote: - conf.select_remote = None - debug.debug(" remotes count: " + str(len(conf.remotes))) - for remote in conf.remotes: - debug.debug(" remote=" + str(remote)) - debug.debug(" Ckeck remote : " + remote["name"] + " == " + default["remote"]) - debug.verbose(" remote=" + str(remote)) - debug.verbose(" default=" + str(default)) - if remote["name"] == default["remote"]: - conf.select_remote = copy.deepcopy(remote) - debug.debug(" copy select=" + str(conf.select_remote)) - - # copy the submodule synchronisation - conf.select_remote["sync"] = default["sync"] - break - if conf.select_remote == None: - debug.error("missing remote for project: " + str(conf.name)) - - conf.branch = default["revision"] - out.append(conf) - # create a temporary variable to transmit the remote to includes - upper_remotes_forward = copy.deepcopy(upper_remotes) - for remote in self.remotes: - upper_remotes_forward.append(remote) - # add all include project - for elem in self.includes: - list_project = elem["manifest"].get_all_configs(default, upper_remotes_forward) - for elem_proj in list_project: - out.append(elem_proj) - - ## ------------------------------------------------------------- - ## -- add Volatile ... - ## ------------------------------------------------------------- - debug.verbose("include volatile config") - # TODO: maybe find a better way to do this... - conf_global = config.get_unique_config() - for elem in conf_global.get_volatile(): - conf = repo_config.RepoConfig() - base_volatile, repo_volatile = repo_config.split_repo(elem["git_address"]) - conf.name = repo_volatile - conf.path = elem["path"] - conf.branch = "master" - conf.volatile = True - conf.remotes = [ - { - 'name': 'origin', - 'fetch': base_volatile, - 'mirror': [] - } - ] - conf.select_remote = { - 'name': 'origin', - 'fetch': base_volatile, - 'sync': False, - 'mirror': [] - } - out.append(conf) - ## ------------------------------------------------------------- - if False: - debug.info("list of all repo:") - for elem in out: - debug.info(" '" + elem.name + "'") - debug.info(" path: " + elem.path) - debug.info(" remotes: " + str(elem.remotes)) - debug.info(" select_remote: " + str(elem.select_remote)) - debug.info(" branch: " + elem.branch) - return out + +class Manifest: + def __init__(self, manifest_xml: str) -> None: + self.manifest_xml = manifest_xml + self.projects = [] + self.default = None + self.default_base = { + "remote": "origin", + "revision": "master", + "sync": False, + } + self.remotes = [] + self.includes = [] + self.links = [] + self.deliver_master = "master" + self.deliver_develop = "develop" + self.deliver_mode = "merge" + # load the manifest + self._load() + # check error in manifest (double path ...) + self._check_double_path([]) + + def get_links(self): + return self.links + + def _load(self): + debug.debug("manifest : '" + self.manifest_xml + "'") + tree = etree.parse(self.manifest_xml) + root = tree.getroot() + if root.tag != "manifest": + debug.error( + f"(l:{child.sourceline}) in '{file}' have not main xml node='manifest'" + ) + for child in root: + if type(child) == etree._Comment: + debug.verbose( + "(l:" + + str(child.sourceline) + + ") comment='" + + str(child.text) + + "'" + ) + continue + if child.tag == "remote": + name = "origin" + fetch = "" + for attr in child.attrib: + if attr == "name": + name = child.attrib[attr] + elif attr == "fetch": + fetch = child.attrib[attr] + if len(fetch) >= 2 and fetch[:2] == "..": + # we have a relative island manifest ==> use local manifest origin to get the full origin + cmd = "git remote get-url origin" + debug.verbose("execute : " + cmd) + base_origin = multiprocess.run_command( + cmd, cwd=env.get_island_path_manifest() + ) + debug.verbose("base_origin=" + base_origin[1]) + base_origin = base_origin[1] + while len(fetch) >= 2 and fetch[:2] == "..": + fetch = fetch[2:] + while len(fetch) >= 1 and ( + fetch[0] == "/" or fetch[0] == "\\" + ): + fetch = fetch[1:] + offset_1 = base_origin.rfind("/") + offset_2 = base_origin.rfind(":") + if offset_1 > offset_2: + base_origin = base_origin[:offset_1] + else: + base_origin = base_origin[:offset_2] + debug.verbose("new base_origin=" + base_origin) + debug.verbose("tmp fetch=" + fetch) + if fetch != "": + fetch = base_origin + "/" + fetch + else: + fetch = base_origin + debug.verbose("new fetch=" + fetch) + while len(fetch) > 1 and ( + fetch[-1] == "\\" or fetch[-1] == "/" + ): + fetch = fetch[:-1] + else: + debug.error( + f"(l:{child.sourceline}) Parsing the manifest : Unknown '{child.tag}' attribute : '{attr}', available:[name,fetch]" + ) + debug.debug( + f"(l:{child.sourceline}) find '{child.tag}' : name='{name}' fetch='{fetch}'" + ) + # parse the sub global mirror list + mirror_list = [] + for child_2 in child: + if child_2.tag == "mirror": + # find a new mirror + mirror_name = "" + mirror_fetch = "" + for attr_2 in child_2.attrib: + if attr_2 == "name": + mirror_name = child_2.attrib[attr_2] + elif attr_2 == "fetch": + mirror_fetch = child_2.attrib[attr_2] + while len(mirror_fetch) > 1 and ( + mirror_fetch[-1] == "\\" or mirror_fetch[-1] == "/" + ): + mirror_fetch = mirror_fetch[:-1] + else: + debug.error( + "(l:" + + str(child_2.sourceline) + + ") Parsing the manifest : Unknow '" + + child_2.tag + + "' attibute : '" + + attr_2 + + "', availlable:[name,fetch]" + ) + debug.debug( + "mirror: '" + mirror_name + "' '" + mirror_fetch + "'" + ) + if mirror_name == "": + debug.error( + "(l:" + + str(child_2.sourceline) + + ") Missing mirrot 'name'" + ) + if mirror_fetch == "": + debug.error( + "(l:" + + str(child_2.sourceline) + + ") Missing mirror 'fetch'" + ) + mirror_list.append( + { + "name": mirror_name, + "fetch": mirror_fetch, + } + ) + else: + debug.error( + "(l:" + + str(child_2.sourceline) + + ") Parsing the manifest : Unknow '" + + child_2.tag + + "', availlable:[mirror]" + ) + self.remotes.append( + {"name": name, "fetch": fetch, "mirror": mirror_list} + ) + continue + + if child.tag == "include": + name = "" + for attr in child.attrib: + if attr == "name": + name = child.attrib[attr] + else: + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest : Unknow '" + + child.tag + + "' attibute : '" + + attr + + "', availlable:[name]" + ) + debug.debug( + "(l:" + + str(child.sourceline) + + ") find '" + + child.tag + + "' : name='" + + name + + "'" + ) + # check if the file exist ... + new_name_xml = os.path.join(os.path.dirname(self.manifest_xml), name) + if os.path.exists(new_name_xml) == False: + debug.error( + "(l:" + + str(child.sourceline) + + ") The file does not exist : '" + + new_name_xml + + "'" + ) + self.includes.append( + {"name": name, "path": new_name_xml, "manifest": None} + ) + continue + if child.tag == "default": + remote = "origin" + revision = "master" + sync = False + for attr in child.attrib: + if attr == "remote": + remote = child.attrib[attr] + elif attr == "revision": + revision = child.attrib[attr] + elif attr == "sync-s": # synchronize submodule ... automaticaly + sync = child.attrib[attr] + if ( + sync.lower() == "true" + or sync == "1" + or sync.lower() == "yes" + ): + sync = True + elif ( + sync.lower() == "false" + or sync == "0" + or sync.lower() == "no" + ): + sync = False + else: + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest : Unknow '" + + child.tag + + "' attbute : '" + + attr + + "', value:'" + + sync + + "' availlable:[true,1,yes,false,0,no]" + ) + else: + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest : Unknow '" + + child.tag + + "' attibute : '" + + attr + + "', availlable:[remote,revision,sync-s]" + ) + if self.default != None: + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest : Node '" + + child.tag + + "' already set" + ) + self.default = { + "remote": remote, + "revision": revision, + "sync": sync, + } + debug.debug( + "(l:" + + str(child.sourceline) + + ") find '" + + child.tag + + "' : remote='" + + remote + + "' revision='" + + revision + + "' sync=" + + str(sync) + ) + continue + if child.tag == "project": + name = "" + path = "" + tag_sha1 = None + for attr in child.attrib: + if attr == "name": + name = child.attrib[attr] + elif attr == "path": + path = child.attrib[attr] + elif attr == "tag": + tag_sha1 = child.attrib[attr] + else: + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest: Unknow '" + + child.tag + + "' attibute : '" + + attr + + "', availlable:[name,tag,sync-s]" + ) + if name == "": + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest: '" + + child.tag + + "' missing attribute: 'name' ==> specify the git to clone ..." + ) + self.projects.append( + { + "name": name, + "path": path, + "tag": tag_sha1, + } + ) + debug.debug( + "(l:" + + str(child.sourceline) + + ") find '" + + child.tag + + "' : name='" + + name + + "' path='" + + path + + "' tag='" + + str(tag_sha1) + + "'" + ) + continue + if child.tag == "option": + # not managed ==> future use + type_option = "" + value_option = "" + for attr in child.attrib: + if attr == "type": + type_option = child.attrib[attr] + elif attr == "value": + value_option = child.attrib[attr] + else: + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest: Unknow '" + + child.tag + + "' attibute : '" + + attr + + "', availlable:[type,value]" + ) + if type_option == "deliver_master": + self.deliver_master = value_option + elif type_option == "deliver_develop": + self.deliver_develop = value_option + elif type_option == "deliver_mode": + self.deliver_mode = value_option + if self.deliver_mode not in ["merge", "fast_forward"]: + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest: option 'deliver_mode' value availlable: [merge,fast_forward]" + ) + else: + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest: Unknow 'type' value availlable: [deliver_master,deliver_develop,deliver_mode]" + ) + continue + if child.tag == "link": + # not managed ==> future use + source = "" + destination = "" + for attr in child.attrib: + if attr == "source": + source = child.attrib[attr] + elif attr == "destination": + destination = child.attrib[attr] + else: + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest: Unknow '" + + child.tag + + "' attibute : '" + + attr + + "', availlable:[source,destination]" + ) + if source == "": + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest: '" + + child.tag + + "' missing attribute: 'source' ==> specify the git to clone ..." + ) + if destination == "": + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest: '" + + child.tag + + "' missing attribute: 'destination' ==> specify the git to clone ..." + ) + self.links.append( + { + "source": source, + "destination": destination, + } + ) + debug.debug( + "Add link: '" + str(destination) + "' ==> '" + str(source) + "'" + ) + continue + debug.info( + "(l:" + + str(child.sourceline) + + ") '" + + str(child.tag) + + "' values=" + + str(child.attrib) + ) + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing error Unknow NODE : '" + + str(child.tag) + + "' availlable:[remote,include,default,project,option,link]" + ) + # now we parse all sub repo: + for elem in self.includes: + elem["manifest"] = Manifest(elem["path"]) + + # inside data child.text + + def _create_path_with_elem(self, element): + path = element["path"] + if path == "": + path = element["name"] + if len(path) >= 4 and path[-4:] == ".git": + path = path[:-4] + return path + + def _check_double_path(self, list_path=[], space=""): + debug.debug(space + "check path : '" + self.manifest_xml + "'") + for elem in self.projects: + path = self._create_path_with_elem(elem) + debug.debug(space + " check path:'" + str(path) + "'") + if path in list_path: + debug.error( + "Check Manifest error : double use of the path '" + str(path) + "'" + ) + list_path.append(path) + for elem in self.includes: + elem["manifest"]._check_double_path(list_path, space + " ") + + def get_all_configs(self, default=None, upper_remotes=[]): + out = [] + if default == None: + if self.default != None: + default = copy.deepcopy(self.default) + else: + default = copy.deepcopy(self.default_base) + # debug.error(" self.default=" + str(self.default)) + # add all local project + for elem in self.projects: + debug.verbose("parse element " + str(elem)) + if env.need_process_with_filter(elem["name"]) == False: + debug.info("Filter repository: " + str(elem["name"])) + continue + conf = repo_config.RepoConfig() + conf.name = elem["name"] + conf.tag = elem["tag"] + conf.path = self._create_path_with_elem(elem) + + # add default remote for the project (search in herited element) + for remote in self.remotes: + debug.verbose(" Local Remote: " + str(remote)) + if remote["name"] == default["remote"]: + conf.remotes.append(remote) + if len(conf.remotes) == 0: + for remote in upper_remotes: + debug.verbose(" upper Remote: " + str(remote)) + if remote["name"] == default["remote"]: + conf.remotes.append(remote) + if len(conf.remotes) == 0: + debug.error( + " No remote detected: " + + str(len(conf.remotes)) + + " for " + + conf.name + + " with default remote name : " + + default["remote"] + + " self remote: " + + str(self.remotes) + ) + + # select default remote: + conf.select_remote = None + debug.debug(" remotes count: " + str(len(conf.remotes))) + for remote in conf.remotes: + debug.debug(" remote=" + str(remote)) + debug.debug( + f" Check remote : {remote['name']} == {default['remote']}" + ) + debug.verbose(" remote=" + str(remote)) + debug.verbose(" default=" + str(default)) + if remote["name"] == default["remote"]: + conf.select_remote = copy.deepcopy(remote) + debug.debug(" copy select=" + str(conf.select_remote)) + + # copy the submodule synchronization + conf.select_remote["sync"] = default["sync"] + break + if conf.select_remote == None: + debug.error("missing remote for project: " + str(conf.name)) + + conf.branch = default["revision"] + out.append(conf) + # create a temporary variable to transmit the remote to includes + upper_remotes_forward = copy.deepcopy(upper_remotes) + for remote in self.remotes: + upper_remotes_forward.append(remote) + # add all include project + for elem in self.includes: + list_project = elem["manifest"].get_all_configs( + default, upper_remotes_forward + ) + for elem_proj in list_project: + out.append(elem_proj) + + ## ------------------------------------------------------------- + ## -- add Volatile ... + ## ------------------------------------------------------------- + debug.verbose("include volatile config") + # TODO: maybe find a better way to do this... + conf_global = config.get_unique_config() + for elem in conf_global.get_volatile(): + conf = repo_config.RepoConfig() + base_volatile, repo_volatile = repo_config.split_repo(elem["git_address"]) + conf.name = repo_volatile + conf.path = elem["path"] + conf.branch = "master" + conf.volatile = True + conf.remotes = [{"name": "origin", "fetch": base_volatile, "mirror": []}] + conf.select_remote = { + "name": "origin", + "fetch": base_volatile, + "sync": False, + "mirror": [], + } + out.append(conf) + ## ------------------------------------------------------------- + if False: + debug.info("list of all repo:") + for elem in out: + debug.info(f" '{elem.name}'") + debug.info(f" path: {elem.path}") + debug.info(f" remotes: {elem.remotes}") + debug.info(f" select_remote: {elem.select_remote}") + debug.info(f" branch: {elem.branch}") + return out def tag_manifest(manifest_xml_filename, all_tags): - tree = etree.parse(manifest_xml_filename) - debug.debug("manifest : '" + manifest_xml_filename + "'") - root = tree.getroot() - includes = [] - if root.tag != "manifest": - debug.error("(l:" + str(child.sourceline) + ") in '" + str(file) + "' have not main xml node='manifest'") - return False - for child in root: - if type(child) == etree._Comment: - debug.verbose("(l:" + str(child.sourceline) + ") comment='" + str(child.text) + "'"); - continue - if child.tag == "remote": - continue - if child.tag == "include": - name = "" - for attr in child.attrib: - if attr == "name": - name = child.attrib[attr] - else: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest : Unknow '" + child.tag + "' attibute : '" + attr + "', availlable:[name]") - debug.debug("(l:" + str(child.sourceline) + ") find '" + child.tag + "' : name='" + name + "'"); - # check if the file exist ... - new_name_xml = os.path.join(os.path.dirname(manifest_xml_filename),name) - if os.path.exists(new_name_xml) == False: - debug.error("(l:" + str(child.sourceline) + ") The file does not exist : '" + new_name_xml + "'") - includes.append({ - "name":name, - "path":new_name_xml, - "manifest":None - }) - continue - if child.tag == "default": - continue - if child.tag == "project": - name = "" - path = "" - tag_sha1 = None - for attr in child.attrib: - if attr == "name": - name = child.attrib[attr] - elif attr == "path": - path = child.attrib[attr] - elif attr == "tag": - tag_sha1 = child.attrib[attr] - else: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest: Unknow '" + child.tag + "' attibute : '" + attr + "', availlable:[name,tag,sync-s]") - if name == "": - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest: '" + child.tag + "' missing attribute: 'name' ==> specify the git to clone ...") - for elem_tag in all_tags: - if elem_tag["name"] == name: - child.set("tag", elem_tag["tag"]) - continue - if child.tag == "option": - # not managed ==> future use - continue - if child.tag == "link": - continue - debug.info("(l:" + str(child.sourceline) + ") '" + str(child.tag) + "' values=" + str(child.attrib)); - debug.error("(l:" + str(child.sourceline) + ") Parsing error Unknow NODE : '" + str(child.tag) + "' availlable:[remote,include,default,project,option,link]") - tree.write(manifest_xml_filename, pretty_print=True, xml_declaration=True, encoding="utf-8") - # now we parse all sub repo: - for elem in includes: - tag_manifest(elem["path"], all_tags) - + tree = etree.parse(manifest_xml_filename) + debug.debug("manifest : '" + manifest_xml_filename + "'") + root = tree.getroot() + includes = [] + if root.tag != "manifest": + debug.error( + "(l:" + + str(child.sourceline) + + ") in '" + + str(file) + + "' have not main xml node='manifest'" + ) + return False + for child in root: + if type(child) == etree._Comment: + debug.verbose( + "(l:" + + str(child.sourceline) + + ") comment='" + + str(child.text) + + "'" + ) + continue + if child.tag == "remote": + continue + if child.tag == "include": + name = "" + for attr in child.attrib: + if attr == "name": + name = child.attrib[attr] + else: + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest : Unknow '" + + child.tag + + "' attibute : '" + + attr + + "', availlable:[name]" + ) + debug.debug( + "(l:" + + str(child.sourceline) + + ") find '" + + child.tag + + "' : name='" + + name + + "'" + ) + # check if the file exist ... + new_name_xml = os.path.join(os.path.dirname(manifest_xml_filename), name) + if os.path.exists(new_name_xml) == False: + debug.error( + "(l:" + + str(child.sourceline) + + ") The file does not exist : '" + + new_name_xml + + "'" + ) + includes.append({"name": name, "path": new_name_xml, "manifest": None}) + continue + if child.tag == "default": + continue + if child.tag == "project": + name = "" + path = "" + tag_sha1 = None + for attr in child.attrib: + if attr == "name": + name = child.attrib[attr] + elif attr == "path": + path = child.attrib[attr] + elif attr == "tag": + tag_sha1 = child.attrib[attr] + else: + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest: Unknow '" + + child.tag + + "' attibute : '" + + attr + + "', availlable:[name,tag,sync-s]" + ) + if name == "": + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest: '" + + child.tag + + "' missing attribute: 'name' ==> specify the git to clone ..." + ) + for elem_tag in all_tags: + if elem_tag["name"] == name: + child.set("tag", elem_tag["tag"]) + continue + if child.tag == "option": + # not managed ==> future use + continue + if child.tag == "link": + continue + debug.info( + "(l:" + + str(child.sourceline) + + ") '" + + str(child.tag) + + "' values=" + + str(child.attrib) + ) + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing error Unknow NODE : '" + + str(child.tag) + + "' availlable:[remote,include,default,project,option,link]" + ) + tree.write( + manifest_xml_filename, pretty_print=True, xml_declaration=True, encoding="utf-8" + ) + # now we parse all sub repo: + for elem in includes: + tag_manifest(elem["path"], all_tags) def tag_clear(manifest_xml_filename): - tree = etree.parse(manifest_xml_filename) - debug.debug("manifest : '" + manifest_xml_filename + "'") - root = tree.getroot() - includes = [] - if root.tag != "manifest": - debug.error("(l:" + str(child.sourceline) + ") in '" + str(file) + "' have not main xml node='manifest'") - return False - for child in root: - if type(child) == etree._Comment: - debug.verbose("(l:" + str(child.sourceline) + ") comment='" + str(child.text) + "'"); - continue - if child.tag == "remote": - continue - if child.tag == "include": - name = "" - for attr in child.attrib: - if attr == "name": - name = child.attrib[attr] - else: - debug.error("(l:" + str(child.sourceline) + ") Parsing the manifest : Unknow '" + child.tag + "' attibute : '" + attr + "', availlable:[name]") - debug.debug("(l:" + str(child.sourceline) + ") find '" + child.tag + "' : name='" + name + "'"); - # check if the file exist ... - new_name_xml = os.path.join(os.path.dirname(manifest_xml_filename),name) - if os.path.exists(new_name_xml) == False: - debug.error("(l:" + str(child.sourceline) + ") The file does not exist : '" + new_name_xml + "'") - includes.append({ - "name":name, - "path":new_name_xml, - "manifest":None - }) - continue - if child.tag == "default": - continue - if child.tag == "project": - child.attrib.pop("tag", None) - continue - if child.tag == "option": - continue - if child.tag == "link": - continue - debug.info("(l:" + str(child.sourceline) + ") '" + str(child.tag) + "' values=" + str(child.attrib)); - debug.error("(l:" + str(child.sourceline) + ") Parsing error Unknow NODE : '" + str(child.tag) + "' availlable:[remote,include,default,project,option,link]") - tree.write(manifest_xml_filename, pretty_print=True, xml_declaration=True, encoding="utf-8") - # now we parse all sub repo: - for elem in includes: - tag_clear(elem["path"]) - \ No newline at end of file + tree = etree.parse(manifest_xml_filename) + debug.debug("manifest : '" + manifest_xml_filename + "'") + root = tree.getroot() + includes = [] + if root.tag != "manifest": + debug.error( + "(l:" + + str(child.sourceline) + + ") in '" + + str(file) + + "' have not main xml node='manifest'" + ) + return False + for child in root: + if type(child) == etree._Comment: + debug.verbose( + "(l:" + + str(child.sourceline) + + ") comment='" + + str(child.text) + + "'" + ) + continue + if child.tag == "remote": + continue + if child.tag == "include": + name = "" + for attr in child.attrib: + if attr == "name": + name = child.attrib[attr] + else: + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing the manifest : Unknow '" + + child.tag + + "' attibute : '" + + attr + + "', availlable:[name]" + ) + debug.debug( + "(l:" + + str(child.sourceline) + + ") find '" + + child.tag + + "' : name='" + + name + + "'" + ) + # check if the file exist ... + new_name_xml = os.path.join(os.path.dirname(manifest_xml_filename), name) + if os.path.exists(new_name_xml) == False: + debug.error( + "(l:" + + str(child.sourceline) + + ") The file does not exist : '" + + new_name_xml + + "'" + ) + includes.append({"name": name, "path": new_name_xml, "manifest": None}) + continue + if child.tag == "default": + continue + if child.tag == "project": + child.attrib.pop("tag", None) + continue + if child.tag == "option": + continue + if child.tag == "link": + continue + debug.info( + "(l:" + + str(child.sourceline) + + ") '" + + str(child.tag) + + "' values=" + + str(child.attrib) + ) + debug.error( + "(l:" + + str(child.sourceline) + + ") Parsing error Unknow NODE : '" + + str(child.tag) + + "' availlable:[remote,include,default,project,option,link]" + ) + tree.write( + manifest_xml_filename, pretty_print=True, xml_declaration=True, encoding="utf-8" + ) + # now we parse all sub repo: + for elem in includes: + tag_clear(elem["path"]) diff --git a/island/multiprocess.py b/island/multiprocess.py index b3ce14b..3df40c7 100644 --- a/island/multiprocess.py +++ b/island/multiprocess.py @@ -1,118 +1,134 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -## -## @author Edouard DUPIN -## -## @copyright 2012, Edouard DUPIN, all right reserved -## -## @license MPL v2.0 (see license file) -## +"""System call Interface. +@author Edouard DUPIN +@copyright 2012, Edouard DUPIN, all right reserved +@license MPL v2.0 (see license file) +""" + +import os +import shlex +import subprocess import sys import threading import time -import sys -import os -import subprocess -import shlex + # Local import from realog import debug -from . import tools -from . import env + +from . import env, tools -def generic_display_error(return_value, type_name, error_only=False, availlable_return=[0], display_if_nothing=True): - debug.verbose(str(return_value)) - if return_value[0] in availlable_return: - if error_only == True: - return - display = False - if return_value[1] != "": - debug.info(return_value[1]) - display = True - if return_value[2] != "": - debug.warning(return_value[2]) - display = True - if display_if_nothing == False: - return - if display == False: - debug.verbose("GIT(" + type_name + "): All done OK") - else: - display = False - if return_value[1] != "": - debug.warning("ERROR GIT(" + type_name + ") 1:" + return_value[1]) - display = True - if return_value[2] != "": - debug.warning("ERROR GIT(" + type_name + ") 2:" + return_value[2]) - display = True - if display == False: - debug.warning("ERROR GIT(" + type_name + "): Unknow error return_value=" + str(return_value[0])) +def generic_display_error( + return_value, + type_name, + error_only=False, + availlable_return=[0], + display_if_nothing=True, +): + debug.verbose(str(return_value)) + if return_value[0] in availlable_return: + if error_only == True: + return + display = False + if return_value[1] != "": + debug.info(return_value[1]) + display = True + if return_value[2] != "": + debug.warning(return_value[2]) + display = True + if display_if_nothing == False: + return + if display == False: + debug.verbose("GIT(" + type_name + "): All done OK") + else: + display = False + if return_value[1] != "": + debug.warning("ERROR GIT(" + type_name + ") 1:" + return_value[1]) + display = True + if return_value[2] != "": + debug.warning("ERROR GIT(" + type_name + ") 2:" + return_value[2]) + display = True + if display == False: + debug.warning( + "ERROR GIT(" + + type_name + + "): Unknow error return_value=" + + str(return_value[0]) + ) + def run_command_direct_shell(cmd_line, cwd=None, shell=False): - # prepare command line: - args = shlex.split(cmd_line) - debug.verbose("cmd = " + str(args)) - subprocess.check_call(args, shell=shell) - return "" + # prepare command line: + args = shlex.split(cmd_line) + debug.verbose("cmd = " + str(args)) + subprocess.check_call(args, shell=shell) + return "" + + ## ## @brief Execute the command and ruturn generate data ## def run_command_direct(cmd_line, cwd=None): - # prepare command line: - args = shlex.split(cmd_line) - debug.verbose("cmd = " + str(args)) - """ + # prepare command line: + args = shlex.split(cmd_line) + debug.verbose("cmd = " + str(args)) + """ if True: subprocess.check_call(args) return "" """ - try: - # create the subprocess - #p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - #p = subprocess.check_call(args) - """ - if cwd != None: - debug.info("path = " + cwd) - """ - p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd) - except subprocess.CalledProcessError as e: - debug.error("subprocess.CalledProcessError : " + str(args)) - except: - debug.error("Exception on : " + str(args)) - # launch the subprocess: - output, err = p.communicate() - if sys.version_info >= (3, 0): - output = output.decode("utf-8") - err = err.decode("utf-8") - # Check errors: - if p.returncode == 0: - if output == None: - return err[:-1]; - return output[:-1]; - else: - return False - + try: + # create the subprocess + # p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # p = subprocess.check_call(args) + """ + if cwd != None: + debug.info("path = " + cwd) + """ + p = subprocess.Popen( + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd + ) + except subprocess.CalledProcessError as e: + debug.error("subprocess.CalledProcessError : " + str(args)) + except: + debug.error("Exception on : " + str(args)) + # launch the subprocess: + output, err = p.communicate() + if sys.version_info >= (3, 0): + output = output.decode("utf-8") + err = err.decode("utf-8") + # Check errors: + if p.returncode == 0: + if output == None: + return err[:-1] + return output[:-1] + else: + return False def run_command(cmd_line, cwd=None): - # prepare command line: - args = shlex.split(cmd_line) - debug.verbose("cmd = " + str(args)) - try: - # create the subprocess - """ - if cwd != None: - debug.info("path = " + cwd) - """ - p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd) - except subprocess.CalledProcessError as e: - debug.error("subprocess.CalledProcessError : " + str(args)) - except: - debug.error("Exception on : " + str(args)) - # launch the subprocess: - output, err = p.communicate() - if sys.version_info >= (3, 0): - output = output.decode("utf-8") - err = err.decode("utf-8") - # Check error : - return [p.returncode, output[:-1], err[:-1]] + # prepare command line: + args = shlex.split(cmd_line) + debug.verbose("cmd = " + str(args)) + try: + # create the subprocess + """ + if cwd != None: + debug.info("path = " + cwd) + """ + p = subprocess.Popen( + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd + ) + except subprocess.CalledProcessError as e: + debug.error("subprocess.CalledProcessError : " + str(args)) + except: + debug.error("Exception on : " + str(args)) + # launch the subprocess: + output, err = p.communicate() + if sys.version_info >= (3, 0): + output = output.decode("utf-8") + err = err.decode("utf-8") + # Check error : + return [p.returncode, output[:-1], err[:-1]] diff --git a/island/repo_config.py b/island/repo_config.py index d3f8686..876a014 100644 --- a/island/repo_config.py +++ b/island/repo_config.py @@ -1,51 +1,60 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -## -## @author Edouard DUPIN -## -## @copyright 2012, Edouard DUPIN, all right reserved -## -## @license MPL v2.0 (see license file) -## +"""Repository management. + +@author Edouard DUPIN +@copyright 2012, Edouard DUPIN, all right reserved +@license MPL v2.0 (see license file) +""" from realog import debug -from . import tools -from . import env +from . import env, tools -class RepoConfig(): - def __init__(self): - self.name = "" - self.path = "" - self.remotes = [] # list of all remotes, with the upstream elements (needed for third party integrations) - self.select_remote = "" - self.branch = "" - self.tag = None - self.volatile = False - +class RepoConfig: + def __init__(self): + self.name = "" + self.path = "" + self.remotes = ( + [] + ) # list of all remotes, with the upstream elements (needed for third party integrations) + self.select_remote = "" + self.branch = "" + self.tag = None + self.volatile = False def split_repo(git_repo): - debug.verbose("parse git repo in RAW: " + str(git_repo)) - if len(git_repo) > 4 \ - and git_repo[:4] == "http": - # http://wdfqsdfqs@qsdfqsdf/qsdfqsdf/qsdfqsdf/qsdfqs.git find the 3rd '/' and cut at this point - elements = git_repo.split('/') - if len(elements) < 4: - debug.error("Can not parse the git repository : '" + str(git_repo) + "' wrong format http?://xxx@xxx.xxx/****") - base = elements[0] + "/" + elements[1] + "/" + elements[2] - repo = git_repo[len(base)+1:] - elif len(git_repo) > 3 \ - and git_repo[:3] == "git": - # git@qsdfqsdf:qsdfqsdf/qsdfqsdf/qsdfqs.git find the 1st ':' and cut at this point - elements = git_repo.split(':') - if len(elements) < 2: - debug.error("Can not parse the git repository : '" + str(git_repo) + "' wrong format git@xxx.xxx:****") - base = elements[0] - repo = git_repo[len(base)+1:] - else: - debug.error("Can not parse the git repository : '" + str(git_repo) + "' does not start with ['http', 'git']") - debug.verbose(" base: " + str(base)) - debug.verbose(" repo: " + str(repo)) - return (base, repo) \ No newline at end of file + debug.verbose("parse git repo in RAW: " + str(git_repo)) + if len(git_repo) > 4 and git_repo[:4] == "http": + # http://wdfqsdfqs@qsdfqsdf/qsdfqsdf/qsdfqsdf/qsdfqs.git find the 3rd '/' and cut at this point + elements = git_repo.split("/") + if len(elements) < 4: + debug.error( + "Can not parse the git repository : '" + + str(git_repo) + + "' wrong format http?://xxx@xxx.xxx/****" + ) + base = elements[0] + "/" + elements[1] + "/" + elements[2] + repo = git_repo[len(base) + 1 :] + elif len(git_repo) > 3 and git_repo[:3] == "git": + # git@qsdfqsdf:qsdfqsdf/qsdfqsdf/qsdfqs.git find the 1st ':' and cut at this point + elements = git_repo.split(":") + if len(elements) < 2: + debug.error( + "Can not parse the git repository : '" + + str(git_repo) + + "' wrong format git@xxx.xxx:****" + ) + base = elements[0] + repo = git_repo[len(base) + 1 :] + else: + debug.error( + "Can not parse the git repository : '" + + str(git_repo) + + "' does not start with ['http', 'git']" + ) + debug.verbose(" base: " + str(base)) + debug.verbose(" repo: " + str(repo)) + return (base, repo) diff --git a/island/tools.py b/island/tools.py index f70e799..003b8bd 100644 --- a/island/tools.py +++ b/island/tools.py @@ -1,111 +1,117 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -## -## @author Edouard DUPIN -## -## @copyright 2012, Edouard DUPIN, all right reserved -## -## @license MPL v2.0 (see license file) -## +"""Toolbox. +@author Edouard DUPIN +@copyright 2012, Edouard DUPIN, all right reserved +@license MPL v2.0 (see license file) +""" + +import fnmatch import os import shutil -import errno -import fnmatch -import stat import time + # Local import from realog import debug + from . import env -""" - -""" -def get_run_path(): - return os.getcwd() -""" - -""" -def get_current_path(file): - return os.path.dirname(os.path.realpath(file)) +def get_run_path() -> str: + return os.getcwd() + + +def get_current_path(file) -> str: + return os.path.dirname(os.path.realpath(file)) def create_directory(path): - try: - os.stat(path) - except: - os.makedirs(path) + try: + os.stat(path) + except: + os.makedirs(path) + def create_directory_of_file(file): - path = os.path.dirname(file) - create_directory(path) + path = os.path.dirname(file) + create_directory(path) def get_list_sub_path(path): - # TODO : os.listdir(path) - for dirname, dirnames, filenames in os.walk(path): - return dirnames - return [] + # TODO : os.listdir(path) + for dirname, dirnames, filenames in os.walk(path): + return dirnames + return [] + def get_list_sub_files(path): - # TODO : os.listdir(path) - for dirname, dirnames, filenames in os.walk(path): - return filenames - return [] + # TODO : os.listdir(path) + for dirname, dirnames, filenames in os.walk(path): + return filenames + return [] + def remove_path_and_sub_path(path): - if os.path.isdir(path): - debug.verbose("remove path : '" + path + "'") - shutil.rmtree(path) + if os.path.isdir(path): + debug.verbose("remove path : '" + path + "'") + shutil.rmtree(path) + def remove_file(path): - if os.path.isfile(path): - os.remove(path) - elif os.path.islink(path): - os.remove(path) + if os.path.isfile(path): + os.remove(path) + elif os.path.islink(path): + os.remove(path) + def file_size(path): - if not os.path.isfile(path): - return 0 - statinfo = os.stat(path) - return statinfo.st_size + if not os.path.isfile(path): + return 0 + statinfo = os.stat(path) + return statinfo.st_size + def file_read_data(path, binary=False): - if not os.path.isfile(path): - return "" - if binary == True: - file = open(path, "rb") - else: - file = open(path, "r") - data_file = file.read() - file.close() - return data_file + if not os.path.isfile(path): + return "" + if binary == True: + file = open(path, "rb") + else: + file = open(path, "r") + data_file = file.read() + file.close() + return data_file + def version_to_string(version): - version_ID = "" - for id in version: - if len(version_ID) != 0: - if type(id) == str: - version_ID += "-" - else: - version_ID += "." - version_ID += str(id) - return version_ID + version_ID = "" + for id in version: + if len(version_ID) != 0: + if type(id) == str: + version_ID += "-" + else: + version_ID += "." + version_ID += str(id) + return version_ID + def version_string_to_list(version): - debug.verbose("parse version string '" + version +"'") - out = [] - if version == "": - return [0, 0, 0] - elems = version.split("-") - if len(elems[0].split(".")) <= 1: - debug.error("Can not parde a version with wrong version model '" + version +"'") - for elem in elems[0].split("."): - out.append(int(elem)) - if len(elems) >= 2: - out.append(elems[1]) - return out + debug.verbose("parse version string '" + version + "'") + out = [] + if version == "": + return [0, 0, 0] + elems = version.split("-") + if len(elems[0].split(".")) <= 1: + debug.error( + "Can not parde a version with wrong version model '" + version + "'" + ) + for elem in elems[0].split("."): + out.append(int(elem)) + if len(elems) >= 2: + out.append(elems[1]) + return out + ## ## @brief Write data in a specific path. @@ -115,98 +121,106 @@ def version_string_to_list(version): ## @return True Something has been copied ## @return False Nothing has been copied ## -def file_write_data(path, data, only_if_new=False): - if only_if_new == True: - if os.path.exists(path) == True: - old_data = file_read_data(path) - if old_data == data: - return False - #real write of data: - create_directory_of_file(path) - file = open(path, "w") - file.write(data) - file.close() - return True +def file_write_data(path, data: str, only_if_new: bool = False): + if only_if_new is True: + if os.path.exists(path) is True: + old_data = file_read_data(path) + if old_data == data: + return False + # real write of data: + create_directory_of_file(path) + file = open(path, "w") + file.write(data) + file.close() + return True + def list_to_str(list): - if type(list) == type(str()): - return list + " " - else: - result = "" - # mulyiple imput in the list ... - for elem in list: - result += list_to_str(elem) - return result + if type(list) == type(str()): + return list + " " + else: + result = "" + # mulyiple imput in the list ... + for elem in list: + result += list_to_str(elem) + return result + + +def add_prefix(prefix, list): + if type(list) == type(None): + return "" + if type(list) == type(str()): + return prefix + list + else: + if len(list) == 0: + return "" + else: + result = [] + for elem in list: + result.append(prefix + elem) + return result -def add_prefix(prefix,list): - if type(list) == type(None): - return "" - if type(list) == type(str()): - return prefix+list - else: - if len(list)==0: - return '' - else: - result=[] - for elem in list: - result.append(prefix+elem) - return result def store_command(cmd_line, file): - # write cmd line only after to prevent errors ... - if file == "" \ - or file == None: - return; - debug.verbose("create cmd file: " + file) - # Create directory: - create_directory_of_file(file) - # Store the command Line: - file2 = open(file, "w") - file2.write(cmd_line) - file2.flush() - file2.close() + # write cmd line only after to prevent errors ... + if file == "" or file == None: + return + debug.verbose("create cmd file: " + file) + # Create directory: + create_directory_of_file(file) + # Store the command Line: + file2 = open(file, "w") + file2.write(cmd_line) + file2.flush() + file2.close() + def get_type_string(in_type): - if type(in_type) == str: - return "string" - elif type(in_type) == list: - return "list" - elif type(in_type) == dict: - return "dict" - return "unknow" + if type(in_type) == str: + return "string" + elif type(in_type) == list: + return "list" + elif type(in_type) == dict: + return "dict" + return "unknow" + ## List tools: def list_append_and_check(listout, newElement, order): - for element in listout: - if element==newElement: - return - listout.append(newElement) - if order == True: - if type(newElement) is not dict: - listout.sort() + for element in listout: + if element == newElement: + return + listout.append(newElement) + if order == True: + if type(newElement) is not dict: + listout.sort() + def list_append_to(out_list, in_list, order=False): - if type(in_list) == str: - list_append_and_check(out_list, in_list, order) - elif type(in_list) == list: - # mulyiple imput in the list ... - for elem in in_list: - list_append_and_check(out_list, elem, order) - elif type(in_list) == dict: - list_append_and_check(out_list, in_list, order) - else: - debug.warning("can not add in list other than {list/dict/str} : " + str(type(in_list))) + if type(in_list) == str: + list_append_and_check(out_list, in_list, order) + elif type(in_list) == list: + # mulyiple imput in the list ... + for elem in in_list: + list_append_and_check(out_list, elem, order) + elif type(in_list) == dict: + list_append_and_check(out_list, in_list, order) + else: + debug.warning( + "can not add in list other than {list/dict/str} : " + str(type(in_list)) + ) + def list_append_to_2(listout, module, in_list, order=False): - # sepcial cse of bool - if type(in_list) == bool: - listout[module] = in_list - return - # add list in the Map - if module not in listout: - listout[module] = [] - # add elements... - list_append_to(listout[module], in_list, order) + # sepcial cse of bool + if type(in_list) == bool: + listout[module] = in_list + return + # add list in the Map + if module not in listout: + listout[module] = [] + # add elements... + list_append_to(listout[module], in_list, order) ## @@ -216,36 +230,55 @@ def list_append_to_2(listout, module, in_list, order=False): ## @return (list) List of version number ## def get_version_from_file_or_direct(path_module, filename_or_version): - # check case of iser set the version directly - if type(filename_or_version) == list: - return filename_or_version - # this use a version file - file_data = file_read_data(os.path.join(path_module, filename_or_version)) - if len(file_data) == 0: - debug.warning("not enought data in the file version size=0 " + path_module + " / " + filename_or_version) - return [0,0,0] - lines = file_data.split("\n") - if len(lines) != 1: - debug.warning("More thatn one line in the file version ==> bas case use mode: 'XX', XX.YYY', 'XX.Y.ZZZ' or 'XX.Y-dev' : " + path_module + " / " + filename_or_version) - return [0,0,0] - line = lines[0] - debug.debug("Parse line: '" + line + "'") - #check if we have "-dev" - dev_mode = "" - list_tiret = line.split('-') - if len(list_tiret) > 2: - debug.warning("more than one '-' in version file " + str(filename_or_version) + " : '" + str(list_tiret) + "' in '" + path_module + "'") - if len(list_tiret) >= 2: - dev_mode = list_tiret[1] - line = list_tiret[0] - out = [] - list_elem = line.split('.') - for elem in list_elem: - out.append(int(elem)) - if dev_mode != "": - out.append(dev_mode) - debug.debug(" ==> " + str(out)) - return out + # check case of iser set the version directly + if type(filename_or_version) == list: + return filename_or_version + # this use a version file + file_data = file_read_data(os.path.join(path_module, filename_or_version)) + if len(file_data) == 0: + debug.warning( + "not enought data in the file version size=0 " + + path_module + + " / " + + filename_or_version + ) + return [0, 0, 0] + lines = file_data.split("\n") + if len(lines) != 1: + debug.warning( + "More thatn one line in the file version ==> bas case use mode: 'XX', XX.YYY', 'XX.Y.ZZZ' or 'XX.Y-dev' : " + + path_module + + " / " + + filename_or_version + ) + return [0, 0, 0] + line = lines[0] + debug.debug("Parse line: '" + line + "'") + # check if we have "-dev" + dev_mode = "" + list_tiret = line.split("-") + if len(list_tiret) > 2: + debug.warning( + "more than one '-' in version file " + + str(filename_or_version) + + " : '" + + str(list_tiret) + + "' in '" + + path_module + + "'" + ) + if len(list_tiret) >= 2: + dev_mode = list_tiret[1] + line = list_tiret[0] + out = [] + list_elem = line.split(".") + for elem in list_elem: + out.append(int(elem)) + if dev_mode != "": + out.append(dev_mode) + debug.debug(" ==> " + str(out)) + return out + ## ## @brief Get the list of the authors frim an input list or a file @@ -254,120 +287,133 @@ def get_version_from_file_or_direct(path_module, filename_or_version): ## @return (list) List of authors ## def get_maintainer_from_file_or_direct(path_module, filename_or_author): - # check case of iser set the version directly - if type(filename_or_author) == list: - return filename_or_author - # this use a version file - file_data = file_read_data(os.path.join(path_module, filename_or_author)) - if len(file_data) == 0: - debug.warning("not enought data in the file author size=0 " + path_module + " / " + filename_or_author) - return [] - # One user by line and # for comment line - out = [] - for elem in file_data.split('\n'): - if len(elem) == 0: - continue - if elem[0] == "#": - # comment ... - continue - out.append(elem) - return out - + # check case of iser set the version directly + if type(filename_or_author) == list: + return filename_or_author + # this use a version file + file_data = file_read_data(os.path.join(path_module, filename_or_author)) + if len(file_data) == 0: + debug.warning( + "not enought data in the file author size=0 " + + path_module + + " / " + + filename_or_author + ) + return [] + # One user by line and # for comment line + out = [] + for elem in file_data.split("\n"): + if len(elem) == 0: + continue + if elem[0] == "#": + # comment ... + continue + out.append(elem) + return out def remove_element(data, to_remove): - base_data = [] - for elem in data: - if type(elem) == list: - for elem2 in elem: - base_data.append(elem2) - else: - base_data.append(elem) - base_remove = [] - for elem in to_remove: - if type(elem) == list: - for elem2 in elem: - base_remove.append(elem2) - else: - base_remove.append(elem) - out = [] - for elem in base_data: - if elem not in base_remove: - out.append(elem) - return out; + base_data = [] + for elem in data: + if type(elem) == list: + for elem2 in elem: + base_data.append(elem2) + else: + base_data.append(elem) + base_remove = [] + for elem in to_remove: + if type(elem) == list: + for elem2 in elem: + base_remove.append(elem2) + else: + base_remove.append(elem) + out = [] + for elem in base_data: + if elem not in base_remove: + out.append(elem) + return out def get_list_base_display(id, count, elem): - if env.get_display_folder_instead_of_git_name() == False: - return str(id) + "/" + str(count) + " : " + str(elem.name) - return str(id) + "/" + str(count) + " : " + str(elem.path) + if env.get_display_folder_instead_of_git_name() == False: + return str(id) + "/" + str(count) + " : " + str(elem.name) + return str(id) + "/" + str(count) + " : " + str(elem.path) is_first_time_sleep = True + def wait_for_server_if_needed(): - global is_first_time_sleep - if is_first_time_sleep == False: - is_first_time_sleep = True; - return - if env.get_wait_between_sever_command() != 0: - debug.info("Wait for server contrition (" + str(env.get_wait_between_sever_command()) + " s)") - time.sleep(env.get_wait_between_sever_command()) - - + global is_first_time_sleep + if is_first_time_sleep == False: + is_first_time_sleep = True + return + if env.get_wait_between_sever_command() != 0: + debug.info( + "Wait for server contrition (" + + str(env.get_wait_between_sever_command()) + + " s)" + ) + time.sleep(env.get_wait_between_sever_command()) def filter_name_and_file(root, list_files, filter): - # filter elements: - tmp_list = fnmatch.filter(list_files, filter) - out = [] - for elem in tmp_list: - if os.path.isfile(os.path.join(root, elem)) == True: - out.append(elem); - return out; + # filter elements: + tmp_list = fnmatch.filter(list_files, filter) + out = [] + for elem in tmp_list: + if os.path.isfile(os.path.join(root, elem)) == True: + out.append(elem) + return out + def filter_name(list_files, filter): - # filter elements: - return fnmatch.filter(list_files, filter) + # filter elements: + return fnmatch.filter(list_files, filter) + def exclude_list(list_elements, filter): - out = [] - for elem in list_elements: - if elem not in filter: - out.append(elem) - return out + out = [] + for elem in list_elements: + if elem not in filter: + out.append(elem) + return out -def import_path_local(path, limit_sub_folder = 1, exclude_path = [], base_name = "*"): - out = [] - debug.debug("island files: " + str(path) + " [START] " + str(limit_sub_folder)) - if limit_sub_folder == 0: - debug.verbose("Subparsing limitation append ...") - return [] - list_files = get_list_sub_files(path) - # filter elements: - debug.debug("island files: " + str(path) + " : " + str(list_files)) - tmp_list_island_file = filter_name_and_file(path, list_files, base_name) - debug.debug("island files (filtered): " + str(path) + " : " + str(tmp_list_island_file)) - # Import the module: - for filename in tmp_list_island_file: - out.append(os.path.join(path, filename)) - debug.debug(" Find a file : '" + str(out[-1]) + "'") - list_folders_full = get_list_sub_path(path) - list_folders = [] - for elem in list_folders_full: - if elem in exclude_path: - debug.verbose("find '" + str(elem) + "' in exclude_path=" + str(exclude_path)) - continue - list_folders.append(os.path.join(path,elem)) - # check if we need to parse sub_folder - if len(list_folders) != 0: - debug.debug(" Find a folder : " + str(list_folders)) - for folder in list_folders: - tmp_out = import_path_local(folder, - limit_sub_folder - 1, - exclude_path, - base_name) - # add all the elements: - for elem in tmp_out: - out.append(elem) - return out + +def import_path_local(path, limit_sub_folder=1, exclude_path=[], base_name="*"): + out = [] + debug.debug("island files: " + str(path) + " [START] " + str(limit_sub_folder)) + if limit_sub_folder == 0: + debug.verbose("Subparsing limitation append ...") + return [] + list_files = get_list_sub_files(path) + # filter elements: + debug.debug("island files: " + str(path) + " : " + str(list_files)) + tmp_list_island_file = filter_name_and_file(path, list_files, base_name) + debug.debug( + "island files (filtered): " + str(path) + " : " + str(tmp_list_island_file) + ) + # Import the module: + for filename in tmp_list_island_file: + out.append(os.path.join(path, filename)) + debug.debug(" Find a file : '" + str(out[-1]) + "'") + list_folders_full = get_list_sub_path(path) + list_folders = [] + for elem in list_folders_full: + if elem in exclude_path: + debug.verbose( + "find '" + str(elem) + "' in exclude_path=" + str(exclude_path) + ) + continue + list_folders.append(os.path.join(path, elem)) + # check if we need to parse sub_folder + if len(list_folders) != 0: + debug.debug(" Find a folder : " + str(list_folders)) + for folder in list_folders: + tmp_out = import_path_local( + folder, limit_sub_folder - 1, exclude_path, base_name + ) + # add all the elements: + for elem in tmp_out: + out.append(elem) + return out diff --git a/setup.py b/setup.py index b44dd51..b483570 100755 --- a/setup.py +++ b/setup.py @@ -11,57 +11,59 @@ from setuptools import setup import os + def readme(): - with open('README.rst') as f: - return f.read() + with open("README.rst") as f: + return f.read() def read_version_file(): - if not os.path.isfile("version.txt"): - return "" - file = open("version.txt", "r") - data_file = file.read() - file.close() - if len(data_file) > 4 and data_file[-4:] == "-dev": - data_file = data_file[:-4] - return data_file + if not os.path.isfile("version.txt"): + return "" + file = open("version.txt", "r") + data_file = file.read() + file.close() + if len(data_file) > 4 and data_file[-4:] == "-dev": + data_file = data_file[:-4] + return data_file + # https://pypi.python.org/pypi?%3Aaction=list_classifiers -setup(name='island', - version=read_version_file(), - description='island generic source manager (like repo in simple mode)', - long_description=readme(), - url='http://github.com/HeeroYui/island', - author='Edouard DUPIN', - author_email='yui.heero@gmail.com', - license='MPL-2', - packages=['island', - 'island/actions'], - classifiers=[ - 'Development Status :: 2 - Pre-Alpha', - 'License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)', - 'Programming Language :: Python', - 'Topic :: Software Development :: Build Tools' - ], - keywords='source manager repo qisrc lutin', - scripts=['bin/island'], - # Does not work on MacOs - #data_file=[ - # ('/etc/bash_completion.d', ['bash-autocompletion/lutin']), - #], - install_requires=[ - 'lxml', - 'realog', - 'death', - ], - include_package_data = True, - zip_safe=False) +setup( + name="island", + version=read_version_file(), + description="island generic source manager (like repo in simple mode)", + long_description=readme(), + url="http://github.com/HeeroYui/island", + author="Edouard DUPIN", + author_email="yui.heero@gmail.com", + license="MPL-2", + packages=["island", "island/actions"], + classifiers=[ + "Development Status :: 2 - Pre-Alpha", + "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", + "Programming Language :: Python", + "Topic :: Software Development :: Build Tools", + ], + keywords="source manager repo qisrc lutin", + scripts=["bin/island"], + # Does not work on MacOs + # data_file=[ + # ('/etc/bash_completion.d', ['bash-autocompletion/lutin']), + # ], + install_requires=[ + "lxml", + "realog", + "death", + ], + include_package_data=True, + zip_safe=False, +) -#To developp: sudo ./setup.py install +# To developp: sudo ./setup.py install # sudo ./setup.py develop -#TO register all in pip: use external tools: +# TO register all in pip: use external tools: # pip install twine # # create the archive # ./setup.py sdist # twine upload dist/* -