From c907fc792b8ebd85845c07dde545e4ab779077f1 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Thu, 9 Nov 2023 00:36:33 +0100 Subject: [PATCH 01/28] 17.0 - Initial setup --- .github/workflows/documentation-commit.yml | 66 ++++++++++ .github/workflows/test-migration.yml | 143 +++++++++++++++++++++ 2 files changed, 209 insertions(+) create mode 100644 .github/workflows/documentation-commit.yml create mode 100644 .github/workflows/test-migration.yml diff --git a/.github/workflows/documentation-commit.yml b/.github/workflows/documentation-commit.yml new file mode 100644 index 000000000000..7438211c4abc --- /dev/null +++ b/.github/workflows/documentation-commit.yml @@ -0,0 +1,66 @@ +# On each push in 16.0 branch, +# AND if the coverage file changed, +# build documentation branch and commit the changes +# so that the changes are visible on the website +# https://oca.github.io/OpenUpgrade/ + +name: Build and commit documentation + +on: + push: + paths: ["docsource/modules150-160.rst"] + +jobs: + documentation-commit: + runs-on: ubuntu-latest + steps: + - name: Check out OpenUpgrade Documentation + uses: actions/checkout@v2 + with: + ref: "documentation" + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + - name: Check out Odoo + uses: actions/checkout@v2 + with: + repository: odoo/odoo + ref: "16.0" + fetch-depth: 1 + path: odoo + - name: Configuration + run: | + sudo apt update + sudo apt install \ + expect \ + expect-dev \ + libevent-dev \ + libldap2-dev \ + libsasl2-dev \ + libxml2-dev \ + libxslt1-dev \ + nodejs \ + python3-lxml \ + python3-passlib \ + python3-psycopg2 \ + python3-serial \ + python3-simplejson \ + python3-werkzeug \ + python3-yaml \ + unixodbc-dev + - name: Requirements Installation + run: | + pip install -q -r odoo/requirements.txt + pip install -r ./requirements.txt + - name: OpenUpgrade Docs + run: | + # try to build the documentation + sh ./build_openupgrade_docs + - name: Commit changes + uses: EndBug/add-and-commit@v9 + with: + add: "docs" + default_author: github_actions + message: "[UPD] HTML documentation" diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml new file mode 100644 index 000000000000..097177f1e859 --- /dev/null +++ b/.github/workflows/test-migration.yml @@ -0,0 +1,143 @@ +# This workflow will install Python dependencies, run tests and lint with a +# single version of Python. For more information see: +# https://help.github.com/actions/language-and-framework-guides\ +# /using-python-with-github-actions + +name: Test OpenUpgrade migration + +on: + push: + branches: ["16.0*"] + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + env: + DB: "openupgrade" + DB_HOST: "localhost" + DB_PASSWORD: "odoo" + DB_PORT: 5432 + DB_USERNAME: "odoo" + DOWNLOADS: https://github.com/OCA/OpenUpgrade/releases/download/databases + ODOO: "./odoo/odoo-bin" + PGHOST: "localhost" + PGPASSWORD: "odoo" + PGUSER: "odoo" + OPENUPGRADE_USE_DEMO: "yes" + steps: + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + - name: Configure Postgres + uses: harmon758/postgresql-action@v1 + with: + postgresql version: "14" + postgresql user: ${DB_USERNAME} + postgresql password: ${DB_PASSWORD} + - name: Wait / Sleep + uses: jakejarvis/wait-action@v0.1.0 + with: + time: "10s" + - name: DB Creation + run: createdb $DB + - name: DB Restore + run: | + wget -q -O- $DOWNLOADS/15.0.psql | pg_restore -d $DB --no-owner + - name: Check out Odoo + uses: actions/checkout@v2 + with: + repository: odoo/odoo + ref: "16.0" + fetch-depth: 1 + path: odoo + - name: Check out previous Odoo + uses: actions/checkout@v2 + with: + repository: odoo/odoo + ref: "15.0" + fetch-depth: 1 + path: odoo-old + - name: Check out OpenUpgrade + uses: actions/checkout@v2 + with: + path: openupgrade + - name: Configuration + run: | + sudo apt update + sudo apt install \ + expect \ + expect-dev \ + libevent-dev \ + libldap2-dev \ + libsasl2-dev \ + libxml2-dev \ + libxslt1-dev \ + nodejs \ + python3-lxml \ + python3-passlib \ + python3-psycopg2 \ + python3-serial \ + python3-simplejson \ + python3-werkzeug \ + python3-yaml \ + unixodbc-dev + - name: Requirements Installation + run: | + pip install -q -r odoo/requirements.txt + pip install -r ./openupgrade/requirements.txt + # this is for v15 l10n_eg_edi_eta which crashes without it + pip install asn1crypto + - name: Test data + run: | + for snippet in openupgrade/openupgrade_scripts/scripts/*/*/tests/data*.py; do + odoo-old/odoo-bin shell -d $DB < $snippet + done + - name: OpenUpgrade test + run: | + # select modules and perform the upgrade + MODULES_OLD=$(\ + sed -n '/^+========/,$p' \ + openupgrade/docsource/modules150-160.rst \ + | grep "Done\|Partial\|Nothing" \ + | grep -v "theme_" \ + | sed -rn 's/((^\| *\|del\| *)|^\| *)([0-9a-z_]*)[ \|].*/\3/g p' \ + | sed '/^\s*$/d' \ + | paste -d, -s) + MODULES_NEW=$(\ + sed -n '/^+========/,$p' \ + openupgrade/docsource/modules150-160.rst \ + | grep "Done\|Partial\|Nothing" \ + | grep -v "theme_" \ + | sed -rn 's/((^\| *\|new\| *)|^\| *)([0-9a-z_]*)[ \|].*/\3/g p' \ + | sed '/^\s*$/d' \ + | paste -d, -s) + if [ -z "$MODULES_NEW" ]; then + echo "No modules to test yet" + exit + fi + REQUEST="update ir_module_module set state='uninstalled' \ + where name not in ('$(echo $MODULES_OLD | sed -e "s/,/','/g")')" + echo Set the modules as not installable if they are not in the following list : $MODULES_OLD + echo Running $REQUEST + psql $DB -c "$REQUEST" + ADDONS_PATHS="\ + $GITHUB_WORKSPACE/odoo/addons \ + $GITHUB_WORKSPACE/odoo/odoo/addons \ + $GITHUB_WORKSPACE/openupgrade" + echo Execution of Openupgrade with the update of the following modules : $MODULES_NEW + # Silence redundant logs from unlinking records (1 line is enough) + # to prevent log overflow + OPENUPGRADE_TESTS=1 $ODOO \ + --addons-path=`echo $ADDONS_PATHS | awk -v OFS="," '$1=$1'` \ + --database=$DB \ + --db_host=$DB_HOST \ + --db_password=$DB_PASSWORD \ + --db_port=$DB_PORT \ + --db_user=$DB_USERNAME \ + --load=base,web,openupgrade_framework \ + --log-handler odoo.models.unlink:WARNING \ + --test-enable \ + --stop-after-init \ + --update=$MODULES_NEW From 488b0c08c537b6040bdb969bac4b15fd00b0579b Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Thu, 9 Nov 2023 00:54:17 +0100 Subject: [PATCH 02/28] [INIT] Adapt to V17 - Apply new copier template. (from v1.14.2 to v1.18 : replace setup by pyproject.toml, replace black by ruff, ...) - Disable .github/workflows/test.yml because the openupgrade is not initialized yet - add new empty modules160-170.rst file --- .github/workflows/documentation-commit.yml | 6 +++--- .github/workflows/test-migration.yml | 18 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/documentation-commit.yml b/.github/workflows/documentation-commit.yml index 7438211c4abc..721721ef8b27 100644 --- a/.github/workflows/documentation-commit.yml +++ b/.github/workflows/documentation-commit.yml @@ -1,4 +1,4 @@ -# On each push in 16.0 branch, +# On each push in 17.0 branch, # AND if the coverage file changed, # build documentation branch and commit the changes # so that the changes are visible on the website @@ -8,7 +8,7 @@ name: Build and commit documentation on: push: - paths: ["docsource/modules150-160.rst"] + paths: ["docsource/modules160-170.rst"] jobs: documentation-commit: @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v2 with: repository: odoo/odoo - ref: "16.0" + ref: "17.0" fetch-depth: 1 path: odoo - name: Configuration diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index 097177f1e859..6f58dffe85cc 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -6,9 +6,9 @@ name: Test OpenUpgrade migration on: - push: - branches: ["16.0*"] - pull_request: + # push: + # branches: ["17.0*"] + # pull_request: jobs: test: @@ -44,19 +44,19 @@ jobs: run: createdb $DB - name: DB Restore run: | - wget -q -O- $DOWNLOADS/15.0.psql | pg_restore -d $DB --no-owner + wget -q -O- $DOWNLOADS/16.0.psql | pg_restore -d $DB --no-owner - name: Check out Odoo uses: actions/checkout@v2 with: repository: odoo/odoo - ref: "16.0" + ref: "17.0" fetch-depth: 1 path: odoo - name: Check out previous Odoo uses: actions/checkout@v2 with: repository: odoo/odoo - ref: "15.0" + ref: "16.0" fetch-depth: 1 path: odoo-old - name: Check out OpenUpgrade @@ -87,7 +87,7 @@ jobs: run: | pip install -q -r odoo/requirements.txt pip install -r ./openupgrade/requirements.txt - # this is for v15 l10n_eg_edi_eta which crashes without it + # this is for v16 l10n_eg_edi_eta which crashes without it pip install asn1crypto - name: Test data run: | @@ -99,7 +99,7 @@ jobs: # select modules and perform the upgrade MODULES_OLD=$(\ sed -n '/^+========/,$p' \ - openupgrade/docsource/modules150-160.rst \ + openupgrade/docsource/modules160-170.rst \ | grep "Done\|Partial\|Nothing" \ | grep -v "theme_" \ | sed -rn 's/((^\| *\|del\| *)|^\| *)([0-9a-z_]*)[ \|].*/\3/g p' \ @@ -107,7 +107,7 @@ jobs: | paste -d, -s) MODULES_NEW=$(\ sed -n '/^+========/,$p' \ - openupgrade/docsource/modules150-160.rst \ + openupgrade/docsource/modules160-170.rst \ | grep "Done\|Partial\|Nothing" \ | grep -v "theme_" \ | sed -rn 's/((^\| *\|new\| *)|^\| *)([0-9a-z_]*)[ \|].*/\3/g p' \ From 085605163ec073d0a89df87e0a8bdf8732bfd64a Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Thu, 9 Nov 2023 00:54:17 +0100 Subject: [PATCH 03/28] [INIT] Realy disable .github/workflows/test.yml because the openupgrade is not initialized yet --- .github/workflows/test-migration.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index 6f58dffe85cc..cf8470221c88 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -6,9 +6,8 @@ name: Test OpenUpgrade migration on: - # push: - # branches: ["17.0*"] - # pull_request: + push: + branches: ["18.0*"] jobs: test: From 3efc2eadabb3eb7f3d211e5eb3725d4f9014fac7 Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Fri, 2 Feb 2024 20:26:00 +0100 Subject: [PATCH 04/28] [MIG] openupgrade_scripts: scaffolding the 17.0 module --- openupgrade_scripts/README.rst | 88 ++++ openupgrade_scripts/__init__.py | 0 openupgrade_scripts/__manifest__.py | 20 + openupgrade_scripts/pyproject.toml | 3 + openupgrade_scripts/readme/CONFIGURE.md | 11 + openupgrade_scripts/readme/DESCRIPTION.md | 2 + openupgrade_scripts/readme/INSTALL.md | 2 + .../static/description/banner.png | Bin 0 -> 26859 bytes .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 430 ++++++++++++++++++ 10 files changed, 556 insertions(+) create mode 100644 openupgrade_scripts/README.rst create mode 100644 openupgrade_scripts/__init__.py create mode 100644 openupgrade_scripts/__manifest__.py create mode 100644 openupgrade_scripts/pyproject.toml create mode 100644 openupgrade_scripts/readme/CONFIGURE.md create mode 100644 openupgrade_scripts/readme/DESCRIPTION.md create mode 100644 openupgrade_scripts/readme/INSTALL.md create mode 100644 openupgrade_scripts/static/description/banner.png create mode 100644 openupgrade_scripts/static/description/icon.png create mode 100644 openupgrade_scripts/static/description/index.html diff --git a/openupgrade_scripts/README.rst b/openupgrade_scripts/README.rst new file mode 100644 index 000000000000..e73fb2c9f8fc --- /dev/null +++ b/openupgrade_scripts/README.rst @@ -0,0 +1,88 @@ +=================== +Openupgrade Scripts +=================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:1e4e622a463d6aaf9a8985ff9e4dfd399e5d0d34cf47c1513ded9740a7925a43 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fopenupgrade-lightgray.png?logo=github + :target: https://github.com/OCA/openupgrade/tree/17.0/openupgrade_scripts + :alt: OCA/openupgrade +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/openupgrade-17-0/openupgrade-17-0-openupgrade_scripts + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/openupgrade&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module is a containers of migration script to migrate from 16.0 to +17.0 version. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +This module does not need to be installed on a database. It simply needs +to be available via your ``addons-path``. + +Configuration +============= + +- call your odoo instance with the option + ``--upgrade-path=/PATH_TO_openupgrade_scripts_MODULE/scripts/`` + +or + +- add the key to your configuration file: + +.. code:: shell + + [options] + upgrade_path = /PATH_TO_openupgrade_scripts_MODULE/scripts/ + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/openupgrade `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/openupgrade_scripts/__init__.py b/openupgrade_scripts/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/openupgrade_scripts/__manifest__.py b/openupgrade_scripts/__manifest__.py new file mode 100644 index 000000000000..6e920dfff450 --- /dev/null +++ b/openupgrade_scripts/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright Odoo Community Association (OCA) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Openupgrade Scripts", + "summary": """Module that contains all the migrations analysis + and scripts for migrate Odoo SA modules.""", + "author": "Odoo Community Association (OCA)", + "website": "https://github.com/OCA/OpenUpgrade", + "category": "Migration", + "version": "17.0.1.0.0", + "license": "AGPL-3", + "depends": ["base"], + "images": ["static/description/banner.jpg"], + "external_dependencies": { + "python": [ + "openupgradelib @ git+https://github.com/OCA/openupgradelib.git@master" + ] + }, + "installable": True, +} diff --git a/openupgrade_scripts/pyproject.toml b/openupgrade_scripts/pyproject.toml new file mode 100644 index 000000000000..4231d0cccb3d --- /dev/null +++ b/openupgrade_scripts/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/openupgrade_scripts/readme/CONFIGURE.md b/openupgrade_scripts/readme/CONFIGURE.md new file mode 100644 index 000000000000..102ae2481b2f --- /dev/null +++ b/openupgrade_scripts/readme/CONFIGURE.md @@ -0,0 +1,11 @@ +- call your odoo instance with the option + `--upgrade-path=/PATH_TO_openupgrade_scripts_MODULE/scripts/` + +or + +- add the key to your configuration file: + +``` shell +[options] +upgrade_path = /PATH_TO_openupgrade_scripts_MODULE/scripts/ +``` diff --git a/openupgrade_scripts/readme/DESCRIPTION.md b/openupgrade_scripts/readme/DESCRIPTION.md new file mode 100644 index 000000000000..ed2d25468b08 --- /dev/null +++ b/openupgrade_scripts/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This module is a containers of migration script to migrate from 16.0 to +17.0 version. diff --git a/openupgrade_scripts/readme/INSTALL.md b/openupgrade_scripts/readme/INSTALL.md new file mode 100644 index 000000000000..471a1d162ce1 --- /dev/null +++ b/openupgrade_scripts/readme/INSTALL.md @@ -0,0 +1,2 @@ +This module does not need to be installed on a database. It simply needs +to be available via your `addons-path`. diff --git a/openupgrade_scripts/static/description/banner.png b/openupgrade_scripts/static/description/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd67ec04cf40822d9d976b548273f4472b83cea GIT binary patch literal 26859 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/openupgrade_scripts/static/description/index.html b/openupgrade_scripts/static/description/index.html new file mode 100644 index 000000000000..d63ff6e71f69 --- /dev/null +++ b/openupgrade_scripts/static/description/index.html @@ -0,0 +1,430 @@ + + + + + + +Openupgrade Scripts + + + +
+

