From 66ae7aee635d56511fc19ca48d1b1efbc71c260f Mon Sep 17 00:00:00 2001
From: ArmandBahi <armand.bahi@veremes.com>
Date: Wed, 17 Oct 2018 14:44:48 +0200
Subject: [PATCH] Add files from template

---
 .gitignore                       |  17 ++++
 README.md                        |  12 ++-
 conf/Gruntfile.js                | 106 +++++++++++++++++++++
 conf/_install/apache.conf        |   6 ++
 conf/_install/dependency.xml     |  16 ++++
 conf/_install/fileToDelete.txt   |   2 +
 conf/_install/folderToDelete.txt |   1 +
 conf/credits.json                | 156 +++++++++++++++++++++++++++++++
 conf/less/variables.less         |  35 +++++++
 conf/package.json                |   4 +
 conf/requires/config.js          |  66 +++++++++++++
 conf/requires/requiresApp.js     |  11 +++
 install.sh                       |  17 ++++
 utils/copy_hooks.sh              |  14 +++
 utils/get_deps.sh                |  48 ++++++++++
 utils/githooks/post-merge        |  18 ++++
 utils/githooks/pre-push          |  21 +++++
 utils/init_subtrees.sh           |  48 ++++++++++
 utils/init_symlinks.sh           | 129 +++++++++++++++++++++++++
 utils/pull_subtrees.sh           |  46 +++++++++
 utils/push_subtrees.sh           |  37 ++++++++
 21 files changed, 809 insertions(+), 1 deletion(-)
 create mode 100644 .gitignore
 create mode 100755 conf/Gruntfile.js
 create mode 100755 conf/_install/apache.conf
 create mode 100755 conf/_install/dependency.xml
 create mode 100755 conf/_install/fileToDelete.txt
 create mode 100755 conf/_install/folderToDelete.txt
 create mode 100755 conf/credits.json
 create mode 100755 conf/less/variables.less
 create mode 100755 conf/package.json
 create mode 100755 conf/requires/config.js
 create mode 100755 conf/requires/requiresApp.js
 create mode 100755 install.sh
 create mode 100755 utils/copy_hooks.sh
 create mode 100755 utils/get_deps.sh
 create mode 100755 utils/githooks/post-merge
 create mode 100755 utils/githooks/pre-push
 create mode 100755 utils/init_subtrees.sh
 create mode 100755 utils/init_symlinks.sh
 create mode 100755 utils/pull_subtrees.sh
 create mode 100755 utils/push_subtrees.sh

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..d8b5d991
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,17 @@
+client
+vas
+conf/closure
+conf/node_modules/
+conf/properties.json
+src/closure/conf/depswriter/
+src/vitis/vas/log/
+src/vitis/vas/public/
+src/vitis/vas/server/
+src/vitis/vas/ws_data/
+src/vitis/vas/tmp/
+src/vitis/client/modules/
+! src/vitis/client/modules/vitis/
+src/vitis/vas/rest/ws/*
+! src/vitis/vas/rest/ws/vitis/
+src/vitis/vas/sql/*
+! src/vitis/vas/sql/sqlQueries.xml
diff --git a/README.md b/README.md
index 7d592df3..74f028f0 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,13 @@
 # Extraction
 
-Application extraction
\ No newline at end of file
+Application extraction
+
+## Install dev version (linux)
+
+To install the dev version of this project run the following steps:
+
+- Install the app via the VAI setup on var/www/[app name]
+- Clone this repo on var/wwww/[app name]\_dev
+- Run install.sh and give the var/www/[app name] path when asked to build your tree structure
+- Now you have the correct versioned tree structure, rename var/www/[app name] as var/www/[app name]\_vai and var/www/[app name]\_dev as var/www/[app name]
+- Run `git pull` and `git push` to update/post the project and his dependencies
diff --git a/conf/Gruntfile.js b/conf/Gruntfile.js
new file mode 100755
index 00000000..fbffa3c2
--- /dev/null
+++ b/conf/Gruntfile.js
@@ -0,0 +1,106 @@
+module.exports = function (grunt) {
+
+    var compilerPackage = require('google-closure-compiler');
+    compilerPackage.grunt(grunt);
+
+    var sHome = '../';
+    var sClosureDepsHome = '../../../../../';
+
+    // Project configuration. 
+    grunt.initConfig({
+        'closure-compiler': {
+            Extraction: {
+                files: {
+                    '../javascript/extraction.min.js': [
+                        // Fichiers Vitis
+                        sHome + 'javascript/require/*.js',
+                        sHome + 'javascript/app/**/*.js',
+                        sHome + 'javascript/externs/formReader/**/*.js',
+                        sHome + 'javascript/externs/mapJSON/**/*.js',
+                        sHome + 'modules/vitis/javascript/**/*.js',
+                        // OpenLayers
+                        sHome + 'javascript/externs/openLayers/**/*.js',
+                        // Fichiers Extraction
+                        sHome + 'conf/requires/*.js',
+                        sHome + 'modules/extraction/javascript/**/*.js'
+                    ]
+                },
+                options: {
+                    js: [
+                        'node_modules/google-closure-library/closure/goog/**.js',
+                        '!node_modules/google-closure-library/closure/goog/**_test.js'
+                    ],
+                    externs: [
+                        'closure/externs/angular-1.3.js',
+                        'closure/externs/bingmaps.js',
+                        'closure/externs/jquery-1.9.js',
+                        'closure/externs/bootstrap.js',
+                        'closure/externs/geojson.js',
+                        'closure/externs/jspdf.js',
+                        'closure/externs/html2canvas.js'
+                    ],
+                    compilation_level: 'ADVANCED',
+                    manage_closure_dependencies: true,
+                    generate_exports: true,
+                    angular_pass: true,
+                    debug: false,
+                    language_in: 'ECMASCRIPT5',
+                    language_out: 'ECMASCRIPT5',
+                    closure_entry_point: ['vitis'],
+                    create_source_map: '../javascript/extraction.min.js.map',
+                    output_wrapper: '(function(){\n%output%\n}).call(this)\n//# sourceMappingURL=../javascript/extraction.min.js.map'
+                }
+            },
+            formReader: {
+                files: {
+                    '../javascript/externs/formReader/formReader.min.js': [
+                        // Fichiers FormReader
+                        sHome + 'javascript/externs/formReader/**/*.js'
+                    ]
+                },
+                options: {
+                    compilation_level: 'WHITESPACE_ONLY',
+                    angular_pass: true,
+                    language_in: 'ECMASCRIPT5',
+                    language_out: 'ECMASCRIPT5'
+                }
+            }
+        },
+        'closureDepsWriter': {
+            options: {
+                depswriter: 'closure/depswriter/depswriter.py',
+                root_with_prefix: [
+                    // Fichiers Vitis
+                    '"' + sHome + 'javascript/app ' + sClosureDepsHome + 'javascript/app"',
+                    '"' + sHome + 'modules/vitis/javascript ' + sClosureDepsHome + 'modules/vitis/javascript"',
+                    '"' + sHome + 'javascript/externs/formReader ' + sClosureDepsHome + 'javascript/externs/formReader"',
+                    '"' + sHome + 'javascript/externs/mapJSON ' + sClosureDepsHome + 'javascript/externs/mapJSON"',
+                    '"' + sHome + 'conf/requires ' + sClosureDepsHome + 'conf/requires"',
+                    // OpenLayers
+                    '"' + sHome + 'javascript/externs/openLayers ' + sClosureDepsHome + 'javascript/externs/openLayers"',
+                    // Fichiers Extraction
+                    '"' + sHome + 'modules/extraction/javascript ' + sClosureDepsHome + 'modules/extraction/javascript"',
+                    // Closure library
+                    '"' + sHome + 'conf/node_modules/google-closure-library/closure/goog ' + sClosureDepsHome + 'conf/node_modules/google-closure-library/closure/goog"'
+                ]
+            },
+            targetName: {
+                dest: '../javascript/extraction.deps.js'
+            }
+        }
+    });
+
+    grunt.loadNpmTasks('grunt-closure-tools');
+
+    // Tache par défaut 
+    // cmd: grunt
+    grunt.registerTask('default', ['closureDepsWriter', 'closure-compiler:Extraction']);
+    // cmd: grunt generate-deps
+    grunt.registerTask('generate-deps', ['closureDepsWriter']);
+    // cmd: grunt formReader minify
+    grunt.registerTask('minify-formReader', ['closure-compiler:formReader']);
+    // cmd: grunt formReader and studio minify
+    grunt.registerTask('minify-libs', ['closure-compiler:formReader']);
+    // cmd: grunt compile
+    grunt.registerTask('compile', ['closure-compiler:Extraction']);
+};
\ No newline at end of file
diff --git a/conf/_install/apache.conf b/conf/_install/apache.conf
new file mode 100755
index 00000000..a57db001
--- /dev/null
+++ b/conf/_install/apache.conf
@@ -0,0 +1,6 @@
+Alias /extraction[ENV] "[APPDIRECTORY]"
+	<Directory "[APPDIRECTORY]">
+		AllowOverride FileInfo
+		Options FollowSymLinks
+		Require all granted
+	</Directory>
diff --git a/conf/_install/dependency.xml b/conf/_install/dependency.xml
new file mode 100755
index 00000000..31e6b634
--- /dev/null
+++ b/conf/_install/dependency.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Application -->
+<installer>
+	<dependenciesCollection>
+		<dependency>
+			<nature>framework</nature>
+			<name>vitis</name>
+			<version>master</version>
+		</dependency>
+		<dependency>
+			<nature>modules</nature>
+			<name>module_extraction</name>
+			<version>master</version>
+		</dependency>
+	</dependenciesCollection>
+</installer>
diff --git a/conf/_install/fileToDelete.txt b/conf/_install/fileToDelete.txt
new file mode 100755
index 00000000..5b05a50a
--- /dev/null
+++ b/conf/_install/fileToDelete.txt
@@ -0,0 +1,2 @@
+package.json
+Gruntfile.js
\ No newline at end of file
diff --git a/conf/_install/folderToDelete.txt b/conf/_install/folderToDelete.txt
new file mode 100755
index 00000000..3ff9591f
--- /dev/null
+++ b/conf/_install/folderToDelete.txt
@@ -0,0 +1 @@
+requires
\ No newline at end of file
diff --git a/conf/credits.json b/conf/credits.json
new file mode 100755
index 00000000..6e2a596b
--- /dev/null
+++ b/conf/credits.json
@@ -0,0 +1,156 @@
+[
+    {
+        "label": "CREDITS_SOFTWARE",
+        "rows": [
+            {
+                "type": "text",
+                "value": "vMap"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_VERSION",
+        "rows": [
+            {
+                "type": "text",
+                "value": "CREDITS_VERSION_CONTENT"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_DATE",
+        "rows": [
+            {
+                "type": "text",
+                "value": "CREDITS_DATE_CONTENT"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_EDITOR",
+        "rows": [
+            {
+                "type": "link",
+                "value": "Veremes",
+                "url": "http://www.veremes.com"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_AUTHOR",
+        "rows": [
+            {
+                "type": "text",
+                "value": "Armand Bahi"
+            },
+            {
+                "type": "text",
+                "value": "Alexandre Bizien"
+            },
+            {
+                "type": "text",
+                "value": "Anthony Borghi"
+            },
+            {
+                "type": "text",
+                "value": "Frédéric Carretero"
+            },
+            {
+                "type": "text",
+                "value": "Olivier Gayte"
+            },
+            {
+                "type": "text",
+                "value": "Sébastien Legrand"
+            },
+            {
+                "type": "text",
+                "value": "Laurent Panabieres"
+            },
+            {
+                "type": "text",
+                "value": "Yoann Perollet"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_GRAPHICS",
+        "rows": [
+            {
+                "type": "link",
+                "value": "Nematis",
+                "url": "http://www.nematis.com"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_LIBRARIES",
+        "rows": [
+            {
+                "type": "link",
+                "value": "Bootstrap",
+                "url": "http://getbootstrap.com"
+            },
+            {
+                "type": "link",
+                "value": "AngularJS",
+                "url": "https://angularjs.org"
+            },
+            {
+                "type": "link",
+                "value": "Google Closure",
+                "url": "https://developers.google.com/closure"
+            },
+            {
+                "type": "link",
+                "value": "jQuery",
+                "url": "http://jquery.com"
+            },
+            {
+                "type": "link",
+                "value": "Rgraph",
+                "url": "http://www.rgraph.net"
+            },
+            {
+                "type": "link",
+                "value": "CodeMirror",
+                "url": "http://codemirror.net"
+            },
+            {
+                "type": "link",
+                "value": "OpenLayers",
+                "url": "http://openlayers.org"
+            },
+            {
+                "type": "link",
+                "value": "TinyMCE",
+                "url": "https://www.tinymce.com"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_CONTACT",
+        "rows": [
+            {
+                "type": "link",
+                "value": "www.veremes.com",
+                "url": "http://www.veremes.com"
+            },
+            {
+                "type": "link",
+                "value": "www.veremes.com/nous-contacter#1",
+                "url": "http://www.veremes.com/nous-contacter#1"
+            }
+        ]
+    },
+    {
+        "label": "CREDITS_LICENSE",
+        "rows": [
+            {
+                "type": "link",
+                "value": "Cecill-B",
+                "url": "http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html"
+            }
+        ]
+    }
+]
diff --git a/conf/less/variables.less b/conf/less/variables.less
new file mode 100755
index 00000000..9636cd03
--- /dev/null
+++ b/conf/less/variables.less
@@ -0,0 +1,35 @@
+
+// user colors
+@user-color-theme-1: #23282D;
+@user-color-theme-2: #6F8456;
+
+
+// Veremes colors
+@veremes-gtf-color: #39468A;
+@veremes-majic-color: #CF461F;
+@veremes-qualigeo-color: #832C7A;
+@veremes-wab-color: #198D9F;
+/*@veremes-vmap-color: #CB0650;*/
+@veremes-vmap-color: #198D9F;
+
+@veremes-map-backgroud-color: #020237;
+@veremes-gray-backgroud-color: #3A3A3A;
+@veremes-light-gray-backgroud-color: #9A9A9A;
+
+
+// Application colors
+@application-color-theme: @veremes-vmap-color; // <- Change this color
+
+@application-lighen-color-theme: lighten(@application-color-theme, 20%);
+@application-darken-color-theme: darken(@application-color-theme, 10%);
+
+@application-action-1-color: #337ab7; // blue bootstrap
+@application-action-2-color: #5cb85c; // green bootstrap
+
+// Other variables
+@ui-grid-bg-image: "../images/ui-grid/wbg.gif";
+@font-color-purple: #020237;
+
+// Dimension des vignettes dans les listes.
+@ui-grid-thumbnail-width: 100px;
+@ui-grid-thumbnail-heigth: 60px;
\ No newline at end of file
diff --git a/conf/package.json b/conf/package.json
new file mode 100755
index 00000000..5b5091d4
--- /dev/null
+++ b/conf/package.json
@@ -0,0 +1,4 @@
+{
+  "name": "Vitis",
+  "version": "0.1.0"
+}
diff --git a/conf/requires/config.js b/conf/requires/config.js
new file mode 100755
index 00000000..6d0f540f
--- /dev/null
+++ b/conf/requires/config.js
@@ -0,0 +1,66 @@
+'use strict';
+
+goog.provide('vitis.application.config');
+
+// Fichiers js et css à charger pour l'application Extraction.
+var oApplicationFiles = {
+    'css': [
+        // Vitis
+        'css/lib/bootstrap/css/bootstrap.min.css',
+        'css/lib/jquery/plugins/bootstrap-datepicker/bootstrap-datepicker3.min.css',
+        'css/lib/jquery/plugins/bootstrap-fileinput/css/fileinput.min.css',
+        'css/lib/ui-grid/ui-grid.min.css',
+        'css/lib/jquery/plugins/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css',
+        'css/lib/bootstrap-checkbox/build.css',
+        'css/lib/bootstrap-checkbox/font-awesome.css',
+        'css/lib/jquery/plugins/bootstrap-slider/bootstrap-slider.min.css',
+        'css/lib/jquery/plugins/malihu-custom-scrollbar/jquery.mCustomScrollbar.min.css',
+        'css/lib/ui-grid/plugins/draggable-rows.less',
+        'less/main.less',
+        // App
+        'modules/vitis/less/main.less',
+        'modules/extraction/less/main.less',
+        'css/lib/codemirror/codemirror.css',
+        'css/lib/codemirror/codemirror_foldgutter.css',
+        'css/lib/codemirror/map.css',
+        'css/lib/codemirror/show-hint.css',
+        'css/lib/jquery/plugins/bootstrap-treeview/bootstrap-treeview.min.css',
+        'css/lib/jquery/plugins/bootstrap-tagsinput/bootstrap-tagsinput.css',
+        'css/lib/jquery/plugins/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css',
+        'css/lib/viewer/viewer.min.css'
+    ],
+    'js': {
+        'externs': [
+            // Studio
+            'javascript/externs/bootbox/bootbox.min.js',
+            'javascript/externs/codemirror/codemirror.min.js',
+            'javascript/externs/codemirror/htmlmixed.js',
+            'javascript/externs/codemirror/css.js',
+            'javascript/externs/codemirror/javascript.js',
+            'javascript/externs/codemirror/clike.js',
+            'javascript/externs/codemirror/php.js',
+            'javascript/externs/codemirror/xml.js',
+            'javascript/externs/codemirror/sql.js',
+            'javascript/externs/codemirror/map.js',
+            'javascript/externs/codemirror/show-hint.js',
+            'javascript/externs/codemirror/addon/fold/foldcode.js',
+            'javascript/externs/codemirror/addon/fold/foldgutter.js',
+            'javascript/externs/codemirror/addon/fold/brace-fold.js',
+            'javascript/externs/codemirror/addon/fold/xml-fold.js',
+            'javascript/externs/angular/modules/ui-codemirror/ui-codemirror.min.js',
+            'javascript/externs/tinymce/tinymce.min.js',
+            'javascript/externs/angular/modules/ui-tinymce/tinymce.js',
+            'javascript/externs/jquery/plugins/bootstrap-treeview/bootstrap-treeview.js',
+            'javascript/externs/jquery/plugins/bootstrap-tagsinput/bootstrap-tagsinput.min.js',
+            'javascript/externs/scripts_cryptage.js',
+            'javascript/externs/moment/moment.min.js',
+            'javascript/externs/moment/min/moment-with-locales.min.js',
+            'javascript/externs/jquery/plugins/notify/notify.js',
+            'javascript/externs/jquery/plugins/bootstrap-colorpicker/bootstrap-colorpicker.min.js',
+            'javascript/externs/jquery/plugins/bootstrap-confirmation/bootstrap-confirmation.min.js',
+            'javascript/externs/jquery/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js',
+            'javascript/externs/viewer/viewer.min.js'
+        ]
+    },
+    'vitisModuleDependencies': ['ui.codemirror', 'ui.tinymce', 'ui.grid.draggable-rows']
+};
\ No newline at end of file
diff --git a/conf/requires/requiresApp.js b/conf/requires/requiresApp.js
new file mode 100755
index 00000000..3417eb6f
--- /dev/null
+++ b/conf/requires/requiresApp.js
@@ -0,0 +1,11 @@
+/* global goog */
+
+/**
+ * Ce fichier permet de charger les fichiers de l'applicaiton
+ * de façon non compilée
+ * @author: Armand Bahi
+ */
+
+goog.provide('vitis.application.requires');
+//goog.require('vmap.script_module');
+goog.require('extraction.script_module');
\ No newline at end of file
diff --git a/install.sh b/install.sh
new file mode 100755
index 00000000..b5ceb92a
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+#
+#
+# 	Script d'initialisation d'un dépot vMap versionné sous git
+#	Initislise l'ensemble des dépendances sous forme de subtrees
+#   Crée des symlinks pour re-créer l'arborescence de l'application
+#
+#
+
+if [ `whoami` == "root" ]; then
+    echo "Please, do not run this script as sudo"
+else
+    cd utils/
+    ./init_symlinks.sh
+    ./pull_subtrees.sh
+    ./copy_hooks.sh
+fi
diff --git a/utils/copy_hooks.sh b/utils/copy_hooks.sh
new file mode 100755
index 00000000..f5bed2f2
--- /dev/null
+++ b/utils/copy_hooks.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+#
+#
+# 	Script de mise à jour des hooks client
+#
+#
+#
+
+
+if [ -d "githooks" ]; then
+	if [ -d "../.git/hooks" ]; then
+	    cp -f githooks/* ../.git/hooks/
+	fi
+fi
diff --git a/utils/get_deps.sh b/utils/get_deps.sh
new file mode 100755
index 00000000..92b02739
--- /dev/null
+++ b/utils/get_deps.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+#
+#	Récupère l'ensemble des dépendances depuis conf/_install/dependency.xml
+#	Nécessite xmllint : sudo apt install libxml2-utils
+#
+#
+#
+#
+
+
+if [ "../conf/_install/dependency.xml" ]; then
+
+	let depsCount=$(xmllint --xpath 'count(//dependenciesCollection/dependency/name)' ../conf/_install/dependency.xml)
+	declare -A aDeps
+	vitisVersion=master
+
+	for (( i=1; i <= $depsCount; i++ )); do
+
+		sName="$(xmllint --xpath 'string(//dependenciesCollection/dependency['$i']/name)' ../conf/_install/dependency.xml)"
+		sVersion="$(xmllint --xpath 'string(//dependenciesCollection/dependency['$i']/version)' ../conf/_install/dependency.xml)"
+		sNature="$(xmllint --xpath 'string(//dependenciesCollection/dependency['$i']/nature)' ../conf/_install/dependency.xml)"
+
+		if [ $sName == "vitis" ]; then
+			vitisVersion=$sVersion
+		fi
+		if [ $sNature == "modules" ] || [ $sNature == "web_services" ] || [ $sName == "vitis" ]; then
+			aDeps[$i, name]=$sName
+			aDeps[$i, version]=$sVersion
+			aDeps[$i, nature]=$sNature
+		fi
+
+	done
+
+	echo "[INFO] dependencies:"
+	echo "vitis : $vitisVersion"
+	for (( i=1; i <= $depsCount; i++ )); do
+
+		echo "name: ${aDeps[$i, name]}"
+		echo "version: ${aDeps[$i, version]}"
+
+	done
+
+	export vitisVersion
+	export depsCount
+	export aDeps
+else
+	echo "[ERROR] ../conf/_install/dependency.xml not found"
+fi
diff --git a/utils/githooks/post-merge b/utils/githooks/post-merge
new file mode 100755
index 00000000..548e6ae5
--- /dev/null
+++ b/utils/githooks/post-merge
@@ -0,0 +1,18 @@
+#!/bin/sh
+#
+#   Hook qui permet de pull toutes les dépendances
+#   quand on fait un pull sur l'application
+#
+#
+#
+#
+#
+
+echo "****** Post-merge Hook ******"
+echo "****** Pull subtrees ******"
+echo "$(pwd)"
+
+if [ -d "$(pwd)/utils" ]; then
+    cd utils
+    ./pull_subtrees.sh
+fi
diff --git a/utils/githooks/pre-push b/utils/githooks/pre-push
new file mode 100755
index 00000000..50401f9e
--- /dev/null
+++ b/utils/githooks/pre-push
@@ -0,0 +1,21 @@
+#!/bin/sh
+#
+#   Hook qui permet de push toutes les dépendances
+#   quand on fait un push sur l'application
+#
+#
+#
+#
+#
+
+remote="$1"
+url="$2"
+if [ $remote != $url ]; then
+
+    echo "****** Pre-push Hook ******"
+    echo "****** Push subtrees ******"
+    if [ -d "$(pwd)/utils" ]; then
+        cd utils
+        ./push_subtrees.sh
+    fi
+fi
diff --git a/utils/init_subtrees.sh b/utils/init_subtrees.sh
new file mode 100755
index 00000000..7f9c2abf
--- /dev/null
+++ b/utils/init_subtrees.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+#
+#
+# 	Script d'initialisation d'un dépot vMap versionné sous git
+#	Initislise l'ensemble des dépendances sous forme de subtrees
+#
+#	Nécessite xmllint : sudo apt install libxml2-utils
+#
+
+
+APP_NAME="vmap"
+
+# Récupère la liste des dépendances
+. ./get_deps.sh
+
+cd ..
+if [ -d "$(pwd)/client" ]; then
+	rm client
+fi
+if [ -d "$(pwd)/vas" ]; then
+	rm vas
+fi
+if [ -d "$(pwd)/src" ]; then
+	git rm -r src
+	git commit -a -m "Reset sources"
+fi
+mkdir src
+
+if [[ $depsCount > 0 ]]; then
+
+	# Vitis
+	echo "---- Init vitis ----"
+	git subtree add --squash -m "add subtree" --prefix src/vitis "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" $vitisVersion
+
+	echo "---- Init conf ----"
+	git subtree add --squash -m "add subtree" --prefix src/closure "git@gitlab.veremes.net:Development/vitis_apps/sources/closure.git" master
+
+	# Modules
+	for (( i=1; i <= $depsCount; i++ )); do
+		if [ ${aDeps[$i, nature]} == "modules" ]; then
+			echo "---- Init ${aDeps[$i, name]} : ${aDeps[$i, version]}----"
+
+		    # Ajoute le dépôt
+			git subtree add --squash -m "add subtree" --prefix src/${aDeps[$i, name]} "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" ${aDeps[$i, version]}
+		fi
+	done
+
+fi
diff --git a/utils/init_symlinks.sh b/utils/init_symlinks.sh
new file mode 100755
index 00000000..c98ed30e
--- /dev/null
+++ b/utils/init_symlinks.sh
@@ -0,0 +1,129 @@
+#!/bin/bash
+#
+#
+# 	Script d'initialisation d'un dépot vMap versionné sous git
+#
+#   Split repo
+#   git subtree split -P module/ -b module_split_branch
+#
+#   Add subtree
+#   git subtree add --prefix vmap "git@gitlab.veremes.net:Development/vitis_apps/sources/Vitis.git" master
+#
+#
+
+echo -n "Existing app path (path/empty)? "
+read APP_EXISTING_PATH
+
+# Récupère la liste des dépendances
+. ./get_deps.sh
+
+cd ..
+
+# Vitis
+echo "---- Link vitis ----"
+if ! [ -e "$(pwd)/client" ]; then
+	echo "---- Link vitis 2 ----"
+	ln -rsf src/vitis/client client
+fi
+if ! [ -e "$(pwd)/vas" ]; then
+	ln -rsf src/vitis/vas vas
+fi
+
+# Conf
+echo "---- Link conf ----"
+if ! [ -e "src/vitis/client/conf" ]; then
+	ln -rsf conf src/vitis/client/conf
+fi
+if ! [ -e "conf/closure" ]; then
+	ln -rsf src/closure/conf conf/closure
+fi
+
+# Modules
+if [[ $depsCount > 0 ]]; then
+	for (( i=1; i <= $depsCount; i++ )); do
+		if [ ${aDeps[$i, nature]} == "modules" ]; then
+			if [ ${aDeps[$i, name]:0:7} == "module_" ]; then
+				module=${aDeps[$i, name]:7}
+				echo "---- Link module_${module} ----"
+				if [ -d "$(pwd)/src/module_${module}/module" ]; then
+					if ! [ -e "src/vitis/client/modules/${module}" ]; then
+						ln -rsf src/module_${module}/module src/vitis/client/modules/${module}
+					fi
+				fi
+				if [ -d "$(pwd)/src/module_${module}/web_service/ws" ]; then
+					if ! [ -e "src/vitis/vas/rest/ws/${module}" ]; then
+						ln -rsf src/module_${module}/web_service/ws src/vitis/vas/rest/ws/${module}
+					fi
+				fi
+				if [ -d "$(pwd)/src/module_${module}/web_service/conf" ]; then
+					if ! [ -e "src/vitis/vas/rest/conf/${module}" ]; then
+						ln -rsf src/module_${module}/web_service/conf src/vitis/vas/rest/conf/${module}
+					fi
+				fi
+				if [ -d "$(pwd)/src/module_${module}/web_service/sql" ]; then
+					if ! [ -e "src/vitis/vas/sql/${module}" ]; then
+						ln -rsf src/module_${module}/web_service/sql src/vitis/vas/sql/${module}
+					fi
+				fi
+				if [ -d "$(pwd)/src/module_${module}/web_service/class" ]; then
+					for class_dir in $( ls "$(pwd)/src/module_${module}/web_service/class"); do
+						if [ -d "$(pwd)/src/module_${module}/web_service/class/${class_dir}" ]; then
+							echo "---- Link module_${module}/${class_dir} ----"
+							if ! [ -e "src/vitis/vas/rest/class/${class_dir}" ]; then
+								ln -rsf src/module_${module}/web_service/class/${class_dir} src/vitis/vas/rest/class/${class_dir}
+							fi
+						fi
+					done
+				fi
+			fi
+		fi
+	done
+
+	# Utilisation d'une install déjà existante
+	if [ -d "${APP_EXISTING_PATH}" ]; then
+		echo "---- Link exixting app ${APP_EXISTING_PATH} ----"
+
+		declare -a existing_folders_path=("vas/server"
+		                "vas/log"
+						"vas/public"
+						"vas/shared"
+						"vas/tmp"
+						"vas/upload"
+		                "vas/ws_data")
+		for folder_path in "${existing_folders_path[@]}"; do
+			if [ -d "${APP_EXISTING_PATH}/$folder_path" ]; then
+				echo "copy $folder_path"
+				cp -Rf "${APP_EXISTING_PATH}/$folder_path" "$(pwd)/$folder_path"
+				chmod 777 -R "$(pwd)/$folder_path"
+			fi
+		done
+
+		declare -a existing_files_path=("client/conf/properties.json"
+										"vas/rest/conf/properties.inc"
+										"vas/rest/conf/properties_domain.inc"
+										"vas/rest/conf/properties_post.inc"
+										"vas/rest/conf/properties_server.inc"
+										"vas/rest/conf/version.inc"
+										"vas/rest/.htaccess")
+		for file_path in "${existing_files_path[@]}"; do
+			if [ -f "${APP_EXISTING_PATH}/$file_path" ]; then
+				echo "copy $file_path"
+				cp -f "${APP_EXISTING_PATH}/$file_path" "$(pwd)/$file_path"
+			fi
+		done
+
+		for properties_dir in $( ls "${APP_EXISTING_PATH}/vas/rest/conf"); do
+			if [ -d "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}" ]; then
+				if [ -d "$(pwd)/vas/rest/conf/${properties_dir}" ]; then
+					for properties_file in $( ls "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}"); do
+						# if [ ${properties_file:0:10}=="properties"  ||  ${properties_file}=="version.inc" ]; then
+						if [[ $properties_file == "properties"* ]] || [[ $properties_file == "version.inc" ]]; then
+							echo "copy vas/rest/conf/${properties_dir}/${properties_file}"
+							cp -f "${APP_EXISTING_PATH}/vas/rest/conf/${properties_dir}/${properties_file}" "$(pwd)/vas/rest/conf/${properties_dir}/${properties_file}"
+						fi
+					done
+				fi
+			fi
+		done
+	fi
+fi
diff --git a/utils/pull_subtrees.sh b/utils/pull_subtrees.sh
new file mode 100755
index 00000000..c2793f2e
--- /dev/null
+++ b/utils/pull_subtrees.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+#
+#
+# 	Script d'initialisation d'un dépot vMap versionné sous git
+#	Initislise l'ensemble des dépendances sous forme de subtrees
+#
+#
+#
+
+
+APP_NAME="vmap"
+
+# Récupère la liste des dépendances
+. ./get_deps.sh
+
+cd ..
+
+# Vitis
+echo "---- Pull vitis ----"
+git subtree pull --prefix src/vitis --squash -m "pull subtree"  "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" master
+
+# fichiers à ignorer
+git update-index --assume-unchanged conf/properties.json
+git update-index --assume-unchanged conf/package.json
+git update-index --assume-unchanged src/vitis/vas/rest/.htaccess
+git update-index --assume-unchanged src/vitis/vas/rest/conf/properties.inc
+git update-index --assume-unchanged src/vitis/vas/rest/conf/properties_domain.inc
+git update-index --assume-unchanged src/vitis/vas/rest/conf/properties_post.inc
+git update-index --assume-unchanged src/vitis/vas/rest/conf/properties_server.inc
+git update-index --assume-unchanged src/vitis/vas/rest/conf/version.inc
+
+# Modules
+if [[ $depsCount > 0 ]]; then
+	for (( i=1; i <= $depsCount; i++ )); do
+		if [ ${aDeps[$i, nature]} == "modules" ]; then
+			echo "---- Pull ${aDeps[$i, name]} ----"
+
+			# Ajoute le dépôt
+			git subtree pull --prefix src/${aDeps[$i, name]} --squash -m "pull subtree" "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" master
+			# fichiers à ignorer
+			git update-index --assume-unchanged src/${aDeps[$i, name]}/web_service/conf/properties.inc
+			git update-index --assume-unchanged src/${aDeps[$i, name]}/web_service/conf/properties_server.inc
+			git update-index --assume-unchanged src/${aDeps[$i, name]}/web_service/conf/version.inc
+		fi
+	done
+fi
diff --git a/utils/push_subtrees.sh b/utils/push_subtrees.sh
new file mode 100755
index 00000000..b4949ea2
--- /dev/null
+++ b/utils/push_subtrees.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+#
+#
+# 	Script d'initialisation d'un dépot vMap versionné sous git
+#	Initislise l'ensemble des dépendances sous forme de subtrees
+#
+#
+#
+
+
+APP_NAME="vmap"
+
+# Récupère la liste des dépendances
+. ./get_deps.sh
+
+cd ..
+
+# Vitis
+echo "---- Push vitis ----"
+git subtree push --prefix src/vitis "git@gitlab.veremes.net:Development/vitis_apps/sources/vitis.git" master
+
+# Modules
+if [[ $depsCount > 0 ]]; then
+	for (( i=1; i <= $depsCount; i++ )); do
+		if [ ${aDeps[$i, nature]} == "modules" ]; then
+			echo "---- Push ${aDeps[$i, name]} ----"
+
+			# Push le dépôt
+
+			{ # 'try' block
+				git subtree push --prefix src/${aDeps[$i, name]} "git@gitlab.veremes.net:Development/vitis_apps/sources/${aDeps[$i, name]}.git" master
+			} || { # 'catch' block
+			    echo "could not push ${aDeps[$i, name]}"
+			}
+		fi
+	done
+fi
-- 
GitLab