diff --git a/.checkstyle b/.checkstyle new file mode 100644 index 0000000..428926e --- /dev/null +++ b/.checkstyle @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..314c64e --- /dev/null +++ b/.classpath @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d1d26cd --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# Compiled python modules. +*.pyc + +# Setuptools distribution folder. +/dist/ +/build/ + +# Python egg metadata, regenerated from source files by setuptools. +/*.egg-info \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..98ab1b7 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,34 @@ +# This file is a template, and might need editing before it works on your project. +# use the official gcc image, based on debian +# can use verions as well, like gcc:5.2 +# see https://hub.docker.com/_/gcc/ +image: gcc + +before_script: + - pwd + - git clone --depth 1 --branch master https://gitlab.com/atria-soft/ci.git + - ls -l * + - ls -l .. + - apt-get update -qy + - apt-get install -y python-dev python-pip + #- pip install setuptools + - ./setup.py install + #- export PYTHONPATH=$PYTHONPATH:./lutin/build/lib.linux-x86_64-2.7/:./lutin/build/lib.linux-x86_64-2.7/lutin/:./lutin/build/lib:./lutin/build/lib/lutin/ +# - ./ci/build_send.py --tag=$TAG --status=START; + + +build: + stage: build + # instead of calling g++ directly you can also use some build toolkit like make + # install the necessary build tools when needed + # before_script: + # - apt update && apt -y install make autoconf + script: + - export TARGET=-tLinux + - export CONF=-mdebug + - export BUILDER=-cgcc + - lutin -w -j4 -C -P $TARGET $BUILDER $COMPILATOR_OPTION $BUS $CONF $GCOV $DISABLE_PACKAGE test-c; STATUS=$? +# - ./ci/build_send.py --tag=$TAG --status="$STATUS"; +# artifacts: +# paths: +# - mybinary diff --git a/.project b/.project new file mode 100644 index 0000000..abcfd76 --- /dev/null +++ b/.project @@ -0,0 +1,24 @@ + + + atriasoft-island + + + atriasoft-island + + + + org.eclipse.jdt.core.javabuilder + + + + + net.sf.eclipsecs.core.CheckstyleBuilder + + + + + + org.eclipse.jdt.core.javanature + net.sf.eclipsecs.core.CheckstyleNature + + diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..8480634 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,74 @@ +language: cpp + +#sudo: false +sudo: required +dist: trusty + +branches: + only: + - master + - dev + +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - g++-4.9 + - expect + - binutils-mingw-w64-i686 # 32bit MinGW + - gcc-mingw-w64-i686 + - g++-mingw-w64-i686 + - binutils-mingw-w64-x86-64 # 64bit MinGW + - gcc-mingw-w64-x86-64 + - g++-mingw-w64-x86-64 + +matrix: + include: + - os: linux + env: CONF=release BUILDER=gcc TARGET=Linux TAG=Linux COMPILATOR_OPTION="--compilator-version=4.9" + compiler: gcc + - os: linux + env: CONF=debug BUILDER=clang TARGET=Linux + compiler: clang + - os: linux + env: CONF=release BUILDER=gcc TARGET=Windows TAG=Mingw + compiler: x86_64-w64-mingw32-gcc + - os: linux + env: CONF=release BUILDER=gcc TARGET=Android TAG=Android DISABLE_PACKAGE=-p + compiler: gcc + - os: osx + env: CONF=release BUILDER=clang TARGET=MacOs TAG=MacOs + compiler: clang + - os: osx + env: CONF=release BUILDER=clang TARGET=IOs TAG=IOs + compiler: clang + +install: + - ./setup.py build + - export PYTHONPATH=$PYTHONPATH:./lutin/build/lib.linux-x86_64-2.7/:./lutin/build/lib.linux-x86_64-2.7/lutin/:./lutin/build/lib:./lutin/build/lib/lutin/ + - cd .. + # download NDK + - if [ "$TAG" == "Android" ]; then + git clone --depth 1 --branch master https://github.com/HeeroYui/android-download-tool; + ./android-download-tool/dl-android.sh; + fi + - git clone --depth 1 --branch master https://github.com/atria-soft/ci.git + - cd - + +before_script: + - cd .. + - pwd + - ls -l + - if [ "$TRAVIS_OS_NAME" == "osx" ]; then + export PATH=$PATH:/Users/travis/Library/Python/2.7/bin/; + fi + - ./ci/build_send.py --tag=$TAG --status=START; + +script: + - ./lutin/build/scripts-2.7/lutin -w -j4 -C -P -t $TARGET -c $BUILDER $COMPILATOR_OPTION $BUS -m $CONF $GCOV $DISABLE_PACKAGE test-c; STATUS=$? + - ./ci/build_send.py --tag=$TAG --status="$STATUS"; + +notifications: + email: + - yui.heero@gmail.com diff --git a/CheckStyle.xml b/CheckStyle.xml new file mode 100755 index 0000000..d68aedd --- /dev/null +++ b/CheckStyle.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CleanUp.xml b/CleanUp.xml new file mode 100644 index 0000000..6cf4cba --- /dev/null +++ b/CleanUp.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Formatter.xml b/Formatter.xml new file mode 100644 index 0000000..14a5d6c --- /dev/null +++ b/Formatter.xml @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fa0086a --- /dev/null +++ b/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. \ No newline at end of file diff --git a/src/module-info.java b/src/module-info.java new file mode 100644 index 0000000..40d80a6 --- /dev/null +++ b/src/module-info.java @@ -0,0 +1,12 @@ +/** Basic module interface. + * + * @author Edouard DUPIN */ + +open module org.atriasoft.island { + exports org.atriasoft.island; + //exports org.atriasoft.island.model; + //exports org.atriasoft.island.actions; + + requires transitive io.scenarium.logger; + requires java.base; +} diff --git a/src/org/atriasoft/island/Env.java b/src/org/atriasoft/island/Env.java new file mode 100644 index 0000000..e190433 --- /dev/null +++ b/src/org/atriasoft/island/Env.java @@ -0,0 +1,151 @@ +package org.atriasoft.island; +//!/usr/bin/python +// -*- coding: utf-8 -*- +//# +//# @author Edouard DUPIN +//# +//# @copyright 2012, Edouard DUPIN, all right reserved +//# +//# @license MPL v2.0 (see license file) +//# + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +// Local import +import org.atriasoft.island.internal.Log; + +public class Env { + +public static final int ret_manifest_is_not_existing = -5; +public static final int ret_action_is_not_existing = -10; +public static final int ret_action_executing_system_error = -11; +public static final int ret_action_wrong_parameters = -12; +public static final int ret_action_partial_done = -13; +public static final int ret_action_fail = -14; + +public static int ret_action_need_updtate = 15; + +public static String system_base_name = "island"; + +public static void set_system_base_name(String val) { + system_base_name = val; + } +public static String get_system_base_name() { + return system_base_name; + } + +public static String get_system_config_name() { + return "." + system_base_name + "Config.json"; +} + +private static boolean fetch_manifest = true; + +public static void set_fetch_manifest(boolean val) { + fetch_manifest = val; + } +public static boolean get_fetch_manifest() { + return fetch_manifest; +} + +private static int wait_between_sever_command = 0; + +public static void set_wait_between_sever_command(int val) { + wait_between_sever_command = val; +} + +public static int get_wait_between_sever_command() { + return wait_between_sever_command; +} +public static String filter_command = ""; + +public static void set_filter_command(String val) { + filter_command = val; + } +public static String get_filter_command() { + return filter_command; + } +public static boolean need_process_with_filter(String data) { + if (filter_command.equals("")) { + return true; + } +if (data.length() < filter_command.length()) { + return false; +} + if (data.substring(0,filter_command.length()).equals(filter_command)) { + return true; + } + return false; +} + +private static boolean display_folder_instead_of_git_name = true; + +public static void set_display_folder_instead_of_git_name(boolean val) { + display_folder_instead_of_git_name = val; + } +public static boolean get_display_folder_instead_of_git_name() { + return display_folder_instead_of_git_name; +} + +private static Path island_root_path = null; +private static Path island_path_user_config = null; +private static Path island_path = null; +private static Path island_path_config_old = null; +private static Path island_path_config = null; +private static Path island_path_manifest = null; + + + static { + //String tmp = island_root_path.toAbsolutePath().toString(); + //Log.info("Current absolute path is: " + tmp); + island_root_path = Paths.get(""); + Path tmpPath = island_root_path; + while (!Files.isDirectory(tmpPath.resolve("." + get_system_base_name()))) { + tmpPath = tmpPath.getParent(); + if (tmpPath == null) { + Log.critical("the root path of " + get_system_base_name() + " must not be upper parent paths of (" + island_root_path.toAbsolutePath() + ")"); + } + } + island_root_path = tmpPath; + island_path_user_config = island_root_path.resolve(get_system_config_name()); + island_path = island_root_path.resolve("." + get_system_base_name()); + island_path_config_old = island_path.resolve("config.txt"); + island_path_config = island_path.resolve("config.json"); + island_path_manifest = island_path.resolve("manifest"); + } +//# +//# @brief to use later to know where the ".island" parent path is ... +//# @return the parent path of the ".island" +//# +public static Path get_island_root_path() { + return island_root_path; +} +public static Path get_island_path() { + return island_path; +} +public static Path get_island_path_config() { + return island_path_config; +} +public static Path get_island_path_config_old() { + return island_path_config_old; +} +public static Path get_island_path_manifest() { + return island_path_manifest; +} +public static Path get_island_path_user_config() { + return island_path_user_config; +} + +public static void main(String[] args) { + Log.error("island_root_path = " + island_root_path.toAbsolutePath()); + Log.error("island_path_user_config = " + island_path_user_config.toAbsolutePath()); + Log.error("island_path = " + island_path.toAbsolutePath()); + Log.error("island_path_config_old = " + island_path_config_old.toAbsolutePath()); + Log.error("island_path_config = " + island_path_config.toAbsolutePath()); + Log.error("island_path_manifest = " + island_path_manifest.toAbsolutePath()); + +} + + +} \ No newline at end of file diff --git a/src/org/atriasoft/island/MainIsland.java b/src/org/atriasoft/island/MainIsland.java new file mode 100755 index 0000000..01f8a39 --- /dev/null +++ b/src/org/atriasoft/island/MainIsland.java @@ -0,0 +1,185 @@ +package org.atriasoft.island; + + +public class MainIsland { + +//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("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.set_stop_at(actions.get_list_of_action()) +local_argument = my_args.parse() + +// +// @brief Display the help of this makefile. +// +public void 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)) + """ + 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(" " + color['green'] + "status" + color['default']) + print(" Dump the status of the environement") + """ + print(" ex: " + sys.argv[0] + " -c init http://github.com/atria-soft/manifest.git") + print(" ex: " + sys.argv[0] + " sync") + exit(0) + +public void 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 +public void 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 + +// 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) + + + +// parse default unique argument: +for argument in local_argument: + 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) + +// 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() + + +// TODO : move tin in actions ... +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() + +// 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) + + +ret = actions.execute(action_to_do, my_args.get_last_parsed()+1) + +exit (ret) +// stop all started threads; +//multiprocess.un_init() + + diff --git a/src/org/atriasoft/island/internal/Log.java b/src/org/atriasoft/island/internal/Log.java new file mode 100644 index 0000000..03455d7 --- /dev/null +++ b/src/org/atriasoft/island/internal/Log.java @@ -0,0 +1,75 @@ +package org.atriasoft.island.internal; + +import io.scenarium.logger.LogLevel; +import io.scenarium.logger.Logger; + +public class Log { + private static final String LIB_NAME = "island"; + private static final String LIB_NAME_DRAW = Logger.getDrawableName(LIB_NAME); + private static final boolean PRINT_CRITICAL = Logger.getNeedPrint(LIB_NAME, LogLevel.CRITICAL); + private static final boolean PRINT_ERROR = Logger.getNeedPrint(LIB_NAME, LogLevel.ERROR); + private static final boolean PRINT_WARNING = Logger.getNeedPrint(LIB_NAME, LogLevel.WARNING); + private static final boolean PRINT_INFO = Logger.getNeedPrint(LIB_NAME, LogLevel.INFO); + private static final boolean PRINT_DEBUG = Logger.getNeedPrint(LIB_NAME, LogLevel.DEBUG); + private static final boolean PRINT_VERBOSE = Logger.getNeedPrint(LIB_NAME, LogLevel.VERBOSE); + private static final boolean PRINT_TODO = Logger.getNeedPrint(LIB_NAME, LogLevel.TODO); + private static final boolean PRINT_PRINT = Logger.getNeedPrint(LIB_NAME, LogLevel.PRINT); + + public static void critical(final String data) { + if (PRINT_CRITICAL) { + Logger.critical(LIB_NAME_DRAW, data); + } + } + + public static void critical(final String data, final Exception e) { + e.printStackTrace(); + if (PRINT_CRITICAL) { + Logger.critical(LIB_NAME_DRAW, data + " : " + e.getMessage()); + } + } + + public static void debug(final String data) { + if (PRINT_DEBUG) { + Logger.debug(LIB_NAME_DRAW, data); + } + } + + public static void error(final String data) { + if (PRINT_ERROR) { + Logger.error(LIB_NAME_DRAW, data); + } + } + + public static void info(final String data) { + if (PRINT_INFO) { + Logger.info(LIB_NAME_DRAW, data); + } + } + + public static void print(final String data) { + if (PRINT_PRINT) { + Logger.print(LIB_NAME_DRAW, data); + } + } + + public static void todo(final String data) { + if (PRINT_TODO) { + Logger.todo(LIB_NAME_DRAW, data); + } + } + + public static void verbose(final String data) { + if (PRINT_VERBOSE) { + Logger.verbose(LIB_NAME_DRAW, data); + } + } + + public static void warning(final String data) { + if (PRINT_WARNING) { + Logger.warning(LIB_NAME_DRAW, data); + } + } + + private Log() {} + +} diff --git a/tmpsrc/actions.java b/tmpsrc/actions.java new file mode 100644 index 0000000..34e4fa4 --- /dev/null +++ b/tmpsrc/actions.java @@ -0,0 +1,140 @@ +//!/usr/bin/python +// -*- coding: utf-8 -*- +//# +//# @author Edouard DUPIN +//# +//# @copyright 2012, Edouard DUPIN, all right reserved +//# +//# @license MPL v2.0 (see license file) +//# + +// 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_" + +public void 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, + }) + +//# +//# @brief Get the wall list of action availlable +//# @return ([string]) the list of action name +//# +public void get_list_of_action(): + global list_actions; + out = [] + for elem in list_actions: + out.append(elem["name"]) + return out + +//# +//# @brief Get a description of an action +//# @param[in] action_name (string) Name of the action +//# @param[in] function_name (string) Name of the fucntion to call +//# @param[in] default_value (*) Renurned value of the call if function does not exist +//# @return (*) the getted value or the default_value +//# +public void 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 +//# @param[in] action_name (string) Name of the action +//# @return The first line of description +//# +public void get_action_help(action_name): + value = get_function_value(action_name, "help", "---") + return value.split("\n")[0] + + +public void 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) + +public void 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 diff --git a/tmpsrc/actions/islandAction_checkout.java b/tmpsrc/actions/islandAction_checkout.java new file mode 100644 index 0000000..1935696 --- /dev/null +++ b/tmpsrc/actions/islandAction_checkout.java @@ -0,0 +1,88 @@ +//!/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 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 + + +//# +//# @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 "Ckeckout a specific branch in all repository" + +//# +//# @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("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. +//# +//# @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): + 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 = new Path(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/tmpsrc/actions/islandAction_command.java b/tmpsrc/actions/islandAction_command.java new file mode 100644 index 0000000..136a841 --- /dev/null +++ b/tmpsrc/actions/islandAction_command.java @@ -0,0 +1,83 @@ +//!/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 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 + + +//# +//# @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 "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 +//# +public void have_unknow_argument(): + return true + +//# +//# @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): + 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 = new Path(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 = new Path(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 diff --git a/tmpsrc/actions/islandAction_commit.java b/tmpsrc/actions/islandAction_commit.java new file mode 100644 index 0000000..f457873 --- /dev/null +++ b/tmpsrc/actions/islandAction_commit.java @@ -0,0 +1,95 @@ +//!/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 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 + + +//# +//# @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 "Commit in all repository" + +//# +//# @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("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. +//# +//# @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): + 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 = new Path(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 = new Path(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(new Path(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/tmpsrc/actions/islandAction_deliver-push.java b/tmpsrc/actions/islandAction_deliver-push.java new file mode 100644 index 0000000..00f894a --- /dev/null +++ b/tmpsrc/actions/islandAction_deliver-push.java @@ -0,0 +1,80 @@ +//!/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 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 + +//# +//# @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 "Push a delover (develop & master & tag) on the remotre server" + +//# +//# @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("r", "remote", haveParam=true, desc="Name of the remote server") + +//# +//# @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): + 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 = new Path(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/tmpsrc/actions/islandAction_deliver.java b/tmpsrc/actions/islandAction_deliver.java new file mode 100644 index 0000000..3df194a --- /dev/null +++ b/tmpsrc/actions/islandAction_deliver.java @@ -0,0 +1,138 @@ +//!/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 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 + + +//# +//# @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 "Deliver the current repository (develop & master MUST be up to date and you MUST be on master)" + +//# +//# @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("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. +//# +//# @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): + 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 = new Path(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 = new Path(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 = new Path(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 diff --git a/tmpsrc/actions/islandAction_fetch.java b/tmpsrc/actions/islandAction_fetch.java new file mode 100644 index 0000000..e2ad92d --- /dev/null +++ b/tmpsrc/actions/islandAction_fetch.java @@ -0,0 +1,92 @@ +//!/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 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 + + +//# +//# @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 "Fecth all the repository (get all modification on the server)" + +//# +//# @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("r", "remote", haveParam=true, desc="Name of the remote server") + +//# +//# @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): + 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 = new Path(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 = new Path(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(new Path(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/tmpsrc/actions/islandAction_init.java b/tmpsrc/actions/islandAction_init.java new file mode 100644 index 0000000..8ecb9ae --- /dev/null +++ b/tmpsrc/actions/islandAction_init.java @@ -0,0 +1,100 @@ +//!/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 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: + 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/tmpsrc/actions/islandAction_manifest-checkout.java b/tmpsrc/actions/islandAction_manifest-checkout.java new file mode 100644 index 0000000..036f91a --- /dev/null +++ b/tmpsrc/actions/islandAction_manifest-checkout.java @@ -0,0 +1,72 @@ +//!/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 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 + + +//# +//# @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 "Manifest Ckeckout a specific branch of repository" + +//# +//# @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("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. +//# +//# @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): + 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/tmpsrc/actions/islandAction_manifest-deliver-push.java b/tmpsrc/actions/islandAction_manifest-deliver-push.java new file mode 100644 index 0000000..496b21f --- /dev/null +++ b/tmpsrc/actions/islandAction_manifest-deliver-push.java @@ -0,0 +1,72 @@ +//!/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 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 + + +//# +//# @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 "Push the manifest delivery" + +//# +//# @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): + pass + +//# +//# @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): + 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 = new Path(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/tmpsrc/actions/islandAction_manifest-deliver.java b/tmpsrc/actions/islandAction_manifest-deliver.java new file mode 100644 index 0000000..96b0f06 --- /dev/null +++ b/tmpsrc/actions/islandAction_manifest-deliver.java @@ -0,0 +1,180 @@ +//!/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 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 + + +//# +//# @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 "Deliver the manifest (merge develop vertion and create a branch with the specific current tags)" + +//# +//# @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): + pass + + +// must be on the branch we choice to merge ... + +//# +//# @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): + 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 = new Path(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 = new Path(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 = new Path(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") + + + +public void 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 = new Path(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 diff --git a/tmpsrc/actions/islandAction_manifest-status.java b/tmpsrc/actions/islandAction_manifest-status.java new file mode 100644 index 0000000..1cabec4 --- /dev/null +++ b/tmpsrc/actions/islandAction_manifest-status.java @@ -0,0 +1,63 @@ +//!/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 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 + + +//# +//# @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 "Display status spécifically of the manifest" + +//# +//# @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("t", "tags", haveParam=false, desc="Display if the commit is on a tag (and display it)") + +//# +//# @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): + 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 diff --git a/tmpsrc/actions/islandAction_manifest-sync.java b/tmpsrc/actions/islandAction_manifest-sync.java new file mode 100644 index 0000000..0f66dbe --- /dev/null +++ b/tmpsrc/actions/islandAction_manifest-sync.java @@ -0,0 +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) +//# + +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 + + +//# +//# @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 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): + pass + +//# +//# @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): + 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 diff --git a/tmpsrc/actions/islandAction_push.java b/tmpsrc/actions/islandAction_push.java new file mode 100644 index 0000000..e285633 --- /dev/null +++ b/tmpsrc/actions/islandAction_push.java @@ -0,0 +1,114 @@ +//!/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 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 + + +//# +//# @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 "Push all repository to the upper server" + +//# +//# @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("r", "remote", haveParam=true, desc="Name of the remote server") + +//# +//# @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): + 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 = new Path(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 = new Path(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(new Path(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/tmpsrc/actions/islandAction_status.java b/tmpsrc/actions/islandAction_status.java new file mode 100644 index 0000000..c415265 --- /dev/null +++ b/tmpsrc/actions/islandAction_status.java @@ -0,0 +1,92 @@ +//!/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 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 + + +//# +//# @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 "Get the status of all the repositories" + +//# +//# @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("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. +//# +//# @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): + 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 = new Path(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/tmpsrc/actions/islandAction_sync-local.java b/tmpsrc/actions/islandAction_sync-local.java new file mode 100644 index 0000000..20230e4 --- /dev/null +++ b/tmpsrc/actions/islandAction_sync-local.java @@ -0,0 +1,160 @@ +//!/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 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 "Update all the branche to the trackin branch in local (no remote access)" + +//# +//# @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("r", "reset", haveParam=false, desc="Rebase the repository instead of 'reset --hard'") + +//# +//# @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) +//# -5 : env.ret_manifest_is_not_existing : Manifest does not exit +//# -10 : env.ret_action_is_not_existing : ACTION is not existing +//# -11 : env.ret_action_executing_system_error : ACTION execution system error +//# -12 : env.ret_action_wrong_parameters : ACTION Wrong parameters +//# -13 : env.ret_action_partial_done : ACTION partially done +//# +public void 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 = new Path(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 = new Path(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(new Path(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/tmpsrc/actions/islandAction_sync.java b/tmpsrc/actions/islandAction_sync.java new file mode 100644 index 0000000..8911230 --- /dev/null +++ b/tmpsrc/actions/islandAction_sync.java @@ -0,0 +1,190 @@ +//!/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 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.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 = new Path(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 = new Path(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(new Path(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(new Path(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(new Path(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 diff --git a/tmpsrc/actions/islandAction_volatile-add.java b/tmpsrc/actions/islandAction_volatile-add.java new file mode 100644 index 0000000..b5fd7c0 --- /dev/null +++ b/tmpsrc/actions/islandAction_volatile-add.java @@ -0,0 +1,86 @@ +//!/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 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 "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 +//# @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_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 +//# +public void help_example(): + return "island volatile-add https://git.heeroyui.org/atria-tools/island.git git" + +//# +//# @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) +//# -5 : env.ret_manifest_is_not_existing : Manifest does not exit +//# -10 : env.ret_action_is_not_existing : ACTION is not existing +//# -11 : env.ret_action_executing_system_error : ACTION execution system error +//# -12 : env.ret_action_wrong_parameters : ACTION Wrong parameters +//# -13 : env.ret_action_partial_done : ACTION partially done +//# +public void 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 + + diff --git a/tmpsrc/actions/islandAction_volatile-list.java b/tmpsrc/actions/islandAction_volatile-list.java new file mode 100644 index 0000000..ec6b356 --- /dev/null +++ b/tmpsrc/actions/islandAction_volatile-list.java @@ -0,0 +1,53 @@ +//!/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 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 "List all the volatil 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) +//# -5 : env.ret_manifest_is_not_existing : Manifest does not exit +//# -10 : env.ret_action_is_not_existing : ACTION is not existing +//# -11 : env.ret_action_executing_system_error : ACTION execution system error +//# -12 : env.ret_action_wrong_parameters : ACTION Wrong parameters +//# -13 : env.ret_action_partial_done : ACTION partially done +//# +public void 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 + + diff --git a/tmpsrc/actions/status.java b/tmpsrc/actions/status.java new file mode 100644 index 0000000..f14d3be --- /dev/null +++ b/tmpsrc/actions/status.java @@ -0,0 +1,439 @@ +//!/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 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 + + +default_behind_message = "[DEV] update dev tag version" +default_update_message = "[VERSION] update dev tag version" + + +base_name_of_a_tagged_branch = "branch_on_tag_" + +public void 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 = new Path(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 + + + +public void 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 = new Path(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 + + + + """ + // 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: + debug.warning("deliver-ckeck: " + base_display + " ==> MUST have local branch named '" + destination_branch + "'") + deliver_availlable = false + // TODO: check source_branch is up to date + + // TODO: check the remote branch and the local branch are the same + //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 + + +public void checkout_elem(elem, argument_remote_name, branch_to_checkout, base_display): + debug.verbose("checkout : " + base_display) + git_repo_path = new Path(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 + + +public void get_current_version_repo(git_repo_path): + version_path_file = new Path(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) + + + +public void 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 + + +public void deliver_push(elem, argument_remote_name, destination_branch, source_branch, base_display): + // Check the repo exist + git_repo_path = new Path(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/tmpsrc/actions/update_links.java b/tmpsrc/actions/update_links.java new file mode 100644 index 0000000..b92ac6f --- /dev/null +++ b/tmpsrc/actions/update_links.java @@ -0,0 +1,43 @@ +//!/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 island import tools +from island import env +import os + +//# Update the links: +public void 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 = new Path(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 = new Path(env.get_island_root_path(), elem["destination"]) + source_path = new Path(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 diff --git a/tmpsrc/commands.java b/tmpsrc/commands.java new file mode 100644 index 0000000..4176a59 --- /dev/null +++ b/tmpsrc/commands.java @@ -0,0 +1,388 @@ +//!/usr/bin/python +// -*- coding: utf-8 -*- +//# +//# @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 stat +// Local import +from realog import debug +from . import env +from . import multiprocess +from . import debug + + + + + +""" + +""" +public void 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 + +public void 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 + + +public void 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 + +public void 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 + +public void 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 + +public void 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 + +public void 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] + +public void 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') + +public void 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] + +public void 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] + + +public void 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 + +public void 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') + +public void 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 + +public void 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 + + +public void 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 + + +public void 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 + + +public void 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 + +public void 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 + +public void 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 + +public void 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 + +public void 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 + + +public void 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 + + +public void 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 + +public void 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 + +public void 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 + + +public void 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") + """ + if ret[:31] == "Synchronizing submodule url for": + //all is good ... + debug.info(" " + ret) + elif ret != "" \ + and ret != false: + // all is good, ready to get the system work corectly + debug.info("'" + ret + "'") + debug.error("Can not sync submodules ... ") + """ + + + +public void 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 + +public void is_forward(path_repository, branch_name): + return get_forward(path_repository, branch_name) != 0; + + + +public void 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 + +public void is_behind(path_repository, branch_name): + return get_behind(path_repository, branch_name) != 0; + + diff --git a/tmpsrc/config.java b/tmpsrc/config.java new file mode 100644 index 0000000..e619bbd --- /dev/null +++ b/tmpsrc/config.java @@ -0,0 +1,185 @@ +//!/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 +import copy +import json +// Local import +from realog import debug +from . import tools +from . import env +from . import multiprocess +from . import repo_config + +env.get_island_path_config() + +unique_config = None + +public void get_unique_config(): + global unique_config + if unique_config == None: + unique_config = Config() + return unique_config + + +class Config(): + public void __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 + public void 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 + + public void 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()) + + public void 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 + + public void 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 + + public void set_manifest(self, value): + self._repo = value + + public void get_manifest(self): + return self._repo + + public void set_branch(self, value): + self._branch = value + + public void get_branch(self): + return self._branch + + public void set_manifest_name(self, value): + self._manifest_name = value + + public void get_manifest_name(self): + return self._manifest_name + + public void 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 + + public void get_volatile(self): + return copy.deepcopy(self._volatiles) + + + public void get_links(self): + return self._curent_link + + public void 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 + + public void 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") + + public void clear_links(self): + self._curent_link = [] + + + public void 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 = new Path("." + 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/tmpsrc/host.java b/tmpsrc/host.java new file mode 100644 index 0000000..6733a1e --- /dev/null +++ b/tmpsrc/host.java @@ -0,0 +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) +//# +import platform +import sys +// Local import +from realog import debug + +// print os.name # ==> 'posix' +if platform.system() == "Linux": + OS = "Linux" +elif platform.system() == "Windows": + OS = "Windows" +elif platform.system() == "Darwin": + OS = "MacOs" +else: + debug.error("Unknow the Host OS ... '" + platform.system() + "'") + +debug.debug("host.OS = " + OS) + diff --git a/tmpsrc/link_config.java b/tmpsrc/link_config.java new file mode 100644 index 0000000..1464877 --- /dev/null +++ b/tmpsrc/link_config.java @@ -0,0 +1,22 @@ +//!/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(): + public void __init__(self): + self.source = "" + self.destination = "" + + diff --git a/tmpsrc/manifest.java b/tmpsrc/manifest.java new file mode 100644 index 0000000..440ca63 --- /dev/null +++ b/tmpsrc/manifest.java @@ -0,0 +1,517 @@ +//!/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 +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 + +from lxml import etree + +public void 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 + +public void 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) + +class Manifest(): + public void __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([]) + + public void get_links(self): + return self.links + + public void _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 = new Path(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 + + + public void _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 + + public void _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 + " ") + + public void 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 + + +public void 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 = new Path(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) + + + +public void 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 = new Path(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 diff --git a/tmpsrc/multiprocess.java b/tmpsrc/multiprocess.java new file mode 100644 index 0000000..0b04172 --- /dev/null +++ b/tmpsrc/multiprocess.java @@ -0,0 +1,118 @@ +//!/usr/bin/python +// -*- coding: utf-8 -*- +//# +//# @author Edouard DUPIN +//# +//# @copyright 2012, Edouard DUPIN, all right reserved +//# +//# @license MPL v2.0 (see license file) +//# + +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 + + +public void 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])) + +public void 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 "" +//# +//# @brief Execute the command and ruturn generate data +//# +public void run_command_direct(cmd_line, cwd=None): + // 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 + + + +public void 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]] diff --git a/tmpsrc/repo_config.java b/tmpsrc/repo_config.java new file mode 100644 index 0000000..b3e77ee --- /dev/null +++ b/tmpsrc/repo_config.java @@ -0,0 +1,51 @@ +//!/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 RepoConfig(): + public void __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 + + + +public void 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 diff --git a/tmpsrc/tools.java b/tmpsrc/tools.java new file mode 100644 index 0000000..7c1d7ae --- /dev/null +++ b/tmpsrc/tools.java @@ -0,0 +1,373 @@ +//!/usr/bin/python +// -*- coding: utf-8 -*- +//# +//# @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 stat +import time +// Local import +from realog import debug +from . import env + +""" + +""" +public void get_run_path(): + return os.getcwd() + +""" + +""" +public void get_current_path(file): + return os.path.dirname(os.path.realpath(file)) + + +public void create_directory(path): + try: + os.stat(path) + except: + os.makedirs(path) + +public void create_directory_of_file(file): + path = os.path.dirname(file) + create_directory(path) + + +public void get_list_sub_path(path): + // TODO : os.listdir(path) + for dirname, dirnames, filenames in os.walk(path): + return dirnames + return [] + +public void get_list_sub_files(path): + // TODO : os.listdir(path) + for dirname, dirnames, filenames in os.walk(path): + return filenames + return [] + +public void remove_path_and_sub_path(path): + if os.path.isdir(path): + debug.verbose("remove path : '" + path + "'") + shutil.rmtree(path) + +public void remove_file(path): + if os.path.isfile(path): + os.remove(path) + elif os.path.islink(path): + os.remove(path) + +public void file_size(path): + if not os.path.isfile(path): + return 0 + statinfo = os.stat(path) + return statinfo.st_size + +public void 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 + +public void 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 + +public void 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 + +//# +//# @brief Write data in a specific path. +//# @param[in] path Path of the data might be written. +//# @param[in] data Data To write in the file. +//# @param[in] only_if_new (default: false) Write data only if data is different. +//# @return true Something has been copied +//# @return false Nothing has been copied +//# +public void 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 + +public void 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 + +public void 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 + +public void 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() + +public void 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" + +//# List tools: +public void 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() + +public void 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))) + +public void 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) + + +//# +//# @brief The vertion number can be set in an external file to permit to have a singe position to change when create a vew version +//# @param[in] path_module (string) Path of the module position +//# @param[in] filename_or_version (string or list) Path of the version or the real version lint parameter +//# @return (list) List of version number +//# +public void 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(new Path(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 +//# @param[in] path_module (string) Path of the module position +//# @param[in] filename_or_version (string or list) Path of the author file or the real list of authors +//# @return (list) List of authors +//# +public void 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(new Path(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 + + + +public void 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; + + +public void 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) + + +is_first_time_sleep = true + +public void 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()) + + + + +public void 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(new Path(root, elem)) == true: + out.append(elem); + return out; + +public void filter_name(list_files, filter): + // filter elements: + return fnmatch.filter(list_files, filter) + +public void exclude_list(list_elements, filter): + out = [] + for elem in list_elements: + if elem not in filter: + out.append(elem) + return out + +public void 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(new Path(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(new Path(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