Openupgrade Scripts

+ + +

Beta License: AGPL-3 OCA/openupgrade Translate me on Weblate Try me on Runboat

+

This module is a containers of migration script to migrate from 16.0 to +17.0 version.

+

Table of contents

+ +
+

Installation

+

This module does not need to be installed on a database. It simply needs +to be available via your addons-path.

+
+
+

Configuration

+
    +
  • call your odoo instance with the option +--upgrade-path=/PATH_TO_openupgrade_scripts_MODULE/scripts/
  • +
+

or

+
    +
  • add the key to your configuration file:
  • +
+
+[options]
+upgrade_path = /PATH_TO_openupgrade_scripts_MODULE/scripts/
+
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/openupgrade project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + From 5544580d25a796783216c46c22b96048ac904029 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 27 Feb 2024 18:59:06 +0000 Subject: [PATCH 05/28] [BOT] post-merge updates --- openupgrade_scripts/README.rst | 18 +++++++++--------- .../static/description/index.html | 11 +++++------ 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/openupgrade_scripts/README.rst b/openupgrade_scripts/README.rst index e73fb2c9f8fc..c94d1ca26fc8 100644 --- a/openupgrade_scripts/README.rst +++ b/openupgrade_scripts/README.rst @@ -7,7 +7,7 @@ Openupgrade Scripts !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:1e4e622a463d6aaf9a8985ff9e4dfd399e5d0d34cf47c1513ded9740a7925a43 + !! source digest: sha256:a87d5b3cc86db365a3fd1ffce8f80833105ddbf1ad7b8f9318ebc8cf6cdf5a40 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -16,14 +16,14 @@ Openupgrade Scripts .. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 -.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fopenupgrade-lightgray.png?logo=github - :target: https://github.com/OCA/openupgrade/tree/17.0/openupgrade_scripts - :alt: OCA/openupgrade +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2FOpenUpgrade-lightgray.png?logo=github + :target: https://github.com/OCA/OpenUpgrade/tree/17.0/openupgrade_scripts + :alt: OCA/OpenUpgrade .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/openupgrade-17-0/openupgrade-17-0-openupgrade_scripts + :target: https://translation.odoo-community.org/projects/OpenUpgrade-17-0/OpenUpgrade-17-0-openupgrade_scripts :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/openupgrade&target_branch=17.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/OpenUpgrade&target_branch=17.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -60,10 +60,10 @@ or Bug Tracker =========== -Bugs are tracked on `GitHub Issues `_. +Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -83,6 +83,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/openupgrade `_ project on GitHub. +This module is part of the `OCA/OpenUpgrade `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/openupgrade_scripts/static/description/index.html b/openupgrade_scripts/static/description/index.html index d63ff6e71f69..15e7adb4d8ff 100644 --- a/openupgrade_scripts/static/description/index.html +++ b/openupgrade_scripts/static/description/index.html @@ -1,4 +1,3 @@ - @@ -367,9 +366,9 @@

