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