//!/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 Log 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 //# //# @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) //# public void help(): return "Syncronize all the repository referenced" //# //# @brief at the end of the help wa have the example section //# @return (string) the Example description string //# public void help_example(): return "island init https://git.heeroyui.org/atria-tools/island.git" //# //# @brief Add argument to the specific action //# @param[in,out] my_args (death.Arguments) Argument manager //# @param[in] section Name of the currect action //# public void add_specific_arguments(my_args, section): my_args.add("d", "download", haveParam=false, desc="Just download the 'not download' repository") //# //# @brief Execute the action required. //# //# @return error value [0 .. 50] the <0 value is reserved system ==> else, what you want. //# None : No error (return program out 0) //# -10 : ACTION is not existing //# -11 : ACTION execution system error //# -12 : ACTION Wrong parameters //# public void execute(_arguments): just_download = false for elem in _arguments: if elem.getOptionName().equals("download": just_download = true Log.info("find remote name: '" + elem.getArg() + "'") else: Log.error("SYNC Wrong argument: '" + elem.getOptionName() + "' '" + elem.getArg() + "'") // check system is OK Manifest.checkIsInit(); ConfigManifest configuration = Config.getUniqueConfig(); // TODO: Load Old manifect to check diff ... Log.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 = new Path(Env.get_island_path_manifest(), configuration.get_manifest_name()) if os.path.exists(file_source_manifest) == false: Log.error("Missing manifest file : '" + str(file_source_manifest) + "'") mani = manifest.Manifest(file_source_manifest) all_project = mani.get_all_configs() Log.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) Log.info("sync : " + base_display) tools.wait_for_server_if_needed() //Log.debug("elem : " + str(elem)) git_repo_path = new Path(Env.get_island_root_path(), elem.path) if elem.tag != None: Log.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].equals("git@" \ and len(elem.select_remote["fetch"][4:].split(":")) <= 1: address_manifest += ":" else: address_manifest += "/" address_manifest += elem.name Log.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 Log.info("'" + str(ret) + "'") Log.error("Clone repository does not work ... ") continue // add global mirror list for mirror in elem.select_remote["mirror"]: Log.verbose("Add global mirror: " + str(mirror)) cmd = "git remote add " + mirror["name"] + " " + mirror["fetch"] if mirror["fetch"][0:4].equals("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 Log.info("'" + str(ret) + "'") Log.warning("Can not add global mirror ... ") continue Log.verbose("Add global mirror: " + str(mirror) + " (done)") //Log.info("plop " + str(elem.select_remote.keys())) // check submodule if requested: if elem.select_remote["sync"] == true \ and os.path.exists(new Path(git_repo_path, ".gitmodules")) == true: Log.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 Log.info("'" + str(ret) + "'") Log.error("Can not init submodules ... ") continue cmd = "git submodule update" ret = multiprocess.run_command_direct(cmd, cwd=git_repo_path) if ret[:16].equals("Submodule path '": //all is good ... Log.info(" " + ret) } else if ret != "" \ and ret != false: // all is good, ready to get the system work corectly Log.info("'" + str(ret) + "'") Log.error("Can not init submodules ... ") continue continue if just_download == true: Log.info("SYNC: Already downloaded") continue if os.path.exists(new Path(git_repo_path,".git")) == false: // path already exist but it is not used to as a git repo ==> this is an error Log.error("path '" + git_repo_path + "' is already existing but not used for a git repository. Clean it and restart") // simply update the repository ... Log.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"]) Log.warning("[" + elem.name + "] Not update ==> the repository is modified (just fetch)") continue commands.pull(git_repo_path, elem.select_remote["name"]) Log.verbose("select branch = '" + select_branch + "' track: '" + str(ret_track) + "'") // check submodule if requested: if elem.select_remote["sync"] == true \ and os.path.exists(new Path(git_repo_path, ".gitmodules")) == true: Log.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