Openupgrade Scripts

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:1e4e622a463d6aaf9a8985ff9e4dfd399e5d0d34cf47c1513ded9740a7925a43 +!! source digest: sha256:a87d5b3cc86db365a3fd1ffce8f80833105ddbf1ad7b8f9318ebc8cf6cdf5a40 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/openupgrade Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/OpenUpgrade Translate me on Weblate Try me on Runboat

This module is a containers of migration script to migrate from 16.0 to 17.0 version.

Table of contents

@@ -406,10 +405,10 @@

Configuration

Bug Tracker

-

Bugs are tracked on GitHub Issues. +

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -421,7 +420,7 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/openupgrade project on GitHub.

+

This module is part of the OCA/OpenUpgrade project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

From 9061ffdd8b5273307e4b398d2fdc0a028eed413c Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Wed, 28 Feb 2024 10:54:07 +0100 Subject: [PATCH 06/28] [FIX] define openupgradelib git url in test-requirements.txt --- openupgrade_scripts/__manifest__.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/openupgrade_scripts/__manifest__.py b/openupgrade_scripts/__manifest__.py index 6e920dfff450..7d52e6b74a43 100644 --- a/openupgrade_scripts/__manifest__.py +++ b/openupgrade_scripts/__manifest__.py @@ -11,10 +11,6 @@ "license": "AGPL-3", "depends": ["base"], "images": ["static/description/banner.jpg"], - "external_dependencies": { - "python": [ - "openupgradelib @ git+https://github.com/OCA/openupgradelib.git@master" - ] - }, + "external_dependencies": {"python": ["openupgradelib"]}, "installable": True, } From e2f32888ba660852e9cd3c0c157af5aa43f0344d Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 28 Feb 2024 10:07:00 +0000 Subject: [PATCH 07/28] [BOT] post-merge updates --- openupgrade_scripts/README.rst | 2 +- openupgrade_scripts/__manifest__.py | 2 +- openupgrade_scripts/static/description/index.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openupgrade_scripts/README.rst b/openupgrade_scripts/README.rst index c94d1ca26fc8..4674292a99bb 100644 --- a/openupgrade_scripts/README.rst +++ b/openupgrade_scripts/README.rst @@ -7,7 +7,7 @@ Openupgrade Scripts !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:a87d5b3cc86db365a3fd1ffce8f80833105ddbf1ad7b8f9318ebc8cf6cdf5a40 + !! source digest: sha256:3cb15c664a340eb7bbf13cf5062e582f1221d6433d0f22033885de27bb1f64d4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/openupgrade_scripts/__manifest__.py b/openupgrade_scripts/__manifest__.py index 7d52e6b74a43..b603b008efd0 100644 --- a/openupgrade_scripts/__manifest__.py +++ b/openupgrade_scripts/__manifest__.py @@ -7,7 +7,7 @@ "author": "Odoo Community Association (OCA)", "website": "https://github.com/OCA/OpenUpgrade", "category": "Migration", - "version": "17.0.1.0.0", + "version": "17.0.1.0.1", "license": "AGPL-3", "depends": ["base"], "images": ["static/description/banner.jpg"], diff --git a/openupgrade_scripts/static/description/index.html b/openupgrade_scripts/static/description/index.html index 15e7adb4d8ff..e9e8b2b8a5b0 100644 --- a/openupgrade_scripts/static/description/index.html +++ b/openupgrade_scripts/static/description/index.html @@ -366,7 +366,7 @@

Openupgrade Scripts

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:a87d5b3cc86db365a3fd1ffce8f80833105ddbf1ad7b8f9318ebc8cf6cdf5a40 +!! source digest: sha256:3cb15c664a340eb7bbf13cf5062e582f1221d6433d0f22033885de27bb1f64d4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/OpenUpgrade Translate me on Weblate Try me on Runboat

