diff --git a/.gitignore b/.gitignore
index 04d387e..0904e0f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,7 @@ venv
config.conf
*.DS_Store
*.pyc
+
+.repo
+addons
+odoo
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index ff18d23..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,261 +0,0 @@
-[submodule "addons/ERPLibre_erplibre_addons"]
- url = https://github.com/ERPLibre/erplibre_addons.git
- path = addons/ERPLibre_erplibre_addons
-[submodule "addons/MathBenTech_development"]
- url = https://github.com/ERPLibre/development.git
- path = addons/MathBenTech_development
-[submodule "addons/MathBenTech_odoo-business-spending-management-quebec-canada"]
- url = https://github.com/ERPLibre/odoo-business-spending-management-quebec-canada.git
- path = addons/MathBenTech_odoo-business-spending-management-quebec-canada
-[submodule "addons/MathBenTech_scrummer"]
- url = https://github.com/ERPLibre/scrummer.git
- path = addons/MathBenTech_scrummer
-[submodule "addons/muk-it_muk_base"]
- url = https://github.com/ERPLibre/muk_base.git
- path = addons/muk-it_muk_base
-[submodule "addons/muk-it_muk_dms"]
- url = https://github.com/ERPLibre/muk_dms.git
- path = addons/muk-it_muk_dms
-[submodule "addons/muk-it_muk_docs"]
- url = https://github.com/ERPLibre/muk_docs.git
- path = addons/muk-it_muk_docs
-[submodule "addons/muk-it_muk_misc"]
- url = https://github.com/ERPLibre/muk_misc.git
- path = addons/muk-it_muk_misc
-[submodule "addons/muk-it_muk_quality"]
- url = https://github.com/ERPLibre/muk_quality.git
- path = addons/muk-it_muk_quality
-[submodule "addons/muk-it_muk_web"]
- url = https://github.com/ERPLibre/muk_web.git
- path = addons/muk-it_muk_web
-[submodule "addons/muk-it_muk_website"]
- url = https://github.com/ERPLibre/muk_website.git
- path = addons/muk-it_muk_website
-[submodule "addons/Numigi_odoo-base-addons"]
- url = https://github.com/ERPLibre/odoo-base-addons.git
- path = addons/Numigi_odoo-base-addons
-[submodule "addons/Numigi_odoo-entertainment-addons"]
- url = https://github.com/ERPLibre/odoo-entertainment-addons.git
- path = addons/Numigi_odoo-entertainment-addons
-[submodule "addons/Numigi_odoo-git-addons"]
- url = https://github.com/ERPLibre/odoo-git-addons.git
- path = addons/Numigi_odoo-git-addons
-[submodule "addons/Numigi_odoo-hr-addons"]
- url = https://github.com/ERPLibre/odoo-hr-addons.git
- path = addons/Numigi_odoo-hr-addons
-[submodule "addons/Numigi_odoo-partner-addons"]
- url = https://github.com/ERPLibre/odoo-partner-addons.git
- path = addons/Numigi_odoo-partner-addons
-[submodule "addons/Numigi_odoo-product-addons"]
- url = https://github.com/ERPLibre/odoo-product-addons.git
- path = addons/Numigi_odoo-product-addons
-[submodule "addons/Numigi_odoo-project-addons"]
- url = https://github.com/ERPLibre/odoo-project-addons.git
- path = addons/Numigi_odoo-project-addons
-[submodule "addons/Numigi_odoo-purchase-addons"]
- url = https://github.com/ERPLibre/odoo-purchase-addons.git
- path = addons/Numigi_odoo-purchase-addons
-[submodule "addons/Numigi_odoo-stock-addons"]
- url = https://github.com/ERPLibre/odoo-stock-addons.git
- path = addons/Numigi_odoo-stock-addons
-[submodule "addons/Numigi_odoo-survey-addons"]
- url = https://github.com/ERPLibre/odoo-survey-addons.git
- path = addons/Numigi_odoo-survey-addons
-[submodule "addons/Numigi_odoo-timesheet-addons"]
- url = https://github.com/ERPLibre/odoo-timesheet-addons.git
- path = addons/Numigi_odoo-timesheet-addons
-[submodule "addons/Numigi_odoo-web-addons"]
- url = https://github.com/ERPLibre/odoo-web-addons.git
- path = addons/Numigi_odoo-web-addons
-[submodule "addons/OCA_account-analytic"]
- url = https://github.com/ERPLibre/account-analytic.git
- path = addons/OCA_account-analytic
-[submodule "addons/OCA_account-budgeting"]
- url = https://github.com/ERPLibre/account-budgeting.git
- path = addons/OCA_account-budgeting
-[submodule "addons/OCA_account-closing"]
- url = https://github.com/ERPLibre/account-closing.git
- path = addons/OCA_account-closing
-[submodule "addons/OCA_account-consolidation"]
- url = https://github.com/ERPLibre/account-consolidation.git
- path = addons/OCA_account-consolidation
-[submodule "addons/OCA_account-financial-reporting"]
- url = https://github.com/ERPLibre/account-financial-reporting.git
- path = addons/OCA_account-financial-reporting
-[submodule "addons/OCA_account-financial-tools"]
- url = https://github.com/ERPLibre/account-financial-tools
- path = addons/OCA_account-financial-tools
-[submodule "addons/OCA_account-fiscal-rule"]
- url = https://github.com/ERPLibre/account-fiscal-rule.git
- path = addons/OCA_account-fiscal-rule
-[submodule "addons/OCA_account-invoicing"]
- url = https://github.com/ERPLibre/account-invoicing.git
- path = addons/OCA_account-invoicing
-[submodule "addons/OCA_account-invoice-reporting"]
- url = https://github.com/ERPLibre/account-invoice-reporting.git
- path = addons/OCA_account-invoice-reporting
-[submodule "addons/OCA_account-payment"]
- url = https://github.com/ERPLibre/account-payment.git
- path = addons/OCA_account-payment
-[submodule "addons/OCA_account-reconcile"]
- url = https://github.com/ERPLibre/account-reconcile.git
- path = addons/OCA_account-reconcile
-[submodule "addons/OCA_apps-store"]
- url = https://github.com/ERPLibre/apps-store.git
- path = addons/OCA_apps-store
-[submodule "addons/OCA_bank-payment"]
- url = https://github.com/ERPLibre/bank-payment.git
- path = addons/OCA_bank-payment
-[submodule "addons/OCA_bank-statement-import"]
- url = https://github.com/ERPLibre/bank-statement-import.git
- path = addons/OCA_bank-statement-import
-[submodule "addons/OCA_brand"]
- url = https://github.com/ERPLibre/brand.git
- path = addons/OCA_brand
-[submodule "addons/OCA_business-requirement"]
- url = https://github.com/ERPLibre/business-requirement.git
- path = addons/OCA_business-requirement
-[submodule "addons/OCA_commission"]
- url = https://github.com/ERPLibre/commission.git
- path = addons/OCA_commission
-[submodule "addons/OCA_community-data-files"]
- url = https://github.com/ERPLibre/community-data-files.git
- path = addons/OCA_community-data-files
-[submodule "addons/OCA_connector-telephony"]
- url = https://github.com/ERPLibre/connector-telephony.git
- path = addons/OCA_connector-telephony
-[submodule "addons/OCA_contract"]
- url = https://github.com/ERPLibre/contract.git
- path = addons/OCA_contract
-[submodule "addons/OCA_credit-control"]
- url = https://github.com/ERPLibre/credit-control.git
- path = addons/OCA_credit-control
-[submodule "addons/OCA_currency"]
- url = https://github.com/ERPLibre/currency.git
- path = addons/OCA_currency
-[submodule "addons/OCA_data-protection"]
- url = https://github.com/ERPLibre/data-protection.git
- path = addons/OCA_data-protection
-[submodule "addons/OCA_donation"]
- url = https://github.com/ERPLibre/donation.git
- path = addons/OCA_donation
-[submodule "addons/OCA_e-commerce"]
- url = https://github.com/ERPLibre/e-commerce.git
- path = addons/OCA_e-commerce
-[submodule "addons/OCA_edi"]
- url = https://github.com/ERPLibre/edi.git
- path = addons/OCA_edi
-[submodule "addons/OCA_event"]
- url = https://github.com/ERPLibre/event.git
- path = addons/OCA_event
-[submodule "addons/OCA_helpdesk"]
- url = https://github.com/ERPLibre/helpdesk.git
- path = addons/OCA_helpdesk
-[submodule "addons/OCA_hr"]
- url = https://github.com/ERPLibre/hr.git
- path = addons/OCA_hr
-[submodule "addons/OCA_knowledge"]
- url = https://github.com/ERPLibre/knowledge.git
- path = addons/OCA_knowledge
-[submodule "addons/OCA_l10n-canada"]
- url = https://github.com/ERPLibre/l10n-canada.git
- path = addons/OCA_l10n-canada
-[submodule "addons/OCA_maintenance"]
- url = https://github.com/ERPLibre/maintenance.git
- path = addons/OCA_maintenance
-[submodule "addons/OCA_management-system"]
- url = https://github.com/ERPLibre/management-system.git
- path = addons/OCA_management-system
-[submodule "addons/OCA_manufacture"]
- url = https://github.com/ERPLibre/manufacture.git
- path = addons/OCA_manufacture
-[submodule "addons/OCA_margin-analysis"]
- url = https://github.com/ERPLibre/margin-analysis.git
- path = addons/OCA_margin-analysis
-[submodule "addons/OCA_mis-builder"]
- url = https://github.com/ERPLibre/mis-builder.git
- path = addons/OCA_mis-builder
-[submodule "addons/OCA_multi-company"]
- url = https://github.com/ERPLibre/multi-company.git
- path = addons/OCA_multi-company
-[submodule "addons/OCA_partner-contact"]
- url = https://github.com/ERPLibre/partner-contact.git
- path = addons/OCA_partner-contact
-[submodule "addons/OCA_pos"]
- url = https://github.com/ERPLibre/pos.git
- path = addons/OCA_pos
-[submodule "addons/OCA_product-attribute"]
- url = https://github.com/ERPLibre/product-attribute.git
- path = addons/OCA_product-attribute
-[submodule "addons/OCA_product-pack"]
- url = https://github.com/ERPLibre/product-pack.git
- path = addons/OCA_product-pack
-[submodule "addons/OCA_product-variant"]
- url = https://github.com/ERPLibre/product-variant.git
- path = addons/OCA_product-variant
-[submodule "addons/OCA_project"]
- url = https://github.com/ERPLibre/project.git
- path = addons/OCA_project
-[submodule "addons/OCA_project-reporting"]
- url = https://github.com/ERPLibre/project-reporting.git
- path = addons/OCA_project-reporting
-[submodule "addons/OCA_purchase-workflow"]
- url = https://github.com/ERPLibre/purchase-workflow.git
- path = addons/OCA_purchase-workflow
-[submodule "addons/OCA_queue"]
- url = https://github.com/ERPLibre/queue.git
- path = addons/OCA_queue
-[submodule "addons/OCA_reporting-engine"]
- url = https://github.com/ERPLibre/reporting-engine.git
- path = addons/OCA_reporting-engine
-[submodule "addons/OCA_sale-workflow"]
- url = https://github.com/ERPLibre/sale-workflow.git
- path = addons/OCA_sale-workflow
-[submodule "addons/OCA_server-auth"]
- url = https://github.com/ERPLibre/server-auth.git
- path = addons/OCA_server-auth
-[submodule "addons/OCA_server-brand"]
- url = https://github.com/ERPLibre/server-brand.git
- path = addons/OCA_server-brand
-[submodule "addons/OCA_server-env"]
- url = https://github.com/ERPLibre/server-env.git
- path = addons/OCA_server-env
-[submodule "addons/OCA_server-tools"]
- url = https://github.com/ERPLibre/server-tools.git
- path = addons/OCA_server-tools
-[submodule "addons/OCA_server-ux"]
- url = https://github.com/ERPLibre/server-ux.git
- path = addons/OCA_server-ux
-[submodule "addons/OCA_social"]
- url = https://github.com/ERPLibre/social.git
- path = addons/OCA_social
-[submodule "addons/OCA_stock-logistics-warehouse"]
- url = https://github.com/ERPLibre/stock-logistics-warehouse.git
- path = addons/OCA_stock-logistics-warehouse
-[submodule "addons/OCA_timesheet"]
- url = https://github.com/ERPLibre/timesheet.git
- path = addons/OCA_timesheet
-[submodule "addons/OCA_web"]
- url = https://github.com/ERPLibre/web.git
- path = addons/OCA_web
-[submodule "addons/OCA_website"]
- url = https://github.com/ERPLibre/website.git
- path = addons/OCA_website
-[submodule "addons/OCA_wms"]
- url = https://github.com/ERPLibre/wms.git
- path = addons/OCA_wms
-[submodule "odoo"]
- url = https://github.com/ERPLibre/odoo.git
- path = odoo
-[submodule "addons/odooaktiv_QuotationRevision"]
- url = https://github.com/ERPLibre/QuotationRevision.git
- path = addons/odooaktiv_QuotationRevision
-[submodule "addons/openeducat_openeducat_erp"]
- url = https://github.com/ERPLibre/openeducat_erp.git
- path = addons/openeducat_openeducat_erp
-[submodule "addons/SanteLibre_santelibre_addons"]
- url = https://github.com/ERPLibre/santelibre_addons.git
- path = addons/SanteLibre_santelibre_addons
-[submodule "addons/Smile-SA_odoo_addons"]
- url = https://github.com/ERPLibre/odoo_addons.git
- path = addons/Smile-SA_odoo_addons
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..395c7fc
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,47 @@
+# Changelog
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [Unreleased]
+### Added
+- Docker
+
+### Changed
+- Update to Odoo Community 12.0
+
+### Fixed
+- Web module display
+
+## [1.0.0] - 2020-07-04
+### Added
+- Environment of development, discovery and production with documentation and script.
+- git-repo of Google to support addons repository instead of using Git submodule.
+
+### Removed
+- Git submodule
+
+## [0.1.1] - 2020-04-28
+### Added
+- Support helpdesk supplier, helper, employee and services
+- Support [SanteLibre.ca](https://santelibre.ca) with MRP, website, hr, ecommerce
+- Donation module with thermometer for website
+- Script to fork project and all repos in submodule to create ERPLibre
+
+## [0.1.0] - 2020-04-20
+### Added
+- Move project from https://github.com/mathbentech/InstallScript to ERPLibre.
+- Support of Odoo Community 12.0 2019-11-19 94bcbc92e5e5a6fd3de7267e3c01f8c11fb045f4.
+
+### Changed
+- Support scrummer, project, sale, website, helpdesk and hr
+- Support Nginx and improve installation
+
+### Fixed
+- Support only python3.6 and python3.7, python3.8 causes error in runtime.
+
+[Unreleased]: http://git.erplibre.ca/ERPLibre/compare/v1.0.0...HEAD
+[1.0.0]: http://git.erplibre.ca/ERPLibre/compare/v0.1.1...v1.0.0
+[0.1.1]: http://git.erplibre.ca/ERPLibre/compare/v0.1.0...v0.1.1
+[0.1.0]: http://git.erplibre.ca/ERPLibre/releases/tag/v0.1.0
diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
deleted file mode 100644
index 07114b1..0000000
--- a/DEVELOPMENT.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# ERPLibre
-
-## Move database prod to dev
-
-When moving database prod to your dev environment, you want to remove email servers, and install user test to test the database.
-Run :
-> -c config.conf --stop-after-init -i user_test,disable_mail_server --dev all -d DATABASE
\ No newline at end of file
diff --git a/HOWTO.md b/HOWTO.md
deleted file mode 100644
index 3bf0c31..0000000
--- a/HOWTO.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# How to clone me
-
-First,
-pip install -r requirements.txt
diff --git a/PRODUCTION.md b/PRODUCTION.md
deleted file mode 100644
index 07114b1..0000000
--- a/PRODUCTION.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# ERPLibre
-
-## Move database prod to dev
-
-When moving database prod to your dev environment, you want to remove email servers, and install user test to test the database.
-Run :
-> -c config.conf --stop-after-init -i user_test,disable_mail_server --dev all -d DATABASE
\ No newline at end of file
diff --git a/README.md b/README.md
index d41b676..0ea50a9 100644
--- a/README.md
+++ b/README.md
@@ -1,58 +1,17 @@
-# ERPLibre
+# ERPLibre documentation
+Select a guide to install your environment!
-## Installation procedure production
+## Discover guide
+[Guide to run ERPLibre in discover to learn it](./doc/DISCOVER.md).
-##### 1. Clone the project:
-```
-git clone https://github.com/ERPLibre/ERPLibre.git
-```
-##### 2. Modify the parameters
-Modify the file env_var.sh for production installation.
+## Production guide
+[Guide to run ERPLibre in production server](./doc/PRODUCTION.md).
-##### 3. Execute the script:
-```
-sudo ./script/odoo_install_production.sh
-```
-
-## Installation procedure locally
-
-##### 1. Clone the project:
-```
-git clone https://github.com/ERPLibre/ERPLibre.git
-```
-
-##### 2. Execute the script:
-```
-sudo ./script/odoo_install_locally.sh
-```
+## Development guide
+[Guide to run ERPLibre in development environment](./doc/DEVELOPMENT.md).
# Execution
-## First run
-```
-source ./venv/bin/activate
-python odoo/odoo-bin -c config.conf --log-level debug
-```
+[Guide to run ERPLibre with different case](./doc/RUN.md).
-## Update all
-Great idea to run it when update Odoo, update database of each modules.
-```
-python odoo/odoo-bin -c config.conf -d [DATABASE] -u all --log-level debug
-```
-
-## Update module
-```
-python odoo/odoo-bin -c config.conf -d [DATABASE] -u [module] --log-level debug
-```
-
-## Test
-```
-python odoo/odoo-bin -c config.conf -d [DATABASE] -i [module to test] --test-enable --stop-after-init --log-level=test --test-tags [module_name][tags]
-```
-
-# Production
-```
-python odoo/odoo-bin -c config.conf -d [DATABASE] --no-database-list
-```
-
-# Thanks
-Thanks Yenthe Van Ginneken for your guides.
\ No newline at end of file
+# git-repo
+To change repository like addons, see [GIT_REPO.md](doc/GIT_REPO.md)
diff --git a/addons/ERPLibre_erplibre_addons b/addons/ERPLibre_erplibre_addons
deleted file mode 160000
index e682637..0000000
--- a/addons/ERPLibre_erplibre_addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit e68263793556cc0ec0af91be612421613b5cf7a2
diff --git a/addons/MathBenTech_development b/addons/MathBenTech_development
deleted file mode 160000
index 097a500..0000000
--- a/addons/MathBenTech_development
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 097a5002dd6ec91512406f3add8bb7cad5372218
diff --git a/addons/MathBenTech_odoo-business-spending-management-quebec-canada b/addons/MathBenTech_odoo-business-spending-management-quebec-canada
deleted file mode 160000
index 745cb2e..0000000
--- a/addons/MathBenTech_odoo-business-spending-management-quebec-canada
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 745cb2ec3df909e6f3622b4ef19971e6e83b46b5
diff --git a/addons/MathBenTech_scrummer b/addons/MathBenTech_scrummer
deleted file mode 160000
index 38c04c8..0000000
--- a/addons/MathBenTech_scrummer
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 38c04c8f7b7fe897d166ded74dda9d8d76f7f4c4
diff --git a/addons/Numigi_odoo-base-addons b/addons/Numigi_odoo-base-addons
deleted file mode 160000
index 60bc1e5..0000000
--- a/addons/Numigi_odoo-base-addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 60bc1e5414ff3bf81a6d72831da2eaad94ccbcb2
diff --git a/addons/Numigi_odoo-entertainment-addons b/addons/Numigi_odoo-entertainment-addons
deleted file mode 160000
index 82c3325..0000000
--- a/addons/Numigi_odoo-entertainment-addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 82c33255261eff361a91da13b28e4e68a95b25dd
diff --git a/addons/Numigi_odoo-git-addons b/addons/Numigi_odoo-git-addons
deleted file mode 160000
index 96db417..0000000
--- a/addons/Numigi_odoo-git-addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 96db417669a631877c1439f617ac8c0cc6edfff9
diff --git a/addons/Numigi_odoo-hr-addons b/addons/Numigi_odoo-hr-addons
deleted file mode 160000
index 0034395..0000000
--- a/addons/Numigi_odoo-hr-addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 0034395bcdb38c02749644607f43ccac760dfb49
diff --git a/addons/Numigi_odoo-partner-addons b/addons/Numigi_odoo-partner-addons
deleted file mode 160000
index f0c54ff..0000000
--- a/addons/Numigi_odoo-partner-addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit f0c54ffb3409cd8e748ae5db19077c7c966cd57f
diff --git a/addons/Numigi_odoo-product-addons b/addons/Numigi_odoo-product-addons
deleted file mode 160000
index 36751bd..0000000
--- a/addons/Numigi_odoo-product-addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 36751bd3c6baced6a0b3f5ddb675d87cb04a745c
diff --git a/addons/Numigi_odoo-project-addons b/addons/Numigi_odoo-project-addons
deleted file mode 160000
index 4388a4c..0000000
--- a/addons/Numigi_odoo-project-addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4388a4ca61b87032e2c3783dc2740b299cd31b6f
diff --git a/addons/Numigi_odoo-purchase-addons b/addons/Numigi_odoo-purchase-addons
deleted file mode 160000
index 5d226ca..0000000
--- a/addons/Numigi_odoo-purchase-addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 5d226ca3887c77e31467a192a0fbe4066bf7842c
diff --git a/addons/Numigi_odoo-stock-addons b/addons/Numigi_odoo-stock-addons
deleted file mode 160000
index 3fe57c3..0000000
--- a/addons/Numigi_odoo-stock-addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 3fe57c3cad122d5a448239b46fda8bf76ea32493
diff --git a/addons/Numigi_odoo-survey-addons b/addons/Numigi_odoo-survey-addons
deleted file mode 160000
index 9e897ba..0000000
--- a/addons/Numigi_odoo-survey-addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 9e897bae38ff0d6d3180296a552d994bb10c0eff
diff --git a/addons/Numigi_odoo-timesheet-addons b/addons/Numigi_odoo-timesheet-addons
deleted file mode 160000
index d2bbb19..0000000
--- a/addons/Numigi_odoo-timesheet-addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit d2bbb19dc8f917272694ff0a6231275083fb7e74
diff --git a/addons/Numigi_odoo-web-addons b/addons/Numigi_odoo-web-addons
deleted file mode 160000
index 3a4aa46..0000000
--- a/addons/Numigi_odoo-web-addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 3a4aa46439a794429d5939cff561f42c4f312a99
diff --git a/addons/OCA_account-analytic b/addons/OCA_account-analytic
deleted file mode 160000
index 7ce9fe2..0000000
--- a/addons/OCA_account-analytic
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 7ce9fe25a7c977c5338001bc32d58b1cadffe51e
diff --git a/addons/OCA_account-budgeting b/addons/OCA_account-budgeting
deleted file mode 160000
index e175ffa..0000000
--- a/addons/OCA_account-budgeting
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit e175ffa84fb61f70de67a2732292e43bd490cefd
diff --git a/addons/OCA_account-closing b/addons/OCA_account-closing
deleted file mode 160000
index 40d40c7..0000000
--- a/addons/OCA_account-closing
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 40d40c73574bf65c91c879e0607b4ac455df06b2
diff --git a/addons/OCA_account-consolidation b/addons/OCA_account-consolidation
deleted file mode 160000
index 741fc50..0000000
--- a/addons/OCA_account-consolidation
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 741fc50366bd70fceb88a2a3fcb0449b2582ed31
diff --git a/addons/OCA_account-financial-reporting b/addons/OCA_account-financial-reporting
deleted file mode 160000
index 1e0f830..0000000
--- a/addons/OCA_account-financial-reporting
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 1e0f8301ca015b3c4c456401bc30c5f211ccae3f
diff --git a/addons/OCA_account-financial-tools b/addons/OCA_account-financial-tools
deleted file mode 160000
index 9721abd..0000000
--- a/addons/OCA_account-financial-tools
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 9721abd4c9db653e1d009f8a023e9f750523989f
diff --git a/addons/OCA_account-fiscal-rule b/addons/OCA_account-fiscal-rule
deleted file mode 160000
index f396ba6..0000000
--- a/addons/OCA_account-fiscal-rule
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit f396ba6a2e2acebaaff579f0e6991b669812d64d
diff --git a/addons/OCA_account-invoice-reporting b/addons/OCA_account-invoice-reporting
deleted file mode 160000
index 320dd9f..0000000
--- a/addons/OCA_account-invoice-reporting
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 320dd9fce4d212b2dcf5dc4447494964ad1e246d
diff --git a/addons/OCA_account-invoicing b/addons/OCA_account-invoicing
deleted file mode 160000
index 9db1c10..0000000
--- a/addons/OCA_account-invoicing
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 9db1c104341f422b8545c3f2906d83bcb69d46ac
diff --git a/addons/OCA_account-payment b/addons/OCA_account-payment
deleted file mode 160000
index 888debe..0000000
--- a/addons/OCA_account-payment
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 888debebd8e42c1ee5107577ca2f3bc5f38d72e1
diff --git a/addons/OCA_account-reconcile b/addons/OCA_account-reconcile
deleted file mode 160000
index 0390b11..0000000
--- a/addons/OCA_account-reconcile
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 0390b112def3d362d95232d382317511616ee6dd
diff --git a/addons/OCA_apps-store b/addons/OCA_apps-store
deleted file mode 160000
index 022d24d..0000000
--- a/addons/OCA_apps-store
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 022d24db4c6463f38b9f4452fe03c9fb8b3a44ce
diff --git a/addons/OCA_bank-payment b/addons/OCA_bank-payment
deleted file mode 160000
index 7e0e572..0000000
--- a/addons/OCA_bank-payment
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 7e0e572fb4772c8ebacfe52d58c396bdbd9e01f9
diff --git a/addons/OCA_bank-statement-import b/addons/OCA_bank-statement-import
deleted file mode 160000
index 1983065..0000000
--- a/addons/OCA_bank-statement-import
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 198306503b51371c8603fd8defef65fcd82bf954
diff --git a/addons/OCA_brand b/addons/OCA_brand
deleted file mode 160000
index 601a8c5..0000000
--- a/addons/OCA_brand
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 601a8c5c741b3035000f2337feab16325e6b9a49
diff --git a/addons/OCA_business-requirement b/addons/OCA_business-requirement
deleted file mode 160000
index dd74e74..0000000
--- a/addons/OCA_business-requirement
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit dd74e74583861b44c6120473ba0b56c90b887334
diff --git a/addons/OCA_commission b/addons/OCA_commission
deleted file mode 160000
index e679120..0000000
--- a/addons/OCA_commission
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit e679120a6d8f910cba81d949ecddd7b89f48fc01
diff --git a/addons/OCA_community-data-files b/addons/OCA_community-data-files
deleted file mode 160000
index 2b17e55..0000000
--- a/addons/OCA_community-data-files
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 2b17e5567d1bcb8ca377268615f209fdd57dc66e
diff --git a/addons/OCA_connector-telephony b/addons/OCA_connector-telephony
deleted file mode 160000
index 6d9df10..0000000
--- a/addons/OCA_connector-telephony
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 6d9df1037a97dbf791a7f0a717846a63144174bb
diff --git a/addons/OCA_contract b/addons/OCA_contract
deleted file mode 160000
index 3e53134..0000000
--- a/addons/OCA_contract
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 3e531348cb51aeb2cc16c16ab8a2b693756ba47f
diff --git a/addons/OCA_credit-control b/addons/OCA_credit-control
deleted file mode 160000
index a97496a..0000000
--- a/addons/OCA_credit-control
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit a97496a829cadc0d9be07d7825e93062417ab670
diff --git a/addons/OCA_currency b/addons/OCA_currency
deleted file mode 160000
index 5c0d54e..0000000
--- a/addons/OCA_currency
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 5c0d54e37789ecc24bebbe53fa56a92a492575bb
diff --git a/addons/OCA_data-protection b/addons/OCA_data-protection
deleted file mode 160000
index ce4f334..0000000
--- a/addons/OCA_data-protection
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit ce4f334a1077b5c15d457f22daaa48b9f639409e
diff --git a/addons/OCA_donation b/addons/OCA_donation
deleted file mode 160000
index aa6478a..0000000
--- a/addons/OCA_donation
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit aa6478a72c9673ad6458de19aa2362397c613fae
diff --git a/addons/OCA_e-commerce b/addons/OCA_e-commerce
deleted file mode 160000
index d7c99e5..0000000
--- a/addons/OCA_e-commerce
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit d7c99e565f25b495b3c0d252f181d8df4490a757
diff --git a/addons/OCA_edi b/addons/OCA_edi
deleted file mode 160000
index 742b131..0000000
--- a/addons/OCA_edi
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 742b1316773f8a1b224e42c65c3c3a7685481a30
diff --git a/addons/OCA_event b/addons/OCA_event
deleted file mode 160000
index e2bdf12..0000000
--- a/addons/OCA_event
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit e2bdf12c61e9967eeb9abc618c79ca43b464ea7f
diff --git a/addons/OCA_helpdesk b/addons/OCA_helpdesk
deleted file mode 160000
index 6b84f81..0000000
--- a/addons/OCA_helpdesk
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 6b84f81c81ff3184526c0ca86ced7bbcdcc4c0b3
diff --git a/addons/OCA_hr b/addons/OCA_hr
deleted file mode 160000
index 4743acf..0000000
--- a/addons/OCA_hr
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4743acf7ab796ea3738743a44c62cd516126ec53
diff --git a/addons/OCA_knowledge b/addons/OCA_knowledge
deleted file mode 160000
index 9ae45f7..0000000
--- a/addons/OCA_knowledge
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 9ae45f798bbefa854b03f612e22291ac1b95568d
diff --git a/addons/OCA_l10n-canada b/addons/OCA_l10n-canada
deleted file mode 160000
index 5680b48..0000000
--- a/addons/OCA_l10n-canada
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 5680b485cdfa0b6f1c2f4e32356b5938a9752c00
diff --git a/addons/OCA_maintenance b/addons/OCA_maintenance
deleted file mode 160000
index 4e521ec..0000000
--- a/addons/OCA_maintenance
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4e521ec35f6e8b66f86a62db644dadc9206b476e
diff --git a/addons/OCA_management-system b/addons/OCA_management-system
deleted file mode 160000
index 479afcc..0000000
--- a/addons/OCA_management-system
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 479afcc65ee29530e2bcaa7342f93b6783d14d97
diff --git a/addons/OCA_manufacture b/addons/OCA_manufacture
deleted file mode 160000
index ce36844..0000000
--- a/addons/OCA_manufacture
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit ce36844281754a75b527c4ace21837c8a16b75ab
diff --git a/addons/OCA_margin-analysis b/addons/OCA_margin-analysis
deleted file mode 160000
index 4a50437..0000000
--- a/addons/OCA_margin-analysis
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4a50437ecfa591a72e12255448d38d0fb1037a42
diff --git a/addons/OCA_mis-builder b/addons/OCA_mis-builder
deleted file mode 160000
index 5d76972..0000000
--- a/addons/OCA_mis-builder
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 5d7697296ad90794599373940e6fc6cead8ca1a2
diff --git a/addons/OCA_multi-company b/addons/OCA_multi-company
deleted file mode 160000
index fdb4d25..0000000
--- a/addons/OCA_multi-company
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit fdb4d255b6a3b51925f8a226bfebf2eccabd2786
diff --git a/addons/OCA_partner-contact b/addons/OCA_partner-contact
deleted file mode 160000
index a79e576..0000000
--- a/addons/OCA_partner-contact
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit a79e57685caad7d0dec9318378fdd46862e31be4
diff --git a/addons/OCA_pos b/addons/OCA_pos
deleted file mode 160000
index 6a922b3..0000000
--- a/addons/OCA_pos
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 6a922b3d87491d59128a097f286be1e3f3fc11df
diff --git a/addons/OCA_product-attribute b/addons/OCA_product-attribute
deleted file mode 160000
index ea48097..0000000
--- a/addons/OCA_product-attribute
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit ea48097094462e67d7e1558b333da78c6038b89c
diff --git a/addons/OCA_product-pack b/addons/OCA_product-pack
deleted file mode 160000
index b9eccbd..0000000
--- a/addons/OCA_product-pack
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit b9eccbdb9ae0fdd3ed1138270c3eff3142a015c3
diff --git a/addons/OCA_product-variant b/addons/OCA_product-variant
deleted file mode 160000
index fb4f404..0000000
--- a/addons/OCA_product-variant
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit fb4f4042b3ca0ee6cde6ab0625e2c914b96b174f
diff --git a/addons/OCA_project b/addons/OCA_project
deleted file mode 160000
index 4390f1f..0000000
--- a/addons/OCA_project
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4390f1ffa9f00058b0d1aa7fae27fb74bbefb83b
diff --git a/addons/OCA_project-reporting b/addons/OCA_project-reporting
deleted file mode 160000
index 7f71f08..0000000
--- a/addons/OCA_project-reporting
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 7f71f086dd732170e7605dfdf80e6cc4969a711e
diff --git a/addons/OCA_purchase-workflow b/addons/OCA_purchase-workflow
deleted file mode 160000
index d174367..0000000
--- a/addons/OCA_purchase-workflow
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit d17436791bcfbe0985af137163564af3fe90bbe1
diff --git a/addons/OCA_queue b/addons/OCA_queue
deleted file mode 160000
index 0b71a39..0000000
--- a/addons/OCA_queue
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 0b71a3951b583f154f170adacf4920e6d7138329
diff --git a/addons/OCA_reporting-engine b/addons/OCA_reporting-engine
deleted file mode 160000
index 14fba65..0000000
--- a/addons/OCA_reporting-engine
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 14fba657a0dbda1258edcf3c92886866e7cecf67
diff --git a/addons/OCA_sale-workflow b/addons/OCA_sale-workflow
deleted file mode 160000
index 4b20035..0000000
--- a/addons/OCA_sale-workflow
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4b200358312689d944aaaf012c5723bb2bc9cb77
diff --git a/addons/OCA_server-auth b/addons/OCA_server-auth
deleted file mode 160000
index f911c9f..0000000
--- a/addons/OCA_server-auth
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit f911c9f31a064cca3012431b70e60a7b89448138
diff --git a/addons/OCA_server-brand b/addons/OCA_server-brand
deleted file mode 160000
index d8f27b0..0000000
--- a/addons/OCA_server-brand
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit d8f27b04475d3cc74a7bebb1e086f647f5e01569
diff --git a/addons/OCA_server-env b/addons/OCA_server-env
deleted file mode 160000
index 19af535..0000000
--- a/addons/OCA_server-env
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 19af535b3aedd5c1fdfbe911dacfc43ae31edb71
diff --git a/addons/OCA_server-tools b/addons/OCA_server-tools
deleted file mode 160000
index d97aaa9..0000000
--- a/addons/OCA_server-tools
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit d97aaa9fa2f01f64ebf7100668e0901fde35d42f
diff --git a/addons/OCA_server-ux b/addons/OCA_server-ux
deleted file mode 160000
index 655b3cc..0000000
--- a/addons/OCA_server-ux
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 655b3cc291a7e3718371a45ebe6f2e0952896adf
diff --git a/addons/OCA_social b/addons/OCA_social
deleted file mode 160000
index 7b0836b..0000000
--- a/addons/OCA_social
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 7b0836bf7a5c40db332dd90d5ebef619234060ac
diff --git a/addons/OCA_stock-logistics-warehouse b/addons/OCA_stock-logistics-warehouse
deleted file mode 160000
index a591de1..0000000
--- a/addons/OCA_stock-logistics-warehouse
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit a591de15150f7b16c1ef23d2fc30c814874dea27
diff --git a/addons/OCA_timesheet b/addons/OCA_timesheet
deleted file mode 160000
index 8625e65..0000000
--- a/addons/OCA_timesheet
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 8625e65414801780c91e91bf93b2ed32567f8117
diff --git a/addons/OCA_web b/addons/OCA_web
deleted file mode 160000
index b65c492..0000000
--- a/addons/OCA_web
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit b65c492f4011fe4e9dac8c0a26eeef8c43cb1c39
diff --git a/addons/OCA_website b/addons/OCA_website
deleted file mode 160000
index 603a44d..0000000
--- a/addons/OCA_website
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 603a44d53a2e7a457560a0f99bdcc95780399ee5
diff --git a/addons/OCA_wms b/addons/OCA_wms
deleted file mode 160000
index e7a1541..0000000
--- a/addons/OCA_wms
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit e7a1541f8c513cf755bd82780c6c035d2fafc2ce
diff --git a/addons/SanteLibre_santelibre_addons b/addons/SanteLibre_santelibre_addons
deleted file mode 160000
index ee94058..0000000
--- a/addons/SanteLibre_santelibre_addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit ee94058aecee418b3652864f23b54a86ba0f92f4
diff --git a/addons/Smile-SA_odoo_addons b/addons/Smile-SA_odoo_addons
deleted file mode 160000
index 2be318c..0000000
--- a/addons/Smile-SA_odoo_addons
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 2be318c18ac5b0fe2129cc61d86419033ff07d5f
diff --git a/addons/addons/.gitkeep b/addons/addons/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/addons/muk-it_muk_base b/addons/muk-it_muk_base
deleted file mode 160000
index d888c96..0000000
--- a/addons/muk-it_muk_base
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit d888c9695292295a732fcdd4a7b9820978df5e7f
diff --git a/addons/muk-it_muk_dms b/addons/muk-it_muk_dms
deleted file mode 160000
index 020e604..0000000
--- a/addons/muk-it_muk_dms
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 020e604d635a229c09a07e839d95f8e37706606a
diff --git a/addons/muk-it_muk_docs b/addons/muk-it_muk_docs
deleted file mode 160000
index a8ea02b..0000000
--- a/addons/muk-it_muk_docs
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit a8ea02b9f00ae9fe5d2ea25ac43d23532cc11d45
diff --git a/addons/muk-it_muk_misc b/addons/muk-it_muk_misc
deleted file mode 160000
index 37b9d6d..0000000
--- a/addons/muk-it_muk_misc
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 37b9d6dc20fa686a323057b160015bfc2c2c8143
diff --git a/addons/muk-it_muk_quality b/addons/muk-it_muk_quality
deleted file mode 160000
index 1a4c6f2..0000000
--- a/addons/muk-it_muk_quality
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 1a4c6f25c5e4fe0029d406d6283555bd23a44d27
diff --git a/addons/muk-it_muk_web b/addons/muk-it_muk_web
deleted file mode 160000
index 431d86d..0000000
--- a/addons/muk-it_muk_web
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 431d86d6694e846b407c84f00a31a10f0cf5b83b
diff --git a/addons/muk-it_muk_website b/addons/muk-it_muk_website
deleted file mode 160000
index c1e6c17..0000000
--- a/addons/muk-it_muk_website
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit c1e6c1755d09562f66247832bd01a0d580c43e23
diff --git a/addons/odooaktiv_QuotationRevision b/addons/odooaktiv_QuotationRevision
deleted file mode 160000
index 701438f..0000000
--- a/addons/odooaktiv_QuotationRevision
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 701438f9c59bd657de516d9ef4de1ba6167bf30b
diff --git a/addons/openeducat_openeducat_erp b/addons/openeducat_openeducat_erp
deleted file mode 160000
index 4a2a1d9..0000000
--- a/addons/openeducat_openeducat_erp
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 4a2a1d930d88a127959fd39af22f7d818e08663d
diff --git a/doc/CONTRIBUTION.md b/doc/CONTRIBUTION.md
new file mode 100644
index 0000000..c68c584
--- /dev/null
+++ b/doc/CONTRIBUTION.md
@@ -0,0 +1,16 @@
+# Thanks
+## AGILE OPS
+Thanks for contributing to GIT_REPO.
+- [Agile OPS](https://www.linkedin.com/in/michaelfaille/)
+
+## MathBenTech
+Thanks for creating this project.
+- [MathBen.Tech](https://mathben.tech)
+
+## TechnoLibre
+Thanks for making enterprise edition of ERPLibre.
+- [TechnoLibre](https://technolibre.ca)
+
+## Yenthe Van Ginneken
+Thanks Yenthe Van Ginneken for your scripting guides and tutorial.
+- [Yenthe666 InstallScript](https://github.com/Yenthe666/InstallScript)
diff --git a/doc/DEVELOPMENT.md b/doc/DEVELOPMENT.md
new file mode 100644
index 0000000..2e45e18
--- /dev/null
+++ b/doc/DEVELOPMENT.md
@@ -0,0 +1,87 @@
+# Development guide
+Setup your environment to develop modules and debug the platform.
+
+## Installation procedure locally
+### 1. Clone the project:
+```bash
+git clone https://github.com/ERPLibre/ERPLibre.git
+```
+
+### 2. Execute the script:
+```bash
+cd ERPLibre
+./script/install_dev.sh
+./script/install_locally_dev.sh
+```
+
+### 3. Run ERPLibre
+```bash
+./run.sh
+```
+
+## Fork project to create a new project independent of ERPLibre (deprecated)
+ERPLibre was created by this script. It's now deprecated.
+Use this script when you need to fork directly from the original source.
+Don't use this script if you want to update from ERPLibre and follow mainstream development.
+```bash
+./venv/bin/python ./script/fork_project.py --github_token GITHUB_KEY --organization NAME
+```
+
+# Fork all repo for you own organization
+Go to your github account and generate a token to access fork option with your user. Create an organization (or you can choose your user name).
+
+This command will fork all repos and ERPLibre to your own organization. It keeps track to ERPLibre.
+```bash
+./venv/bin/python ./script/fork_project_ERPLibre.py --github_token GITHUB_KEY --organization NAME
+```
+
+## Generate manifest from csv repo
+Add repo in file [./source_repo_addons.csv](./source_repo_addons.csv)
+
+Execute to generate manifest of Repo
+```bash
+./venv/bin/python ./script/fork_project_ERPLibre.py --skip_fork
+```
+
+## Move database prod to dev
+When moving database prod to your dev environment, you want to remove email servers, and install user test in order to test the database.
+Run:
+```bash
+./run.sh --stop-after-init -i user_test,disable_mail_server --dev all -d DATABASE
+```
+
+# TODO
+```bash
+./venv/bin/python ./script/git_change_remote.py
+```
+
+## Change git url https to git
+This will update all urls in git format:
+```bash
+./venv/bin/python ./script/git_change_remote_https_to_git.py
+```
+
+## Diff repo with another project
+Tools to display the differences between the repo and another project.
+```bash
+./venv/bin/python ./script/list_repo_diff.py --sync_to /path/to/project/erplibre --dyr_sync
+```
+
+## Sync repo with another project
+Tools to synchronise the repo with another project. This will show differences and try to checkout on the same commit in all repo.
+```bash
+./venv/bin/python ./script/git_change_remote.py --sync_to /path/to/project/erplibre
+```
+
+## Add repo
+Access to a new repo, add your URL to file [source_repo_addons.csv](../source_repo_addons.csv)
+
+Fork the repo to be able to push new code:
+```bash
+./venv/bin/python ./script/fork_project_ERPLibre.py
+```
+
+To regenerate only manifest.xml.
+```bash
+./venv/bin/python ./script/fork_project_ERPLibre.py --skip_fork
+```
diff --git a/doc/DISCOVER.md b/doc/DISCOVER.md
new file mode 100644
index 0000000..7a1fc0f
--- /dev/null
+++ b/doc/DISCOVER.md
@@ -0,0 +1,31 @@
+# Discover
+Explore the ERPLibre solution.
+
+## Fast installation
+### 1. Clone the project:
+```bash
+git clone https://github.com/ERPLibre/ERPLibre.git
+```
+
+### 2. Run installation locally:
+```bash
+cd ERPLibre
+./script/install_dev.sh
+./script/install_locally_dev.sh
+```
+
+### 3. Run ERPLibre
+```bash
+./run.sh
+```
+
+## Add repo
+Access to a new repo, add your URL to file [source_repo_addons.csv](../source_repo_addons.csv)
+
+Execute script:
+```bash
+./venv/bin/python ./script/git_repo_manifest.py
+./script/install_locally_dev.sh
+git commit -am "Add new repo"
+```
+[Update your repo.](./GIT_REPO.md)
diff --git a/doc/FAQ.md b/doc/FAQ.md
new file mode 100644
index 0000000..d5a29cc
--- /dev/null
+++ b/doc/FAQ.md
@@ -0,0 +1,21 @@
+# FAQ
+## git-repo
+### error.GitError fatal bad revision
+Example:
+```
+error.GitError: manifests rev-list (u'^2736dfd46e8a30cf59a9cd6e93d9e56e87021f2a', 'HEAD', '--'): fatal: bad revision 'HEAD'
+```
+
+Did you modify files in .repo?
+
+Anyways, to reset files from your branch into .repo:
+```bash
+cd .repo/manifests
+git branch -av
+> remotes/m/rel/8953/zd552kl/7.1.1-11.40.208 -> origin/rel/8953/zd552kl/7.1.1-11.40.208
+> remotes/origin/dev/ze550kl/asus/5.0.0-20150208 11a37fe set dev/ze550kl/asus/5.0.0-20150208
+> remotes/origin/rel/8953/zd552kl/7.1.1-11.40.208 2736dfd Remove opencv3 from the manifest
+# To reset the "remotes/origin" use the same as "remotes/m"
+git reset --hard REF_OF_REMOTES/m
+> git reset --hard remotes/origin/rel/8953/zd552kl/7.1.1-11.40.208
+```
\ No newline at end of file
diff --git a/doc/GIT_REPO.md b/doc/GIT_REPO.md
new file mode 100644
index 0000000..a2608c1
--- /dev/null
+++ b/doc/GIT_REPO.md
@@ -0,0 +1,54 @@
+# git-repo
+This is a guide to understand git-repo. Scripts in ERPLibre use git-repo automatically.
+
+[git-repo of Google](https://code.google.com/archive/p/git-repo) is used to manage all git repository under licence [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.html).
+
+## Setup repo
+```bash
+curl https://storage.googleapis.com/git-repo-downloads/repo > ./venv/repo
+```
+
+## prod
+```bash
+./venv/repo init -u http://git.erplibre.ca/ERPLibre -b 12.0_repo
+./venv/repo sync
+```
+
+## dev
+```bash
+./venv/repo init -u http://git.erplibre.ca/ERPLibre -b 12.0_repo -m ./manifest/default.dev.xml
+./venv/repo sync
+```
+
+## dev locally
+[Guide to setup locally git](https://railsware.com/blog/taming-the-git-daemon-to-quickly-share-git-repository/).
+```bash
+git daemon --base-path=. --export-all --reuseaddr --informative-errors --verbose &
+
+./venv/repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m ./manifest/default.dev.xml
+./venv/repo sync -m ./manifest/default.dev.xml
+```
+
+# Create Manifest
+A [Manifest](https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md), is a XML file managed by git-repo to generate repo.
+
+## Make a new version of prod
+Freezes all repo, from dev to prod.
+
+This will add revision git hash in the Manifest.
+```bash
+./venv/repo manifest -r -o ./manifest/default.xml
+```
+Do your commit.
+```bash
+git commit -am "[#ticket] subject: short sentence"
+```
+
+## Create a dev version
+```bash
+./venv/repo manifest -o ./manifest/default.dev.xml
+```
+Do your commit.
+```bash
+git commit -am "[#ticket] subject: short sentence"
+```
\ No newline at end of file
diff --git a/doc/HOWTO.md b/doc/HOWTO.md
new file mode 100644
index 0000000..b337e76
--- /dev/null
+++ b/doc/HOWTO.md
@@ -0,0 +1,3 @@
+# HOW TO
+## Update changelog
+Please, read documentation (keepachangelog.com)[https://keepachangelog.com]
\ No newline at end of file
diff --git a/MIGRATION.md b/doc/MIGRATION.md
similarity index 98%
rename from MIGRATION.md
rename to doc/MIGRATION.md
index 4dcfab3..77298e9 100644
--- a/MIGRATION.md
+++ b/doc/MIGRATION.md
@@ -6,7 +6,7 @@ TODO
## Migration procedure dev
-Example :
+Example:
update module helpdesk_mgmt and helpdesk_join_team
diff --git a/doc/PRODUCTION.md b/doc/PRODUCTION.md
new file mode 100644
index 0000000..880dfc3
--- /dev/null
+++ b/doc/PRODUCTION.md
@@ -0,0 +1,32 @@
+# ERPLibre production guide
+
+## Installation procedure production
+
+### 1. Clone the project:
+```bash
+git clone https://git.erplibre.ca/ERPLibre.git
+```
+
+### 2. Modify the parameters
+Modify the file env_var.sh for production installation.
+
+### 3. Execute the script:
+```bash
+cd ERPLibre
+./script/install_dev.sh
+./script/install_production.sh
+```
+
+## Production execution
+```bash
+cd /[EL_USER]/erplibre
+./run.sh -d [DATABASE] --no-database-list
+```
+
+## Move database prod to dev
+
+When moving database prod to your dev environment, you want to remove email servers, and install user test to test the database.
+Run:
+```bash
+./run.sh --stop-after-init -i user_test,disable_mail_server --dev all -d DATABASE
+```
diff --git a/doc/RELEASE.md b/doc/RELEASE.md
new file mode 100644
index 0000000..9e21f25
--- /dev/null
+++ b/doc/RELEASE.md
@@ -0,0 +1,21 @@
+# Release
+A guide on how to do a release.
+
+## Generate new prod
+```bash
+./venv/repo manifest -r -o ./manifest/default.xml
+```
+Do your commit.
+```bash
+git commit -am "[#ticket] subject: short sentence"
+```
+
+## Merge release
+Merge your feature to master. Generate a new tag. Fill CHANGELOG.md
+
+# TIPS
+## Compare diff repo with another ERPLibre project
+To generate a list of differences between repo git commit, do
+```bash
+./venv/bin/python ./script/git_change_remote.py --sync_to /path/to/directory
+```
\ No newline at end of file
diff --git a/doc/RUN.md b/doc/RUN.md
new file mode 100644
index 0000000..c1e1d0b
--- /dev/null
+++ b/doc/RUN.md
@@ -0,0 +1,41 @@
+# Execute ERPLibre
+
+## Start database
+```bash
+sudo systemctl start postgresql.service
+```
+
+## Run ERPLibre
+### Method 1
+Simply
+```bash
+./run.sh
+```
+
+With arguments
+```bash
+./run.sh -h
+```
+
+### Method 2
+Execute your own python script:
+```bash
+source ./venv/bin/activate
+python odoo/odoo-bin -c config.conf --log-level debug
+```
+
+### Update all
+Great idea to run it when updating Odoo, it updates database of each modules.
+```bash
+python odoo/odoo-bin -c config.conf -d [DATABASE] -u all --log-level debug
+```
+
+### Update module
+```bash
+python odoo/odoo-bin -c config.conf -d [DATABASE] -u [module] --log-level debug
+```
+
+### Test
+```bash
+python odoo/odoo-bin -c config.conf -d [DATABASE] -i [module to test] --test-enable --stop-after-init --log-level=test --test-tags [module_name][tags]
+```
\ No newline at end of file
diff --git a/doc/TODO.md b/doc/TODO.md
new file mode 100644
index 0000000..5650e49
--- /dev/null
+++ b/doc/TODO.md
@@ -0,0 +1,11 @@
+# Note healtcheck
+Table à vérifier dans pgsql: ir_ui_view
+
+Restore une BD:
+- un module est installé mais n'est pas physiquement là
+
+Une DB est installé mais on n'arrive pas à l'exécuté
+
+ HEALTHCHECK CMD curl --fail http://localhost:8069/web || exit 1
+
+ TODO: having the DB variable configurable
\ No newline at end of file
diff --git a/env_var.sh b/env_var.sh
index b7a945b..d919be9 100755
--- a/env_var.sh
+++ b/env_var.sh
@@ -1,30 +1,23 @@
-#!/bin/bash
-################################################################################
-# Script for installing Odoo on Ubuntu 14.04, 15.04, 16.04 and 18.04 (could be used for other version too)
-# Author: Yenthe Van Ginneken
-#-------------------------------------------------------------------------------
-# This script will install Odoo on your Ubuntu 16.04 server. It can install multiple Odoo instances
-# in one Ubuntu because of the different xmlrpc_ports
-#-------------------------------------------------------------------------------
-################################################################################
+#!/usr/bin/env bash
-OE_USER="odoo"
-OE_HOME="/${OE_USER}"
-OE_HOME_ODOO="${OE_HOME}/odoo"
-OE_HOME_EXT="${OE_HOME_ODOO}/odoo"
+EL_USER="erplibre"
+EL_HOME="/${EL_USER}"
+EL_HOME_ERPLIBRE="${EL_HOME}/erplibre"
+EL_HOME_ODOO="${EL_HOME_ERPLIBRE}/odoo"
# The default port where this Odoo instance will run under (provided you use the command -c in the terminal)
# Set to true if you want to install it, false if you don't need it or have it already installed.
-INSTALL_WKHTMLTOPDF="True"
-# Set the default Odoo port (you still have to use -c /etc/odoo-server.conf for example to use this.)
-OE_PORT="8069"
-OE_LONGPOLLING_PORT="8072"
+EL_INSTALL_WKHTMLTOPDF="True"
+# Set the default Odoo port
+EL_PORT="8069"
+EL_LONGPOLLING_PORT="8072"
# set the superadmin password
-OE_SUPERADMIN="admin"
-OE_VERSION="stable_prod_12.0"
-OE_CONFIG="${OE_USER}"
-MINIMAL_ADDONS="False"
+EL_SUPERADMIN="admin"
+EL_CONFIG="${EL_USER}"
+EL_MINIMAL_ADDONS="False"
# Set this to True if you want to install Nginx!
-INSTALL_NGINX="True"
+EL_INSTALL_NGINX="True"
# Set the website name
-WEBSITE_NAME="_"
-GITHUB_TOKEN=""
+EL_WEBSITE_NAME="_"
+EL_GITHUB_TOKEN=""
+EL_MANIFEST_PROD="./manifest/default.xml"
+EL_MANIFEST_DEV="./manifest/default.dev.xml"
diff --git a/manifest/default.dev.xml b/manifest/default.dev.xml
new file mode 100644
index 0000000..51c95b1
--- /dev/null
+++ b/manifest/default.dev.xml
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/manifest/default.xml b/manifest/default.xml
new file mode 100644
index 0000000..bc968b9
--- /dev/null
+++ b/manifest/default.xml
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odoo b/odoo
deleted file mode 160000
index 94bcbc9..0000000
--- a/odoo
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 94bcbc92e5e5a6fd3de7267e3c01f8c11fb045f4
diff --git a/requirements.txt b/requirements.txt
index ca82ce2..124164f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,4 +2,5 @@ giturlparse
agithub
gitpython
PyYAML
-retrying
\ No newline at end of file
+retrying
+xmltodict
\ No newline at end of file
diff --git a/run.md b/run.md
deleted file mode 100644
index ba722dc..0000000
--- a/run.md
+++ /dev/null
@@ -1,5 +0,0 @@
-== Start database ==
-sudo systemctl start postgresql.service
-
-== Run Odoo ==
-./venv/bin/python ./odoo/odoo-bin -c config.conf
diff --git a/run.sh b/run.sh
index 58f64fd..28b1df3 100755
--- a/run.sh
+++ b/run.sh
@@ -1,2 +1,2 @@
#!/usr/bin/env bash
-./venv/bin/python ./odoo/odoo-bin -c ./config.conf
+./venv/bin/python ./odoo/odoo-bin -c ./config.conf $@
diff --git a/script/addons_repo_origin.py b/script/addons_repo_origin.py
deleted file mode 100644
index 1112471..0000000
--- a/script/addons_repo_origin.py
+++ /dev/null
@@ -1,113 +0,0 @@
-#!/usr/bin/env python
-# dict config contains information about repository of original source
-# level 1: website of git
-# level 2: entity, organization, user
-# level 3: project name
-config = {
- "github.com": {
- "odoo": [
- "odoo",
- ],
- }
-}
-config_addons = {
- "github.com": {
- "MathBenTech": [
- "development",
- "odoo-business-spending-management-quebec-canada",
- "scrummer",
- ],
- "muk-it": [
- "muk_base",
- "muk_dms",
- "muk_docs",
- "muk_misc",
- "muk_quality",
- "muk_web",
- "muk_website",
- ],
- "Numigi": [
- "odoo-base-addons",
- "odoo-entertainment-addons",
- "odoo-git-addons",
- "odoo-hr-addons",
- "odoo-partner-addons",
- "odoo-product-addons",
- "odoo-project-addons",
- "odoo-purchase-addons",
- "odoo-stock-addons",
- "odoo-survey-addons",
- "odoo-timesheet-addons",
- "odoo-web-addons",
- ],
- "OCA": [
- "account-analytic",
- "account-budgeting",
- "account-closing",
- "account-consolidation",
- "account-financial-reporting",
- "account-fiscal-rule",
- "account-invoicing",
- "account-invoice-reporting",
- "account-payment",
- "account-reconcile",
- "apps-store",
- "bank-payment",
- "bank-statement-import",
- "brand",
- "business-requirement",
- "commission",
- "community-data-files",
- "connector-telephony",
- "contract",
- "credit-control",
- "currency",
- "data-protection",
- "donation",
- "e-commerce",
- "edi",
- "event",
- "helpdesk",
- "hr",
- "knowledge",
- "l10n-canada",
- "maintenance",
- "management-system",
- "manufacture",
- "margin-analysis",
- "mis-builder",
- "multi-company",
- "partner-contact",
- "pos",
- "product-attribute",
- "product-pack",
- "product-variant",
- "project",
- "project-reporting",
- "purchase-workflow",
- "queue",
- "reporting-engine",
- "sale-workflow",
- "server-auth",
- "server-brand",
- "server-env",
- "server-tools",
- "server-ux",
- "social",
- "stock-logistics-warehouse",
- "timesheet",
- "web",
- "website",
- "wms",
- ],
- "odooaktiv": [
- "QuotationRevision",
- ],
- "openeducat": [
- "openeducat_erp",
- ],
- "Smile-SA": [
- "odoo_addons",
- ],
- }
-}
diff --git a/script/fork_github_repo/__init__.py b/script/fork_github_repo/__init__.py
index fd213f4..1d7d081 100644
--- a/script/fork_github_repo/__init__.py
+++ b/script/fork_github_repo/__init__.py
@@ -147,7 +147,7 @@ def fork_and_clone_repo(
print("Error when forking repo %s" % forked_repo)
exit(1)
else:
- print("Forked %s to %s" % (upstream_url, forked_repo['ssh_url']))
+ print("Forked %s to %s" % (upstream_url, forked_repo['html_url']))
elif status == 202:
print("Forked repo %s already exists" % forked_repo['full_name'])
elif status != 200:
diff --git a/script/fork_project.py b/script/fork_project.py
index ce9a958..c2396a7 100644
--- a/script/fork_project.py
+++ b/script/fork_project.py
@@ -13,7 +13,7 @@ from script import fork_github_repo
from script.git_tool import GitTool
_logger = logging.getLogger(__name__)
-CST_GITHUB_TOKEN = "GITHUB_TOKEN"
+CST_EL_GITHUB_TOKEN = "EL_GITHUB_TOKEN"
def get_config():
@@ -37,7 +37,7 @@ def get_config():
parser.add_argument('--organization', dest="organization", default="ERPLibre",
help="Choose organization to fork and change all repo.")
parser.add_argument('--github_token', dest="github_token",
- default=config.get(CST_GITHUB_TOKEN),
+ default=config.get(CST_EL_GITHUB_TOKEN),
help="GitHub token generated by user")
args = parser.parse_args()
return args
@@ -50,7 +50,6 @@ def main():
if not github_token:
raise ValueError("Missing github_token")
repo_root = Repo(config.dir)
-
lst_repo = GitTool().get_source_repo_addons(repo_path=config.dir)
i = 0
total = len(lst_repo)
@@ -115,7 +114,7 @@ def main():
# Update origin to new repo
- GitTool().generate_odoo_install_locally()
+ GitTool().generate_install_locally()
if __name__ == '__main__':
diff --git a/script/fork_project_ERPLibre.py b/script/fork_project_ERPLibre.py
index 4917946..fb25b19 100644
--- a/script/fork_project_ERPLibre.py
+++ b/script/fork_project_ERPLibre.py
@@ -12,7 +12,7 @@ sys.path.append(new_path)
from script.git_tool import GitTool
_logger = logging.getLogger(__name__)
-CST_GITHUB_TOKEN = "GITHUB_TOKEN"
+CST_EL_GITHUB_TOKEN = "EL_GITHUB_TOKEN"
def get_config():
@@ -36,12 +36,11 @@ def get_config():
parser.add_argument('--organization', dest="organization", default="ERPLibre",
help="Choose organization to fork and change all repo.")
parser.add_argument("--skip_fork", action="store_true",
- help="Ignore fork to generate only dependancies like "
- ".gitmodules and odoo_install_locally.sh")
+ help="Ignore fork to generate only manifest.")
parser.add_argument('-f', "--force", action="store_true",
help="Force rewrite remote.")
parser.add_argument('--github_token', dest="github_token",
- default=config.get(CST_GITHUB_TOKEN),
+ default=config.get(CST_EL_GITHUB_TOKEN),
help="GitHub token generated by user")
args = parser.parse_args()
return args
@@ -53,79 +52,83 @@ def main():
git_tool = GitTool()
root_repo = Repo(config.dir)
- if not github_token:
+ if not github_token and not config.skip_fork:
raise ValueError("Missing github_token")
organization_name = config.organization
lst_repo = git_tool.get_source_repo_addons(repo_path=config.dir, add_repo_root=True)
lst_repo_organization = [git_tool.get_transformed_repo_info_from_url(
a.get("url"), repo_path=config.dir, organization_force=organization_name,
- is_submodule=a.get("is_submodule"), sub_path=a.get("sub_path"))
+ is_submodule=a.get("is_submodule"), sub_path=a.get("sub_path"),
+ revision=a.get("revision"), clone_depth=a.get("clone_depth"))
for a in lst_repo]
- i = 0
- total = len(lst_repo)
- for repo in lst_repo:
- i += 1
- print(f"Nb element {i}/{total}")
- url = repo.get("url")
- try:
- working_repo = Repo(repo.get("relative_path"))
- except git.exc.NoSuchPathError:
- # Check to fork
- # repo_info = git_tool.get_transformed_repo_info_from_url(
- # url, organization_force="ERPLibre",
- # is_submodule=repo.get("is_submodule"),
- # sub_path=repo.get("sub_path"))
- git_tool.fork_repo(upstream_url=url,
- github_token=github_token,
- organization_name="ERPLibre")
- repo_info = git_tool.get_transformed_repo_info_from_url(
- url, organization_force=organization_name,
- is_submodule=repo.get("is_submodule"), sub_path=repo.get("sub_path"))
- git_tool.fork_repo(upstream_url=url,
- github_token=github_token,
- organization_name=organization_name)
+ if not config.skip_fork:
+ i = 0
+ total = len(lst_repo)
+ for repo in lst_repo:
+ i += 1
+ print(f"Nb element {i}/{total} - {repo.get('project_name')}")
+ url = repo.get("url")
- git_tool.add_and_fetch_remote(repo_info, root_repo=root_repo)
- continue
+ try:
+ working_repo = Repo(repo.get("relative_path"))
+ except git.exc.NoSuchPathError:
+ # Check to fork
+ # repo_info = git_tool.get_transformed_repo_info_from_url(
+ # url, organization_force="ERPLibre",
+ # is_submodule=repo.get("is_submodule"),
+ # sub_path=repo.get("sub_path"))
+ git_tool.fork_repo(upstream_url=url,
+ github_token=github_token,
+ organization_name="ERPLibre")
+ repo_info = git_tool.get_transformed_repo_info_from_url(
+ url, organization_force=organization_name,
+ is_submodule=repo.get("is_submodule"),
+ sub_path=repo.get("sub_path"))
+ git_tool.fork_repo(upstream_url=url,
+ github_token=github_token,
+ organization_name=organization_name)
- dct_remote_name = {a.name: a for a in working_repo.remotes}
- remote_origin = dct_remote_name.get("origin")
- remote_erplibre = dct_remote_name.get("ERPLibre")
- remote_organization = dct_remote_name.get(organization_name)
+ # git_tool.add_and_fetch_remote(repo_info, root_repo=root_repo)
+ continue
+
+ dct_remote_name = {a.name: a for a in working_repo.remotes}
+ remote_origin = dct_remote_name.get("origin")
+ remote_erplibre = dct_remote_name.get("ERPLibre")
+ remote_organization = dct_remote_name.get(organization_name)
- if not config.skip_fork:
if not remote_erplibre:
repo_info = git_tool.get_transformed_repo_info_from_url(
url, organization_force="ERPLibre",
is_submodule=repo.get("is_submodule"),
sub_path=repo.get("sub_path"))
- git_tool.add_and_fetch_remote(repo_info)
+ # git_tool.add_and_fetch_remote(repo_info)
git_tool.fork_repo(url, github_token,
organization_name=organization_name,
)
- repo_info = git_tool.get_transformed_repo_info_from_url(
- url, organization_force=organization_name,
- is_submodule=repo.get("is_submodule"), sub_path=repo.get("sub_path"))
- if remote_origin:
- working_repo.git.remote("remove", "origin")
- repo_info.organization = "origin"
- try:
- git_tool.add_and_fetch_remote(repo_info, root_repo=root_repo)
- except Exception as e:
- print(e)
- if config.force and remote_organization:
- working_repo.git.remote("remove", organization_name)
+ repo_info = git_tool.get_transformed_repo_info_from_url(
+ url, organization_force=organization_name,
+ is_submodule=repo.get("is_submodule"), sub_path=repo.get("sub_path"))
+ if remote_origin:
+ working_repo.git.remote("remove", "origin")
+ repo_info.organization = "origin"
+ # try:
+ # git_tool.add_and_fetch_remote(repo_info, root_repo=root_repo)
+ # except Exception as e:
+ # print(e)
+ if config.force and remote_organization:
+ working_repo.git.remote("remove", organization_name)
- repo_info.organization = organization_name
- git_tool.add_and_fetch_remote(repo_info)
+ repo_info.organization = organization_name
+ # git_tool.add_and_fetch_remote(repo_info)
# Update origin to new repo
- git_tool.generate_git_modules(lst_repo_organization, repo_path=config.dir)
- git_tool.generate_odoo_install_locally()
+ # git_tool.generate_git_modules(lst_repo_organization, repo_path=config.dir)
+ git_tool.generate_repo_manifest(lst_repo_organization, repo_path=config.dir)
+ git_tool.generate_install_locally()
if __name__ == '__main__':
diff --git a/script/git_change_remote.py b/script/git_change_remote.py
index 4679d96..91b1282 100755
--- a/script/git_change_remote.py
+++ b/script/git_change_remote.py
@@ -10,11 +10,10 @@ from retrying import retry # pip install retrying
new_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(new_path)
-from script import fork_github_repo
from script import git_tool
_logger = logging.getLogger(__name__)
-CST_GITHUB_TOKEN = "GITHUB_TOKEN"
+CST_EL_GITHUB_TOKEN = "EL_GITHUB_TOKEN"
def get_config():
@@ -36,18 +35,20 @@ def get_config():
parser.add_argument('-d', '--dir', dest="dir", default="./",
help="Path of repo to change remote, including submodule.")
parser.add_argument('--github_token', dest="github_token",
- default=config.get(CST_GITHUB_TOKEN),
+ default=config.get(CST_EL_GITHUB_TOKEN),
help="GitHub token generated by user")
parser.add_argument("--open_web_browser", action="store_true",
help="Open web browser for each repo.")
parser.add_argument("--generate_only_install_locally", action="store_true",
- help="Only generate script odoo_install_locally.sh.")
- parser.add_argument("--generate_repo_source_from_building", action="store_true",
- help=f"Only generate "
- f"{git_tool.CST_FILE_SOURCE_REPO_ADDONS_ODOO}")
+ help="Only generate script install_locally.sh.")
parser.add_argument("--sync_to", dest="sync_to",
- help=f"Only synchronize matching repo, use path compare to "
- f"repo.")
+ help="Only synchronize matching repo, use path compare to "
+ "repo.")
+ parser.add_argument("--dry_sync", dest="dry_sync", action="store_true",
+ help="Don't apply modification when sync_to.")
+ parser.add_argument("--sync_with_submodule", dest="sync_with_submodule",
+ action="store_true",
+ help="Remote directory use submodule to sync.")
args = parser.parse_args()
return args
@@ -58,24 +59,23 @@ def main():
config = get_config()
if config.generate_only_install_locally:
+ print("Generate config file locally.")
gt = git_tool.GitTool()
- gt.generate_odoo_install_locally()
- return
-
- if config.generate_repo_source_from_building:
- gt = git_tool.GitTool()
- gt.generate_repo_source_from_building()
+ gt.generate_install_locally()
return
if config.sync_to:
+ if config.sync_to[-1] != "/":
+ config.sync_to += "/"
gt = git_tool.GitTool()
result = gt.get_matching_repo(repo_compare_to=config.sync_to,
- force_normalize_compare=True)
- gt.sync_to(result)
+ force_normalize_compare=True,
+ sync_with_submodule=config.sync_with_submodule)
+ gt.sync_to(result, checkout_when_diff=not config.dry_sync)
return
# repo_root = Repo(".")
- lst_repo = git_tool.GitTool.get_repo_info_submodule(repo_path=config.dir)
+ lst_repo = git_tool.GitTool.get_repo_info(repo_path=config.dir)
i = 0
total = len(lst_repo)
for repo in lst_repo:
diff --git a/script/git_change_remote_https_to_git.py b/script/git_change_remote_https_to_git.py
index 5b055bb..ebdbeec 100755
--- a/script/git_change_remote_https_to_git.py
+++ b/script/git_change_remote_https_to_git.py
@@ -34,11 +34,9 @@ def get_config():
)
parser.add_argument('-d', '--dir', dest="dir", default="./",
help="Path of repo to change remote, including submodule.")
- parser.add_argument('-f', '--upstream', dest="upstream", default="origin",
- help="Upstream name to change address https to git.")
- # TODO support all_upstream
- # parser.add_argument("--all_upstream", action="store_true",
- # help="Replace for all existing upstream for each repo.")
+ parser.add_argument('-f', '--upstream', dest="upstream",
+ help="Upstream name to change address https to git. "
+ "When empty, all upstream is updated.")
parser.add_argument("--git_to_https", action="store_true",
help="Replace all repo git to https.")
args = parser.parse_args()
@@ -50,20 +48,24 @@ def main():
config = get_config()
upstream_name = config.upstream
- lst_repo = git_tool.get_repo_info_submodule(config.dir, add_root=True,
- upstream=upstream_name)
+ lst_repo = git_tool.get_repo_info(config.dir, add_root=True)
i = 0
total = len(lst_repo)
for repo in lst_repo:
i += 1
print(f"Nb element {i}/{total}")
repo_sm = Repo(repo.get("name"))
- remote_upstream_name = [a for a in repo_sm.remotes if upstream_name == a.name]
- new_url = repo.get("url_https") if config.git_to_https else repo.get("url_git")
+ if upstream_name:
+ remote_upstream_name = [a for a in repo_sm.remotes
+ if upstream_name == a.name]
+ else:
+ remote_upstream_name = [a for a in repo_sm.remotes]
for remote in remote_upstream_name:
+ url, url_https, url_git = git_tool.get_url(remote.url)
+ new_url = url_https if config.git_to_https else url_git
remote.set_url(new_url)
- print('Remote "%s" created for %s' % (upstream_name, new_url))
+ print(f'Remote "{remote.name}" update for {new_url}')
if __name__ == '__main__':
diff --git a/script/git_repo_manifest.py b/script/git_repo_manifest.py
new file mode 100644
index 0000000..e2b634a
--- /dev/null
+++ b/script/git_repo_manifest.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+import os
+import sys
+import argparse
+import logging
+
+new_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
+sys.path.append(new_path)
+
+from script.git_tool import GitTool
+
+_logger = logging.getLogger(__name__)
+
+
+def get_config():
+ """Parse command line arguments, extracting the config file name,
+ returning the union of config file and command line arguments
+
+ :return: dict of config file settings and command line arguments
+ """
+ # TODO update description
+ parser = argparse.ArgumentParser(
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ description='''\
+''',
+ epilog='''\
+'''
+ )
+ parser.add_argument('-d', '--dir', dest="dir", default="./",
+ help="Path of repo to change remote, including submodule.")
+ parser.add_argument('--clear', action="store_true",
+ help="Create a new manifest and clear old configuration.")
+ args = parser.parse_args()
+ return args
+
+
+def main():
+ config = get_config()
+ git_tool = GitTool()
+
+ lst_repo = git_tool.get_source_repo_addons(repo_path=config.dir, add_repo_root=True)
+ lst_repo_organization = [git_tool.get_transformed_repo_info_from_url(
+ a.get("url"), repo_path=config.dir, get_obj=True,
+ is_submodule=a.get("is_submodule"), sub_path=a.get("sub_path"),
+ revision=a.get("revision"), clone_depth=a.get("clone_depth"))
+ for a in lst_repo]
+
+ # Update origin to new repo
+ if not config.clear:
+ dct_remote, dct_project = git_tool.get_manifest_xml_info(repo_path=config.dir,
+ add_root=True)
+ else:
+ dct_remote = {}
+ dct_project = {}
+ git_tool.generate_repo_manifest(lst_repo_organization, repo_path=config.dir,
+ dct_remote=dct_remote, dct_project=dct_project)
+ git_tool.generate_install_locally()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/script/git_tool.py b/script/git_tool.py
index e8d647f..8bec5d2 100644
--- a/script/git_tool.py
+++ b/script/git_tool.py
@@ -2,18 +2,19 @@
# © 2020 TechnoLibre (http://www.technolibre.ca)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import os
-from . import addons_repo_origin
import webbrowser
from retrying import retry # pip install retrying
from agithub.GitHub import GitHub # pip install agithub
from giturlparse import parse # pip install giturlparse
+import xmltodict
+from collections import OrderedDict
from git import Repo
import git
from typing import List
-CST_FILE_SOURCE_REPO_ADDONS_ODOO = "source_repo_addons_odoo.csv"
-CST_GITHUB_TOKEN = "GITHUB_TOKEN"
+CST_FILE_SOURCE_REPO_ADDONS = "source_repo_addons.csv"
+CST_EL_GITHUB_TOKEN = "EL_GITHUB_TOKEN"
class Struct(object):
@@ -42,15 +43,20 @@ class GitTool:
get_obj: bool = True,
is_submodule: bool = True,
organization_force: str = None,
- sub_path: str = "addons") -> object:
+ sub_path: str = "addons",
+ revision: str = "",
+ clone_depth: str = "") -> object:
"""
:param url:
:param repo_path:
:param get_obj:
:param is_submodule:
- :param path:
:param organization_force: Keep repo_path and change organization
+ :param sub_path:
+ :param revision: Tag or branch name. When empty, use default branch.
+ :param clone_depth: length of git history to clone. Clone all git when empty.
+ Set to 0 to increase speed to clone, set to empty for development.
:return:
"""
_, url_https, url_git = self.get_url(url)
@@ -72,18 +78,30 @@ class GitTool:
relative_path = f"{repo_path}/{path}"
relative_path = os.path.normpath(relative_path)
+ original_organization = organization
+ url_https_original_organization = url_https[:url_https.rfind("/")]
+ project_name = url_https[url_https.rfind("/") + 1:]
+ # begin_original = url_git[url_git.find(":") + 1:]
+ # original_organization = begin_original[:begin_original.find("/")]
if organization_force:
organization = organization_force
url_split = url_https.split("/")
url_split[3] = organization
url_https = "/".join(url_split)
url, _, url_git = self.get_url(url_https)
+ url_https_organization = url_https[:url_https.rfind("/")]
d = {
"url": url,
"url_git": url_git,
"url_https": url_https,
"organization": organization,
+ "original_organization": original_organization,
+ "url_https_organization": url_https_organization,
+ "url_https_original_organization": url_https_original_organization,
+ "project_name": project_name,
+ "revision": revision,
+ "clone_depth": clone_depth,
"repo_name": repo_name,
"path": path,
"relative_path": relative_path,
@@ -94,9 +112,15 @@ class GitTool:
return Struct(**d)
return d
- @staticmethod
- def get_repo_info_submodule(repo_path: str = "./", add_root: bool = False,
- upstream: str = "origin") -> list:
+ def get_repo_info(self, repo_path: str = "./",
+ add_root: bool = False, is_manifest: bool = True):
+ if is_manifest:
+ return self.get_repo_info_manifest_xml(repo_path=repo_path,
+ add_root=add_root)
+ return self.get_repo_info_submodule(repo_path=repo_path, add_root=add_root)
+
+ def get_repo_info_submodule(self, repo_path: str = "./",
+ add_root: bool = False) -> list:
"""
Get information about submodule from repo_path
:param repo_path: path of repo to get information about submodule
@@ -139,12 +163,7 @@ class GitTool:
continue
elif line[:7] == "\turl = ":
url = line[7:-1]
- if "https" in url:
- url_git = f"git@{url[8:].replace('/', ':', 1)}"
- url_https = url
- else:
- url_https = f"https://{(url[4:]).replace(':', '/')}"
- url_git = url
+ url, url_https, url_git = self.get_url(url)
continue
elif line[:8] == "\tpath = ":
path = line[8:-1]
@@ -168,12 +187,7 @@ class GitTool:
if add_root:
repo_root = Repo(repo_path)
url = repo_root.git.remote("get-url", "origin")
- if "https" in url:
- url_git = f"git@{url[8:].replace('/', ':', 1)}"
- url_https = url
- else:
- url_https = f"https://{(url[4:]).replace(':', '/')}"
- url_git = url
+ url, url_https, url_git = self.get_url(url)
data = {
"url": url,
@@ -187,10 +201,12 @@ class GitTool:
lst_repo = sorted(lst_repo, key=lambda k: k.get("name"))
return lst_repo
- @staticmethod
- def get_repo_info_from_data_structure(repo_path="./", ignore_odoo=False):
+ def get_repo_info_manifest_xml(self, repo_path: str = "./",
+ add_root: bool = False) -> list:
"""
- Deprecated, read file addons_repo_origin to obtains repo list.
+ Get information about manifest of Repo from repo_path
+ :param repo_path: path of repo to get information about submodule
+ :param add_root: add information about root repository
:return:
[{
"url": original_url,
@@ -201,36 +217,79 @@ class GitTool:
"name": name of the submodule
}]
"""
- dct_config = {
- "addons": addons_repo_origin.config_addons
- }
- if not ignore_odoo:
- dct_config[""] = addons_repo_origin.config
- result = []
- for c_path, dct_config in dct_config.items():
- for server, dct_organization in dct_config.items():
- for organization, lst_repo in dct_organization.items():
- for repo in lst_repo:
- url = f"https://{server}/{organization}/{repo}.git"
- url_https = f"https://{server}/{organization}/{repo}.git"
- url_git = f"git@{server}:{organization}/{repo}.git"
- if not c_path:
- path = f"{repo}"
- else:
- path = f"{c_path}/{organization}_{repo}"
+ manifest_file = self.get_manifest_file(repo_path=repo_path)
+ filename = f"{repo_path}{manifest_file}"
+ lst_repo = []
+ with open(filename) as xml:
+ xml_as_string = xml.read()
+ xml_dict = xmltodict.parse(xml_as_string, dict_constructor=dict)
+ dct_manifest = xml_dict.get("manifest")
+ default_remote = dct_manifest.get("default").get("@remote")
+ lst_remote = dct_manifest.get("remote")
+ if type(lst_remote) is dict:
+ lst_remote = [lst_remote]
+ lst_project = dct_manifest.get("project")
+ if type(lst_project) is dict:
+ lst_project = [lst_project]
+ dct_remote = {a.get("@name"): a.get("@fetch") for a in lst_remote}
+ for project in lst_project:
+ # get name and remote .git
+ path = project.get("@path")
+ name = path
+ url_prefix = dct_remote.get(project.get("@remote"))
+ if not url_prefix:
+ # get default remote
+ url_prefix = dct_remote.get(default_remote)
+ url = f"{url_prefix}{project.get('@name')}"
+ url, url_https, url_git = self.get_url(url)
+ data = {
+ "url": url,
+ "url_https": url_https,
+ "url_git": url_git,
+ "path": path,
+ "relative_path": f"{repo_path}/{path}",
+ "name": name,
+ }
+ lst_repo.append(data)
- name = path
- result.append(
- {
- "url": url,
- "url_https": url_https,
- "url_git": url_git,
- "relative_path": f"{repo_path}/{path}",
- "path": path,
- "name": name,
- }
- )
- return result
+ if add_root:
+ repo_root = Repo(repo_path)
+ url = repo_root.git.remote("get-url", "origin")
+ url, url_https, url_git = self.get_url(url)
+
+ data = {
+ "url": url,
+ "url_https": url_https,
+ "url_git": url_git,
+ "path": repo_path,
+ "name": "",
+ }
+ lst_repo.insert(0, data)
+ # Sort
+ lst_repo = sorted(lst_repo, key=lambda k: k.get("name"))
+ return lst_repo
+
+ def get_manifest_xml_info(self, repo_path: str = "./",
+ add_root: bool = False) -> list:
+ """
+ Get contain of manifest
+ :param repo_path: path of repo to get information about submodule
+ :param add_root: add information about root repository
+ :return: dct_remote, dct_project
+
+ """
+ manifest_file = self.get_manifest_file(repo_path=repo_path)
+ filename = f"{repo_path}/manifest/{manifest_file}"
+ with open(filename) as xml:
+ xml_as_string = xml.read()
+ xml_dict = xmltodict.parse(xml_as_string, dict_constructor=dict)
+ dct_manifest = xml_dict.get("manifest")
+ default_remote = dct_manifest.get("default").get("@remote")
+ lst_remote = dct_manifest.get("remote")
+ lst_project = dct_manifest.get("project")
+ dct_remote = {a.get("@name"): a for a in lst_remote}
+ dct_project = {a.get("@name"): a for a in lst_project}
+ return dct_remote, dct_project
@staticmethod
def get_project_config(repo_path="./"):
@@ -239,7 +298,7 @@ class GitTool:
:param repo_path: path of repo to get information env_var.sh
:return:
{
- CST_GITHUB_TOKEN: TOKEN,
+ CST_EL_GITHUB_TOKEN: TOKEN,
}
"""
filename = f"{repo_path}env_var.sh"
@@ -247,7 +306,7 @@ class GitTool:
txt = file.readlines()
txt = [a[:-1] for a in txt if "=" in a]
- lst_filter = [CST_GITHUB_TOKEN]
+ lst_filter = [CST_EL_GITHUB_TOKEN]
dct_config = {}
# Take filtered value and get bash string values
for f in lst_filter:
@@ -255,7 +314,7 @@ class GitTool:
if f in v:
lst_v = v.split("=")
if len(lst_v) > 1:
- dct_config[CST_GITHUB_TOKEN] = v.split("=")[1][1:-1]
+ dct_config[CST_EL_GITHUB_TOKEN] = v.split("=")[1][1:-1]
return dct_config
@staticmethod
@@ -264,39 +323,25 @@ class GitTool:
if url:
webbrowser.open_new_tab(url)
- def generate_repo_source_from_building(self, repo_path="./"):
- """
- DEPRECATED
- Generate csv file with information about all source addons repo of Odoo
- :param repo_path: Path to build repo source
- :return:
- """
- file_name = f"{repo_path}{CST_FILE_SOURCE_REPO_ADDONS_ODOO}"
- lst_repo_info = self.get_repo_info_from_data_structure(ignore_odoo=True)
- lst_result = [f"{a.get('url_https')}\n" for a in lst_repo_info]
- with open(file_name, "w") as file:
- file.writelines(lst_result)
-
- def generate_odoo_install_locally(self, repo_path="./"):
- # lst_repo = self.get_repo_info_from_data_structure(ignore_odoo=True)
- lst_repo = self.get_repo_info_submodule(repo_path=repo_path)
+ def generate_install_locally(self, repo_path="./"):
+ lst_repo = self.get_repo_info(repo_path=repo_path)
lst_result = []
for repo in lst_repo:
# Exception, ignore addons/OCA_web and root
if "addons/OCA_web" == repo.get("path") or \
"odoo" == repo.get("path"):
continue
- str_repo = f' printf "${{OE_HOME}}/{repo.get("path")}," >> ' \
- f'${{OE_CONFIG_FILE}}\n'
+ str_repo = f' printf "${{EL_HOME}}/{repo.get("path")}," >> ' \
+ f'${{EL_CONFIG_FILE}}\n'
lst_result.append(str_repo)
- with open(f"{repo_path}script/odoo_install_locally.sh") as file:
+ with open(f"{repo_path}script/install_locally.sh") as file:
all_lines = file.readlines()
# search place to add/replace lines
index = 0
find_index = False
index_find = 0
for line in all_lines:
- if not find_index and "if [[ $MINIMAL_ADDONS = \"False\" ]]; then\n" == line:
+ if not find_index and "if [[ $EL_MINIMAL_ADDONS = \"False\" ]]; then\n" == line:
index_find = index + 1
for insert_line in lst_result:
all_lines.insert(index_find, insert_line)
@@ -310,9 +355,119 @@ class GitTool:
index += 1
# create file
- with open(f"{repo_path}script/odoo_install_locally.sh", mode="w") as file:
+ with open(f"{repo_path}script/install_locally.sh", mode="w") as file:
file.writelines(all_lines)
+ @staticmethod
+ def str_insert(source_str, insert_str, pos):
+ return source_str[:pos] + insert_str + source_str[pos:]
+
+ def generate_repo_manifest(self, lst_repo: List[Struct], repo_path: str = "./",
+ dct_remote={}, dct_project={}):
+ lst_remote = []
+ lst_remote_name = []
+ lst_project = []
+ lst_project_name = []
+ lst_default = []
+
+ # Fill with configuration
+ for dct_value in dct_remote.values():
+ lst_remote.append(OrderedDict(
+ [('@name', dct_value.get("@name")),
+ ('@fetch', dct_value.get("@fetch"))]
+ ))
+ lst_remote_name.append(dct_value.get("@name"))
+ for dct_value in dct_project.values():
+ lst_project_info = [
+ ('@name', dct_value.get("@name")),
+ ('@path', dct_value.get("@path")),
+ ('@remote', dct_value.get("@remote"))
+ ]
+ if "@revision" in dct_value.keys():
+ lst_project_info.append(('@revision', dct_value.get("@revision")))
+ if "@clone-depth" in dct_value.keys():
+ lst_project_info.append(('@clone-depth', dct_value.get("@clone-depth")))
+ if "@groups" in dct_value.keys():
+ lst_project_info.append(('@groups', dct_value.get("@groups")))
+ lst_project.append(OrderedDict(lst_project_info))
+ lst_project_name.append(dct_value.get("@name"))
+
+ for repo in lst_repo:
+ if not repo.is_submodule:
+ # Default
+ if lst_default:
+ raise Exception("Cannot have many root repo. "
+ "Validate why 2 or more is not submodule.")
+ lst_default.append(OrderedDict([
+ ('@remote', repo.original_organization),
+ ('@revision', "12.0"),
+ ('@sync-j', "4"),
+ ('@sync-c', "true"),
+ ]))
+ else:
+ # Add remote, only unique remote
+ if repo.original_organization not in lst_remote_name:
+ lst_remote.append(OrderedDict(
+ [('@name', repo.original_organization),
+ ('@fetch', repo.url_https_organization + "/")]
+ ))
+ lst_remote_name.append(repo.original_organization)
+ # Add project, only unique project
+ if repo.project_name not in lst_project_name:
+ lst_project_name.append(repo.project_name)
+ lst_project_info = [
+ ('@name', repo.project_name),
+ ('@path', repo.path),
+ ('@remote', repo.original_organization),
+ ]
+ if repo.revision:
+ lst_project_info.append(('@revision', repo.revision))
+ if repo.clone_depth:
+ lst_project_info.append(('@clone-depth', repo.clone_depth))
+ if repo.sub_path == "addons":
+ lst_project_info.append(('@groups', "addons"))
+ else:
+ lst_project_info.append(('@groups', "odoo"))
+ lst_project.append(OrderedDict(lst_project_info))
+
+ # Order in alphabetic
+ lst_order_remote = sorted(lst_remote, key=lambda key: key.get("@name"))
+ lst_order_default = sorted(lst_default, key=lambda key: key.get("@remote"))
+ lst_order_project = sorted(lst_project, key=lambda key: key.get("@name"))
+
+ dct_repo = OrderedDict(
+ [('manifest', OrderedDict([
+ ('remote', lst_order_remote),
+ ('default', lst_order_default),
+ ('project', lst_order_project),
+ ]))])
+ str_xml_text = xmltodict.unparse(dct_repo, pretty=True)
+
+ pos_insert = str_xml_text.rfind("")
+ if pos_insert:
+ pos_insert += len("")
+ str_xml_text = self.str_insert(str_xml_text, "\n ", pos_insert)
+
+ pos_insert = str_xml_text.rfind("")
+ if pos_insert:
+ pos_insert += len("")
+ str_xml_text = self.str_insert(str_xml_text, "\n ", pos_insert)
+
+ # pos_insert = str_xml_text.rfind("")
+ # if pos_insert:
+ # pos_insert += len("")
+ # str_xml_text = self.str_insert(str_xml_text, "\n ", pos_insert)
+
+ str_xml_text = str_xml_text.replace("> 5 and url[0:4] == "http" and url[-4:] != ".git":
+ url = f"{url}.git"
repo_info = self.get_transformed_repo_info_from_url(url,
repo_path=repo_path,
get_obj=False,
- sub_path=path)
+ sub_path=path,
+ revision=revision,
+ clone_depth=clone_depth)
lst_result.append(repo_info)
return lst_result
+ def get_manifest_file(self, repo_path: str = "./"):
+ """
+ Find .repo and return default manifest file.
+ :param repo_path: path to search .repo
+ :return: manifest file used for Repo
+ """
+ file = f"{repo_path}/.repo/manifest.xml"
+ with open(file) as xml:
+ xml_as_string = xml.read()
+ xml_dict = xmltodict.parse(xml_as_string, dict_constructor=dict)
+ manifest_filename = xml_dict.get("manifest").get("include").get("@name")
+ return manifest_filename
+
def get_matching_repo(self, actual_repo="./", repo_compare_to="./",
- force_normalize_compare=False):
+ force_normalize_compare=False, sync_with_submodule=False):
"""
Compare repo with .gitmodules files
:param actual_repo:
:param repo_compare_to:
:param force_normalize_compare: update name of compare repo
- :return:
+ :param sync_with_submodule: force use submodule with repo_compare_to
+ :return: (list of matches, list of missing, list of more)
"""
- lst_repo_info_actual = self.get_repo_info_submodule(actual_repo)
+ lst_repo_info_actual = self.get_repo_info_manifest_xml(actual_repo)
dct_repo_info_actual = {a.get("name"): a for a in lst_repo_info_actual}
- set_actual = set(dct_repo_info_actual.keys())
+ # set_actual = set(dct_repo_info_actual.keys())
# set_actual_repo = set(
# [a[a.find("_") + 1:] for a in dct_repo_info_actual.keys()])
@@ -389,13 +574,16 @@ class GitTool:
dct_repo_info_actual.items()}
set_actual_repo = set(dct_repo_info_actual_adapted.keys())
- lst_repo_info_compare = self.get_repo_info_submodule(repo_compare_to)
+ lst_repo_info_compare = self.get_repo_info(repo_compare_to,
+ is_manifest=not sync_with_submodule)
if force_normalize_compare:
for repo_info in lst_repo_info_compare:
url_https = repo_info.get("url_https")
url_split = url_https.split("/")
organization = url_split[3]
- repo_name = url_split[4][:-4]
+ repo_name = url_split[4]
+ if repo_name[-4:] == ".git":
+ repo_name = repo_name[:-4]
# name = f"addons/{organization}_{repo_name}"
name = f"{repo_name}"
repo_info["name"] = name
@@ -421,14 +609,34 @@ class GitTool:
dct_repo_info_compare[key]
))
- return lst_match
+ return lst_match, lst_missing_name_normalize, lst_over_name_normalize
@staticmethod
- def sync_to(lst_compare_repo_info):
- i = 0
+ def sync_to(result, checkout_when_diff=False):
+ lst_compare_repo_info, lst_missing_info, lst_over_info = result
+ total = len(lst_missing_info)
+ if total:
+ print(f"\nList of missing : {total}")
+ i = 0
+ for info in lst_missing_info:
+ i += 1
+ print(f"Nb element {i}/{total}")
+ print(f"Missing '{info}'")
+
+ total = len(lst_over_info)
+ if total:
+ print(f"\nList of over : {total}")
+ i = 0
+ for info in lst_over_info:
+ i += 1
+ print(f"Nb element {i}/{total}")
+ print(f"Missing '{info}'")
+
total = len(lst_compare_repo_info)
+ print(f"\nList of normalize : {total}")
lst_same = []
lst_diff = []
+ i = 0
for original, compare_to in lst_compare_repo_info:
i += 1
print(f"Nb element {i}/{total}")
@@ -437,9 +645,15 @@ class GitTool:
repo_compare = Repo(compare_to.get("relative_path"))
commit_compare = repo_compare.head.object.hexsha
if commit_original != commit_compare:
- print(f"DIFF - {original.get('name')}")
+ print(f"DIFF - {original.get('name')} - O {commit_original} - "
+ f"R {commit_compare}")
lst_diff.append((original, compare_to))
- repo_original.git.checkout(commit_compare)
+ if checkout_when_diff:
+ # Update all remote
+ for remote in repo_original.remotes:
+ retry(wait_exponential_multiplier=1000, stop_max_delay=15000)(
+ remote.fetch)()
+ repo_original.git.checkout(commit_compare)
else:
print(f"SAME - {original.get('name')}")
lst_same.append((original, compare_to))
@@ -448,6 +662,13 @@ class GitTool:
@staticmethod
def add_and_fetch_remote(repo_info: Struct, root_repo: Repo = None,
branch_name: str = ""):
+ """
+ Deprecated function, not use anymore git submodule
+ :param repo_info:
+ :param root_repo:
+ :param branch_name:
+ :return:
+ """
try:
working_repo = Repo(repo_info.relative_path)
if repo_info.organization in [a.name for a in working_repo.remotes]:
@@ -509,7 +730,7 @@ class GitTool:
print("Error when forking repo %s" % forked_repo)
exit(1)
else:
- print("Forked %s to %s" % (upstream_url, forked_repo['ssh_url']))
+ print("Forked %s to %s" % (upstream_url, forked_repo['html_url']))
elif status == 202:
print("Forked repo %s already exists" % forked_repo['full_name'])
elif status != 200:
diff --git a/script/odoo_install_OSX_dependancy.sh b/script/install_OSX_dependancy.sh
similarity index 88%
rename from script/odoo_install_OSX_dependancy.sh
rename to script/install_OSX_dependancy.sh
index f6e3398..4ec32c3 100755
--- a/script/odoo_install_OSX_dependancy.sh
+++ b/script/install_OSX_dependancy.sh
@@ -1,13 +1,13 @@
-#!/bin/bash
+#!/usr/bin/env bash
################################################################################
-# Script for installing Odoo on OSX
+# Script for installing ERPLibre on OSX
# Author: Alexandre Ferreira Benevides
#-------------------------------------------------------------------------------
-# This script will install dependency for Odoo on your OSX server.
+# This script will install dependency for ERPLibre on your OSX server.
#-------------------------------------------------------------------------------
################################################################################
-OE_USER=$(whoami)
+EL_USER=$(whoami)
#--------------------------------------------------
# Install PostgreSQL Server
@@ -15,8 +15,8 @@ OE_USER=$(whoami)
echo "\n---- Install PostgreSQL Server ----"
brew install postgresql
-echo "\n---- Creating the ODOO PostgreSQL User ----"
-sudo su - postgres -c "createuser -s ${OE_USER}" 2> /dev/null || true
+echo "\n---- Creating the ERPLibre PostgreSQL User ----"
+sudo su - postgres -c "createuser -s ${EL_USER}" 2> /dev/null || true
#--------------------------------------------------
# Install Dependencies
diff --git a/script/install_daemon.sh b/script/install_daemon.sh
new file mode 100755
index 0000000..586d95c
--- /dev/null
+++ b/script/install_daemon.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+
+. ./env_var.sh
+
+#EL_USER="erplibre"
+#EL_HOME="/${EL_USER}"
+#EL_HOME_ERPLIBRE="${EL_HOME}/erplibre"
+#EL_HOME_ODOO="${EL_HOME_ERPLIBRE}/odoo"
+#EL_INSTALL_WKHTMLTOPDF="True"
+#EL_PORT="8069"
+#EL_SUPERADMIN="admin"
+#EL_CONFIG="${EL_USER}"
+
+#--------------------------------------------------
+# Adding ERPLibre as a daemon with SystemD
+#--------------------------------------------------
+echo -e "\n* Create init file"
+sudo rm -f /tmp/${EL_CONFIG}
+cat < /tmp/${EL_CONFIG}
+[Unit]
+Description=${EL_USER}
+Requires=postgresql.service
+After=network.target network-online.target postgresql.service
+
+[Service]
+Type=simple
+SyslogIdentifier=${EL_USER}
+PermissionsStartOnly=true
+User=${EL_USER}
+Group=${EL_USER}
+Restart=always
+RestartSec=5
+PIDFile=${EL_HOME_ERPLIBRE}/venv/service.pid
+ExecStart=${EL_HOME_ERPLIBRE}/venv/run.sh
+StandardOutput=journal+console
+
+[Install]
+WantedBy=multi-user.target
+EOF
+
+echo -e "* Security Init File"
+sudo cp /tmp/${EL_CONFIG} /etc/systemd/system/${EL_CONFIG}.service
+sudo chmod 755 /etc/systemd/system/${EL_CONFIG}.service
+sudo chown root: /etc/systemd/system/${EL_CONFIG}.service
+
+echo -e "* Start ERPLibre on Startup"
+sudo systemctl daemon-reload
+sudo systemctl enable ${EL_CONFIG}.service
+
+sudo su ${EL_USER} -c "sudo rm -f /tmp/${EL_USER}run.sh"
+cat < /tmp/${EL_USER}run.sh
+#!/usr/bin/env bash
+cd ${EL_HOME_ERPLIBRE}
+source ./venv/bin/activate
+python3 ${EL_HOME_ERPLIBRE}/odoo/odoo-bin -c ${EL_HOME_ERPLIBRE}/config.conf $@
+EOF
+
+echo -e "* Security Run File"
+sudo cp /tmp/${EL_USER}run.sh ${EL_HOME_ERPLIBRE}/venv/run.sh
+sudo chmod 755 ${EL_HOME_ERPLIBRE}/venv/run.sh
+sudo chown ${EL_USER}: ${EL_HOME_ERPLIBRE}/venv/run.sh
+
+echo "-----------------------------------------------------------"
+echo "Done! The ERPLibre server is up and running. Specifications:"
+echo "Port: ${EL_PORT}"
+echo "Port Long Polling: ${EL_LONGPOLLING_PORT}"
+echo "User service: ${EL_USER}"
+echo "User PostgreSQL: ${EL_USER}"
+echo "Code location: ${EL_USER}"
+echo "Addons folder: ${EL_USER}/${EL_CONFIG}/addons/"
+echo "Start ERPLibre service: sudo systemctl start ${EL_CONFIG}"
+echo "Stop ERPLibre service: sudo systemctl stop ${EL_CONFIG}"
+echo "Restart ERPLibre service: sudo systemctl restart ${EL_CONFIG}"
+echo "-----------------------------------------------------------"
+
+echo -e "* Starting ERPLibre Service"
+sudo systemctl restart ${EL_CONFIG}.service
diff --git a/script/odoo_install_debian_dependancy.sh b/script/install_debian_dependancy.sh
similarity index 68%
rename from script/odoo_install_debian_dependancy.sh
rename to script/install_debian_dependancy.sh
index a01419b..333a5d9 100755
--- a/script/odoo_install_debian_dependancy.sh
+++ b/script/install_debian_dependancy.sh
@@ -1,19 +1,9 @@
-#!/bin/bash
-################################################################################
-# Script for installing Odoo on Ubuntu 14.04, 15.04, 16.04 and 18.04 (could be used for other version too)
-# Author: Yenthe Van Ginneken
-#-------------------------------------------------------------------------------
-# This script will install Odoo on your Ubuntu 16.04 server. It can install multiple Odoo instances
-# in one Ubuntu because of the different xmlrpc_ports
-#-------------------------------------------------------------------------------
-################################################################################
+#!/usr/bin/env bash
. ./env_var.sh
-OE_USER=$(whoami)
-# The default port where this Odoo instance will run under (provided you use the command -c in the terminal)
-# Set to true if you want to install it, false if you don't need it or have it already installed.
-#INSTALL_WKHTMLTOPDF="True"
+EL_USER=$(whoami)
+#EL_INSTALL_WKHTMLTOPDF="True"
##
### WKHTMLTOPDF download links
@@ -43,30 +33,30 @@ sudo apt-get upgrade -y
echo -e "\n---- Install PostgreSQL Server ----"
sudo apt-get install postgresql -y
-echo -e "\n---- Creating the ODOO PostgreSQL User ----"
-sudo su - postgres -c "createuser -s $OE_USER" 2> /dev/null || true
+echo -e "\n---- Creating the ERPLibre PostgreSQL User ----"
+sudo su - postgres -c "createuser -s $EL_USER" 2> /dev/null || true
#--------------------------------------------------
# Install Dependencies
#--------------------------------------------------
echo -e "\n--- Installing Python 3 + pip3 --"
-sudo apt-get install git python3 python3-pip build-essential wget python3-dev python3-venv python3-wheel libxslt-dev libzip-dev libldap2-dev libsasl2-dev python3-setuptools node-less libpng12-0 gdebi -y
+sudo apt-get install git python3 python3-pip build-essential wget python3-dev python3-venv python3-wheel libxslt-dev libzip-dev libldap2-dev libsasl2-dev python3-setuptools node-less libpng12-0 gdebi-core -y
echo -e "\n---- Installing nodeJS NPM and rtlcss for LTR support ----"
sudo apt-get install nodejs npm -y
sudo npm install -g rtlcss
-if [ ${INSTALL_NGINX} = "True" ]; then
+if [ ${EL_INSTALL_NGINX} = "True" ]; then
sudo apt install nginx -y
fi
#--------------------------------------------------
# Install Wkhtmltopdf if needed
#--------------------------------------------------
-if [ ${INSTALL_WKHTMLTOPDF} = "True" ]; then
+if [ ${EL_INSTALL_WKHTMLTOPDF} = "True" ]; then
INSTALLED=$(dpkg -s wkhtmltox|grep installed)
if [ "" == "${INSTALLED}" ]; then
- echo -e "\n---- Install wkhtml and place shortcuts on correct place for ODOO 12 ----"
+ echo -e "\n---- Install wkhtml and place shortcuts on correct place ----"
#pick up correct one from x64 & x32 versions:
if [ "`getconf LONG_BIT`" == "64" ];then
_url=$WKHTMLTOX_X64
diff --git a/script/odoo_install_dev.sh b/script/install_dev.sh
similarity index 69%
rename from script/odoo_install_dev.sh
rename to script/install_dev.sh
index aa9d204..3572c4f 100755
--- a/script/odoo_install_dev.sh
+++ b/script/install_dev.sh
@@ -1,22 +1,18 @@
-#!/bin/bash
+#!/usr/bin/env bash
################################################################################
-# Script for installing Odoo locally for dev
+# Script for installing ERPLibre locally for dev
# Author: Alexandre Ferreira Benevides
################################################################################
-. ./env_var.sh
-
if [[ "${OSTYPE}" == "linux-gnu" ]]; then
OS=$(lsb_release -si)
if [[ "${OS}" == "Ubuntu" ]]; then
echo "\n---- linux-gnu installation process started ----"
- ./script/odoo_install_debian_dependancy.sh
- ./script/odoo_install_locally.sh
+ ./script/install_debian_dependancy.sh
else
echo "Your Linux system is not supported."
fi
elif [[ "${OSTYPE}" == "darwin"* ]]; then
echo "\n---- Darwin installation process started ----"
- ./script/odoo_install_OSX_dependancy.sh
- ./script/odoo_install_locally.sh
+ ./script/install_OSX_dependancy.sh
fi
diff --git a/script/install_locally.sh b/script/install_locally.sh
new file mode 100755
index 0000000..07cced5
--- /dev/null
+++ b/script/install_locally.sh
@@ -0,0 +1,163 @@
+#!/usr/bin/env bash
+
+. ./env_var.sh
+
+EL_USER=$(whoami)
+EL_HOME=$PWD
+EL_HOME_ODOO="${EL_HOME}/odoo"
+#EL_INSTALL_WKHTMLTOPDF="True"
+#EL_PORT="8069"
+#EL_LONGPOLLING_PORT="8072"
+#EL_SUPERADMIN="admin"
+EL_CONFIG_FILE="${EL_HOME}/config.conf"
+#EL_CONFIG="${EL_USER}"
+#EL_MINIMAL_ADDONS="False"
+#EL_INSTALL_NGINX="True"
+
+if hash python3.7 2>/dev/null; then
+ PYTHON37="True"
+ PYTHON36="False"
+elif hash python3.6 2>/dev/null; then
+ PYTHON37="False"
+ PYTHON36="True"
+else
+ echo "Missing python3.7 or python3.6. Python3.8 is not compatible."
+ exit 1
+fi
+
+echo -e "* Create server config file"
+
+touch ${EL_CONFIG_FILE}
+echo -e "* Creating server config file"
+printf '[options] \n; This is the password that allows database operations:\n' > ${EL_CONFIG_FILE}
+printf "admin_passwd = ${EL_SUPERADMIN}\n" >> ${EL_CONFIG_FILE}
+printf "db_host = False\n" >> ${EL_CONFIG_FILE}
+printf "db_port = False\n" >> ${EL_CONFIG_FILE}
+printf "db_user = ${EL_USER}\n" >> ${EL_CONFIG_FILE}
+printf "db_password = False\n" >> ${EL_CONFIG_FILE}
+printf "xmlrpc_port = ${EL_PORT}\n" >> ${EL_CONFIG_FILE}
+printf "longpolling_port = ${EL_LONGPOLLING_PORT}\n" >> ${EL_CONFIG_FILE}
+
+printf "addons_path = ${EL_HOME_ODOO}/addons,${EL_HOME}/addons/addons," >> ${EL_CONFIG_FILE}
+printf "${EL_HOME}/addons/OCA_web," >> ${EL_CONFIG_FILE}
+if [[ $EL_MINIMAL_ADDONS = "False" ]]; then
+ printf "${EL_HOME}/addons/ERPLibre_erplibre_addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/MathBenTech_development," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/MathBenTech_odoo-business-spending-management-quebec-canada," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/MathBenTech_scrummer," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Numigi_odoo-base-addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Numigi_odoo-entertainment-addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Numigi_odoo-git-addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Numigi_odoo-hr-addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Numigi_odoo-partner-addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Numigi_odoo-product-addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Numigi_odoo-project-addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Numigi_odoo-purchase-addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Numigi_odoo-stock-addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Numigi_odoo-survey-addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Numigi_odoo-timesheet-addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Numigi_odoo-web-addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_account-analytic," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_account-budgeting," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_account-closing," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_account-consolidation," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_account-financial-reporting," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_account-financial-tools," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_account-fiscal-rule," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_account-invoice-reporting," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_account-invoicing," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_account-payment," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_account-reconcile," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_apps-store," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_bank-payment," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_bank-statement-import," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_brand," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_business-requirement," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_commission," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_community-data-files," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_connector-telephony," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_contract," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_credit-control," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_currency," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_data-protection," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_donation," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_e-commerce," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_edi," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_event," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_helpdesk," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_hr," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_knowledge," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_l10n-canada," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_maintenance," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_management-system," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_manufacture," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_margin-analysis," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_mis-builder," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_multi-company," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_partner-contact," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_pos," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_product-attribute," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_product-pack," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_product-variant," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_project," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_project-reporting," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_purchase-workflow," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_queue," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_reporting-engine," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_sale-workflow," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_server-auth," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_server-brand," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_server-env," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_server-tools," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_server-ux," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_social," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_stock-logistics-warehouse," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_timesheet," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_website," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/OCA_wms," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/SanteLibre_santelibre_addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/Smile-SA_odoo_addons," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/muk-it_muk_base," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/muk-it_muk_dms," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/muk-it_muk_docs," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/muk-it_muk_misc," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/muk-it_muk_quality," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/muk-it_muk_web," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/muk-it_muk_website," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/odooaktiv_QuotationRevision," >> ${EL_CONFIG_FILE}
+ printf "${EL_HOME}/addons/openeducat_openeducat_erp," >> ${EL_CONFIG_FILE}
+fi
+printf "\n" >> ${EL_CONFIG_FILE}
+
+printf "workers = 0\n" >> ${EL_CONFIG_FILE}
+printf "max_cron_threads = 2\n" >> ${EL_CONFIG_FILE}
+
+if [ ${EL_INSTALL_NGINX} = "True" ]; then
+ printf "xmlrpc_interface = 127.0.0.1\n" >> ${EL_CONFIG_FILE}
+ printf "netrpc_interface = 127.0.0.1\n" >> ${EL_CONFIG_FILE}
+ printf "proxy_mode = True\n" >> ${EL_CONFIG_FILE}
+fi
+
+echo -e "\n---- Install Odoo with addons module ----"
+git submodule update --init
+
+# Generate empty addons if missing
+if [ ! -d "./addons/addons" ]; then
+ mkdir -p ./addons/addons
+fi
+
+echo -e "\n---- Create Virtual environment Python ----"
+cd ${EL_HOME}
+if [[ ${PYTHON37} = "True" ]]; then
+ python3.7 -m venv venv
+elif [[ ${PYTHON36} = "True" ]]; then
+ python3.6 -m venv venv
+fi
+cd -
+
+# Install git-repo if missing
+if [ ! -f "./venv/repo" ]; then
+ echo "Install git-repo from Google APIS"
+ curl https://storage.googleapis.com/git-repo-downloads/repo > ./venv/repo
+ chmod +x ./venv/repo
+fi
diff --git a/script/install_locally_dev.sh b/script/install_locally_dev.sh
new file mode 100755
index 0000000..671f74d
--- /dev/null
+++ b/script/install_locally_dev.sh
@@ -0,0 +1,44 @@
+#!/usr/bin/env bash
+
+. ./env_var.sh
+
+EL_USER=$(whoami)
+EL_HOME=$PWD
+EL_HOME_ODOO="${EL_HOME}/odoo"
+#EL_INSTALL_WKHTMLTOPDF="True"
+#EL_PORT="8069"
+#EL_LONGPOLLING_PORT="8072"
+#EL_SUPERADMIN="admin"
+EL_CONFIG_FILE="${EL_HOME}/config.conf"
+#EL_CONFIG="${EL_USER}"
+#EL_MINIMAL_ADDONS="False"
+#EL_INSTALL_NGINX="True"
+#EL_MANIFEST_PROD="./manifest/default.xml"
+#EL_MANIFEST_DEV="./manifest/default.dev.xml"
+
+./script/install_locally.sh
+
+# Update git-repo
+git daemon --base-path=. --export-all --reuseaddr --informative-errors --verbose &
+DAEMON_PID=$!
+
+./venv/repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m ${EL_MANIFEST_DEV}
+./venv/repo sync -m ${EL_MANIFEST_DEV}
+
+kill ${DAEMON_PID}
+
+echo -e "\n---- Install python packages/requirements ----"
+${EL_HOME}/venv/bin/pip3 install --upgrade pip
+${EL_HOME}/venv/bin/pip3 install wheel phonenumbers
+${EL_HOME}/venv/bin/pip3 install -r "${EL_HOME}/odoo/requirements.txt"
+${EL_HOME}/venv/bin/pip3 install -r "${EL_HOME}/requirements.txt"
+
+# For dev/testing
+${EL_HOME}/venv/bin/pip3 install websocket-client
+
+echo -e "\n---- Add link dependency in site-packages of Python ----"
+if [[ ${PYTHON37} = "True" ]]; then
+ ln -fs ${EL_HOME_ODOO}/odoo ${EL_HOME}/venv/lib/python3.7/site-packages/
+elif [[ ${PYTHON36} = "True" ]]; then
+ ln -fs ${EL_HOME_ODOO}/odoo ${EL_HOME}/venv/lib/python3.6/site-packages/
+fi
diff --git a/script/install_locally_prod.sh b/script/install_locally_prod.sh
new file mode 100755
index 0000000..77f158d
--- /dev/null
+++ b/script/install_locally_prod.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env bash
+
+. ./env_var.sh
+
+EL_USER=$(whoami)
+EL_HOME=$PWD
+EL_HOME_ODOO="${EL_HOME}/odoo"
+#EL_INSTALL_WKHTMLTOPDF="True"
+#EL_PORT="8069"
+#EL_LONGPOLLING_PORT="8072"
+#EL_SUPERADMIN="admin"
+EL_CONFIG_FILE="${EL_HOME}/config.conf"
+#EL_CONFIG="${EL_USER}"
+#EL_MINIMAL_ADDONS="False"
+#EL_INSTALL_NGINX="True"
+#EL_MANIFEST_PROD="./manifest/default.xml"
+#EL_MANIFEST_DEV="./manifest/default.dev.xml"
+
+./script/install_locally.sh
+
+# Update git-repo
+./venv/repo init -u http://git.erplibre.ca/ERPLibre -b 12.0_repo
+#./venv/repo sync --force-sync
+./venv/repo sync
+
+echo -e "\n---- Install python packages/requirements ----"
+${EL_HOME}/venv/bin/pip3 install --upgrade pip
+${EL_HOME}/venv/bin/pip3 install wheel phonenumbers
+${EL_HOME}/venv/bin/pip3 install -r "${EL_HOME}/odoo/requirements.txt"
+${EL_HOME}/venv/bin/pip3 install -r "${EL_HOME}/requirements.txt"
+
+# For dev/testing
+${EL_HOME}/venv/bin/pip3 install websocket-client
+
+echo -e "\n---- Add link dependency in site-packages of Python ----"
+if [[ ${PYTHON37} = "True" ]]; then
+ ln -fs ${EL_HOME_ODOO}/odoo ${EL_HOME}/venv/lib/python3.7/site-packages/
+elif [[ ${PYTHON36} = "True" ]]; then
+ ln -fs ${EL_HOME_ODOO}/odoo ${EL_HOME}/venv/lib/python3.6/site-packages/
+fi
diff --git a/script/install_production.sh b/script/install_production.sh
new file mode 100755
index 0000000..397fb0a
--- /dev/null
+++ b/script/install_production.sh
@@ -0,0 +1,48 @@
+#!/usr/bin/env bash
+
+. ./env_var.sh
+
+./script/install_debian_dependancy.sh
+
+echo -e "\n---- Create ERPLIBRE system user ----"
+sudo adduser --system --quiet --shell=/bin/bash --home=/${EL_USER} --gecos 'ERPLIBRE' --group ${EL_USER}
+#The user should also be added to the sudo'ers group.
+sudo adduser ${EL_USER} sudo
+
+echo -e "\n---- Creating the ERPLIBRE PostgreSQL User ----"
+sudo su - postgres -c "createuser -s ${EL_USER}" 2> /dev/null || true
+
+#echo -e "\n---- Create Log directory ----"
+#sudo mkdir /var/log/${EL_USER}
+#sudo chown ${EL_USER}:${EL_USER} /var/log/${EL_USER}
+
+echo -e "\n---- Setting permissions on home folder ----"
+sudo mkdir -p ${EL_HOME}
+sudo chown -R ${EL_USER}:${EL_USER} ${EL_HOME}
+
+#--------------------------------------------------
+# Install ERPLIBRE
+#--------------------------------------------------
+echo -e "\n==== Clone this installation ===="
+REMOTE_URL_GIT=`git remote get-url origin`
+BRANCH_GIT=`git rev-parse --abbrev-ref HEAD`
+sudo su ${EL_USER} -c "git clone --branch ${BRANCH_GIT} ${REMOTE_URL_GIT} ${EL_HOME_ERPLIBRE}"
+sudo cp ./env_var.sh ${EL_HOME_ERPLIBRE}
+sudo chown -R ${EL_USER}:${EL_USER} ${EL_HOME_ERPLIBRE}/env_var.sh
+
+LAST_PWD=$PWD
+cd ${EL_HOME_ERPLIBRE}
+sudo su ${EL_USER} -c "./script/install_locally_prod.sh"
+cd ${LAST_PWD}
+#echo -e "\n* Updating server config file"
+#sudo su ${EL_USER} -c "printf 'logfile = /var/log/${EL_USER}/${EL_CONFIG}.log\n' >> /${EL_USER}/erplibre/config.conf"
+
+#--------------------------------------------------
+# Adding ERPLIBRE as a daemon
+#--------------------------------------------------
+./script/install_daemon.sh
+
+#--------------------------------------------------
+# Install Nginx if needed
+#--------------------------------------------------
+./script/install_production_nginx.sh
\ No newline at end of file
diff --git a/script/odoo_install_production_nginx.sh b/script/install_production_nginx.sh
similarity index 57%
rename from script/odoo_install_production_nginx.sh
rename to script/install_production_nginx.sh
index 5f613d4..84693ac 100755
--- a/script/odoo_install_production_nginx.sh
+++ b/script/install_production_nginx.sh
@@ -1,34 +1,26 @@
-#!/bin/bash
-################################################################################
-# Script for installing Odoo on Ubuntu 14.04, 15.04, 16.04 and 18.04 (could be used for other version too)
-# Author: Yenthe Van Ginneken
-#-------------------------------------------------------------------------------
-# This script will install Odoo on your Ubuntu 16.04 server. It can install multiple Odoo instances
-# in one Ubuntu because of the different xmlrpc_ports
-#-------------------------------------------------------------------------------
-################################################################################
+#!/usr/bin/env bash
. ./env_var.sh
#--------------------------------------------------
# Install Nginx if needed
#--------------------------------------------------
-if [ ${INSTALL_NGINX} = "True" ]; then
+if [ ${EL_INSTALL_NGINX} = "True" ]; then
echo -e "\n---- Installing and setting up Nginx ----"
- cat < /tmp/nginx${OE_USER}
-upstream odoo${OE_USER} {
- server 127.0.0.1:${OE_PORT};
+ cat < /tmp/nginx${EL_USER}
+upstream erplibre${EL_USER} {
+ server 127.0.0.1:${EL_PORT};
}
-upstream odoo${OE_USER}chat {
- server 127.0.0.1:${OE_LONGPOLLING_PORT};
+upstream erplibre${EL_USER}chat {
+ server 127.0.0.1:${EL_LONGPOLLING_PORT};
}
server {
listen 80;
- server_name ${WEBSITE_NAME};
+ server_name ${EL_WEBSITE_NAME};
- # Add Headers for odoo proxy mode
+ # Add Headers for erplibre proxy mode
proxy_set_header X-Forwarded-Host \$host;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
@@ -36,9 +28,9 @@ server {
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
- # odoo request log files
- access_log /var/log/nginx/${OE_USER}-access.log;
- error_log /var/log/nginx/${OE_USER}-error.log;
+ # erplibre request log files
+ access_log /var/log/nginx/${EL_USER}-access.log;
+ error_log /var/log/nginx/${EL_USER}-error.log;
# Increase proxy buffer size
proxy_buffers 16 64k;
@@ -68,13 +60,13 @@ server {
client_max_body_size 1024M;
location / {
- proxy_pass http://odoo${OE_USER};
+ proxy_pass http://erplibre${EL_USER};
# by default, do not forward anything
proxy_redirect off;
}
location /longpolling {
- proxy_pass http://odoo${OE_USER}chat;
+ proxy_pass http://erplibre${EL_USER}chat;
}
# cache some static data in memory for 60mins.
@@ -83,16 +75,16 @@ server {
proxy_cache_valid 404 1m;
proxy_buffering on;
expires 864000;
- proxy_pass http://odoo${OE_USER};
+ proxy_pass http://erplibre${EL_USER};
}
}
EOF
- sudo mv -f /tmp/nginx${OE_USER} /etc/nginx/sites-available/${WEBSITE_NAME}
- sudo ln -fs /etc/nginx/sites-available/${WEBSITE_NAME} /etc/nginx/sites-enabled/${WEBSITE_NAME}
+ sudo mv -f /tmp/nginx${EL_USER} /etc/nginx/sites-available/${EL_WEBSITE_NAME}
+ sudo ln -fs /etc/nginx/sites-available/${EL_WEBSITE_NAME} /etc/nginx/sites-enabled/${EL_WEBSITE_NAME}
sudo rm -f /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default
sudo systemctl restart nginx
- echo "Done! The Nginx server is up and running. Configuration can be found at /etc/nginx/sites-enabled/${WEBSITE_NAME}"
+ echo "Done! The Nginx server is up and running. Configuration can be found at /etc/nginx/sites-enabled/${EL_WEBSITE_NAME}"
echo "Run manually certbot : sudo certbot --nginx"
else
echo "Nginx isn't installed due to choice of the user!"
diff --git a/script/list_repo_diff.py b/script/list_repo_diff.py
deleted file mode 100644
index dd9fa11..0000000
--- a/script/list_repo_diff.py
+++ /dev/null
@@ -1,110 +0,0 @@
-#!/usr/bin/env python
-import os
-import sys
-import webbrowser
-import argparse
-import logging
-from git import Repo
-
-from retrying import retry # pip install retrying
-
-new_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
-sys.path.append(new_path)
-
-from script.git_tool import GitTool
-from script import fork_github_repo
-
-_logger = logging.getLogger(__name__)
-CST_GITHUB_TOKEN = "GITHUB_TOKEN"
-
-
-def get_config():
- """Parse command line arguments, extracting the config file name,
- returning the union of config file and command line arguments
-
- :return: dict of config file settings and command line arguments
- """
- # TODO update description
- parser = argparse.ArgumentParser(
- formatter_class=argparse.RawDescriptionHelpFormatter,
- description='''\
-''',
- epilog='''\
-'''
- )
- parser.add_argument('-d', '--dir', dest="dir", default="./",
- help="Path of repo to change remote, including submodule.")
- args = parser.parse_args()
- return args
-
-
-def main():
- config = get_config()
- lst_repo = GitTool.get_repo_info_submodule(repo_path=config.dir)
- branch_search = "12.0"
- # repo = Repo(root_path)
- # repo_root = Repo(".")
- lst_result = []
-
- i = 0
- total = len(lst_repo)
- for repo in lst_repo:
- i += 1
- print(f"Nb element {i}/{total}")
- repo_dir_root = repo.get("path")
- remote_path = f"{config.dir}/{repo_dir_root}"
- repo_root = Repo(remote_path)
- repo_branch_search_sha = [a.object.hexsha for a in repo_root.branches if
- branch_search in a.name]
- if repo_branch_search_sha:
- repo_branch_search_sha = repo_branch_search_sha[0]
- else:
- print(f"Error, missing branch {branch_search} in {remote_path}")
- continue
- lst_result.append((remote_path, repo_root.head.commit.hexsha,
- repo_root.head.commit.hexsha != repo_branch_search_sha))
-
- # print(repo_root)
-
- # # Create the remote upstream
- # split_url = url.split("/")
- # split_url[-2] = upstream_name
- # upstream_url = "/".join(split_url)
- #
- # cloned_repo = Repo(repo_dir_root)
- # try:
- # upstream_remote = cloned_repo.remote(upstream_name)
- # print('Remote "%s" already exists in %s' %
- # (upstream_name, repo_dir_root))
- # except ValueError:
- # upstream_remote = retry(
- # wait_exponential_multiplier=1000,
- # stop_max_delay=15000
- # )(cloned_repo.create_remote)(upstream_name, upstream_url)
- # print('Remote "%s" created for %s' % (upstream_name, upstream_url))
- #
- # try:
- # # Fetch the remote upstream
- # retry(wait_exponential_multiplier=1000, stop_max_delay=15000)(
- # upstream_remote.fetch)()
- # print('Remote "%s" fetched' % upstream_name)
- # except Exception:
- # print(f"ERROR git {repo_dir_root} remote {upstream_name} not exist.")
- # upstream_remote.remove(upstream_remote, upstream_name)
-
- i = 0
- i_len = len(lst_result)
- for path, hash, diff in lst_result:
- i += 1
- if diff:
- print(f"{i:02d}/{i_len} {diff} {path}\t{hash}")
-
- # lst_repo = GitTool.get_repo_info_from_data_structure()
- # for repo in lst_repo:
- # repo_dir_root = repo.get("path")
- # repo_root = Repo(remote_path)
- # repo_root.git.checkout()
-
-
-if __name__ == '__main__':
- main()
diff --git a/script/odoo_install_daemon.sh b/script/odoo_install_daemon.sh
deleted file mode 100755
index ecf2b13..0000000
--- a/script/odoo_install_daemon.sh
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/bin/bash
-################################################################################
-# Script for installing Odoo on Ubuntu 14.04, 15.04, 16.04 and 18.04 (could be used for other version too)
-# Author: Yenthe Van Ginneken
-#-------------------------------------------------------------------------------
-# This script will install Odoo on your Ubuntu 16.04 server. It can install multiple Odoo instances
-# in one Ubuntu because of the different xmlrpc_ports
-#-------------------------------------------------------------------------------
-################################################################################
-
-. ./env_var.sh
-
-#OE_USER="odoo"
-#OE_HOME="/${OE_USER}/odoo"
-#OE_HOME_EXT="/${OE_USER}/odoo/odoo/odoo"
-## The default port where this Odoo instance will run under (provided you use the command -c in the terminal)
-## Set to true if you want to install it, false if you don't need it or have it already installed.
-#INSTALL_WKHTMLTOPDF="True"
-## Set the default Odoo port (you still have to use -c /etc/odoo-server.conf for example to use this.)
-#OE_PORT="8069"
-## set the superadmin password
-#OE_SUPERADMIN="admin"
-#OE_CONFIG="${OE_USER}"
-
-#--------------------------------------------------
-# Adding ODOO as a deamon with SystemD
-#--------------------------------------------------
-echo -e "\n* Create init file"
-sudo rm -f /tmp/${OE_CONFIG}
-cat < /tmp/${OE_CONFIG}
-[Unit]
-Description=${OE_USER}
-Requires=postgresql.service
-After=network.target network-online.target postgresql.service
-
-[Service]
-Type=simple
-SyslogIdentifier=${OE_USER}
-PermissionsStartOnly=true
-User=${OE_USER}
-Group=${OE_USER}
-Restart=always
-RestartSec=5
-PIDFile=${OE_HOME_ODOO}/venv/service.pid
-ExecStart=${OE_HOME_ODOO}/venv/run.sh
-StandardOutput=journal+console
-
-[Install]
-WantedBy=multi-user.target
-EOF
-
-echo -e "* Security Init File"
-sudo cp /tmp/${OE_CONFIG} /etc/systemd/system/${OE_CONFIG}.service
-sudo chmod 755 /etc/systemd/system/${OE_CONFIG}.service
-sudo chown root: /etc/systemd/system/${OE_CONFIG}.service
-
-echo -e "* Start ODOO on Startup"
-sudo systemctl daemon-reload
-sudo systemctl enable ${OE_CONFIG}.service
-
-sudo su ${OE_USER} -c "sudo rm -f /tmp/${OE_USER}run.sh"
-cat < /tmp/${OE_USER}run.sh
-#!/usr/bin/env bash
-cd ${OE_HOME_ODOO}
-source ./venv/bin/activate
-python3 ${OE_HOME_ODOO}/odoo/odoo-bin -c ${OE_HOME_ODOO}/config.conf
-EOF
-
-echo -e "* Security Run File"
-sudo cp /tmp/${OE_USER}run.sh ${OE_HOME_ODOO}/venv/run.sh
-sudo chmod 755 ${OE_HOME_ODOO}/venv/run.sh
-sudo chown ${OE_USER}: ${OE_HOME_ODOO}/venv/run.sh
-
-echo "-----------------------------------------------------------"
-echo "Done! The Odoo server is up and running. Specifications:"
-echo "Port: ${OE_PORT}"
-echo "Port Long Polling: ${OE_LONGPOLLING_PORT}"
-echo "User service: ${OE_USER}"
-echo "User PostgreSQL: ${OE_USER}"
-echo "Code location: ${OE_USER}"
-echo "Addons folder: ${OE_USER}/${OE_CONFIG}/addons/"
-echo "Start Odoo service: sudo systemctl start ${OE_CONFIG}"
-echo "Stop Odoo service: sudo systemctl stop ${OE_CONFIG}"
-echo "Restart Odoo service: sudo systemctl restart ${OE_CONFIG}"
-echo "-----------------------------------------------------------"
-
-echo -e "* Starting Odoo Service"
-sudo systemctl restart ${OE_CONFIG}.service
diff --git a/script/odoo_install_locally.sh b/script/odoo_install_locally.sh
deleted file mode 100755
index 6489b71..0000000
--- a/script/odoo_install_locally.sh
+++ /dev/null
@@ -1,188 +0,0 @@
-#!/bin/bash
-################################################################################
-# Script for installing Odoo on Ubuntu 14.04, 15.04, 16.04 and 18.04 (could be used for other version too)
-# Author: Yenthe Van Ginneken
-#-------------------------------------------------------------------------------
-# This script will install Odoo on your Ubuntu 16.04 server. It can install multiple Odoo instances
-# in one Ubuntu because of the different xmlrpc_ports
-#-------------------------------------------------------------------------------
-# Make a new file:
-# sudo nano odoo-install.sh
-# Place this content in it and then make the file executable:
-# sudo chmod +x odoo-install.sh
-# Execute the script to install Odoo:
-# ./odoo-install
-################################################################################
-
-. ./env_var.sh
-
-OE_USER=$(whoami)
-OE_HOME=$PWD
-OE_HOME_EXT="${OE_HOME}/odoo"
-# The default port where this Odoo instance will run under (provided you use the command -c in the terminal)
-# Set to true if you want to install it, false if you don't need it or have it already installed.
-#INSTALL_WKHTMLTOPDF="True"
-# Set the default Odoo port (you still have to use -c /etc/odoo-server.conf for example to use this.)
-#OE_PORT="8069"
-#OE_LONGPOLLING_PORT="8072"
-# Choose the Odoo version which you want to install. For example: 12.0, 11.0, 10.0 or saas-18. When using 'master' the master version will be installed.
-# IMPORTANT! This script contains extra libraries that are specifically needed for Odoo 12.0
-#OE_VERSION="stable_prod_12.0"
-# set the superadmin password
-#OE_SUPERADMIN="admin"
-OE_CONFIG_FILE="${OE_HOME}/config.conf"
-#OE_CONFIG="${OE_USER}"
-#MINIMAL_ADDONS="False"
-#INSTALL_NGINX="True"
-
-if hash python3.7 2>/dev/null; then
- PYTHON37="True"
- PYTHON36="False"
-elif hash python3.6 2>/dev/null; then
- PYTHON37="False"
- PYTHON36="True"
-else
- echo "Missing python3.7 or python3.6. Python3.8 is not compatible."
- exit 1
-fi
-
-echo -e "* Create server config file"
-
-touch ${OE_CONFIG_FILE}
-echo -e "* Creating server config file"
-printf '[options] \n; This is the password that allows database operations:\n' > ${OE_CONFIG_FILE}
-printf "admin_passwd = ${OE_SUPERADMIN}\n" >> ${OE_CONFIG_FILE}
-printf "db_host = False\n" >> ${OE_CONFIG_FILE}
-printf "db_port = False\n" >> ${OE_CONFIG_FILE}
-printf "db_user = ${OE_USER}\n" >> ${OE_CONFIG_FILE}
-printf "db_password = False\n" >> ${OE_CONFIG_FILE}
-printf "xmlrpc_port = ${OE_PORT}\n" >> ${OE_CONFIG_FILE}
-printf "longpolling_port = ${OE_LONGPOLLING_PORT}\n" >> ${OE_CONFIG_FILE}
-
-printf "addons_path = ${OE_HOME_EXT}/addons,${OE_HOME}/addons/addons," >> ${OE_CONFIG_FILE}
-printf "${OE_HOME}/addons/OCA_web," >> ${OE_CONFIG_FILE}
-if [[ $MINIMAL_ADDONS = "False" ]]; then
- printf "${OE_HOME}/addons/ERPLibre_erplibre_addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/MathBenTech_development," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/MathBenTech_odoo-business-spending-management-quebec-canada," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/MathBenTech_scrummer," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Numigi_odoo-base-addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Numigi_odoo-entertainment-addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Numigi_odoo-git-addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Numigi_odoo-hr-addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Numigi_odoo-partner-addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Numigi_odoo-product-addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Numigi_odoo-project-addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Numigi_odoo-purchase-addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Numigi_odoo-stock-addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Numigi_odoo-survey-addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Numigi_odoo-timesheet-addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Numigi_odoo-web-addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_account-analytic," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_account-budgeting," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_account-closing," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_account-consolidation," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_account-financial-reporting," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_account-financial-tools," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_account-fiscal-rule," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_account-invoice-reporting," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_account-invoicing," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_account-payment," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_account-reconcile," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_apps-store," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_bank-payment," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_bank-statement-import," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_brand," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_business-requirement," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_commission," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_community-data-files," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_connector-telephony," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_contract," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_credit-control," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_currency," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_data-protection," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_donation," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_e-commerce," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_edi," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_event," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_helpdesk," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_hr," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_knowledge," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_l10n-canada," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_maintenance," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_management-system," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_manufacture," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_margin-analysis," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_mis-builder," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_multi-company," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_partner-contact," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_pos," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_product-attribute," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_product-pack," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_product-variant," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_project," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_project-reporting," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_purchase-workflow," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_queue," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_reporting-engine," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_sale-workflow," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_server-auth," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_server-brand," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_server-env," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_server-tools," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_server-ux," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_social," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_stock-logistics-warehouse," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_timesheet," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_website," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/OCA_wms," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/SanteLibre_santelibre_addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/Smile-SA_odoo_addons," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/muk-it_muk_base," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/muk-it_muk_dms," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/muk-it_muk_docs," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/muk-it_muk_misc," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/muk-it_muk_quality," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/muk-it_muk_web," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/muk-it_muk_website," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/odooaktiv_QuotationRevision," >> ${OE_CONFIG_FILE}
- printf "${OE_HOME}/addons/openeducat_openeducat_erp," >> ${OE_CONFIG_FILE}
-fi
-printf "\n" >> ${OE_CONFIG_FILE}
-
-printf "workers = 0\n" >> ${OE_CONFIG_FILE}
-printf "max_cron_threads = 2\n" >> ${OE_CONFIG_FILE}
-
-if [ ${INSTALL_NGINX} = "True" ]; then
- printf "xmlrpc_interface = 127.0.0.1\n" >> ${OE_CONFIG_FILE}
- printf "netrpc_interface = 127.0.0.1\n" >> ${OE_CONFIG_FILE}
- printf "proxy_mode = True\n" >> ${OE_CONFIG_FILE}
-fi
-
-echo -e "\n---- Install Odoo with addons module ----"
-git submodule update --init
-
-echo -e "\n---- Create Virtual environment Python ----"
-cd ${OE_HOME}
-if [[ ${PYTHON37} = "True" ]]; then
- python3.7 -m venv venv
-elif [[ ${PYTHON36} = "True" ]]; then
- python3.6 -m venv venv
-fi
-cd -
-
-echo -e "\n---- Install python packages/requirements ----"
-${OE_HOME}/venv/bin/pip3 install --upgrade pip
-${OE_HOME}/venv/bin/pip3 install wheel phonenumbers
-${OE_HOME}/venv/bin/pip3 install -r "${OE_HOME}/odoo/requirements.txt"
-${OE_HOME}/venv/bin/pip3 install -r "${OE_HOME}/requirements.txt"
-
-# For dev/testing
-${OE_HOME}/venv/bin/pip3 install websocket-client
-
-echo -e "\n---- Add link dependency in site-packages of Python ----"
-if [[ ${PYTHON37} = "True" ]]; then
- ln -fs ${OE_HOME_EXT}/odoo ${OE_HOME}/venv/lib/python3.7/site-packages/
-elif [[ ${PYTHON36} = "True" ]]; then
- ln -fs ${OE_HOME_EXT}/odoo ${OE_HOME}/venv/lib/python3.6/site-packages/
-fi
diff --git a/script/odoo_install_production.sh b/script/odoo_install_production.sh
deleted file mode 100755
index c770f4f..0000000
--- a/script/odoo_install_production.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/bash
-################################################################################
-# Script for installing Odoo on Ubuntu 14.04, 15.04, 16.04 and 18.04 (could be used for other version too)
-# Author: Yenthe Van Ginneken
-#-------------------------------------------------------------------------------
-# This script will install Odoo on your Ubuntu 16.04 server. It can install multiple Odoo instances
-# in one Ubuntu because of the different xmlrpc_ports
-#-------------------------------------------------------------------------------
-################################################################################
-
-. ./env_var.sh
-
-./script/odoo_install_debian_dependancy.sh
-
-echo -e "\n---- Create ODOO system user ----"
-sudo adduser --system --quiet --shell=/bin/bash --home=/${OE_USER} --gecos 'ODOO' --group ${OE_USER}
-#The user should also be added to the sudo'ers group.
-sudo adduser ${OE_USER} sudo
-
-echo -e "\n---- Creating the ODOO PostgreSQL User ----"
-sudo su - postgres -c "createuser -s ${OE_USER}" 2> /dev/null || true
-
-#echo -e "\n---- Create Log directory ----"
-#sudo mkdir /var/log/${OE_USER}
-#sudo chown ${OE_USER}:${OE_USER} /var/log/${OE_USER}
-
-echo -e "\n---- Setting permissions on home folder ----"
-sudo mkdir -p ${OE_HOME}
-sudo chown -R ${OE_USER}:${OE_USER} ${OE_HOME}
-
-#--------------------------------------------------
-# Install ODOO
-#--------------------------------------------------
-echo -e "\n==== Clone this installation ===="
-REMOTE_URL_GIT=`git remote get-url origin`
-BRANCH_GIT=`git rev-parse --abbrev-ref HEAD`
-sudo su ${OE_USER} -c "git clone --branch ${BRANCH_GIT} ${REMOTE_URL_GIT} ${OE_HOME_ODOO}"
-sudo cp ./env_var.sh ${OE_HOME_ODOO}
-sudo chown -R ${OE_USER}:${OE_USER} ${OE_HOME_ODOO}/env_var.sh
-
-LAST_PWD=$PWD
-cd ${OE_HOME_ODOO}
-sudo su ${OE_USER} -c "./script/odoo_install_locally.sh"
-cd ${LAST_PWD}
-#echo -e "\n* Updating server config file"
-#sudo su ${OE_USER} -c "printf 'logfile = /var/log/${OE_USER}/${OE_CONFIG}.log\n' >> /${OE_USER}/odoo/config.conf"
-
-#--------------------------------------------------
-# Adding ODOO as a daemon
-#--------------------------------------------------
-./script/odoo_install_daemon.sh
-
-#--------------------------------------------------
-# Install Nginx if needed
-#--------------------------------------------------
-./script/odoo_install_production_nginx.sh
\ No newline at end of file
diff --git a/source_repo_addons.csv b/source_repo_addons.csv
new file mode 100644
index 0000000..2f64738
--- /dev/null
+++ b/source_repo_addons.csv
@@ -0,0 +1,88 @@
+url,path,revision,clone-depth
+https://github.com/ERPLibre/erplibre_addons.git,addons,,
+https://github.com/MathBenTech/development.git,addons,,
+https://github.com/MathBenTech/odoo-business-spending-management-quebec-canada.git,addons,stable_prod_12.0,
+https://github.com/MathBenTech/scrummer.git,addons,,
+https://github.com/muk-it/muk_base.git,addons,,
+https://github.com/muk-it/muk_dms.git,addons,,
+https://github.com/muk-it/muk_docs.git,addons,,
+https://github.com/muk-it/muk_misc.git,addons,,
+https://github.com/muk-it/muk_quality.git,addons,,
+https://github.com/muk-it/muk_web.git,addons,,
+https://github.com/muk-it/muk_website.git,addons,,
+https://github.com/Numigi/odoo-base-addons.git,addons,,
+https://github.com/Numigi/odoo-entertainment-addons.git,addons,,
+https://github.com/Numigi/odoo-git-addons.git,addons,,
+https://github.com/Numigi/odoo-hr-addons.git,addons,,
+https://github.com/Numigi/odoo-partner-addons.git,addons,,
+https://github.com/Numigi/odoo-product-addons.git,addons,,
+https://github.com/Numigi/odoo-project-addons.git,addons,,
+https://github.com/Numigi/odoo-purchase-addons.git,addons,,
+https://github.com/Numigi/odoo-stock-addons.git,addons,,
+https://github.com/Numigi/odoo-survey-addons.git,addons,,
+https://github.com/Numigi/odoo-timesheet-addons.git,addons,,
+https://github.com/Numigi/odoo-web-addons.git,addons,,
+https://github.com/OCA/account-analytic.git,addons,,
+https://github.com/OCA/account-budgeting.git,addons,,
+https://github.com/OCA/account-closing.git,addons,,
+https://github.com/OCA/account-consolidation.git,addons,,
+https://github.com/OCA/account-financial-reporting.git,addons,,
+https://github.com/OCA/account-financial-tools.git,addons,,
+https://github.com/OCA/account-fiscal-rule.git,addons,,
+https://github.com/OCA/account-invoicing.git,addons,,
+https://github.com/OCA/account-invoice-reporting.git,addons,,
+https://github.com/OCA/account-payment.git,addons,,
+https://github.com/OCA/account-reconcile.git,addons,,
+https://github.com/OCA/apps-store.git,addons,,
+https://github.com/OCA/bank-payment.git,addons,,
+https://github.com/OCA/bank-statement-import.git,addons,,
+https://github.com/OCA/brand.git,addons,,
+https://github.com/OCA/business-requirement.git,addons,,
+https://github.com/OCA/commission.git,addons,,
+https://github.com/OCA/community-data-files.git,addons,,
+https://github.com/OCA/connector-telephony.git,addons,,
+https://github.com/OCA/contract.git,addons,,
+https://github.com/OCA/credit-control.git,addons,,
+https://github.com/OCA/currency.git,addons,,
+https://github.com/OCA/data-protection.git,addons,,
+https://github.com/OCA/donation.git,addons,,
+https://github.com/OCA/e-commerce.git,addons,,
+https://github.com/OCA/edi.git,addons,,
+https://github.com/OCA/event.git,addons,,
+https://github.com/OCA/helpdesk.git,addons,,
+https://github.com/OCA/hr.git,addons,,
+https://github.com/OCA/knowledge.git,addons,,
+https://github.com/OCA/l10n-canada.git,addons,,
+https://github.com/OCA/maintenance.git,addons,,
+https://github.com/OCA/management-system.git,addons,,
+https://github.com/OCA/manufacture.git,addons,,
+https://github.com/OCA/margin-analysis.git,addons,,
+https://github.com/OCA/mis-builder.git,addons,,
+https://github.com/OCA/multi-company.git,addons,,
+https://github.com/OCA/partner-contact.git,addons,,
+https://github.com/OCA/pos.git,addons,,
+https://github.com/OCA/product-attribute.git,addons,,
+https://github.com/OCA/product-pack.git,addons,,
+https://github.com/OCA/product-variant.git,addons,,
+https://github.com/OCA/project.git,addons,,
+https://github.com/OCA/project-reporting.git,addons,,
+https://github.com/OCA/purchase-workflow.git,addons,,
+https://github.com/OCA/queue.git,addons,,
+https://github.com/OCA/reporting-engine.git,addons,,
+https://github.com/OCA/sale-workflow.git,addons,,
+https://github.com/OCA/server-auth.git,addons,,
+https://github.com/OCA/server-brand.git,addons,,
+https://github.com/OCA/server-env.git,addons,,
+https://github.com/OCA/server-tools.git,addons,,
+https://github.com/OCA/server-ux.git,addons,,
+https://github.com/OCA/social.git,addons,,
+https://github.com/OCA/stock-logistics-warehouse.git,addons,,
+https://github.com/OCA/timesheet.git,addons,,
+https://github.com/OCA/web.git,addons,,
+https://github.com/OCA/website.git,addons,,
+https://github.com/OCA/wms.git,addons,,
+https://github.com/odoo/odoo.git,.,12.0_feature_5_star_CRM,1
+https://github.com/odooaktiv/QuotationRevision.git,addons,,
+https://github.com/openeducat/openeducat_erp.git,addons,,
+https://github.com/SanteLibre/santelibre_addons.git,addons,master,
+https://github.com/Smile-SA/odoo_addons.git,addons,,
diff --git a/source_repo_addons_odoo.csv b/source_repo_addons_odoo.csv
deleted file mode 100644
index 0206b11..0000000
--- a/source_repo_addons_odoo.csv
+++ /dev/null
@@ -1,88 +0,0 @@
-url,path
-https://github.com/ERPLibre/erplibre_addons.git,addons
-https://github.com/MathBenTech/development.git,addons
-https://github.com/MathBenTech/odoo-business-spending-management-quebec-canada.git,addons
-https://github.com/MathBenTech/scrummer.git,addons
-https://github.com/muk-it/muk_base.git,addons
-https://github.com/muk-it/muk_dms.git,addons
-https://github.com/muk-it/muk_docs.git,addons
-https://github.com/muk-it/muk_misc.git,addons
-https://github.com/muk-it/muk_quality.git,addons
-https://github.com/muk-it/muk_web.git,addons
-https://github.com/muk-it/muk_website.git,addons
-https://github.com/Numigi/odoo-base-addons.git,addons
-https://github.com/Numigi/odoo-entertainment-addons.git,addons
-https://github.com/Numigi/odoo-git-addons.git,addons
-https://github.com/Numigi/odoo-hr-addons.git,addons
-https://github.com/Numigi/odoo-partner-addons.git,addons
-https://github.com/Numigi/odoo-product-addons.git,addons
-https://github.com/Numigi/odoo-project-addons.git,addons
-https://github.com/Numigi/odoo-purchase-addons.git,addons
-https://github.com/Numigi/odoo-stock-addons.git,addons
-https://github.com/Numigi/odoo-survey-addons.git,addons
-https://github.com/Numigi/odoo-timesheet-addons.git,addons
-https://github.com/Numigi/odoo-web-addons.git,addons
-https://github.com/OCA/account-analytic.git,addons
-https://github.com/OCA/account-budgeting.git,addons
-https://github.com/OCA/account-closing.git,addons
-https://github.com/OCA/account-consolidation.git,addons
-https://github.com/OCA/account-financial-reporting.git,addons
-https://github.com/OCA/account-financial-tools,addons
-https://github.com/OCA/account-fiscal-rule.git,addons
-https://github.com/OCA/account-invoicing.git,addons
-https://github.com/OCA/account-invoice-reporting.git,addons
-https://github.com/OCA/account-payment.git,addons
-https://github.com/OCA/account-reconcile.git,addons
-https://github.com/OCA/apps-store.git,addons
-https://github.com/OCA/bank-payment.git,addons
-https://github.com/OCA/bank-statement-import.git,addons
-https://github.com/OCA/brand.git,addons
-https://github.com/OCA/business-requirement.git,addons
-https://github.com/OCA/commission.git,addons
-https://github.com/OCA/community-data-files.git,addons
-https://github.com/OCA/connector-telephony.git,addons
-https://github.com/OCA/contract.git,addons
-https://github.com/OCA/credit-control.git,addons
-https://github.com/OCA/currency.git,addons
-https://github.com/OCA/data-protection.git,addons
-https://github.com/OCA/donation.git,addons
-https://github.com/OCA/e-commerce.git,addons
-https://github.com/OCA/edi.git,addons
-https://github.com/OCA/event.git,addons
-https://github.com/OCA/helpdesk.git,addons
-https://github.com/OCA/hr.git,addons
-https://github.com/OCA/knowledge.git,addons
-https://github.com/OCA/l10n-canada.git,addons
-https://github.com/OCA/maintenance.git,addons
-https://github.com/OCA/management-system.git,addons
-https://github.com/OCA/manufacture.git,addons
-https://github.com/OCA/margin-analysis.git,addons
-https://github.com/OCA/mis-builder.git,addons
-https://github.com/OCA/multi-company.git,addons
-https://github.com/OCA/partner-contact.git,addons
-https://github.com/OCA/pos.git,addons
-https://github.com/OCA/product-attribute.git,addons
-https://github.com/OCA/product-pack.git,addons
-https://github.com/OCA/product-variant.git,addons
-https://github.com/OCA/project.git,addons
-https://github.com/OCA/project-reporting.git,addons
-https://github.com/OCA/purchase-workflow.git,addons
-https://github.com/OCA/queue.git,addons
-https://github.com/OCA/reporting-engine.git,addons
-https://github.com/OCA/sale-workflow.git,addons
-https://github.com/OCA/server-auth.git,addons
-https://github.com/OCA/server-brand.git,addons
-https://github.com/OCA/server-env.git,addons
-https://github.com/OCA/server-tools.git,addons
-https://github.com/OCA/server-ux.git,addons
-https://github.com/OCA/social.git,addons
-https://github.com/OCA/stock-logistics-warehouse.git,addons
-https://github.com/OCA/timesheet.git,addons
-https://github.com/OCA/web.git,addons
-https://github.com/OCA/website.git,addons
-https://github.com/OCA/wms.git,addons
-https://github.com/odoo/odoo.git,.
-https://github.com/odooaktiv/QuotationRevision.git,addons
-https://github.com/openeducat/openeducat_erp.git,addons
-https://github.com/SanteLibre/santelibre_addons.git,addons
-https://github.com/Smile-SA/odoo_addons.git,addons