gOdoo-cli 1.0.4__tar.gz → 1.0.5__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.4 → godoo_cli-1.0.5}/.agents/skills/godoo-source-workspaces/SKILL.md +1 -1
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/PKG-INFO +1 -1
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/docs/workspace.md +12 -11
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/__about__.py +1 -1
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/git/repository.py +0 -16
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/workspace/git.py +69 -33
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/workspace/test_workspace_git.py +109 -21
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.agents/skills/godoo-changeset-review/SKILL.md +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.agents/skills/godoo-editor-validation/SKILL.md +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.agents/skills/godoo-runtime-validation/SKILL.md +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.codecovrc +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.dockerignore +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.env.sample +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.github/FUNDING.yml +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.github/workflows/README.md +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.github/workflows/quality.yml +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.github/workflows/version-bump.yml +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.github/workflows/version-publish.yml +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.gitignore +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.pre-commit-config.yaml +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.prettierrc.yml +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.vscode/extensions.json +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.vscode/settings.json +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/.vscode/tasks.json +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/AGENTS.md +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/LICENSE +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/README.md +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/addons/.gitkeep +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/addons/godoo_test_succ_mod/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/addons/godoo_test_succ_mod/__manifest__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/addons/godoo_test_succ_mod/models/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/addons/godoo_test_succ_mod/tests/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/addons/godoo_test_succ_mod/tests/data.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/addons/godoo_test_succ_mod/tests/test_succ.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/assets/odoo_logo.png +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/config/nginx.conf.template +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/config/postgresql.conf +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/docker/Dockerfile +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/docker/docker-compose.base.yml +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/docker/docker-compose.dev.yml +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/docker/docker-compose.traefik.yml +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/docker/postgres-init/10-vector.sql +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/docs/architecture.md +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/docs/downstream.md +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/docs/hooks.md +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/docs/lifecycle.md +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/makefile +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/odoo_manifest.yml +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/package-lock.json +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/package.json +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/pyproject.toml +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/scripts/check_docstring_style.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/scripts/migrations/development/shrink_database.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/__main__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/common.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/configuration.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/db/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/db/archive.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/db/cli.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/db/passwords.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/db/query.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/db/reset.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/odoo_bin/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/root.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/rpc/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/rpc/cli.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/rpc/config_parameters.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/rpc/importer.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/rpc/modules.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/rpc/translations.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/run.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/runtime/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/runtime/dependencies.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/runtime/init.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/runtime/launch.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/runtime/shell.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/runtime/shell_scripts/odoo_banner.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/runtime/shell_scripts/render_report.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/runtime/start.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/runtime/status.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/test/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/test/cli.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/test/load_data.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/test/run.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/upgrade.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/workspace/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/workspace/common.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/workspace/configure.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/workspace/image.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/workspace/storage.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/workspace/sync.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/database/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/database/connection.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/database/postgres.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/database/settings.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/database/state.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/git/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/git/git_url.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/helpers/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/helpers/hashing.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/helpers/modules_git.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/helpers/progress.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/helpers/system.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/models/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/models/godoo_git_repo.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/models/godoo_manifest.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/models/godoo_models.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/models/godoo_modules.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/archive.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/backup.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/baseline.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/checksums.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/dataset.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/filestore.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/hooks.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/lifecycle.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/locks.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/nginx.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/odoo.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/promotion.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/reset.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/restore.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/runtime/status.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/workspace/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/workspace/editor.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/workspace/image.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/workspace/manifest.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/workspace/operations.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/workspace/specifications.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/workspace/storage.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/src/godoo_cli/workspace/types.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/__init__.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/commands/test_db_archive_cli.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/commands/test_db_query_cli.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/commands/test_odoo_bin_commands.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/commands/test_rpc_commands.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/commands/test_runtime_cli.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/commands/test_runtime_dependencies.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/commands/test_runtime_shell_scripts.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/commands/test_runtime_start.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/commands/test_test_run.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/commands/test_upgrade.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/conftest.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/database/test_db_backup.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/database/test_db_query.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/database/test_db_reset.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/database/test_db_restore.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/git/test_git_url_uri.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/integration/test_container_contract.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/integration/test_odoo_integration.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_archive_crc.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_baseline_recovery.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_checksums.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_database_copy.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_dataset.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_filestore.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_filestore_copy.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_hooks.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_init_hooks.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_init_policy.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_lifecycle.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_lifecycle_service.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_nginx.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_nginx_cli.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_odoo_config_generation.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_odoo_preflight.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_odoo_version_compatibility.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_report_url.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_reset_baseline.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_runtime_models.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_runtime_operations.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/runtime/test_runtime_source_environment.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/test_logging.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/workspace/test_godoo_manifest.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/workspace/test_workspace.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/workspace/test_workspace_image.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/workspace/test_workspace_layout.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/workspace/test_workspace_runtime_env.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/tests/workspace/test_workspace_storage.py +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/thirdparty/.gitkeep +0 -0
- {godoo_cli-1.0.4 → godoo_cli-1.0.5}/uv.lock +0 -0
|
@@ -12,7 +12,7 @@ validated before locks or paths and cannot alter host/container depth. Git owns
|
|
|
12
12
|
archive caches below the shared source root. Never hand-edit managed worktrees or generated `.godoo/` and workspace
|
|
13
13
|
files.
|
|
14
14
|
|
|
15
|
-
Run `workspace sync` only with authority for the shared source root; it
|
|
15
|
+
Run `workspace sync` only with authority for the shared source root; it updates verified managed worktrees.
|
|
16
16
|
`workspace configure` regenerates state from checked sources. `workspace check` is offline and read-only. Run workspace
|
|
17
17
|
commands from the project directory because that cwd supplies `.env` and manifest-relative paths.
|
|
18
18
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gOdoo-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.5
|
|
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>
|
|
@@ -15,7 +15,7 @@ cd /path/to/project
|
|
|
15
15
|
# Set this in .env instead if each shell should inherit the same value.
|
|
16
16
|
export GODOO_SOURCES_ROOT=/absolute/path/to/shared-sources
|
|
17
17
|
|
|
18
|
-
# Synchronize managed sources.
|
|
18
|
+
# Synchronize managed sources. Tracked edits and untracked path collisions stop synchronization.
|
|
19
19
|
godoo workspace sync
|
|
20
20
|
|
|
21
21
|
# Generate editor files from the selected sources.
|
|
@@ -62,18 +62,19 @@ flowchart TD
|
|
|
62
62
|
Check --> Build["Production image build copies<br/>selected sources into the image"]
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
| Command | Changes state? | Purpose
|
|
66
|
-
| ----------------------- | -------------- |
|
|
67
|
-
| `workspace sync` | Yes | Update managed worktrees and archive caches;
|
|
68
|
-
| `workspace configure` | Yes | Validate sources and generate editor files under `.godoo/workspace.lock`.
|
|
69
|
-
| `workspace check` | No | Validate offline, without source-worktree or archive locks.
|
|
70
|
-
| `workspace runtime-env` | No | Validate sources and emit shell-safe resolved path assignments.
|
|
71
|
-
| `workspace materialize` | Yes | Copy selected sources into an image layout.
|
|
72
|
-
| `workspace storage` | No | Inspect shared source storage.
|
|
73
|
-
| `workspace gc` | Yes | Manage shared storage cleanup; inspect `--help` before use.
|
|
65
|
+
| Command | Changes state? | Purpose |
|
|
66
|
+
| ----------------------- | -------------- | ------------------------------------------------------------------------- |
|
|
67
|
+
| `workspace sync` | Yes | Update managed worktrees and archive caches; preserve untracked files. |
|
|
68
|
+
| `workspace configure` | Yes | Validate sources and generate editor files under `.godoo/workspace.lock`. |
|
|
69
|
+
| `workspace check` | No | Validate offline, without source-worktree or archive locks. |
|
|
70
|
+
| `workspace runtime-env` | No | Validate sources and emit shell-safe resolved path assignments. |
|
|
71
|
+
| `workspace materialize` | Yes | Copy selected sources into an image layout. |
|
|
72
|
+
| `workspace storage` | No | Inspect shared source storage. |
|
|
73
|
+
| `workspace gc` | Yes | Manage shared storage cleanup; inspect `--help` before use. |
|
|
74
74
|
|
|
75
75
|
Git fetches report elapsed time every ten seconds and retain Git output for failure diagnostics. Git owns the pools,
|
|
76
|
-
worktrees, branches, locks, and caches under the shared source root; use workspace commands to manage them.
|
|
76
|
+
worktrees, branches, locks, and caches under the shared source root; use workspace commands to manage them. Tracked
|
|
77
|
+
edits stop synchronization. Untracked and ignored files are preserved; Git rejects updates that would overwrite them.
|
|
77
78
|
|
|
78
79
|
## Editor configuration
|
|
79
80
|
|
|
@@ -129,22 +129,6 @@ class GitRepository:
|
|
|
129
129
|
"""Return Git common directory for this repository."""
|
|
130
130
|
return Path(self._require_repo().git.rev_parse("--git-common-dir"))
|
|
131
131
|
|
|
132
|
-
def switch(self, branch: str, start: str, *, discard_changes: bool = False) -> None:
|
|
133
|
-
"""Switch an existing worktree branch to a commit."""
|
|
134
|
-
arguments: list[str] = []
|
|
135
|
-
if discard_changes:
|
|
136
|
-
arguments.append("--discard-changes")
|
|
137
|
-
arguments.extend(["-C", branch, start])
|
|
138
|
-
self._require_repo().git.switch(*arguments)
|
|
139
|
-
|
|
140
|
-
def reset_hard(self, commit: str) -> None:
|
|
141
|
-
"""Reset the current worktree to commit."""
|
|
142
|
-
self._require_repo().git.reset("--hard", commit)
|
|
143
|
-
|
|
144
|
-
def clean(self) -> None:
|
|
145
|
-
"""Remove untracked files from the current worktree."""
|
|
146
|
-
self._require_repo().git.clean("-fdx")
|
|
147
|
-
|
|
148
132
|
|
|
149
133
|
def repository(path: Path) -> GitRepository:
|
|
150
134
|
"""Open a repository through the shared facade."""
|
|
@@ -68,7 +68,7 @@ def _status_result(
|
|
|
68
68
|
cwd: Path | None = None,
|
|
69
69
|
env: dict[str, str] | None = None,
|
|
70
70
|
) -> tuple[int, str | bytes, str | bytes]:
|
|
71
|
-
"""Run
|
|
71
|
+
"""Run status in porcelain NUL mode for worktree safety checks."""
|
|
72
72
|
return native_git_result(*arguments, cwd=cwd, env=env, binary=True)
|
|
73
73
|
|
|
74
74
|
|
|
@@ -444,36 +444,18 @@ def _head(path: Path) -> str:
|
|
|
444
444
|
return _repo(path).head_commit()
|
|
445
445
|
|
|
446
446
|
|
|
447
|
-
def _assert_clean(path: Path) -> None:
|
|
448
|
-
"""Reject
|
|
447
|
+
def _assert_clean(path: Path, *, include_untracked: bool = False) -> None:
|
|
448
|
+
"""Reject tracked changes, and all untracked files before removing a worktree."""
|
|
449
|
+
arguments = ["--untracked-files=all", "--ignored"] if include_untracked else ["--untracked-files=no"]
|
|
449
450
|
returncode, stdout, stderr = _status_result(
|
|
450
|
-
"--no-optional-locks",
|
|
451
|
-
"-C",
|
|
452
|
-
str(path),
|
|
453
|
-
"status",
|
|
454
|
-
"--porcelain=v1",
|
|
455
|
-
"-z",
|
|
456
|
-
"--untracked-files=all",
|
|
457
|
-
"--ignored",
|
|
451
|
+
"--no-optional-locks", "-C", str(path), "status", "--porcelain=v1", "-z", *arguments
|
|
458
452
|
)
|
|
459
453
|
if returncode:
|
|
460
454
|
detail = stderr.strip() or stdout.strip()
|
|
461
455
|
if isinstance(detail, bytes):
|
|
462
456
|
detail = detail.decode(errors="replace")
|
|
463
457
|
workspace_fail(f"Git status failed for {path}: {detail}")
|
|
464
|
-
|
|
465
|
-
unexpected = [
|
|
466
|
-
entry
|
|
467
|
-
for entry in entries
|
|
468
|
-
if entry
|
|
469
|
-
and not (
|
|
470
|
-
entry.startswith("!! ")
|
|
471
|
-
and (candidate := path / entry[3:]).name == ".DS_Store"
|
|
472
|
-
and candidate.is_file()
|
|
473
|
-
and not candidate.is_symlink()
|
|
474
|
-
)
|
|
475
|
-
]
|
|
476
|
-
if unexpected:
|
|
458
|
+
if stdout:
|
|
477
459
|
workspace_fail(f"Managed source is dirty; direct edits are unsupported: {path}")
|
|
478
460
|
|
|
479
461
|
|
|
@@ -542,6 +524,13 @@ def _checkout_environment() -> dict[str, str]:
|
|
|
542
524
|
}
|
|
543
525
|
|
|
544
526
|
|
|
527
|
+
def _reset_worktree(path: Path, commit: str) -> None:
|
|
528
|
+
"""Restore tracked files without applying host Git configuration."""
|
|
529
|
+
_worktree_command(
|
|
530
|
+
"-C", str(path), "-c", "core.autocrlf=false", "reset", "--hard", commit, env=_checkout_environment()
|
|
531
|
+
)
|
|
532
|
+
|
|
533
|
+
|
|
545
534
|
def _merge_commit(path: Path, tree: str, previous: str, commit: str) -> str:
|
|
546
535
|
"""Write the deterministic commit used for one ordered merge input."""
|
|
547
536
|
environment = _checkout_environment()
|
|
@@ -564,10 +553,47 @@ def _merge_commit(path: Path, tree: str, previous: str, commit: str) -> str:
|
|
|
564
553
|
)
|
|
565
554
|
|
|
566
555
|
|
|
556
|
+
def _assert_no_ignored_merge_collisions(path: Path, commit: str) -> None:
|
|
557
|
+
"""Reject ignored files that an incoming merge could overwrite."""
|
|
558
|
+
|
|
559
|
+
def names(*arguments: str) -> set[str]:
|
|
560
|
+
returncode, stdout, stderr = _status_result("-C", str(path), *arguments, "-z")
|
|
561
|
+
if returncode:
|
|
562
|
+
workspace_fail(f"Git path inspection failed for {path}: {os.fsdecode(stderr).strip()}")
|
|
563
|
+
return set(os.fsdecode(stdout).split("\0")) - {""}
|
|
564
|
+
|
|
565
|
+
ignored = names("ls-files", "--others", "--ignored", "--exclude-standard")
|
|
566
|
+
if not ignored:
|
|
567
|
+
return
|
|
568
|
+
tree = _merge_command(
|
|
569
|
+
"-C",
|
|
570
|
+
str(path),
|
|
571
|
+
"-c",
|
|
572
|
+
"merge.renormalize=false",
|
|
573
|
+
"-c",
|
|
574
|
+
"rerere.enabled=false",
|
|
575
|
+
"merge-tree",
|
|
576
|
+
"--write-tree",
|
|
577
|
+
"HEAD",
|
|
578
|
+
commit,
|
|
579
|
+
env=_checkout_environment(),
|
|
580
|
+
).splitlines()[0]
|
|
581
|
+
incoming = names("ls-tree", "-r", "--name-only", tree)
|
|
582
|
+
for name in incoming:
|
|
583
|
+
parts = name.split("/")
|
|
584
|
+
if any("/".join(parts[:index]) in ignored for index in range(1, len(parts) + 1)):
|
|
585
|
+
workspace_fail(f"Ignored file would be overwritten by merge in {path}: {name}")
|
|
586
|
+
for name in ignored:
|
|
587
|
+
parts = name.split("/")
|
|
588
|
+
if any("/".join(parts[:index]) in incoming for index in range(1, len(parts) + 1)):
|
|
589
|
+
workspace_fail(f"Ignored file would be overwritten by merge in {path}: {name}")
|
|
590
|
+
|
|
591
|
+
|
|
567
592
|
def _merge_sources(path: Path, merge_commits: tuple[str, ...]) -> str:
|
|
568
593
|
"""Merge ordered inputs using fixed configuration and reproducible commits."""
|
|
569
594
|
environment = _checkout_environment()
|
|
570
595
|
for commit in merge_commits:
|
|
596
|
+
_assert_no_ignored_merge_collisions(path, commit)
|
|
571
597
|
previous = _head(path)
|
|
572
598
|
_merge_command(
|
|
573
599
|
"-C",
|
|
@@ -586,6 +612,7 @@ def _merge_sources(path: Path, merge_commits: tuple[str, ...]) -> str:
|
|
|
586
612
|
"--no-commit",
|
|
587
613
|
"--no-stat",
|
|
588
614
|
"--no-edit",
|
|
615
|
+
"--no-overwrite-ignore",
|
|
589
616
|
"--",
|
|
590
617
|
commit,
|
|
591
618
|
env=environment,
|
|
@@ -656,7 +683,7 @@ def _publish_worktree(
|
|
|
656
683
|
occupant = next((item for item in records if Path(item.get("worktree", "")) == path), None)
|
|
657
684
|
if occupant is not None:
|
|
658
685
|
_usable_worktree(pool, path, root)
|
|
659
|
-
_assert_clean(path)
|
|
686
|
+
_assert_clean(path, include_untracked=True)
|
|
660
687
|
_worktree_command("-C", str(pool), "worktree", "remove", str(path))
|
|
661
688
|
elif path.exists() or path.is_symlink():
|
|
662
689
|
workspace_fail(f"Readable source worktree path is occupied: {path}")
|
|
@@ -668,16 +695,26 @@ def _publish_worktree(
|
|
|
668
695
|
workspace_fail(
|
|
669
696
|
f"Managed worktree path is occupied by another branch: {path} ({record.get('branch', 'detached')})."
|
|
670
697
|
)
|
|
698
|
+
_assert_clean(selected)
|
|
671
699
|
previous = _head(selected)
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
700
|
+
_worktree_command(
|
|
701
|
+
"-C",
|
|
702
|
+
str(selected),
|
|
703
|
+
"-c",
|
|
704
|
+
"core.hooksPath=/dev/null",
|
|
705
|
+
"-c",
|
|
706
|
+
"core.autocrlf=false",
|
|
707
|
+
"switch",
|
|
708
|
+
"--no-overwrite-ignore",
|
|
709
|
+
"-C",
|
|
710
|
+
worktree_branch,
|
|
711
|
+
base_commit,
|
|
712
|
+
env=_checkout_environment(),
|
|
713
|
+
)
|
|
676
714
|
try:
|
|
677
715
|
resolved = _merge_sources(selected, merge_commits) if merge_commits else _head(selected)
|
|
678
716
|
except Exception:
|
|
679
|
-
|
|
680
|
-
_repo(selected).clean()
|
|
717
|
+
_reset_worktree(selected, previous)
|
|
681
718
|
raise
|
|
682
719
|
return selected, resolved
|
|
683
720
|
|
|
@@ -731,8 +768,7 @@ def _create_worktree(
|
|
|
731
768
|
)
|
|
732
769
|
created_branch = not existing
|
|
733
770
|
if existing:
|
|
734
|
-
|
|
735
|
-
_repo(staging).clean()
|
|
771
|
+
_reset_worktree(staging, base_commit)
|
|
736
772
|
resolved = _merge_sources(staging, merge_commits) if merge_commits else _head(staging)
|
|
737
773
|
_assert_clean(staging)
|
|
738
774
|
_worktree_command(
|
|
@@ -16,7 +16,6 @@ from godoo_cli.git import GitUrl, native_git_result, repository
|
|
|
16
16
|
from godoo_cli.git.repository import Git
|
|
17
17
|
from godoo_cli.models import GitMergeSource, GodooGitRepo
|
|
18
18
|
from godoo_cli.workspace.git import (
|
|
19
|
-
_assert_clean,
|
|
20
19
|
_check_ref_format,
|
|
21
20
|
_ensure_pool,
|
|
22
21
|
_worktree_pool,
|
|
@@ -532,7 +531,7 @@ def test_checkout_bytes_do_not_depend_on_host_line_ending_configuration(
|
|
|
532
531
|
monkeypatch: pytest.MonkeyPatch, tmp_path: Path
|
|
533
532
|
) -> None:
|
|
534
533
|
"""Guards the contract that checkout bytes do not depend on host line ending configuration."""
|
|
535
|
-
|
|
534
|
+
working, remote, _initial = _remote(tmp_path)
|
|
536
535
|
config = tmp_path / "gitconfig"
|
|
537
536
|
config.write_text("[core]\n\tautocrlf = true\n", encoding="utf-8")
|
|
538
537
|
monkeypatch.setenv("GIT_CONFIG_GLOBAL", str(config))
|
|
@@ -540,6 +539,10 @@ def test_checkout_bytes_do_not_depend_on_host_line_ending_configuration(
|
|
|
540
539
|
selected, _selected_commit = _selection(remote, tmp_path / "sources")
|
|
541
540
|
|
|
542
541
|
assert (Path(selected) / "shared.txt").read_bytes() == b"original\n"
|
|
542
|
+
_commit(working, "next.txt", "advanced\n")
|
|
543
|
+
_git(working, "push", str(remote), "19.0")
|
|
544
|
+
_selection(remote, tmp_path / "sources")
|
|
545
|
+
assert (Path(selected) / "next.txt").read_bytes() == b"advanced\n"
|
|
543
546
|
|
|
544
547
|
|
|
545
548
|
def test_merge_order_is_part_of_recipe_identity(tmp_path: Path) -> None:
|
|
@@ -644,39 +647,124 @@ def _assert_existing_floating_worktree_is_reset(tmp_path: Path) -> None:
|
|
|
644
647
|
assert _git(Path(selected), "rev-parse", "HEAD") == advanced
|
|
645
648
|
|
|
646
649
|
|
|
647
|
-
def
|
|
648
|
-
"""Guards the contract that ignored changes are removed on sync."""
|
|
650
|
+
def test_untracked_and_ignored_files_survive_inspection_and_sync(tmp_path: Path) -> None:
|
|
649
651
|
working, remote, _initial = _remote(tmp_path)
|
|
650
652
|
_commit(working, ".gitignore", "ignored.txt\n")
|
|
651
653
|
_git(working, "push", str(remote), "19.0")
|
|
652
654
|
root = tmp_path / "sources"
|
|
653
655
|
selected, _selected_commit = _selection(remote, root)
|
|
654
|
-
|
|
656
|
+
path = Path(selected)
|
|
657
|
+
(path / "ignored.txt").write_text("ignored content", encoding="utf-8")
|
|
658
|
+
(path / "untracked.txt").write_text("user content", encoding="utf-8")
|
|
659
|
+
repo = GodooGitRepo(url=remote.as_uri(), branch="19.0")
|
|
655
660
|
|
|
661
|
+
_inspect_repo(repo, root=root, default_branch="19.0", role="odoo")
|
|
662
|
+
_commit(working, "new.txt", "upstream update")
|
|
663
|
+
_git(working, "push", str(remote), "19.0")
|
|
656
664
|
_selection(remote, root)
|
|
657
|
-
assert not (Path(selected) / "ignored.txt").exists()
|
|
658
665
|
|
|
666
|
+
assert (path / "new.txt").read_text(encoding="utf-8") == "upstream update"
|
|
667
|
+
assert (path / "ignored.txt").read_text(encoding="utf-8") == "ignored content"
|
|
668
|
+
assert (path / "untracked.txt").read_text(encoding="utf-8") == "user content"
|
|
659
669
|
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
_git(working, "push", str(remote), "19.0")
|
|
670
|
+
|
|
671
|
+
@pytest.mark.parametrize("staged", [False, True])
|
|
672
|
+
def test_sync_rejects_tracked_changes(tmp_path: Path, staged: bool) -> None:
|
|
673
|
+
_working, remote, _initial = _remote(tmp_path)
|
|
665
674
|
root = tmp_path / "sources"
|
|
666
675
|
selected, _selected_commit = _selection(remote, root)
|
|
667
676
|
path = Path(selected)
|
|
668
|
-
(path / ".
|
|
669
|
-
|
|
677
|
+
(path / "shared.txt").write_text("user edit", encoding="utf-8")
|
|
678
|
+
if staged:
|
|
679
|
+
_git(path, "add", "shared.txt")
|
|
670
680
|
|
|
671
681
|
with pytest.raises(WorkspaceError, match="Managed source is dirty"):
|
|
672
|
-
|
|
673
|
-
(path / "
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
682
|
+
_selection(remote, root)
|
|
683
|
+
assert (path / "shared.txt").read_text(encoding="utf-8") == "user edit"
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
@pytest.mark.parametrize("ignored", [False, True])
|
|
687
|
+
def test_sync_rejects_untracked_collision_with_new_commit(tmp_path: Path, ignored: bool) -> None:
|
|
688
|
+
working, remote, _initial = _remote(tmp_path)
|
|
689
|
+
if ignored:
|
|
690
|
+
_commit(working, ".gitignore", "collision.txt\n")
|
|
691
|
+
_git(working, "push", str(remote), "19.0")
|
|
692
|
+
root = tmp_path / "sources"
|
|
693
|
+
selected, _selected_commit = _selection(remote, root)
|
|
694
|
+
path = Path(selected)
|
|
695
|
+
previous = _git(path, "rev-parse", "HEAD")
|
|
696
|
+
(path / "collision.txt").write_text("user content", encoding="utf-8")
|
|
697
|
+
(working / "collision.txt").write_text("upstream content", encoding="utf-8")
|
|
698
|
+
_git(working, "add", "-f", "collision.txt")
|
|
699
|
+
_git(working, "commit", "-m", "add collision")
|
|
700
|
+
_git(working, "push", str(remote), "19.0")
|
|
701
|
+
|
|
702
|
+
with pytest.raises(WorkspaceError, match="would be overwritten"):
|
|
703
|
+
_selection(remote, root)
|
|
704
|
+
assert (path / "collision.txt").read_text(encoding="utf-8") == "user content"
|
|
705
|
+
assert _git(path, "rev-parse", "HEAD") == previous
|
|
706
|
+
|
|
707
|
+
|
|
708
|
+
def test_merge_collision_preserves_ignored_file_and_previous_commit(tmp_path: Path) -> None:
|
|
709
|
+
working, remote, _initial = _remote(tmp_path)
|
|
710
|
+
_commit(working, ".gitignore", "collision.txt\n")
|
|
711
|
+
_git(working, "checkout", "-b", "feature")
|
|
712
|
+
_commit(working, "feature.txt", "feature")
|
|
713
|
+
_git(working, "push", str(remote), "19.0", "feature")
|
|
714
|
+
root = tmp_path / "sources"
|
|
715
|
+
spec = _merge_spec(remote)
|
|
716
|
+
source = _sync_repo(spec, root=root, default_branch="19.0", role="odoo")
|
|
717
|
+
path = source.host_path
|
|
718
|
+
previous = _git(path, "rev-parse", "HEAD")
|
|
719
|
+
(path / "collision.txt").write_text("user content", encoding="utf-8")
|
|
720
|
+
(working / "collision.txt").write_text("upstream content", encoding="utf-8")
|
|
721
|
+
_git(working, "add", "-f", "collision.txt")
|
|
722
|
+
_git(working, "commit", "-m", "add collision")
|
|
723
|
+
_git(working, "push", str(remote), "feature")
|
|
724
|
+
|
|
725
|
+
with pytest.raises(WorkspaceError, match="would be overwritten"):
|
|
726
|
+
_sync_repo(spec, root=root, default_branch="19.0", role="odoo")
|
|
727
|
+
assert (path / "collision.txt").read_text(encoding="utf-8") == "user content"
|
|
728
|
+
assert _git(path, "rev-parse", "HEAD") == previous
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
def test_merge_allows_ignored_file_when_result_keeps_its_deletion(tmp_path: Path) -> None:
|
|
732
|
+
working, remote, initial = _remote(tmp_path)
|
|
733
|
+
_git(working, "checkout", "-b", "feature", initial)
|
|
734
|
+
_commit(working, "feature.txt", "feature")
|
|
735
|
+
_git(working, "checkout", "19.0")
|
|
736
|
+
_git(working, "rm", "shared.txt")
|
|
737
|
+
_commit(working, ".gitignore", "shared.txt\n")
|
|
738
|
+
_git(working, "push", str(remote), "19.0", "feature")
|
|
739
|
+
root = tmp_path / "sources"
|
|
740
|
+
spec = _merge_spec(remote)
|
|
741
|
+
source = _sync_repo(spec, root=root, default_branch="19.0", role="odoo")
|
|
742
|
+
ignored = source.host_path / "shared.txt"
|
|
743
|
+
ignored.write_text("user content", encoding="utf-8")
|
|
744
|
+
|
|
745
|
+
_sync_repo(spec, root=root, default_branch="19.0", role="odoo")
|
|
746
|
+
|
|
747
|
+
assert ignored.read_text(encoding="utf-8") == "user content"
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
def test_legacy_occupant_with_ignored_file_is_preserved(tmp_path: Path) -> None:
|
|
751
|
+
working, remote, _initial = _remote(tmp_path)
|
|
752
|
+
initial = _commit(working, ".gitignore", "ignored.txt\n")
|
|
753
|
+
_git(working, "push", str(remote), "19.0")
|
|
754
|
+
root = tmp_path / "sources"
|
|
755
|
+
selected, _selected_commit = _selection(remote, root)
|
|
756
|
+
readable = Path(selected)
|
|
757
|
+
pool = _worktree_pool(readable)
|
|
758
|
+
legacy = root / "worktrees" / "godoo%2F19.0"
|
|
759
|
+
legacy.parent.mkdir()
|
|
760
|
+
_git(pool, "worktree", "move", str(readable), str(legacy))
|
|
761
|
+
_git(pool, "worktree", "add", "--detach", str(readable), initial)
|
|
762
|
+
(readable / "ignored.txt").write_text("user content", encoding="utf-8")
|
|
763
|
+
|
|
764
|
+
with pytest.raises(WorkspaceError, match="dirty"):
|
|
765
|
+
_selection(remote, root)
|
|
766
|
+
assert (readable / "ignored.txt").read_text(encoding="utf-8") == "user content"
|
|
767
|
+
assert legacy.exists()
|
|
680
768
|
|
|
681
769
|
|
|
682
770
|
def test_unrelated_named_worktree_at_expected_path_is_preserved(tmp_path: Path) -> None:
|
|
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.4 → godoo_cli-1.0.5}/src/godoo_cli/commands/runtime/shell_scripts/odoo_banner.py
RENAMED
|
File without changes
|
{godoo_cli-1.0.4 → godoo_cli-1.0.5}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|