This module is a containers of migration script to migrate from 16.0 to From 321cf24f0442f8c6e2cafec56c1ca62f6380adb7 Mon Sep 17 00:00:00 2001 From: Roy Le Date: Tue, 14 May 2024 08:38:35 +0700 Subject: [PATCH 08/28] [IMP] openupgrade_framework: pre-commit auto fixes and enable .github/workflows/test.yml --- .github/workflows/test-migration.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index cf8470221c88..fb98fca398da 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -7,7 +7,8 @@ name: Test OpenUpgrade migration on: push: - branches: ["18.0*"] + branches: ["17.0*"] + pull_request: jobs: test: From 2dcee94ae76d340ba2bb1cf2ff160fb919615f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20=C4=90=E1=BA=A1i=20D=C6=B0=C6=A1ng?= Date: Wed, 22 May 2024 11:33:11 +0700 Subject: [PATCH 09/28] [MIG] openupgrade_framework v17 -This commit remove unecessary patch -Check if test exist then execute it in the test.yml -Remove the test loader from patch, detail at https://github.com/OCA/OpenUpgrade/pull/4327#discussion_r1546380226 --- .github/workflows/test-migration.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index fb98fca398da..01e721f2268c 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -91,9 +91,11 @@ jobs: pip install asn1crypto - name: Test data run: | - for snippet in openupgrade/openupgrade_scripts/scripts/*/*/tests/data*.py; do - odoo-old/odoo-bin shell -d $DB < $snippet - done + if test -n "$(ls openupgrade/openupgrade_scripts/scripts/*/*/tests/data*.py 2> /dev/null)"; then + for snippet in openupgrade/openupgrade_scripts/scripts/*/*/tests/data*.py; do + odoo-old/odoo-bin shell -d $DB < $snippet + done + fi - name: OpenUpgrade test run: | # select modules and perform the upgrade From 7c664472fb77251034ff1e0ae3ea45760aa653c9 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Mon, 30 Sep 2024 12:50:40 +0200 Subject: [PATCH 10/28] [INIT] 18.0: Replace version numbers. --- .github/workflows/documentation-commit.yml | 6 +++--- .github/workflows/test-migration.yml | 12 ++++++------ openupgrade_scripts/README.rst | 4 ++-- openupgrade_scripts/__manifest__.py | 2 +- openupgrade_scripts/readme/DESCRIPTION.md | 4 ++-- openupgrade_scripts/static/description/index.html | 15 +++++++++------ 6 files changed, 23 insertions(+), 20 deletions(-) diff --git a/.github/workflows/documentation-commit.yml b/.github/workflows/documentation-commit.yml index 721721ef8b27..cdaaaf4f584a 100644 --- a/.github/workflows/documentation-commit.yml +++ b/.github/workflows/documentation-commit.yml @@ -1,4 +1,4 @@ -# On each push in 17.0 branch, +# On each push in 18.0 branch, # AND if the coverage file changed, # build documentation branch and commit the changes # so that the changes are visible on the website @@ -8,7 +8,7 @@ name: Build and commit documentation on: push: - paths: ["docsource/modules160-170.rst"] + paths: ["docsource/modules170-180.rst"] jobs: documentation-commit: @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v2 with: repository: odoo/odoo - ref: "17.0" + ref: "18.0" fetch-depth: 1 path: odoo - name: Configuration diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index 01e721f2268c..4f54872b3750 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -7,7 +7,7 @@ name: Test OpenUpgrade migration on: push: - branches: ["17.0*"] + branches: ["18.0*"] pull_request: jobs: @@ -44,19 +44,19 @@ jobs: run: createdb $DB - name: DB Restore run: | - wget -q -O- $DOWNLOADS/16.0.psql | pg_restore -d $DB --no-owner + wget -q -O- $DOWNLOADS/17.0.psql | pg_restore -d $DB --no-owner - name: Check out Odoo uses: actions/checkout@v2 with: repository: odoo/odoo - ref: "17.0" + ref: "18.0" fetch-depth: 1 path: odoo - name: Check out previous Odoo uses: actions/checkout@v2 with: repository: odoo/odoo - ref: "16.0" + ref: "17.0" fetch-depth: 1 path: odoo-old - name: Check out OpenUpgrade @@ -101,7 +101,7 @@ jobs: # select modules and perform the upgrade MODULES_OLD=$(\ sed -n '/^+========/,$p' \ - openupgrade/docsource/modules160-170.rst \ + openupgrade/docsource/modules170-180.rst \ | grep "Done\|Partial\|Nothing" \ | grep -v "theme_" \ | sed -rn 's/((^\| *\|del\| *)|^\| *)([0-9a-z_]*)[ \|].*/\3/g p' \ @@ -109,7 +109,7 @@ jobs: | paste -d, -s) MODULES_NEW=$(\ sed -n '/^+========/,$p' \ - openupgrade/docsource/modules160-170.rst \ + openupgrade/docsource/modules170-180.rst \ | grep "Done\|Partial\|Nothing" \ | grep -v "theme_" \ | sed -rn 's/((^\| *\|new\| *)|^\| *)([0-9a-z_]*)[ \|].*/\3/g p' \ diff --git a/openupgrade_scripts/README.rst b/openupgrade_scripts/README.rst index 4674292a99bb..45d2866f9431 100644 --- a/openupgrade_scripts/README.rst +++ b/openupgrade_scripts/README.rst @@ -28,8 +28,8 @@ Openupgrade Scripts |badge1| |badge2| |badge3| |badge4| |badge5| -This module is a containers of migration script to migrate from 16.0 to -17.0 version. +This module is a containers of migration script to migrate from 17.0 to +18.0 version. **Table of contents** diff --git a/openupgrade_scripts/__manifest__.py b/openupgrade_scripts/__manifest__.py index b603b008efd0..d08da8e19c9e 100644 --- a/openupgrade_scripts/__manifest__.py +++ b/openupgrade_scripts/__manifest__.py @@ -7,7 +7,7 @@ "author": "Odoo Community Association (OCA)", "website": "https://github.com/OCA/OpenUpgrade", "category": "Migration", - "version": "17.0.1.0.1", + "version": "18.0.1.0.0", "license": "AGPL-3", "depends": ["base"], "images": ["static/description/banner.jpg"], diff --git a/openupgrade_scripts/readme/DESCRIPTION.md b/openupgrade_scripts/readme/DESCRIPTION.md index ed2d25468b08..79779e0698e4 100644 --- a/openupgrade_scripts/readme/DESCRIPTION.md +++ b/openupgrade_scripts/readme/DESCRIPTION.md @@ -1,2 +1,2 @@ -This module is a containers of migration script to migrate from 16.0 to -17.0 version. +This module is a containers of migration script to migrate from 17.0 to +18.0 version. diff --git a/openupgrade_scripts/static/description/index.html b/openupgrade_scripts/static/description/index.html index e9e8b2b8a5b0..6a682c5834ee 100644 --- a/openupgrade_scripts/static/description/index.html +++ b/openupgrade_scripts/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -369,8 +370,8 @@

Openupgrade Scripts

!! source digest: sha256:3cb15c664a340eb7bbf13cf5062e582f1221d6433d0f22033885de27bb1f64d4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/OpenUpgrade Translate me on Weblate Try me on Runboat

-

This module is a containers of migration script to migrate from 16.0 to -17.0 version.

+

This module is a containers of migration script to migrate from 17.0 to +18.0 version.

