From c70d59c9180badbfb18b15298d795ce9a870ffd2 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Tue, 29 Jun 2021 22:02:30 +0200 Subject: [PATCH] [DEV] status is OK ==> start integrate init --- ...se.jgit.ssh.jsch-5.12.0.202106070339-r.jar | Bin 0 -> 38496 bytes src/org/atriasoft/island/Commands.java | 112 ++++++++++++-- src/org/atriasoft/island/Config.java | 8 +- src/org/atriasoft/island/Env.java | 4 +- src/org/atriasoft/island/MainIsland.java | 2 + src/org/atriasoft/island/Manifest.java | 49 +++--- src/org/atriasoft/island/Tools.java | 18 +++ .../island/actions/IslandActionCheckout.java | 2 +- .../island/actions/IslandActionInit.java | 146 ++++++++++++++++++ .../island/actions/IslandActionStatus.java | 3 +- src/org/atriasoft/island/actions/Status.java | 12 +- src/org/atriasoft/island/internal/Log.java | 2 +- .../island/model/ActionInterface.java | 6 - .../atriasoft/island/model/RemoteConfig.java | 7 +- tmpsrc/actions/islandAction_init.java | 100 ------------ 15 files changed, 309 insertions(+), 162 deletions(-) create mode 100644 lib/org.eclipse.jgit.ssh.jsch-5.12.0.202106070339-r.jar create mode 100644 src/org/atriasoft/island/actions/IslandActionInit.java delete mode 100644 tmpsrc/actions/islandAction_init.java diff --git a/lib/org.eclipse.jgit.ssh.jsch-5.12.0.202106070339-r.jar b/lib/org.eclipse.jgit.ssh.jsch-5.12.0.202106070339-r.jar new file mode 100644 index 0000000000000000000000000000000000000000..db12644b06948da69604986f201959a6e128b8a0 GIT binary patch literal 38496 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 K8ws-)Nzy0%_d>J) literal 0 HcmV?d00001 diff --git a/src/org/atriasoft/island/Commands.java b/src/org/atriasoft/island/Commands.java index f109f86..59db060 100644 --- a/src/org/atriasoft/island/Commands.java +++ b/src/org/atriasoft/island/Commands.java @@ -2,19 +2,26 @@ package org.atriasoft.island; import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; import java.util.List; +import java.util.Map; import org.atriasoft.island.internal.Log; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.ListBranchCommand.ListMode; +import org.eclipse.jgit.api.Status; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.NoHeadException; +import org.eclipse.jgit.errors.NoWorkTreeException; import org.eclipse.jgit.lib.BranchConfig; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevObject; +import org.eclipse.jgit.revwalk.RevTag; public class Commands { private Commands() {} @@ -98,19 +105,100 @@ public class Commands { public static List get_tags_current(final Git git) { List out = new ArrayList<>(); - out.add("TODO"); - out.add("TODO"); - /* - cmd = "git tag --points-at" - Log.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) - */ + RevCommit latestCommit; + try { + latestCommit = git.log().setMaxCount(1).call().iterator().next(); + } catch (GitAPIException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return out; + } + String latestCommitHash = latestCommit.getName(); + + List list; + try { + list = git.tagList().call(); + } catch (GitAPIException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return out; + } + ObjectId commitId = ObjectId.fromString(latestCommit.getName()); + Collection commits = new LinkedList(); + for (Ref tag : list) { + ObjectId object = tag.getObjectId(); + if (object.equals(commitId)) { + //commits.add(object.getId()); + if (tag.getName().startsWith("refs/tags/")) { + out.add(tag.getName().substring(10)); + } + } + } return out; } + public static void get_diff(Git git) { + try { + Status status = git.status().call(); + if (status.getAdded().size() != 0) { + Log.print(" * Added: (" + status.getAdded().size() + ")"); + for (String elem : status.getAdded()) { + Log.print(" - " + elem); + } + } + if (status.getChanged().size() != 0) { + Log.print(" * Changed: (" + status.getChanged().size() + ")"); + for (String elem : status.getChanged()) { + Log.print(" - " + elem); + } + } + if (status.getConflicting().size() != 0) { + Log.print(" * Conflicting: (" + status.getConflicting().size() + ")"); + for (String elem : status.getConflicting()) { + Log.print(" - " + elem); + } + } + /* + if (status.getIgnoredNotInIndex().size() != 0) { + Log.print(" * Ignored not in index: (" + status.getIgnoredNotInIndex().size() + ")"); + for (String elem : status.getIgnoredNotInIndex()) { + Log.print(" - " + elem); + } + } + */ + if (status.getMissing().size() != 0) { + Log.print(" * Missing: (" + status.getMissing().size() + ")"); + for (String elem : status.getMissing()) { + Log.print(" - " + elem); + } + } + if (status.getModified().size() != 0) { + Log.print(" * Modified: (" + status.getModified().size() + ")"); + for (String elem : status.getModified()) { + Log.print(" - " + elem); + } + } + if (status.getRemoved().size() != 0) { + Log.print(" * Removed: (" + status.getRemoved().size() + ")"); + for (String elem : status.getRemoved()) { + Log.print(" - " + elem); + } + } + if (status.getUntracked().size() != 0) { + Log.print(" * Untracked: (" + status.getUntracked().size() + ")"); + for (String elem : status.getUntracked()) { + Log.print(" - " + elem); + } + } + if (status.getUntrackedFolders().size() != 0) { + Log.print(" * Untracked Folders: (" + status.getUntrackedFolders().size() + ")"); + for (String elem : status.getUntrackedFolders()) { + Log.print(" - " + elem); + } + } + } catch (NoWorkTreeException | GitAPIException e) { + Log.error("can not retrive the satus of the repository ... " + e.getMessage()); + e.printStackTrace(); + } + } } diff --git a/src/org/atriasoft/island/Config.java b/src/org/atriasoft/island/Config.java index 2ca1654..b2a80f9 100644 --- a/src/org/atriasoft/island/Config.java +++ b/src/org/atriasoft/island/Config.java @@ -4,10 +4,16 @@ import org.atriasoft.island.model.ConfigManifest; public class Config { private static ConfigManifest config; - public static ConfigManifest getUniqueConfig() { + public static synchronized ConfigManifest getUniqueConfig() { if (config == null) { config = ConfigManifest.load(); } return config; } + public static synchronized ConfigManifest createUniqueConfig() { + if (config == null) { + config = new ConfigManifest(); + } + return config; + } } diff --git a/src/org/atriasoft/island/Env.java b/src/org/atriasoft/island/Env.java index 13a1946..b2f25ee 100644 --- a/src/org/atriasoft/island/Env.java +++ b/src/org/atriasoft/island/Env.java @@ -104,7 +104,9 @@ public class Env { tmpPath = tmpPath.getParent(); Log.info("test upper path: " + tmpPath); if (tmpPath == null) { - Log.critical("the root path of " + Env.get_system_base_name() + " must not be upper parent paths of (" + Env.island_root_path.toAbsolutePath() + ")"); + Log.info("the root path of " + Env.get_system_base_name() + " must not be upper parent paths of (" + Env.island_root_path.toAbsolutePath() + ")"); + tmpPath = Env.island_root_path.toAbsolutePath(); + break; } } Env.island_root_path = tmpPath; diff --git a/src/org/atriasoft/island/MainIsland.java b/src/org/atriasoft/island/MainIsland.java index a0cead4..95a1b22 100755 --- a/src/org/atriasoft/island/MainIsland.java +++ b/src/org/atriasoft/island/MainIsland.java @@ -10,6 +10,7 @@ import org.atriasoft.death.ArgChoice; import org.atriasoft.death.ArgElement; import org.atriasoft.death.Arguments; import org.atriasoft.island.actions.IslandActionCheckout; +import org.atriasoft.island.actions.IslandActionInit; import org.atriasoft.island.actions.IslandActionStatus; import org.atriasoft.island.internal.Log; import org.atriasoft.island.model.ActionException; @@ -157,6 +158,7 @@ public class MainIsland { // } } public MainIsland() { + Actions.addAction("init", IslandActionInit.class); Actions.addAction("status", IslandActionStatus.class); Actions.addAction("checkout", IslandActionCheckout.class); this.my_args.addSection("option", "Can be set one time in all case"); diff --git a/src/org/atriasoft/island/Manifest.java b/src/org/atriasoft/island/Manifest.java index 0355755..e4a60ea 100644 --- a/src/org/atriasoft/island/Manifest.java +++ b/src/org/atriasoft/island/Manifest.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import org.atriasoft.exml.Exml; import org.atriasoft.exml.exception.ExmlBuilderException; @@ -46,24 +47,10 @@ public class Manifest { private String rootManifest; private final Map manifests = new HashMap<>(); - @Deprecated - private final String deliver_master = "master"; - @Deprecated - private final String deliver_develop = "develop"; - @Deprecated - private final String deliver_mode = "merge"; - @Deprecated - List projects = new ArrayList<>(); - OptionRepository defaultWhat = null; + OptionRepository defaultWhat = null; - OptionRepository defaultBase = new OptionRepository(); - @Deprecated - List remotes = new ArrayList<>(); - @Deprecated - List includes = new ArrayList<>(); - @Deprecated - List links = new ArrayList<>(); + OptionRepository defaultBase = new OptionRepository(); public Manifest(final Path manifestXml) throws IOException { this.manifestXml = manifestXml; @@ -79,7 +66,13 @@ public class Manifest { } public List getLinks() { - return this.links; + List out = new ArrayList<>(); + for (Entry elem : manifests.entrySet()) { + for (Link link : elem.getValue().getLinks()) { + out.add(link); + } + } + return out; } String removeEndSlash(String value) { while (value.length() > 1 @@ -91,7 +84,6 @@ public class Manifest { } public void load() throws ExmlParserErrorMulti, ExmlBuilderException, IOException { - Path rootDirectory = this.manifestXml.toAbsolutePath(); this.rootManifest = rootDirectory.getFileName().toString(); rootDirectory = rootDirectory.getParent(); @@ -351,10 +343,11 @@ public class Manifest { // } public List get_all_configs() { - return get_all_configs(null, new ArrayList<>()); + ManifestFile mani = this.manifests.get(this.rootManifest); + return get_all_configs(mani, null, new ArrayList<>()); } - public List get_all_configs(OptionRepository defaultPlouf, final List upper_remotes) { + public List get_all_configs(ManifestFile mani, OptionRepository defaultPlouf, final List upper_remotes) { List out = new ArrayList<>(); if (defaultPlouf == null) { if (this.defaultWhat != null) { @@ -365,7 +358,7 @@ public class Manifest { } // Log.error(" this.default=" + str(this.default)) // add all local project - for (ProjectConfig elem : this.projects) { + for (ProjectConfig elem : mani.getProjects()) { Log.verbose("parse element " + elem); if (!Env.need_process_with_filter(elem.getName())) { Log.info("Filter repository: " + elem.getName()); @@ -374,7 +367,7 @@ public class Manifest { ProjectConfig conf = new ProjectConfig(elem.getName(), createPathWithElem(elem), elem.getTag()); // add default remote for the project (search in herited element) - for (RemoteConfig remote : this.remotes) { + for (RemoteConfig remote : mani.getRemotes()) { Log.verbose(" Local Remote: " + remote); if (remote.getName().equals(defaultPlouf.getDefaultRemote())) { conf.getRemotes().add(remote); @@ -383,14 +376,13 @@ public class Manifest { if (conf.getRemotes().size() == 0) { for (RemoteConfig remote : upper_remotes) { Log.verbose(" upper Remote: " + remote); - - if (remote.getName().equals(defaultPlouf.getDefaultRemote())) { + if (remote.getName() != null && remote.getName().equals(defaultPlouf.getDefaultRemote())) { conf.getRemotes().add(remote); } } } if (conf.getRemotes().size() == 0) { - Log.error(" No remote detected: " + conf.getRemotes().size() + " for " + conf.getName() + " with default remote name : " + defaultPlouf.getDefaultRemote() + " this remote: " + this.remotes); + Log.error(" No remote detected: " + conf.getRemotes().size() + " for " + conf.getName() + " with default remote name : " + defaultPlouf.getDefaultRemote() + " this remote: " + mani.getRemotes()); } // select default remote: Log.debug(" remotes count: " + conf.getRemotes().size()); @@ -416,12 +408,13 @@ public class Manifest { } // create a temporary variable to transmit the remote to includes List upper_remotes_forward = new ArrayList<>(upper_remotes); - for (RemoteConfig remote : this.remotes) { + for (RemoteConfig remote : mani.getRemotes()) { upper_remotes_forward.add(remote); } // add all include project - for (IncludeConfig elem : this.includes) { - List list_project = elem.getManifest().get_all_configs(defaultPlouf, upper_remotes_forward); + for (String elemInclude : mani.getIncludes()) { + ManifestFile mani2 = this.manifests.get(elemInclude); + List list_project = get_all_configs(mani2, defaultPlouf, upper_remotes_forward); for (ProjectConfig elem_proj : list_project) { out.add(elem_proj); } diff --git a/src/org/atriasoft/island/Tools.java b/src/org/atriasoft/island/Tools.java index d53faf8..f3e430c 100644 --- a/src/org/atriasoft/island/Tools.java +++ b/src/org/atriasoft/island/Tools.java @@ -1,5 +1,10 @@ package org.atriasoft.island; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.atriasoft.island.internal.Log; import org.atriasoft.island.model.ProjectConfig; public class Tools { @@ -11,4 +16,17 @@ public class Tools { } return id + "/" + count + " : " + elem.getPath(); } + + public static void createDirectory(Path basePath) { + Path absPath = basePath.toAbsolutePath(); + if (!Files.exists(absPath)) { + try { + Files.createDirectory(absPath); + } catch (IOException e) { + Log.error("Errro while creating path ... " + e.getMessage()); + Log.error("Path ... " + absPath); + e.printStackTrace(); + } + } + } } diff --git a/src/org/atriasoft/island/actions/IslandActionCheckout.java b/src/org/atriasoft/island/actions/IslandActionCheckout.java index d1a0734..cf3b81b 100644 --- a/src/org/atriasoft/island/actions/IslandActionCheckout.java +++ b/src/org/atriasoft/island/actions/IslandActionCheckout.java @@ -23,7 +23,7 @@ public class IslandActionCheckout extends ActionInterface { } @Override - public void add_specific_arguments(final Arguments myArgs, final String section) { + public void addSpecificArguments(final Arguments myArgs, final String section) { myArgs.add("r", "remote", null, "Name of the remote server", true); myArgs.addArg("branch", false, "Branch to checkout (if '__TAG__' ==> checkout specific repository tags)"); } diff --git a/src/org/atriasoft/island/actions/IslandActionInit.java b/src/org/atriasoft/island/actions/IslandActionInit.java new file mode 100644 index 0000000..b78bd46 --- /dev/null +++ b/src/org/atriasoft/island/actions/IslandActionInit.java @@ -0,0 +1,146 @@ +package org.atriasoft.island.actions; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +import org.atriasoft.death.ArgElement; +import org.atriasoft.death.Arguments; +import org.atriasoft.island.Config; +import org.atriasoft.island.Env; +import org.atriasoft.island.Manifest; +import org.atriasoft.island.Tools; +import org.atriasoft.island.internal.Log; +import org.atriasoft.island.model.ActionException; +import org.atriasoft.island.model.ActionInterface; +import org.atriasoft.island.model.ConfigManifest; +import org.atriasoft.island.model.ProjectConfig; + +import org.eclipse.jgit.api.Git; + +public class IslandActionInit extends ActionInterface { + + @Override + public String help() { + return "Init a island repository (need 'fetch' after)"; + } + + @Override + public void addSpecificArguments(final Arguments myArgs, final String section) { + myArgs.add("b", "branch", null, "Select branch to display", true); + myArgs.add("m", "manifest", null, "Name of the manifest", true); + } + + @Override + public void execute(final List _arguments) throws ActionException, Exception { + if (_arguments.size() == 0) { + Log.error("Missing argument to execute the current action ..."); + return; + } + + String branch = "master"; + String manifest_name = "default.xml"; + String address_manifest = ""; + for (ArgElement elem : _arguments) { + if (elem.getOptionName().equals("branch")) { + branch = elem.getArg(); + Log.info("Get branch name : " + branch); + } else if (elem.getOptionName().equals("manifest")) { + manifest_name = elem.getArg(); + Log.info("Get manifest name : " + manifest_name); + } else if (elem.getOptionName().equals("")) { + if (!address_manifest.isEmpty()) { + Log.critical("Manifest adress already set : '" + address_manifest + "' !!! '" + elem.getArg() + "'"); + } + address_manifest = elem.getArg(); + Log.info("Get manifest address : " + address_manifest); + } else { + Log.critical("Wrong argument: '" + elem.getOptionName() + "' '" + elem.getArg() + "'"); + } + } + + if (address_manifest.isEmpty()) { + Log.critical("Init: Missing manifest name"); + } + Log.info("Init with: '" + address_manifest + "' branch='" + branch + "' name of manifest='" + manifest_name + "'"); + + if (Manifest.isInit()) { + Log.critical("System already init: path already exist: '" + Env.get_island_path() + "'"); + } + Tools.createDirectory(Env.get_island_path()); + + + // create the file configuration: + + ConfigManifest configuration = Config.createUniqueConfig(); + configuration.setRepo(address_manifest); + configuration.setBranch(branch); + configuration.setManifestName(manifest_name); + configuration.store(); + + Tools.createDirectory(Env.get_island_path_manifest()); + Log.info("Clone the manifest"); + Git git = Git.cloneRepository() + .setURI( address_manifest ) + .setDirectory( Env.get_island_path_manifest().toFile() ) + .setBranch(branch) + .call(); + return; + /* + if ret_values == false: + Log.info("'" + str(ret_values) + "'") + Log.error("Init does not work") + return false + + Log.info("Init done correctly ...") + + return None + + + + + Path file_source_manifest = Env.get_island_path_manifest().resolve(configuration.getManifestName()); + if (!Files.exists(file_source_manifest)) { + Log.critical("Missing manifest file : '" + file_source_manifest + "'"); + } + Manifest mani = new Manifest(file_source_manifest); + Git git = Git.open(Env.get_island_path_manifest().toFile()); + boolean is_modify_manifest = git.status().call().hasUncommittedChanges(); + if (is_modify_manifest) { + Log.info("!!!!!!!!!!!! MANIFEST is modify !!!!!!!!"); + } + + List all_project = mani.get_all_configs(); + Log.info("status of: " + all_project.size() + " projects"); + int id_element = 0; + + boolean is_behind = false; + for (ProjectConfig elem : all_project) { + id_element++; + String base_display = Tools.get_list_base_display(id_element, all_project.size(), elem); + int ret = Status.displayStatus(elem, argument_remote_name, argument_display_tag, id_element, base_display); + if (ret != 0) { + is_behind = true; + } + } + if (is_behind == true) { + //return Env.ret_action_need_updtate; + } + + + */ + + + + + + } + + @Override + public String helpExample() { + // TODO Auto-generated method stub + return null; + } + + +} diff --git a/src/org/atriasoft/island/actions/IslandActionStatus.java b/src/org/atriasoft/island/actions/IslandActionStatus.java index 58fb8e5..50a7979 100644 --- a/src/org/atriasoft/island/actions/IslandActionStatus.java +++ b/src/org/atriasoft/island/actions/IslandActionStatus.java @@ -26,7 +26,7 @@ public class IslandActionStatus extends ActionInterface { } @Override - public void add_specific_arguments(final Arguments myArgs, final String section) { + public void addSpecificArguments(final Arguments myArgs, final String section) { myArgs.add("r", "remote", null, "Name of the remote server", true); myArgs.add("t", "tags", null, "Display if the commit is on a tag (and display it)", false); } @@ -88,5 +88,6 @@ public class IslandActionStatus extends ActionInterface { // TODO Auto-generated method stub return null; } + } diff --git a/src/org/atriasoft/island/actions/Status.java b/src/org/atriasoft/island/actions/Status.java index b9d60e2..ba35e0f 100644 --- a/src/org/atriasoft/island/actions/Status.java +++ b/src/org/atriasoft/island/actions/Status.java @@ -195,17 +195,9 @@ public class Status { tags_comment = "\r\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t- - - - -"; } } - Log.info(base_display + volatileString + "\r\t\t\t\t\t\t\t" + modify_status + "(" + select_branch + " -> " + tracking_remote_branch + ")" + behind_forward_comment + tags_comment); + Log.print(base_display + volatileString + "\r\t\t\t\t\t\t\t" + modify_status + "(" + select_branch + " -> " + tracking_remote_branch + ")" + behind_forward_comment + tags_comment); if (is_modify) { - - /* - cmd = "git status --short" - Log.verbose("execute : " + cmd) - ret_diff = multiprocess.run_command(cmd, cwd=git_repo_path) - tmp_color_red = "\033[31m" - tmp_color_default= "\033[00m" - Log.info(tmp_color_red + ret_diff[1] + tmp_color_default) - */ + Commands.get_diff(git); } return in_behind; } diff --git a/src/org/atriasoft/island/internal/Log.java b/src/org/atriasoft/island/internal/Log.java index 1917e8c..1c21f2d 100644 --- a/src/org/atriasoft/island/internal/Log.java +++ b/src/org/atriasoft/island/internal/Log.java @@ -4,7 +4,7 @@ import io.scenarium.logger.LogLevel; import io.scenarium.logger.Logger; public class Log { - private static final boolean FORCE = true; + private static final boolean FORCE = false; private static final String LIB_NAME = "island"; private static final String LIB_NAME_DRAW = Logger.getDrawableName(Log.LIB_NAME); private static final boolean PRINT_CRITICAL = Logger.getNeedPrint(Log.LIB_NAME, LogLevel.CRITICAL); diff --git a/src/org/atriasoft/island/model/ActionInterface.java b/src/org/atriasoft/island/model/ActionInterface.java index b6373d8..cc85736 100644 --- a/src/org/atriasoft/island/model/ActionInterface.java +++ b/src/org/atriasoft/island/model/ActionInterface.java @@ -29,12 +29,6 @@ public abstract class ActionInterface { return false; } - /** - * Add argument to the specific action - * @param myArgs (death.Arguments) Argument manager - * @param section Name of the current action - */ - public abstract void add_specific_arguments(Arguments myArgs, String section); /** * Execute the action required. diff --git a/src/org/atriasoft/island/model/RemoteConfig.java b/src/org/atriasoft/island/model/RemoteConfig.java index 79b629c..be570ad 100644 --- a/src/org/atriasoft/island/model/RemoteConfig.java +++ b/src/org/atriasoft/island/model/RemoteConfig.java @@ -9,12 +9,17 @@ public class RemoteConfig { private String name; private String fetch; List mirror; - + public RemoteConfig(final String name, final String fetch, final List mirror) { this.name = name; this.fetch = fetch; this.mirror = mirror; } + public RemoteConfig() { + this.name = ""; + this.fetch = ""; + this.mirror = new ArrayList<>(); + } @XmlAttribute public String getName() { diff --git a/tmpsrc/actions/islandAction_init.java b/tmpsrc/actions/islandAction_init.java deleted file mode 100644 index b0ef634..0000000 --- a/tmpsrc/actions/islandAction_init.java +++ /dev/null @@ -1,100 +0,0 @@ -//!/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 commands -from island import multiprocess -from island import manifest -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 "Init a island repository (need 'fetch' after)" - -//# -//# @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("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. -//# -//# @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): - if len(_arguments) == 0: - Log.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.getOptionName().equals("branch": - Log.info("find branch name: '" + elem.getArg() + "'") - branch = elem.getArg() - } else if elem.getOptionName().equals("manifest": - Log.info("find mmanifest name: '" + elem.getArg() + "'") - manifest_name = elem.getArg() - } else if elem.getOptionName().equals("": - if address_manifest != "": - Log.error("Manifest adress already set : '" + address_manifest + "' !!! '" + elem.getArg() + "'") - address_manifest = elem.getArg() - else: - Log.error("Wrong argument: '" + elem.getOptionName() + "' '" + elem.getArg() + "'") - - if address_manifest.equals("": - Log.error("Init: Missing manifest name") - - Log.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: - Log.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() - - Log.info("Clone the manifest") - ret_values = commands.clone(Env.get_island_path_manifest(), address_manifest, branch_name=branch) - - if ret_values == false: - Log.info("'" + str(ret_values) + "'") - Log.error("Init does not work") - return false - - Log.info("Init done correctly ...") - - return None - - -