gOdoo-cli 1.0.0__tar.gz → 1.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/PKG-INFO +1 -1
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/docs/lifecycle.md +6 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/__about__.py +1 -1
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/upgrade.py +29 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/commands/test_upgrade.py +69 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.agents/skills/godoo-changeset-review/SKILL.md +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.agents/skills/godoo-editor-validation/SKILL.md +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.agents/skills/godoo-runtime-validation/SKILL.md +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.agents/skills/godoo-source-workspaces/SKILL.md +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.codecovrc +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.dockerignore +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.env.sample +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.github/FUNDING.yml +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.github/workflows/README.md +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.github/workflows/quality.yml +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.github/workflows/version-bump.yml +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.github/workflows/version-publish.yml +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.gitignore +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.pre-commit-config.yaml +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.prettierrc.yml +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.vscode/extensions.json +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.vscode/settings.json +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/.vscode/tasks.json +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/AGENTS.md +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/LICENSE +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/README.md +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/addons/.gitkeep +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/addons/godoo_test_succ_mod/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/addons/godoo_test_succ_mod/__manifest__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/addons/godoo_test_succ_mod/models/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/addons/godoo_test_succ_mod/tests/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/addons/godoo_test_succ_mod/tests/data.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/addons/godoo_test_succ_mod/tests/test_succ.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/assets/odoo_logo.png +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/config/nginx.conf.template +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/config/postgresql.conf +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/docker/Dockerfile +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/docker/docker-compose.base.yml +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/docker/docker-compose.dev.yml +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/docker/docker-compose.traefik.yml +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/docker/postgres-init/10-vector.sql +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/docs/architecture.md +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/docs/downstream.md +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/docs/hooks.md +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/docs/workspace.md +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/makefile +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/odoo_manifest.yml +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/package-lock.json +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/package.json +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/pyproject.toml +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/scripts/check_docstring_style.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/scripts/migrations/development/shrink_database.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/__main__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/common.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/configuration.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/db/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/db/archive.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/db/cli.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/db/passwords.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/db/query.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/db/reset.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/odoo_bin/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/root.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/rpc/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/rpc/cli.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/rpc/config_parameters.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/rpc/importer.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/rpc/modules.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/rpc/translations.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/run.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/runtime/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/runtime/dependencies.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/runtime/init.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/runtime/launch.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/runtime/shell.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/runtime/shell_scripts/odoo_banner.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/runtime/shell_scripts/render_report.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/runtime/status.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/test/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/test/cli.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/test/load_data.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/test/run.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/workspace/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/workspace/common.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/workspace/configure.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/workspace/image.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/workspace/storage.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/workspace/sync.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/database/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/database/connection.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/database/postgres.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/database/settings.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/database/state.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/git/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/git/git_url.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/git/repository.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/helpers/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/helpers/hashing.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/helpers/modules_git.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/helpers/progress.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/helpers/system.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/models/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/models/godoo_git_repo.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/models/godoo_manifest.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/models/godoo_models.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/models/godoo_modules.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/archive.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/baseline.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/dataset.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/filestore.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/hooks.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/lifecycle.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/locks.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/nginx.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/odoo.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/promotion.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/reset.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/restore.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/runtime/status.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/workspace/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/workspace/editor.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/workspace/git.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/workspace/image.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/workspace/manifest.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/workspace/operations.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/workspace/specifications.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/workspace/storage.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/workspace/types.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/__init__.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/commands/test_db_archive_cli.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/commands/test_db_query_cli.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/commands/test_odoo_bin_commands.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/commands/test_rpc_commands.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/commands/test_runtime_cli.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/commands/test_runtime_dependencies.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/commands/test_runtime_shell_scripts.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/commands/test_test_run.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/conftest.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/database/test_db_query.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/database/test_db_reset.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/database/test_db_restore.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/git/test_git_url_uri.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/integration/test_container_contract.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/integration/test_odoo_integration.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_archive_crc.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_baseline_recovery.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_database_copy.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_dataset.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_filestore.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_filestore_copy.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_hooks.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_init_hooks.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_init_policy.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_lifecycle.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_lifecycle_service.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_nginx.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_nginx_cli.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_odoo_config_generation.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_odoo_preflight.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_odoo_version_compatibility.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_report_url.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_reset_baseline.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_runtime_models.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_runtime_operations.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/runtime/test_runtime_source_environment.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/test_logging.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/workspace/test_godoo_manifest.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/workspace/test_workspace.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/workspace/test_workspace_git.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/workspace/test_workspace_image.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/workspace/test_workspace_layout.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/workspace/test_workspace_runtime_env.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/tests/workspace/test_workspace_storage.py +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/thirdparty/.gitkeep +0 -0
- {godoo_cli-1.0.0 → godoo_cli-1.0.1}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gOdoo-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.1
|
|
4
4
|
Summary: Odoo lifecycle, Python dependency preflight, and shared Git workspaces.
|
|
5
5
|
Project-URL: repository, https://github.com/OpenJKSoftware/gOdoo
|
|
6
6
|
Author-email: Joshua Kreuder <Joshua_Kreuder@outlook.com>
|
|
@@ -178,6 +178,12 @@ sequenceDiagram
|
|
|
178
178
|
Maintainer->>Maintainer: Review Odoo's report before restoring into a test runtime
|
|
179
179
|
```
|
|
180
180
|
|
|
181
|
+
Before downloading the official client, `godoo upgrade` logs the modification date and absolute path of the dump
|
|
182
|
+
selected by `-i` / `--dump` and the adjacent `odoo_filestore` directory. Dates include the local timezone offset. The
|
|
183
|
+
filestore stays local for restoring the result. Its directory timestamp reflects changes to immediate entries, not
|
|
184
|
+
changes throughout the attachment tree or proof that the dump and filestore were captured together. Missing metadata
|
|
185
|
+
produces a warning; the official client still owns input validation. Commands without a dump do not log source dates.
|
|
186
|
+
|
|
181
187
|
HTTPS certificate and hostname verification is enabled by default. `GODOO_UPGRADE_SSL=0` disables verification for both
|
|
182
188
|
the download and client while retaining HTTPS encryption; use it only for an endpoint whose certificate the host cannot
|
|
183
189
|
verify.
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import argparse
|
|
5
6
|
import logging
|
|
6
7
|
import os
|
|
7
8
|
import signal
|
|
@@ -10,6 +11,7 @@ import subprocess
|
|
|
10
11
|
import sys
|
|
11
12
|
import tempfile
|
|
12
13
|
from contextlib import suppress
|
|
14
|
+
from datetime import UTC, datetime
|
|
13
15
|
from pathlib import Path
|
|
14
16
|
from typing import Annotated, cast
|
|
15
17
|
from urllib.error import URLError
|
|
@@ -24,8 +26,35 @@ LOGGER = logging.getLogger(__name__)
|
|
|
24
26
|
UPGRADE_CLIENT_URL = "https://upgrade.odoo.com/upgrade"
|
|
25
27
|
|
|
26
28
|
|
|
29
|
+
def _log_upgrade_sources(arguments: list[str]) -> None:
|
|
30
|
+
"""Log the selected dump and paired local filestore before the client starts."""
|
|
31
|
+
parser = argparse.ArgumentParser(add_help=False, allow_abbrev=False, exit_on_error=False)
|
|
32
|
+
parser.add_argument("-i", "--dump", type=Path)
|
|
33
|
+
try:
|
|
34
|
+
options, _ = parser.parse_known_args(arguments)
|
|
35
|
+
except argparse.ArgumentError:
|
|
36
|
+
# Odoo's client owns argument validation and its error messages.
|
|
37
|
+
return
|
|
38
|
+
if options.dump is None:
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
dump = options.dump.absolute()
|
|
42
|
+
sources = (
|
|
43
|
+
("Dump change date (upload)", dump),
|
|
44
|
+
("Filestore change date (local restore)", dump.parent / "odoo_filestore"),
|
|
45
|
+
)
|
|
46
|
+
for label, path in sources:
|
|
47
|
+
try:
|
|
48
|
+
modified_at = datetime.fromtimestamp(path.stat().st_mtime, tz=UTC).astimezone()
|
|
49
|
+
except OSError as error:
|
|
50
|
+
LOGGER.warning("Could not read %s (%s): %s", label, path, error)
|
|
51
|
+
continue
|
|
52
|
+
LOGGER.info("%s: %s (%s)", label, modified_at.isoformat(timespec="seconds"), path)
|
|
53
|
+
|
|
54
|
+
|
|
27
55
|
def _run_upgrade_client(arguments: list[str]) -> int:
|
|
28
56
|
"""Download and run Odoo's official upgrade client with its arguments."""
|
|
57
|
+
_log_upgrade_sources(arguments)
|
|
29
58
|
ssl_disabled = os.getenv("GODOO_UPGRADE_SSL") == "0"
|
|
30
59
|
context = ssl._create_unverified_context() if ssl_disabled else None
|
|
31
60
|
try:
|
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import importlib
|
|
6
|
+
import logging
|
|
6
7
|
import os
|
|
7
8
|
import signal
|
|
8
9
|
import ssl
|
|
9
10
|
import sys
|
|
11
|
+
from datetime import UTC, datetime
|
|
10
12
|
from io import BytesIO
|
|
11
13
|
from pathlib import Path
|
|
12
14
|
from unittest.mock import Mock
|
|
@@ -194,3 +196,70 @@ def test_upgrade_cli_preserves_nonzero_client_status(monkeypatch: pytest.MonkeyP
|
|
|
194
196
|
result = CliRunner().invoke(main_cli(), ["upgrade", "status", "token"])
|
|
195
197
|
|
|
196
198
|
assert result.exit_code == 23, result.output
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
@pytest.mark.parametrize("dump_option", ["-i", "--dump", "--dump=", "-i-attached"])
|
|
202
|
+
def test_upgrade_logs_source_dates_before_download_and_client(
|
|
203
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
204
|
+
tmp_path: Path,
|
|
205
|
+
caplog: pytest.LogCaptureFixture,
|
|
206
|
+
dump_option: str,
|
|
207
|
+
) -> None:
|
|
208
|
+
"""The actual selected file and paired directory are logged before network work."""
|
|
209
|
+
dataset = tmp_path / "dataset with spaces"
|
|
210
|
+
dataset.mkdir()
|
|
211
|
+
dump = dataset / "source.dump"
|
|
212
|
+
dump.touch()
|
|
213
|
+
filestore = dataset / "odoo_filestore"
|
|
214
|
+
filestore.mkdir()
|
|
215
|
+
os.utime(dump, (1700000000, 1700000000))
|
|
216
|
+
os.utime(filestore, (1600000000, 1600000000))
|
|
217
|
+
monkeypatch.chdir(tmp_path)
|
|
218
|
+
relative_dump = str(dump.relative_to(tmp_path))
|
|
219
|
+
if dump_option == "--dump=":
|
|
220
|
+
selection = [f"--dump={relative_dump}"]
|
|
221
|
+
elif dump_option == "-i-attached":
|
|
222
|
+
selection = [f"-i{relative_dump}"]
|
|
223
|
+
else:
|
|
224
|
+
selection = [dump_option, relative_dump]
|
|
225
|
+
arguments = ["test", *selection, "--future-official-option", "value", "-x"]
|
|
226
|
+
caplog.set_level(logging.INFO, logger=upgrade_command.LOGGER.name)
|
|
227
|
+
|
|
228
|
+
def download(*_args: object, **_kwargs: object) -> BytesIO:
|
|
229
|
+
assert (
|
|
230
|
+
f"Dump change date (upload): {datetime.fromtimestamp(1700000000, UTC).astimezone().isoformat()} ({dump})"
|
|
231
|
+
in caplog.text
|
|
232
|
+
)
|
|
233
|
+
assert (
|
|
234
|
+
f"Filestore change date (local restore): {datetime.fromtimestamp(1600000000, UTC).astimezone().isoformat()} ({filestore})"
|
|
235
|
+
in caplog.text
|
|
236
|
+
)
|
|
237
|
+
return BytesIO(b"official client")
|
|
238
|
+
|
|
239
|
+
child = Mock(return_value=Mock(wait=lambda: 0, pid=42))
|
|
240
|
+
monkeypatch.setattr(upgrade_command, "urlopen", download)
|
|
241
|
+
monkeypatch.setattr(upgrade_command.subprocess, "Popen", child)
|
|
242
|
+
|
|
243
|
+
assert upgrade_command._run_upgrade_client(arguments) == 0
|
|
244
|
+
assert child.call_args.args[0][2:] == arguments
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def test_upgrade_missing_source_metadata_does_not_replace_client_validation(
|
|
248
|
+
monkeypatch: pytest.MonkeyPatch, tmp_path: Path, caplog: pytest.LogCaptureFixture
|
|
249
|
+
) -> None:
|
|
250
|
+
"""Missing timestamps produce warnings while the official client keeps ownership."""
|
|
251
|
+
dump = tmp_path / "missing.dump"
|
|
252
|
+
monkeypatch.setattr(upgrade_command, "urlopen", lambda *_args, **_kwargs: BytesIO(b""))
|
|
253
|
+
monkeypatch.setattr(upgrade_command, "_run_process", lambda *_args, **_kwargs: 23)
|
|
254
|
+
|
|
255
|
+
assert upgrade_command._run_upgrade_client(["test", "-i", str(dump)]) == 23
|
|
256
|
+
assert f"Could not read Dump change date (upload) ({dump})" in caplog.text
|
|
257
|
+
assert f"Could not read Filestore change date (local restore) ({tmp_path / 'odoo_filestore'})" in caplog.text
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
@pytest.mark.parametrize("arguments", [["status", "token"], ["test", "--dbname", "database"], ["test", "-i"]])
|
|
261
|
+
def test_upgrade_skips_source_logging_without_a_dump(arguments: list[str], caplog: pytest.LogCaptureFixture) -> None:
|
|
262
|
+
"""Database mode, status, and malformed dump options stay with the official client."""
|
|
263
|
+
caplog.set_level(logging.INFO, logger=upgrade_command.LOGGER.name)
|
|
264
|
+
upgrade_command._log_upgrade_sources(arguments)
|
|
265
|
+
assert not caplog.records
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/runtime/shell_scripts/odoo_banner.py
RENAMED
|
File without changes
|
{godoo_cli-1.0.0 → godoo_cli-1.0.1}/src/godoo_cli/commands/runtime/shell_scripts/render_report.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|