Table of contents

    @@ -416,7 +417,9 @@

    Credits

    Maintainers

    This module is maintained by the OCA.

    -Odoo Community Association + +Odoo Community Association +

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    From 501965906aeefd7486ac8c4f9e7c5ac1685d127b Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 11 Oct 2024 12:02:10 +0200 Subject: [PATCH 11/28] [FIX] Don't execute regular tests --- .github/workflows/test-migration.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index 4f54872b3750..bad3d201b9de 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -140,6 +140,5 @@ jobs: --db_user=$DB_USERNAME \ --load=base,web,openupgrade_framework \ --log-handler odoo.models.unlink:WARNING \ - --test-enable \ --stop-after-init \ --update=$MODULES_NEW From dfdfb1b29aaa6a638dcd59e4e31e385911dc134b Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 18 Nov 2024 18:05:31 +0100 Subject: [PATCH 12/28] [OU-ADD] enable tests, add decorator to make them convenient to use --- .github/workflows/test-migration.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index bad3d201b9de..1af409ebb054 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -91,8 +91,8 @@ jobs: pip install asn1crypto - name: Test data run: | - if test -n "$(ls openupgrade/openupgrade_scripts/scripts/*/*/tests/data*.py 2> /dev/null)"; then - for snippet in openupgrade/openupgrade_scripts/scripts/*/*/tests/data*.py; do + if test -n "$(ls openupgrade/openupgrade_scripts/scripts/*/tests/data*.py 2> /dev/null)"; then + for snippet in openupgrade/openupgrade_scripts/scripts/*/tests/data*.py; do odoo-old/odoo-bin shell -d $DB < $snippet done fi @@ -131,7 +131,7 @@ jobs: echo Execution of Openupgrade with the update of the following modules : $MODULES_NEW # Silence redundant logs from unlinking records (1 line is enough) # to prevent log overflow - OPENUPGRADE_TESTS=1 $ODOO \ + $ODOO \ --addons-path=`echo $ADDONS_PATHS | awk -v OFS="," '$1=$1'` \ --database=$DB \ --db_host=$DB_HOST \ @@ -139,6 +139,8 @@ jobs: --db_port=$DB_PORT \ --db_user=$DB_USERNAME \ --load=base,web,openupgrade_framework \ + --test-enable \ + --test-tags openupgrade \ --log-handler odoo.models.unlink:WARNING \ --stop-after-init \ --update=$MODULES_NEW From 60ecc67789f1f643605b90c50b7e28b71af55b27 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 18 Nov 2024 18:29:59 +0100 Subject: [PATCH 13/28] [OU-FIX] apply doodba's patch to fix building gevent --- .github/workflows/documentation-commit.yml | 1 + .github/workflows/test-migration.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/documentation-commit.yml b/.github/workflows/documentation-commit.yml index cdaaaf4f584a..2d5a5f5cf677 100644 --- a/.github/workflows/documentation-commit.yml +++ b/.github/workflows/documentation-commit.yml @@ -52,6 +52,7 @@ jobs: unixodbc-dev - name: Requirements Installation run: | + sed -i -E "s/(gevent==)21\.8\.0( ; sys_platform != 'win32' and python_version == '3.10')/\122.10.2\2/;s/(greenlet==)1.1.2( ; sys_platform != 'win32' and python_version == '3.10')/\12.0.2\2/" odoo/requirements.txt pip install -q -r odoo/requirements.txt pip install -r ./requirements.txt - name: OpenUpgrade Docs diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index 1af409ebb054..4ef31247cb2f 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -85,6 +85,7 @@ jobs: unixodbc-dev - name: Requirements Installation run: | + sed -i -E "s/(gevent==)21\.8\.0( ; sys_platform != 'win32' and python_version == '3.10')/\122.10.2\2/;s/(greenlet==)1.1.2( ; sys_platform != 'win32' and python_version == '3.10')/\12.0.2\2/" odoo/requirements.txt pip install -q -r odoo/requirements.txt pip install -r ./openupgrade/requirements.txt # this is for v16 l10n_eg_edi_eta which crashes without it From 520bf7b6ee861bfddd6fb54e3c8af44e2cfedf5a Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 18 Nov 2024 23:25:19 +0100 Subject: [PATCH 14/28] [OU-ADD] explicitly disable loading demo data --- .github/workflows/test-migration.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index 4ef31247cb2f..ece160723203 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -45,6 +45,7 @@ jobs: - name: DB Restore run: | wget -q -O- $DOWNLOADS/17.0.psql | pg_restore -d $DB --no-owner + psql $DB -c "UPDATE ir_module_module SET demo=False" - name: Check out Odoo uses: actions/checkout@v2 with: @@ -144,4 +145,5 @@ jobs: --test-tags openupgrade \ --log-handler odoo.models.unlink:WARNING \ --stop-after-init \ + --without-demo=$MODULES_NEW \ --update=$MODULES_NEW From 6fb393eec0ce0ab42f7218686e2a2c39853f4857 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Sat, 30 Nov 2024 09:13:32 +0100 Subject: [PATCH 15/28] [OU-ADD] enable coverage/codecov --- .github/workflows/test-migration.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index ece160723203..ca5494ff8029 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -91,6 +91,7 @@ jobs: pip install -r ./openupgrade/requirements.txt # this is for v16 l10n_eg_edi_eta which crashes without it pip install asn1crypto + pip install coverage - name: Test data run: | if test -n "$(ls openupgrade/openupgrade_scripts/scripts/*/tests/data*.py 2> /dev/null)"; then @@ -133,6 +134,8 @@ jobs: echo Execution of Openupgrade with the update of the following modules : $MODULES_NEW # Silence redundant logs from unlinking records (1 line is enough) # to prevent log overflow + coverage run \ + --source=$GITHUB_WORKSPACE/openupgrade/openupgrade_scripts/scripts \ $ODOO \ --addons-path=`echo $ADDONS_PATHS | awk -v OFS="," '$1=$1'` \ --database=$DB \ @@ -147,3 +150,9 @@ jobs: --stop-after-init \ --without-demo=$MODULES_NEW \ --update=$MODULES_NEW + - name: Generate coverage.xml + run: coverage xml + - uses: codecov/codecov-action@v4 + with: + files: coverage.xml + token: ${{ secrets.CODECOV_TOKEN }} From 47b0d646a3ef192f42a587a7407eb7d5397ab8b3 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 20 Jan 2025 12:35:50 +0100 Subject: [PATCH 16/28] [ADD] install openupgradelib from github --- .github/workflows/test-migration.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index ca5494ff8029..fd197796d7fc 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -89,6 +89,7 @@ jobs: sed -i -E "s/(gevent==)21\.8\.0( ; sys_platform != 'win32' and python_version == '3.10')/\122.10.2\2/;s/(greenlet==)1.1.2( ; sys_platform != 'win32' and python_version == '3.10')/\12.0.2\2/" odoo/requirements.txt pip install -q -r odoo/requirements.txt pip install -r ./openupgrade/requirements.txt + pip install -U git+https://github.com/oca/openupgradelib # this is for v16 l10n_eg_edi_eta which crashes without it pip install asn1crypto pip install coverage From a0f16c53824c612fa691813e08efc317faf645b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miquel=20Ra=C3=AFch?= Date: Thu, 13 Feb 2025 12:49:55 +0100 Subject: [PATCH 17/28] [IMP] copier and github workflows --- .github/workflows/test-migration.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index fd197796d7fc..3837bc650a03 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -12,7 +12,7 @@ on: jobs: test: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 env: DB: "openupgrade" DB_HOST: "localhost" @@ -27,7 +27,7 @@ jobs: OPENUPGRADE_USE_DEMO: "yes" steps: - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.10' - name: Configure Postgres @@ -47,21 +47,21 @@ jobs: wget -q -O- $DOWNLOADS/17.0.psql | pg_restore -d $DB --no-owner psql $DB -c "UPDATE ir_module_module SET demo=False" - name: Check out Odoo - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: odoo/odoo ref: "18.0" fetch-depth: 1 path: odoo - name: Check out previous Odoo - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: odoo/odoo ref: "17.0" fetch-depth: 1 path: odoo-old - name: Check out OpenUpgrade - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: path: openupgrade - name: Configuration From ed64465b64a5c06176e6e91ae989861d230be68d Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 21 Mar 2025 11:46:27 +0000 Subject: [PATCH 18/28] [BOT] post-merge updates --- openupgrade_scripts/README.rst | 18 +++++++++--------- .../static/description/index.html | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/openupgrade_scripts/README.rst b/openupgrade_scripts/README.rst index 45d2866f9431..5c8965120a34 100644 --- a/openupgrade_scripts/README.rst +++ b/openupgrade_scripts/README.rst @@ -7,7 +7,7 @@ Openupgrade Scripts !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:3cb15c664a340eb7bbf13cf5062e582f1221d6433d0f22033885de27bb1f64d4 + !! source digest: sha256:822b62802d167eb9c5a7f7fe5a2ec56b891dd6aa8e81d31929e0f123f1e8346f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -17,13 +17,13 @@ Openupgrade Scripts :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2FOpenUpgrade-lightgray.png?logo=github - :target: https://github.com/OCA/OpenUpgrade/tree/17.0/openupgrade_scripts + :target: https://github.com/OCA/OpenUpgrade/tree/18.0/openupgrade_scripts :alt: OCA/OpenUpgrade .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/OpenUpgrade-17-0/OpenUpgrade-17-0-openupgrade_scripts + :target: https://translation.odoo-community.org/projects/OpenUpgrade-18-0/OpenUpgrade-18-0-openupgrade_scripts :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/OpenUpgrade&target_branch=17.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/OpenUpgrade&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -45,12 +45,12 @@ to be available via your ``addons-path``. Configuration ============= -- call your odoo instance with the option - ``--upgrade-path=/PATH_TO_openupgrade_scripts_MODULE/scripts/`` +- call your odoo instance with the option + ``--upgrade-path=/PATH_TO_openupgrade_scripts_MODULE/scripts/`` or -- add the key to your configuration file: +- add the key to your configuration file: .. code:: shell @@ -63,7 +63,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -83,6 +83,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/OpenUpgrade `_ project on GitHub. +This module is part of the `OCA/OpenUpgrade `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/openupgrade_scripts/static/description/index.html b/openupgrade_scripts/static/description/index.html index 6a682c5834ee..329d42ef0587 100644 --- a/openupgrade_scripts/static/description/index.html +++ b/openupgrade_scripts/static/description/index.html @@ -367,9 +367,9 @@

    Openupgrade Scripts

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:3cb15c664a340eb7bbf13cf5062e582f1221d6433d0f22033885de27bb1f64d4 +!! source digest: sha256:822b62802d167eb9c5a7f7fe5a2ec56b891dd6aa8e81d31929e0f123f1e8346f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    Beta License: AGPL-3 OCA/OpenUpgrade Translate me on Weblate Try me on Runboat

    +

    Beta License: AGPL-3 OCA/OpenUpgrade Translate me on Weblate Try me on Runboat

    This module is a containers of migration script to migrate from 17.0 to 18.0 version.

    Table of contents

    @@ -409,7 +409,7 @@

    Bug Tracker

    Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

    +feedback.

    Do not contact contributors directly about support or help with technical issues.

    @@ -423,7 +423,7 @@

    Maintainers

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    -

    This module is part of the OCA/OpenUpgrade project on GitHub.

    +

    This module is part of the OCA/OpenUpgrade project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

From adb78d08ab973f181300a681833506ea3229f162 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 24 Mar 2025 08:05:59 +0100 Subject: [PATCH 19/28] [ADD] update analysis bot --- .github/workflows/generate-analysis-cron.yml | 18 ++ .github/workflows/generate-analysis.yml | 226 +++++++++++++++++++ 2 files changed, 244 insertions(+) create mode 100644 .github/workflows/generate-analysis-cron.yml create mode 100644 .github/workflows/generate-analysis.yml diff --git a/.github/workflows/generate-analysis-cron.yml b/.github/workflows/generate-analysis-cron.yml new file mode 100644 index 000000000000..5c3c10c00565 --- /dev/null +++ b/.github/workflows/generate-analysis-cron.yml @@ -0,0 +1,18 @@ +name: Generate analysis files - cron and push + +on: + push: + # when module merges are added to apriori, this + # might cause changes in the analysis + paths: ["openupgrade_scripts/apriori.py"] + schedule: + # every monday at 04:00 + - cron: "0 4 * * 1" + +jobs: + generate-analysis18: + if: github.repository == 'OCA/OpenUpgrade' && (github.event_name == 'schedule' || github.ref_name == '18.0') + uses: ./.github/workflows/generate-analysis.yml + with: + from_version: "17.0" + to_version: "18.0" diff --git a/.github/workflows/generate-analysis.yml b/.github/workflows/generate-analysis.yml new file mode 100644 index 000000000000..3978fd8bed57 --- /dev/null +++ b/.github/workflows/generate-analysis.yml @@ -0,0 +1,226 @@ +name: Generate analysis files + +on: + workflow_call: + inputs: + from_version: + required: true + type: string + from_version_requirements: + default: 'gevent==22.10.2 greenlet==2.0.2' + type: string + from_version_requirements_sed: + default: '/^gevent\>/d; /^greenlet\>/d' + type: string + to_version: + required: true + type: string + to_version_requirements: + default: 'gevent==22.10.2 greenlet==2.0.2' + type: string + to_version_requirements_sed: + default: '/^gevent\>/d; /^greenlet\>/d' + type: string + python_version: + default: "3.10" + type: string + postgres_version: + default: "14" + type: string + +jobs: + generate-analysis: + name: Generate analysis ${{ inputs.to_version }} + runs-on: ubuntu-latest + env: + PGHOST: "localhost" + PGPASSWORD: "odoo" + PGUSER: "odoo" + FROM_VERSION: "${{ inputs.from_version }}" + TO_VERSION: "${{ inputs.to_version }}" + services: + postgres: + image: postgres:${{ inputs.postgres_version }} + env: + POSTGRES_USER: odoo + POSTGRES_PASSWORD: odoo + ports: + - 5432:5432 + steps: + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "${{ inputs.python_version }}" + - name: Install required packages + run: | + sudo apt update + sudo apt install \ + expect \ + expect-dev \ + libevent-dev \ + libldap2-dev \ + libsasl2-dev \ + libxml2-dev \ + libxslt1-dev \ + nodejs \ + python3-lxml \ + python3-passlib \ + python3-psycopg2 \ + python3-serial \ + python3-simplejson \ + python3-werkzeug \ + python3-yaml \ + unixodbc-dev + - name: Checkout previous OpenUpgrade + uses: actions/checkout@v4 + with: + ref: "${{ env.FROM_VERSION }}" + path: openupgrade-${{ env.FROM_VERSION }} + - name: Checkout OpenUpgrade from current branch + if: github.event_name != 'schedule' && startsWith(github.ref_name, env.TO_VERSION) + uses: actions/checkout@v4 + with: + path: openupgrade-${{ env.TO_VERSION }} + - name: Checkout current OpenUpgrade + if: github.event_name == 'schedule' || !startsWith(github.ref_name, env.TO_VERSION) + uses: actions/checkout@v4 + with: + ref: "${{ env.TO_VERSION }}" + path: openupgrade-${{ env.TO_VERSION }} + - name: Install previous Odoo + run: | + wget -q -O- https://github.com/oca/ocb/archive/refs/heads/$FROM_VERSION.tar.gz | tar -xz + wget -q -O- https://github.com/oca/server-tools/archive/refs/heads/$FROM_VERSION.tar.gz | tar -xz + python -mvenv env-$FROM_VERSION + . env-$FROM_VERSION/bin/activate + pip install ${{ inputs.from_version_requirements }} + sed -iE '${{ inputs.from_version_requirements_sed }}' OCB-$FROM_VERSION/requirements.txt + pip install -r OCB-$FROM_VERSION/requirements.txt + pip install ./OCB-$FROM_VERSION + pip install -r server-tools-$FROM_VERSION/requirements.txt + pip install -r openupgrade-$FROM_VERSION/requirements.txt + # this is for l10n_eg_edi_eta which crashes without it + pip install asn1crypto + odoo -s -c odoo-$FROM_VERSION.cfg --addons-path server-tools-$FROM_VERSION,openupgrade-$FROM_VERSION --stop-after-init + - name: Install current Odoo + run: | + wget -q -O- https://github.com/oca/ocb/archive/refs/heads/$TO_VERSION.tar.gz | tar -xz + wget -q -O- https://github.com/oca/server-tools/archive/refs/heads/$TO_VERSION.tar.gz | tar -xz + python -mvenv env-$TO_VERSION + . env-$TO_VERSION/bin/activate + pip install ${{ inputs.to_version_requirements }} + sed -iE '${{ inputs.to_version_requirements_sed }}' OCB-$TO_VERSION/requirements.txt + pip install -r OCB-$TO_VERSION/requirements.txt + pip install ./OCB-$TO_VERSION + pip install -r server-tools-$TO_VERSION/requirements.txt + pip install -r openupgrade-$TO_VERSION/requirements.txt + # this is for l10n_eg_edi_eta which crashes without it + pip install asn1crypto + odoo -s -c odoo-$TO_VERSION.cfg --addons-path server-tools-$TO_VERSION,openupgrade-$TO_VERSION --stop-after-init + - name: Create previous Odoo database + env: + ODOO: env-${{ env.FROM_VERSION }}/bin/odoo -c odoo-${{ env.FROM_VERSION }}.cfg -d ${{ env.FROM_VERSION }} + ODOO_SHELL: env-${{ env.FROM_VERSION }}/bin/odoo shell -c odoo-${{ env.FROM_VERSION }}.cfg -d ${{ env.FROM_VERSION }} + run: | + $ODOO --without-demo=all -i upgrade_analysis --stop-after-init + $ODOO_SHELL < "$PR_BODY" + + for module in $( + git -C $OPENUPGRADE_DIR status --short | awk '{print $2}' | awk -F/ '{print $3}' | sort -u + ); do + if grep -qE "\<$module\>.*\<((Done)|(No))" $OPENUPGRADE_DIR/docsource/modules*; then + echo Done module $module was updated + echo "- $module" >> $PR_BODY + else + echo $module is not done yet + fi + done + + if ! grep -q - $PR_BODY; then + echo None >> $PR_BODY + fi + + echo "body-file=$PR_BODY" >> "$GITHUB_OUTPUT" + - name: Get number of milestone + id: get_milestone + run: | + echo "number=$( + wget -qO- https://api.github.com/repos/${{ github.repository }}/milestones|jq '.[] | select(.title=="${{ env.TO_VERSION }}") .number' + )" >> "$GITHUB_OUTPUT" + - name: Create PR + uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e #v7 + with: + base: "${{ env.TO_VERSION }}" + body-path: "${{ steps.generate_body.outputs.body-file }}" + branch: "${{ env.TO_VERSION }}-update-analysis-bot" + commit-message: "[${{ env.TO_VERSION }}][UPD] analysis files" + delete-branch: true + milestone: "${{ steps.get_milestone.outputs.number }}" + path: "openupgrade-${{ env.TO_VERSION }}" + title: "[${{ env.TO_VERSION }}][UPD] analysis files" From bd33e354b587e6ce1d2dd7864ae1da5c52713080 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 31 Mar 2025 13:28:52 +0200 Subject: [PATCH 20/28] [IMP] pin random github actions to their SHA commit --- .github/workflows/documentation-commit.yml | 2 +- .github/workflows/test-migration.yml | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.github/workflows/documentation-commit.yml b/.github/workflows/documentation-commit.yml index 2d5a5f5cf677..b5d71569f153 100644 --- a/.github/workflows/documentation-commit.yml +++ b/.github/workflows/documentation-commit.yml @@ -60,7 +60,7 @@ jobs: # try to build the documentation sh ./build_openupgrade_docs - name: Commit changes - uses: EndBug/add-and-commit@v9 + uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 #v9 with: add: "docs" default_author: github_actions diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index 3837bc650a03..1fdfca1bb3bc 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -25,21 +25,22 @@ jobs: PGPASSWORD: "odoo" PGUSER: "odoo" OPENUPGRADE_USE_DEMO: "yes" + services: + postgres: + image: postgres:14.0 + env: + POSTGRES_USER: odoo + POSTGRES_PASSWORD: odoo + POSTGRES_DB: odoo + ports: + - 5432:5432 steps: - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.10' - - name: Configure Postgres - uses: harmon758/postgresql-action@v1 - with: - postgresql version: "14" - postgresql user: ${DB_USERNAME} - postgresql password: ${DB_PASSWORD} - - name: Wait / Sleep - uses: jakejarvis/wait-action@v0.1.0 - with: - time: "10s" + - name: Sleep for 10 seconds + run: sleep 10s - name: DB Creation run: createdb $DB - name: DB Restore From 56a1195ea462b9a2a52ef819ab5feb2ec2db430f Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 26 May 2025 08:29:19 +0200 Subject: [PATCH 21/28] [IMP] analysis bot: reword commit message and PR title --- .github/workflows/generate-analysis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/generate-analysis.yml b/.github/workflows/generate-analysis.yml index 3978fd8bed57..00268e00c571 100644 --- a/.github/workflows/generate-analysis.yml +++ b/.github/workflows/generate-analysis.yml @@ -219,8 +219,8 @@ jobs: base: "${{ env.TO_VERSION }}" body-path: "${{ steps.generate_body.outputs.body-file }}" branch: "${{ env.TO_VERSION }}-update-analysis-bot" - commit-message: "[${{ env.TO_VERSION }}][UPD] analysis files" + commit-message: "[IMP] Update analysis files" delete-branch: true milestone: "${{ steps.get_milestone.outputs.number }}" path: "openupgrade-${{ env.TO_VERSION }}" - title: "[${{ env.TO_VERSION }}][UPD] analysis files" + title: "[${{ env.TO_VERSION }}][IMP] Update analysis files" From b7442a819e9ce3bf6328c01b0d1724e21968a36d Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 26 May 2025 13:25:40 +0200 Subject: [PATCH 22/28] [ADD] install phonenumbers in ci as it's a hard dependency for account_peppol by now --- .github/workflows/test-migration.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index 1fdfca1bb3bc..fa1f086b5de1 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -94,6 +94,8 @@ jobs: # this is for v16 l10n_eg_edi_eta which crashes without it pip install asn1crypto pip install coverage + # this is for account_peppol + pip install phonenumbers - name: Test data run: | if test -n "$(ls openupgrade/openupgrade_scripts/scripts/*/tests/data*.py 2> /dev/null)"; then From 2762bdd11b6a723bb271fa6af8999fe5a95133d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miquel=20Ra=C3=AFch?= Date: Mon, 11 Aug 2025 13:38:22 +0200 Subject: [PATCH 23/28] [FIX] github workflow: cbor2 issues --- .github/workflows/test-migration.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index fa1f086b5de1..33d4348861b0 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -88,6 +88,7 @@ jobs: - name: Requirements Installation run: | sed -i -E "s/(gevent==)21\.8\.0( ; sys_platform != 'win32' and python_version == '3.10')/\122.10.2\2/;s/(greenlet==)1.1.2( ; sys_platform != 'win32' and python_version == '3.10')/\12.0.2\2/" odoo/requirements.txt + sed -i -E "s/(^cbor2==)5\.4\.2/\15.6.2/" odoo/requirements.txt pip install -q -r odoo/requirements.txt pip install -r ./openupgrade/requirements.txt pip install -U git+https://github.com/oca/openupgradelib From 18e86905a4c39522b03174f2c5b029de61b24b38 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Fri, 3 Oct 2025 07:23:18 +0200 Subject: [PATCH 24/28] [UPD] 19.0: Replace version numbers. --- .github/workflows/documentation-commit.yml | 6 +++--- .github/workflows/test-migration.yml | 12 ++++++------ openupgrade_scripts/__manifest__.py | 2 +- openupgrade_scripts/readme/DESCRIPTION.md | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/documentation-commit.yml b/.github/workflows/documentation-commit.yml index b5d71569f153..8b69cde83dcf 100644 --- a/.github/workflows/documentation-commit.yml +++ b/.github/workflows/documentation-commit.yml @@ -1,4 +1,4 @@ -# On each push in 18.0 branch, +# On each push in 19.0 branch, # AND if the coverage file changed, # build documentation branch and commit the changes # so that the changes are visible on the website @@ -8,7 +8,7 @@ name: Build and commit documentation on: push: - paths: ["docsource/modules170-180.rst"] + paths: ["docsource/modules180-190.rst"] jobs: documentation-commit: @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v2 with: repository: odoo/odoo - ref: "18.0" + ref: "19.0" fetch-depth: 1 path: odoo - name: Configuration diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index 33d4348861b0..43217c9e8cc2 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -7,7 +7,7 @@ name: Test OpenUpgrade migration on: push: - branches: ["18.0*"] + branches: ["19.0*"] pull_request: jobs: @@ -45,20 +45,20 @@ jobs: run: createdb $DB - name: DB Restore run: | - wget -q -O- $DOWNLOADS/17.0.psql | pg_restore -d $DB --no-owner + wget -q -O- $DOWNLOADS/18.0.psql | pg_restore -d $DB --no-owner psql $DB -c "UPDATE ir_module_module SET demo=False" - name: Check out Odoo uses: actions/checkout@v4 with: repository: odoo/odoo - ref: "18.0" + ref: "19.0" fetch-depth: 1 path: odoo - name: Check out previous Odoo uses: actions/checkout@v4 with: repository: odoo/odoo - ref: "17.0" + ref: "18.0" fetch-depth: 1 path: odoo-old - name: Check out OpenUpgrade @@ -109,7 +109,7 @@ jobs: # select modules and perform the upgrade MODULES_OLD=$(\ sed -n '/^+========/,$p' \ - openupgrade/docsource/modules170-180.rst \ + openupgrade/docsource/modules180-190.rst \ | grep "Done\|Partial\|Nothing" \ | grep -v "theme_" \ | sed -rn 's/((^\| *\|del\| *)|^\| *)([0-9a-z_]*)[ \|].*/\3/g p' \ @@ -117,7 +117,7 @@ jobs: | paste -d, -s) MODULES_NEW=$(\ sed -n '/^+========/,$p' \ - openupgrade/docsource/modules170-180.rst \ + openupgrade/docsource/modules180-190.rst \ | grep "Done\|Partial\|Nothing" \ | grep -v "theme_" \ | sed -rn 's/((^\| *\|new\| *)|^\| *)([0-9a-z_]*)[ \|].*/\3/g p' \ diff --git a/openupgrade_scripts/__manifest__.py b/openupgrade_scripts/__manifest__.py index d08da8e19c9e..0d588aa418cd 100644 --- a/openupgrade_scripts/__manifest__.py +++ b/openupgrade_scripts/__manifest__.py @@ -7,7 +7,7 @@ "author": "Odoo Community Association (OCA)", "website": "https://github.com/OCA/OpenUpgrade", "category": "Migration", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "license": "AGPL-3", "depends": ["base"], "images": ["static/description/banner.jpg"], diff --git a/openupgrade_scripts/readme/DESCRIPTION.md b/openupgrade_scripts/readme/DESCRIPTION.md index 79779e0698e4..23d24b62fdff 100644 --- a/openupgrade_scripts/readme/DESCRIPTION.md +++ b/openupgrade_scripts/readme/DESCRIPTION.md @@ -1,2 +1,2 @@ -This module is a containers of migration script to migrate from 17.0 to -18.0 version. +This module is a containers of migration script to migrate from 18.0 to +19.0 version. From 1385720a882e0fc7159523964e957ab37e33a4b0 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Fri, 3 Oct 2025 07:23:18 +0200 Subject: [PATCH 25/28] [INIT] 19.0: Initialize apriori.py file. --- openupgrade_scripts/apriori.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 openupgrade_scripts/apriori.py diff --git a/openupgrade_scripts/apriori.py b/openupgrade_scripts/apriori.py new file mode 100644 index 000000000000..3820b4a12005 --- /dev/null +++ b/openupgrade_scripts/apriori.py @@ -0,0 +1,31 @@ +""" Encode any known changes to the database here +to help the matching process +""" + +# Renamed modules is a mapping from old module name to new module name +renamed_modules = { + # odoo + # odoo/enterprise + # OCA/... +} + +# Merged modules contain a mapping from old module names to other, +# preexisting module names +merged_modules = { + # odoo + # odoo/enterprise + # OCA/... +} + +# only used here for upgrade_analysis +renamed_models = { + # odoo + # OCA/... +} + +# only used here for upgrade_analysis +merged_models = { + # odoo + # OCA/... +} + From f427442cafbe4f5b3f85d4ae9b9699a78d71aa89 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Fri, 3 Oct 2025 07:23:31 +0200 Subject: [PATCH 26/28] [FIX] 19.0: pre-commit --- openupgrade_scripts/README.rst | 26 ++++++++------- openupgrade_scripts/apriori.py | 3 +- .../static/description/index.html | 32 +++++++++++-------- requirements.txt | 2 ++ 4 files changed, 37 insertions(+), 26 deletions(-) create mode 100644 requirements.txt diff --git a/openupgrade_scripts/README.rst b/openupgrade_scripts/README.rst index 5c8965120a34..3ab5666ceaf2 100644 --- a/openupgrade_scripts/README.rst +++ b/openupgrade_scripts/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + =================== Openupgrade Scripts =================== @@ -13,23 +17,23 @@ Openupgrade Scripts .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2FOpenUpgrade-lightgray.png?logo=github - :target: https://github.com/OCA/OpenUpgrade/tree/18.0/openupgrade_scripts + :target: https://github.com/OCA/OpenUpgrade/tree/19.0/openupgrade_scripts :alt: OCA/OpenUpgrade .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/OpenUpgrade-18-0/OpenUpgrade-18-0-openupgrade_scripts + :target: https://translation.odoo-community.org/projects/OpenUpgrade-19-0/OpenUpgrade-19-0-openupgrade_scripts :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/OpenUpgrade&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/OpenUpgrade&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| -This module is a containers of migration script to migrate from 17.0 to -18.0 version. +This module is a containers of migration script to migrate from 18.0 to +19.0 version. **Table of contents** @@ -45,12 +49,12 @@ to be available via your ``addons-path``. Configuration ============= -- call your odoo instance with the option - ``--upgrade-path=/PATH_TO_openupgrade_scripts_MODULE/scripts/`` +- call your odoo instance with the option + ``--upgrade-path=/PATH_TO_openupgrade_scripts_MODULE/scripts/`` or -- add the key to your configuration file: +- add the key to your configuration file: .. code:: shell @@ -63,7 +67,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -83,6 +87,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/OpenUpgrade `_ project on GitHub. +This module is part of the `OCA/OpenUpgrade `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/openupgrade_scripts/apriori.py b/openupgrade_scripts/apriori.py index 3820b4a12005..ad2269309acc 100644 --- a/openupgrade_scripts/apriori.py +++ b/openupgrade_scripts/apriori.py @@ -1,4 +1,4 @@ -""" Encode any known changes to the database here +"""Encode any known changes to the database here to help the matching process """ @@ -28,4 +28,3 @@ # odoo # OCA/... } - diff --git a/openupgrade_scripts/static/description/index.html b/openupgrade_scripts/static/description/index.html index 329d42ef0587..bcf94d1af849 100644 --- a/openupgrade_scripts/static/description/index.html +++ b/openupgrade_scripts/static/description/index.html @@ -3,7 +3,7 @@ -Openupgrade Scripts +README.rst -
-

Openupgrade Scripts

+
+ + +Odoo Community Association + +
+

Openupgrade Scripts

-

Beta License: AGPL-3 OCA/OpenUpgrade Translate me on Weblate Try me on Runboat

-

This module is a containers of migration script to migrate from 17.0 to -18.0 version.

+

Beta License: AGPL-3 OCA/OpenUpgrade Translate me on Weblate Try me on Runboat

+

This module is a containers of migration script to migrate from 18.0 to +19.0 version.

Table of contents

    @@ -385,12 +390,12 @@

    Openupgrade Scripts

-

Installation

+

Installation

This module does not need to be installed on a database. It simply needs to be available via your addons-path.

-

Configuration

+

Configuration

  • call your odoo instance with the option --upgrade-path=/PATH_TO_openupgrade_scripts_MODULE/scripts/
  • @@ -405,17 +410,17 @@

    Configuration

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -423,10 +428,11 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/OpenUpgrade project on GitHub.

+

This module is part of the OCA/OpenUpgrade project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000000..180fc49789ba --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +# generated from manifests external_dependencies +openupgradelib From aa6e403b0da723517f71d95ed0531368a34736db Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Fri, 3 Oct 2025 12:28:31 +0200 Subject: [PATCH 27/28] [IMP] run test migration in the same cases as standard tests --- .github/workflows/test-migration.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index 43217c9e8cc2..5eabb1032fe6 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -6,9 +6,13 @@ name: Test OpenUpgrade migration on: - push: - branches: ["19.0*"] pull_request: + branches: + - "19.0*" + push: + branches: + - "19.0" + - "19.0-ocabot-*" jobs: test: From d6bddd8e2a1207a1d365085a8ec59adbedb570c0 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Fri, 3 Oct 2025 12:32:04 +0200 Subject: [PATCH 28/28] [IMP] download test database from current repository --- .github/workflows/test-migration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-migration.yml b/.github/workflows/test-migration.yml index 5eabb1032fe6..a00244599594 100644 --- a/.github/workflows/test-migration.yml +++ b/.github/workflows/test-migration.yml @@ -23,7 +23,7 @@ jobs: DB_PASSWORD: "odoo" DB_PORT: 5432 DB_USERNAME: "odoo" - DOWNLOADS: https://github.com/OCA/OpenUpgrade/releases/download/databases + DOWNLOADS: https://github.com/${{github.repository}}/releases/download/databases ODOO: "./odoo/odoo-bin" PGHOST: "localhost" PGPASSWORD: "odoo"